Mtk Camera中Hal1/Hal3的Picture size和Preview size配置
在进行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配置相关推荐
- MTK 平台上如何给 camera 添加一种 preview size
1,首先检查该项目所使用的是哪一颗sensor, 就以OV2659 为例 OV2659 是一颗2M 的摄像头,Sensor 吐出的数据分辨率能达到 1600*1200,肯定是支持 1280*720 的 ...
- Camera4 MTK camera驱动结构介绍
一.概述: MTK camera主要的内容在hal层,现在有hal1/hal3,当下主流的使用的是hal3,驱动主要负责sensor 电源的控制以及sensor相关寄存器的操作,MTK采用设备和驱动 ...
- Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程
Android 8.1/9.0 MTK Camera源码分析之快门声音控制 在Android 8.1上mtk camera有控制快门声音的接口,但是并没有了控制录像快门声音的接口.之所以会有这个现象, ...
- 【Mtk Camera Hal到驱动的流程(1)】
Mtk Camera Hal到驱动的流程(1) (1)架构介绍 (A)Camera 的框架分为 Kernel 部分和 Hal 部分 Kernel部分: image sensor driver -- 负 ...
- MTK CAMERA TUNNING
http://www.16rd.com/blog-5282-237.html ob 静态电流 shading 阴影, 3a GAMMA:拍灰阶卡, CCM Color Correction Matri ...
- MTK Camera 基础知识
文章目录 数字成像系统流程综述 曝光 对焦马达 镜头(lens) MIPI数据与RAW数据的转换(未完待续) ISP的主要内容和Bayer Raw的处理 RGB.YUV和YCbCr三种颜色空间 补充 ...
- 我心依旧之Android Camera模块FW/HAL3探学序
前沿: 目前对于Android Camera软硬件技术发展的主流方向是高像素.高帧率.多摄像头.超强的ISP以及各种视频图形处理算法等等.当前主流的Android系统中较为常见的Camera模块还均是 ...
- Android MTK Camera博客分享
MTK Camera博客分享 MTK Camera OTP调用过程 MTK Camera Flashlight调用过程 MTK Camera 应用层到底层过程 MTK Camera HAL层分析 深入 ...
- MTK Camera 开机启动流程
一.MTK平台Camera框架 MTK平台的Camera的架构见下图, 这里主要介绍kernel部分和HAL层部分. 1.Kernel 部分主要有两块: 1.1.image sensordriver, ...
最新文章
- SAP PM 入门系列之19 - IP31 Maintenance Plan Costing
- 考虑使用静态工厂方法替代构造方法
- vue中的keep-alive
- 阿里云 超级码力在线编程大赛初赛 第2场 题目4. 小栖的金字塔(超级卡特兰数+除法求模/乘法逆元)
- Cookie和Session的知识
- LibMesh 数据结构类
- spring之AOP
- 低代码平台上的出入库管理
- SAP 固定资产模块上线配置
- 正则系列1: re.match用法
- Nuvoton M0518 之 看门狗的使用Demo
- 六类双绞线排序和信息插座排序
- 关于log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.li)的问题
- 力扣-两数之和 (梦开始的地方)
- 左、右外连接的写法及(+)的用法
- C++排序之直接插入排序法
- Three.js-灯光与阴影
- c语言程序设计课程作用,《C语言程序设计》课程标准
- 论文阅读笔记 | 目标检测算法——YOLOX
- 获国际权威认可 | 云扩科技入选《RPA全球市场格局报告,Q3 2022》