在进行camera系统开发时,总会碰到产品需要,需要一个添加一个多少多少M的照片大小,比如产品经理说我们也要添加一个1:1,添加一个18:9的照片大小。这个情况很常见了,所以这篇文章总结一下平常工作中对这类问题的解决。

我们可以看到打开camera app,有一个设置菜单或者选项,可以选择照片大小,比如是13M(18:9)、13M(16:9)、13M(4:3)、13M(1:1)等类型。13M就是指的照片大小,表明的是1300万像素,这个就是我们说的Picture size;而括号中的代表的分辨率(宽高比),是我们说的Preview size。

Hal1

配置之前,我们需要找到feature table的位置,这是一个.h文件,里面配置的是camera相关功能的属性。
aosp/vendor/mediatek/proprietary/custom/mt6757/hal/sendepfeature/imx258_mipi_raw/config.ftbl.imx258_mipi_raw.h
比如看这个raw的imx258的feature table。

 preview size对应 MtkCameraParameters::KEY_PREVIEW_SIZE//  Preview Size//  For CTS: the largest preview-size must have same aspect ratio (+-0.5) as the largest picture-sizeFTABLE_CONFIG_AS_TYPE_OF_DEFAULT_VALUES(KEY_AS_(MtkCameraParameters::KEY_PREVIEW_SIZE),SCENE_AS_DEFAULT_SCENE(ITEM_AS_DEFAULT_("640x480"),ITEM_AS_VALUES_("176x144",      "320x240",      "352x288",      "480x320",      "640x480","720x480",      "800x480",      "800x600",      "864x480",      "960x540","1280x720",     "1440x1080",    "2160x1080",    "1680x1260",    "1280x640")),)

我们看到上方"2160x1080"和"1280x640"就是表示18:9的preview size。计算比例,用w/h来得出比值即可。

添加了18:9对应的预览,那么也需要添加18:9对应的picture size来进行匹配。

 picture size对应MtkCameraParameters::KEY_PICTURE_SIZE//  Picture Size (Both width & height must be 16-aligned)//  For CTS: the largest preview-size must have same aspect ratio (+-0.5) as the largest picture-sizeFTABLE_CONFIG_AS_TYPE_OF_DEFAULT_VALUES(KEY_AS_(MtkCameraParameters::KEY_PICTURE_SIZE),SCENE_AS_DEFAULT_SCENE(ITEM_AS_DEFAULT_("2560x1920"),ITEM_AS_VALUES_("320x240",      "640x480",      "1024x768",     "1280x720",     "1280x960","1600x1200",    "2048x1536",    "2560x1440",    "2560x1920",    "3264x2448","3328x1872",    "4096x2304",    "4096x3072",    "4160x3120",    "5120x2560")),)

其中的3264x2448和5120x2560,就是18:9的picture size。计算方式一样,宽高比。

如添加其他的,比如1:1也是一样的:
preview size : “960x960”
picture size: “3600x3600”

Picture size和Preview size是相互关联的,要有对应关系,比如只配置了5120x2560,那么在上层确实是可以设置5120x2560的size下来,但是在匹配预览size的时候,会匹配不到,而走到默认的如4:3的预览,这样出现的情况就是,预览看到的是非全屏的或者拉伸变形的,而实际成像却是全屏的。

配置size时一定要保证是16的倍数,如果不是所拍的照片可能会出现绿屏、花屏问题。

Picture size为了保证真实性,不做插值,按照camera sensor最大支持像素来配置。

Preview size根据实际来配置,有的预览可能设置太大了,造成卡顿。比如我手机分辨率是1440x720,添加18:9就不要再去添加2160x1080了。

不一定有完整的size可以匹配上,比如13M,实际上在满足被16整除同时满足预览比例,可能真正的只有12.6M,这种情况也没有办法了。
比如:
5M 16:9 21861584 是3.4M
13M 16:9 46082592 是12M
13M 18:9 4896*2448 也是12M

feature table中添加了所需的size之后,上层中也要进行相关添加。
mtk camera中一般常规配置的是4:3、16:9、5:3、3:2等四种预览比例。而feature table中增加了18:9,上层对应添加,使菜单显示出来。

