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