FFMPEG:是否必须为编解码器定义上下文?

时间:2013-11-28 06:51:07

标签: video ffmpeg libavcodec decoder libavformat

我有一个解码器代码。我正在尝试将其整合到ffmpeg framework

我指的是这里给出的如何: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的所有参数。此外,我的解码器没有任何此类背景。

然而,当我浏览ffmpeg的libavcodec中的其他可用解码器的代码时,我发现每个解码器都定义了这个。如果我没有指定,我的解码器会工作吗?因为这个原因,我无法继续。请提供一些相同的指导。

- 提前致谢。

1 个答案:

答案 0 :(得分:3)

我维护您链接的MultimediaWiki,我可以证明编解码器HOWTO已经过时,特别是因为FFmpeg总是在不断改进其内部接口。最好通过获取最新的FFmpeg源代码并研究一些最简单的编解码器来了解界面(听起来就像你已经这样做了)。

关于priv_data_size:你是否设置这完全取决于你的编解码器是否关心在调用之间维护任何状态。大多数编解码器关心这一点,并在其主要源文件中定义一个名为MyCodecContext的结构。然后sizeof()此结构作为priv_data_size传递。在您发布的示例中,它是sizeof(COOKContext),因为此示例已从RealAudio COOK编解码器文件中明确复制。

大多数编解码器需要维护某种状态(比如指向前一帧或各种表的指针)。 priv_data_size成员告诉核心引擎为这个结构分配多少空间,然后核心将该结构传递给所有编解码器调用。