Android相机HAL浅析

1,摄像头成像原理介绍

相机工作流程图

相机的成像原理可以简单概括如下:

景物(SCENE)通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转为电信号,经过A/D(模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(DSP)中加工处理,再通过IO接口传输到CPU中处理,通过DISPLAY就可以看到图像了。

电荷耦合器件(CCD)互补金属氧化物半导体(CMOS)接收光学镜头传递来的影像,经模/数转换器(A/D)转换成数字信号,经过编码后存储。

流程如下:

1)、CCD/CMOS将被摄体的光信号转变为电信号—电子图像(模拟信号)

2)、由模/数转换器(ADC)芯片来将模拟信号转化为数字信号

3)、数字信号形成后,由DSP或编码库对信号进行压缩并转化为特定的图像文件格式储存

数码相机的光学镜头与传统相机相同,将影像聚到感光器件上,即(光)电荷耦合器件(CCD) 。CCD替代了传统相机中的感光胶片的位置,其功能是将光信号转换成电信号,与电视摄像相同。

CCD是半导体器件,是数码相机的核心,其内含器件的单元数量决定了数码相机的成像质量——像素,单元越多,即像素数高,成像质量越好,通常情况下像素的高低代表了数码相机的档次和技术指标。

2,Android的相机框架

Android版的相机子系统提供一个拍照和录制视频的框架。

它将摄像头的上层应用与应用Framework、用户库串接起来,而正是这个用户库来与Camera的硬件层通信,从而实现操作camera硬件。

————————————————– ——————————————

————————————————– ———————————————

3.Camera HAL部分层

代码存放目录:硬件 RK29 摄像头

编译:

打印

  1. LOCAL_PATH:= $(叫我-DIR)
  2. 包括$(CLEAR_VARS)
  3. LOCAL_SRC_FILES:=
  4.     CameraHal_Module.cpp
  5.     CameraHal.cpp
  6.     CameraHal_Utils.cpp
  7.     MessageQueue.cpp
  8.     CameraHal_Mem.cpp
  9. ……………….
  10. IFEQ($($条(TARGET_BOARD_HARDWARE)),rk30board)
  11. LOCAL_MODULE:= camera.rk30board

为了实现一个具体功能的Camera,在HAL层需要一个硬件相关的Camera库(例如通过调用video对于linux驱动程序和Jpeg编码程序实现或者直接用各个chip厂商实现的私有库来实现,比如Qualcomm实现的libcamera.so和libqcamera.so),此处为camera.rk30board.so实现CameraHardwareInterface规定的接口,来调用相关的库,驱动相关的driver,实现对camera硬件的操作。这个库将被Camera的服务库libcameraservice.so调用。

 

3.1CameraHal_Module.cpp主要是摄像头HAL对上层提供的接口,和实际设备无关,上层的本地库都直接调用这个文件里面提供的接口。

  1. 静态INT  camera_device_open(常量 hw_module_t *模块,  常量字符*名称,
  2.                 hw_device_t **设备);
  3. 静态INT  camera_device_close(hw_device_t *设备);
  4. 静态INT  camera_get_number_of_cameras(无效);
  5. 静态INT  camera_get_camera_info(INT  camera_id,  结构 camera_info *信息);
  6. 静态结构 hw_module_methods_t camera_module_methods = {
  7.         打开:camera_device_open
  8. };
  9. camera_module_t HAL_MODULE_INFO_SYM = {
  10.     常见的有:{
  11.          标签:HARDWARE_MODULE_TAG,
  12.          version_major:((CONFIG_CAMERAHAL_VERSION&为0xFF00)>> 8),
  13.          version_minor:CONFIG_CAMERAHAL_VERSION&0xFF的,
  14.          ID:CAMERA_HARDWARE_MODULE_ID,
  15.          名称:CAMERA_MODULE_NAME,
  16.          作者:  “瑞芯”
  17.          方法:camera_module_methods,
  18.          DSO:NULL,  / *删除编译警告* /
  19.          版权所有:{0}  / *删除编译警告* /
  20.     },
  21.     get_number_of_cameras:camera_get_number_of_cameras,
  22.     get_camera_info:camera_get_camera_info,
  23. };

