视频序列是由一个或者多个图像组GOP组成的,GOP通常被用来进行视频同步,它们相互独立的,没有任何相关性,每个GOP包含多幅图像,图像根据特点又可以分为I图像,P图像和B图像,从图像级向下划分又可以分为Slice和Tile,Slice和Tile作为两种划分单元可以将一幅图像划分为一个个相互独立的图像单元,而Slice和Tile都是由多个CTB组成的,最后,每个CTB又包含了包含了多个像素,从H265/HEVC的数据结构来看,在每一个层级上都可以进行并行处理,每一个层级上的并行处理都有各自的优点和缺点,和并行策略。接下来我们将对这些不同层级上的并行策略进行讨论和分析。
一 GOP级并行
在H265/HEVC中GOP级的并行时可行的,我们可以将一个视频序列中的不同GOP交给不同的运算单元来进行处理,
线程T1,T2,T3分别对GOP1,GOP2,GOP3 进行并行处理,T0负责统筹控制,当某个线程完成对其当前GOP的处理后发送请求,到T0, T0会根据各个线程的完成情况为分配下一个GOP,
GOP数据量庞大,因此GOP级别的并行需要每个运算单元都有较多的存储资源,如果这些运算单元使用的公共缓存,那么GOP级的并行将会十分低效,因为大量数据的频繁读入时非常耗时和消耗资源的操作,另外,GOP级的并行相对其他并行方式,解码延时标高,因此这种并行方式没有应用于编码器。
T1 | T2 | T3 | T4 |
GOP1 | GOP2 | GOP3 | GOP4 |
二 图像级并行
在图像级数据结构中,由于运动预测的存在,不同的图像之间会有时域上的依赖性,但是这种依赖性并非时不可避免的,一个视频序列中通常包含IPB3种数据图像,由于I图像和P图像都可能会作为参考帧,后续图像要进行解码必须等待它们的解码完成,因此通常对这些图像不做并行考虑,对于B图像,图中将B图像分成了3个等级B1,B2和B3,其中B1会作用B2和B3的参考图像,二B2会作为B3的参考图像,但是同级的B图像之间互不参考,高级的B图像也不会作为低级的B图像的参考图像,更不会作为I图像和P图像的参考图像。这就意味着同级别的B图像之间时相互独立的,这就为图像级别的并行处理提供了可能,我们可以将同级别的B图像分别交给不同的运算单元来进行处理,当然前提是更低级的B图像已经完成解码,当前级别B图像解码的先决条件已经满足。
这样的实现方式十分受限于B图像的数量,当P图像之间的B图像数目较少时,可以并行的线程数目也就很少,影响了并行的效率。另外,由于B图像也会被用作参考,不同级别的B图像之间不能进行并行解码,并行只能在同级别的B图像直接,这在更大程度上限制了并行效率。
T1 | T2 | |||||||
I/P | B3 | B2 | B1 | B0 | B3 | B2 | B1 | B0 |