本文轉自: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()類似。