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 摄像头
编译:
- LOCAL_PATH:= $(叫我-DIR)
- 包括$(CLEAR_VARS)
- LOCAL_SRC_FILES:=
- CameraHal_Module.cpp
- CameraHal.cpp
- CameraHal_Utils.cpp
- MessageQueue.cpp
- CameraHal_Mem.cpp
- ……………….
- IFEQ($($条(TARGET_BOARD_HARDWARE)),rk30board)
- 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对上层提供的接口,和实际设备无关,上层的本地库都直接调用这个文件里面提供的接口。
- 静态INT camera_device_open(常量 hw_module_t *模块, 常量字符*名称,
- hw_device_t **设备);
- 静态INT camera_device_close(hw_device_t *设备);
- 静态INT camera_get_number_of_cameras(无效);
- 静态INT camera_get_camera_info(INT camera_id, 结构 camera_info *信息);
- 静态结构 hw_module_methods_t camera_module_methods = {
- 打开:camera_device_open
- };
- camera_module_t HAL_MODULE_INFO_SYM = {
- 常见的有:{
- 标签:HARDWARE_MODULE_TAG,
- version_major:((CONFIG_CAMERAHAL_VERSION&为0xFF00)>> 8),
- version_minor:CONFIG_CAMERAHAL_VERSION&0xFF的,
- ID:CAMERA_HARDWARE_MODULE_ID,
- 名称:CAMERA_MODULE_NAME,
- 作者: “瑞芯” ,
- 方法:camera_module_methods,
- DSO:NULL, / *删除编译警告* /
- 版权所有:{0} / *删除编译警告* /
- },
- get_number_of_cameras:camera_get_number_of_cameras,
- get_camera_info:camera_get_camera_info,
- };
// CAMERA_DEVICE_NAME“的/ dev /视频”以下都是通过读取节点信息来获取摄像头的数目及摄像头设备信息
- INT camera_device_close(hw_device_t *设备)
- {
- INT RET = 0;
- rk_camera_device_t * rk_dev = NULL;
- LOGD( “%S” ,__FUNCTION__);
- 安卓:: ::互斥锁自动锁(gCameraHalDeviceLock);
- 如果 (!设备){
- RET = -EINVAL;
- 后藤 做的;
- }
- rk_dev =(rk_camera_device_t *)设备;
- 如果 (rk_dev){
- 如果 (gCameraHals [rk_dev-> cameraid]){
- 删除 gCameraHals [rk_dev-> cameraid];
- gCameraHals [rk_dev-> cameraid] = NULL;
- gCamerasOpen–;
- }
- 如果 (rk_dev-> base.ops){
- 免费(rk_dev-> base.ops);
- }
- 免费(rk_dev);
- }
- 完成:
- 返回 RET;
- }
- / ******************* ******************
- *实现camera_module功能
- ************************************************** ***************** /
- / *打开设备手柄的相机之一
- *
- *承担摄像机的服务将让每个摄像机单
- *所以这个函数永远只能被称为相机的每一次实例
- * /
- INT camera_device_open(常量 hw_module_t *模块, 常量字符*名称,
- hw_device_t **设备)
- {
- INT RV = 0;
- INT cameraid;
- rk_camera_device_t * camera_device = NULL;
- camera_device_ops_t * camera_ops = NULL;
- 安卓:: CameraHal *摄像头= NULL;
- 安卓:: ::互斥锁自动锁(gCameraHalDeviceLock);
- LOGI(“camera_device开放” );
- 如果 (名字!= NULL){
- cameraid =的atoi(名);
- 如果(cameraid> gCamerasNumber){
- LOGE( “ 照相服务提供cameraid出界,”
- “cameraid =%d个,NUM支持=%d个” ,
- cameraid,gCamerasNumber);
- RV = -EINVAL;
- 转到 失败;
- }
- 如果(gCamerasOpen> = CAMERAS_SUPPORTED_SIMUL_MAX){
- LOGE( “ 最大数量(%D)的摄像头已打开” ,gCamerasOpen);
- RV = -ENOMEM;
- 转到 失败;
- }
- camera_device =(rk_camera_device_t *)malloc的(sizeof的(* camera_device));
- 如果(!camera_device){
- LOGE(“camera_device分配失败” );
- RV = -ENOMEM;
- 转到 失败;
- }
- camera_ops =(camera_device_ops_t *)malloc的(sizeof的(* camera_ops));
- 如果(!camera_ops){
- LOGE(“camera_ops分配失败” );
- RV = -ENOMEM;
- 转到 失败;
- }
- memset的(camera_device,0, sizeof的(* camera_device));
- memset的(camera_ops,0, sizeof的(* camera_ops));
- camera_device-> base.common.tag = HARDWARE_DEVICE_TAG;
- camera_device-> base.common.version = 0;
- camera_device-> base.common.module =(hw_module_t *)(模块);
- camera_device-> base.common.close = camera_device_close;
- camera_device-> base.ops = camera_ops;
- camera_ops-> set_preview_window = camera_set_preview_window;
- camera_ops-> set_callbacks = camera_set_callbacks;
- camera_ops-> enable_msg_type = camera_enable_msg_type;
- camera_ops-> disable_msg_type = camera_disable_msg_type;
- camera_ops-> msg_type_enabled = camera_msg_type_enabled;
- camera_ops-> start_preview = camera_start_preview;
- camera_ops-> stop_preview = camera_stop_preview;
- camera_ops-> preview_enabled = camera_preview_enabled;
- camera_ops-> store_meta_data_in_buffers = camera_store_meta_data_in_buffers;
- camera_ops-> start_recording = camera_start_recording;
- camera_ops-> stop_recording = camera_stop_recording;
- camera_ops-> recording_enabled = camera_recording_enabled;
- camera_ops-> release_recording_frame = camera_release_recording_frame;
- camera_ops-> auto_focus = camera_auto_focus;
- camera_ops-> cancel_auto_focus = camera_cancel_auto_focus;
- camera_ops-> take_picture = camera_take_picture;
- camera_ops-> cancel_picture = camera_cancel_picture;
- camera_ops-> set_parameters = camera_set_parameters;
- camera_ops-> get_parameters = camera_get_parameters;
- camera_ops-> put_parameters = camera_put_parameters;
- camera_ops-> send_command = camera_send_command;
- camera_ops->发布= camera_release;
- camera_ops-> =倾倒camera_dump;
- *设备= camera_device-> base.common;
- // ——–瑞芯微具体的东西——–
- camera_device-> cameraid = cameraid;
- 摄像头= 新 的Android :: CameraHal(cameraid);
- 如果(!相机){
- LOGE( “ 无法创建CameraHal类的实例” );
- RV = -ENOMEM;
- 转到 失败;
- }
- gCameraHals [cameraid] =相机;
- gCamerasOpen ++;
- }
- 返回 RV;
- 失败:
- 如果(camera_device){
- 免费(camera_device);
- camera_device = NULL;
- }
- 如果(camera_ops){
- 免费(camera_ops);
- camera_ops = NULL;
- }
- 如果(摄像机){
- 删除 摄像头;
- 相机= NULL;
- }
- *器件= NULL;
- 返回 RV;
- }
- INT camera_get_number_of_cameras(无效)
- {
- 炭 cam_path [20];
- CHAR cam_num [3],I;
- INT cam_cnt = 0,FD = -1,rk29_cam [CAMERAS_SUPPORT_MAX];
- 结构 v4l2_capability能力;
- rk_cam_info_t camInfoTmp [CAMERAS_SUPPORT_MAX]
- 字符 * PTR,** ptrr;
- 字符 版本[PROPERTY_VALUE_MAX]
- 如果 (gCamerasNumber> 0)
- 转到 camera_get_number_of_cameras_end;
- memset的(版本,为0x00,sizeof的(版本));
- sprintf的(版本,“%d个,%d个%D” ,((CONFIG_CAMERAHAL_VERSION 及为0xFF0000)>> 16)
- ((CONFIG_CAMERAHAL_VERSION及为0xFF00)>> 8),CONFIG_CAMERAHAL_VERSION&0xFF的);
- property_set(CAMERAHAL_VERSION_PROPERTY_KEY,版本);
- memset的(camInfoTmp [0],0×00,的sizeof (rk_cam_info_t));
- memset的(camInfoTmp [1],0×00,的sizeof (rk_cam_info_t));
- 对于 (i = 0; I <10;我++){
- cam_path [0] = 0×00;
- strcat的(cam_path,CAMERA_DEVICE_NAME);
- sprintf的(cam_num, “%D” ,我);
- strcat的(cam_path,cam_num);
- FD =开(cam_path,O_RDONLY);
- 如果 (FD <0)
- 突破;
- memset的(能力,0, sizeof的(结构 v4l2_capability));
- 如果 (的ioctl(FD,VIDIOC_QUERYCAP,&能力)<0){
- LOGE( “ 视频设备(%S):查询功能,不支持 n” ,cam_path);
- 转到 loop_continue;
- }
- 如果 ((capability.capabilities及(V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING))=(V4L2_CAP_VIDEO_CAPTURE |!V4L2_CAP_STREAMING)){
- LOGD( “ 视频设备(%S):视频拍摄不支持 n” ,cam_path);
- } 其他 {
- memset的(camInfoTmp [cam_cnt&0×01] .device_path,为0x00, sizeof的(camInfoTmp [cam_cnt&0×01] .device_path));
- strcat的(camInfoTmp [cam_cnt&0×01] .device_path,cam_path);
- memset的(camInfoTmp [cam_cnt&0×01] .fival_list,为0x00, sizeof的(camInfoTmp [cam_cnt&0×01] .fival_list));
- 的memcpy(camInfoTmp [cam_cnt&0×01] .driver,capability.driver, sizeof的(camInfoTmp [cam_cnt&0×01] .driver));
- camInfoTmp [cam_cnt&0×01] .version = capability.version;
- 如果 (的strstr((字符*)&capability.card [0], “ 前” )!= NULL){
- camInfoTmp [cam_cnt&0×01] .facing_info.facing = CAMERA_FACING_FRONT;
- } 其他 {
- camInfoTmp [cam_cnt&0×01] .facing_info.facing = CAMERA_FACING_BACK;
- }
- PTR =的strstr((字符*)&capability.card [0], “ – ” );
- 如果 (PTR!= NULL){
- PTR ++;
- camInfoTmp [cam_cnt&0×01] .facing_info.orientation =的atoi(PTR);
- } 其他 {
- camInfoTmp [cam_cnt&0×01] .facing_info.orientation = 0;
- }
- cam_cnt ++;
- memset的(版本,为0x00,sizeof的(版本));
- sprintf的(版本,“%d个,%d个%D” ,((capability.version 及为0xFF0000)>> 16)
- ((capability.version及为0xFF00)>> 8),capability.version&0xFF的);
- property_set(CAMERADRIVER_VERSION_PROPERTY_KEY,版本);
- LOGD( “%S(%D):%S:%S” ,__ __功能__ __ LINE,CAMERADRIVER_VERSION_PROPERTY_KEY,版本);
- 如果 (cam_cnt> = CAMERAS_SUPPORT_MAX)
- 我= 10;
- }
- loop_continue:
- 如果 (FD> 0){
- 关闭(FD);
- FD = -1;
- }
- 继续;
- }
- // ZYC,改变相机的信息来源,如果有一个USB摄像头
- 如果((STRCMP(camInfoTmp [0] .driver,“uvcvideo” )== 0)){
- camInfoTmp [0] .facing_info.facing =(camInfoTmp [1] .facing_info.facing == CAMERA_FACING_FRONT)?CAMERA_FACING_BACK:CAMERA_FACING_FRONT;
- camInfoTmp [0] = .facing_info.orientation(camInfoTmp [0] == .facing_info.facing CAMERA_FACING_FRONT)270:90;
- } 否则如果((STRCMP(camInfoTmp [1] .driver,“uvcvideo” )== 0)){
- camInfoTmp [1] .facing_info.facing =(camInfoTmp [0] .facing_info.facing == CAMERA_FACING_FRONT)?CAMERA_FACING_BACK:CAMERA_FACING_FRONT;
- camInfoTmp [1] .facing_info.orientation =(camInfoTmp [1] .facing_info.facing == CAMERA_FACING_FRONT)270:90;
- }
- gCamerasNumber = cam_cnt;
- #如果CONFIG_AUTO_DETECT_FRAMERATE
- rk29_cam [0] = 0xff的;
- rk29_cam [1] = 0xff的;
- 对于 (i = 0; I <cam_cnt;我++){
- 如果 (STRCMP((字符*)&camInfoTmp [I] .driver [0],“rk29xx相机” )== 0){
- 如果 (的strcmp((字符*)&camInfoTmp [I] .driver [0],(字符*)&gCamInfos [I] .driver [0])!= 0){
- rk29_cam [我] =我;
- }
- } 其他 {
- rk29_cam [I] = 0xFF的;
- }
- }
- 如果 ((rk29_cam [0]!= 0xff的)||(rk29_cam [1]!= 0xff的)){
- 如果 (gCameraFpsDetectThread == NULL){
- gCameraFpsDetectThread = 新 CameraFpsDetectThread();
- LOGD( “%S 创建枚举摄像机的帧率CameraFpsDetectThread !!” ,__ FUNCTION__);
- gCameraFpsDetectThread->运行(“CameraFpsDetectThread” ,ANDROID_PRIORITY_AUDIO);
- }
- }
- #万一
- #如果CONFIG_CAMERA_SINGLE_SENSOR_FORCE_BACK_FOR_CTS
- 如果 ((gCamerasNumber == 1)&&(camInfoTmp [0] == .facing_info.facing CAMERA_FACING_FRONT)){
- gCamerasNumber = 2;
- 的memcpy(&camInfoTmp [1],&camInfoTmp [0], sizeof的(rk_cam_info_t));
- camInfoTmp [1] .facing_info.facing = CAMERA_FACING_BACK;
- }
- #万一
- 的memcpy(&gCamInfos [0],&camInfoTmp [0], sizeof的(rk_cam_info_t));
- 的memcpy(&gCamInfos [1],&camInfoTmp [1], sizeof的(rk_cam_info_t));
- camera_get_number_of_cameras_end:
- LOGD( “%S(%D):当前董事会有附加%d个摄像头。” ,__ FUNCTION__,__LINE__,gCamerasNumber);
- 返回 gCamerasNumber;
- }
- INT camera_get_camera_info(INT camera_id, 结构 camera_info *信息)
- {
- INT RV = 0,FP;
- INT face_value = CAMERA_FACING_BACK;
- INT 方向= 0;
- CHAR PROCESS_NAME [30];
- 如果(camera_id> gCamerasNumber){
- LOGE( “%S camera_id出界,camera_id =%d个,NUM支持=%d个” ,__ FUNCTION__,
- camera_id,gCamerasNumber);
- RV = -EINVAL;
- 转到 结束;
- }
- 信息 – > =面临gCamInfos [camera_id] .facing_info.facing;
- 信息 – >方向= gCamInfos [camera_id] .facing_info.orientation;
- 结束:
- LOGD( “%S(%D):camera_%d 个面向(%D),朝向(%D)” ,__ __功能__ __ LINE,camera_id,信息- >面对,信息- >方向);
- 返回 RV;
- }
而对于为上层提供的HAL层接口函数,并不直接操作节点,而是间接的去调用CameraHal.cpp去操作节点。
- INT camera_start_preview(结构 camera_device *设备)
- {
- INT RV = -EINVAL;
- rk_camera_device_t * rk_dev = NULL;
- LOGV( “%S” ,__FUNCTION__);
- 如果(!设备)
- 返回 RV;
- rk_dev =(rk_camera_device_t *)设备;
- RV = gCameraHals [rk_dev-> cameraid] – > startPreview();
- 返回 RV;
- }
- 无效 camera_stop_preview(结构 camera_device *设备)
- {
- rk_camera_device_t * rk_dev = NULL;
- LOGV( “%S” ,__FUNCTION__);
- 如果(!设备)
- 返回;
- rk_dev =(rk_camera_device_t *)设备;
- gCameraHals [rk_dev-> cameraid] – > stopPreview();
- }
3.2CameraHal.cpp去操作节点来进行实际的操作。
//这个几个线程很关键,分别对应着各种不同的情况,但是一直在运行
- CameraHal :: CameraHal(INT cameraId)
- :mParameters(),
- mSnapshotRunning(-1),
- mCommandRunning(-1),
- mPreviewRunning(STA_PREVIEW_PAUSE)
- mPreviewLock(),
- mPreviewCond(),
- mDisplayRuning(STA_DISPLAY_PAUSE)
- mDisplayLock(),
- mDisplayCond(),
- mANativeWindowLock(),
- mANativeWindowCond(),
- mANativeWindow(NULL)
- mPreviewErrorFrameCount(0),
- mPreviewFrameSize(0),
- mCamDriverFrmHeightMax(0),
- mCamDriverFrmWidthMax(0),
- mPreviewBufferCount(0),
- mCamDriverPreviewFmt(0),
- mCamDriverPictureFmt(0),
- mCamDriverV4l2BufferLen(0),
- mPreviewMemory(NULL)
- mRawBufferSize(0),
- mJpegBufferSize(0),
- mMsgEnabled(0),
- mEffect_number(0),
- mScene_number(0),
- mWhiteBalance_number(0),
- mFlashMode_number(0),
- mGps_latitude(-1),
- mGps_longitude(-1),
- mGps_altitude(-1),
- mGps_timestamp(-1),
- displayThreadCommandQ(“displayCmdQ” ),
- displayThreadAckQ(“displayAckQ” ),
- previewThreadCommandQ(“previewCmdQ” ),
- previewThreadAckQ(“previewAckQ” ),
- commandThreadCommandQ(“commandCmdQ” ),
- commandThreadAckQ(“commandAckQ” ),
- snapshotThreadCommandQ(“snapshotCmdQ” ),
- snapshotThreadAckQ(“snapshotAckQ” ),
- mCamBuffer(NULL)
- {
- INT FP,我;
- cameraCallProcess [0] = 0×00;
- sprintf的(cameraCallProcess, “ 的/ proc /%D / CMDLINE” ,getCallingPid());
- 计划生育=打开(cameraCallProcess,O_RDONLY);
- 如果 (FP <0){
- memset的(cameraCallProcess,为0x00,sizeof的(cameraCallProcess));
- LOGE( “ 获取调用进程信息失败” );
- } 其他 {
- memset的(cameraCallProcess,为0x00,sizeof的(cameraCallProcess));
- 阅读(FP,cameraCallProcess,30);
- 关闭(FP);
- FP = -1;
- LOGD( “ 调用过程是:%S” ,cameraCallProcess);
- }
- iCamFd = -1;
- memset的(mCamDriverSupportFmt [0],0, sizeof的(mCamDriverSupportFmt));
- mRecordRunning = 虚假的;
- mPictureRunning = STA_PICTURE_STOP;
- mExitAutoFocusThread = 虚假的;
- mDriverMirrorSupport = 虚假的;
- mDriverFlipSupport = 虚假的;
- mPreviewCmdReceived = 虚假的;
- mPreviewStartTimes = 0×00;
- memset的(mCamDriverV4l2Buffer,为0x00, sizeof的(mCamDriverV4l2Buffer));
- memset的(mDisplayFormat,为0x00,sizeof的(mDisplayFormat));
- 对于 (i = 0; I <CONFIG_CAMERA_PRVIEW_BUF_CNT;我++){
- mPreviewBufferMap [I] = NULL;
- mDisplayBufferMap [I] = NULL;
- memset的(mGrallocBufferMap [I],0×00,的sizeof (rk_previewbuf_info_t));
- mPreviewBufs [I] = NULL;
- mVideoBufs [I] = NULL;
- mPreviewBuffer [I] = NULL;
- }
- //打开RGA设备,ZYC
- mRGAFd = -1;
- 如果 (cameraCreate(cameraId)== 0){
- initDefaultParameters();
- cameraRawJpegBufferCreate(mRawBufferSize,mJpegBufferSize);
- mDisplayThread = 新 DisplayThread(本);
- mPreviewThread = 新 PreviewThread(本);
- mCommandThread = 新 CommandThread(本);
- mPictureThread = 新 PictureThread(本);
- mSnapshotThread = 新 SnapshotThread(本);
- mAutoFocusThread = 新 AutoFocusThread(本);
- mDisplayThread->运行(“CameraDispThread” ,ANDROID_PRIORITY_URGENT_DISPLAY);
- mPreviewThread->运行(“CameraPreviewThread” ,ANDROID_PRIORITY_DISPLAY);
- mCommandThread->运行(“CameraCmdThread” ,ANDROID_PRIORITY_URGENT_DISPLAY);
- mAutoFocusThread->运行(“CameraAutoFocusThread” ,ANDROID_PRIORITY_DISPLAY);
- mSnapshotThread->运行(“CameraSnapshotThread” ,ANDROID_PRIORITY_NORMAL);
- LOGD(“CameraHal共创佳绩!” );
- } 其他 {
- mPreviewThread = NULL;
- mDisplayThread = NULL;
- mCommandThread = NULL;
- mPictureThread = NULL;
- mSnapshotThread = NULL;
- mAutoFocusThread = NULL;
- }
- }
初始化时参数的配置,默认参数图片大小,分辨率,帧等:
- 无效 CameraHal :: initDefaultParameters()
- {
- CameraParameters PARAMS;
- String8 parameterString;
- 诠释 I,J,previewFrameSizeMax;
- 炭 cur_param [32],cam_size [10];
- 焦炭 str_picturesize [100]; //我们是在4分辨率支持:2592×1944,2048×1536,1600×1200,1024×768
- INT RET,picture_size_bit;
- 结构 v4l2_format FMT;
- LOG_FUNCTION_NAME
- memset的(str_picturesize,为0x00,sizeof的(str_picturesize));
- 如果 (CAMERA_IS_UVC_CAMERA()){
- / *预览大小设置* /
- 结构 v4l2_frmsizeenum FSIZE;
- memset的(FSIZE,0, sizeof的(FSIZE));
- picture_size_bit = 0;
- fsize.index = 0;
- fsize.pixel_format = mCamDriverPreviewFmt;
- 而 ((RET =的ioctl(iCamFd,VIDIOC_ENUM_FRAMESIZES,与FSIZE))== 0){
- 如果 (fsize.type == V4L2_FRMSIZE_TYPE_DISCRETE){
- 如果 ((fsize.discrete.width == 320)&&(fsize.discrete.height == 240)){
- 如果 (STRCMP(cameraCallProcess,“com.tencent.android.pad” )== 0){
- fsize.index ++;
- 继续;
- }
- }
- memset的(cam_size,为0x00,sizeof的(cam_size));
- 如果 (parameterString.size()!= 0)
- cam_size [0] = ‘,’ ;
- sprintf的((字符*)(cam_size [strlen的(cam_size)]), “%D” ,fsize.discrete.width);
- 的strcat(cam_size, “×” );
- sprintf的((字符*)(cam_size [strlen的(cam_size)]), “%D” ,fsize.discrete.height);
- parameterString.append((常量字符*)cam_size);
- 如果 ((strlen的(str_picturesize)+ strlen的(cam_size))< 的sizeof (str_picturesize)){
- 如果 (fsize.discrete.width <= 2592){
- strcat的(str_picturesize,cam_size);
- 如果 (fsize.discrete.width> mCamDriverFrmWidthMax){
- mCamDriverFrmWidthMax = fsize.discrete.width;
- mCamDriverFrmHeightMax = fsize.discrete.height;
- }
- }
- } 其他 {
- 突破;
- }
- } 否则如果 (fsize.type == V4L2_FRMSIZE_TYPE_CONTINUOUS){
- 突破;
- } 否则如果 (fsize.type == V4L2_FRMSIZE_TYPE_STEPWISE){
- 突破;
- }
- fsize.index ++;
- }
- 如果 (RET!= 0 &&错误号!= EINVAL){
- LOGE(“ERROR枚举帧大小数:%d n” ,错误号);
- }
- params.set(CameraParameters :: KEY_SUPPORTED_PREVIEW_SIZES,parameterString.string());
- params.setPreviewSize(640,480);
- / *照片尺寸设置* /
- params.set(CameraParameters :: KEY_SUPPORTED_PICTURE_SIZES,str_picturesize);
- params.setPictureSize(mCamDriverFrmWidthMax,mCamDriverFrmHeightMax);
- 如果 (mCamDriverFrmWidthMax <= 1024){
- mRawBufferSize = RAW_BUFFER_SIZE_1M;
- mJpegBufferSize = JPEG_BUFFER_SIZE_1M;
- } 否则如果 (mCamDriverFrmWidthMax <= 1600){
- mRawBufferSize = RAW_BUFFER_SIZE_2M;
- mJpegBufferSize = JPEG_BUFFER_SIZE_2M;
- } 否则如果 (mCamDriverFrmWidthMax <= 2048){
- mRawBufferSize = RAW_BUFFER_SIZE_3M;
- mJpegBufferSize = JPEG_BUFFER_SIZE_3M;
- } 否则如果 (mCamDriverFrmWidthMax <= 2592){
- mRawBufferSize = RAW_BUFFER_SIZE_5M;
- mJpegBufferSize = JPEG_BUFFER_SIZE_5M;
- } 其他 {
- LOGE( “%S(%D):相机哈尔只支持5Mega摄像头,但UVC摄像头DX%%D” ,
- __FUNCTION __,__ __ LINE,mCamDriverFrmWidthMax,mCamDriverFrmHeightMax);
- mRawBufferSize = RAW_BUFFER_SIZE_5M;
- mJpegBufferSize = JPEG_BUFFER_SIZE_5M;
- }
- / *设置帧率* /
- 结构 v4l2_streamparm setfps;
- memset的(setfps,0, sizeof的(结构 v4l2_streamparm));
- setfps.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- setfps.parm.capture.timeperframe.numerator = 1;
- setfps.parm.capture.timeperframe.denominator = 15;
- RET =的ioctl(iCamFd,VIDIOC_S_PARM,与setfps);
- / *帧速率设置* /
- params.set(CameraParameters :: KEY_SUPPORTED_PREVIEW_FRAME_RATES, “15” );
- params.setPreviewFrameRate(15);
- / *每秒帧的设置* /
- parameterString = “15000,15000” ;
- params.set(CameraParameters :: KEY_PREVIEW_FPS_RANGE,parameterString.string());
- parameterString = “(15000,15000)” ;
- params.set(CameraParameters :: KEY_SUPPORTED_PREVIEW_FPS_RANGE,parameterString.string());
- / *不支持变焦* /
- params.set(CameraParameters :: KEY_ZOOM_SUPPORTED, “ 假” );
- } 否则如果 (CAMERA_IS_RKSOC_CAMERA()){
- fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- fmt.fmt.pix.pixelformat = mCamDriverPreviewFmt;
- fmt.fmt.pix.field = V4L2_FIELD_NONE;
- / *照片尺寸设置* /
- fmt.fmt.pix.width = 10000;
- fmt.fmt.pix.height = 10000;
- RET =的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT);
- mCamDriverFrmWidthMax = fmt.fmt.pix.width;
- mCamDriverFrmHeightMax = fmt.fmt.pix.height;
- 如果 (mCamDriverFrmWidthMax> 2592){
- LOGE( “ 相机的驱动程序支持的最大分辨率(%DX%D)溢出5Mega!” ,mCamDriverFrmWidthMax,mCamDriverFrmHeightMax);
- mCamDriverFrmWidthMax = 2592;
- mCamDriverFrmHeightMax = 1944年;
- }
- / *预览大小设置* /
- 如果 (mCamDriverFrmWidthMax> = 176){
- fmt.fmt.pix.width = 176;
- fmt.fmt.pix.height = 144;
- 如果 (的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT)== 0){
- 如果 ((fmt.fmt.pix.width == 176)&&(fmt.fmt.pix.height == 144)){
- parameterString.append(“176×144” );
- params.setPreviewSize(176,144);
- previewFrameSizeMax = PAGE_ALIGN(176 * 144 * 2)* 2; // 176 * 144 * 2 RGB565
- //params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,”176×144“);
- }
- }
- }
- 如果 ((mCamDriverCapability.version&0xff的)> = 0×07){
- INT TMP0,TMP1;
- 如果 (cameraFramerateQuery(mCamDriverPreviewFmt,240,160,和TMP1,与TMP0)== 0){
- 如果 (mCamDriverFrmWidthMax> = 240){
- fmt.fmt.pix.width = 240;
- fmt.fmt.pix.height = 160;
- 如果 (的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT)== 0){
- 如果 ((fmt.fmt.pix.width == 240)&&(fmt.fmt.pix.height == 160)){
- parameterString.append(“240×160” );
- params.setPreviewSize(240,160);
- previewFrameSizeMax = PAGE_ALIGN(240 * 160 * 2)* 2; // 240 * 160 * 2 RGB565
- }
- }
- }
- }
- }
- 如果 (的strcmp(cameraCallProcess,“com.tencent.android.pad” )){
- 如果 (mCamDriverFrmWidthMax> = 320){
- fmt.fmt.pix.width = 320;
- fmt.fmt.pix.height = 240;
- 如果 (的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT)== 0){
- 如果 ((fmt.fmt.pix.width == 320)&&(fmt.fmt.pix.height == 240)){
- parameterString.append(“320×240” );
- params.setPreviewSize(320,240);
- previewFrameSizeMax = PAGE_ALIGN(320 * 240 * 2)* 2; // 320 * 240 * 2
- }
- }
- }
- }
- 如果 (mCamDriverFrmWidthMax> = 352){
- fmt.fmt.pix.width = 352;
- fmt.fmt.pix.height = 288;
- 如果 (的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT)== 0){
- 如果 ((fmt.fmt.pix.width == 352)&&(fmt.fmt.pix.height == 288)){
- parameterString.append(“352×288” );
- params.setPreviewSize(352,288);
- previewFrameSizeMax = PAGE_ALIGN(352 * 288 * 2)* 2; // 352 * 288 * 1.5 * 2
- }
- }
- }
- 如果 (mCamDriverFrmWidthMax> = 640){
- fmt.fmt.pix.width = 640;
- fmt.fmt.pix.height = 480;
- 如果 (的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT)== 0){
- 如果 ((fmt.fmt.pix.width == 640)&&(fmt.fmt.pix.height == 480)){
- parameterString.append(“640×480” );
- params.setPreviewSize(640,480);
- previewFrameSizeMax = PAGE_ALIGN(640 * 480 * 2)* 2; // 640 * 480 * 1.5 * 2
- }
- }
- }
- 如果 (mCamDriverFrmWidthMax> = 720){
- fmt.fmt.pix.width = 720;
- fmt.fmt.pix.height = 480;
- 如果 (的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT)== 0){
- 如果 ((fmt.fmt.pix.width == 720)&&(fmt.fmt.pix.height == 480)){
- parameterString.append(“720×480” );
- previewFrameSizeMax = PAGE_ALIGN(720 * 480 * 2)* 2; // 720 * 480 * 1.5 * 2
- }
- }
- }
- 如果 (mCamDriverFrmWidthMax> 1280){
- fmt.fmt.pix.width = 1280;
- fmt.fmt.pix.height = 720;
- 如果 (的ioctl(iCamFd,VIDIOC_TRY_FMT,与FMT)== 0){
- 如果 ((fmt.fmt.pix.width == 1280)&&(fmt.fmt.pix.height == 720)){
- parameterString.append(“1280×720” );
- previewFrameSizeMax = PAGE_ALIGN(1280 * 720 * 2)* 2; // 1280 * 720 * 1.5 * 2
- }
- }
- }
- mSupportPreviewSizeReally = parameterString;
- / * ddl@rock-chips.com:面部锁速度低,所以缩小预览数据到面部锁为加快* /
- 如果 ((STRCMP(cameraCallProcess,“com.android.facelock” )== 0)){
- 如果 (的strstr(mSupportPreviewSizeReally.string(),“640×480” )||
- 的strstr(mSupportPreviewSizeReally.string(),“320×240” )){
- parameterString = “160×120” ;
- params.setPreviewSize(160,120);
- }
- }
- params.set(CameraParameters :: KEY_SUPPORTED_PREVIEW_SIZES,parameterString.string());
- 的strcat(str_picturesize,parameterString.string());
- 的strcat(str_picturesize, “,” );
- 如果(mCamDriverFrmWidthMax <= 640){
- 的strcat(str_picturesize,“640×480,320×240” );
- mRawBufferSize = RAW_BUFFER_SIZE_0M3;
- mJpegBufferSize = JPEG_BUFFER_SIZE_0M3;
- params.setPictureSize(640,480);
- } 否则如果 (mCamDriverFrmWidthMax <1280){
- 的strcat(str_picturesize,“1024×768,640×480,320×240” );
- mRawBufferSize = RAW_BUFFER_SIZE_1M;
- mJpegBufferSize = JPEG_BUFFER_SIZE_1M;
- params.setPictureSize(1024,768);
- } 否则如果 (mCamDriverFrmWidthMax <= 1600){
- 的strcat(str_picturesize,“1600×1200,1024×768,640×480” );
- mRawBufferSize = RAW_BUFFER_SIZE_2M;
- mJpegBufferSize = JPEG_BUFFER_SIZE_2M;
- params.setPictureSize(1600,1200);
- } 否则如果 (mCamDriverFrmWidthMax <= 2048){
- 的strcat(str_picturesize,“2048×1536,1600×1200,1024×768” );
- mRawBufferSize = RAW_BUFFER_SIZE_3M;
- mJpegBufferSize = JPEG_BUFFER_SIZE_3M;
- params.setPictureSize(2048,1536);
- } 否则如果 (mCamDriverFrmWidthMax <= 2592){
- 的strcat(str_picturesize,“2592×1944,2048×1536,1600×1200,1024×768” );
- params.setPictureSize(2592,1944);
- mRawBufferSize = RAW_BUFFER_SIZE_5M;
- mJpegBufferSize = JPEG_BUFFER_SIZE_5M;
- } 其他 {
- sprintf的(str_picturesize, “%DX%D” ,mCamDriverFrmWidthMax,mCamDriverFrmHeightMax);
- mRawBufferSize = RAW_BUFFER_SIZE_5M;
- mJpegBufferSize = JPEG_BUFFER_SIZE_5M;
- params.setPictureSize(mCamDriverFrmWidthMax,mCamDriverFrmHeightMax);
- }
- params.set(CameraParameters :: KEY_SUPPORTED_PICTURE_SIZES,str_picturesize);
- / *帧速率设置* /
- cameraFpsInfoSet(PARAMS);
- / *缩放设置* /
- 结构 v4l2_queryctrl变焦;
- 炭 str_zoom_max [3],str_zoom_element [5];
- 焦炭 str_zoom [200];
- 的strcpy(str_zoom, “” ); //默认缩放
- INT 最大;
- zoom.id = V4L2_CID_ZOOM_ABSOLUTE;
- 如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,和缩放)){
- mZoomMax = zoom.maximum;
- mZoomMin = zoom.minimum;
- mZoomStep = zoom.step;
- 最大=(mZoomMax – mZoomMin)/ mZoomStep;
- sprintf的(str_zoom_max, “%D” ,最大值);
- params.set(CameraParameters :: KEY_ZOOM_SUPPORTED, “ 真” );
- params.set(CameraParameters :: KEY_MAX_ZOOM,str_zoom_max);
- params.set(CameraParameters :: KEY_ZOOM, “0” );
- 对于 (i = mZoomMin;我<= mZoomMax; I + = mZoomStep){
- sprintf的(str_zoom_element, “%D” ,我);
- strcat的(str_zoom,str_zoom_element);
- }
- params.set(CameraParameters :: KEY_ZOOM_RATIOS,str_zoom);
- }
- }
- / *预览格式设置* /
- params.set(CameraParameters :: KEY_SUPPORTED_PREVIEW_FORMATS, “yuv420sp,RGB565,YUV420P” );
- params.set(CameraParameters :: KEY_VIDEO_FRAME_FORMAT,CameraParameters :: PIXEL_FORMAT_YUV420SP);
- 如果 (STRCMP(cameraCallProcess,“com.android.camera” )== 0){ //为PanoramaActivity
- params.setPreviewFormat(CameraParameters :: PIXEL_FORMAT_RGB565);
- } 其他 {
- params.setPreviewFormat(CameraParameters :: PIXEL_FORMAT_YUV420SP);
- }
- / * zyc@rock-chips.com:预设为displayformat CTS * /
- 的strcpy(mDisplayFormat,CAMERA_DISPLAY_FORMAT_NV12);
- params.set(CameraParameters :: KEY_VIDEO_FRAME_FORMAT,CameraParameters :: PIXEL_FORMAT_YUV420SP);
- / *图片格式设置* /
- params.set(CameraParameters :: KEY_SUPPORTED_PICTURE_FORMATS,CameraParameters :: PIXEL_FORMAT_JPEG);
- params.setPictureFormat(CameraParameters :: PIXEL_FORMAT_JPEG);
- / * JPEG画质设置* /
- params.set(CameraParameters :: KEY_JPEG_QUALITY, “70” );
- / *白平衡设置* /
- 结构 v4l2_queryctrl最大光圈;
- 结构 v4l2_querymenu * whiteBalance_menu = mWhiteBalance_menu;
- 焦炭 str_whitebalance [200];
- 的strcpy(str_whitebalance, “” ); //默认最大光圈
- whiteBalance.id = V4L2_CID_DO_WHITE_BALANCE;
- 如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,与最大光圈)){
- 对于 (i = whiteBalance.minimum;我<= whiteBalance.maximum; I + = whiteBalance.step){
- whiteBalance_menu-> ID = V4L2_CID_DO_WHITE_BALANCE;
- whiteBalance_menu->指数= I;
- 如果 (!的ioctl(iCamFd,VIDIOC_QUERYMENU,whiteBalance_menu)){
- 如果 (我!= whiteBalance.minimum)
- 的strcat(str_whitebalance, “,” );
- strcat的(str_whitebalance,(字符 *)whiteBalance_menu->名);
- 如果 (whiteBalance.default_value == I){
- 的strcpy(cur_param,(字符 *)whiteBalance_menu->名);
- }
- mWhiteBalance_number ++;
- }
- whiteBalance_menu ++;
- }
- params.set(CameraParameters :: KEY_SUPPORTED_WHITE_BALANCE,str_whitebalance);
- params.set(CameraParameters :: KEY_WHITE_BALANCE,cur_param);
- }
- / *色彩效果设置* /
- 结构 v4l2_queryctrl效果;
- 结构 v4l2_querymenu * effect_menu = mEffect_menu;
- 焦炭 str_effect [200];
- 的strcpy(str_effect, “” ); //默认效果
- effect.id = V4L2_CID_EFFECT;
- 如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,及效果)){
- 对于 (i = effect.minimum;我<= effect.maximum; I + = effect.step){
- effect_menu-> ID = V4L2_CID_EFFECT;
- effect_menu->指数= I;
- 如果 (!的ioctl(iCamFd,VIDIOC_QUERYMENU,effect_menu)){
- 如果 (我!= effect.minimum)
- 的strcat(str_effect, “,” );
- strcat的(str_effect,(字符 *)effect_menu->名);
- 如果 (effect.default_value == I){
- 的strcpy(cur_param,(字符 *)effect_menu->名);
- }
- mEffect_number ++;
- }
- effect_menu ++;
- }
- params.set(CameraParameters :: KEY_SUPPORTED_EFFECTS,str_effect);
- params.set(CameraParameters :: KEY_EFFECT,cur_param);
- }
- / *场景设置* /
- 结构 v4l2_queryctrl现场;
- 结构 v4l2_querymenu * scene_menu = mScene_menu;
- 焦炭 str_scene [200];
- 的strcpy(str_scene, “” ); //默认场景
- scene.id = V4L2_CID_SCENE;
- 如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,与场景)){
- 对于 (i = scene.minimum;我<= scene.maximum; I + = scene.step){
- scene_menu-> ID = V4L2_CID_SCENE;
- scene_menu->指数= I;
- 如果 (!的ioctl(iCamFd,VIDIOC_QUERYMENU,scene_menu)){
- 如果 (我!= scene.minimum)
- 的strcat(str_scene, “,” );
- strcat的(str_scene,(字符 *)scene_menu->名);
- 如果 (scene.default_value == I){
- 的strcpy(cur_param,(字符 *)scene_menu->名);
- }
- mScene_number ++;
- }
- scene_menu ++;
- }
- params.set(CameraParameters :: KEY_SUPPORTED_SCENE_MODES,str_scene);
- params.set(CameraParameters :: KEY_SCENE_MODE,cur_param);
- }
- / *闪光灯模式设置* /
- 结构 v4l2_queryctrl flashMode;
- 结构 v4l2_querymenu * flashMode_menu = mFlashMode_menu;
- 焦炭 str_flash [200];
- 的strcpy(str_flash, “” ); //默认闪光
- flashMode.id = V4L2_CID_FLASH;
- 如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,与flashMode)){
- 对于 (i = flashMode.minimum;我<= flashMode.maximum; I + = flashMode.step){
- flashMode_menu-> ID = V4L2_CID_FLASH;
- flashMode_menu->指数= I;
- 如果 (!的ioctl(iCamFd,VIDIOC_QUERYMENU,flashMode_menu)){
- 如果 (我!= flashMode.minimum)
- 的strcat(str_flash, “,” );
- strcat的(str_flash,(字符 *)flashMode_menu->名);
- 如果 (flashMode.default_value == I){
- 的strcpy(cur_param,(字符 *)flashMode_menu->名);
- }
- mFlashMode_number ++;
- }
- flashMode_menu ++;
- }
- params.set(CameraParameters :: KEY_SUPPORTED_FLASH_MODES,str_flash);
- params.set(CameraParameters :: KEY_FLASH_MODE,cur_param);
- }
- / *对焦模式设置* /
- 结构 v4l2_queryctrl重点;
- parameterString = CameraParameters :: FOCUS_MODE_FIXED;
- params.set(CameraParameters :: KEY_FOCUS_MODE,CameraParameters :: FOCUS_MODE_FIXED);
- focus.id = V4L2_CID_FOCUS_AUTO;
- 如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,和对焦)){
- parameterString.append( “,” );
- parameterString.append(CameraParameters :: FOCUS_MODE_AUTO);
- params.set(CameraParameters :: KEY_FOCUS_MODE,CameraParameters :: FOCUS_MODE_AUTO);
- }
- focus.id = V4L2_CID_FOCUS_CONTINUOUS;
- 如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,和对焦)){
- parameterString.append( “,” );
- parameterString.append(CameraParameters :: FOCUS_MODE_EDOF);
- }
- focus.id = V4L2_CID_FOCUS_ABSOLUTE;
- 如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,和对焦)){
- parameterString.append( “,” );
- parameterString.append(CameraParameters :: FOCUS_MODE_INFINITY);
- parameterString.append( “,” );
- parameterString.append(CameraParameters :: FOCUS_MODE_MACRO);
- }
- params.set(CameraParameters :: KEY_SUPPORTED_FOCUS_MODES,parameterString.string());
- / *镜和翻转查询* /
- 结构 v4l2_queryctrl镜像,翻转;
- mirror.id = V4L2_CID_HFLIP;
- 如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,与镜)){
- mDriverMirrorSupport = 真;
- } 其他 {
- mDriverMirrorSupport = 虚假的;
- }
- flip.id = V4L2_CID_VFLIP;
- 如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,与翻转)){
- mDriverFlipSupport = 真;
- } 其他 {
- mDriverFlipSupport = 虚假的;
- }
- / *曝光设置* /
- 结构 v4l2_queryctrl曝光;
- 炭 str_exposure [16];
- exposure.id = V4L2_CID_EXPOSURE;
- 如果 (!的ioctl(iCamFd,VIDIOC_QUERYCTRL,与曝光)){
- sprintf的(str_exposure, “%D” ,exposure.default_value);
- params.set(CameraParameters :: KEY_EXPOSURE_COMPENSATION,str_exposure);
- sprintf的(str_exposure, “%D” ,exposure.maximum);
- params.set(CameraParameters :: KEY_MAX_EXPOSURE_COMPENSATION,str_exposure);
- sprintf的(str_exposure, “%D” ,exposure.minimum);
- params.set(CameraParameters :: KEY_MIN_EXPOSURE_COMPENSATION,str_exposure);
- sprintf的(str_exposure, “%D” ,exposure.step);
- params.set(CameraParameters :: KEY_EXPOSURE_COMPENSATION_STEP,str_exposure);
- } 其他 {
- params.set(CameraParameters :: KEY_EXPOSURE_COMPENSATION, “0” );
- params.set(CameraParameters :: KEY_MAX_EXPOSURE_COMPENSATION, “0” );
- params.set(CameraParameters :: KEY_MIN_EXPOSURE_COMPENSATION, “0” );
- params.set(CameraParameters :: KEY_EXPOSURE_COMPENSATION_STEP, “0.000001f” );
- }
- / *旋转设置* /
- params.set(CameraParameters :: KEY_ROTATION, “0” );
- /*lzg@rockchip.com:添加一些设置,通过CTS * /
- / *对焦距离设置,没有太多的意义,只为传递CTS * /
- parameterString = “0.3,50,无限” ;
- params.set(CameraParameters :: KEY_FOCUS_DISTANCES,parameterString.string());
- / *焦距设置,没有太多的意义,只为传递CTS * /
- parameterString = “35” ;
- params.set(CameraParameters :: KEY_FOCAL_LENGTH,parameterString.string());
- / *只传递CTS视图设置,没有太大的意义,水平角度* /
- parameterString = “100” ;
- params.set(CameraParameters :: KEY_HORIZONTAL_VIEW_ANGLE,parameterString.string());
- / *只传递CTS视图设置,没有太大的意义,垂直角* /
- parameterString = “100” ;
- params.set(CameraParameters :: KEY_VERTICAL_VIEW_ANGLE,parameterString.string());
- / *在JPEG图片设置的EXIF缩略图的质量* /
- parameterString = “50” ;
- params.set(CameraParameters :: KEY_JPEG_THUMBNAIL_QUALITY,parameterString.string());
- / *在JPEG图片设置的EXIF缩略图的尺寸支持* /
- parameterString = “0x0,160×128” ;
- params.set(CameraParameters :: KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,parameterString.string());
- parameterString = “160” ;
- params.set(CameraParameters :: KEY_JPEG_THUMBNAIL_WIDTH,parameterString.string());
- parameterString = “128” ;
- params.set(CameraParameters :: KEY_JPEG_THUMBNAIL_HEIGHT,parameterString.string());
- / * zyc@rock-chips.com:对于CTS,KEY_MAX_NUM_DETECTED_FACES_HW不应该是0 * /
- params.set(CameraParameters :: KEY_MAX_NUM_DETECTED_FACES_HW, “0” );
- params.set(CameraParameters :: KEY_MAX_NUM_DETECTED_FACES_SW, “0” );
- params.set(CameraParameters :: KEY_RECORDING_HINT, “ 假” );
- params.set(CameraParameters :: KEY_VIDEO_STABILIZATION_SUPPORTED, “ 假” );
- params.set(CameraParameters :: KEY_VIDEO_SNAPSHOT_SUPPORTED, “ 真” );
- params.set(CameraParameters :: KEY_MAX_NUM_METERING_AREAS,“0” );
- LOGD( “ 支持预览格式:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_PREVIEW_FORMATS));
- LOGD( “ 支持预览大小:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_PREVIEW_SIZES));
- LOGD( “ 支持预览FPS范围:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_PREVIEW_FPS_RANGE));
- LOGD( “ 支持预览帧率:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_PREVIEW_FRAME_RATES));
- LOGD( “ 支持图片大小:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_PICTURE_SIZES));
- 如果 (params.get(CameraParameters :: KEY_SUPPORTED_WHITE_BALANCE))
- LOGD( “ 支持白平衡:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_WHITE_BALANCE));
- 如果 (params.get(CameraParameters :: KEY_SUPPORTED_EFFECTS))
- LOGD( “ 支持色彩效果:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_EFFECTS));
- 如果 (params.get(CameraParameters :: KEY_SUPPORTED_SCENE_MODES))
- LOGD( “ 支持场景:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_SCENE_MODES));
- 如果 (params.get(CameraParameters :: KEY_SUPPORTED_FLASH_MODES))
- LOGD( “ 支持flash:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_FLASH_MODES));
- LOGD( “ 支持重点:%S” ,params.get(CameraParameters :: KEY_SUPPORTED_FOCUS_MODES));
- LOGD( “ 支持缩放:%S(比例:%S)” ,params.get(CameraParameters :: KEY_ZOOM_SUPPORTED)
- params.get(CameraParameters :: KEY_ZOOM_RATIOS));
- 如果 (的strcmp(“0” ,params.get(CameraParameters :: KEY_MAX_EXPOSURE_COMPENSATION))
- || 的strcmp(“0” ,params.get(CameraParameters :: KEY_MIN_EXPOSURE_COMPENSATION))){
- LOGD( “ 支持曝光:(%S – >%S)” ,params.get(CameraParameters :: KEY_MIN_EXPOSURE_COMPENSATION)
- params.get(CameraParameters :: KEY_MAX_EXPOSURE_COMPENSATION));
- }
- LOGD( “ 支持硬件面临detecte:%S” ,params.get(CameraParameters :: KEY_MAX_NUM_DETECTED_FACES_HW));
- LOGD( “ 支持软件面临detecte:%S” ,params.get(CameraParameters :: KEY_MAX_NUM_DETECTED_FACES_SW));
- LOGD( “ 支持视频稳定:%S” ,params.get(CameraParameters :: KEY_VIDEO_STABILIZATION_SUPPORTED));
- LOGD( “ 支持录音提示:%S” ,params.get(CameraParameters :: KEY_RECORDING_HINT));
- LOGD( “ 支持视频快照:%S” ,params.get(CameraParameters :: KEY_VIDEO_SNAPSHOT_SUPPORTED));
- LOGD( “ 支持镜像和财政投融资:%S” ,(mDriverMirrorSupport && mDriverFlipSupport)? “ 真” :“假” );
- cameraConfig(PARAMS);
- LOG_FUNCTION_NAME_EXIT
- }
然后剩下的大部分都是针对这个线程的运行实现以及对于CameraHal_Module.cpp中实现的为上层提供的接口的具体实现,比如:
- INT CameraHal :: startPreview()
- {
- LOG_FUNCTION_NAME
- 信息MSG;
- ::互斥锁自动锁定(MLOCK);
- 如果 ((mPreviewThread!= NULL)&&(mCommandThread!= NULL)){
- msg.command = CMD_PREVIEW_START;
- msg.arg1 =(无效*)CMDARG_NACK;
- commandThreadCommandQ.put(MSG);
- }
- mPreviewCmdReceived = 真;
- LOG_FUNCTION_NAME_EXIT
- 返回 NO_ERROR;
- }
- 无效 CameraHal :: stopPreview()
- {
- LOG_FUNCTION_NAME
- 信息MSG;
- INT RET = 0;
- ::互斥锁自动锁定(MLOCK);
- 如果 ((mPreviewThread!= NULL)&&(mCommandThread!= NULL)){
- msg.command = CMD_PREVIEW_STOP;
- msg.arg1 =(无效*)CMDARG_ACK;
- commandThreadCommandQ.put(MSG);
- 如果 (mANativeWindow == NULL){
- mANativeWindowCond.signal();
- LOGD( “%S(%D):为停止预览唤醒命令线程” ,__ __功能__ LINE__);
- }
- 而 (RET == 0){
- RET = commandThreadAckQ.get(MSG);
- 如果 (RET == 0){
- 如果 (msg.command == CMD_PREVIEW_STOP){
- RET = 1;
- }
- }
- }
- } 其他 {
- LOGE( “%S(%D):取消,是因为线程(%s%S)为空” ,__FUNCTION __,__ __ LINE(mPreviewThread == NULL)?“mPreviewThread” :“” ,
- (mCommandThread == NULL)?“mCommandThread” :“” );
- }
- mPreviewCmdReceived = 虚假的;
- LOG_FUNCTION_NAME_EXIT
- }
- INT CameraHal ::自动对焦()
- {
- LOG_FUNCTION_NAME
- INT RET = 0;
- 信息MSG;
- ::互斥锁自动锁定(MLOCK);
- 如果 ((mPreviewThread!= NULL)&&(mCommandThread!= NULL)){
- msg.command = CMD_AF_START;
- msg.arg1 =(无效*)CMDARG_ACK;
- commandThreadCommandQ.put(MSG);
- 而 (RET == 0){
- RET = commandThreadAckQ.get(味精,5000);
- 如果 (RET == 0){
- 如果 (msg.command == CMD_AF_START){
- RET = 1;
- }
- } 其他 {
- LOGE( “%S(%D):自动对焦时间了! n” ,__ __功能__ LINE__);
- }
- }
- } 其他 {
- LOGE( “%S(%D):取消,是因为线程(%s%S)为空” ,__FUNCTION __,__ __ LINE(mPreviewThread == NULL)?“mPreviewThread” :“” ,
- (mCommandThread == NULL)?“mCommandThread” :“” );
- }
- LOG_FUNCTION_NAME_EXIT
- 返回 NO_ERROR;
- }
Cialis En Ligne Belgique [url=http://priliorder.com]cialis dapoxetine overnight shipping[/url] Buy Revatio Online
Viagra Generico Mexico [url=http://bestviaonline.com]online pharmacy[/url] Finasteride Acne Flagyl For Sell Cialis Without A Script
Kamagra Autorise En France [url=http://cialionline.com]generic cialis canada[/url] Tarif Levitra 10mg Kamagra En Ligne France Keflex And Breastfeeding
Pharmacy 2u Prozac Secure Real Progesterone 100mg Menopause Best Website Shop [url=http://bpdrug.com]pastillas priligy 30 mg[/url] Metronidazole
Cialis Generico Effetti Collaterali [url=http://cialonlineno.com]cialis generic[/url] Kamagra Jelly 100mg Strasburgo Finasteride 5mg Side Effects