ffmpeg avformat

ffmpeg也就是定义接口:函数

AVInputFormat。code

找了一个简单的例子,orm

static const AVClass sln_demuxer_class = {
    .class_name = "sln demuxer",
    .item_name  = av_default_item_name,
    .option     = sln_options,
    .version    = LIBAVUTIL_VERSION_INT,
};对象

AVInputFormat ff_sln_demuxer = {
    .name           = "sln",
    .long_name      = NULL_IF_CONFIG_SMALL("Asterisk raw pcm"),
    .priv_data_size = sizeof(PCMAudioDemuxerContext),
    .read_header    = pcm_read_header,
    .read_packet    = ff_pcm_read_packet,
    .read_seek      = ff_pcm_read_seek,
    .flags          = AVFMT_GENERIC_INDEX,
    .extensions     = "sln",
    .raw_codec_id   = AV_CODEC_ID_PCM_S16LE,
    .priv_class     = &sln_demuxer_class,
};接口

随后我想看看这个符号 ff_sln_demuxer 是如何加到一个容器在中,猜想用有一个列表或者字典把全部的AVInputFormat对象管理起来。搜索一下符号 ff_sln_demuxer 发现没有,input

非常奇怪。it


#define REGISTER_DEMUXER(X, x)                                          \
    {                                                                   \
        extern AVInputFormat ff_##x##_demuxer;                          \
        if (CONFIG_##X##_DEMUXER)                                       \
            av_register_input_format(&ff_##x##_demuxer);                \
    }io

最后在函数void av_register_all(void)中找到了对 REGISTER_DEMUXER 定义,form

这个用extern AVInputFormat  ff_ ##x##_demuxer ; 拼出来名字。class

ff_sln_demuxer

    REGISTER_DEMUXER (SLN,              sln);

对宏的适当运用少了好多啰嗦代码。

相关文章
相关标签/搜索