Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2117421
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2016-04-13 12:02:25

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);
  1. #define REGISTER_PROTOCOL(X, x) \
  2.   { \
  3.       extern URLProtocol ff_##x##_protocol; \
  4.       if (CONFIG_##X##_PROTOCOL) \
  5.           ffurl_register_protocol(&ff_##x##_protocol); \
  6.   }
  7. REGISTER_PROTOCOL(FILE, file)
  8. {
  9. extern URLProtocol ff_file_protocol;
  10. if(CONFIG_FILE_PROTOCOL)
  11.    ffurl_register_protocol(&ff_file_protocol);
  12. }
2.2 
REGISTER_MUXDEMUX(MATROSKA,         matroska);
  1. #define REGISTER_MUXDEMUX(X, x) REGISTER_MUXER(X, x); REGISTER_DEMUXER(X, x)
  2. #define REGISTER_MUXER(X, x) \
  3.     { \
  4.         extern AVOutputFormat ff_##x##_muxer; \
  5.         if (CONFIG_##X##_MUXER) \
  6.             av_register_output_format(&ff_##x##_muxer); \
  7.     }


  8. #define REGISTER_DEMUXER(X, x) \
  9.     { \
  10.         extern AVInputFormat ff_##x##_demuxer; \
  11.         if (CONFIG_##X##_DEMUXER) \
  12.             av_register_input_format(&ff_##x##_demuxer); \
  13.     }
  14. 即:

  15. #define REGISTER_MUXER(X, x) \
  16.     { \
  17.         extern AVOutputFormat ff_matroska_muxer; \
  18.         if (CONFIG_MATROSKA_MUXER) \
  19.             av_register_output_format(&ff_matroska_muxer); \
  20.     }


  21. #define REGISTER_DEMUXER(X, x) \
  22.     { \
  23.         extern AVInputFormat ff_matroska_demuxer; \
  24.         if (CONFIG_MATROSKA_DEMUXER) \
  25.             av_register_input_format(&ff_matroska_demuxer); \
  26.     }
2.3  尾插法建立链表
static AVInputFormat **last_iformat = &first_iformat;
  1. void av_register_input_format(AVInputFormat *format)
  2. {
  3.     AVInputFormat **p = last_iformat;

  4.     format->next = NULL;               //保证链表的结束标志是NULL
  5.     while(*p || avpriv_atomic_ptr_cas((void * volatile *)p, NULL, format))
  6.         p = &(*p)->next;
  7.     last_iformat = &format->next;     //将format插入到链表的尾部
  8. }
这个函数的作用是将InputFormat插入带头结点first_iformat的单链表尾部
2.4使用即遍历链表
  1. AVInputFormat *av_find_input_format(const char *short_name)
  2. {
  3.     AVInputFormat *fmt = NULL;
  4.     while ((fmt = av_iformat_next(fmt)))     //顺次查找
  5.         if (av_match_name(short_name, fmt->name))
  6.             return fmt;
  7.     return NULL;
  8. }
protocol与oformat与iformat都是一样的
2.5最后如下图所示


2.6 avcodec_register_all
REGISTER_HWACCEL
REGISTER_ENCODER
REGISTER_PARSER
REGISTER_BSF
跟上面的是一样的数据结构,略过
阅读(1683) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~