4. 配置HDR处理管线

任务目标

在高通Camera ISP管线中启用HDR处理,实现多帧合成(MFNR/MFSR)与色调映射(Tone Mapping),使预览或拍照路径输出HDR效果图像。

环境依赖

本案例基于高通Camera SDK(camx)与Chromatix调优库,需要以下组件:

  • 高通平台SDK(包含camx、chi-cdk)
  • Chromatix HDR调优参数文件(位于 chi-cdk/oem/qcom/topaz/chromatix/)
  • 支持HDR的sensor驱动(如IMX577、OV48C等)

核心实现

在Usecase XML中启用HDR节点,并在请求构建时设置HDR模式。以下代码展示在Camera用例定义中配置HDR管线的最小实现:

<!-- UsecaseHDR.xml 关键片段 -->
<usecase>
  <node type="IFE" id="0">
    <port name="input" producer="sensor"/>
    <port name="output" consumer="HDRNode"/>
  </node>
  
  <!-- HDR处理节点:多帧合成 + 色调映射 -->
  <node type="HDR" id="1">
    <port name="input" producer="IFE"/>
    <port name="output" consumer="IPE"/>
    <control>
      <hdr_mode>MFSR</hdr_mode>  <!-- 可选: OFF / MFNR / MFSR -->
      <tone_mapping_enable>1</tone_mapping_enable>
      <tone_mapping_curve>default_hdr_curve</tone_mapping_curve>
    </control>
  </node>
  
  <node type="IPE" id="2">
    <port name="input" producer="HDRNode"/>
    <port name="output" consumer="stats"/>
  </node>
</usecase>

在请求构建代码中,通过CHI接口设置HDR模式:

// hdr_request.c - 构建HDR请求
chi_hdr_config_t hdr_config;
memset(&hdr_config, 0, sizeof(hdr_config));

// 启用多帧合成(3帧HDR)
hdr_config.hdr_mode = CHI_HDR_MODE_MFSR;
hdr_config.num_frames = 3;
hdr_config.tone_mapping_enable = TRUE;
hdr_config.tone_mapping_type = CHI_TONE_MAP_HDR;

// 设置到pipeline请求中
chi_pipeline_request_t request;
request.hdr_config = &hdr_config;
request.frame_count = 3;  // 多帧请求

CHIRequestPipeline(&request);

Chromatix调优配置

在Chromatix参数文件中添加HDR调优节点:

// chromatix_hdr.h 片段
static chromatix_hdr_t chromatix_hdr_default = {
    .hdr_enable = TRUE,
    .mfsr_config = {
        .frame_count = 3,
        .exposure_bracket = {0, -2, +2},  // EV bracket
        .merge_ratio = 0.5
    },
    .tone_mapping = {
        .curve_type = CHROMATIX_TONE_CURVE_HDR,
        .target_brightness = 0.6,
        .contrast_strength = 0.3
    }
};

编译与部署

  1. 编译camx驱动:./build.sh -c camx
  2. 编译CHI用例:./build.sh -c chi-cdk
  3. 将生成的 libcamx.so、libchi-cdk.so 和Chromatix二进制push到设备 /vendor/lib64/ 与 /vendor/etc/camera/

验证方法

  1. 启动相机HDR模式:adb shell "echo 1 > /sys/kernel/debug/camera/hdr/enable"
  2. 拍摄HDR照片,检查输出图像动态范围:高光不过曝、暗部细节可见
  3. 通过camx日志确认HDR节点激活:adb logcat -s CamX | grep "HDR",应看到 HDRNode::Execute 和 MFSR merge done 日志
  4. 对比HDR开关下的图像直方图,HDR开启时灰度分布更均匀

通过条件:HDR模式拍照成功,输出图像高光与暗部细节同时保留,且日志中无HDR管线错误。