ffplay源码剖析(3.2.4 + sdl2)(1):函数调用流程图

        最近在学习ffplay的源码知识,网上关于ffplay的都是老版本的基于sdl1.x版本的,于是自己结合自己的理解分析了一下ffpaly3.2.4(基于sdl2)的源码,并记录下来供自己以后查阅。如果有理解错误,还请指正。

1、总体框架:

        ffmpeg3.2.4版本中的ffplay的函数调用图如下所示:

ffplay源码剖析(3.2.4 + sdl2)(1):函数调用流程图

        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进行显示。