【倒车影像分流需求 三】- 获取Camera 数据 Camera_Shared_Memory 实现
发布日期:2021-06-29 14:51:47 浏览次数:2 分类:技术文章

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

【倒车影像分流需求 三】- 获取Camera 数据 Camera_Shared_Memory_W 实现

本需求系列文章:

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

接下来,开始正式写共享内存代码了

一、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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:20150430 调试分析之 根据内核报错信息PC指针分析错误
下一篇:【倒车影像分流需求 二】- 根据接口写库

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月29日 12时20分22秒