// CAMERA_DEVICE_NAME“的/ dev /视频”以下都是通过读取节点信息来获取摄像头的数目及摄像头设备信息

  1. INT  camera_device_close(hw_device_t *设备)
  2. {
  3.     INT  RET = 0;
  4.     rk_camera_device_t * rk_dev = NULL;
  5.     LOGD( “%S” ,__FUNCTION__);
  6.     安卓:: ::互斥锁自动锁(gCameraHalDeviceLock);
  7.     如果 (!设备){
  8.         RET = -EINVAL;
  9.         后藤 做的;
  10.     }
  11.     rk_dev =(rk_camera_device_t *)设备;
  12.     如果 (rk_dev){
  13.         如果 (gCameraHals [rk_dev-> cameraid]){
  14.             删除 gCameraHals [rk_dev-> cameraid];
  15.             gCameraHals [rk_dev-> cameraid] = NULL;
  16.             gCamerasOpen–;
  17.         }
  18.         如果 (rk_dev-> base.ops){
  19.             免费(rk_dev-> base.ops);
  20.         }
  21.         免费(rk_dev);
  22.     }
  23. 完成:
  24.     返回 RET;
  25. }
  26. / ******************* ******************
  27.  *实现camera_module功能
  28.  ************************************************** ***************** /
  29. / *打开设备手柄的相机之一
  30.  *
  31.  *承担摄像机的服务将让每个摄像机单
  32.  *所以这个函数永远只能被称为相机的每一次实例
  33.  * /
  34. INT  camera_device_open(常量 hw_module_t *模块,  常量字符*名称,
  35.                 hw_device_t **设备)
  36. {
  37.     INT  RV = 0;
  38.     INT  cameraid;
  39.     rk_camera_device_t * camera_device = NULL;
  40.     camera_device_ops_t * camera_ops = NULL;
  41.     安卓:: CameraHal *摄像头= NULL;
  42.     安卓:: ::互斥锁自动锁(gCameraHalDeviceLock);
  43.     LOGI(“camera_device开放” );
  44.     如果 (名字!= NULL){
  45.         cameraid =的atoi(名);
  46.         如果(cameraid> gCamerasNumber){
  47.             LOGE( “ 照相服务提供cameraid出界,”
  48.                     “cameraid =%d个,NUM支持=%d个”
  49.                     cameraid,gCamerasNumber);
  50.             RV = -EINVAL;
  51.             转到 失败;
  52.         }
  53.         如果(gCamerasOpen> = CAMERAS_SUPPORTED_SIMUL_MAX){
  54.             LOGE( “ 最大数量(%D)的摄像头已打开” ,gCamerasOpen);
  55.             RV = -ENOMEM;
  56.             转到 失败;
  57.         }
  58.         camera_device =(rk_camera_device_t *)malloc的(sizeof的(* camera_device));
  59.         如果(!camera_device){
  60.             LOGE(“camera_device分配失败” );
  61.             RV = -ENOMEM;
  62.             转到 失败;
  63.         }
  64.         camera_ops =(camera_device_ops_t *)malloc的(sizeof的(* camera_ops));
  65.         如果(!camera_ops){
  66.             LOGE(“camera_ops分配失败” );
  67.             RV = -ENOMEM;
  68.             转到 失败;
  69.         }
  70.         memset的(camera_device,0,  sizeof的(* camera_device));
  71.         memset的(camera_ops,0,  sizeof的(* camera_ops));
  72.         camera_device-> base.common.tag = HARDWARE_DEVICE_TAG;
  73.         camera_device-> base.common.version = 0;
  74.         camera_device-> base.common.module =(hw_module_t *)(模块);
  75.         camera_device-> base.common.close = camera_device_close;
  76.         camera_device-> base.ops = camera_ops;
  77.         camera_ops-> set_preview_window = camera_set_preview_window;
  78.         camera_ops-> set_callbacks = camera_set_callbacks;
  79.         camera_ops-> enable_msg_type = camera_enable_msg_type;
  80.         camera_ops-> disable_msg_type = camera_disable_msg_type;
  81.         camera_ops-> msg_type_enabled = camera_msg_type_enabled;
  82.         camera_ops-> start_preview = camera_start_preview;
  83.         camera_ops-> stop_preview = camera_stop_preview;
  84.         camera_ops-> preview_enabled = camera_preview_enabled;
  85.         camera_ops-> store_meta_data_in_buffers = camera_store_meta_data_in_buffers;
  86.         camera_ops-> start_recording = camera_start_recording;
  87.         camera_ops-> stop_recording = camera_stop_recording;
  88.         camera_ops-> recording_enabled = camera_recording_enabled;
  89.         camera_ops-> release_recording_frame = camera_release_recording_frame;
  90.         camera_ops-> auto_focus = camera_auto_focus;
  91.         camera_ops-> cancel_auto_focus = camera_cancel_auto_focus;
  92.         camera_ops-> take_picture = camera_take_picture;
  93.         camera_ops-> cancel_picture = camera_cancel_picture;
  94.         camera_ops-> set_parameters = camera_set_parameters;
  95.         camera_ops-> get_parameters = camera_get_parameters;
  96.         camera_ops-> put_parameters = camera_put_parameters;
  97.         camera_ops-> send_command = camera_send_command;
  98.         camera_ops->发布= camera_release;
  99.         camera_ops-> =倾倒camera_dump;
  100.         *设备= camera_device-> base.common;
  101.         // ——–瑞芯微具体的东西——–
  102.         camera_device-> cameraid = cameraid;
  103.         摄像头=   的Android :: CameraHal(cameraid);
  104.         如果(!相机){
  105.             LOGE( “ 无法创建CameraHal类的实例” );
  106.             RV = -ENOMEM;
  107.             转到 失败;
  108.         }
  109.         gCameraHals [cameraid] =相机;
  110.         gCamerasOpen ++;
  111.     }
  112.     返回 RV;
  113. 失败:
  114.     如果(camera_device){
  115.         免费(camera_device);
  116.         camera_device = NULL;
  117.     }
  118.     如果(camera_ops){
  119.         免费(camera_ops);
  120.         camera_ops = NULL;
  121.     }
  122.     如果(摄像机){
  123.         删除 摄像头;
  124.         相机= NULL;
  125.     }
  126.     *器件= NULL;
  127.     返回 RV;
  128. }
  129. INT  camera_get_number_of_cameras(无效
  130. {
  131.      cam_path [20];
  132.     CHAR  cam_num [3],I;
  133.     INT  cam_cnt = 0,FD = -1,rk29_cam [CAMERAS_SUPPORT_MAX];
  134.     结构 v4l2_capability能力;
  135.     rk_cam_info_t camInfoTmp [CAMERAS_SUPPORT_MAX]
  136.     字符 * PTR,** ptrr;
  137.     字符 版本[PROPERTY_VALUE_MAX]
  138.     如果 (gCamerasNumber> 0)
  139.         转到 camera_get_number_of_cameras_end;
  140.     memset的(版本,为0x00,sizeof的(版本));
  141.     sprintf的(版本,“%d个,%d个%D” ,((CONFIG_CAMERAHAL_VERSION 及为0xFF0000)>> 16)
  142.         ((CONFIG_CAMERAHAL_VERSION及为0xFF00)>> 8),CONFIG_CAMERAHAL_VERSION&0xFF的);
  143.     property_set(CAMERAHAL_VERSION_PROPERTY_KEY,版本);
  144.     memset的(camInfoTmp [0],0×00,的sizeof (rk_cam_info_t));
  145.     memset的(camInfoTmp [1],0×00,的sizeof (rk_cam_info_t));
  146.     对于 (i = 0; I <10;我++){
  147.         cam_path [0] = 0×00;
  148.         strcat的(cam_path,CAMERA_DEVICE_NAME);
  149.         sprintf的(cam_num, “%D” ,我);
  150.         strcat的(cam_path,cam_num);
  151.         FD =开(cam_path,O_RDONLY);
  152.         如果 (FD <0)
  153.             突破;
  154.         memset的(能力,0,  sizeof的结构 v4l2_capability));
  155.         如果 (的ioctl(FD,VIDIOC_QUERYCAP,&能力)<0){
  156.             LOGE( “ 视频设备(%S):查询功能,不支持 n” ,cam_path);
  157.             转到 loop_continue;
  158.         }
  159.         如果 ((capability.capabilities及(V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING))=(V4L2_CAP_VIDEO_CAPTURE |!V4L2_CAP_STREAMING)){
  160.             LOGD( “ 视频设备(%S):视频拍摄不支持 n” ,cam_path);
  161.         }  其他 {
  162.             memset的(camInfoTmp [cam_cnt&0×01] .device_path,为0x00,  sizeof的(camInfoTmp [cam_cnt&0×01] .device_path));
  163.             strcat的(camInfoTmp [cam_cnt&0×01] .device_path,cam_path);
  164.             memset的(camInfoTmp [cam_cnt&0×01] .fival_list,为0x00,  sizeof的(camInfoTmp [cam_cnt&0×01] .fival_list));
  165.             的memcpy(camInfoTmp [cam_cnt&0×01] .driver,capability.driver,  sizeof的(camInfoTmp [cam_cnt&0×01] .driver));
  166.             camInfoTmp [cam_cnt&0×01] .version = capability.version;
  167.             如果 (的strstr((字符*)&capability.card [0], “ 前” )!= NULL){
  168.                 camInfoTmp [cam_cnt&0×01] .facing_info.facing = CAMERA_FACING_FRONT;
  169.             }  其他 {
  170.                 camInfoTmp [cam_cnt&0×01] .facing_info.facing = CAMERA_FACING_BACK;
  171.             }
  172.             PTR =的strstr((字符*)&capability.card [0], “ – ” );
  173.             如果 (PTR!= NULL){
  174.                 PTR ++;
  175.                 camInfoTmp [cam_cnt&0×01] .facing_info.orientation =的atoi(PTR);
  176.             }  其他 {
  177.                 camInfoTmp [cam_cnt&0×01] .facing_info.orientation = 0;
  178.             }
  179.             cam_cnt ++;
  180.             memset的(版本,为0x00,sizeof的(版本));
  181.             sprintf的(版本,“%d个,%d个%D” ,((capability.version 及为0xFF0000)>> 16)
  182.                 ((capability.version及为0xFF00)>> 8),capability.version&0xFF的);
  183.             property_set(CAMERADRIVER_VERSION_PROPERTY_KEY,版本);
  184.             LOGD( “%S(%D):%S:%S” ,__ __功能__ __ LINE,CAMERADRIVER_VERSION_PROPERTY_KEY,版本);
  185.             如果 (cam_cnt> = CAMERAS_SUPPORT_MAX)
  186.                 我= 10;
  187.         }
  188. loop_continue:
  189.         如果 (FD> 0){
  190.             关闭(FD);
  191.             FD = -1;
  192.         }
  193.         继续;
  194.     }
  195.     // ZYC,改变相机的信息来源,如果有一个USB摄像头
  196.     如果((STRCMP(camInfoTmp [0] .driver,“uvcvideo” )== 0)){
  197.         camInfoTmp [0] .facing_info.facing =(camInfoTmp [1] .facing_info.facing == CAMERA_FACING_FRONT)?CAMERA_FACING_BACK:CAMERA_FACING_FRONT;
  198.         camInfoTmp [0] = .facing_info.orientation(camInfoTmp [0] == .facing_info.facing CAMERA_FACING_FRONT)270:90;
  199.     }  否则如果((STRCMP(camInfoTmp [1] .driver,“uvcvideo” )== 0)){
  200.         camInfoTmp [1] .facing_info.facing =(camInfoTmp [0] .facing_info.facing == CAMERA_FACING_FRONT)?CAMERA_FACING_BACK:CAMERA_FACING_FRONT;
  201.         camInfoTmp [1] .facing_info.orientation =(camInfoTmp [1] .facing_info.facing == CAMERA_FACING_FRONT)270:90;
  202.     }
  203.     gCamerasNumber = cam_cnt;
  204. #如果CONFIG_AUTO_DETECT_FRAMERATE
  205.     rk29_cam [0] = 0xff的;
  206.     rk29_cam [1] = 0xff的;
  207.     对于 (i = 0; I <cam_cnt;我++){
  208.         如果 (STRCMP((字符*)&camInfoTmp [I] .driver [0],“rk29xx相机” )== 0){
  209.             如果 (的strcmp((字符*)&camInfoTmp [I] .driver [0],(字符*)&gCamInfos [I] .driver [0])!= 0){
  210.                 rk29_cam [我] =我;
  211.             }
  212.         }  其他 {
  213.             rk29_cam [I] = 0xFF的;
  214.         }
  215.     }
  216.     如果 ((rk29_cam [0]!= 0xff的)||(rk29_cam [1]!= 0xff的)){
  217.         如果 (gCameraFpsDetectThread == NULL){
  218.             gCameraFpsDetectThread =   CameraFpsDetectThread();
  219.             LOGD( “%S 创建枚举摄像机的帧率CameraFpsDetectThread !!” ,__ FUNCTION__);
  220.             gCameraFpsDetectThread->运行(“CameraFpsDetectThread” ,ANDROID_PRIORITY_AUDIO);
  221.         }
  222.     }
  223. #万一
  224.     #如果CONFIG_CAMERA_SINGLE_SENSOR_FORCE_BACK_FOR_CTS
  225.     如果 ((gCamerasNumber == 1)&&(camInfoTmp [0] == .facing_info.facing CAMERA_FACING_FRONT)){
  226.         gCamerasNumber = 2;
  227.         的memcpy(&camInfoTmp [1],&camInfoTmp [0],  sizeof的(rk_cam_info_t));
  228.         camInfoTmp [1] .facing_info.facing = CAMERA_FACING_BACK;
  229.     }
  230.     #万一
  231.     的memcpy(&gCamInfos [0],&camInfoTmp [0],  sizeof的(rk_cam_info_t));
  232.     的memcpy(&gCamInfos [1],&camInfoTmp [1],  sizeof的(rk_cam_info_t));
  233. camera_get_number_of_cameras_end:
  234.     LOGD( “%S(%D):当前董事会有附加%d个摄像头。” ,__ FUNCTION__,__LINE__,gCamerasNumber);
  235.     返回 gCamerasNumber;
  236. }
  237. INT  camera_get_camera_info(INT  camera_id,  结构 camera_info *信息)
  238. {
  239.     INT  RV = 0,FP;
  240.     INT  face_value = CAMERA_FACING_BACK;
  241.     INT  方向= 0;
  242.     CHAR  PROCESS_NAME [30];
  243.     如果(camera_id> gCamerasNumber){
  244.         LOGE( “%S camera_id出界,camera_id =%d个,NUM支持=%d个” ,__ FUNCTION__,
  245.                 camera_id,gCamerasNumber);
  246.         RV = -EINVAL;
  247.         转到 结束;
  248.     }
  249.     信息 – > =面临gCamInfos [camera_id] .facing_info.facing;
  250.     信息 – >方向= gCamInfos [camera_id] .facing_info.orientation;
  251. 结束:
  252.     LOGD( “%S(%D):camera_%d 个面向(%D),朝向(%D)” ,__ __功能__ __ LINE,camera_id,信息- >面对,信息- >方向);
  253.     返回 RV;
  254. }

