【倒车影像分流需求 九】- 终 - 代码优化 - 异常情况处理
发布日期:2021-06-29 14:55:24 浏览次数:3 分类:技术文章

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

【倒车影像分流需求 九】- 终 - 代码优化 - 异常情况处理

本需求系列文章:

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

在前面文章中,我们实现了倒车影像分流的基本功能,今天,我们来实现它的最后一步,代码优化(异常情况处理)。

写代码前,我们先来分析下都有哪些异常情况。

在我们车机中,分别存在两种投屏模式,由于涉及公司相关信息不方便透露,我们估且叫做模式A 和 模式B吧。

在模式A 中有一种投屏方式A ,在模式B中有另外一种投屏方式B,两种投屏方式属于不同的公司,且互不兼容。
在模式A 中仅且支持投屏方A 的投屏功能 及 自动回连功能,而当用户想使用 B种投屏方式时,则需要先切换车机模式到模式B,在模式B的环境下,才可以支持B种投屏方式。

而本倒车影像分流需求,就是B种投屏的功能,在A种投屏下不存在这样的功能,同样在代码中我也增加了模式判断,仅且当处于模式B时,才会初始化倒车影像分流功能。

回归正题,根据排列组合的方法,涉及倒车影像分流功能的,打开倒车影像功能方面总共存在如下几种情况:

场景描述 倒车代码中处理方法 lib so库中处理方法
B模式,未进入倒车模式,手机未投屏 代码不运行,无需考虑 代码不运行,无需考虑
B模式,未进入倒车模式,手机投屏后调用摄像头 共享内存中设置标志位,
进入倒车模式后才会设置1
如果lib so 库中读取到 0,则说明未进入倒车模式,
此时代码中自动停止摄像头处理
B模式,进入倒车模式,手机未投屏 设置标志位为1,正常送Camera数据到共享内存中 代码不运行
B模式,进入倒车模式,手机投屏后调用摄像头 正常情况 正常情况
A模式,进入倒车模式 代码不运行 代码不运行

经过上面的总结,可以看出,异常情况只有一种,就是,

  • 车机未处于倒车模式,手机投屏后主动请求倒车摄像头数据。
    根据前面的处理方法,
    在倒车代码中,于共享内存中开辟一个新的内存作为共享标志位,初始默认为0,进入倒车并初始化完成后,配置为1,退出倒车后,再配置为0。
    在lib so 库,时刻监测标志位,旦该标志为0 ,则说明未进入倒车,或已退出倒车模式,此时需主动关闭虚拟倒车摄像头。

好,有了上面的分析,思路清晰很多,我们开始来实现代码吧。

本需求终版完整代码见:《》

一、倒车代码修改:开辟新的共享标志位

在共享数据的数据结构中,增加一个char 类型的flag标志位,

配置0xAA,说明进入倒并初始化成功了,反之其他值则说明未进入倒车,或示初始化倒车模式失败。

# hardware/libhardware/modules/reverse/nativecamerasdk/video/Reverse_Camera_R.h// 定义进程锁结构体typedef struct MUTEX_SHAREDLOCK {
char flag; // 0xAA:进入倒车模式, 0x00:未进入倒车模式 pthread_mutex_t mutex; pthread_mutexattr_t mutexAttr; pthread_cond_t isReadCond; pthread_cond_t isWriteCond; pthread_condattr_t condAttr; char data[MAX_BUF_SIZE];} mutex_sharedLock_t;

1.1 Reverse_Camera_W 构造函数修改

在倒车代码中,初始化共享内存后,配置标志位为0xAA

如果初始化失败,则配置g_failed_flag=1,接着自动调用析构函数,同时释放Reverse_Camera_W 对象内存。