文件名:com.mediatek.camera.feature.setting.picturesize.PictureSizeHelper.java

    public static final double RATIO_18_9 = 18d / 9; // 添加18:9预览public static final double RATIO_16_9 = 16d / 9;public static final double RATIO_5_3 = 5d / 3;public static final double RATIO_3_2 = 3d / 2;public static final double RATIO_4_3 = 4d / 3;public static final double RATIO_1_1 = 1d / 1;  // 添加1:1预览private static final double RATIOS[] = { RATIO_18_9, RATIO_16_9, RATIO_5_3, RATIO_3_2, RATIO_4_3, RATIO_1_1 };private static final String RATIO_18_9_IN_STRING = "(18:9)"; // 添加18:9预览private static final String RATIO_16_9_IN_STRING = "(16:9)";private static final String RATIO_5_3_IN_STRING = "(5:3)";private static final String RATIO_3_2_IN_STRING = "(3:2)";private static final String RATIO_4_3_IN_STRING = "(4:3)";private static final String RATIO_1_1_IN_STRING = "(1:1)"; // 添加1:1预览private static final String RATIOS_IN_STRING[] = { RATIO_18_9_IN_STRING, RATIO_16_9_IN_STRING,RATIO_5_3_IN_STRING, RATIO_3_2_IN_STRING, RATIO_4_3_IN_STRING, RATIO_1_1_IN_STRING };

在com.mediatek.camera.feature.setting.picturesize.PictureSize.java中加载预览比例:

    /*** Invoked after setting's all values are initialized.** @param supportedPictureSize Picture sizes which is supported in current platform.*/public void onValueInitialized(List<String> supportedPictureSize) {LogHelper.d(TAG, "[onValueInitialized], supportedPictureSize:" + supportedPictureSize);setSupportedPlatformValues(supportedPictureSize);setSupportedEntryValues(supportedPictureSize);setEntryValues(supportedPictureSize);double fullRatio = PictureSizeHelper.findFullScreenRatio(mActivity);LogHelper.d(TAG, "[onValueInitialized], fullRatio:" + fullRatio);List<Double> desiredAspectRatios = new ArrayList<>();desiredAspectRatios.add(fullRatio);desiredAspectRatios.add(PictureSizeHelper.RATIO_16_9);desiredAspectRatios.add(PictureSizeHelper.RATIO_4_3);desiredAspectRatios.add(PictureSizeHelper.RATIO_1_1);PictureSizeHelper.setDesiredAspectRatios(desiredAspectRatios);........}

这个函数中,显示的是fullRatio,而不是18:9,主要是因为fullRatio即全屏的计算方式是根据手机屏幕分辨率来计算的,如1440x720计算出的结果就是18:9,不过如果我们没有添加18:9的预览比例的话,会走最接近的16:9当做全屏。

PictureSizeHelper.findFullScreenRatio(mActivity):

    /*** Compute full screen aspect ratio.** @param context The instance of {@link Context}.* @return The full screen aspect ratio.*/public static double findFullScreenRatio(Context context) {WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);Display display = wm.getDefaultDisplay();DisplayMetrics dm = new DisplayMetrics();display.getRealMetrics(dm);int width = Math.max(dm.widthPixels, dm.heightPixels);int height = Math.min(dm.widthPixels, dm.heightPixels);double displayRatio = (double) width / (double) height;double find = RATIO_4_3;for (int i = 0; i < RATIOS.length; i++) {double ratio = RATIOS[i];if (Math.abs(ratio - displayRatio) < Math.abs(find - displayRatio)) {find = ratio;}}return find;}

这样基本上就可以匹配出所有需要的picture size配置了。

app中通过List<Camera.Size> supportedSizes = Camera.Parameters.getSupportedPictureSizes();来获取底层所配置的所有picture size。
可以通过打印此数组来查看,底层配置的值是否生效。

