【倒车影像分流需求 六】- 共享内存方案最终代码实现 一 之 数据接收端
发布日期:2021-06-29 14:52:06 浏览次数:3 分类:技术文章

本文共 9848 字,大约阅读时间需要 32 分钟。

【倒车影像分流需求 六】- 共享内存方案最终代码实现 一 之 数据接收端

本需求系列文章:

  1. 《》
  2. 《》
  3. 《》
  4. 《》
  5. 《》
  6. 《》
  7. 《》
  8. 《》
  9. 《》

本文接着《》

二、共享内存接收端代码实现

1. 头文件 H264_Reverse.h

# nativecamerasdk/video/H264_Reverse.h#ifndef __H264_REVERSE_H__  #define __H264_REVERSE_H__#define DLS_CAMERA_PREVIEW_WIDTH 	720  	//raw camera output#define DLS_CAMERA_PREVIEW_HEIGHT	480 	//raw camera output//YUV420-N21      YYYYYYYY UVUV#define MAX_BUF_SIZE 	DLS_CAMERA_PREVIEW_WIDTH * DLS_CAMERA_PREVIEW_HEIGHT * 3/2 + 200#define  REVERSE_CAMERA_DUMP_LOCATION  "/sdcard/reverse/"// 进程锁结构体typedef struct MUTEX_SHAREDLOCK {
pthread_mutex_t lock; pthread_mutexattr_t lock_attr;} mutex_sharedLock_t;class Camera_Shared_Memory_R{
public: static Camera_Shared_Memory_R* get_Read_Shared_Memory(); int attach_Read_Shared_Memory(); int open_Read_Shared_Memory(unsigned char *buffer); int close_Read_Shared_Memory(); int shm_chn_attach(); unsigned char * shm_addr_buff; // dump data void Camera_Shared_Memory_Dump(unsigned char * buf, int size);private: //method declare Camera_Shared_Memory_R(); ~Camera_Shared_Memory_R(); static Camera_Shared_Memory_R* sInstance; void* shm_addr; int shm_id; };#endif // END __H264_REVERSE_H__

2. 源文件 H264_Reverse.cpp

# nativecamerasdk/video/H264_Reverse.cpp#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include "H264_Reverse.h"static mutex_sharedLock_t *sharedLock_r;Camera_Shared_Memory_R* Camera_Shared_Memory_R::sInstance = 0;Camera_Shared_Memory_R::Camera_Shared_Memory_R():shm_addr(NULL),shm_id(0){ attach_Read_Shared_Memory(); // alloc buffer shm_addr_buff = (unsigned char *)malloc(MAX_BUF_SIZE);}Camera_Shared_Memory_R::~Camera_Shared_Memory_R(){ // release addr close_Read_Shared_Memory(); // who create who destroy, so don't delete IPC memory here //if(shmctl(shm_id, IPC_RMID, NULL) !=0 ) // ALOGI("[%s][%d] shmctl error!,shm_id=%d \n", __func__,__LINE__, shm_id); // free buffer free(shm_addr_buff); shm_id = -1;}Camera_Shared_Memory_R* Camera_Shared_Memory_R::get_Read_Shared_Memory(){ if(!Camera_Shared_Memory_R::sInstance) { Camera_Shared_Memory_R::sInstance = new Camera_Shared_Memory_R; } return Camera_Shared_Memory_R::sInstance;}int Camera_Shared_Memory_R::attach_Read_Shared_Memory(){ return Camera_Shared_Memory_R::shm_chn_attach();}int Camera_Shared_Memory_R::shm_chn_attach(){ shm_id = shmget((key_t)1225, 0, 0); if(-1== shm_id) { ALOGI("[reverse_exe][%s][%d] share memory get error!\n",__func__, __LINE__); goto err; } shm_addr= shmat(shm_id, 0, 0); if((void *)-1== shm_addr) { ALOGI("[reverse_exe][%s][%d] share memory attach address error\n",__func__, __LINE__); goto err; } sharedLock_r = (mutex_sharedLock_t *)shm_addr; return 0;err: return -1;}int Camera_Shared_Memory_R::open_Read_Shared_Memory(unsigned char *buffer){ //pthread_mutex_lock( &(sharedLock_r->lock) ); if (0 == pthread_mutex_trylock( &(sharedLock_r->lock))) { memcpy(buffer, ((pthread_mutex_t *)shm_addr)+1, MAX_BUF_SIZE); ALOGI("[reverse_exe][%s][%d] buffer -- %x-%x-%x-%x - %x-%x-%x-%x - %x-%x-%x-%x",__func__,__LINE__, buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5],buffer[6], buffer[7],buffer[8],buffer[9],buffer[10],buffer[11]); pthread_mutex_unlock( &(sharedLock_r->lock) ); }else{ ALOGI("[reverse_exe][%s][%d] lock is busy \n", __func__,__LINE__); return -1; } return 0;}int Camera_Shared_Memory_R::close_Read_Shared_Memory(){ ALOGI("[%s][%d] shm_id=%d, shm_addr=%p \n", __func__,__LINE__, shm_id, shm_addr); // release shm_addr if ((shm_addr != NULL) && shmdt(shm_addr) == -1) { ALOGI("[%s][%d] shmdt error!,shm_addr=%p \n", __func__,__LINE__, shm_addr); return -1; } return 0;}//// save yuv file in /sdcard/reverse/Rear-Camera-720x480-0.yuvstatic int index = 0;void Camera_Shared_Memory_R::Camera_Shared_Memory_Dump(unsigned char * buf, int size){ char filename_buf[128]; if(index >= 200){ ALOGI("[reverse_exe][%s][%d] index=%d ,too big \n",__func__, __LINE__, index); return; } if(access(REVERSE_CAMERA_DUMP_LOCATION,F_OK) != 0){ printf("create new path!\n"); mkdir(REVERSE_CAMERA_DUMP_LOCATION, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); } snprintf(filename_buf, sizeof(filename_buf), "%sRear-Camera-720x480-%d.yuv", REVERSE_CAMERA_DUMP_LOCATION, index); ALOGI("[reverse_exe][%s][%d] filename_buf=%s \n",__func__, __LINE__, filename_buf); int file_fd = open(filename_buf, O_RDWR | O_CREAT, 0777); ssize_t written_len = 0; if (file_fd >= 0){ fchmod(file_fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); write(file_fd, buf, MAX_BUF_SIZE); close(file_fd); index ++; }else{ ALOGE("%s: fail t open file for image dumping", __func__); }}

3. 测试Daemon代码 H264_Reverse.cpp

# nativecamerasdk/native_camera_impl.cpp//ciellee +++#include "video/H264_Reverse.h"      DMSDPSendBackDataCB reverse_sendbackFrameFunc = nullptr;static int reverse_capturing = 0;// 注册Camera 数据回调函数int32_t CameraRegisterSendDataCallback(const char* id, uint32_t idLen, const DMSDPSendBackDataCB cb){
/* regist callback senddata */ ALOGI("CameraRegisterSendDataCallback"); // ciellee +++ if( strcmp(id, "5") == 0 ) {
// id = 5, reverse_camera reverse_sendbackFrameFunc = cb; } return DMSDP_NO_ERROR;}// 数据采集线程void * cap_reverse (void *arg){
ALOGI("[reverse_exe][%s][%d] Enter ... \n",__func__, __LINE__); // 1. init Camera_Shared_Memory_R * Camera_Shared_Memory_r = Camera_Shared_Memory_R::get_Read_Shared_Memory(); while(reverse_capturing) {
memset(Camera_Shared_Memory_r->shm_addr_buff, 0, MAX_BUF_SIZE); // 2. read shm data Camera_Shared_Memory_r->open_Read_Shared_Memory(Camera_Shared_Memory_r->shm_addr_buff); // 3. daemon ,save data with yuv file Camera_Shared_Memory_r->Camera_Shared_Memory_Dump(Camera_Shared_Memory_r->shm_addr_buff , MAX_BUF_SIZE); // here call callback send buff //sendbackFrameFunc( id_s , sizeof(id_s), Camera_Shared_Memory_r->shm_addr_buff, MAX_BUF_SIZE, (int32_t)DMSDPCameraDataType::H264); usleep(30000); //sleep 30ms } pthread_exit(NULL);}// 打开摄像头,开始启动数据采集线程int32_t OpenCamera(const DMSDPCameraParam* param) {
if (param == nullptr) {
ALOGE("%s: open camera param is null", __FUNCTION__); return DMSDP_ERR_INVALID_PARAMETER; } ALOGI("[reverse_exe][%s][%d] id=%s \n",__func__, __LINE__, param->id); if( strcmp(param->id, "5") == 0 ) // id = 5, reverse_camera {
// init share memory Camera_Shared_Memory_R * Camera_Shared_Memory_r = Camera_Shared_Memory_R::get_Read_Shared_Memory(); reverse_capturing = 1; // start pthread pthread_t pthreadReverse; if (pthread_create(&pthreadReverse, nullptr, cap_reverse, nullptr)) ALOGI("%s: Create cap_reverse error!", __FUNCTION__); if (pthreadReverse != 0) {
pthread_detach(pthreadReverse); ALOGI("%s: capture h264 preview exit", __FUNCTION__); } } ALOGI("%s: open camera success", __FUNCTION__); return DMSDP_NO_ERROR;}// 关闭数据采集int32_t CloseCamera(const char* id, uint32_t idLen){
if( strcmp(id, "5") == 0 ){
reverse_capturing = 0; } return DMSDP_NO_ERROR;}// Daemon 主函数,后续,该部分调用由华为来实现int main(void){
char id_test[] = "5"; const char *id_pt = id_test; DMSDPCameraParam param_test; param_test.id = id_pt; // 1. register callback // CameraRegisterSendDataCallback // 2. open camera get data OpenCamera(&param_test); while(1){
sleep(10); } return 0;}