# hardware/libhardware/modules/reverse/nativecamerasdk/video/Reverse_Camera_W.cppmutex_sharedLock_t * sharedLock_w = NULL;Reverse_Camera_W * Reverse_Camera_W::sInstance = NULL;static int g_failed_flag = 0;Reverse_Camera_W* Reverse_Camera_W::get_instance(){
if(Reverse_Camera_W::sInstance == NULL){
Reverse_Camera_W::sInstance = new Reverse_Camera_W(); if(g_failed_flag==1 && Reverse_Camera_W::sInstance != NULL){
delete(Reverse_Camera_W::sInstance); return NULL; } } return Reverse_Camera_W::sInstance;}Reverse_Camera_W::Reverse_Camera_W():fd(-1),Memory_Size(0){
if( init_mmap() != 0){
g_failed_flag = 1; ALOGI("[%s][%d] init_mmap Failed !!! g_failed_flag=%d\n", __func__,__LINE__, g_failed_flag); }else{
g_failed_flag = 0; sharedLock_w->flag = 0xAA; ALOGI("[%s][%d] set sharedLock_w->flag = 0x%x\n", __func__,__LINE__, sharedLock_w->flag); }}Reverse_Camera_W::~Reverse_Camera_W(){
if(sharedLock_w != NULL){
sharedLock_w->flag = 0x00; msync(&(sharedLock_w->flag), sizeof(char), MS_SYNC); //同步至磁盘 ALOGI("[%s][%d] set sharedLock_w->flag = 0x%x\n", __func__,__LINE__, sharedLock_w->flag); usleep(3000); // 5ms pthread_cond_signal(&sharedLock_w->isReadCond); usleep(3000); // 5ms // 销毁锁和锁状态 pthread_mutex_destroy(&(sharedLock_w->mutex)); pthread_mutexattr_destroy(&(sharedLock_w->mutexAttr)); pthread_cond_destroy(&sharedLock_w->isReadCond); pthread_cond_destroy(&sharedLock_w->isWriteCond); pthread_condattr_destroy(&sharedLock_w->condAttr); close_mmap(); } }

1.2 Reverse_Camera_W 对象初始化代码修改

在进入倒车模式时,获取当前车机模式属性,如果在模式B下,则初始化Reverse_Camera_W对象。

# hardware/libhardware/modules/reverse/reversing_video/reverse_video/reverse_video.cppstatic char link_vendor[PROPERTY_VALUE_MAX];bool  reverse_video::requestCameraImpl(bool  aWaitCameraInitDone){
property_get("persist.link.vendor", link_vendor, "none"); //ALOGI("[%s][%d] persist.link.vendor = %s \n",__func__, __LINE__, link_vendor); if( 0 == strcmp(link_vendor, "xxx") ) {
ALOGI("[Reverse_Camera_W][%s] current is xxx mode, start init Reverse_Camera_W\n", __FUNCTION__); Reverse_Camera_W::get_instance(); // only do this with xxx mode }else{
ALOGI("[Reverse_Camera_W][%s] current is xxx mode\n", __FUNCTION__); }}

退出倒车模式时,获取Reverse_Camera_Winstance 指针,如果不是NULL,则调用delete释放对象。

void  reverse_video::releaseCamera(){
if( 0 == strcmp(link_vendor, "xxx") ) {
Reverse_Camera_W * tmp = Reverse_Camera_W::get_instance(); if(tmp != NULL) {
delete(tmp); } }}

二、lib库代码修改:监控共享标志位

# hardware/libhardware/modules/reverse/nativecamerasdk/video/Reverse_Camera_R.h// 定义进程锁结构体typedef struct MUTEX_SHAREDLOCK {
char flag; // 0xAA:进入倒车模式, 0x00:未进入倒车模式 pthread_mutex_t mutex; pthread_mutexattr_t mutexAttr; pthread_cond_t isReadCond; pthread_cond_t isWriteCond; pthread_condattr_t condAttr; char data[MAX_BUF_SIZE];} mutex_sharedLock_t;

2.1 Reverse_Camera_R 构造函数修改

