slice,tile 和并行化
slice
slice 由整数个 CTU 组成,并且可以进行独立的编解码。这是通过在每个 slice 末尾终止 CABAC 码流和去除不同 slice 之间的 CTU 的依赖来实现的,但是多个 slice 头和去除不同 slice 的 CTU 之间的依赖会导致码率上升。划分 slice 主要有以下三个目的:
1.错误鲁棒性:将图像分割成较小的 slice,可以在数据丢失的情况下,通过重新同步解码和解析过程来获得错误鲁棒性。
2.匹配 MTU:slice 大小可以与 IP 网络里的最大传输单元 MTU 大小匹配,这样只需控制 slice 中包含的最大比特数即可,而不需要考虑编码图像的大小,网络适应能力更强。
3.并行处理:并行进行多个 slice 的编解码。
slice 可以进一步划分成多个 slice segment(SS),包括一个独立 SS 和若干个依赖 SS。slice 以独立的 SS 开始,并且之后的依赖 SS 只需要非常少量的 slice 头,同一个 slice 中的 SS 可以互相参考。下图是 SS 划分示例:
tile
跟 slice 类似,但是 tile 将图像划分成矩形区域,如下所示
并且在编码的时候,tile 修改了 CTU 的扫描顺序,从基于图像的光栅扫描变成了基于 tile 的光栅扫描。一个 slice 中可以有多个 tile,一个 tile 中也可以有多个 slice。但是必须满足:
1.slice 中的所有 CTU 属于同一 tile,或者 tile 中所有的 CTU 都属于同一 slice。
2.SS 中的所有 CTU 属于同一 tile,或者 tile 中所有的 CTU 都属于同一 SS。
相比于 slice,tile 更有利于感兴趣区域的编码,因为其更加的灵活。也可以利用 tile 将编码任务分配到不同的硬件设备上。
并行处理
帧级并行
优点:实现简单,并且不会造成编码性能上的损失。
缺点:并行度由图像组 Group Of Picture(GOP) 的大小等因素决定;负载可能不平衡,每帧图像的编解码时间会有很大变化;帧级并行增加了处理帧速率,但是并没有降低延迟。
slice 级并行
优点:加快每帧编码速度
缺点:slice 数量过多时会严重影响编码效率。
CTU 级并行
优点:适合流水线方式的处理,比如:进行第 n n n 个 CTU 的 RDO 时,同时进行第 n − 1 n-1 n−1 个 CTU 的重建,第 n − 2 n-2 n−2 个 CTU 的熵编码。
缺点:调度过程复杂,并且负载不均衡。
波前并行 (Wavefront Parallel Processing, WPP)
WPP 适用于低时延应用。WPP 按照光栅扫描顺序进行多线程处理,每个线程从左到右处理一个 CTU 行。除了第一行外,所有 CTU 行都要比上一行 CTU 行延迟两个 CTU 进行处理。这样除了每个 CTU 行末尾的 CABAC 上下文被终止了,分区边界之间没有打破连续的 CTU 行之间的依赖关系。并且,为了减少性能损失,CABAC 的上下文从编解码的前一个 CTU 行的第二个 CTU 传播到当前 CTU 行的第一个 CTU。因此,引起的编码性能损失较小。
优点:适用于低延迟,编码性能损失较小。
缺点:当负载不平衡时,会出现额外的流水线问题。例如,CTU 行中的一个编码慢的 CTU 会导致后续 CTU 行处理停滞。
平衡时,会出现额外的流水线问题。例如,CTU 行中的一个编码慢的 CTU 会导致后续 CTU 行处理停滞。