三、Daemon 实测

1. 发送端log 输出

通过 PCAN ,往车机发送倒车命令后,进入倒车模式,开启倒车摄像头,

当有数据输出时,会初始化共享内存,创建 共享 buffer ,开始发送数据

ciellee@sh:~/tamp$ adb logcat -b all | grep Shared_Memory05-29 10:50:45.740   798   930 I         : [create_Shared_Memory][46] shm_id : 005-29 10:50:45.741   798   930 I         : [create_Shared_Memory][67] add shm_id=0, shm_addr=0xb2887000

2. 接收端log 输出

执行可执行程序: msm8937_32go:/ # libdmsdpcamerahandler_exe

挂接共享内存后,开始读取共享内存数据,并保存为yuv 图片。

05-29 10:51:12.932  7616  7616 I CamSDK_3rdCamera: [reverse_exe][OpenCamera][569] id=5 05-29 10:51:12.939  7616  7618 I CamSDK_3rdCamera: [reverse_exe][cap_reverse][543] Enter ... 05-29 10:51:12.957  7616  7618 I : [reverse_exe][open_Read_Shared_Memory][84] buffer -- d2-d2-d2-d2 - d2-d2-d2-d2 - d2-d2-d2-d205-29 10:51:12.967  7616  7618 I : [reverse_exe][Camera_Shared_Memory_Dump][132] filename_buf=/sdcard/reverse/Rear-Camera-720x480-0.yuv  05-29 10:51:13.004  7616  7618 I : [reverse_exe][open_Read_Shared_Memory][84] buffer -- d2-d2-d2-d2 - d2-d2-d2-d2 - d2-d2-d2-d205-29 10:51:13.004  7616  7618 I : [reverse_exe][Camera_Shared_Memory_Dump][132] filename_buf=/sdcard/reverse/Rear-Camera-720x480-1.yuv  05-29 10:51:13.041  7616  7618 I : [reverse_exe][open_Read_Shared_Memory][84] buffer -- d2-d2-d2-d2 - d2-d2-d2-d2 - d2-d2-d2-d205-29 10:51:13.041  7616  7618 I : [reverse_exe][Camera_Shared_Memory_Dump][132] filename_buf=/sdcard/reverse/Rear-Camera-720x480-2.yuv  05-29 10:51:13.083  7616  7618 I : [reverse_exe][open_Read_Shared_Memory][84] buffer -- d2-d2-d2-d2 - d2-d2-d2-d2 - d2-d2-d2-d2