在构造函数中判断,如果初始化共享内存失败,或都 共享标志位不为 0xAA,则说明倒车未初始化成功,返回失败。

Reverse_Camera_R::Reverse_Camera_R(){
g_failed_flag = 0; // 如果存在 /sdcard/reverse/debug.txt 文件的话,说明需要dump 图片到本地 if(access(REVERSE_CAMERA_DUMP_DEBUG_TXT,F_OK) == 0){
g_debug_flag = 1; ALOGI("[reverse_exe][%s][%d] g_debug_flag = %d\n", __func__,__LINE__, g_debug_flag); }else{
g_debug_flag = 0; //mkdir(REVERSE_CAMERA_DUMP_LOCATION, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); //ALOGI("[reverse_exe][%s][%d] create directory %s\n", __func__,__LINE__, REVERSE_CAMERA_DUMP_LOCATION); } if( init_mmap() < 0){
ALOGI("[reverse_exe][%s][%d] init_mmap failed\n", __func__,__LINE__); g_failed_flag = 1; return; } ALOGI("[reverse_exe][%s][%d] get sharedLock_r->flag=0x%x\n", __func__,__LINE__, sharedLock_r->flag); if(sharedLock_r->flag != 0xAA){
ALOGI("[reverse_exe][%s][%d] reverse Camera not ready yet\n", __func__,__LINE__); g_failed_flag = 1; return; } if( H264_encoder_init() != 0){
ALOGI("[reverse_exe][%s][%d] H264_encoder_init failed\n", __func__,__LINE__); g_failed_flag = 1; }}Reverse_Camera_R* Reverse_Camera_R::get_instance(){
if(Reverse_Camera_R::sInstance == NULL) {
Reverse_Camera_R::sInstance = new Reverse_Camera_R(); // 出错处理 if(g_failed_flag == 1){
delete(Reverse_Camera_R::sInstance); return NULL; } } return Reverse_Camera_R::sInstance;}

2.2 打开摄像头代码修改

在打开摄像头时,如果获取 Reverse_Camera_R对像失败,则不启动 H264_EnCode_thread 线程。

