ffmpeg注册复用器,编码器等的函数av_register_all()。该函数在所有基于ffmpeg的应用程序中几乎都是第一个被调用的。只有调用了该函数,才能使用复用器,编码器等。
可见解复用器注册都是用
REGISTER_DEMUXER (X,x)
例如:
REGISTER_DEMUXER (AAC, aac)
可见复用器注册都是用
REGISTER_MUXER (X,x))
例如:
REGISTER_MUXER (ADTS, adts)
既有解复用器又有复用器的话,可以用
REGISTER_MUXDEMUX (X,x));
例如:
REGISTER_MUXDEMUX (AC3, ac3);
我们来看一下宏的定义,这里以解复用器为例:
py
#define REGISTER_DEMUXER(X,x) { \
extern AVInputFormat ff_##x##_demuxer; \
if(CONFIG_##X##_DEMUXER) av_register_input_format(&ff_##x##_demuxer); }
注意:define里面的##可能不太常见,它的含义就是拼接两个字符串,比如
#define Conn(x,y) x##y
那么
int n = Conn(123,456); 结果就是n=123456;
我们以REGISTER_DEMUXER (AAC, aac)为例,则它等效于
py
extern AVInputFormat ff_aac_demuxer;
if(CONFIG_AAC_DEMUXER) av_register_input_format(&ff_aac_demuxer);
从上面这段代码我们可以看出,真正注册的函数是av_register_input_format(&ff_aac_demuxer),那我就看看这个和函数的作用,查看一下av_register_input_format()的代码:
py
void av_register_input_format(AVInputFormat *format)
{
AVInputFormat **p;
p = &first_iformat;
while (*p != NULL) p = &(*p)->next;
*p = format;
format->next = NULL;
}
这段代码是比较容易理解的,首先先提一点,first_iformat是个什么东东呢?其实它是Input Format链表的头部地址,是一个全局静态变量,定义如下:
py
/** head of registered input format linked list */
static AVInputFormat *first_iformat = NULL;
由此我们可以分析出av_register_input_format()的含义,一句话概括就是:遍历链表并把当前的Input Format加到链表的尾部。
至此REGISTER_DEMUXER (X, x)分析完毕。
同理,复用器道理是一样的,只是注册函数改为av_register_output_format();
既有解复用器又有复用器的话,有一个宏定义:
py
#define REGISTER_MUXDEMUX(X,x) REGISTER_MUXER(X,x); REGISTER_DEMUXER(X,x)
可见是分别注册了复用器和解复用器。
此外还有网络协议的注册,注册函数为ffurl_register_protocol(),在此不再详述。
整个代码没太多可说的,首先确定是不是已经初始化过了(initialized),如果没有,就调用avcodec_register_all()注册编解码器(这个先不分析),然后就是注册,注册,注册...直到完成所有注册。