[轉]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