ffplay源码剖析(3.2.4 + sdl2)(1):函数调用流程图
2017-07-05 11:54
211 查看
最近在学习ffplay的源码知识,网上关于ffplay的都是老版本的基于sdl1.x版本的,于是自己结合自己的理解分析了一下ffpaly3.2.4(基于sdl2)的源码,并记录下来供自己以后查阅。如果有理解错误,还请指正。
avdevice_register_all()这ffmpeg设备进行初始化与注册。
av_register_all()初始化 libavformat和注册所有的muxers、demuxers和protocols。
avformat_network_init()注册与初始化网络相关的网络传输协议。
init_opts()初始化命令行选项。
show_banner()显示视频信息。
parse_options()解析命令行参数。
SDL_Init()初始化SDL。
stream_open()打开视频进行处理。
event_loop()显示视频并且捕获相关sdl事件。
解复用线程: read_thread ——> av_read_frame ——> packet_queue_put
音频解码线程: audio_thread ——> decoder_decode_frame ——> frame_queue_push
视频解码线程:video_thread ——> get_video_frame ——> queue_picture
字幕解码线程:subtitile_thread ——> decoder_decode_frame ——> frame_queue_push
显示线程: event_loop ——> refresh_loop_wait_event ——> video_refresh ——> video_display
步骤:
ffplay先调用read_thread函数进行解复用,然后将解复用后的数据包存放到PacketQueue中,同时创建三个解码线程。
三个解码线程分别从各自的PacketQueue中取出AVPacket数据进行解码,得到AVFrame帧数据,然后将解码帧存放到FrameQueue中。
显示线程从FrameQueue中取出AVFrame帧数据,然后调用SDL进行显示。
1、总体框架:
ffmpeg3.2.4版本中的ffplay的函数调用图如下所示:avdevice_register_all()这ffmpeg设备进行初始化与注册。
av_register_all()初始化 libavformat和注册所有的muxers、demuxers和protocols。
avformat_network_init()注册与初始化网络相关的网络传输协议。
init_opts()初始化命令行选项。
show_banner()显示视频信息。
parse_options()解析命令行参数。
SDL_Init()初始化SDL。
stream_open()打开视频进行处理。
event_loop()显示视频并且捕获相关sdl事件。
2、ffpaly线程
ffplay中一共有5个线程,一个解复用线程,三个解码线程,和一个显示线程。解复用线程: read_thread ——> av_read_frame ——> packet_queue_put
音频解码线程: audio_thread ——> decoder_decode_frame ——> frame_queue_push
视频解码线程:video_thread ——> get_video_frame ——> queue_picture
字幕解码线程:subtitile_thread ——> decoder_decode_frame ——> frame_queue_push
显示线程: event_loop ——> refresh_loop_wait_event ——> video_refresh ——> video_display
步骤:
ffplay先调用read_thread函数进行解复用,然后将解复用后的数据包存放到PacketQueue中,同时创建三个解码线程。
三个解码线程分别从各自的PacketQueue中取出AVPacket数据进行解码,得到AVFrame帧数据,然后将解码帧存放到FrameQueue中。
显示线程从FrameQueue中取出AVFrame帧数据,然后调用SDL进行显示。
相关文章推荐
- ffplay源码剖析(3.2.4 + sdl2)(2):初始化与解复用
- ffplay源码剖析(3.2.4 + sdl2)(3):解码
- boost源码剖析之:泛型函数指针类boost::function(rev#3)
- 通过内核源码看函数调用之前世今生(转载)
- jQuery 源码剖析-3 init 函数分析
- boost源码剖析之:泛型函数指针类boost::function(rev#3)
- nginx源码剖析(2)----从main()函数开始
- Boost源码剖析:泛型函数指针类boost::function(修订版)
- ffmpeg/ffplay vc6 源码剖析||Win7下SDL环境搭建---用于ffplay
- C调用Python函数相关代码示例剖析
- jQuery.API源码深入剖析以及应用实现(1) - 核心函数篇
- Linux进程间通信源码剖析,共享内存(shmget函数详解)
- 第二人生的源码分析(二十二)调用OpenGL显示人物名称的函数
- boost源码剖析之:泛型函数指针类boost::function(rev#3)
- boost源码剖析之:泛型函数指针类boost::function(rev#3)
- STL 源码剖析 笔记 1: 函数指针和类型
- 通过内核源码看函数调用之前世今生
- boost源码剖析之:泛型函数指针类boost::function(rev#3)
- 蔡军生先生第二人生的源码分析(二十二)调用OpenGL显示人物名称的函数
- jQuery 源码剖析-5 size,get 函数说明