# HDR 算法 ISP 通路客制化方案(G100 / mt6789)

> 说明:本方案仅给出分析与 patch,**未修改任何源码**。所有路径以 `alps/` 为根。


1. 平台与代码版本定位

| 项 | 值 | 依据 |

| --- | --- | --- |

| 平台 | **mt6789** | `alps/device/mediateksample/k6789v1_64/`,`alps/vendor/mediatek/proprietary/custom/mt6789` |

| 项目 | G100(`MTK_BUILD_VERNO = MA67KN_GH67K1N_G100_1203`) | `device/mediateksample/k6789v1_64/ProjectConfig.mk:313` |

| Camera HAL 版本 | **mtkcam3** | `device/mediatek/vendor/common/device-vext.mk:2489`(`mt6789/mt6855/mt6858 → mtkcam3`;`mt6895` 才走 `mtkcam-12.0`) |

| 源码主目录 | `vendor/mediatek/proprietary/hardware/mtkcam3` | |

| 客制化目录 | `vendor/mediatek/proprietary/custom/mt6789/hal/` | |

| 已集成的第三方 HDR | PixSmart HDR(`TP_FEATURE_PIXSMART_HDR`,bit 52) | Redmine 359818 / 379285 |

> 注意:仓库里同时存在 `hardware/mtkcam-core`、`hardware/mtkcam-12.0`、`hardware/mtkcam3` 三份。**本项目只生效 `mtkcam3`**,`mtkcam-core` / `mtkcam-12.0` 的改动不会编进版本。


2. 现状:HDR 算法在 ISP 中的通路

```

APP (capture request)

└─ mtkcam3/pipeline/policy/FeatureSettingPolicy.cpp

└─ 3rdparty/customer/customer_scenario_mgr.cpp // 选 scenario + feature set(key feature 优先级)

└─ custom/mt6789/hal/camera/camera_custom_feature_table.cpp 【★客制化点 A】

├─ combo 位掩码:TP_FEATURE_XXX_HDR | MTK_FEATURE_NR | CZ | DRE | ...

└─ ADD_CAMERA_FEATURE_SET 顺序 = 选中优先级(越靠前越优先)

└─ feature/core/featurePipe/capture/nodes/MultiFrameNode.cpp 【★客制化点 B】

key feature → FID_XXX(决定进哪个 capture node)

└─ pipeline/hwnode/p2/P2_CaptureProcessor.cpp 【★客制化点 B】

combo 中每个 MTK_FEATURE_* → FID_*(ISP 侧要跑哪些后处理)

└─ P2 节点实际跑 ISP:

profile 由 custom/mt6789/hal/camera/camera_custome_isp_profile_mapping.cpp 决定 【★客制化点 C】

feature → { stage(eStage_R2Y_Main / eStage_Y2Y_Main / eStage_MDP ...) → EIspProfile_T }

└─ 例外:plugin 可逐帧写 MTK_3A_ISP_PROFILE 覆盖 profile 【★客制化点 D】

see 3rdparty/customer/pixsmart_multi/SxsHDRImpl.cpp:992 updateIspProfile()

└─ Standalone ISP HIDL 通路(走 isp hidl 而非 P2 capture pipeline) 【★客制化点 E】

main/standalone_isp/FeatureSettingPolicy_ISP.cpp:414~448(ispProcessInOutType)

3rdparty/customer/customer_scenario_mgr_ISP.cpp:107(type → MTK_ISP_HIDL_SCENARIO_*)

```

关键文件清单(改 ISP 通路必看):

| # | 文件 | 作用 |

| --- | --- | --- |

| A | `alps/vendor/mediatek/proprietary/custom/mt6789/hal/camera/camera_custom_feature_table.cpp` | feature combo + scenario → feature set 映射 |

| C | `alps/vendor/mediatek/proprietary/custom/mt6789/hal/camera/camera_custome_isp_profile_mapping.cpp` | **feature → ISP stage/profile**(真正决定 ISP 走哪套 tuning) |

| C2 | `alps/vendor/mediatek/proprietary/custom/mt6789/hal/inc/tuning_mapping/cam_idx_struct_ext.h`、`cam_idx_struct_legacy.h` | `EIspProfile_T` 枚举与 tuning 索引(新增 profile 必须同步动了 NVRAM/tuning) |

| B | `.../mtkcam3/feature/core/featurePipe/capture/nodes/MultiFrameNode.cpp` | multi-frame key feature → FID |

| B | `.../mtkcam3/pipeline/hwnode/p2/P2_CaptureProcessor.cpp` | combo → CaptureFeaturePipe FID |

| B | `.../mtkcam3/include/mtkcam3/feature/featurePipe/ICaptureFeaturePipe.h` | FID 枚举 |

| B | `.../mtkcam3/feature/core/featurePipe/capture/CaptureFeature_Common.cpp` | FID → debug 名 |

| A2 | `.../mtkcam3/include/mtkcam3/3rdparty/customer/customer_feature_type.h` | `TP_FEATURE_*` 位定义(bit 32--63) |

| D | `.../mtkcam3/3rdparty/customer/pixsmart_multi/SxsHDRImpl.cpp` | 现有 HDR provider(`property` / `negotiate` / `process` / `updateIspProfile`) |

| E | `.../mtkcam3/main/standalone_isp/FeatureSettingPolicy_ISP.cpp`、`.../3rdparty/customer/customer_scenario_mgr_ISP.cpp` | ISP HIDL 独立通路 |

现有 HDR 相关定义(mt6789):

  • `MTK_FEATURE_COMBINATION_PIXSMART_HDR`(`camera_custom_feature_table.cpp:66`)

= `NO_FEATURE_NORMAL | TP_FEATURE_PIXSMART_HDR | NR | CZ | DRE | FACESR | ULTRA_WIDE_LENS_UNDISTORT`

  • ISP profile mapping(`camera_custome_isp_profile_mapping.cpp:144-149`)

= `eStage_R2Y_Main→zHDR_Capture`、`R2YDCE_1stRun→zHDR_Capture`、`Y2YDCE_2ndRun→zHDR_Capture_DCE`、`MDP→zHDR_Capture`、`Y2Y_Main→YUV_Reprocess`


3. 客制化的 5 个层次(按需取用)

| 层次 | 目标 | 改动范围 | 典型场景 |

| --- | --- | --- | --- |

| L1 调 MTK 自带后处理组合 | 改 combo(加/去 NR、DRE、CZ...) | 仅 A | 画质微调 |

| L2 改 ISP profile 通路 | 改 `stage → EIspProfile_T` | 仅 C | **最常用**:HDR 换一套 tuning / 区分长短曝回 **Patch-1** |

| L3 逐帧动态 profile | 按 EV/帧序动态给 `MTK_3A_ISP_PROFILE` | 仅 D | 长短曝分别用不同 tuning → **Patch-2** |

| L4 新增一路自定义 HDR 算法 | 新 `TP_FEATURE_*` + FID + provider + 编译 | A2/B/A/C/新目录 | 接入自研算法 → **Patch-3** |

| L5 走 Standalone ISP HIDL | `MultipleRawIn_YuvOut` 等 hidl scenario | E | 第三方离线 ISP 后处理 |

> **建议**:能用 L2/L3 解决的,不要新增 `EIspProfile_T`------新增 profile 需要 NVRAM/tuning 参数同步配套(`cam_idx_struct_*.h` + tuning 参数文件),否则 ISP 取不到参数会被拉回默认。


4. Patch-1:调整现有 HDR 的 ISP profile 通路(最小改动)

适用:PixSmart HDR 要换一套 tuning,或要把 YUV 重处理阶段(`eStage_Y2Y_Main`)从 `YUV_Reprocess` 换成 HDR 专用 profile。

```diff

--- a/alps/vendor/mediatek/proprietary/custom/mt6789/hal/camera/camera_custome_isp_profile_mapping.cpp

+++ b/alps/vendor/mediatek/proprietary/custom/mt6789/hal/camera/camera_custome_isp_profile_mapping.cpp

@@ -143,6 +143,14 @@

//redmine 375546 modify mutli node profile huanglj 20260108 begin

MAPPING_ITEM_BEGIN(TP_FEATURE_PIXSMART_HDR, eMappingScenario_Capture)

ADD_STAGE_PROFILE_MAPPING(eStage_R2Y_Main, EIspProfile_zHDR_Capture)

ADD_STAGE_PROFILE_MAPPING(eStage_R2YDCE_1stRun, EIspProfile_zHDR_Capture)

ADD_STAGE_PROFILE_MAPPING(eStage_Y2YDCE_2ndRun, EIspProfile_zHDR_Capture_DCE)

ADD_STAGE_PROFILE_MAPPING(eStage_MDP, EIspProfile_zHDR_Capture)

ADD_STAGE_PROFILE_MAPPING(eStage_Y2Y_Main, EIspProfile_YUV_Reprocess)

MAPPING_ITEM_END()

  • // ===== G100HDR 客制化 ISP 通路示例 =====

  • // 例:把 HDR 的主通路从 zHDR_Capture 换成 zHDR_Video / VSS 变体,

  • // 并把 YUV 重处理阶段同步换成 HDR 专用 reprocess profile。

  • // 注意:务必确认 MTKCAM IProfile 里有配过的 EIspProfile_T,

  • // 不要写 NVRAM 里没有 tuning 参数的新 profile。

  • MAPPING_ITEM_BEGIN(TP_FEATURE_PIXSMART_HDR | MTK_FEATURE_CZ, eMappingScenario_Capture)

  • ADD_STAGE_PROFILE_MAPPING(eStage_R2Y_Main, EIspProfile_zHDR_Capture)

  • ADD_STAGE_PROFILE_MAPPING(eStage_R2YDCE_1stRun, EIspProfile_zHDR_Capture)

  • ADD_STAGE_PROFILE_MAPPING(eStage_Y2YDCE_2ndRun, EIspProfile_zHDR_Capture_DCE)

  • ADD_STAGE_PROFILE_MAPPING(eStage_MDP, EIspProfile_zHDR_Capture)

  • ADD_STAGE_PROFILE_MAPPING(eStage_Y2Y_Main, EIspProfile_YUV_Reprocess)

  • MAPPING_ITEM_END()

MAPPING_ITEM_BEGIN(TP_FEATURE_PIXSMART_NS, eMappingScenario_Capture)

```

要点:

  • mapping 是**精确匹配 feature 组合**(`iFeatureID` 含 key feature 及后续 stage 判定),所以给 HDR 新增/删一个 `MTK_FEATURE_xxx`,就要补一条对应 `MAPPING_ITEM_BEGIN`,否则落到 default(`eStage_Y2Y_Main → EIspProfile_Thumbnail`)。

  • `MAPPING_ITEM_BEGIN_MULTI(..., eSensorComb_BayerBayer)` 用于双摄组合,单摄用 `MAPPING_ITEM_BEGIN`。


5. Patch-2:放行逐帧动态 ISP profile(长短曝分 tuning)

现状:`SxsHDRImpl.cpp:349` 的 `updateIspProfile()` 被注释(Redmine 367849 的 tuning 调试遗留),所有帧统一走 mapping 表的 profile。

客制化:恢复并按 EV 倍数决定 profile(短曝 `times<1` 用一套、长曝用另一套)。