int32_t OpenCameraInner(const DMSDPCameraParam* param){
ALOGI("%s: start open native camera", __FUNCTION__); 。。。。。。 省略代码 。。。。。。 if(reverse_camera_name.compare(param->id) == 0) {
g_debug_frame_num = 0; // 配置获取Camera数据标志位 capturing = 1; ALOGI("[reverse_exe][%s][%d] id=%s capturing=%d\n",__func__, __LINE__, param->id, capturing); // 初始化共享内存 Reverse_Camera_R * Reverse_Camera_R = Reverse_Camera_R::get_instance(); if(Reverse_Camera_R == NULL){
// 配置获取Camera数据标志位 isRunning = false; capturing = 0; ALOGI("[native_camera]%s: start call CloseCameraInner(%s)", __FUNCTION__, reverse_camera_name.c_str()); CloseCameraInner(reverse_camera_name.c_str(), reverse_camera_name.length()); return -1; }else{
// 初始化线程 std::thread pthread_cap_reverse(cap_reverse); pthread_cap_reverse.detach(); //ALOGI("[native_camera]%s: detach thread pthread_cap_reverse", __FUNCTION__); std::thread pthread_H264_Encoder(H264_EnCode_thread);//开启视频录制 pthread_H264_Encoder.detach(); //ALOGI("[native_camera]%s: detach thread pthread_H264_Encoder", __FUNCTION__); } } 。。。。。。 省略代码 。。。。。。}

在cap_reverse 线程中,首先获取 Reverse_Camera_R 对象,时刻监控Reverse_Camera_r->sharedLock_r->flag 是否等于0xAA。

如果为NULL,则配置 capturing = 0,

接着主动调用 CloseCamera 方法,其中主要工作就是清除注册好的回调函数。

// ciellee +++static void cap_reverse(void){
int32_t ret = 0; ALOGI("[reverse_exe][%s][%d] Enter ... \n",__func__, __LINE__); Reverse_Camera_R * Reverse_Camera_r = NULL; if(g_failed_flag == 0){
Reverse_Camera_r = Reverse_Camera_R::get_instance(); } // 出错处理 if(Reverse_Camera_r == NULL){
ALOGI("[reverse_exe][%s][%d] Reverse_Camera_R::get_instance Failed !!! \n",__func__, __LINE__); capturing = 0; } // 配置线程名 prctl(PR_SET_NAME, "cap_reverse"); while(capturing && (Reverse_Camera_r != NULL) && Reverse_Camera_r->sharedLock_r->flag == 0xAA ) {
if (0 == pthread_mutex_trylock( &(Reverse_Camera_r->sharedLock_r->mutex)) ) {
//ALOGI("[reverse_exe][%s][%d] pthread_cond_wait isReadCond --- \n",__func__, __LINE__); pthread_cond_wait(&Reverse_Camera_r->sharedLock_r->isReadCond, &Reverse_Camera_r->sharedLock_r->mutex); // 获取Camera 数据 uint8_t* buff = (uint8_t*)Reverse_Camera_r->sharedLock_r->data; if(buff != NULL && Reverse_Camera_r->sharedLock_r->flag == 0xAA){
ALOGI("[reverse_exe][%s][%d] got_frame g_debug_frame_num=%lld flag=0x%x\n",__func__, __LINE__, g_debug_frame_num, Reverse_Camera_r->sharedLock_r->flag); // 将数据送入编码器进行编码 Post_Data_to_H264Encoder(buff); // Dump RAWDATA with /sdcard/reverse/Rear-Camera-720x480-0.yuv if(g_debug_flag) Reverse_Camera_r->Reverse_Camera_R_Dump( Reverse_Camera_r->sharedLock_r->data, MAX_BUF_SIZE, g_debug_frame_num); memset(Reverse_Camera_r->sharedLock_r->data , 0 , MAX_BUF_SIZE); g_debug_frame_num++; }else ALOGI("[reverse_exe][%s][%d] flag=0x%x, exit reverse\n",__func__, __LINE__, Reverse_Camera_r->sharedLock_r->flag); pthread_mutex_unlock( &(Reverse_Camera_r->sharedLock_r->mutex)); }else{
ALOGI("[reverse_exe][%s][%d] pthread_mutex_trylock fail \n",__func__, __LINE__); usleep(10000); //sleep 10ms } } // 出错处理 if(g_failed_flag == 1 || (Reverse_Camera_r != NULL && Reverse_Camera_r->sharedLock_r->flag != 0xAA)){
capturing = 0; ALOGI("[reverse_exe]%s: g_failed_flag=%d, call CloseCamera, id=%s", __FUNCTION__, g_failed_flag, reverse_camera_name.c_str()); CloseCamera(reverse_camera_name.c_str(), reverse_camera_name.length()); } usleep(10000); if(Reverse_Camera_r != NULL){
delete(Reverse_Camera_r); } isRunning = false; g_debug_frame_num = 0; open_mutex.unlock(); ALOGI("[reverse_exe]%s: <<< unlock open_mutex", __FUNCTION__); //ALOGI("[reverse_exe][%s][%d] Exit isRunning=%d ... \n",__func__, __LINE__, isRunning);}

三、各场景Log分析

3.1 场景一、车机模式B,进入倒车模式,未投屏log 分析

分析log,可以看出,在进入倒车及退出倒车时,Reverse_Camera_W按照预期的进行构造和析构。

// 进入倒车模式11-28 11:10:05.154   691  1153 I dls_reverse_video: [Reverse_Camera_W][requestCameraImpl] current is xxx mode, start init Reverse_Camera_W// 初始化共享内存,配置标志位为 0xAA11-28 11:10:05.168   691  1153 I Reverse_Camera_W: [Reverse_Camera_W][21] set sharedLock_w->flag = 0xaa// 往共享内存写入Camera 数据11-28 11:10:05.912   691  1154 I Reverse_Camera_W: [write_mmap][115] len=518624, share_buffer_size=518400 11-28 11:10:05.912   691  1154 I Reverse_Camera_W: [write_mmap][122] pthread_cond_signal isReadCond +++ 。。。。 省略log 。。。11-28 11:10:07.322   691  1072 I Reverse_Camera_W: [write_mmap][122] pthread_cond_signal isReadCond +++ 11-28 11:10:07.360   691  1072 I Reverse_Camera_W: [write_mmap][115] len=518624, share_buffer_size=518400 11-28 11:10:07.360   691  1072 I Reverse_Camera_W: [write_mmap][122] pthread_cond_signal isReadCond +++ 11-28 11:10:07.400   691  1072 I Reverse_Camera_W: [write_mmap][115] len=518624, share_buffer_size=518400 11-28 11:10:07.400   691  1072 I Reverse_Camera_W: [write_mmap][122] pthread_cond_signal isReadCond +++ // 退出倒车模式11-28 11:10:07.595   691  1153 I Reverse_Camera_W: [~Reverse_Camera_W][27] enter +++// 配置标志位为0x0011-28 11:10:07.595   691  1153 I Reverse_Camera_W: [~Reverse_Camera_W][32] set sharedLock_w->flag = 0x0// 取消共享内存映射11-28 11:10:07.596   691  1153 I Reverse_Camera_W: [close_mmap][138] munmap /sdcard/camera_mamp.txt successed

3.2 场景二、车机模式B,未进入倒车模式,投屏打开摄像头log分析

// 打开摄像头11-28 12:15:59.098  2580  4886 I RasterMill: OpenCamera: Recieve openCamera cmd, camera id: Camera_video201, width: 640, height: 480, fps: 0, datatype: 2, dataformat: 1// 申请锁11-28 12:15:59.098  2580  4886 I CamSDK_3rdCamera: [native_camera]OpenCamera: >>> try_lock open_mutex,  id=video201 11-28 12:15:59.098  2580  4886 I CamSDK_3rdCamera: OpenCameraInner: start open native camera11-28 12:15:59.098  2580  4886 I CamSDK_3rdCamera: [reverse_exe][OpenCameraInner][149] id=video201  capturing=1// 映射共享内存11-28 12:15:59.098  2580  4886 I         : [reverse_exe][Reverse_Camera_R][19] g_debug_flag = 111-28 12:15:59.098  2580  4886 I         : [reverse_exe][init_mmap][73] init_mmap start+++ 11-28 12:15:59.099  2580  4886 I         : [reverse_exe][init_mmap][95] init_mmap success 11-28 12:15:59.099  2580  4886 I         : [reverse_exe][Reverse_Camera_R][32] get sharedLock_r->flag=0x011-28 12:15:59.099  2580  4886 I         : [reverse_exe][Reverse_Camera_R][34] reverse Camera not ready yet// 释放共享内存11-28 12:15:59.099  2580  4886 I         : [reverse_exe][close_mmap][106] munmap /sdcard/camera_mamp.txt successed // 释放相关资源11-28 12:15:59.099  2580  4886 I CamSDK_3rdCamera: [native_camera]OpenCameraInner: start call CloseCameraInner(video201)11-28 12:15:59.099  2580  4886 I CamSDK_3rdCamera: OpenCamera: opean camera error// 释放锁11-28 12:15:59.099  2580  4886 I CamSDK_3rdCamera: [native_camera]OpenCamera: <<< unlock close_mutex11-28 12:15:59.099  2580  4886 I CamSDK_3rdCamera: [native_camera]OpenCamera: --- unlock open_mutex --- get close_mutex failed// 返回打开失败11-28 12:15:59.099  2580  4886 E CamSDK_NativeCameraWrapper: OpenCamera: OpenCamera ret=-100111-28 12:15:59.099  2580  4886 E RasterMill: OpenCamera: Open Camera failed, ret: -1

3.3 场景三、车机模式B,进入倒车模式,投屏打开摄像头log分析

// 打开摄像头11-28 12:18:49.904  2580  4886 I RasterMill: OpenCamera: Recieve openCamera cmd, camera id: Camera_video201, width: 640, height: 480, fps: 0, datatype: 2, dataformat: 111-28 12:18:49.905  2580  4886 I CamSDK_3rdCamera: [native_camera]OpenCamera: >>> try_lock open_mutex,  id=video201 11-28 12:18:49.905  2580  4886 I CamSDK_3rdCamera: OpenCameraInner: start open native camera// 初始化共享内存,获得 get sharedLock_r->flag=0xaa11-28 12:18:49.905  2580  4886 I CamSDK_3rdCamera: [reverse_exe][OpenCameraInner][149] id=video201  capturing=111-28 12:18:49.905  2580  4886 I         : [reverse_exe][Reverse_Camera_R][19] g_debug_flag = 111-28 12:18:49.905  2580  4886 I         : [reverse_exe][init_mmap][73] init_mmap start+++ 11-28 12:18:49.905  2580  4886 I         : [reverse_exe][init_mmap][95] init_mmap success 11-28 12:18:49.905  2580  4886 I         : [reverse_exe][Reverse_Camera_R][32] get sharedLock_r->flag=0xaa// 初始化编码器11-28 12:18:49.906  2580  4886 I H264_Encoder: [reverse_exe][H264_encoder_init](143) +11-28 12:18:50.117  2580  4886 I H264_Encoder: [reverse_exe][H264_encoder_init](199) Start OMX.qcom.video.encoder.avc Success ^_^// 进入线程,获取Camera数据11-28 12:18:50.137  2580  7479 I CamSDK_3rdCamera: [reverse_exe][cap_reverse][752] Enter ... 11-28 12:18:50.137  2580  7479 I CamSDK_3rdCamera: [reverse_exe][cap_reverse][772] pthread_cond_wait isReadCond --- 11-28 12:18:50.141  2580  7479 I H264_Encoder: [reverse_exe][Post_Data_to_H264Encoder]dequeueInputBuffer i_index(0) size(573440)// 返回打开摄像头成功状态11-28 12:18:50.141  2580  4886 I CamSDK_3rdCamera: [native_camera]OpenCamera: <<< unlock close_mutex11-28 12:18:50.141  2580  4886 I RasterMill: OpenCamera: Open camera success// 在线程中,获取Camera数据11-28 12:18:50.146  2580  7479 I H264_Encoder: [reverse_exe][Post_Data_to_H264Encoder]queueInputBuffer g_pic_index=011-28 12:18:50.147  2580  7479 I         : [reverse_exe][Reverse_Camera_R_Dump][122] g_debug_flag=1,(0),(0)11-28 12:18:50.148  2580  7479 I         : [reverse_exe][Reverse_Camera_R_Dump][134] dump file : /sdcard/reverse/Rear-Camera-720x480-0.yuv11-28 12:18:50.151  2580  7479 I CamSDK_3rdCamera: [reverse_exe][cap_reverse][790] got_frame g_debug_frame_num=1 flag=0xaa11-28 12:18:50.161  2580  7479 I CamSDK_3rdCamera: [reverse_exe][cap_reverse][772] pthread_cond_wait isReadCond --- 11-28 12:18:50.180  2580  7479 I H264_Encoder: [reverse_exe][Post_Data_to_H264Encoder]dequeueInputBuffer i_index(1) size(573440)11-28 12:18:50.181  2580  7480 I H264_Encoder: [reverse_exe][Get_Data_From_H264Encoder_and_Send]dequeueOutputBuffer index=(0) size=(29) pts=(0), debugNumFrames=011-28 12:18:50.182  2580  7479 I H264_Encoder: [reverse_exe][Post_Data_to_H264Encoder]queueInputBuffer g_pic_index=111-28 12:18:50.183  2580  7480 I H264_Encoder: [reverse_exe][Get_Data_From_H264Encoder_and_Send]dequeueOutputBuffer index=(1) size=(52650) pts=(0), debugNumFrames=111-28 12:18:50.190  2580  7479 I         : [reverse_exe][Reverse_Camera_R_Dump][122] g_debug_flag=1,(1),(0)11-28 12:18:50.190  2580  7479 I CamSDK_3rdCamera: [reverse_exe][cap_reverse][790] got_frame g_debug_frame_num=2 flag=0xaa// 手机侧主动关闭摄像头,释放共享内存, 释放相关资源1-28 12:24:30.451  2580  5859 I         : [reverse_exe][close_mmap][106] munmap /sdcard/camera_mamp.txt successed 11-28 12:24:30.458  2580  4886 I CamSDK_3rdCamera: [native_camera]CloseCamera: <<< unlock close_mutex11-28 12:24:30.458  2580  4886 I RasterMill: CloseCamera: Close camera success11-28 12:24:30.541  2580  5859 I CamSDK_3rdCamera: [native_camera]cap_reverse: <<< unlock open_mutex

3.4 场景四、车机模式B,进入倒车模式,投屏打开摄像头,中途退出倒车模式

// 等待可读信号11-28 13:19:36.488  2623  7551 I CamSDK_3rdCamera: [reverse_exe][cap_reverse][778] pthread_cond_wait isReadCond --- // 获取到编码后的数据11-28 13:19:36.509  2623  7552 I H264_Encoder: [reverse_exe][Get_Data_From_H264Encoder_and_Send]dequeueOutputBuffer index=(0) size=(2917) pts=(89), debugNumFrames=90// 检测到 flag=0x0,说明倒车影像退出了11-28 13:19:36.715  2623  7551 I CamSDK_3rdCamera: [reverse_exe][cap_reverse][796] got_frame g_debug_frame_num=90 flag=0x0// 主动调用close camera11-28 13:19:36.715  2623  7551 I CamSDK_3rdCamera: [reverse_exe]cap_reverse: g_failed_flag=0, call CloseCamera, id=video20111-28 13:19:36.715  2623  7551 I CamSDK_3rdCamera: [native_camera]CloseCamera: >>> try_lock close_mutex, id=video20111-28 13:19:36.715  2623  7551 I CamSDK_3rdCamera: CloseCameraInner: stop v4l2 camera, clear resource, cam id: video201// 获取编码数据线程退出11-28 13:19:36.717  2623  7552 I CamSDK_3rdCamera: [reverse_exe][H264_EnCode_thread][749]  11-28 13:19:36.723  2623  7551 I CamSDK_3rdCamera: [native_camera]CloseCamera: <<< unlock close_mutex// 释放共享内存11-28 13:19:36.736  2623  7551 I         : [reverse_exe][close_mmap][106] munmap /sdcard/camera_mamp.txt successed 11-28 13:19:36.771  2623  7551 I H264_Encoder: [reverse_exe][H264_Encoder_exit](374) success// 释放锁11-28 13:19:36.771  2623  7551 I CamSDK_3rdCamera: [reverse_exe]cap_reverse: <<< unlock open_mutex

OK,至此,各场景调试ok,回家吃饭

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

上一篇:Linux进程的管理与调度(七)--- Linux下1号进程的前世(kernel_init)今生(init进程)
下一篇:【倒车影像分流需求 八】- 倒车影像需求新兼容方案代码修改

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月15日 11时33分51秒