[转]FFMPEG源代码简单分析: avcodec_find_decoder()和avcodec_find_encoder()


本文转自:http://blog.csdn.net/leixiaohua1020/article/details/44084557

avcodec_find_encoder用于查找FFMPEG的编码器。

avcodec_find_decoder用于查找FFMPEG的解码器。 HUS中导出功能,就是通过HUS拿到H264/H265/MJPEG等码流后,再调用avcodec_find_decoder解码后,再写入到AVI/MP4文件中去。

 

avcodec_find_encoder()的定义如下:

/**
 * Find a registered encoder with a matching codec ID.
 *
 * @param id AVCodecID of the requested encoder
 * @return An encoder if one was found, NULL otherwise.
 */
AVCodec *avcodec_find_encoder(enum AVCodecID id);

// AVCodecID id  编码器ID
// 如果没有找到,则返回NULL
AVCodec *avcodec_find_encoder(enum AVCodecID id)
{
    return find_encdec(id, 1);
}

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

static AVCodec *find_encdec(enum AVCodecID id, int encoder)
{
    AVCodec *p, *experimental = NULL;
    p = first_avcodec;
    id= remap_deprecated_codec_id(id);
    while (p) {
        if ((encoder ? av_codec_is_encoder(p) : av_codec_is_decoder(p)) &&
            p->id == id) {
            if (p->capabilities & CODEC_CAP_EXPERIMENTAL && !experimental) {
                experimental = p;
            } else
                return p;
        }
        p = p->next;
    }
    return experimental;
}


int av_codec_is_encoder(const AVCodec *codec)
{
    return codec && (codec->encode_sub || codec->encode2);
}

int av_codec_is_decoder(const AVCodec *codec)
{
    return codec && codec->decode;
}

find_encodec()中有一个循环,该循环会遍历AVCodec结构的链表,逐一比较输入的ID和每一个编码器的ID,直到找到ID取值相等的编码器。

在这里有几点需要注意:

1、first_avcodec是一个全局变量,存储AVCodec链表的第一个元素。

2、remap_deprecated_codec_id()用于将一些过时的编码器ID映射到新的编码器ID。

3、函数的第二个参数encoder用于确定查找编码器还是解码器。1 编码器, 0 解码器。

 

av_codec_is_encoder()主要是判断AVCodec是否包含了encode2()或者encode_sub()接口函数。有则说明是编码器。

av_codec_is_decoder()主要是判断AVCodec是否包含了decode()接口函数。有则说明是编码器。

 

avcodec_find_decoder()函数与avcodec_find_encoder()类似。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM