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);

對宏的適當運用少了好多囉嗦代碼。

相關文章
相關標籤/搜索