转载来自:http://blog.csdn.net/liwei16611/article/details/51104491

由于最近研究OIS,而android4.4并没有相关逻辑(vendor&hal&kernel)当然Android 6.0拥有完善逻辑,增加OIS光学防抖参数设置(ois参数一般不作为设置参数,仅作实验测试):

A:上层逻辑

1)  添加接口函数

参考public void setSaturation(int saturation)设置

在code/frameworks/base/core/Java/android/hardware/Camera.java文件增加接口:

定义用于app层设置的接口函数:

public void setOis(int saturation){
              …………
              set(KEY_QC_OIS, String.valueOf(OIS));
}
2)  App设置参数调用,假设设置ois值为1
参考 packages/apps/SnapdragonCamera/src/com/android/camera/PhotoModule.java
mParameters.setSaturation(saturation);函数调用;
mParameters.setOis(ois); //app调用接口函数
由于HAL V1参数传递是通过字符串来完成的,最后传递到HAL层的字符串里面会有“ois=1”,在HAL层进行解析。
B、Hal层相关修改:
1、    添加相关定义
1.1
、 文件:hardware/qcom/camera/QCamera2/HAL/QCameraParameters.h
     static const char KEY_QC_SCE_FACTOR_STEP[];
+    static const char KEY_QC_OIS[];
     static const char KEY_QC_HISTOGRAM[] ;
     int32_t setSharpness(const QCameraParameters& );
+    int32_t setOis(const QCameraParameters& );
     int32_t setSaturation(const QCameraParameters& );
     int32_t setSharpness(int sharpness);
+    int32_t setOis(int ois);
     int32_t setSaturation(int saturation);
1.2、 文件:hardware/qcom/camera/QCamera2/stack/common/cam_types.h
            typedef enum {
                CAM_INTF_PARM_FLASH_BRACKETING,
                CAM_INTF_PARM_GET_IMG_PROP,
                    CAM_INTF_PARM_MAX
+    CAM_INTF_PARM_OIS
            } cam_intf_parm_type_t;
1.3、 文件:hardware/qcom/camera/QCamera2/stack/common/cam_intf.h
typedef struct{
     cam_af_bracketing_t  mtf_af_bracketing_parm;
    
     cam_sensor_type_t sensor_type;
+   
+    int32_t ois_default_value;
 } cam_capability_t;
2、    添加相关设置
文件:hardware/qcom/camera/QCamera2/HAL/QCameraParameters.cpp
const char QCameraParameters::KEY_QC_SCE_FACTOR_STEP[] = "sce-factor-step";
+const char QCameraParameters::KEY_QC_OIS[] = "ois";
//open camera时OIS默认值,该值在vendor中设置
int32_t QCameraParameters::initDefaultParameters()
{

………

+    // Set Ois

+    setOis(m_pCapability->ois_default_value); //m_pCapability即为通过共享内存从vendor层拿到的初始化数据

//请参考Android ION机制_HAL与vendor层共享内存_流程简介(1)

//http://blog.csdn.net/liwei16611/article/details/51104400

+    ALOGE("the default_ois = %d", m_pCapability->ois_default_value);
     // Set Contrast
     set(KEY_QC_MIN_CONTRAST, m_pCapability->contrast_ctrl.min_value);
     set(KEY_QC_MAX_CONTRAST, m_pCapability->contrast_ctrl.max_value);
     ………
}
+int32_t QCameraParameters::setOis(const QCameraParameters& params)
+{
+    int ois = params.getInt(KEY_QC_OIS);
+    int prev_ois = getInt(KEY_QC_OIS);
+    if(params.get(KEY_QC_OIS) == NULL) {
+       CDBG_HIGH("%s: Ois not set by App ",__func__);
+       return NO_ERROR;
+    }
+    ALOGE("haljay ois=%d prev_ois=%d",ois, prev_ois);
+    if (prev_ois !=  ois) {
+        if((ois >= 0) && (ois <= 2)) {
+            CDBG(" new ois value : %d ", ois);
+            return setOis(ois);
+        } else {
+            ALOGE("%s: invalid value %d",__func__, ois);
+            return BAD_VALUE;
+        }
+    } else {
+        ALOGE("haljay no value change");
+        CDBG("%s: No value change in ois", __func__);
+        return NO_ERROR;
+    }
+}
+int32_t QCameraParameters::setOis(int ois)
+{
+    char val[16];
+    sprintf(val, "%d", ois);
+    updateParamEntry(KEY_QC_OIS, val);
+    CDBG("%s: Setting ois %s", __func__, val);
+    ALOGE("haljay %s set ois=%s OIS=%d", __func__, val, CAM_INTF_PARM_OIS);
+    int32_t value = ois;
+    return AddSetParmEntryToBatch(m_pParamBuf,
+                                  CAM_INTF_PARM_OIS,
+                                  sizeof(value),
+                                  &value);
+}
函数int32_t QCameraParameters::updateParameters添加setOis:
     if ((rc = setBrightness(params)))                   final_rc = rc;
     if ((rc = setZoom(params)))                         final_rc = rc;
     if ((rc = setSharpness(params)))                    final_rc = rc;
