Camera(5)metadata

一、基本概念

        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

### camera_metadata_buffer_entry_t 和 camera_metadata_entry 的区别及关系 在 Android Camera API 中,`camera_metadata_buffer_entry_t` 和 `camera_metadata_entry` 是用于处理相机元数据的不同结构体。 #### camera_metadata_buffer_entry_t 结构体 `camera_metadata_buffer_entry_t` 主要用于表示存储在缓冲区中的单个元数据条目。该结构体定义了如何访问和操作位于内存特定位置的数据片段[^1]。具体来说: - **data.u8**: 表示无符号字符数组。 - **data.u16**: 表示无符号短整型数组。 - **data.u32**: 表示无符号整数数组。 - **data.i8**, **data.i16**, **data.i32**: 分别对应有符号版本的数据类型。 - **data.f**: 浮点数值数组。 - **section**: 指向包含此条目的节(section),这有助于理解其上下文环境以及与其他条目的关联方式[^3]。 ```c typedef struct { union { uint8_t u8[]; int8_t i8[]; uint16_t u16[]; int16_t i16[]; uint32_t u32[]; int32_t i32[]; float f[]; } data; } camera_metadata_buffer_entry_t; ``` #### camera_metadata_entry 结构体 相比之下,`camera_metadata_entry` 更像是一个高层级抽象,它不仅封装了实际的数据值还提供了更多关于这些数据的信息。这个结构体通常用来描述某个具体的元数据项及其属性,在应用层面上更为常用[^2]。特性如下: - **tag**: 标识符,唯一标记每一个可能存在的元数据字段。 - **count**: 数据元素的数量。 - **type**: 数据类型的枚举值(如整数、浮点数等),帮助解析器知道应该如何解释后面跟随的具体数据。 - **data**: 类似于 `camera_metadata_buffer_entry_t` 中的联合体部分,但是这里更强调作为整体的一部分而不是单独存在。 ```c typedef struct { camera_metadata_tag tag; size_t count; enum android::hardware::camera::common::V1_0::MetadataType type; union { uint8_t u8[ANDROID_MAX_METADATA_BUFFER]; int8_t i8[ANDROID_MAX_METADATA_BUFFER]; uint16_t u16[ANDROID_MAX_METADATA_BUFFER / 2]; int16_t i16[ANDROID_MAX_METADATA_BUFFER / 2]; uint32_t u32[ANDROID_MAX_METADATA_BUFFER / 4]; int32_t i32[ANDROID_MAX_METADATA_BUFFER / 4]; float f[ANDROID_MAX_METADATA_BUFFER / 4]; } data; } camera_metadata_entry; ``` #### 关系说明 两者之间存在着紧密的关系:`camera_metadata_entry` 可以看作是对 `camera_metadata_buffer_entry_t` 进行了一定程度上的包装与扩展。当从底层硬件获取到原始字节数组形式的元数据之后,会先被转换成一系列 `camera_metadata_buffer_entry_t` 实例;随后再进一步加工成为更加易于理解和使用的 `camera_metadata_entry` 对象供上层应用程序调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值