后双摄:
D/CamAp_PictureSize: [onValueInitialized], supportedPictureSize:[4096x3072, 4896x2448, 3456x3456, 3168x3168, 4096x2304, 3264x2448, 3600x2160, 3328x1872, 2880x1728, 2560x1920, 2560x1440, 1920x1920, 2048x1536, 1920x1088, 1600x1200, 1280x960, 1280x768, 1280x720, 1024x768, 640x480, 320x240]
D/CamAp_PictureSize: [onValueInitialized], supportedPictureSize:[4096x3072, 4896x2448, 3456x3456, 3168x3168, 4096x2304, 3264x2448, 3600x2160, 3328x1872, 2880x1728, 2560x1920, 2560x1440, 1920x1920, 2048x1536, 1920x1088, 1600x1200, 1280x960, 1280x768, 1280x720, 1024x768, 640x480, 320x240]
前摄:
D/CamAp_PictureSize: [onValueInitialized], supportedPictureSize:[2560x1920, 2560x1440, 2048x1536, 1920x1088, 1600x1200, 1280x960, 1280x768, 1280x720, 1024x768, 720x480, 640x480, 320x240]

Hal3

9.0配置路径变了。变化sendepfeature -----> imgsensor_metadata
随着9.0底层弃用hal1.0,而默认使用hal3.0,所有之前1.0的feature table配置size的方式已经行不通了。aosp/vendor/mediatek/proprietary/custom/mt6757/hal/sendepfeature不再是在这里配置了。

而是在imgsensor_metadata中进行配置:vendor\mediatek\proprietary\custom\mt6739\hal\imgsensor_metadata。

以s5k3l6_mipi_raw为例,Picture size和Preview size都在此文件中进行配置:
vendor\mediatek\proprietary\custom\mt6739\hal\imgsensor_metadata\s5k3l6_mipi_raw\config_static_metadata_scaler.h

添加修改处,这三个地方都要添加的:

CONFIG_METADATA_BEGIN(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS)//new hidden
CONFIG_METADATA_BEGIN(MTK_SCALER_AVAILABLE_MIN_FRAME_DURATIONS)//new hidden
CONFIG_METADATA_BEGIN(MTK_SCALER_AVAILABLE_STALL_DURATIONS)//new hidden
    CONFIG_METADATA_BEGIN(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS)//new hiddenCONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_BLOB, MINT32) //13mp 4:3CONFIG_ENTRY_VALUE(4096, MINT32)CONFIG_ENTRY_VALUE(3072, MINT32)CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT32)CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_BLOB, MINT32) //12mp 1:1CONFIG_ENTRY_VALUE(3456, MINT32)CONFIG_ENTRY_VALUE(3456, MINT32)CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT32)CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_BLOB, MINT32) //12mp 18:9CONFIG_ENTRY_VALUE(4896, MINT32)CONFIG_ENTRY_VALUE(2448, MINT32)CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT32)CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_BLOB, MINT32) //9mp 16:9CONFIG_ENTRY_VALUE(4096, MINT32)CONFIG_ENTRY_VALUE(2304, MINT32)CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT32)...............

预览size也是在config_static_metadata_scaler.h这个里面加,要加在
HAL_PIXEL_FORMAT_YCbCr_420_888和
HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED里面。

比如在HAL_PIXEL_FORMAT_YCbCr_420_888中

                CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_YCbCr_420_888, MINT32)CONFIG_ENTRY_VALUE(1920, MINT32)CONFIG_ENTRY_VALUE(1080, MINT32)CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT32)//这里添加720x720的1:1预览CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_YCbCr_420_888, MINT32)CONFIG_ENTRY_VALUE(720, MINT32)CONFIG_ENTRY_VALUE(720, MINT32)CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT32)//这里添加1440x720的18:9预览CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_YCbCr_420_888, MINT32)CONFIG_ENTRY_VALUE(1440, MINT32)CONFIG_ENTRY_VALUE( 720, MINT32)CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT32)CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_YCbCr_420_888, MINT32)CONFIG_ENTRY_VALUE(1280, MINT32)CONFIG_ENTRY_VALUE( 720, MINT32)CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT32)

在HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED中:

                CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, MINT32)CONFIG_ENTRY_VALUE(1920, MINT32)CONFIG_ENTRY_VALUE(1080, MINT32)CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT32)//这里添加720x720的1:1预览CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, MINT32)CONFIG_ENTRY_VALUE(720, MINT32)CONFIG_ENTRY_VALUE(720, MINT32)CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT32)//这里添加1440x720的18:9预览CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, MINT32)CONFIG_ENTRY_VALUE(1440, MINT32)CONFIG_ENTRY_VALUE( 720, MINT32)CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT32)CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, MINT32)CONFIG_ENTRY_VALUE(1280, MINT32)CONFIG_ENTRY_VALUE( 720, MINT32)CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT32)