```diff

--- a/alps/vendor/mediatek/proprietary/hardware/mtkcam3/3rdparty/customer/pixsmart_multi/SxsHDRImpl.cpp

+++ b/alps/vendor/mediatek/proprietary/hardware/mtkcam3/3rdparty/customer/pixsmart_multi/SxsHDRImpl.cpp

@@ -346,7 +346,11 @@

// redmine 367849 modify for hdr tunning chenjunrui 20251009 start

  • //updateIspProfile(pHalInMeta, sel.mRequestIndex);
  • // G100HDR 客制化:按曝光倍数逐帧下发 ISP profile,

  • // 覆盖 camera_custome_isp_profile_mapping.cpp 的静态结果。

  • if (CC_LIKELY(isHalMeta)) {

  • updateIspProfile(pHalInMeta, sel.mRequestIndex);

  • }

// redmine 367849 modify for hdr tunning chenjunrui 20251009 end

@@ -992,6 +996,10 @@

void SxsHDRPluginProviderImp::updateIspProfile(IMetadata* pHalMeta, const MUINT8 requestIndex) {

#define SXS_EXP_CTRL_MAX_IMAGE_NUM 20

MUINT8 profile = 0;

  • // G100HDR 客制化:阈值可按算法侧实调;

  • // 短曝(times<1) → VSS profile(抑噪/提亮)

  • // 长曝(times>1) → 常规 zHDR profile(保高光)

  • const double kShortExpTh = 1.0;

auto frameNum = algoParam.frameNum;

if (requestIndex < SXS_EXP_CTRL_MAX_IMAGE_NUM)

{

@@ -1000,7 +1008,7 @@

MY_LOGD("ISP timesArray (%lf) index (%d)", expDst.timesArrayrequestIndex, requestIndex);

  • if (expDst.timesArrayrequestIndex > 1) {
  • if (expDst.timesArrayrequestIndex > kShortExpTh) {

profile = EIspProfile_T::EIspProfile_zHDR_Video;

} else if (expDst.timesArrayrequestIndex < 1) {

profile = EIspProfile_T::EIspProfile_zHDR_Video_VSS;

```

要点:这里写的是 hal meta 的 `MTK_3A_ISP_PROFILE`,**优先级高于 mapping 表**;但它只对被 plugin 接管的那些 request 生效(`negotiate` 里拿到的 `sel.mRequestIndex`)。


6. Patch-3:新增一路自定义 HDR 算法并打通 ISP 通路(完整)

下面是一整条新通路的模板,命名皆用 `CUSTOM_HDR`,替换成实际算法名即可。

`TP_FEATURE_*` 已占用 bit 32--60,**新算法用 bit 61**(62/63 预留)。

6.1 定义 feature 位

```diff

--- a/alps/vendor/mediatek/proprietary/hardware/mtkcam3/include/mtkcam3/3rdparty/customer/customer_feature_type.h

+++ b/alps/vendor/mediatek/proprietary/hardware/mtkcam3/include/mtkcam3/3rdparty/customer/customer_feature_type.h

@@ -92,6 +92,10 @@

//Redmine 379282 PixDualCam algo by zhangjinyu 20251211 begin

TP_FEATURE_PIXSMART_PORTRART_PLUS = 1ULL << 60,

//Redmine 379282 PixDualCam algo by zhangjinyu 20251211 end

  • // G100HDR 客制化 HDR 算法

  • TP_FEATURE_CUSTOM_HDR = 1ULL << 61,

// TODO: reserve for customer feature index (bit 32-63)

};

```

6.2 定义 capture FID

```diff

--- a/alps/vendor/mediatek/proprietary/hardware/mtkcam3/include/mtkcam3/feature/featurePipe/ICaptureFeaturePipe.h

+++ b/alps/vendor/mediatek/proprietary/hardware/mtkcam3/include/mtkcam3/feature/featurePipe/ICaptureFeaturePipe.h

@@ -198,6 +198,8 @@

//Redmine 370080 add for FaceSR by ke.sun 20251017 begin

FID_PIXSMART_FACESR,

  • // G100HDR 客制化 HDR 算法

  • FID_CUSTOM_HDR,

```

```diff

--- a/alps/vendor/mediatek/proprietary/hardware/mtkcam3/feature/core/featurePipe/capture/CaptureFeature_Common.cpp

+++ b/alps/vendor/mediatek/proprietary/hardware/mtkcam3/feature/core/featurePipe/capture/CaptureFeature_Common.cpp

@@ -596,6 +596,8 @@

case FID_PIXSMART_HDR: return "pixsmart_hdr";

  • // G100HDR 客制化 HDR 算法

  • case FID_CUSTOM_HDR: return "custom_hdr";

```

6.3 挂进 MultiFrameNode 与 P2

