FFmpeg源代码简单分析-通用-av_find_decoder()和av_find_encoder()

参考链接

  •  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,
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

post方法就反回了一个string字符串前台怎么接_Golang Web入门(2):如何实现一个RESTful风格的路由...

摘要在上一篇文章中,我们聊了聊在Golang中怎么实现一个Http服务器。但是在最后我们可以发现,固然DefaultServeMux可以做路由分发的功能,但是他的功能同样是不完善的。由DefaultServeMux做路由分发,是不能实现RESTful风格的API的&a…

FFmpeg源代码简单分析-通用-avcodec_open2()

参考链接 FFmpeg源代码简单分析:avcodec_open2()_雷霄骅的博客-CSDN博客 avcodec_open2() 该函数用于初始化一个音视频编解码器的AVCodecContextavcodec_open2()的声明位于libavcodec\avcodec.h,如下所示。 /*** Initialize the AVCodecContext to use…

统计MySQL中某数据库硬盘占用量大小

放码过来 select TABLE_NAME, concat(truncate(data_length/1024/1024,2), MB) as data_size, concat(truncate(index_length/1024/1024,2), MB) as index_size from information_schema.tables where TABLE_SCHEMA your_db_name order by data_length desc;运行结果 参考…

FFmpeg源代码简单分析-解码-打开媒体的函数avformat_open_input

参考链接 图解FFMPEG打开媒体的函数avformat_open_input_雷霄骅的博客-CSDN博客_avformat_open_input 使用FFmpeg源代码简单分析:avformat_open_input()_雷霄骅的博客-CSDN博客_avformat_open_input() avformat_open_input FFmpeg打开媒体的的过程开始于avformat_…

redis session java获取attribute_面试题:给我说说你能想到几种分布式session实现?...

作者:yanglbme 来源:https://github.com/doocs/advanced-java/blob/master/docs/distributed-system/distributed-session.md# 面试官心理分析面试官问了你一堆 dubbo 是怎么玩儿的,你会玩儿 dubbo 就可以把单块系统弄成分布式系统&#xff0…

FFmpeg源代码简单分析-解码-avformat_find_stream_info()

参考链接 FFmpeg源代码简单分析:avformat_find_stream_info()_雷霄骅的博客-CSDN博客_avformat_find_stream_info avformat_find_stream_info() ​该函数可以读取一部分视音频数据并且获得一些相关的信息avformat_find_stream_info()的声明位于libavformat\avform…

Tail Recursion尾递归

什么是尾递归 Tail Recursion /teɪl rɪˈkɜːrʒn/ In traditional recursion, the typical model is that you perform your recursive calls first, and then you take the return value of the recursive call and calculate the result. In this manner, you don’t g…

FFmpeg源代码简单分析-解码-av_read_frame()

参考链接 ffmpeg 源代码简单分析 : av_read_frame()_雷霄骅的博客-CSDN博客_ffmpeg frame av_read_frame() ffmpeg中的av_read_frame()的作用是读取码流中的音频若干帧或者视频一帧。例如,解码视频的时候,每解码一个视频帧,需要…

FFmpeg源代码简单分析-解码-avformat_close_input()

参考链接 FFmpeg源代码简单分析:avformat_close_input()_雷霄骅的博客-CSDN博客_avformat_close_input avformat_close_input() 本文简单分析FFmpeg的avformat_close_input()函数。该函数用于关闭一个AVFormatContext,一般情况下是和avformat_open_inp…

FFmpeg源代码简单分析-编码-avformat_alloc_output_context2()

参考链接 FFmpeg源代码简单分析:avformat_alloc_output_context2()_雷霄骅的博客-CSDN博客_avformat_alloc_context avformat_alloc_output_context2() 在基于FFmpeg的视音频编码器程序中,该函数通常是第一个调用的函数(除了组件注册函数av…

FFmpeg源代码简单分析-编码-avformat_write_header()

参考链接 FFmpeg源代码简单分析:avformat_write_header()_雷霄骅的博客-CSDN博客_avformat_write_header avformat_write_header() FFmpeg写文件用到的3个函数:avformat_write_header(),av_write_frame()以及av_write_trailer()其中av_writ…

《深入理解JVM.2nd》笔记(二):Java内存区域与内存溢出异常

文章目录概述运行时数据区域程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存HotSpot虚拟机对象探秘对象的创建第一步第二步第三步第四步最后一脚对象的内存布局对象头Header第一部分第二部分实例数据Instance对齐填充Padding对象的访问定位句柄直接指针对象…

《深入理解JVM.2nd》笔记(三):垃圾收集器与垃圾回收策略

文章目录概述对象已死吗引用计数算法可达性分析算法再谈引用finalize():生存还是死亡回收方法区垃圾收集算法标记-清除算法复制算法标记-整理算法分代收集算法HotSpot的算法实现枚举根结点安全点安全区域垃圾收集器SerialParNewParallel ScavengeSerial OldParallel…

FFmpeg源代码简单分析-编码-av_write_frame()

参考链接 FFmpeg源代码简单分析:av_write_frame()_雷霄骅的博客-CSDN博客_av_write_frame av_write_frame() av_write_frame()用于输出一帧视音频数据,它的声明位于libavformat\avformat.h,如下所示。 /*** Write a packet to an output me…

《深入理解JVM.2nd》笔记(四):虚拟机性能监控与故障处理工具

文章目录概述JDK的命令行工具jps:虚拟机进程状况工具jstat:虚拟机统计信息监视工具jinfo:Java配置信息工具jmap:Java内存映像工具jhat:虚拟机堆转储快照分析工具jstack:Java堆栈跟踪工具HSDIS:J…

FFmpeg源代码简单分析-编码-av_write_trailer()

参考链接: FFmpeg源代码简单分析:av_write_trailer()_雷霄骅的博客-CSDN博客_av_malloc av_write_trailer() av_write_trailer()用于输出文件尾,它的声明位于libavformat\avformat.h,如下所示 /*** Write the stream trailer to…

FFmpeg源代码简单分析-其他-日志输出系统(av_log()等)

参考链接 FFmpeg源代码简单分析:日志输出系统(av_log()等)_雷霄骅的博客-CSDN博客_ffmpeg源码分析 日志输出系统(av_log()等) 本文分析一下FFmpeg的日志(Log)输出系统的源代码。日志输出部分的…

FFmpeg源代码简单分析-其他-AVClass和AVoption

参考链接 FFmpeg源代码简单分析:结构体成员管理系统-AVClass_雷霄骅的博客-CSDN博客FFmpeg源代码简单分析:结构体成员管理系统-AVOption_雷霄骅的博客-CSDN博客 概述 AVOption用于在FFmpeg中描述结构体中的成员变量。它最主要的作用可以概括为两个字&a…

FFmpeg源代码简单分析-其他-libswscale的sws_getContext()

参考链接 FFmpeg源代码简单分析:libswscale的sws_getContext()_雷霄骅的博客-CSDN博客 libswscale的sws_getContext() FFmpeg中类库libswsscale用于图像处理(缩放,YUV/RGB格式转换)libswscale是一个主要用于处理图片像素数据的类…

FFmpeg源代码简单分析-其他-libswscale的sws_scale()

参考链接 FFmpeg源代码简单分析:libswscale的sws_scale()_雷霄骅的博客-CSDN博客_bad dst image pointers libswscale的sws_scale() FFmpeg的图像处理(缩放,YUV/RGB格式转换)类库libswsscale中的sws_scale()函数。libswscale是一…