2

私はデコーダーコードを持っています。に統合しようとしていffmpeg frameworkます。

ここにある HOW TO を参照しています: http://wiki.multimedia.cx/index.php?title=FFmpeg_codec_howto

その記事によると、decoder_name.cファイルに構造を定義する必要があります。

構造の例を以下に示します。

AVCodec sample_decoder =
{
    .name           = "sample",
    .type           = AVCODEC_TYPE_VIDEO,
    .id             = AVCODEC_ID_SAMPLE,
   // .priv_data_size = sizeof(COOKContext),
    .init           = sample_decode_init,
    .close          = sample_decode_close,
    .decode         = sample_decode_frame,
};

どこ、

.name -> specifies the short name of my decoder.

.type -> is used to specify that it is a video decoder.

.id -> is an unique id that i'm assigning to my video decoder.

.init -> is a function pointer to the function in my decoder code that performs decoder related initializations

.decode -> is a function pointer to the function in my decoder code that decodes a single frame, given the input data (elementary stream).

.close -> is a function pointer to the function in my decoder that frees all allocated memory i.e. the memory allocated in init.

ただし、上記の記事によると、私の疑問は.priv_data_size、何らかのコンテキストのサイズを保持するという別のフィールドがあるということです。

.priv_data_size上記の記事によると、構造体のすべてのパラメーターを定義する必要はないため、このフィールドを持つことは必須ですかAVCodec。さらに、デコーダーにそのようなコンテキストはありません。

libavcodecただし、 ffmpegの他の利用可能なデコーダーのコードを調べると、すべてのデコーダーがこれを定義していることがわかります。これを指定しない場合、デコーダは機能しますか? このため、先に進むことができません。同じことを評価するガイダンスを提供してください。

- 前もって感謝します。

4

1 に答える 1

3

私はあなたがリンクした MultimediaWiki を管理しており、特に FFmpeg は常に内部インターフェイスを進化させているため、コーデック HOWTO が古くなっていることを証明できます。最新の FFmpeg ソース コードを入手し、いくつかの最も単純なコーデックを調べてインターフェースを理解することから始めるのが最善でしょう (既にこれを行っているように思えます)。

priv_data_size について: これを設定するかどうかは、コーデックが呼び出し間の状態の維持を気にするかどうかに完全に依存します。ほとんどのコーデックはこれを考慮し、MyCodecContext などの名前のメイン ソース ファイルで構造を定義します。次に、sizeof()この構造体が priv_data_size として渡されます。あなたが投稿した例ではsizeof(COOKContext)、この例は明らかに RealAudio COOK コーデック ファイルからコピーされたためです。

ほとんどのコーデックは、ある種の状態 (前のフレームやさまざまなテーブルへのポインターなど) を維持する必要があります。priv_data_size メンバーは、この構造体に割り当てるスペースをコア エンジンに伝え、コアはその構造体をすべてのコーデック呼び出しに渡します。

于 2013-11-28T18:56:32.937 に答える