【倒车影像分流需求 三】- 获取Camera 数据 Camera_Shared_Memory 实现
发布日期:2021-06-29 14:51:47
浏览次数:2
分类:技术文章
本文共 7956 字,大约阅读时间需要 26 分钟。
【倒车影像分流需求 三】- 获取Camera 数据 Camera_Shared_Memory_W 实现
本需求系列文章:
- 《》
- 《》
- 《》
- 《》
- 《》
- 《》
- 《》
- 《》
- 《》
接下来,开始正式写共享内存代码了
一、Camera_Shared_Memory_W 代码实现
1. Camera_Shared_Memory_W.cpp 代码实现
@ reversing_video/reverse_video/Camera_Shared_Memory_W.cpp#include#include #include #include #include #include #include #include #include #include #include #include #include "include/Camera_Shared_Memory_W.h" namespace p_dls{ Camera_Shared_Memory* Camera_Shared_Memory::sInstance = 0;Camera_Shared_Memory::Camera_Shared_Memory():shm_addr(NULL){ // init share memory lock pthread_mutexattr_init(&sharedLock_matter); pthread_mutexattr_setpshared(&sharedLock_matter, PTHREAD_PROCESS_SHARED); pthread_mutex_init(sharedLock, &sharedLock_matter); // init Shared Memory create_Shared_Memory(MAX_BUF_SIZE);}Camera_Shared_Memory::~Camera_Shared_Memory(){ }// 1. create Shared_Memoryint Camera_Shared_Memory::create_Shared_Memory(int max_buf_size){ int shmid; // 1. Create Share Memory with key 1234, size 1920*720 shmid = shmget((key_t)1234, max_buf_size, IPC_CREAT|0666); ALOGI("[%s][%d] shmid : %u\n", __func__,__LINE__, shmid); if (shmid < 0){ perror("shmget error!"); exit(1); } // 2. Get Share Memory Addr shm_addr = shmat(shmid, NULL, 0); if (shm_addr == (void *) -1) { perror("shmat error!"); exit(1); } sharedLock = (pthread_mutex_t *)shm_addr; ALOGI("[%s][%d] add shmid=%d, shm_addr=%p \n", __func__,__LINE__, shmid, shm_addr); return 0;}// 2. get Camera_Shared_Memory InstanceCamera_Shared_Memory* Camera_Shared_Memory::getCamera_Shared_Memory(){ if(!Camera_Shared_Memory::sInstance){ Camera_Shared_Memory::sInstance = new Camera_Shared_Memory(); } return Camera_Shared_Memory::sInstance;}// 3. Write Shared_Memory Bufferint Camera_Shared_Memory::Write_Shared_Memory(/*int mfd,*/unsigned char*buffer,int share_buffer_size){ ALOGI("[%s][%d] Enter \n", __func__,__LINE__); // 3. Check Buffer size if(share_buffer_size < 0 || share_buffer_size > MAX_BUF_SIZE){ ALOGI("[%s][%d] node buffer size is too big or too small! ---\n",__func__, __LINE__); goto err; } // 4. copy buffer pthread_mutex_lock(sharedLock); ALOGI("[%s][%d] memcpy start \n", __func__,__LINE__); memcpy(((pthread_mutex_t *)shm_addr)+1, buffer, share_buffer_size); pthread_mutex_unlock(sharedLock); return 0;err: return -1;}// 4. Close Shared_Memory Bufferint Camera_Shared_Memory::close_Shared_Memory(int& shm_id, char*& addr){ ALOGI("[%s][%d] shm_id=%d, addr=%p \n", __func__,__LINE__, shm_id, addr); if (shmdt(shm_addr) == -1) { ALOGI("[%s][%d] shmdt error!\n", __func__,__LINE__); exit(1); } return 0;}// 5. Destroy Shared_Memory Bufferint Camera_Shared_Memory::release_Shared_Memory(int fd){ int mfd= fd; ALOGI("[%s][%d] fd = %d\n", __func__,__LINE__, fd); return 0;}}
2. Camera_Shared_Memory_W.h 代码实现
@ /hardware/libhardware/modules/reverse/reversing_video/reverse_video/include/Camera_Shared_Memory_W.h#ifndef __CAMERA_SHARED_MEMORY_H__#define __CAMERA_SHARED_MEMORY_H__#include#include #include #include #include #include /* Get common definition of System V style IPC. *///#include /* Get system dependent definition of `struct shmid_ds' and more. *///#include #include #include #include #define MAX_BUF_SIZE 1920*720namespace p_dls{ class Camera_Shared_Memory{ public: // 1. create Shared_Memory int create_Shared_Memory(int max_buf_size); // 2. get Camera_Shared_Memory Instance static Camera_Shared_Memory* getCamera_Shared_Memory(); // 3. Write Shared_Memory Buffer int Write_Shared_Memory(/*int mfd,*/unsigned char *buffer,int buffersize); // 4. Close Shared_Memory Buffer int close_Shared_Memory(int& shm_id, char*& addr); // 5. Destroy Shared_Memory Buffer int release_Shared_Memory(int fd); pthread_mutex_t * sharedLock; pthread_mutexattr_t sharedLock_matter; //method declare Camera_Shared_Memory(); ~Camera_Shared_Memory();private: static Camera_Shared_Memory* sInstance; void* shm_addr; };}#endif
3. Camera Preview 数据拷贝
在 CameraView.cpp 中,我们直接将倒车数据进行分流,先实现功能,至于代码排版啥的,后面再优化。
@ /hardware/libhardware/modules/reverse/reversing_video/reverse_ui/CameraView.cpp#include "include/Camera_Shared_Memory_W.h" // cielee post data to dmsdp /******************************************************** * use: callback when new camera preview data arrived ********************************************************/ void CameraView::OnNewCameraPreviewData(unsigned char * aData, int aDataLen){ //ALOGD("%s new preview data+++", __FUNCTION__); if (aDataLen > (DLS_CAMERA_PREVIEW_WIDTH * DLS_CAMERA_PREVIEW_HEIGHT * 3/2)){ ALOGE("%s aDataLen is too large!! aDataLen=%d, Limit=%d", __FUNCTION__, aDataLen, (DLS_CAMERA_PREVIEW_WIDTH * DLS_CAMERA_PREVIEW_HEIGHT * 3/2)); return; } if (0 != mNewCameraDataLock.tryLock()){ return; } memcpy(mPreviewBuffer, aData, aDataLen); mNewCameraData = true; mNewCameraDataLock.unlock(); // cielee post data to dmsdp +++ Camera_Shared_Memory* Camera_View_Shared_Memory = Camera_Shared_Memory::getCamera_Shared_Memory(); unsigned char *tmp_mPreviewBuffer = NULL; tmp_mPreviewBuffer= mPreviewBuffer; Camera_View_Shared_Memory->Write_Shared_Memory(tmp_mPreviewBuffer,sizeof(mPreviewBuffer)); // cielee post data to dmsdp --- mYuvTexBuffer_timestamp = uptimeMillis();}
二、Camera_Shared_Memory_R 代码实现
1. Camera_Shared_Memory_R.cpp 代码实现
# /hardware/libhardware/modules/reverse/HwDmsdpCamera/Camera_Shared_Memory_R.cpp#include#include #include #include #include #include #include #include #include "Camera_Shared_Memory_R.h"namespace p_dls{ pthread_mutex_t * Camera_Shared_Memory_R::sharedLock = NULL;Camera_Shared_Memory_R* Camera_Shared_Memory_R::sInstance = 0;Camera_Shared_Memory_R::Camera_Shared_Memory_R():shm_addr_pt(NULL),shmid(0){ }Camera_Shared_Memory_R::~Camera_Shared_Memory_R(){ }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(){ int max_buf_size= 0; ALOGI("[%s][%d] enter \n",__func__, __LINE__); shmid = shmget((key_t)1234, 0, 0); if(-1== shmid) { ALOGI("[%s][%d] share memory get error!\n",__func__, __LINE__); goto err; } shm_addr_pt= shmat(shmid, 0, 0); if((void *)-1== shm_addr_pt) { ALOGI("[%s][%d] share memory attach address error\n",__func__, __LINE__); goto err; } sharedLock = (pthread_mutex_t *)shm_addr_pt; return 0;err: return -1;}unsigned char* Camera_Shared_Memory_R::open_Read_Shared_Memory(unsigned char*buffer){ pthread_mutex_lock(sharedLock); memcpy(buffer, ((pthread_mutex_t *)shm_addr_pt)+1, 720*480); pthread_mutex_unlock(sharedLock); return buffer;}int Camera_Shared_Memory_R::close_Read_Shared_Memory(int& shm_id, char*& addr){ if (shmdt(shm_addr_pt) == -1) { // printf("shmdt error!\n"); } if (shmctl(shmid, IPC_RMID, 0) == -1) { // printf("shmctl error!\n"); } return 0;}}
2. Camera_Shared_Memory_R.h 代码实现
# /hardware/libhardware/modules/reverse/HwDmsdpCamera/include/Camera_Shared_Memory_R.h#ifndef __CAMERA_SHARED_MEMORY_R_H__ #define __CAMERA_SHARED_MEMORY_R_H__#define MAX_BUFFER_SIZE 1920*720#include "Camera_Shared_Memory_W.h"namespace p_dls { class Camera_Shared_Memory_R{ public: static Camera_Shared_Memory_R* get_Read_Shared_Memory(); int attach_Read_Shared_Memory(); unsigned char* open_Read_Shared_Memory(unsigned char *buf); int close_Read_Shared_Memory(int& shm_id, char*& addr); int shm_chn_attach(); static pthread_mutex_t * sharedLock; void *shm_addr_pt; int shmid;private: //method declare Camera_Shared_Memory_R(); ~Camera_Shared_Memory_R(); static Camera_Shared_Memory_R* sInstance; };}#endif
转载地址:https://ciellee.blog.csdn.net/article/details/105990808 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月29日 12时20分22秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
力扣的删除链表的倒数第N个节点解法(Python)
2019-04-29
力扣的串联所有单词的子串解法(Python)
2019-04-29
力扣的接雨水解法(Python3)
2019-04-29
HTML5 五种密码框
2019-04-29
Node.js npm uuid
2019-04-29
JavaScript 滑动验证
2019-04-29
CSS3 二级菜单
2019-04-29
CSS3 帧动画(Sprite,直译叫雪碧图)
2019-04-29
JavaScript 帧动画
2019-04-29
Java NIO —— 用 Path 取代 File
2019-04-29
毕业后的五年拉开大家差距的原因在哪里?
2019-04-29
Java Callable、Future、FutureTask
2019-04-29
Java 父线程与子线程相互通信的方法
2019-04-29
Java 逃逸分析
2019-04-29
Java 装饰模式
2019-04-29
Java 观察者模式
2019-04-29
Java ReentrantLock源码解读
2019-04-29
Java CompletableFuture
2019-04-29
缓存行、伪共享
2019-04-29