+    if ((rc = setOis(params)))                          final_rc = rc;
     if ((rc = setSaturation(params)))                   final_rc = rc;
C、Vendor层相关修改:
1、    添加相关定义
1.1
、 文件:kernel/include/media/msm_cam_sensor.h
enum msm_actuator_cfg_type_t {
  CFG_SET_POSITION,
  CFG_ACTUATOR_POWERDOWN,
  CFG_ACTUATOR_POWERUP,
CFG_ACTUATOR_OIS,
 };
struct msm_actuator_cfg_data {
      struct msm_actuator_get_info_t get_info;
      struct msm_actuator_set_position_t setpos;
      enum af_camera_name cam_name;
+      void *setting;
  } cfg;
1.2、 文件:vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/mct/pipeline/mct_pipeline.c
      在函数boolean mct_pipeline_populate_query_cap_buffer(mct_pipeline_t *pipeline)中添加:
                hal_data->sharpness_ctrl.min_value = 0;
                hal_data->sharpness_ctrl.step = 6;
 
+  hal_data->ois_default_value = 1;  //通过ION机制传至hal层
                hal_data->contrast_ctrl.def_value = 5;
                hal_data->contrast_ctrl.max_value = 10;
1.3、 文件:vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/module/sensor_common.h
typedef enum {
  
  
   SENSOR_SET_AWB_UPDATE,
+  ACTUATOR_SET_OIS
 } sensor_submodule_event_type_t;
2、    添加相关设置
文件:vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/module/module_sensor.c
2.1、获取hal层参数
在函数static boolean module_sensor_event_control_set_parm中增加:
+  case CAM_INTF_PARM_OIS:{
+    if (!event_control->parm_data) {
+        SERR("failed parm_data NULL");
+        ret = FALSE;
+        break;
+      }
+    module_sensor_params_t        *ois_module_params = NULL;
+    ois_module_params = s_bundle->module_sensor_params[SUB_MODULE_ACTUATOR];
+    if (ois_module_params->func_tbl.process != NULL) {
+      rc = ois_module_params->func_tbl.process(
+        ois_module_params->sub_module_private,
+        ACTUATOR_SET_OIS, event_control->parm_data);
+    }
+    if (rc < 0) {
+      SERR("failed");
+      ret = FALSE;
+    }
+     break;
+  }
文件:vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/actuators/actuator.c
2.2、在函数int32_t actuator_process中增加
       case ACTUATOR_SET_POSITION:
            rc = actuator_set_position(actuator_ctrl, data);
            break;

+   case ACTUATOR_SET_OIS:
+   rc = actuator_set_ois(actuator_ctrl, data);
+   break;
2.3、将参数通过ioctl方法下至内核
        +static int actuator_set_ois(void *ptr, void *data) {
+  int rc = 0;
+  int32_t *ois_level = (int32_t*)data;
+  actuator_data_t *ois_actuator_ptr = (actuator_data_t *)ptr;
+  struct msm_actuator_cfg_data cfg;
+  if (ois_actuator_ptr->fd <= 0)
+    return -EINVAL;
+  cfg.cfgtype = CFG_ACTUATOR_OIS;
+  cfg.cfg.setting = ois_level;

+  rc = ioctl(ois_actuator_ptr->fd, VIDIOC_MSM_ACTUATOR_CFG, &cfg);
+  if (rc < 0) {
+    SERR("failed-errno: %s!!!",strerror(errno));
+  }
+  return rc;
+}

