1. av_register_all
a. 其作用就是注册: 注册protocol, 注册muxer,注册demuxer
b. 注册的过程就是把所有的protocol串成一条链表
把所有的muxer串成一条链表
把所有的demuxer串成一条链表
c. 访问链表的成员,只能靠遍历
2. 以下面两个为例说明一下链表的注册过程
REGISTER_PROTOCOL(FILE, file);
REGISTER_MUXDEMUX(MATROSKA, matroska);
2.1 注册的过程
REGISTER_PROTOCOL(FILE, file);
-
#define REGISTER_PROTOCOL(X, x) \
-
{ \
-
extern URLProtocol ff_##x##_protocol; \
-
if (CONFIG_##X##_PROTOCOL) \
-
ffurl_register_protocol(&ff_##x##_protocol); \
-
}
-
REGISTER_PROTOCOL(FILE, file)
-
{
-
extern URLProtocol ff_file_protocol;
-
if(CONFIG_FILE_PROTOCOL)
-
ffurl_register_protocol(&ff_file_protocol);
-
}
2.2
REGISTER_MUXDEMUX(MATROSKA, matroska);
-
#define REGISTER_MUXDEMUX(X, x) REGISTER_MUXER(X, x); REGISTER_DEMUXER(X, x)
-
#define REGISTER_MUXER(X, x) \
-
{ \
-
extern AVOutputFormat ff_##x##_muxer; \
-
if (CONFIG_##X##_MUXER) \
-
av_register_output_format(&ff_##x##_muxer); \
-
}
-
-
-
#define REGISTER_DEMUXER(X, x) \
-
{ \
-
extern AVInputFormat ff_##x##_demuxer; \
-
if (CONFIG_##X##_DEMUXER) \
-
av_register_input_format(&ff_##x##_demuxer); \
-
}
-
即:
-
-
#define REGISTER_MUXER(X, x) \
-
{ \
-
extern AVOutputFormat ff_matroska_muxer; \
-
if (CONFIG_MATROSKA_MUXER) \
-
av_register_output_format(&ff_matroska_muxer); \
-
}
-
-
-
#define REGISTER_DEMUXER(X, x) \
-
{ \
-
extern AVInputFormat ff_matroska_demuxer; \
-
if (CONFIG_MATROSKA_DEMUXER) \
-
av_register_input_format(&ff_matroska_demuxer); \
-
}
2.3 尾插法建立链表
static AVInputFormat **last_iformat = &first_iformat;
-
void av_register_input_format(AVInputFormat *format)
-
{
-
AVInputFormat **p = last_iformat;
-
-
format->next = NULL; //保证链表的结束标志是NULL
-
while(*p || avpriv_atomic_ptr_cas((void * volatile *)p, NULL, format))
-
p = &(*p)->next;
-
last_iformat = &format->next; //将format插入到链表的尾部
-
}
这个函数的作用是将InputFormat插入带头结点first_iformat的单链表尾部
2.4使用即遍历链表
-
AVInputFormat *av_find_input_format(const char *short_name)
-
{
-
AVInputFormat *fmt = NULL;
-
while ((fmt = av_iformat_next(fmt))) //顺次查找
-
if (av_match_name(short_name, fmt->name))
-
return fmt;
-
return NULL;
-
}
protocol与oformat与iformat都是一样的
2.5最后如下图所示
2.6 avcodec_register_all
REGISTER_HWACCEL
REGISTER_ENCODER
REGISTER_PARSER
REGISTER_BSF
跟上面的是一样的数据结构,略过
阅读(1758) | 评论(0) | 转发(0) |