avplayer 分析

来源:互联网 发布:装修报价软件 编辑:程序博客网 时间:2024/04/17 07:16

codec register 分析:

.....    REGISTER_ENCDEC (H261,              h261);    REGISTER_ENCDEC (H263,              h263);    REGISTER_DECODER(H263I,             h263i);    REGISTER_ENCODER(H263P,             h263p);    REGISTER_DECODER(H264,              h264);    REGISTER_DECODER(HEVC,              hevc);...
register 宏的使用中注意  ## 宏拼接的使用
    #define REGISTER_DECODER(X, x)                                      \    {                                                                   \        extern AVCodec ff_##x##_decoder;                                \        if (CONFIG_##X##_DECODER)                                       \            avcodec_register(&ff_##x##_decoder);                        \    }
first_avcodec的定义 

/* encoder management */
static AVCodec *first_avcodec = NULL;

first_avcodec是链表头指针,需要将codec加入到链表尾部。此处的查找方法与常规方法有点差异,效率比较高,节省了很多判断语句。

av_cold void avcodec_register(AVCodec *codec){    AVCodec **p;    avcodec_init();    p = &first_avcodec;    while (*p)        p = &(*p)->next;    *p          = codec;    codec->next = NULL;    if (codec->init_static_data)        codec->init_static_data(codec);}

遍历avcodec的方法

AVCodec *av_codec_next(const AVCodec *c){    if (c)        return c->next;    else        return first_avcodec;}

parser register 的分析:

#define REGISTER_PARSER(X, x)                                           \    {                                                                   \        extern AVCodecParser ff_##x##_parser;                           \        if (CONFIG_##X##_PARSER)                                        \            av_register_codec_parser(&ff_##x##_parser);                 \    }
这个插入新parser的方式是用前插入的方法
void av_register_codec_parser(AVCodecParser *parser){    parser->next = av_first_parser;    av_first_parser = parser;}




0 0
原创粉丝点击