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