> 说明:本方案仅给出分析与 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:*
```
自测清单:
-
**是否选中**:log 中 grep `"find features for scenario"` + 你新加的 `"custom_hdr"`(来自 `CaptureFeature_Common.cpp` 的 FID 名)。
-
**ISP profile 是否生效**:grep `MTK_3A_ISP_PROFILE` / `"ISP profile is set"`(`updateIspProfile`);若走静态 mapping,确认命中 print:`"scenario:%d, table size:%zu"`。
-
**走 YUV 还是 RAW**:看 `negotiate()` 里 `mDecision.mNeedUnpackRaw`,对应 dump 文件名前缀(`hdr-in`/`hdr-out` 的 RAW/YUV 命名规则在 `FileDumpNamingRule.h`)。
-
**帧数/曝光**:`"request count"`、`"evc value:%f evc step:%d"`。
8. 风险与注意事项
-
**不要在 `mtkcam-core` 或 `mtkcam-12.0` 下改** ------ 本项目编的是 `mtkcam3`,改了不生效还容易在 code review 时混淆。
-
**别轻易新增 `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`。
-
**`camera_custome_isp_profile_mapping.cpp` 是精确匹配**:改 combo(加/减任何一个 `MTK_FEATURE_*`)必须同步补 mapping 条目,否则静默落到 default profile,画质倒退且难查。
-
**逐帧 `MTK_3A_ISP_PROFILE`(Patch-2)优先级高于静态表**,调试时注意两者打架:先用静态表确认基线,再放开动态 profile。
-
**QSSI/多平台共存**:以上改动全在 `custom/mt6789/` 与 `mtkcam3/` 下;若还要支持其它平台,需同步改对应 `custom/<platform>/hal/camera/`。
-
**`TP_FEATURE_*` 位**:bit 32--60 已被占。新算法用 61,62/63 留作后续;跨项目复用时避免位冲突。
9. 需要你确认的两点
-
**目标算法**:是要在现有 PixSmart HDR 上改 ISP profile/长短曝分路(→ 用 Patch-1 / Patch-2),还是要接一路全新的 HDR 算法(→ 用 Patch-3)?
-
**算法输入域**:YUV 域(NV21/P010,成本低)还是 RAW 域(`BAYER10_UNPAK`,需 `mNeedUnpackRaw` 且要评估带宽/内存)?这直接决定 `negotiate()` 与 mapping 表的 stage(走 `eStage_R2Y_*` 还是 `eStage_Y2Y_*`)。
确认后我可以把 Patch-3 的 provider 模板补成可直接编译的完整文件。
三、本次改动 3 处分别干了什么
- 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 拍照也一起生效。