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