```diff

--- a/alps/vendor/mediatek/proprietary/hardware/mtkcam3/feature/core/featurePipe/capture/nodes/MultiFrameNode.cpp

+++ b/alps/vendor/mediatek/proprietary/hardware/mtkcam3/feature/core/featurePipe/capture/nodes/MultiFrameNode.cpp

@@ -386,6 +386,10 @@

//redmine 379285 add for rawSuperNight & HDR zk 2025.12.2 begin

else if (rProperty.mFeatures & TP_FEATURE_PIXSMART_HDR)

featId = FID_PIXSMART_HDR;

  • // G100HDR 客制化 HDR 算法

  • else if (rProperty.mFeatures & TP_FEATURE_CUSTOM_HDR)

  • featId = FID_CUSTOM_HDR;

else if (rProperty.mFeatures & TP_FEATURE_PIXSMART_RAWNIGHT)

```

```diff

--- a/alps/vendor/mediatek/proprietary/hardware/mtkcam3/pipeline/hwnode/p2/P2_CaptureProcessor.cpp

+++ b/alps/vendor/mediatek/proprietary/hardware/mtkcam3/pipeline/hwnode/p2/P2_CaptureProcessor.cpp

@@ -525,6 +525,9 @@

if (feature & TP_FEATURE_PIXSMART_HDR)

pCapRequest->addFeature(FID_PIXSMART_HDR);

  • // G100HDR 客制化 HDR 算法

  • if (feature & TP_FEATURE_CUSTOM_HDR)

  • pCapRequest->addFeature(FID_CUSTOM_HDR);

//Redmine 359818 add for SuperNight & HDR by zhoushidan 20250917 end

```

6.4 feature table:决定"何时选中"该 HDR(优先级)

```diff

--- a/alps/vendor/mediatek/proprietary/custom/mt6789/hal/camera/camera_custom_feature_table.cpp

+++ b/alps/vendor/mediatek/proprietary/custom/mt6789/hal/camera/camera_custom_feature_table.cpp

@@ -66,6 +66,10 @@

#define MTK_FEATURE_COMBINATION_PIXSMART_HDR (NO_FEATURE_NORMAL | TP_FEATURE_PIXSMART_HDR| MTK_FEATURE_NR| MTK_FEATURE_CZ| MTK_FEATURE_DRE | TP_FEATURE_PIXSMART_FACESR | TP_PIXSMART_ULTRA_WIDE_LENS_UNDISTORT)

+// G100HDR 客制化 HDR 算法

+// 说明:combo 里带 NR/CZ/DRE = ISP 侧要多跑这些后处理;

+// 不带 MTK_FEATURE_HFG/DCE 时,P2 不会加 FID_HFG/FID_DCE。

+#define MTK_FEATURE_COMBINATION_CUSTOM_HDR (NO_FEATURE_NORMAL | TP_FEATURE_CUSTOM_HDR | MTK_FEATURE_NR| MTK_FEATURE_CZ| MTK_FEATURE_DRE| MTK_FEATURE_HFG| MTK_FEATURE_DCE)

@@ -147,6 +151,10 @@

CAMERA_SCENARIO_START(MTK_CAMERA_SCENARIO_CAPTURE_NORMAL)

  • // G100HDR 客制化 HDR 算法:放在最前 = 优先级最高(抢过 TP_FEATURE_HDR / AIHDR)

  • ADD_CAMERA_FEATURE_SET(TP_FEATURE_CUSTOM_HDR, MTK_FEATURE_COMBINATION_CUSTOM_HDR)

ADD_CAMERA_FEATURE_SET(MTK_FEATURE_AIHDR, MTK_FEATURE_COMBINATION_AIHDR)

ADD_CAMERA_FEATURE_SET(TP_FEATURE_HDR, MTK_FEATURE_COMBINATION_HDR)

```

> `ADD_CAMERA_FEATURE_SET` 的书写顺序即匹配优先级;要"只有调试开关打开才生效",把 `property()`/`negotiate()` 里像 PixSmart 那样读 property 做 gate(`vendor.debug.camera.pixsmart.multi.algo.hdr` 的写法)。

6.5 ISP profile 通路

