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);
對宏的適當運用少了好多囉嗦代碼。