我要在嵌入式设备中移植h264
编解码器。 ffmpeg源代码使用以下结构:
#undef CHROMA_IDC
#define CHROMA_IDC 3
#include "h264_mc_template.c"
static av_noinline void FUNC(hl_decode_mb_444)(const H264Context *h, H264SliceContext *sl)
{
...
}
为什么我需要包含这样的源文件?不仅仅用于标题吗?
答案 0 :(得分:4)
“模板”后缀暗示代码依赖于某些预处理程序指令。
我检查了source,并在开始时检查了
#if CHROMA_IDC == 1
# define MCFUNC(n) FUNC(n ## _420)
#elif CHROMA_IDC == 2
# define MCFUNC(n) FUNC(n ## _422)
#elif CHROMA_IDC == 3
# define MCFUNC(n) FUNC(n ## _444)
#endif
请注意,之前的#define CHROMA_IDC 3
包含此文件。
这告诉预处理器在包含的文件中使用define MCFUNC(n) FUNC(n ## _444)
。
源可以单独留在makefile中但是带有-DCHROMA_IDC=3
指令,在这种情况下,由于多次重新定义,模板不能重复用于其他源文件(此源文件中的函数为static
,以避免多次重新定义(如果模板多次实例化)
为什么要使用模板?可能是出于性能问题,避免调用链和一些测试来分支所需的行为。 ffmpeg
无法承受编码功能的慢速。