3. 导出YUV 图片

ciellee@sh:~/tamp$ adb pull /sdcard/reverse/ .pull: building file list...pull: /sdcard/reverse/Rear-Camera-720x480-47.yuv -> ./Rear-Camera-720x480-47.yuvpull: /sdcard/reverse/Rear-Camera-720x480-46.yuv -> ./Rear-Camera-720x480-46.yuvpull: /sdcard/reverse/Rear-Camera-720x480-45.yuv -> ./Rear-Camera-720x480-45.yuvpull: /sdcard/reverse/Rear-Camera-720x480-44.yuv -> ./Rear-Camera-720x480-44.yuvpull: /sdcard/reverse/Rear-Camera-720x480-43.yuv -> ./Rear-Camera-720x480-43.yuvpull: /sdcard/reverse/Rear-Camera-720x480-42.yuv -> ./Rear-Camera-720x480-42.yuv

查看图片:

ffplay -video_size 720x480 -pix_fmt nv21 -i Rear-Camera-720x480-40.yuv

如下是获取的 pattern 图:

在这里插入图片描述

四、下一步工作

现在共享内存 Deamon 写好了,已经发邮件请华为安排一位研发和我对接联调。

所以接下来两件事:

  1. 和 xxx 工程师联调 xxx 倒车影像功能
  2. 使用C++ ADIL 来代替 共享内存 ,实现进程间大数据传输