Android 设置参数至kernel_ois为例相关推荐

  1. Android学习笔记---16_采用SharedPreferences保存用户偏好设置参数

    16_采用SharedPreferences保存用户偏好设置参数 Android学习笔记---16_采用SharedPreferences保存用户偏好设置参数 2013-03-08 16_采用Shar ...

  2. android 拍摄视频设置参数,手机如何设置参数,才能拍出高清视频?

    原标题:手机如何设置参数,才能拍出高清视频? 有的人用着最新款的手机,但是拍着最模糊的视频和照片. 所以,当你拿起手机的时候,要先了解它有什么功能,虽然现在智能手机都是自动设置的,但是也要根据自己的需 ...

  3. camera(17)---设置摄像头方向、打开线程与预览线程、设置参数、Camera外设按键、自动对焦与触摸对焦、拍照、人脸检测、位置管理、旋转管理、变焦、录像

    [Android]设置摄像头方向.打开线程与预览线程.设置参数.Camera外设按键.自动对焦与触摸对焦.拍照.人脸检测.位置管理.旋转管理.变焦.录像 阅读数:1673 设置摄像头方向.打开线程与预 ...

  4. Android拍照上传代码样例

    2019独角兽企业重金招聘Python工程师标准>>> Android拍照上传代码样例 1.LoginWindow.java --登录窗口 package com.hemi.rhet ...

  5. android edittext背景颜色,Android 设置 EditText 背景颜色、背景图片

    Android 设置 EditText 背景颜色mView.findViewById(R.id.editText).setBackgroundResource(R.color.caution); An ...

  6. android ip格式化输入法,Android设置默认输入法

    方法一: 修改文件如下: frameworks\base\packages\SettingsProvider\res\values\defaults.xml frameworks\base\packa ...

  7. android设置默认程序和清除默认设置

    以设置和清除默认浏览器为例. 1.检查是否已经设置了默认 [java]  view plain copy private void testGetDefaultActivity() { Package ...

  8. android设置默认程序清除默认设置

    以设置和清除默认浏览器为例. 1.检查是否已经设置了默认 private void testGetDefaultActivity() {PackageManager pm = getPackageMa ...

  9. jmeter设置参数的方法(随机,读csv等)

    本文为整理jmeter设置参数的方法 设置参数值的方法有如下几种: 1. 用Jmeter中的函数获取参数值,__Random,__threadNum,__CSVRead,__StringFromFil ...

最新文章

  1. html文本域应该写在哪,我们如何在pharo上填写html文本区域
  2. 自定义数字格式字符串输出示例
  3. 【深度学习】使用深度学习阅读和分类扫描文档
  4. 去哪儿-19-detail-ajax
  5. Div+CSS布局居中
  6. 私有方法,私有属性在继承中的应用
  7. [译] JAVA初学者的30个常见问题
  8. NodeJs和ReactJs单元测试工具——Jest
  9. ADS软件的使用教程
  10. python写一个定时关机软件
  11. 计算机组成原理与接口技术笔记
  12. 关于pointnet++系列编译文件(tf_ops)的问题
  13. Python打造一款属于自己的翻译词典
  14. 所谓神经网络是指以人脑和神经系统为模型的什么算法
  15. 关于PPT母版的含义和使用方法
  16. python读取txt文件中的内容并用逗号分割_数据分析—gt;文件读写
  17. 有没有一款手机桌面便签软件?真正好用的便签软件推荐
  18. 网易杭研 java 校招_09网易杭研校园招聘面试题
  19. 凝望深渊,并发控制的尽头
  20. python环境搭建和pycharm的安装配置及汉化(零基础小白版)

热门文章

  1. [Java 基础]-- corejava知识汇总
  2. 第五课: 图像的 BLOB 分析处理几何变换(union_adjacent_contours_xld)--find_pads.hdev,count_pellets.hdev
  3. 基于pandas的男女电影评价差异分析
  4. MinGW的安装及配置
  5. Cesium:绘制带洞的多边形
  6. XJOI 7970 优秀数
  7. html5 offsetx,原生HTML5关于Div对象的.clientLeft、.offsetLeft、.clientX、.offsetX区分
  8. html5 offsetx,HTML5将发布OFFSETX OFFSETY跳(HTML5 Drag Release offset
  9. Multisim实现555计时器模拟简易电子琴
  10. 大数据——GraphX之Pregel算法原理及Spark实现