h265 相比 h264 的复杂度
- 复杂度体现
○ h265 帧内预测模式增多,h265 包含角度预测、DC 预测、平面模式等 35 种预测模式,远超 h264 的 17 种模式,帧内模式选择的复杂度大大增加;
○ h265 的区域划分方式更加多样化,提出了树形划分结构,划分的单元大小更加多种多样,出现了非对称划分,运动补偿更加复杂;
○ h265 增加了变换单元的概念,最大变换单元的大小由h264 中的 8x8增加到 32x32,运算量更是不可同日而语;
○ h265 的总体负责度可能超过以前编码器数十倍; - 解决方法
○ 多核环境下并行处理可以成倍的增加编解码速度,成为一种有效的解决方式。
视频编解码并行处理技术
- 并行处理基本概念
○ 并行处理一般是指许多指令得以同时进行的处理模式,并行处理通常是将处理的过程分解成小部分,之后采用多个运算单元以并发方式加以解决; - 功能并行
○ 功能并行是指将应用程序划分成相互独立的功能模块,每个模块间可以并行的执行,也称为流水线型并行,是将各个独立的模块划分给不同的运算单元,各个模块之间通过流的方式来进行数据交换和通信,最终将各个单元串接在一起。
○ 比如 h265 中的解码过程中的熵解码、反量化、反变换等,这些模块相互联系和运作机制,可以重新划分组合,实现功能并行。
○ 充分利用了时间上的并行性来获得酵素的效果,比较适用于硬件实现。
○ 缺点就是容易产生载荷失衡问题,此外需要在不同运算单元间进行数据通信,需要额外的资源进行存储;此外功能并行的扩展性较差。 - 数据并行
○ 数据并行是将数据信息划分为相互独立的部分,每一部分交给不同的运算单元来执行,从而实现并行处理;这种情况不同运算单元上执行的程序是相同的,处理的是相互独立的数据信息,不需要运算单元间的通信。
○ h265 提供了适于进行数据并行处理的结构单元,如片和 Tile,在不同的片和 Tile 中,数据信息是相互独立的,有利于将其分配给不同的运算单元来处理。
○ 对于比片和 Tile 小的划分单元,h265 支持波前并行处理(Wavefront Parallel Processing,WPP),这是对相互具有依赖关系的图像单元进行数据并行处理的方法。
○ 容易达到负载均衡、具有非常好的扩展性、易于软件实现。
h265 并行处理方式
-
考虑 h265 标准特点,在解码过程中,熵解码在 Slice、Tile 以及 CTB 行的起始处都有可能进行概率模型初始化,对于不同的图像,初始化的位置都不相同;
-
由于熵解码的依赖关系与后续解码的依赖关系不一致,如果在并行过程中不加以区分,会给整个并行解码带来很多麻烦,解码效率大大降低;
-
h265 的解码过程可以分成两个串行的功能模块,即熵解码和并行解码两部分,其中熵解码部分主要进行熵解码,而并行解码部分主要进行预测、反变换、反量化和去方块滤波等。
-
h265 并行解码模型混合了功能并行和数据并行两种方式。
-
h265 编码单元数据依赖关系
○ 针对并行处理的编码单元,必须消除数据间的依赖关系的影响;
○ 波前并行技术必须在满足各个数据单元 CTB 之间依赖关系的前提下进行;
○ h265 编码单元的数据依赖关系主要由帧内预测、真间预测、去方块滤波以及样点自适应补偿产生;
○ 帧内预测:当前 CTB 有可能会依赖左方、左上方、上方、右上方的 CTB 的像素信息和模式信息;
○ 帧间预测:当前 CTB 的运动矢量有可能需要左、左上、上、右上的 CTB 预测得到;
○ 去方块滤波:对当前 CTB 块进行行边界滤波的过程需要参考左 CTB 块的右侧四列像素、上 CTB 的底部四行像素;
○ 样点自适应补偿 SAO:SAO 的边缘补偿有 0、45、90、135 四种情况,多当前 CTB 补偿时,周围的 8 个块都有可能被参考;
h265 并行处理新技术
-
Tile
■ Tile 是 h265 中新增加的数据单元,它将原图像划分为一个个独立的矩形区域,各个矩形区域独立进行编码,不会进行相互参考;
■ Tile 的引入主要是为了并行,而非同步和纠错,改变了原有的扫描方式,Tile 中的 CTB 根据光栅扫描;
■ 一个 Slice 可能包含多个 Tile,一个 Tile 也可能包含多个 Slice,但不会出现一个 Slice 跨越 Tile 边界,也不会出现一个 Tile 跨越 Slice 边界的情况;
■ 当多个 Tile 位于同一个 Slice 当中时,它们可以共用同一个 Slice 头,从而节省码率;
■ Tile 引入的代价就是率失真性能随着 Tile 数目的增加而降低,因为 Tile 单元划分使Tile 边界附近信息的相关性被破坏了,此外 CABAC 也会在 Tile 边界进行概率模型的更新;
-
波前并行处理 WPP
■ Tile 和 Slice 的引入都会破坏相关性,造成一定的性能下降,而 h265 引入的 WPP 技术,允许多行 CTB 可以同时进行处理,但是后一行的处理要比前一行滞后两个 CTB,这样可以不破坏正常相关性的前提下进行并行解码,保持原始性能;
-
依赖片
■ h265 增加了依赖片这一数据单元,将一个完成的 Slice 划分为不同的区域,分别封装到不同的独立 NAL 单元中,而这些区域有可能是相互关联的,依赖片引入有利于并行处理,尤其在解码端;
■ 可以将一段用于波前并行处理的 CTB 行数据或一个 Tile 打包到一个当独的 NAL 单元中,这样一个单元被称为一个依赖片;
h265 并行策略
-
GOP 级并行
■ h265 中 GOP 级的并行是可行的,但因为 GOP 的数据量是庞大的,数据的存储频繁的读取读入都是非常耗时和资源的,此外延迟也非常大; -
图像级并行
■ 在图像级数据结构中,由于运动预测的存在,不同的图像之间会有时域上的依赖性,但这种依赖并非不可避免,一个视频序列中通常包括 IPB 三种图像,I 帧、P 帧图像都有可能被参考,但 B 帧图像可以分为等级 B 帧,同等级的 B 帧图像就可以相互独立,做到并行;
■ 实现方式十分受限于B 图像的数量; -
Slice 级并行
■ h265 中 CABAC 在每个 Slice 的结尾都会对上下文模型进行更新,这就允许不同的 Slice 的熵编码部分并行进行;除了熵编码,不同的 Slice 数据也可以被送给不同运算单元不用考虑它们的相关性;
■ Slice 并行缺点明显,每幅图的 Slice 数量由编码器决定,解码端并行的数量是难以确定的;去方块滤波时候,有可能跨越 Slice 的边界,降低了并行的扩展性;造成负载失衡问题;可能造成码率成倍增加;
-
Tile 级并行
■ 熵解码和预测,不同的 Tile 数据是相互独立的,而且 CABAC 上街吗也会在每个 Tile 的结尾进行上下文模型的更新,有益于实现 Tile 并行;
■ 去方块滤波和样点自适应补偿有可能会跨越 Tile 边界进行,需要额外处理消除依赖性;
■ 缺点就是可能造成负载失衡、码率飙升的问题; -
CTB 级并行
■ 采用波前并行处理技术 WPP 算法来进行 CTB 级别的并行;
■ 缺点就是WPP 技术无法在熵解码部分实现,只能分别进行熵解码和并行处理,此外无法保证输出码率的稳定性;
■ 针对缺点,提出重叠波前并行的方法,来减少并行过程中由于线程数增加和减少所带来的并行效率的下降;但该算法的前提是运动矢量足够小,否则容易导致后幅图像解码时缺少参考信息;
■ 从数据结构上分析,可以实现Tile 和 CTB同时并行,但缺点放大,h265 中没有提出对应的方案。
参考
- T-REC-H.265-202108-I.
- 新一代高效视频编码H.265HEVC原理、标准与实现 [万帅,杨付正 编著] 2014年版.