```diff

--- a/alps/vendor/mediatek/proprietary/custom/mt6789/hal/camera/camera_custome_isp_profile_mapping.cpp

+++ b/alps/vendor/mediatek/proprietary/custom/mt6789/hal/camera/camera_custome_isp_profile_mapping.cpp

@@ -150,6 +150,17 @@

MAPPING_ITEM_END()

  • // G100HDR 客制化 HDR 算法的 ISP 通路

  • // YUV 域多帧(plugin 收 NV21/P010)时:主通路 R2Y/Y2Y 都给 zHDR_Capture 系列

  • MAPPING_ITEM_BEGIN(TP_FEATURE_CUSTOM_HDR, eMappingScenario_Capture)

  • ADD_STAGE_PROFILE_MAPPING(eStage_R2Y_Main, EIspProfile_zHDR_Capture)

  • ADD_STAGE_PROFILE_MAPPING(eStage_R2YDCE_1stRun, EIspProfile_zHDR_Capture)

  • ADD_STAGE_PROFILE_MAPPING(eStage_Y2YDCE_2ndRun, EIspProfile_zHDR_Capture_DCE)

  • ADD_STAGE_PROFILE_MAPPING(eStage_MDP, EIspProfile_zHDR_Capture)

  • ADD_STAGE_PROFILE_MAPPING(eStage_Y2Y_Main, EIspProfile_YUV_Reprocess)

  • MAPPING_ITEM_END()

MAPPING_ITEM_BEGIN(TP_FEATURE_PIXSMART_NS, eMappingScenario_Capture)

```

6.6 新增 provider(模板)

文件:`alps/vendor/mediatek/proprietary/hardware/mtkcam3/3rdparty/customer/custom_hdr/CustomHDRImpl.cpp`

```cpp

// 关键片段(完整文件可参照 3rdparty/customer/pixsmart_multi/SxsHDRImpl.cpp)

const CustomHDRPluginProviderImp::Property& CustomHDRPluginProviderImp::property()

{

static Property prop; static bool inited;

if (!inited) {

prop.mName = "CUSTOM HDR";

prop.mFeatures = TP_FEATURE_CUSTOM_HDR; // ★ 决定被 MultiFrameNode 识别成 FID_CUSTOM_HDR

prop.mZsdBufferMaxNum = 8; // 最大缓存帧数(影响 ZSD 时长/内存)

prop.mThumbnailTiming = eTiming_P2;

prop.mPriority = ePriority_Highest;

inited = true;

}

return prop;

}

bool CustomHDRPluginProviderImp::negotiate(Selection& sel)

{

// 1) gating:property / APP metadata / low_ram 判定

if (mEnable == 0) return false;

// 2) 帧数与曝光包围

sel.mRequestCount = 3; // 固定 3 帧示例

// 由算法侧(类似 PixSmartExpCtrl)下发 frameNum / EV bracket:

IMetadata::setEntry<MINT32>(pHalMeta, MTK_3A_AE_HAL_EXPOSURE_COMPENSATION, evcSteps);

sel.mIMetadataHal.setAddtional(pHalAddtional);

// 3) ★决定 ISP 通路:YUV 域 vs RAW 域

#if 0 // RAW 域(保真度最好,代价是 unpack raw + 内存/带宽)

int fmt = sel.mState.mUFBCBayerEn ? eImgFmt_UFBC_BAYER10 : eImgFmt_BAYER10_UNPAK;

sel.mDecision.mNeedUnpackRaw = true; // ★ 让 P2 输出 unpack raw 给 plugin

#else // YUV 域(默认,沿用 PixSmart HDR 的 NV21 方案)

int fmt = eImgFmt_NV21; // 或 eImgFmt_MTK_YUV_P010(10bit)

#endif

sel.mIBufferFull.setRequired(MTRUE).addAcceptedFormat(fmt).addAcceptedSize(eImgSize_Full);

if (sel.mRequestIndex == 0) { // 只有 base frame 需要 output

sel.mOBufferFull.setRequired(MTRUE).addAcceptedFormat(fmt).addAcceptedSize(eImgSize_Full);

}

return true;

}

REGISTER_PLUGIN_PROVIDER(MultiFrame, CustomHDRPluginProviderImp);

```

