一、基本概念
Metadata 是整个 Android camera 中类似于高楼大厦中的管道系统一样,贯穿了整个 Camera 的 Framework 和 vendor HAL。Metadata 里面包含了所有的控制、参数、返回值等等。Metadata分为Android原生的Metadata和芯片商或者用户自定义的Metadata,即Android Tag和Vendor Tag。Vendor Tag在Hal中定义,并在camx和chi目录中使用。如果是高通平台的话,一般至少存在三类metadata,一类是 Andriod metadata、Qcom metadata、手机厂商自己定义的 metadata。camera meta简单来说就是用来描述图像特征的参数,比如常见的曝光、ISO等,不难理解他的数据结构应该是由N个key和value组成的。
在实际操作中,开发者可以通过Java层的API直接创建和修改CaptureRequest对象,这些对象内部使用了Camera Metadata来存储所有的请求参数。这种方式简化了相机应用开发的复杂度,使开发者能够更加集中精力于实现应用逻辑而非底层细节。同时,Camera Metadata也支持厂商扩展,允许厂商根据需要添加自定义的元数据标签。
metadata可以分成三类 control、dynamic 以及 static。
- control(request):可控制相机行为的metadata, 每个request都会带的控制信息,相当于告诉底层该如何理解这个Request
- Static metadata:存储了相机的相关资讯,描述了camera device的规格以及对应的能力
- Dynamic(result):当HAL收到control metadata后,设定给ISP,然后产生的对应的结果
二、Meta data sheet
metadata由key和value组成,每个metadata的具体定义与用途可以查看具体路径下的官方文档,mtk:system/media/camera/docs/docs.html
可使用adb导出设备metadata数据:adb shell dumpsys media.camera > meta.info.txt
三、metadata修改
一、metadata结构
metadata由三类组成三类组成分别包含:Andriod metadata、 metadata、sensor metadata。
Andriod metadata(Google Metadata)文件路径:
system/media/camera/include/system/camera_metadata_tags.h
system/media/camera/src/camera_metadata.c
system/media/camera/src/camera_metadata_tag_info.c
metadata,这里介绍mtk相关metadata,文件路径如下:
vendor\mediatek\proprietary\custom\common\hal\imgsensor_metadata\sensor\****_mipi_raw\***metadata***
vendor\mediatek\proprietary\custom\mt6771\hal\imgsensor_metadata\common\****_mipi_raw\***metadata***
sensor metadata,为具体的sensor metadata,文件路径如下:
vendor\mediatek\proprietary\custom\mt6771\hal\imgsensor_metadata\****_mipi_raw\***metadata***
common适用于所有sensor,一般不做修改;配置相同的tag,生效原则按照:sensor > comnon,即sensor配置的metadata会覆盖掉common里面配置的metadata
二、metadata更改
一、分辨率添加
在PictureSize的onValueInitialized()方法中对这些PictureSize进行过滤,首先会默认添加一个4:3的ratio,另外一个ratio会根据屏幕的wm size来决定,比如wm size:1280x720,则此时另外的ratio就是16:9(从16:9,5:3,4:3,3:2中选择与屏幕最接近的ratio)。
文件路径:vendor\mediatek\proprietary\custom\mt6771\hal\imgsensor_metadata\****_mipi_raw\config_static_metadata_project.h
CONFIG_METADATA_BEGIN(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_WITH_DURATIONS)
//4:3
CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_BLOB, MINT64)
CONFIG_ENTRY_VALUE(4640, MINT64) // width
CONFIG_ENTRY_VALUE(3440, MINT64) // height
CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT64) // output
CONFIG_ENTRY_VALUE(33333333, MINT64) // frame duration
CONFIG_ENTRY_VALUE(33333333, MINT64) // stall duration
//4:3
/*CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_RAW16, MINT64)
CONFIG_ENTRY_VALUE(4640, MINT64) // width
CONFIG_ENTRY_VALUE(3440, MINT64) // height
CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT64) // output
CONFIG_ENTRY_VALUE(33333333, MINT64) // frame duration
CONFIG_ENTRY_VALUE(33333333, MINT64) // stall duration*/
//4:3
CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_YCbCr_420_888, MINT64)
CONFIG_ENTRY_VALUE(4640, MINT64) // width
CONFIG_ENTRY_VALUE(3440, MINT64) // height
CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT64) // output
CONFIG_ENTRY_VALUE(33333333, MINT64) // frame duration
CONFIG_ENTRY_VALUE(0 , MINT64) // stall duration
CONFIG_METADATA_END()
sensor data sheet
格式说明:
HAL_PIXEL_FORMAT_YCbCr_420_888:该format用于preview/vedio 的size,此格式对应预览模式拍照大小
HAL_PIXEL_FORMAT_BLOB: 该format用于Capture的size,只要配置了HAL_PIXEL_FORMAT_YCbCr_420_888 size就要配置HAL_PIXEL_FORMAT_BLOB的size,且size要是16的倍数,不然cts会报错。此格式对应拍照格式大小。
HAL_PIXEL_FORMAT_RAW16: raw16的含义是所有raw的能力,只要有raw的数据输出就要配置raw,只能填一个size(等于或者接近active array size),出现CTS报错时需要添加此格式。
frame duration:单位ns,与帧率相关,fps为30,frame duration为33333333
stall duration:单位ns,HAL_PIXEL_FORMAT_YCbCr_420_888设置为0,HAL_PIXEL_FORMAT_BLOB的设置与frame duration一样
添加HAL_PIXEL_FORMAT_RAW16格式大小后需要MTK_REQUEST_AVAILABLE_CAPABILITIES中添加:
CONFIG_ENTRY_VALUE(MTK_REQUEST_AVAILABLE_CAPABILITIES_RAW, MUINT8)
以上都为4:3的分辨率大小可能需要添加16:9、 5:3的分辨率需要添加HAL_PIXEL_FORMAT_YCbCr_420_888与HAL_PIXEL_FORMAT_BLOB格式
//5:3
CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_YCbCr_420_888, MINT64)
CONFIG_ENTRY_VALUE(4640, MINT64) // width
CONFIG_ENTRY_VALUE(2784, MINT64) // height
CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT64) // output
CONFIG_ENTRY_VALUE(33333333, MINT64) // frame duration
CONFIG_ENTRY_VALUE(0 , MINT64) // stall duration
//5:3
CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_BLOB, MINT64)
CONFIG_ENTRY_VALUE(4640, MINT64) // width
CONFIG_ENTRY_VALUE(2784, MINT64) // height
CONFIG_ENTRY_VALUE(MTK_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT, MINT64) // output
CONFIG_ENTRY_VALUE(33333333, MINT64) // frame duration
CONFIG_ENTRY_VALUE(33333333, MINT64) // stall duration
二、HDR功能
HDR(High Dynamic Range)功能是一种用于提高图像动态范围的技术。在摄影中,动态范围是指相机能够捕捉的从最暗到最亮的光线范围。然而,大多数相机传感器在极端光线条件下无法同时捕捉到高光和阴影区域的细节。为了解决这个问题,HDR技术通过拍摄多张不同曝光的照片,然后将它们合并成一张具有更宽动态范围的照片。这样,照片中的亮部和暗部都可以保持更多的细节,使光线对比度更加强烈,从而获得更好的图像质量。
支持HDR功能需要第三方算法支持, 若无第三方算法支持,需要关闭HDR功能。
文件路径:vendor\mediatek\proprietary\custom\\hal\imgsensor_metadata\**_mipi_raw\config_static_metadata.module.***mipiraw.h
//CONFIG_ENTRY_VALUE(MTK_CONTROL_SCENE_MODE_HDR, MUINT8)
三、闪光灯功能
相机闪光灯是一种附加的照明设备,用于在低光或暗光条件下提供额外的光源,以改善照片的曝光和质量。在配置闪光灯功能时,比如前摄无闪光灯需要关闭闪光灯配置。在MTK_CONTROL_AE_AVAILABLE_MODES(配置自动曝光(Auto Exposure, AE)模式)中关闭如下配置:
文件路径:vendor\mediatek\proprietary\custom\\hal\imgsensor_metadata\**_mipi_raw\config_static_metadata.module.**mipiraw.h
//CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, MUINT8)
//CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON_EXTERNAL_FLASH, MUINT8)
//CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON_ALWAYS_FLASH, MUINT8)
功能说明:
MTK_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE:用于设置自动曝光(Auto Exposure, AE)模式的参数,特别用于处理拍摄照片时可能出现的红眼现象。
MTK_CONTROL_AE_MODE_ON_EXTERNAL_FLASH:用于配置自动曝光(Auto Exposure, AE)模式的参数,特别用于在拍摄照片时使用外部闪光灯。
MTK_CONTROL_AE_MODE_ON_ALWAYS_FLASH:用于配置摄像头在低光环境下始终使用闪光灯。
四、lens
镜头的质量、焦距、光圈大小和光学特性等都会影响最终照片的清晰度、对比度、色彩饱和度和景深等视觉效果。根据sensor data sheet设置lens参数。
文件路径:vendor\mediatek\proprietary\custom\\hal\imgsensor_metadata\***_mipi_raw\config_static_metadata.lens.**mipiraw.h
CONFIG_METADATA_BEGIN(MTK_LENS_INFO_AVAILABLE_APERTURES) //摄像头固件中用于查询镜头支持的光圈值(Aperture Values)的一个参数。
CONFIG_ENTRY_VALUE(2.8f, MFLOAT)
CONFIG_METADATA_END()
CONFIG_METADATA_BEGIN(MTK_LENS_INFO_AVAILABLE_FOCAL_LENGTHS) //用于查询摄像头支持的焦距范围的参数
CONFIG_ENTRY_VALUE(3.30f, MFLOAT)
CONFIG_METADATA_END()
CONFIG_METADATA_BEGIN(MTK_LENS_INFO_AVAILABLE_FILTER_DENSITIES) //配置滤镜密度大小
CONFIG_ENTRY_VALUE(0.0f, MFLOAT)
CONFIG_METADATA_END()
CONFIG_METADATA_BEGIN(MTK_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION) //配置光学防抖功能
CONFIG_ENTRY_VALUE(MTK_LENS_OPTICAL_STABILIZATION_MODE_OFF, MUINT8) //不支持光学防抖
CONFIG_METADATA_END()
CONFIG_METADATA_BEGIN(MTK_LENS_INFO_FOCUS_DISTANCE_CALIBRATION) //对焦距离校准配置
CONFIG_ENTRY_VALUE(MTK_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED, MUINT8) //关闭对焦距离校准
CONFIG_METADATA_END()
CONFIG_METADATA_BEGIN(MTK_LENS_INFO_HYPERFOCAL_DISTANCE) //配置超焦距距离,配置5米
CONFIG_ENTRY_VALUE((1.0/3.0), MFLOAT) // 5 m hyperfocal distance
CONFIG_METADATA_END()
CONFIG_METADATA_BEGIN(MTK_LENS_INFO_MINIMUM_FOCUS_DISTANCE)//配置微距离对焦,配置5CM
CONFIG_ENTRY_VALUE((1.0/0.05), MFLOAT) // 5 cm min focus distance
CONFIG_METADATA_END()
五、AF
相机自动对焦配置。
文件路径:vendor\mediatek\proprietary\custom\\hal\imgsensor_metadata\***_mipi_raw\config_static_metadata.module.***mipiraw.h
CONFIG_METADATA_BEGIN(MTK_CONTROL_SCENE_MODE_OVERRIDES)
// MTK_CONTROL_SCENE_MODE_FACE_PRIORITY 配置项定义了人像模式下的曝光优先级。
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_OFF, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_AUTO, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_CONTINUOUS_PICTURE, MUINT8)
// MTK_CONTROL_SCENE_MODE_ACTION 配置项定义了在特定场景模式下的操作设置,比如运动模式
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_AUTO, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_CONTINUOUS_PICTURE, MUINT8)
// MTK_CONTROL_SCENE_MODE_PORTRAIT 配置人像模式
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_AUTO, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_CONTINUOUS_PICTURE, MUINT8)
// MTK_CONTROL_SCENE_MODE_LANDSCAPE 配置风景
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_DAYLIGHT, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_CONTINUOUS_PICTURE, MUINT8)
// MTK_CONTROL_SCENE_MODE_NIGHT 配置夜景
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_AUTO, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_CONTINUOUS_PICTURE, MUINT8)
// MTK_CONTROL_SCENE_MODE_NIGHT_PORTRAIT 配置夜景人像
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_AUTO, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_CONTINUOUS_PICTURE, MUINT8)
// MTK_CONTROL_SCENE_MODE_THEATRE 配置剧场
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_AUTO, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_AUTO, MUINT8)
// MTK_CONTROL_SCENE_MODE_BEACH 配置沙滩
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_DAYLIGHT, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_CONTINUOUS_PICTURE, MUINT8)
// MTK_CONTROL_SCENE_MODE_SNOW 配置雪地
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_DAYLIGHT, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_CONTINUOUS_PICTURE, MUINT8)
// MTK_CONTROL_SCENE_MODE_SUNSET 配置落日
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_DAYLIGHT, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_CONTINUOUS_PICTURE, MUINT8)
// MTK_CONTROL_SCENE_MODE_STEADYPHOTO 配置稳影
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_AUTO, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_CONTINUOUS_PICTURE, MUINT8)
// MTK_CONTROL_SCENE_MODE_FIREWORKS 配置烟花
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_DAYLIGHT, MUINT8) //用于配置日光白平衡
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_AUTO, MUINT8)
// MTK_CONTROL_SCENE_MODE_SPORTS //配置运动
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_AUTO, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_AUTO, MUINT8) //用于配置自动对焦
// MTK_CONTROL_SCENE_MODE_PARTY 配置派对
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_AUTO, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_CONTINUOUS_PICTURE, MUINT8)
// MTK_CONTROL_SCENE_MODE_CANDLELIGHT 配置烛光
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON, MUINT8)
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_INCANDESCENT, MUINT8) //配置烛光白平衡
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_CONTINUOUS_PICTURE, MUINT8) //配置连续拍照下自动对焦
// MTK_CONTROL_SCENE_MODE_BARCODE 配置条码
CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON, MUINT8) //配置自动曝光
CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_AUTO, MUINT8) //配置自动白平衡
CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_MACRO, MUINT8) //配置微距模式对焦
三、metadata编译
快速编译验证:
- 修改sensor相关的编译 libcam.halsensor:./prebuilts/build-tools/linux-x86/bin/ninja -j 12 -f out/combinedfull_tb8788p1_64_bsp_k419.ninja libcam.halsensor
- 修改camera 3A, feature,request等相关的编译 libmtkcam_metastore:./prebuilts/build-tools/linux-x86/bin/ninja -j 12 -f out/combinedfull_tb8788p1_64_bsp_k419.ninja libmtkcam_metastore
文件生成路径:out/target/product/tb8797p1_64_k419_wifi/vendor/lib64
直接使用adb push 到vendor/lib64