为什么可能需要包含一个源文件?

时间:2017-12-13 12:04:37

标签: c

我要在嵌入式设备中移植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)
{
    ...
}

为什么我需要包含这样的源文件?不仅仅用于标题吗?

1 个答案:

答案 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无法承受编码功能的慢速。