文件:`alps/vendor/mediatek/proprietary/hardware/mtkcam3/3rdparty/customer/custom_hdr/Android.mk`

```makefile

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

-include (TOP)/(MTK_PATH_SOURCE)/hardware/mtkcam/mtkcam.mk

LOCAL_SRC_FILES += CustomHDRImpl.cpp

LOCAL_C_INCLUDES += $(MTKCAM_C_INCLUDES)

LOCAL_C_INCLUDES += (TOP)/(MTK_PATH_SOURCE)/hardware/mtkcam3/include

LOCAL_C_INCLUDES += (TOP)/(MTK_PATH_SOURCE)/hardware/mtkcam/include

LOCAL_SHARED_LIBRARIES += liblog libutils libcutils

LOCAL_SHARED_LIBRARIES += libmtkcam_modulehelper libmtkcam_stdutils libmtkcam_pipeline

LOCAL_SHARED_LIBRARIES += libmtkcam_metadata libmtkcam_metastore libmtkcam_streamutils

LOCAL_SHARED_LIBRARIES += libmtkcam_imgbuf libmtkcam_ulog libmtkcam.iopipe

LOCAL_SHARED_LIBRARIES += libcustom_hdr # 自研算法 so(prebuilt)

LOCAL_CFLAGS += $(MTKCAM_CFLAGS)

LOCAL_MODULE := libmtkcam.plugin.custom.hdr

LOCAL_PROPRIETARY_MODULE := true

LOCAL_MODULE_OWNER := mtk

LOCAL_MODULE_TAGS := optional

include $(MTKCAM_STATIC_LIBRARY)

include (call all-makefiles-under,(LOCAL_PATH))

```

算法 so 用 prebuilt(`custom_hdr/lib/Android.mk`,照抄 `pixsmart_multi/lib/Android.mk`),并把它挂进打包:

```diff

--- a/alps/vendor/mediatek/proprietary/hardware/mtkcam3/3rdparty/customer/Android.mk

+++ b/alps/vendor/mediatek/proprietary/hardware/mtkcam3/3rdparty/customer/Android.mk

@@ ...

G100HDR 客制化 HDR 算法

LOCAL_SHARED_LIBRARIES += libcustom_hdr

+LOCAL_WHOLE_STATIC_LIBRARIES += libmtkcam.plugin.custom.hdr

LOCAL_MODULE := libmtkcam_3rdparty.customer

```


7. 编译与验证

编译(vendor 侧):

```bash

cd alps

source build/envsetup.sh

lunch <k6789v1_64-userdebug>

mmm vendor/mediatek/proprietary/hardware/mtkcam3/3rdparty/customer/ # provider + 集成 lib

mmm vendor/mediatek/proprietary/custom/mt6789/hal/camera/ # feature table + isp profile mapping

mmm vendor/mediatek/proprietary/hardware/mtkcam3/ # node / policy 侧改动与自动依赖

```

调试开关(沿用现有风格,不必改代码就能验证通路是否被选中):

```bash

打开 HDR dump(PixSmart HDR 已在 SxsHDRImpl 里支持)

adb shell setprop vendor.debug.camera.pixsmart.multi.algo.hdr 1

adb shell setprop vendor.debug.camera.hdr.dump 1

看 feature 决策日志 / scenario 选择

adb logcat -s mtkcam-customer_scenario_mgr_ISP:* mtkcam-FeatureSettingPolicy:* mtkcam-MultiFrame:*

```

自测清单:

  1. **是否选中**:log 中 grep `"find features for scenario"` + 你新加的 `"custom_hdr"`(来自 `CaptureFeature_Common.cpp` 的 FID 名)。

  2. **ISP profile 是否生效**:grep `MTK_3A_ISP_PROFILE` / `"ISP profile is set"`(`updateIspProfile`);若走静态 mapping,确认命中 print:`"scenario:%d, table size:%zu"`。

  3. **走 YUV 还是 RAW**:看 `negotiate()` 里 `mDecision.mNeedUnpackRaw`,对应 dump 文件名前缀(`hdr-in`/`hdr-out` 的 RAW/YUV 命名规则在 `FileDumpNamingRule.h`)。

  4. **帧数/曝光**:`"request count"`、`"evc value:%f evc step:%d"`。


