1.muxer/demuxer和ecoder/decoder在代码实现上有很多相同的地方,但是最大的差别是:
muxer/demuxer使用的结构是AVInputFormat/AVOutputFormat
encoder/decoder用的是AVCodec结构
muxer/demuxer和ecoder/decoder相同的地方有:
1>都是在av_register_all()中初始化的。
2>都是以链表的形式保存在全局变量中
muxer/demuxer分别保存在全局变量AVOutputForamt *first_oformat和
AVInputFormat *first_iforst中
encoder/decoder都是保存在全局变量AVCodec *first_avcodec中。
以flv格式为例:
av_regeister_all()进行如下的操纵:将支持flv格式的flv_muxer和flv_demuxer变量分别注册到全局变量first_oformat和first_iformat链表的最后位置。
下面是具体的代码:
REGISTER_MUXDEMUX(FLV, flv);//
#define REGISTER_MUXDEMUX(FLV, flv) REGISTER_MUXER(FLV, flv); REGISTER_DEMUXER(FLB, x)
#define REGISTER_MUXER(X, x)//REGISTER_MUXER(FLV, flv) \
{ \
extern AVOutputFormat ff_flv_muxer; //建立一个对象,将该对象保存到链表的尾部 \
if (CONFIG_FLV_MUXER) \
av_register_output_format(&ff_flv_muxer); \
}
libavformat文件中的Format.c中有两个全局变量:
/** head of registered input format linked list */
static AVInputFormat *first_iformat = NULL;//链表的头
/** head of registered output format linked list */
static AVOutputFormat *first_oformat = NULL;//head
static AVInputFormat **last_iformat = &first_iformat;//链表的尾
static AVOutputFormat **last_oformat = &first_oformat;//链表的尾
void av_register_output_format(AVOutputFormat *format)
{
AVOutputFormat **p = last_oformat;
format->next = NULL;
/*遍历链表,初次调用的时候会令first_oformat指向format*/
while(*p || avpriv_atomic_ptr_cas((void * volatile *)p, NULL, format))
p = &(*p)->next;
last_oformat = &format->next; //(->为1级优先级,&为2级)
}
void *avpriv_atomic_ptr_cas(void * volatile *ptr, void *oldval, void *newval)
{
if (*ptr == oldval) {
*ptr = newval;
return oldval;
}
return *ptr;
}
同理:解复用也是一样的道理!
2.
av_register_all()中的avcodec_register_all()的分析:
通过该函数初始化encoder/decoder。
并不是每种编码方式都支持encode和decode,所以有以下三种注册方式:
#define REGISTER_ENCODER(FLV, flv) \
{