而对于为上层提供的HAL层接口函数,并不直接操作节点,而是间接的去调用CameraHal.cpp去操作节点。

  1. INT  camera_start_preview(结构 camera_device *设备)
  2. {
  3.     INT  RV = -EINVAL;
  4.     rk_camera_device_t * rk_dev = NULL;
  5.     LOGV( “%S” ,__FUNCTION__);
  6.     如果(!设备)
  7.         返回 RV;
  8.     rk_dev =(rk_camera_device_t *)设备;
  9.     RV = gCameraHals [rk_dev-> cameraid] – > startPreview();
  10.     返回 RV;
  11. }
  12. 无效 camera_stop_preview(结构 camera_device *设备)
  13. {
  14.     rk_camera_device_t * rk_dev = NULL;
  15.     LOGV( “%S” ,__FUNCTION__);
  16.     如果(!设备)
  17.         返回;
  18.     rk_dev =(rk_camera_device_t *)设备;
  19.     gCameraHals [rk_dev-> cameraid] – > stopPreview();
  20. }

3.2CameraHal.cpp去操作节点来进行实际的操作。

//这个几个线程很关键,分别对应着各种不同的情况,但是一直在运行

  1. CameraHal :: CameraHal(INT  cameraId)
  2.             :mParameters(),
  3.             mSnapshotRunning(-1),
  4.             mCommandRunning(-1),
  5.             mPreviewRunning(STA_PREVIEW_PAUSE)
  6.             mPreviewLock(),
  7.             mPreviewCond(),
  8.             mDisplayRuning(STA_DISPLAY_PAUSE)
  9.             mDisplayLock(),
  10.             mDisplayCond(),
  11.             mANativeWindowLock(),
  12.             mANativeWindowCond(),
  13.             mANativeWindow(NULL)
  14.             mPreviewErrorFrameCount(0),
  15.             mPreviewFrameSize(0),
  16.             mCamDriverFrmHeightMax(0),
  17.             mCamDriverFrmWidthMax(0),
  18.             mPreviewBufferCount(0),
  19.             mCamDriverPreviewFmt(0),
  20.             mCamDriverPictureFmt(0),
  21.             mCamDriverV4l2BufferLen(0),
  22.             mPreviewMemory(NULL)
  23.             mRawBufferSize(0),
  24.             mJpegBufferSize(0),
  25.             mMsgEnabled(0),
  26.             mEffect_number(0),
  27.             mScene_number(0),
  28.             mWhiteBalance_number(0),
  29.             mFlashMode_number(0),
  30.             mGps_latitude(-1),
  31.             mGps_longitude(-1),
  32.             mGps_altitude(-1),
  33.             mGps_timestamp(-1),
  34.             displayThreadCommandQ(“displayCmdQ” ),
  35.             displayThreadAckQ(“displayAckQ” ),
  36.             previewThreadCommandQ(“previewCmdQ” ),
  37.             previewThreadAckQ(“previewAckQ” ),
  38.             commandThreadCommandQ(“commandCmdQ” ),
  39.             commandThreadAckQ(“commandAckQ” ),
  40.             snapshotThreadCommandQ(“snapshotCmdQ” ),
  41.             snapshotThreadAckQ(“snapshotAckQ” ),
  42.             mCamBuffer(NULL)
  43. {
  44.     INT  FP,我;
  45.     cameraCallProcess [0] = 0×00;
  46.     sprintf的(cameraCallProcess, “ 的/ proc /%D / CMDLINE” ,getCallingPid());
  47.     计划生育=打开(cameraCallProcess,O_RDONLY);
  48.     如果 (FP <0){
  49.         memset的(cameraCallProcess,为0x00,sizeof的(cameraCallProcess));
  50.         LOGE( “ 获取调用进程信息失败” );
  51.     }  其他 {
  52.         memset的(cameraCallProcess,为0x00,sizeof的(cameraCallProcess));
  53.         阅读(FP,cameraCallProcess,30);
  54.         关闭(FP);
  55.         FP = -1;
  56.         LOGD( “ 调用过程是:%S” ,cameraCallProcess);
  57.     }
  58.     iCamFd = -1;
  59.     memset的(mCamDriverSupportFmt [0],0,  sizeof的(mCamDriverSupportFmt));
  60.     mRecordRunning =  虚假的;
  61.     mPictureRunning = STA_PICTURE_STOP;
  62.     mExitAutoFocusThread =  虚假的;
  63.     mDriverMirrorSupport =  虚假的;
  64.     mDriverFlipSupport =  虚假的;
  65.     mPreviewCmdReceived =  虚假的;
  66.     mPreviewStartTimes = 0×00;
  67.     memset的(mCamDriverV4l2Buffer,为0x00,  sizeof的(mCamDriverV4l2Buffer));
  68.     memset的(mDisplayFormat,为0x00,sizeof的(mDisplayFormat));
  69.     对于 (i = 0; I <CONFIG_CAMERA_PRVIEW_BUF_CNT;我++){
  70.         mPreviewBufferMap [I] = NULL;
  71.         mDisplayBufferMap [I] = NULL;
  72.         memset的(mGrallocBufferMap [I],0×00,的sizeof (rk_previewbuf_info_t));
  73.         mPreviewBufs [I] = NULL;
  74.         mVideoBufs [I] = NULL;
  75.         mPreviewBuffer [I] = NULL;
  76.     }
  77.     //打开RGA设备,ZYC
  78.     mRGAFd = -1;
  79.     如果 (cameraCreate(cameraId)== 0){
  80.         initDefaultParameters();
  81.         cameraRawJpegBufferCreate(mRawBufferSize,mJpegBufferSize);
  82.         mDisplayThread =   DisplayThread();
  83.         mPreviewThread =   PreviewThread();
  84.         mCommandThread =   CommandThread();
  85.         mPictureThread =   PictureThread();
  86.     mSnapshotThread =   SnapshotThread();
  87.         mAutoFocusThread =   AutoFocusThread();
  88.         mDisplayThread->运行(“CameraDispThread” ,ANDROID_PRIORITY_URGENT_DISPLAY);
  89.         mPreviewThread->运行(“CameraPreviewThread” ,ANDROID_PRIORITY_DISPLAY);
  90.         mCommandThread->运行(“CameraCmdThread” ,ANDROID_PRIORITY_URGENT_DISPLAY);
  91.         mAutoFocusThread->运行(“CameraAutoFocusThread” ,ANDROID_PRIORITY_DISPLAY);
  92.         mSnapshotThread->运行(“CameraSnapshotThread” ,ANDROID_PRIORITY_NORMAL);
  93.         LOGD(“CameraHal共创佳绩!” );
  94.     }  其他 {
  95.         mPreviewThread = NULL;
  96.         mDisplayThread = NULL;
  97.         mCommandThread = NULL;
  98.         mPictureThread = NULL;
  99.         mSnapshotThread = NULL;
  100.         mAutoFocusThread = NULL;
  101.     }
  102. }