8. 风险与注意事项

  1. **不要在 `mtkcam-core` 或 `mtkcam-12.0` 下改** ------ 本项目编的是 `mtkcam3`,改了不生效还容易在 code review 时混淆。

  2. **别轻易新增 `EIspProfile_T`**:需要同步 `custom/mt6789/hal/inc/tuning_mapping/cam_idx_struct_*.h` 和 NVRAM/tuning 参数,否则 ISP 取不到对应 tuning。优先复用 `zHDR_Capture / zHDR_Capture_DCE / zHDR_Video / zHDR_Video_VSS / YUV_Reprocess`。

  3. **`camera_custome_isp_profile_mapping.cpp` 是精确匹配**:改 combo(加/减任何一个 `MTK_FEATURE_*`)必须同步补 mapping 条目,否则静默落到 default profile,画质倒退且难查。

  4. **逐帧 `MTK_3A_ISP_PROFILE`(Patch-2)优先级高于静态表**,调试时注意两者打架:先用静态表确认基线,再放开动态 profile。

  5. **QSSI/多平台共存**:以上改动全在 `custom/mt6789/` 与 `mtkcam3/` 下;若还要支持其它平台,需同步改对应 `custom/<platform>/hal/camera/`。

  6. **`TP_FEATURE_*` 位**:bit 32--60 已被占。新算法用 61,62/63 留作后续;跨项目复用时避免位冲突。


9. 需要你确认的两点

  1. **目标算法**:是要在现有 PixSmart HDR 上改 ISP profile/长短曝分路(→ 用 Patch-1 / Patch-2),还是要接一路全新的 HDR 算法(→ 用 Patch-3)?

  2. **算法输入域**:YUV 域(NV21/P010,成本低)还是 RAW 域(`BAYER10_UNPAK`,需 `mNeedUnpackRaw` 且要评估带宽/内存)?这直接决定 `negotiate()` 与 mapping 表的 stage(走 `eStage_R2Y_*` 还是 `eStage_Y2Y_*`)。

确认后我可以把 Patch-3 的 provider 模板补成可直接编译的完整文件。

三、本次改动 3 处分别干了什么

  1. Capture profile 打开 COLOR 模块(F_COLOR_EN 0→1)

isp_tuning_custom.cppL161-L166

复制

//07, Capture

...

|F_EE_EN(1) |F_CNR_EN(1) |F_CCR_EN(1) |F_ABF_EN(1) |F_BOK_EN(0) |F_COLOR_EN(1)

影响:拍照 profile 现在会跑 ISP_MGR_COLOR(YUV 域 COLOR / color matrix)的 tuning。注意 E_TOP_Capture 同时被 EIspProfile_Capture 和 EIspProfile_zHDR_Capture 复用(第 389 行 tblEIspProfile_zHDR_Capture = E_TOP_Capture;),所以 zHDR 拍照也一起生效。

相关推荐
挖掘狂人1 小时前
Vue nextTick 到底在等什么?一篇讲透原理与那些年踩过的坑
javascript·程序员·编程语言
全栈陈序员1 小时前
【Python】基础语法入门(三十)—— Web 开发入门:用 Flask 搭建第一个网站
前端·python·flask
全栈陈序员2 小时前
【Python】基础语法入门(三十三)—— 日志系统详解:用 logging 记录程序运行
java·开发语言·python
万少2 小时前
Harmony 7.0 这个skill帮你自动化操作AGC
前端·javascript·后端
她的男孩2 小时前
低代码加字段后表结构怎么同步:预览安全 DDL,高风险变更再强制执行
java·spring boot·低代码
小大宇2 小时前
Vue知识点-ElementPlus-02图标
前端·javascript·vue.js
简简单单就是我_hehe2 小时前
一次 ClickHouse 服务器磁盘告警的排查与修复实录
java·服务器·前端
Thomas.Sir2 小时前
第11课:文件上传下载、跨域CORS配置,SpringBoot4.x跨域新方案
java·spring boot