1. MTK HAL3单帧算法集成概述
大家好,我是有10多年MTK平台开发经验的工程师,今天想和大家聊聊MTK HAL3平台下单帧算法集成的实战经验。单帧算法在手机影像处理中非常常见,比如美颜、水印、畸变校正等,它们只需要一帧图像输入就能完成处理,非常适合实时预览和拍照场景。
在MTK HAL3架构中,算法集成主要通过Plugin机制实现,特别是在P2节点进行处理。我经历过很多次算法集成,从最初的Feature配置到最后的Metadata扩展,每个环节都有不少需要注意的细节。这篇文章我会用实际的水印算法集成案例,带大家走完整个流程,包括如何添加自定义Feature、修改Scenario配置表、实现Plugin挂载,以及扩展Metadata让APP能够控制算法开关。
记得第一次集成算法时,我踩过不少坑,比如忘了配置Scenario表导致算法不生效,或者Metadata配置不正确导致参数传递失败。通过这篇文章,我希望能够帮助大家避开这些坑,快速完成算法集成。
2. 算法集成前的准备工作
在开始集成之前,我们需要对算法有个全面的评估。不是所有算法都适合集成到手机平台上,我们需要考虑多个因素。
首先是算法效果,必须达到或超过竞品水平,这是最基本的要求。我遇到过一些算法在测试集上表现很好,但到实际场景中就出现各种问题,比如在某些光照条件下效果不稳定,或者处理后的图像出现色差。这些都需要在集成前充分测试。
其次是性能要求,处理时间必须控制在项目规定的范围内。一般来说,单帧算法的处理时间应该小于33ms(相当于30fps的帧率),否则会影响预览流畅度。内存占用也要尽可能小,避免因为内存不足导致系统kill掉相机进程。
还需要注意算法的分辨率支持,最好能够支持传感器的最大分辨率。有些算法只支持低分辨率处理,这在高端机型上是不可接受的。
最后是文档和支持,算法供应商应该提供完整的集成文档,包括输入输出格式、参数说明等。我曾经遇到过算法文档不全的情况,只能通过反编译和猜测来集成,非常浪费时间。
3. 自定义Feature类型添加
在MTK HAL3中,每个算法都需要对应一个Feature类型。MTK已经提供了一些常用的Feature,比如美颜、HDR、降噪等,但如果我们要集成新的算法类型,就需要添加自定义Feature。
3.1 现有Feature类型分析
MTK的Feature定义在两个头文件中:mtk_feature_type.h和customer_feature_type.h。MTK自己的Feature使用0-31位,第三方Feature使用32-63位。对于单帧算法,通常可以使用MTK_FEATURE_FB或TP_FEATURE_FB,但为了灵活性,我们一般会添加自定义Feature。
我建议在customer_feature_type.h中添加新Feature,这样不会影响MTK原有的代码结构。比如我们要添加水印Feature,可以这样定义:
enum eFeatureIndexCustomer {
// ... 其他Feature定义
TP_FEATURE_WATERMARK = 1ULL << 46,
};
3.2 添加水印Feature实例
添加完Feature定义后,还需要在多个文件中进行配置。首先在CaptureFeature_Common.cpp的FeatID2Name函数中添加对应的名称映射:
case FID_WATERMARK_3RD_PARTY: return "watermark_3rd_party";
然后在YUVNode.cpp中添加Feature识别逻辑:
else if (rProperty.mFeatures & TP_FEATURE_WATERMARK)
featId = FID_WATERMARK_3RD_PARTY;
接着在ICaptureFeaturePipe.h中添加Feature ID定义:
FID_WATERMARK_3RD_PARTY,
最后在P2_CaptureProcessor.cpp中添加Feature处理逻辑:
if (feature & TP_FEATURE_WATERMARK)
pCapRequest->addFeature(FID_WATERMARK_3RD_PARTY);
这些修改确保了系统能够识别和处理我们新添加的Feature类型。
4. Scenario配置表修改详解
添加了Feature后,还需要将其添加到Scenario配置表中,否则系统不会在相应的场景下启用这个Feature。
4.1 Scenario配置表工作原理
MTK HAL3通过Scenario配置表来决定在什么场景下启用哪些Feature。当相机打开
446



被折叠的 条评论
为什么被折叠?



