ffmpeg中的帧级并行解码

  ffmpeg中有两种并行解码的模式:帧级别并行和帧内的并行,一般说来,帧级并行是最主要的并行解码模式,本文着重介绍这种模式。

帧级并行解码概念

  所谓帧级并行,就是指在解码时,将时间上相邻的一系列帧同时进行解码,从而充分利用CPU资源,在相同时间解码出更多帧来。从测试看来,目前ffmpeg2.1中使用四个线程同时解码的帧率能达到单线程的2倍以上。

如何进行帧级并行

一、几种帧类型:    

  视频编码主要包含三种帧类型:I、P和B帧。 
  I帧称为帧内编码帧,I帧的解码不需要依赖时间上相邻的其他帧,可以做到独立解码。
  P、B帧为帧间编码帧,需要依赖时间上相邻的已解码帧作为参考,不能独立解码。
图1、 I、P和B帧概念

二、帧级并行解码过程:

  为了阐述简单,这里先假设有两个线程同时解码,更多线程可以以此类推,分两种情况:
  1. 两个线程同时解码两个I帧: 这种情况很简单,两个线程在初始化好参数之后,就可以互不干扰进行解码,直到解码完成。
  2. 第二个线程解码的帧参考了第一个线程的解码帧:这种情况最为常见,是多线程解码需要解决的关键问题。
     P帧在解码一个块时,通过解析码流,可以得到块的运动矢量,运动矢量确定了P帧中当前的块参考到的 I 帧的块的对应位置,如下图2中所示,黑块表示当前P帧正在解码的块,黄色的块表示参考到的I帧中的块。
图2、 P帧参考I帧示意图

     比如一个线程解码图1中的I帧,一个线程解码图1中的P帧,P帧依赖I帧,此时,ffmpeg使用了一种 帧级追赶 模型
     此时会出现两种情况:(1)I帧中黄色块如果已经解码完成,则P帧的黑色块可以正常解码下去。 (2)I帧中的黄色块还没有解码,此时P帧解码需要挂起(pthread_cond_wait),直到I帧中的黄色块解码完成(pthread_cond_broadcast)。 ffmpeg中使用条件变量来进行挂起和恢复解码操作。ffmpeg将帧级追赶模型简化为了帧级行追赶模型,帧级行追赶模型的步骤为: (1) 所有帧 解码需要更新解码进度:即解码完一行的最后一个宏块后,假设宏块行相对于图像顶端高度为H, 则更新当前帧的解码进度为H。 (2) 图2中的P帧黑色块 得到MV后计算参考块(I中的黄色块)的高度H0(相对于图像顶端),H0与I的解码进度H比较:H0 < H则解码继续,否则解码挂起;参考帧每更新一次解码进度H,P帧解码线程都会重新比较H0和H, 直到H0 < H, P帧的 解码才得以继续进行下去。

     待续......,接下来将结合ffmepg中的代码,来详细说明ffmpeg帧并行解码的代码实现。
       
 
 

你可能感兴趣的:(ffmpeg相关)