ffmpeg也就是定义接口:
AVInputFormat。
找了一个简单的例子,
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 发现没有,
很是奇怪。
#define REGISTER_DEMUXER(X, x) \
{ \
extern AVInputFormat ff_##x##_demuxer; \
if (CONFIG_##X##_DEMUXER) \
av_register_input_format(&ff_##x##_demuxer); \
}
最后在函数void av_register_all(void)中找到了对 REGISTER_DEMUXER 定义,
这个用extern AVInputFormat ff_ ##x##_demuxer ; 拼出来名字。
ff_sln_demuxer
REGISTER_DEMUXER (SLN, sln);
对宏的适当运用少了好多啰嗦代码。