2017-12-13 9 views
2

埋め込みデバイスに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) 
{ 
    ... 
} 

なぜこのようなソースファイルを含める必要がありますか?それはヘッダーのためだけに使用されていませんか?

+2

なぜCファイルが含まれているのですか?質問は私のために理解するのは少し難しいです、私は恐れています。 – unwind

+0

'h264_mc_template.c'は' CHROMA_IDC'に依存しなければならないので、適切なコードを生成するためにインクルードが必要です。 –

+0

なぜ、ソースファイルが含まれているのか? –

答えて

4

「テンプレート」サフィックスは、コードがいくつかのプリプロセッサディレクティブに依存していることを示唆しています。

私はsourceをチェックし、最初にあなたがこのファイルを含む前#define CHROMA_IDC 3を持って

#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 MCFUNC(n) FUNC(n ## _444)を使用するようにプリプロセッサに指示します。このソースファイル内の関数はstaticにある(なぜなら、複数の再定義の

ソースメイクファイルではなく-DCHROMA_IDC=3ディレクティブで放置されている可能性があり、その場合には、テンプレートは、他のソースファイル用に再利用することはできませんテンプレートが複数回インスタンス化されている場合、複数の再定義を避ける)

テンプレートを使用する理由は?おそらくパフォーマンス問題のために、コールチェーンといくつかのテストが必要な動作に分岐するのを避けるためです。 ffmpegは、エンコーディング関数の処理速度が遅くならない。

関連する問題