參考鏈接
-
?FFmpeg源代碼簡單分析:av_find_decoder()和av_find_encoder()_雷霄驊的博客-CSDN博客_avcodec_find_encoder?
avcodec_find_encoder?
- avcodec_find_encoder()用于查找FFmpeg的編碼器
- avcodec_find_encoder()的聲明位于libavcodec\codec.h? 版本差異
- avcodec_find_encoder()的源代碼位于allcodecs.c?? 版本差異
- 函數的參數是一個編碼器的ID,返回查找到的編碼器(沒有找到就返回NULL)
const AVCodec *avcodec_find_encoder(enum AVCodecID id)
{return find_codec(id, av_codec_is_encoder);
}
?avcodec_find_decoder
- avcodec_find_decoder()用于查找FFmpeg的解碼器
- avcodec_find_decoder()的聲明位于libavcodec\codec.h? 版本差異
- avcodec_find_decoder()的源代碼位于allcodecs.c?? 版本差異
-
函數的參數是一個解碼器的ID,返回查找到的解碼器(沒有找到就返回NULL)
const AVCodec *avcodec_find_decoder(enum AVCodecID id)
{return find_codec(id, av_codec_is_decoder);
}
函數調用關系圖
- avcodec_find_encoder()和avcodec_find_decoder()的函數調用關系圖如下所示。
find_encdec()?
- find_encdec()中有一個循環,該循環會遍歷AVCodec結構的鏈表,逐一比較輸入的ID和每一個編碼器的ID,直到找到ID取值相等的編碼器。
- 在這里有幾點需要注意:?
- remap_deprecated_codec_id()用于將一些過時的編碼器ID映射到新的編碼器ID。?
- 版本差異很大
static const AVCodec *find_codec(enum AVCodecID id, int (*x)(const AVCodec *))
{const AVCodec *p, *experimental = NULL;void *i = 0;id = remap_deprecated_codec_id(id);while ((p = av_codec_iterate(&i))) {if (!x(p))continue;if (p->id == id) {if (p->capabilities & AV_CODEC_CAP_EXPERIMENTAL && !experimental) {experimental = p;} elsereturn p;}}return experimental;
}
av_codec_is_encoder()?????????
- av_codec_is_encoder()是一個判斷AVCodec是否為編碼器的函數。如果是編碼器,返回非0值,否則返回0。
-
從源代碼可以看出,av_codec_is_encoder()判斷了一下AVCodec是否包含了encode()或者encode_sub()接口函數。
int av_codec_is_encoder(const AVCodec *avcodec)
{const FFCodec *const codec = ffcodec(avcodec);return codec && (codec->cb_type == FF_CODEC_CB_TYPE_ENCODE ||codec->cb_type == FF_CODEC_CB_TYPE_ENCODE_SUB ||codec->cb_type == FF_CODEC_CB_TYPE_RECEIVE_PACKET);
}
enum FFCodecType {/* The codec is a decoder using the decode callback;* audio and video codecs only. */FF_CODEC_CB_TYPE_DECODE,/* The codec is a decoder using the decode_sub callback;* subtitle codecs only. */FF_CODEC_CB_TYPE_DECODE_SUB,/* The codec is a decoder using the receive_frame callback;* audio and video codecs only. */FF_CODEC_CB_TYPE_RECEIVE_FRAME,/* The codec is an encoder using the encode callback;* audio and video codecs only. */FF_CODEC_CB_TYPE_ENCODE,/* The codec is an encoder using the encode_sub callback;* subtitle codecs only. */FF_CODEC_CB_TYPE_ENCODE_SUB,/* The codec is an encoder using the receive_packet callback;* audio and video codecs only. */FF_CODEC_CB_TYPE_RECEIVE_PACKET,
};
枚舉 FFCodecType {/* 編解碼器是使用解碼回調的解碼器;* 僅限音頻和視頻編解碼器。 */FF_CODEC_CB_TYPE_DECODE,/* 編解碼器是使用 decode_sub 回調的解碼器;* 僅字幕編解碼器。 */FF_CODEC_CB_TYPE_DECODE_SUB,/* 編解碼器是使用接收幀回調的解碼器;* 僅限音頻和視頻編解碼器。 */FF_CODEC_CB_TYPE_RECEIVE_FRAME,/* 編解碼器是使用編碼回調的編碼器;* 僅限音頻和視頻編解碼器。 */FF_CODEC_CB_TYPE_ENCODE,/* 編解碼器是使用 encode_sub 回調的編碼器;* 僅字幕編解碼器。 */FF_CODEC_CB_TYPE_ENCODE_SUB,/* 編解碼器是一個使用 receive_packet 回調的編碼器;* 僅限音頻和視頻編解碼器。 */FF_CODEC_CB_TYPE_RECEIVE_PACKET,
};
av_codec_is_decoder()?????????
- av_codec_is_decoder()是一個判斷AVCodec是否為解碼器的函數。如果是解碼器,返回非0值,否則返回0。
-
從源代碼可以看出,av_codec_is_decoder()判斷了一下AVCodec是否包含了decode()或者decode_sub()接口函數。
int av_codec_is_decoder(const AVCodec *avcodec)
{const FFCodec *const codec = ffcodec(avcodec);return codec && (codec->cb_type == FF_CODEC_CB_TYPE_DECODE ||codec->cb_type == FF_CODEC_CB_TYPE_DECODE_SUB ||codec->cb_type == FF_CODEC_CB_TYPE_RECEIVE_FRAME);
}
enum FFCodecType {/* The codec is a decoder using the decode callback;* audio and video codecs only. */FF_CODEC_CB_TYPE_DECODE,/* The codec is a decoder using the decode_sub callback;* subtitle codecs only. */FF_CODEC_CB_TYPE_DECODE_SUB,/* The codec is a decoder using the receive_frame callback;* audio and video codecs only. */FF_CODEC_CB_TYPE_RECEIVE_FRAME,/* The codec is an encoder using the encode callback;* audio and video codecs only. */FF_CODEC_CB_TYPE_ENCODE,/* The codec is an encoder using the encode_sub callback;* subtitle codecs only. */FF_CODEC_CB_TYPE_ENCODE_SUB,/* The codec is an encoder using the receive_packet callback;* audio and video codecs only. */FF_CODEC_CB_TYPE_RECEIVE_PACKET,
};