参考:《》

转载地址:https://ciellee.blog.csdn.net/article/details/106419665 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【高通SDM660 Android 10.0】(1) --- Sensor 驱动 Bringup Guide
下一篇:【倒车影像分流需求 五】- 共享内存方案最终代码实现 一 之 数据发送端

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月16日 08时16分21秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

中科院刘康:低资源环境下的事件知识抽取 2019-04-29
提高软件工程技能的关键技术,这些资源赶紧收藏起来 2019-04-29
走进数据科学:最好是通过比网课更好的方法 2019-04-29
机器学习背后的数学支柱,这5本书帮你搞定! 2019-04-29
AI革命第一步:最容易被忽略但必不可少的物联网 2019-04-29
2020年开发运维工具清单:选择开发运维工具堆栈吧 2019-04-29
效率提升法则:高效人士不会去做的4件事 2019-04-29
8.PostgreSQL约束 2019-04-29
【技术分享】使用AES加密技术保障数据安全 2019-04-29
【应用实例】布线多?成本高?不可靠?泽耀方案没烦恼! 2019-04-29
数据可视化工具:Matplotlib绘图 2019-04-29
用Python写个超级小恐龙跑酷游戏,上班摸鱼我能玩一天 2019-04-29
闺蜜看我用Python画了一幅樱花图,吵着要我给他介绍程序员小哥哥 2019-04-29
【Python爬虫实战】知乎热榜数据采集,上班工作摸鱼两不误,知乎热门信息一网打尽 2019-04-29
自从我学会了数据挖掘Matplotlib、Numpy、Pandas、Ta-Lib等一系列库,我把领导开除了 2019-04-29
Python抓取哔哩哔哩up主信息:只要爬虫学的好,牢饭吃的早 2019-04-29
有个码龄5年的程序员跟我说:“他连wifi从来不用密码” 2019-04-29
领导让我整理上个季度的销售额,幸好我会Python数据分析,你猜我几点下班 2019-04-29
【Python爬虫实战】为何如此痴迷Python?还不是因为爱看小姐姐图 2019-04-29
2021年6月全国程序员薪资出炉,大佬您上榜了吗? 2019-04-29