在进行camera系统开发时,总会碰到产品需要,需要一个添加一个多少多少M的照片大小,比如产品经理说我们也要添加一个1:1,添加一个18:9的照片大小。这个情况很常见了,所以这篇文章总结一下平常工作中对这类问题的解决。
Android 8.0和9.0最大的变化是底层谷歌不在支持hal1.0,而强制转换为hal3.0。这个对于mtk代码,也许变化是非常大的,mtk基本上一直使用的是hal1.0+camera api1.0的搭配组合。所以在相关底层配置方面差异也是巨大的。
这篇文章讲的只是配置,而不是插值,毕竟像素这东西还是按照camera sensor所支持的最大值吧。当然如果需要插值,其实也是一样的流程。
配置picture size或preview size,我们是不需要管底层的,一般来说,底层相关值已经配置好了,我们需要做的是配置feature table和上层。
我们可以看到打开camera app,有一个设置菜单或者选项,可以选择照片大小,比如是13M(18:9)、13M(16:9)、13M(4:3)、13M(1:1)等类型。13M就是指的照片大小,表明的是1300万像素,这个就是我们说的Picture size;而括号中的代表的分辨率(宽高比),是我们说的Preview size。
Android 8.0配置方式
配置之前,我们需要找到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-size
FTABLE_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-size
FTABLE_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