初始化时参数的配置,默认参数图片大小,分辨率,帧等:

  1. 无效 CameraHal :: initDefaultParameters()
  2. {
  3.     CameraParameters PARAMS;
  4.     String8 parameterString;
  5.     诠释 I,J,previewFrameSizeMax;
  6.      cur_param [32],cam_size [10];
  7.     焦炭 str_picturesize [100]; //我们是在4分辨率支持:2592×1944,2048×1536,1600×1200,1024×768 
  8.     INT  RET,picture_size_bit;
  9.     结构 v4l2_format FMT;
  10.     LOG_FUNCTION_NAME
  11.     memset的(str_picturesize,为0x00,sizeof的(str_picturesize));
  12.     如果 (CAMERA_IS_UVC_CAMERA()){
  13.         / *预览大小设置* /
  14.         结构 v4l2_frmsizeenum FSIZE;
  15.         memset的(FSIZE,0,  sizeof的(FSIZE));
  16.         picture_size_bit = 0;
  17.         fsize.index = 0;
  18.         fsize.pixel_format = mCamDriverPreviewFmt;
  19.          ((RET =的ioctl(iCamFd,VIDIOC_ENUM_FRAMESIZES,与FSIZE))== 0){
  20.             如果 (fsize.type == V4L2_FRMSIZE_TYPE_DISCRETE){
  21.                 如果 ((fsize.discrete.width == 320)&&(fsize.discrete.height == 240)){
  22.                     如果 (STRCMP(cameraCallProcess,“com.tencent.android.pad” )== 0){
  23.                         fsize.index ++;
  24.                         继续;
  25.                     }
  26.                 }
  27.                 memset的(cam_size,为0x00,sizeof的(cam_size));
  28.                 如果 (parameterString.size()!= 0)
  29.                     cam_size [0] = ‘,’ ;
  30.                 sprintf的((字符*)(cam_size [strlen的(cam_size)]), “%D” ,fsize.discrete.width);
  31.                 的strcat(cam_size,  “×” );
  32.                 sprintf的((字符*)(cam_size [strlen的(cam_size)]), “%D” ,fsize.discrete.height);
  33.                 parameterString.append((常量字符*)cam_size);
  34.                 如果 ((strlen的(str_picturesize)+ strlen的(cam_size))< 的sizeof (str_picturesize)){
  35.                     如果 (fsize.discrete.width <= 2592){
  36.                         strcat的(str_picturesize,cam_size);
  37.                         如果 (fsize.discrete.width> mCamDriverFrmWidthMax){
  38.                             mCamDriverFrmWidthMax = fsize.discrete.width;
  39.                             mCamDriverFrmHeightMax = fsize.discrete.height;
  40.                         }
  41.                     }
  42.                 }  其他 {
  43.                     突破;
  44.                 }
  45.             }  否则如果 (fsize.type == V4L2_FRMSIZE_TYPE_CONTINUOUS){
  46.                 突破;
  47.             }  否则如果 (fsize.type == V4L2_FRMSIZE_TYPE_STEPWISE){
  48.                 突破;
  49.             }
  50.             fsize.index ++;
  51.         }
  52.         如果 (RET!= 0 &&错误号!= EINVAL){
  53.             LOGE(“ERROR枚举帧大小数:%d n” ,错误号);
  54.         }
  55.         params.set(CameraParameters :: KEY_SUPPORTED_PREVIEW_SIZES,parameterString.string());
  56.         params.setPreviewSize(640,480);
  57.         / *照片尺寸设置* /
  58.         params.set(CameraParameters :: KEY_SUPPORTED_PICTURE_SIZES,str_picturesize);
  59.         params.setPictureSize(mCamDriverFrmWidthMax,mCamDriverFrmHeightMax);
  60.         如果 (mCamDriverFrmWidthMax <= 1024){
  61.             mRawBufferSize = RAW_BUFFER_SIZE_1M;
  62.             mJpegBufferSize = JPEG_BUFFER_SIZE_1M;
  63.         }  否则如果 (mCamDriverFrmWidthMax <= 1600){
  64.             mRawBufferSize = RAW_BUFFER_SIZE_2M;
  65.             mJpegBufferSize = JPEG_BUFFER_SIZE_2M;
  66.         }  否则如果 (mCamDriverFrmWidthMax <= 2048){
  67.             mRawBufferSize = RAW_BUFFER_SIZE_3M;
  68.             mJpegBufferSize = JPEG_BUFFER_SIZE_3M;
  69.         }  否则如果 (mCamDriverFrmWidthMax <= 2592){
  70.             mRawBufferSize = RAW_BUFFER_SIZE_5M;
  71.             mJpegBufferSize = JPEG_BUFFER_SIZE_5M;
  72.         }  其他 {
  73.             LOGE( “%S(%D):相机哈尔只支持5Mega摄像头,但UVC摄像头DX%%D”
  74.                  __FUNCTION __,__ __ LINE,mCamDriverFrmWidthMax,mCamDriverFrmHeightMax);
  75.             mRawBufferSize = RAW_BUFFER_SIZE_5M;
  76.             mJpegBufferSize = JPEG_BUFFER_SIZE_5M;
  77.         }
  78.         / *设置帧率* /
  79.         结构 v4l2_streamparm setfps;
  80.         memset的(setfps,0,  sizeof的结构 v4l2_streamparm));
  81.         setfps.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  82.         setfps.parm.capture.timeperframe.numerator = 1;
  83.         setfps.parm.capture.timeperframe.denominator = 15;
  84.         RET =的ioctl(iCamFd,VIDIOC_S_PARM,与setfps);
  85.         / *帧速率设置* /
  86.         params.set(CameraParameters :: KEY_SUPPORTED_PREVIEW_FRAME_RATES,  “15” );
  87.         params.setPreviewFrameRate(15);
  88.         / *每秒帧的设置* /
  89.         parameterString =  “15000,15000” ;
  90.         params.set(CameraParameters :: KEY_PREVIEW_FPS_RANGE,parameterString.string());
  91.         parameterString =  “(15000,15000)” ;
  92.         params.set(CameraParameters :: KEY_SUPPORTED_PREVIEW_FPS_RANGE,parameterString.string());
  93.         / *不支持变焦* /
  94.         params.set(CameraParameters :: KEY_ZOOM_SUPPORTED, “ 假” );
  95.     }  否则如果 (CAMERA_IS_RKSOC_CAMERA()){
  96.         fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  97.         fmt.fmt.pix.pixelformat = mCamDriverPreviewFmt;
  98.         fmt.fmt.pix.field = V4L2_FIELD_NONE;
  99.         / *照片尺寸设置* /
  100.         fmt.fmt.pix.width = 10000;
  101.         fmt.fmt.pix.height = 10000;
  102.         RET =的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT);
  103.         mCamDriverFrmWidthMax = fmt.fmt.pix.width;
  104.         mCamDriverFrmHeightMax = fmt.fmt.pix.height;
  105.         如果 (mCamDriverFrmWidthMax> 2592){
  106.             LOGE( “ 相机的驱动程序支持的最大分辨率(%DX%D)溢出5Mega!” ,mCamDriverFrmWidthMax,mCamDriverFrmHeightMax);
  107.             mCamDriverFrmWidthMax = 2592;
  108.             mCamDriverFrmHeightMax = 1944年;
  109.         }
  110.         / *预览大小设置* /
  111.         如果 (mCamDriverFrmWidthMax> = 176){
  112.             fmt.fmt.pix.width = 176;
  113.             fmt.fmt.pix.height = 144;
  114.             如果 (的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT)== 0){
  115.                 如果 ((fmt.fmt.pix.width == 176)&&(fmt.fmt.pix.height == 144)){
  116.                     parameterString.append(“176×144” );
  117.                     params.setPreviewSize(176,144);
  118.                     previewFrameSizeMax = PAGE_ALIGN(176 * 144 * 2)* 2;           // 176 * 144 * 2 RGB565
  119.                     //params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,”176×144“);
  120.                 }
  121.             }
  122.         }
  123.         如果 ((mCamDriverCapability.version&0xff的)> = 0×07){
  124.             INT  TMP0,TMP1;
  125.             如果 (cameraFramerateQuery(mCamDriverPreviewFmt,240,160,和TMP1,与TMP0)== 0){
  126.                 如果 (mCamDriverFrmWidthMax> = 240){
  127.                     fmt.fmt.pix.width = 240;
  128.                     fmt.fmt.pix.height = 160;
  129.                     如果 (的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT)== 0){
  130.                         如果 ((fmt.fmt.pix.width == 240)&&(fmt.fmt.pix.height == 160)){
  131.                             parameterString.append(“240×160” );
  132.                             params.setPreviewSize(240,160);
  133.                             previewFrameSizeMax = PAGE_ALIGN(240 * 160 * 2)* 2;           // 240 * 160 * 2 RGB565
  134.                         }
  135.                     }
  136.                 }
  137.             }
  138.         }
  139.         如果 (的strcmp(cameraCallProcess,“com.tencent.android.pad” )){
  140.             如果 (mCamDriverFrmWidthMax> = 320){
  141.                 fmt.fmt.pix.width = 320;
  142.                 fmt.fmt.pix.height = 240;
  143.                 如果 (的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT)== 0){
  144.                     如果 ((fmt.fmt.pix.width == 320)&&(fmt.fmt.pix.height == 240)){
  145.                         parameterString.append(“320×240” );
  146.                         params.setPreviewSize(320,240);
  147.                         previewFrameSizeMax = PAGE_ALIGN(320 * 240 * 2)* 2;           // 320 * 240 * 2
  148.                     }
  149.                 }
  150.             }
  151.         }
  152.         如果 (mCamDriverFrmWidthMax> = 352){
  153.             fmt.fmt.pix.width = 352;
  154.             fmt.fmt.pix.height = 288;
  155.             如果 (的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT)== 0){
  156.                 如果 ((fmt.fmt.pix.width == 352)&&(fmt.fmt.pix.height == 288)){
  157.                     parameterString.append(“352×288” );
  158.                     params.setPreviewSize(352,288);
  159.                     previewFrameSizeMax = PAGE_ALIGN(352 * 288 * 2)* 2;           // 352 * 288 * 1.5 * 2
  160.                 }
  161.             }
  162.         }
  163.         如果 (mCamDriverFrmWidthMax> = 640){
  164.             fmt.fmt.pix.width = 640;
  165.             fmt.fmt.pix.height = 480;
  166.             如果 (的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT)== 0){
  167.                 如果 ((fmt.fmt.pix.width == 640)&&(fmt.fmt.pix.height == 480)){
  168.                     parameterString.append(“640×480” );
  169.                     params.setPreviewSize(640,480);
  170.                     previewFrameSizeMax = PAGE_ALIGN(640 * 480 * 2)* 2;           // 640 * 480 * 1.5 * 2
  171.                 }
  172.             }
  173.         }
  174.         如果 (mCamDriverFrmWidthMax> = 720){
  175.             fmt.fmt.pix.width = 720;
  176.             fmt.fmt.pix.height = 480;
  177.             如果 (的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT)== 0){
  178.                 如果 ((fmt.fmt.pix.width == 720)&&(fmt.fmt.pix.height == 480)){
  179.                     parameterString.append(“720×480” );
  180.                     previewFrameSizeMax = PAGE_ALIGN(720 * 480 * 2)* 2;           // 720 * 480 * 1.5 * 2
  181.                 }
  182.             }
  183.         }
  184.         如果 (mCamDriverFrmWidthMax> 1280){
  185.             fmt.fmt.pix.width = 1280;
  186.             fmt.fmt.pix.height = 720;
  187.             如果 (的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT)== 0){
  188.                 如果 ((fmt.fmt.pix.width == 1280)&&(fmt.fmt.pix.height == 720)){
  189.                     parameterString.append(“1280×720” );
  190.                     previewFrameSizeMax = PAGE_ALIGN(1280 * 720 * 2)* 2;           // 1280 * 720 * 1.5 * 2
  191.                 }
  192.             }
  193.         }
  194.         mSupportPreviewSizeReally = parameterString;
  195.         / * ddl@rock-chips.com:面部锁速度低,所以缩小预览数据到面部锁为加快* /
  196.         如果 ((STRCMP(cameraCallProcess,“com.android.facelock” )== 0)){
  197.             如果 (的strstr(mSupportPreviewSizeReally.string(),“640×480” )||
  198.                 的strstr(mSupportPreviewSizeReally.string(),“320×240” )){
  199.                 parameterString =  “160×120” ;
  200.                 params.setPreviewSize(160,120);
  201.             }
  202.         }
  203.         params.set(CameraParameters :: KEY_SUPPORTED_PREVIEW_SIZES,parameterString.string());
  204.         的strcat(str_picturesize,parameterString.string());
  205.         的strcat(str_picturesize, “,” );
  206.         如果(mCamDriverFrmWidthMax <= 640){
  207.             的strcat(str_picturesize,“640×480,320×240” );
  208.             mRawBufferSize = RAW_BUFFER_SIZE_0M3;
  209.             mJpegBufferSize = JPEG_BUFFER_SIZE_0M3;
  210.             params.setPictureSize(640,480);
  211.         } 否则如果 (mCamDriverFrmWidthMax <1280){
  212.             的strcat(str_picturesize,“1024×768,640×480,320×240” );
  213.             mRawBufferSize = RAW_BUFFER_SIZE_1M;
  214.             mJpegBufferSize = JPEG_BUFFER_SIZE_1M;
  215.             params.setPictureSize(1024,768);
  216.         }  否则如果 (mCamDriverFrmWidthMax <= 1600){
  217.             的strcat(str_picturesize,“1600×1200,1024×768,640×480” );
  218.             mRawBufferSize = RAW_BUFFER_SIZE_2M;
  219.             mJpegBufferSize = JPEG_BUFFER_SIZE_2M;
  220.             params.setPictureSize(1600,1200);
  221.         }  否则如果 (mCamDriverFrmWidthMax <= 2048){
  222.             的strcat(str_picturesize,“2048×1536,1600×1200,1024×768” );
  223.             mRawBufferSize = RAW_BUFFER_SIZE_3M;
  224.             mJpegBufferSize = JPEG_BUFFER_SIZE_3M;
  225.             params.setPictureSize(2048,1536);
  226.         }  否则如果 (mCamDriverFrmWidthMax <= 2592){
  227.             的strcat(str_picturesize,“2592×1944,2048×1536,1600×1200,1024×768” );
  228.             params.setPictureSize(2592,1944);
  229.             mRawBufferSize = RAW_BUFFER_SIZE_5M;
  230.             mJpegBufferSize = JPEG_BUFFER_SIZE_5M;
  231.         }  其他 {
  232.             sprintf的(str_picturesize, “%DX%D” ,mCamDriverFrmWidthMax,mCamDriverFrmHeightMax);
  233.             mRawBufferSize = RAW_BUFFER_SIZE_5M;
  234.             mJpegBufferSize = JPEG_BUFFER_SIZE_5M;
  235.             params.setPictureSize(mCamDriverFrmWidthMax,mCamDriverFrmHeightMax);
  236.         }
  237.         params.set(CameraParameters :: KEY_SUPPORTED_PICTURE_SIZES,str_picturesize);
  238.         / *帧速率设置* /
  239.         cameraFpsInfoSet(PARAMS);
  240.         / *缩放设置* /
  241.         结构 v4l2_queryctrl变焦;
  242.          str_zoom_max [3],str_zoom_element [5];
  243.         焦炭 str_zoom [200];
  244.         的strcpy(str_zoom, “” ); //默认缩放
  245.         INT  最大;
  246.         zoom.id = V4L2_CID_ZOOM_ABSOLUTE;
  247.         如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,和缩放)){
  248.             mZoomMax = zoom.maximum;
  249.             mZoomMin = zoom.minimum;
  250.             mZoomStep = zoom.step;
  251.             最大=(mZoomMax – mZoomMin)/ mZoomStep;
  252.             sprintf的(str_zoom_max, “%D” ,最大值);
  253.             params.set(CameraParameters :: KEY_ZOOM_SUPPORTED, “ 真” );
  254.             params.set(CameraParameters :: KEY_MAX_ZOOM,str_zoom_max);
  255.             params.set(CameraParameters :: KEY_ZOOM,  “0” );
  256.             对于 (i = mZoomMin;我<= mZoomMax; I + = mZoomStep){
  257.                 sprintf的(str_zoom_element, “%D” ,我);
  258.                 strcat的(str_zoom,str_zoom_element);
  259.             }
  260.             params.set(CameraParameters :: KEY_ZOOM_RATIOS,str_zoom);
  261.         }
  262.     }
  263.     / *预览格式设置* /
  264.     params.set(CameraParameters :: KEY_SUPPORTED_PREVIEW_FORMATS,  “yuv420sp,RGB565,YUV420P” );
  265.     params.set(CameraParameters :: KEY_VIDEO_FRAME_FORMAT,CameraParameters :: PIXEL_FORMAT_YUV420SP);
  266.     如果 (STRCMP(cameraCallProcess,“com.android.camera” )== 0){     //为PanoramaActivity
  267.         params.setPreviewFormat(CameraParameters :: PIXEL_FORMAT_RGB565);
  268.     }  其他 {
  269.         params.setPreviewFormat(CameraParameters :: PIXEL_FORMAT_YUV420SP);
  270.     }
  271.     / * zyc@rock-chips.com:预设为displayformat CTS * /
  272.     的strcpy(mDisplayFormat,CAMERA_DISPLAY_FORMAT_NV12);
  273.     params.set(CameraParameters :: KEY_VIDEO_FRAME_FORMAT,CameraParameters :: PIXEL_FORMAT_YUV420SP);
  274.     / *图片格式设置* /
  275.     params.set(CameraParameters :: KEY_SUPPORTED_PICTURE_FORMATS,CameraParameters :: PIXEL_FORMAT_JPEG);
  276.     params.setPictureFormat(CameraParameters :: PIXEL_FORMAT_JPEG);
  277.     / * JPEG画质设置* /
  278.     params.set(CameraParameters :: KEY_JPEG_QUALITY,  “70” );
  279.     / *白平衡设置* /
  280.     结构 v4l2_queryctrl最大光圈;
  281.     结构 v4l2_querymenu * whiteBalance_menu = mWhiteBalance_menu;
  282.     焦炭 str_whitebalance [200];
  283.     的strcpy(str_whitebalance, “” ); //默认最大光圈
  284.     whiteBalance.id = V4L2_CID_DO_WHITE_BALANCE;
  285.     如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,与最大光圈)){
  286.         对于 (i = whiteBalance.minimum;我<= whiteBalance.maximum; I + = whiteBalance.step){
  287.             whiteBalance_menu-> ID = V4L2_CID_DO_WHITE_BALANCE;
  288.             whiteBalance_menu->指数= I;
  289.             如果 (!的ioctl(iCamFd,VIDIOC_QUERYMENU,whiteBalance_menu)){
  290.                 如果 (我!= whiteBalance.minimum)
  291.                     的strcat(str_whitebalance, “,” );
  292.                 strcat的(str_whitebalance,(字符 *)whiteBalance_menu->名);
  293.                 如果 (whiteBalance.default_value == I){
  294.                     的strcpy(cur_param,(字符 *)whiteBalance_menu->名);
  295.                 }
  296.                 mWhiteBalance_number ++;
  297.             }
  298.             whiteBalance_menu ++;
  299.         }
  300.         params.set(CameraParameters :: KEY_SUPPORTED_WHITE_BALANCE,str_whitebalance);
  301.         params.set(CameraParameters :: KEY_WHITE_BALANCE,cur_param);
  302.     }
  303.     / *色彩效果设置* /
  304.     结构 v4l2_queryctrl效果;
  305.     结构 v4l2_querymenu * effect_menu = mEffect_menu;
  306.     焦炭 str_effect [200];
  307.     的strcpy(str_effect, “” ); //默认效果
  308.     effect.id = V4L2_CID_EFFECT;
  309.     如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,及效果)){
  310.         对于 (i = effect.minimum;我<= effect.maximum; I + = effect.step){
  311.             effect_menu-> ID = V4L2_CID_EFFECT;
  312.             effect_menu->指数= I;
  313.             如果 (!的ioctl(iCamFd,VIDIOC_QUERYMENU,effect_menu)){
  314.                 如果 (我!= effect.minimum)
  315.                     的strcat(str_effect, “,” );
  316.                 strcat的(str_effect,(字符 *)effect_menu->名);
  317.                 如果 (effect.default_value == I){
  318.                     的strcpy(cur_param,(字符 *)effect_menu->名);
  319.                 }
  320.                 mEffect_number ++;
  321.             }
  322.             effect_menu ++;
  323.         }
  324.         params.set(CameraParameters :: KEY_SUPPORTED_EFFECTS,str_effect);
  325.         params.set(CameraParameters :: KEY_EFFECT,cur_param);
  326.     }
  327.     / *场景设置* /
  328.     结构 v4l2_queryctrl现场;
  329.     结构 v4l2_querymenu * scene_menu = mScene_menu;
  330.     焦炭 str_scene [200];
  331.     的strcpy(str_scene, “” ); //默认场景
  332.     scene.id = V4L2_CID_SCENE;
  333.     如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,与场景)){
  334.         对于 (i = scene.minimum;我<= scene.maximum; I + = scene.step){
  335.             scene_menu-> ID = V4L2_CID_SCENE;
  336.             scene_menu->指数= I;
  337.             如果 (!的ioctl(iCamFd,VIDIOC_QUERYMENU,scene_menu)){
  338.                 如果 (我!= scene.minimum)
  339.                     的strcat(str_scene, “,” );
  340.                 strcat的(str_scene,(字符 *)scene_menu->名);
  341.                 如果 (scene.default_value == I){
  342.                     的strcpy(cur_param,(字符 *)scene_menu->名);
  343.                 }
  344.                 mScene_number ++;
  345.             }
  346.             scene_menu ++;
  347.         }
  348.         params.set(CameraParameters :: KEY_SUPPORTED_SCENE_MODES,str_scene);
  349.         params.set(CameraParameters :: KEY_SCENE_MODE,cur_param);
  350.     }
  351.     / *闪光灯模式设置* /
  352.     结构 v4l2_queryctrl flashMode;
  353.     结构 v4l2_querymenu * flashMode_menu = mFlashMode_menu;
  354.     焦炭 str_flash [200];
  355.     的strcpy(str_flash, “” ); //默认闪光
  356.     flashMode.id = V4L2_CID_FLASH;
  357.     如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,与flashMode)){
  358.         对于 (i = flashMode.minimum;我<= flashMode.maximum; I + = flashMode.step){
  359.             flashMode_menu-> ID = V4L2_CID_FLASH;
  360.             flashMode_menu->指数= I;
  361.             如果 (!的ioctl(iCamFd,VIDIOC_QUERYMENU,flashMode_menu)){
  362.                 如果 (我!= flashMode.minimum)
  363.                     的strcat(str_flash, “,” );
  364.                 strcat的(str_flash,(字符 *)flashMode_menu->名);
  365.                 如果 (flashMode.default_value == I){
  366.                     的strcpy(cur_param,(字符 *)flashMode_menu->名);
  367.                 }
  368.                 mFlashMode_number ++;
  369.             }
  370.             flashMode_menu ++;
  371.         }
  372.         params.set(CameraParameters :: KEY_SUPPORTED_FLASH_MODES,str_flash);
  373.         params.set(CameraParameters :: KEY_FLASH_MODE,cur_param);
  374.     }
  375.     / *对焦模式设置* /
  376.     结构 v4l2_queryctrl重点;
  377.     parameterString = CameraParameters :: FOCUS_MODE_FIXED;
  378.     params.set(CameraParameters :: KEY_FOCUS_MODE,CameraParameters :: FOCUS_MODE_FIXED);
  379.     focus.id = V4L2_CID_FOCUS_AUTO;
  380.     如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,和对焦)){
  381.         parameterString.append( “,” );
  382.         parameterString.append(CameraParameters :: FOCUS_MODE_AUTO);
  383.         params.set(CameraParameters :: KEY_FOCUS_MODE,CameraParameters :: FOCUS_MODE_AUTO);
  384.     }
  385.     focus.id = V4L2_CID_FOCUS_CONTINUOUS;
  386.     如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,和对焦)){
  387.         parameterString.append( “,” );
  388.         parameterString.append(CameraParameters :: FOCUS_MODE_EDOF);
  389.     }
  390.     focus.id = V4L2_CID_FOCUS_ABSOLUTE;
  391.     如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,和对焦)){
  392.         parameterString.append( “,” );
  393.         parameterString.append(CameraParameters :: FOCUS_MODE_INFINITY);
  394.         parameterString.append( “,” );
  395.         parameterString.append(CameraParameters :: FOCUS_MODE_MACRO);
  396.     }
  397.     params.set(CameraParameters :: KEY_SUPPORTED_FOCUS_MODES,parameterString.string());
  398.     / *镜和翻转查询* /
  399.     结构 v4l2_queryctrl镜像,翻转;
  400.     mirror.id = V4L2_CID_HFLIP;
  401.     如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,与镜)){
  402.         mDriverMirrorSupport =  ;
  403.     }  其他 {
  404.         mDriverMirrorSupport =  虚假的;
  405.     }
  406.     flip.id = V4L2_CID_VFLIP;
  407.     如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,与翻转)){
  408.         mDriverFlipSupport =  ;
  409.     }  其他 {
  410.         mDriverFlipSupport =  虚假的;
  411.     }
  412.     / *曝光设置* /
  413.     结构 v4l2_queryctrl曝光;
  414.      str_exposure [16];
  415.     exposure.id = V4L2_CID_EXPOSURE;
  416.     如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,与曝光)){
  417.         sprintf的(str_exposure, “%D” ,exposure.default_value);
  418.         params.set(CameraParameters :: KEY_EXPOSURE_COMPENSATION,str_exposure);
  419.         sprintf的(str_exposure, “%D” ,exposure.maximum);
  420.         params.set(CameraParameters :: KEY_MAX_EXPOSURE_COMPENSATION,str_exposure);
  421.         sprintf的(str_exposure, “%D” ,exposure.minimum);
  422.         params.set(CameraParameters :: KEY_MIN_EXPOSURE_COMPENSATION,str_exposure);
  423.         sprintf的(str_exposure, “%D” ,exposure.step);
  424.         params.set(CameraParameters :: KEY_EXPOSURE_COMPENSATION_STEP,str_exposure);
  425.     }  其他 {
  426.         params.set(CameraParameters :: KEY_EXPOSURE_COMPENSATION,  “0” );
  427.         params.set(CameraParameters :: KEY_MAX_EXPOSURE_COMPENSATION,  “0” );
  428.         params.set(CameraParameters :: KEY_MIN_EXPOSURE_COMPENSATION,  “0” );
  429.         params.set(CameraParameters :: KEY_EXPOSURE_COMPENSATION_STEP,  “0.000001f” );
  430.     }
  431.     / *旋转设置* /
  432.     params.set(CameraParameters :: KEY_ROTATION,  “0” );
  433.     /*lzg@rockchip.com:添加一些设置,通过CTS * /
  434.     / *对焦距离设置,没有太多的意义,只为传递CTS * /
  435.     parameterString =  “0.3,50,无限” ;
  436.     params.set(CameraParameters :: KEY_FOCUS_DISTANCES,parameterString.string());
  437.     / *焦距设置,没有太多的意义,只为传递CTS * /
  438.     parameterString =  “35” ;
  439.     params.set(CameraParameters :: KEY_FOCAL_LENGTH,parameterString.string());
  440.    / *只传递CTS视图设置,没有太大的意义,水平角度* /
  441.     parameterString =  “100” ;
  442.     params.set(CameraParameters :: KEY_HORIZONTAL_VIEW_ANGLE,parameterString.string());
  443.     / *只传递CTS视图设置,没有太大的意义,垂直角* /
  444.     parameterString =  “100” ;
  445.     params.set(CameraParameters :: KEY_VERTICAL_VIEW_ANGLE,parameterString.string());
  446.    / *在JPEG图片设置的EXIF缩略图的质量* /
  447.     parameterString =  “50” ;
  448.     params.set(CameraParameters :: KEY_JPEG_THUMBNAIL_QUALITY,parameterString.string());
  449.    / *在JPEG图片设置的EXIF缩略图的尺寸支持* /
  450.     parameterString =  “0x0,160×128” ;
  451.     params.set(CameraParameters :: KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,parameterString.string());
  452.     parameterString =  “160” ;
  453.     params.set(CameraParameters :: KEY_JPEG_THUMBNAIL_WIDTH,parameterString.string());
  454.     parameterString =  “128” ;
  455.     params.set(CameraParameters :: KEY_JPEG_THUMBNAIL_HEIGHT,parameterString.string());
  456.     / * zyc@rock-chips.com:对于CTS,KEY_MAX_NUM_DETECTED_FACES_HW不应该是0 * /
  457.     params.set(CameraParameters :: KEY_MAX_NUM_DETECTED_FACES_HW,  “0” );
  458.     params.set(CameraParameters :: KEY_MAX_NUM_DETECTED_FACES_SW,  “0” );
  459.     params.set(CameraParameters :: KEY_RECORDING_HINT, “ 假” );
  460.     params.set(CameraParameters :: KEY_VIDEO_STABILIZATION_SUPPORTED, “ 假” );
  461.     params.set(CameraParameters :: KEY_VIDEO_SNAPSHOT_SUPPORTED, “ 真” );
  462.     params.set(CameraParameters :: KEY_MAX_NUM_METERING_AREAS,“0” );
  463.     LOGD( “ 支持预览格式:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_PREVIEW_FORMATS));
  464.     LOGD( “ 支持预览大小:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_PREVIEW_SIZES));
  465.     LOGD( “ 支持预览FPS范围:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_PREVIEW_FPS_RANGE));
  466.     LOGD( “ 支持预览帧率:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_PREVIEW_FRAME_RATES));
  467.     LOGD( “ 支持图片大小:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_PICTURE_SIZES));
  468.     如果 (params.get(CameraParameters :: KEY_SUPPORTED_WHITE_BALANCE))
  469.         LOGD( “ 支持白平衡:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_WHITE_BALANCE));
  470.     如果 (params.get(CameraParameters :: KEY_SUPPORTED_EFFECTS))
  471.         LOGD( “ 支持色彩效果:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_EFFECTS));
  472.     如果 (params.get(CameraParameters :: KEY_SUPPORTED_SCENE_MODES))
  473.         LOGD( “ 支持场景:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_SCENE_MODES));
  474.     如果 (params.get(CameraParameters :: KEY_SUPPORTED_FLASH_MODES))
  475.         LOGD( “ 支持flash:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_FLASH_MODES));
  476.     LOGD( “ 支持重点:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_FOCUS_MODES));
  477.     LOGD( “ 支持缩放:%S(比例:%S)” ,params.get(CameraParameters :: KEY_ZOOM_SUPPORTED)
  478.         params.get(CameraParameters :: KEY_ZOOM_RATIOS));
  479.     如果 (的strcmp(“0” ,params.get(CameraParameters :: KEY_MAX_EXPOSURE_COMPENSATION))
  480.         || 的strcmp(“0” ,params.get(CameraParameters :: KEY_MIN_EXPOSURE_COMPENSATION))){
  481.         LOGD( “ 支持曝光:(%S – >%S)” ,params.get(CameraParameters :: KEY_MIN_EXPOSURE_COMPENSATION)
  482.             params.get(CameraParameters :: KEY_MAX_EXPOSURE_COMPENSATION));
  483.     }
  484.     LOGD( “ 支持硬件面临detecte:%S” ,params.get(CameraParameters :: KEY_MAX_NUM_DETECTED_FACES_HW));
  485.     LOGD( “ 支持软件面临detecte:%S” ,params.get(CameraParameters :: KEY_MAX_NUM_DETECTED_FACES_SW));
  486.     LOGD( “ 支持视频稳定:%S” ,params.get(CameraParameters :: KEY_VIDEO_STABILIZATION_SUPPORTED));
  487.     LOGD( “ 支持录音提示:%S” ,params.get(CameraParameters :: KEY_RECORDING_HINT));
  488.     LOGD( “ 支持视频快照:%S” ,params.get(CameraParameters :: KEY_VIDEO_SNAPSHOT_SUPPORTED));
  489.     LOGD( “ 支持镜像和财政投融资:%S” ,(mDriverMirrorSupport && mDriverFlipSupport)? “ 真” “假” );
  490.     cameraConfig(PARAMS);
  491.     LOG_FUNCTION_NAME_EXIT
  492. }

然后剩下的大部分都是针对这个线程的运行实现以及对于CameraHal_Module.cpp中实现的为上层提供的接口的具体实现,比如:

  1. INT  CameraHal :: startPreview()
  2. {
  3.     LOG_FUNCTION_NAME
  4.     信息MSG;
  5.     ::互斥锁自动锁定(MLOCK);
  6.     如果 ((mPreviewThread!= NULL)&&(mCommandThread!= NULL)){
  7.         msg.command = CMD_PREVIEW_START;
  8.         msg.arg1 =(无效*)CMDARG_NACK;
  9.         commandThreadCommandQ.put(MSG);
  10.     }
  11.     mPreviewCmdReceived =  ;
  12.     LOG_FUNCTION_NAME_EXIT
  13.     返回 NO_ERROR;
  14. }
  15. 无效 CameraHal :: stopPreview()
  16. {
  17.     LOG_FUNCTION_NAME
  18.     信息MSG;
  19.     INT  RET = 0;
  20.     ::互斥锁自动锁定(MLOCK);
  21.     如果 ((mPreviewThread!= NULL)&&(mCommandThread!= NULL)){
  22.         msg.command = CMD_PREVIEW_STOP;
  23.         msg.arg1 =(无效*)CMDARG_ACK;
  24.         commandThreadCommandQ.put(MSG);
  25.         如果 (mANativeWindow == NULL){
  26.             mANativeWindowCond.signal();
  27.             LOGD( “%S(%D):为停止预览唤醒命令线程” ,__ __功能__ LINE__);
  28.         }
  29.          (RET == 0){
  30.             RET = commandThreadAckQ.get(MSG);
  31.             如果 (RET == 0){
  32.                 如果 (msg.command == CMD_PREVIEW_STOP){
  33.                     RET = 1;
  34.                 }
  35.             }
  36.         }
  37.     }  其他 {
  38.         LOGE( “%S(%D):取消,是因为线程(%s%S)为空” ,__FUNCTION __,__ __ LINE(mPreviewThread == NULL)?“mPreviewThread” :“” ,
  39.             (mCommandThread == NULL)?“mCommandThread” :“” );
  40.     }
  41.     mPreviewCmdReceived =  虚假的;
  42.     LOG_FUNCTION_NAME_EXIT
  43. }
  44. INT  CameraHal ::自动对焦()
  45. {
  46.     LOG_FUNCTION_NAME
  47.     INT  RET = 0;
  48.     信息MSG;
  49.     ::互斥锁自动锁定(MLOCK);
  50.     如果 ((mPreviewThread!= NULL)&&(mCommandThread!= NULL)){
  51.         msg.command = CMD_AF_START;
  52.         msg.arg1 =(无效*)CMDARG_ACK;
  53.         commandThreadCommandQ.put(MSG);
  54.          (RET == 0){
  55.             RET = commandThreadAckQ.get(味精,5000);
  56.             如果 (RET == 0){
  57.                 如果 (msg.command == CMD_AF_START){
  58.                     RET = 1;
  59.                 }
  60.             }  其他 {
  61.                 LOGE( “%S(%D):自动对焦时间了! n” ,__ __功能__ LINE__);
  62.             }
  63.         }
  64.     }  其他 {
  65.         LOGE( “%S(%D):取消,是因为线程(%s%S)为空” ,__FUNCTION __,__ __ LINE(mPreviewThread == NULL)?“mPreviewThread” :“” ,
  66.             (mCommandThread == NULL)?“mCommandThread” :“” );
  67.     }
  68.     LOG_FUNCTION_NAME_EXIT
  69.     返回 NO_ERROR;
  70. }
5 Comments