音视频开发-FFplay视频播放流程( 六 )

反初始化部分
反初始化部分比较简单 , 就是先通知avcodec进行flush数据 , 然后依次释放AVFilterGraph、AVPacket和AVFrame 。
video_thread讲解的比较粗糙 , 主要原因还是由于个人了解的知识有所欠缺 , 后续有机会会补上 。
主线程
主流程用于视频图像显示和刷新 , 实际上还主线程是一个事件驱动的 , 就是一个wait_event然后switch处理 , 然后继续for循环 。
refresh_loop_wait_event处理
该函数会从event队列中读取出event , SDL_PumpEvents、SDL_PeepEvents 。同时会调用video_refresh来进行视频刷新和显示 。此处会有大量和SDL API相关的操作 , 由于个人能力有限暂不分析 。
event的switch处理
该event的处理分为以下几类:

  • SDL_KEYDOWN键盘按键事件
  • SDL_VIDEOEXPOSE屏幕重画事件
  • SDL_MOUSEBUTTONDOWN鼠标按下事件 , 如果启动ffplay时有exitonmousedown参数 , 会相应鼠标按下事件 , 然后退出播放;
  • SDL_MOUSEMOTION鼠标移动事件 , 主要seek操作
  • SDL_VIDEORESIZE视频大小变化事件 , 比如视频中间会出现大小变化 , 会触发该事件
  • SDL_QUIT、FF_QUIT_EVENT退出事件 , 如read_thread中出现各种异常会发送该消息
  • FF_ALLOC_EVENT事件比较特殊 , 如代码中的注释“ifthe queue is aborted, we have to pop the pending ALLOC event or wait for theallocation to complete” , 该消息是video_thread中的发出的消息
总结由于时间有限 , 文章有些虎头蛇尾 , 还请各位谅解 。




推荐阅读