avplayer 分析

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;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章