Mtk Camera中Hal1/Hal3的Picture size和Preview size配置相关推荐

  1. MTK 平台上如何给 camera 添加一种 preview size

    1,首先检查该项目所使用的是哪一颗sensor, 就以OV2659 为例 OV2659 是一颗2M 的摄像头,Sensor 吐出的数据分辨率能达到 1600*1200,肯定是支持 1280*720 的 ...

  2. Camera4 MTK camera驱动结构介绍

    一.概述: MTK  camera主要的内容在hal层,现在有hal1/hal3,当下主流的使用的是hal3,驱动主要负责sensor 电源的控制以及sensor相关寄存器的操作,MTK采用设备和驱动 ...

  3. Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程

    Android 8.1/9.0 MTK Camera源码分析之快门声音控制 在Android 8.1上mtk camera有控制快门声音的接口,但是并没有了控制录像快门声音的接口.之所以会有这个现象, ...

  4. 【Mtk Camera Hal到驱动的流程(1)】

    Mtk Camera Hal到驱动的流程(1) (1)架构介绍 (A)Camera 的框架分为 Kernel 部分和 Hal 部分 Kernel部分: image sensor driver -- 负 ...

  5. MTK CAMERA TUNNING

    http://www.16rd.com/blog-5282-237.html ob 静态电流 shading 阴影, 3a GAMMA:拍灰阶卡, CCM Color Correction Matri ...

  6. MTK Camera 基础知识

    文章目录 数字成像系统流程综述 曝光 对焦马达 镜头(lens) MIPI数据与RAW数据的转换(未完待续) ISP的主要内容和Bayer Raw的处理 RGB.YUV和YCbCr三种颜色空间 补充 ...

  7. 我心依旧之Android Camera模块FW/HAL3探学序

    前沿: 目前对于Android Camera软硬件技术发展的主流方向是高像素.高帧率.多摄像头.超强的ISP以及各种视频图形处理算法等等.当前主流的Android系统中较为常见的Camera模块还均是 ...

  8. Android MTK Camera博客分享

    MTK Camera博客分享 MTK Camera OTP调用过程 MTK Camera Flashlight调用过程 MTK Camera 应用层到底层过程 MTK Camera HAL层分析 深入 ...

  9. MTK Camera 开机启动流程

    一.MTK平台Camera框架 MTK平台的Camera的架构见下图, 这里主要介绍kernel部分和HAL层部分. 1.Kernel 部分主要有两块: 1.1.image sensordriver, ...

最新文章

  1. SAP PM 入门系列之19 - IP31 Maintenance Plan Costing
  2. 考虑使用静态工厂方法替代构造方法
  3. vue中的keep-alive
  4. 阿里云 超级码力在线编程大赛初赛 第2场 题目4. 小栖的金字塔(超级卡特兰数+除法求模/乘法逆元)
  5. Cookie和Session的知识
  6. LibMesh 数据结构类
  7. spring之AOP
  8. 低代码平台上的出入库管理
  9. SAP 固定资产模块上线配置
  10. 正则系列1: re.match用法
  11. Nuvoton M0518 之 看门狗的使用Demo
  12. 六类双绞线排序和信息插座排序
  13. 关于log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.li)的问题
  14. 力扣-两数之和 (梦开始的地方)
  15. 左、右外连接的写法及(+)的用法
  16. C++排序之直接插入排序法
  17. Three.js-灯光与阴影
  18. c语言程序设计课程作用,《C语言程序设计》课程标准
  19. 论文阅读笔记 | 目标检测算法——YOLOX
  20. 获国际权威认可 | 云扩科技入选《RPA全球市场格局报告,Q3 2022》

热门文章

  1. Python 大作业
  2. STM32学习之SPI协议(读写FLASH)
  3. 交换机命令与linux,LINUX教学:路由器和交换机的基本命令
  4. 开发一个 app 有多难?需要多少钱?
  5. darknet 框架 安装编译
  6. 系统信息 打包压缩 软件安装 其他命令
  7. 外国用户和国内用户看待浏览器的问题
  8. Matlab App Designer 学习笔记
  9. Bentley 软件公司 Acceleration Fund 宣布成立 Bentley 下属公司 Virtuosity
  10. C++ 关于指针变量所占内存空间大小的问题