预测编码
一副图像内临近像素之间有着较强的空间相关性,相邻图像之间也有很强的时间相关性。因此,视频编码往往采用帧内预测和帧间预测的方式,使用图像内已编码像素预测临近像素,或利用已编码图像预测待编码图像,从而有效去除视频空域和时域的相关性。视频编码后对预测后的残差而不是原始数据进行变化、量化、熵编码,由此大幅提高编码效率。
视频编码技术主要分为两大类:
1、帧内预测,即利用当前图像内已编码像素生成预测值。
2、帧间预测,即利用当前图像之前已编码图像的重建像素生成预测值。
帧内预测
H265/HEVC亮度分量帧内预测支持5种发小的PU:4X4、8X8、16X16、32X32、64X64,其中每一种PU都对应35种预测模式,Planar、DC、33种角度模式。
Planar适合图像变化缓慢的区域。
DC适合大面积平坦区域。
角度模式以更好适应视频内容中不同方向的纹理。
H265/HEVC色度分量帧内预测一共有5中模式:Planar、垂直模式、水平模式、DC以及对应亮度分量的预测模式。若亮度预测模式为钱4种模式的一种,则替换为角度34。
相关语法元素
(1)SPS中strong_intra_smoothing_enabled_flag语法元素决定是否使用帧内预测参考像素强度滤波。
(2)CU层prev_intra_luma_pred_flag、mpm_idx和rem_intra_luma_pred_mode 3个语法元素共同决定亮度帧内预测模式。intra_chroma_pred_mode语法元素决定色度帧内预测模式。
帧内预测过程
1、判断当前TU相邻参考像素是否可用并做相应的处理
2、对参考像素进行滤波
3、根据滤波后的参考像素计算当前TU的预测像素值
帧间预测
在基于块运动补偿的视频编码框架中,运动搜索时最为重要的环节之一,同时也是编码端最耗时的模块。TZSearch算法时H265/HEVC中出现新的技术,它包含以下步骤
1、确定起始搜索点。
2、以步长1开始,按照菱形模板在搜索范围内进行搜索,其中步长以2的整数次幂的形式递增,选出率失真代价最小的点作为该步骤的搜索结果。
3、若步骤2得到的最优点对应的步长为1,则需要在改点周围做两点搜索,其主要目的时补充搜索最优点周围尚未搜索的点。
4、若步骤2中得到的最优点对应的步长大于某个阈值,则以该最优点为中心,在一定范围内做全搜索,选择率失真最小的作为该步骤的最优点。
5、以步骤4的到的最优点为新的起始搜索点,重复步骤2-4,细化搜索。当相邻两次细化搜索得到的最优点一致时停止细化搜索。此时得到的MV为最终MV。
亚像素精度运动估计
在实际场景中,由于物体运动的距离并不一定是像素的整数倍,因此需要将运动估计得精度提升到亚像素级别。H.265/HEVC沿用了上一代标准H264/AVC所使用的1/4像素精度运动估计,并进一步发展了其像素插值算法。
亮度分量插值算法
亮度分量半像素位置的值由基于离散余弦变换的8抽头滤波器生成,1/4和3/4像素位置的值由基于离散余弦变换的7抽头滤波器生成。
色度分量插值算法
由于亮度分量运动估计达到了1/4像素精度,因此色度分量运动搜索需要达到1/8精度(对于YCbCr 4:2:0而言)。标准规定色度亚像素插值使用基于离散余弦变换的4抽头滤波器。
MV预测技术
空域上相邻块的MV具有较强的相关性;同时,MV在时域上也具有一定的相关性。
H.265/HEVC提出了两种新的技术——Merge技术和AMVP技术。Merge和AMVP技术都是用了空域和时域MV预测的思想,通过建立候选MV列表,选取性能最优的一个座位当前PU的预测MV,二者区别主要表现在一下两个方面。
1、Merge可以看成一种编码模式,在改模式下,当前PU的MV直接由空域(或时域)上临近的PU预测得到,不存在MVD;而AMVP可以看成一种MV预测技术,编码器值需要对实际MV与预测MV的差值进行编码,因此是存在MVD的。
2、二者候选MV列表长度不同,构建候选MV列表的方式也有所区别。
1、Merge模式
Merge模式会为当前PU建立一个MV候选列表,列表中存在5个候选MV(及其对应的参考图像)。通过遍历这5个候选MV,并进行率失真代价的计算,选择最优MV。若编/解码按相同方式构建MV候选,则编码器只需要传输最优MV在候选列表中的索引号即可。
Merge模式建立的MV候选列表包含了空域和时域两种情况,对于B Slice,还包含了组合列表的方式。
(1)空域候选列表建立
H265/HEVC规定,空域最多提供4个候选MV,即最多使用上述5个候选块中4个候选块的运动信息,列表按照A1-B1-B0-B0-B2的顺序建立,其中B2为替补,即当A1,B1,B0,A0中有一个或多个不存在是,则需要使用B2的运动信息。
矩形划分方式的建立需要做特殊处理
(2)时域候选列表建立
时域候选列表不能直接使用候选快的运动信息,而需要根据与参考图像位置的关系做相应的比例伸缩调整。
H.265/HEVC规定,时域最多只提供1个候选MV。由图H位置同位置PU的MV经伸缩得到,或H位置的PU不可用,则用C3位置的PU进行替换。
注意:如当前MV候选列表的MV的个数达不到5个时,需要使用(0,0)进行填补以达到规定的数目。
(3)组合列表的建立
对于B Slice而言,由于存在两个MV,因此其MV候选列表也需要提供两个预测MV。
H.265/HEVC标准将MV候选列表中的前4个候选MV进行两两组合,产生了B Slice的组合列表。
AMVP技术
高级运动向量预测(Advanced Motion Vector Prediction,AMVP)利用空域、时域上运动向量的相关性,为当前PU建立了候选预测MV列表。编码器从中挑选出最优的预测MV,并对MV进行差分编码;解码端通过建立相同的李彪,仅需要运动向量残差(MVD)与预测MV在改列表中的呃序号即可计算出当前PU的MV。
类似于Merge模式,AMVP候选列表也包含空域和时域两种情况,不同的是AMVP列表长度仅为2。
(1)空域列表的建立
当前PU的左侧和上侧各产生一个候选MV。左侧顺序为A0-A1-scaledA0-scaledA1,上方选择顺序为B0-B1-B2-scaledB0-scaledB1-scaledB2。其中scaledA0表示将A0的MV进行比例伸缩。对于上方3个PU,其MV的比例伸缩只有在左侧两个PU都不可用或都是帧内预测模式时才会进行。当左侧(或上方)检测到第一个“可用”的MV时,直接使用该MV作为当前PU的候选MV,而不在进行剩余的步骤。注意:只有当候选MV对应的参考图像与当前PU相同时,改MV才能标记为“可用”,否则要对该候选MV进行相应的比例伸缩。
(2)时域列表的建立
与Merge相同,若最终MV候选列表长度不足2,需要用(0,0)进行填补。
相关语法元素
(1)SPS
sps_temporal_mvp_enavle_flag:该语法元素指明当前序列是否使用时域MV预测技术(即MV候选列表中是否存在时域候选MV)。
(2)Slice层
slice_temporal_mvp_enable_flag:该语法元素知名当前Slice是否使用时域MV预测技术。
five_minus_max_num_merge_cand:该语法元素指定当前Slice中Merge模式MV候选列表的长度,范围为1~5。
(3)PU层
merge_flag:该语法元素指明当前PU是否使用了Merge技术。
merge_idx:该语法元素表示当前PU的运动信息在Merge候选列表中的序号。
mvp_l0_flag和mvp_l1_flag:这两个语法元素分别表示当前PU的预测MV在两个参考图像队列(List0和List1)所对应AMVP列表中的位置。
加权预测
加权预测可用于修正P Slice或B Slice中的运动补偿预测像素。H.265/HEVC标准规定了两种加权预测方法:默认加权预测以及Explicit加权预测。
相关语法元素
(1)PPS
weightef_pred_flag:该语法元素指明P Slice是否使用加权预测。
weighted_bipred_flag:该语法元素指明B Slice是否使用加权预测。
(2)Slice层
luma_log2_weight_denom:为了避免浮点运算,标准规定在加权预测过程中全部使用整数。该语法元素表示亮度加权因子整数化时放大的倍数(即亮度加权因子的分母),范围为1~128。
delta_chroma_log2_weight_denom:该语法元素用于计算色度加权因子整数化时放大的倍数(即色度加权因子的分母)。
luma_weight_l0_flag[i]:该语法元素指明List0队列中的第i个参考图像是否存在亮度加权因子。
chroma_weight_l0_flag[i]:该语法元素指明List0队列中的第i个参考图像是否存在色度加权因子。
delta_luma_weight_l0[i]:该语法元素用于计算List0队列中第i个参考图像的亮度加权因子。
luma_offset_l0[i]:该语法元素表示List0队列中的第i个参考图像亮度加权预测偏移值。
delta_chroma_weight_l0[i]/[j]:改语法元素用于计算List0队列中第i个参考图像的色度加权因子。j可取0/1,表示两个色度
delta_chroma_offset_l0[i]/[j]:该语法元素表示List0队列中的第i个参考图像色度加权预测偏移值。
luma_weight_l1_flag[i]、chroma_weight_l1_flag[i]、delta_luma_weight_l1[i]、luma_offset_l1[i]、delta_chroma_weight_l1[i]/[j]、delta_chroma_offset_l1[i]/[j]是针对参考图像队列List1而言的,含义同上。
PCM模式
在该模式下,编码器直接传输一个CU的像素值,而不经过预测、变换等其他操作。同样地,解码端可以直接恢复当前CU的像素值,而不需要进行其他处理。
相关语法元素
(1)SPS
pcm_enable_flag:该语法元素指明当前视频序列是否使用PCM模式。
pcm_sample_bit_depth_luma_minus1:该语法元素用于计算表示PCM模式亮度像素值所需的比特数。
pcm_sample_bit_depth_chroma_minus1:该语法元素用于计算表示PCM模式色度像素值所需的比特数。
log2_min_pcm_luma_coding_block_size_minus3:该语法元素规定了使用PCM模式编码单元的最小尺寸。
log2_diff_max_min_pcm_luma_coding_block_size:该语法元素表示使用PCM模式编码单元最大最小尺寸的差异。
pcm_loop_filter_disabled_flag:该语法元素表示是否对使用了PCM模式的CU进行去块效应滤波和采样点自适应补偿(SAO)技术
(2)CU
pcm_flag:该语法元素表示当前CU使用了PCM模式
pcm_sample_luma和pcm_sample_chroma:这两个元素分别表示PCM模式亮度和色度像素值。
变换编码
图像变换编码是指将以空间域中像素形式描述的图像转换至变换域,以变换系数的形式加以表示。
H.265/HEVC采用了整数DCT和整数DST。
相关语法元素
1、SPS
log2_min_transform_block_size_minus2:该语法元素指定最小TU的大小。
log2_diff_max_min_transform_block_size:该语法元素表示最大TU尺寸与最小的TU尺寸关系。
max_transform_hierarchy_depth_inter:该语法元素指定帧间编码中最大TU划分深度。
max_transform_hierarchy_depth_intra:该语法元素指定帧内编码中最大TU划分深度。
2、PPS
transform_skip_enable_flag:H.265/HEVC标准允许直接对预测残差进行量化、熵编码而不进行变换,该技术成为Transform skip。该语法元素表示是否使用该技术。
transquant_bypass_enable_flag:H.265/HEVC允许对残差不进行变换、量化及环路滤波。该语法元素表示是否使用该技术。
(1)CU层
cu_transquant_bypass_fla:该语法元素指定当前CU是否使用变换、量化及环路滤波。
rqt_root_cbf:该语法元素表示当前CU中是否存在TU树形结构(即是否存在系数)
(2)TU层
split_transform_flag:该语法元素表示当前层TU是否需要进行四叉树划分。若该语法元素值为1,则表示当前层TU需要分成4个相同大小的子TU;若其值为0,则表示当前TU不需要进一步划分,可直接进行解码。需要注意的是,当CU大小为64时,必须将其划分为4个TU,此时该语法元素不存在。
cbf_luma,cbf_cb,cbf_cr:这3个语法元素分别表示当前Y、Cb、Cr三个通道是否存在非零残差系数。
transform_skip_flag:该语法元素表示当前TU的残差是否进行了变换(参考PPS中的transform_skip_enable_flag)。
量化
量化是指将信号的连续取值(或大量可能的离散取值)映射为有限多个离散幅值的过程,实现信号取指多对一的映射。
H.265/HEVC采用的是标准量化器。
反量化
RDOQ
量化参数
相关语法元素
(1)PPS
init_qp_minus26:该语法元素给定当前图像中所有Slice的初始QP
cu_qp_delta_enable_flag:该语法元素指定是否允许在CU层调整QP,如果允许则会进一步指定QG大小。
diff_cu_qp_delta_depth:该语法元素规定QG的大小。
pps_cb_qp_offset和pps_cr_qp_offset:这两个语法元素在图像层指定色度分量QP相对于亮度分量QP的偏移值。
pps_slice_chroma_qp_offset_presnt_flag:该语法元素指定是否需要在Slice层进一步给出色度分量QP相对于亮度分量QP的便宜。若该语法元素为真,则会在Slice层给出slice_cb_qp_offset和slice_qp_offset两个语法元素。
(2)Slice层
slice_qp_delta:该语法元素给出了slice层QP相对于图像层初始QP的偏移值。
slice_cb_qp_delta和slice_cr_qp_offset:这两个语法元素给出了Slice层色度分量QP相对亮度分量QP的偏移值。
(3)CU层
cu_qp_delta_abs和cu_qp_delta_sign_flag:这连个语法元素给出了CU层QP的预测误差。
量化矩阵
量化矩阵原理时对不同位置的系数使用不同的量化步长。例如,可以利用人眼对图像视频中高频细节不敏感的特征,对高频系数使用较大的量化步长,对低频系数使用较小的量化步长。
量化矩阵用于比例缩放过程,其大于与TU相同,可为4X4、8X8、16X16、32X32。在比例缩放过程中,变换后的DCT(或DST)系数将量化矩阵中对应位置的系数相除,所得的结果作为量化模块的输入。
H265有两种量化矩阵,一种是标准量化矩阵,另一种是用户自定义量化矩阵。
量化矩阵需要被写入码流传送至解码端,为节省传输比特,H.265/HEVC规定对量化矩阵中的元素使用差分编码。
相关语法元素
量化矩阵的的相关语法元素在SPS和PPS都有可能存在。当PPS存在时,解码器使用PPS中的信息,否则使用SPS中的信息。
scaling_list_enable_flag:该语法元素表明是否使用量化矩阵。
sps_scaling_list_data_present_flag:该语法元素指出当前SPS中是否存在量化矩阵信息。
pps_scaling_list_data_present_flag:该语法元素指出当前PPS中是否存在量化矩阵信息。
scaling_list_pred_mode_flag:该语法元素表明当前量化矩阵的获取方式,若该值为0,表明当前量化矩阵与之前存在的量化矩阵相同,可直接通过预测得到;若该值为1,表明当前量化矩阵中的每个元素都需要重新计算得出。
scaling_list_pred_matrix_id_delta:当量化矩阵需要通过预测 得出时,该语法元素指明所用的预测矩阵。若该值为0,则当前量化矩阵采用H.265/HEVC指定的默认矩阵。
以下语法元素都针对“自定义量化矩阵”的情况
scaling_list_dc_coef_minus8:该语法元素给出自定义量化矩阵中左上角的元素(对应于DC系数)的值。
scaling_list_delta_coef:通过该语法元素可计算出自定义量化矩阵中其余元素的值。量化矩阵中的第一个元素值 可由语法元素scaling_list_dc_coef_minus8得到,对于其余元素,只需要传输其与前一个元素值的差异。
环路后处理
H.265/HEVC仍采用基于块的混合编码框架,方块效应,振铃效应。颜色偏差以及图像模糊等失真效应仍存在。
为了降低这类失真对视频质量的影响,H.265/HEVC采用了环路滤波技术,包括去方块滤波(Deblocking Filter)和像素自适应补偿(Sample Adaptive Offset)两个模块。
去方块滤波用于降低方块效应,像素自适应补偿用于改善振铃效应。
去方块滤波
方块效应是指图像中编码块边界的不连续性,重建图像有明显的方块效应,严重印象图像的主管质量。
造成的原因是:1、各个块的变换量化编码过程相互独立,相当于对各个块使用了不同的参数的滤波器分别滤波,因此各块引入的量化误差大小及其分布特性相互独立,导致相邻块边界的不连续。2、运动补偿预测过程中,相邻块的预测值可能来自于不同图像的不同位置,导致预测残差信号在边界产生数值不连续。3、时域预测技术使得参考图像存在的边界不连续可能会传递到后续编码图像。
H.265/HEVC滤波方面
(1)无论亮度分量还是色度分量,去方块滤波均对8x8的块边界进行处理,并且对于色度分量仅当边界两侧至少有一个块采用帧内预测模式时,该边界才需要滤波。
(2)滤波时,没航像素边界两边最多各修正3个像素值,这使得各8x8的块边界空间独立,可以并行进行滤波操作。
(3)可以先处理整幅图像中的垂直边界,在处理水平边界。
去方块滤波技术
1、滤波决策:得到边界的滤波强度(不滤波、弱滤波、强滤波)
2、滤波操作:根据所选的滤波强度及滤波参数对像素进行相应的修正
虽然去方块滤波最小单位是8x8块的边界,而实际是将8x8块分成两部分独立进行去方块滤波处理,垂直以8x4为基本单位,水平边界以4x8为基本单位。
滤波决策,包括三个步骤:1、获取边界强度是根据边界块的编码参数初步判断块边界是否需要滤波及滤波参数,因为相邻块采用不同的编码参数易造成像素值在块边界的不连续。2、滤波开关决策进一步对视频内容进行分析,主要根据边界两侧块内像素值的变化及编码参数确定边界是否需要滤波3、滤波强弱选择根据视频内容及编码参数进一步判断边界是否需要滤波以及选择合适的滤波强度。
亮度分量要通过以上3个环节确定滤波强度及滤波参数,而色度分量只需要为其获取边界强度,其边界强度值直接取相应亮度分量的边界强度步骤得到的边界强度值。
(1)获取边界强度
获取边界强度是根据边界快的编码参数初步判断块边界是否需要滤波及滤波参数,经过获取边界强度模块后,所有允许滤波的边界获得边界强度(BS),其取值为0、1或2。
0:表示该边界不需要滤波,并不在进行后续处理(滤波开关决策,滤波强弱选择以及滤波操作)
1、2:会进行后续模块处理,并且其值会影响后续“滤波强弱选择”中的阈值。对于色度分量,边界强度为0,1时,表示边界不需要滤波,只要边界强度为2时,采会对其进行滤波。
(2)滤波开关决策
根据边界快内像素值的变化程度判断该边界区域的内容特性,然后根据边界区域的内容特性确定是否需要进行滤波操作。
阈值和两边块的QP也有关系。
(3)滤波强弱选择
边界两边差值越大,滤波强度越大。若差值超过一定范围,考虑是视频本身内容所导致。
滤波操作
包括3中情况:亮度分量的强滤波、若滤波以及色度分量的滤波。
分别有不同公式
去方块滤波实现
1)确定滤波边界(图像边界,tile边界,slice边界,tu边界,pu边界)
2)计算边界强度(即BS值)
3)对亮度分量进行滤波开关决策、滤波强弱选择
4)滤波
语法元素
1、SPS级
pcm_loop_filter_disable_flag:该语法元素用于说明对于一个编码单元CU,在pcm_enabled_flag为1的条件下是否采用环路滤波技术,包括去方块滤波以及像素自适应补偿。当该语法元素为1时,表示不使用;取指为0时,表示使用。
2、PPS级
loop_filter_across_tiles_enabled_flag:该语法元素用于说明在tile的边界处是否执行环路滤波才做,包括去方块滤波和像素自适应补偿。当取值为1时,表示执行;去值为0时,表示不执行。
pps_loop_filter_across_slices_enabled_flag:该语法元素用于说明在Slice的左边界以及上边界处是否执行环路滤波操作。当取指为1时,表示执行;取指为0时,表示不执行。
deblocking_filter_override_enabled_flag:该语法元素支出在Slice头部是否出现语法元素deblocking_filter_override_flag。当去值为1时,表示在Slice头部存在语法元素deblocking_filter_override_flag;取值为0时,表示在Slice头部不存在该语法元素。其默认值为0。
pps_deblocking_filter_disabled_flag:该语法元素表示在语法元素slice_deblocking_filter_disabled_flag未出现的条件下,是否对各个Slice执行去方块滤波。当取值为1时不执行;取指为0时执行。默认值为0。
pps_beta_offset_div2&pps_tc_offset_div2:该语法元素表示去方块滤波参数β/2和tc/2的默认补偿值,该补偿值还可以在Slice的头部进行重载。其取值范围为[-6,6],当该语法元素未出现时,认为其值为0,。
3、Slice级
deblocking_filter_override_flag:该语法元素表明在Slice的头部是否出现取方块滤波参数。当取值为1时,表明出现了去方块滤波参数;当取值为0时,表明未出现。其默认值为0。
slice_deblocking_filter_disabled_flag:该语法元素表明当前Slice是否进行去方块滤波操作。1:不进行 0:进行,当该语法为出现是,其值等于语法元素pps_deblocking_filter_disabled_flag的值
slice_beta_offset_div2pps_tc_offset_div2:该语法元素表示当前Slice去方块滤波参数β/2和tc/2的默认补偿值,其取值范围为[-6,6],当该语法元素未出现时,使用PPS语法元素
slice_loop_filter_across_slices_enabled_flag:该语法元素用于说明当前Slice的左边界以及上边界处是否执行环路滤波操作,包括去方块滤波和样点自适应补偿。当取指为1时,表示执行(还需根据后续判断);取指为0时,表示不执行。未出现时,使用PPS语法元素
样点自适应补偿
H.265/HEVC仍采用基于块的DCT变换,并在频域对变换系数进行量化。对于图像里的强边缘,由于高频交流系数的量化是真,解码后会在边缘周围产生波纹现象,这种失真被称为振铃效应,严重影响图像主观质量。
造成此现象的根本原因是高频信息的丢失。因此,要抑制振铃效应,就需要减小高频分量的失真。
样点自适应补偿技术对波峰像素添加负值进行补偿,波谷添加正值进行补偿。
SAO技术
H.265/HEVC标准中的SAO以CTB为基本单位,通过选择一个合适的分类器将重建像素划分类别,然后对不同类别像素使用不同的补偿值,可以有效提高视频的主客观质量。它包括两大类补偿形式,分别是边界补偿(Eege Offset,EO)和边带补偿(Band Offset,BO),此外还引入了参数融合技术。
1、边界补偿EO
通过比较当前像素与邻近像素值的大小对当前像素进行归类,然后对同类像素补偿相同数值。
2、边带补偿BO
根据像素强度进行归类,它将像素范围等分成32条边带。
H.265/HEVC规定一个CTB只能选择4条连续的边带,并只对属于这4个边带的像素进行补偿。选择哪4条边带可以通过率失真优化方式确定,然后将最小边带号以及4个补偿值传至解码端。
3、SAO参数融合
是指对一个CTB块,如果其SAO参数直接使用相邻块的SAO参数,这时只需要标识采用了哪个相邻块的SAO参数即可。
SAO实现方法
SAO最终的补偿方式有8种:不补偿、EO_0模式、EO_1模式、EO_2模式、EO_3模式、BO模式、左相邻块参数融合模式、上相邻块参数融合模式。
(1)信息统计
(2)亮度CTB的SAO模式
(3)色度CTB的SAO模式
(4)CTU的最优SAO模式
(5)CTU的SAO滤波
(6)EO模式
(7)BO模式
语法元素
对于当前位置为(rx,ry)的CTU块,首先根据条件判断其是否可以选择左块参数融合模式,如果可以,则根据相应描述子提取对应的比特,该比特即表示出了sao_merge_left_flag的值;同样可提出sao_merge_up_flag的值。如果这两个语法元素有一个为真,说明该CTU块使用了参数融合模式,其SAO参数信息根据融合块就可得到;否则,该CTU块使用了非参数融合模式,此时可根据相应描述子分别提取出亮度和色度分量的补偿类型、补偿值、边带序号等SAO参数信息用于后续补偿。
详细推理看协议。
语法元素语义
(1)SPS
sample_adaptive_offset_enabled_flag:该语法元素标识是否采用SAO补偿技术。当该值取1时,表示使用。
(2)PPS
loop_filter_arcoss_tiles_enabled_flag:该语法元素用于标识在tile的边界处是否执行环路滤波操作,包括去方块滤波和像素自适应补偿。1:执行 0:不执行
pps_loop_filter_across_slices_enabled_flag:该语法元素用于标识在Slice的左边界以及上边界是否执行环路滤波操作。1:执行 0:不执行
(3)Slice
slice_sao_luma_flag:该语法元素标识当前Slice的亮度分量是否允许进行SAO操作。1:允许 0:不允许
slice_sao_chroma_flag:该语法元素标识当前Slice的色度分量是否允许进行SAO操作。1:允许 0:不允许
slice_loop_filter_across_slices_enabled_flag:该语法元素用于标识在Slice的左边界以及上边界是否执行环路滤波操作。1:执行 0:不执行。未出现使用PPS语法元素
熵编码
熵编码把一系列用来标识视频序列的元素符号转变为一个用来传输或存储的压缩码流。输入的符号可能包含量化的编码系数,运动矢量信息,预测模式的信息等。
指数哥伦布编码属于可变长编码,其基本原理时用短码表示出现频率较高的信息,而用长编码表示出现频率比较低的信息。
在H.265/HEVC中,零阶指数哥伦布编码方法被用于视频参数集(VPS)、序列参数集(SPS)、图像参数及(PPS)和片头信息等所设计的大部分语法元素中。具体使用的时无符号还是有符号的哥伦布编码,见表
CABAC
基于上下文的自适应二进制算术编码(CABAC)是一种将自适应的二进制算术编码与一个设计精良的上下文模型结合起来得到的方法。
CABAC采用了高效的算术编码思想,同时充分考虑了视频流的相关统计特性
1、二进制化
2、上下文建模
3、二进制算术编码
1、二进制化
在H.265/HEVC中,常用的二元化方法有截断莱斯二元化(TR)、K阶指数哥伦布二元化(EGK)和定长二元化(FL)。针对不同的语法元素,根据其不同的概率分布特性来选择不同的二元化方案。
2、上下文模型
在编码中,语法元素使用的上下文概率模型都被唯一的上下文索引号r标识,每一个r涉及两个概率模型变量:最大概率符号MPS和概率状态索引α。
3、二进制算术编码
二进制算术编码对当前语法元素二进制化后的每一个Bin根据其概率模型参数进行算术编码,得到最后的输出码流。
包括两种编码方式:常规编码和旁路编码。前者利用自适应的概率模型进行编码,后者以等概率的方式进行编码,其概率状态无须更新。
网络适配层
H.265/HEVC采用了视频编码层(VCL)和网络适配层(NAL)的双层架构,以适应不同的网络环境和视频应用。
网络传输过程中,网络设备可以直接通过NALU的头信息获取NALU承载视频数据的内容特性,在此基础上优化视频流的传输。针对网络拥塞引起的丢弃分组问题,网络设备需要清楚各个分组的优先级,这可以直接通过NAL的头信息获得。
图像类型
NALU除了承载VPS、SPS、PPS等信息,主要承载视频片(Slice)的压缩数据,承载视频片压缩数据的NALU被称为VCLU(VCL NALU),承载其他信息的NALU被称为non-VCLU(non-VCL NALU)。每个VCLU包含一个视频片段SS的压缩数据,SS是VCL的压缩数据输出的单位,每个SS包含多个完整的按序列排列的CTU。
VCLU头信息标识VCLU载荷的内容特性,主要标识SS的重要性及其与其他图像的依赖关系(这个版本只标识时域重要性及时域依赖关系)。
IDR(Instantaneous Decoding Refresh)IDR图像及其后续码流可以不依赖该IDR图像前的视频流信息进行福利解码
CRA(Clean Random Access)允许前置图像是RADL图像
BLA(Broken Link Access)当以CRA图像开始的码流的一部分也属于另一段码流
RADL(Random Access Decodable Leading)不依赖IRAP前码流信息的前置图像
RASL(Random Access Skipped Leading)依赖IRAP前码流信息的前置图像被称为RASL图像。
TSA(Temporal SubLayer Access):表示从该图像可以切换到时域层标识号大于或等于该图像时域层标识号的时域子层
STSA(Step_wiseTemporal Sub-Layer Access):表示从该图像可以切换到该图像所属的时域子层
网络适配层单元
NALU包含两部分:NALU头(Header)和NALU载荷(Payload)。NALU头长度为固定两字节,反应NALU的内容特征。NALU载荷长度为固定整数字节,承载视频压缩后的比特流片段。
NALU载荷
SODB为最高位有效的存储形式,即字节内的比特按照从左到右、从高到低的顺序排列。
由比特流片段SODB(String Of Data Bits)生成原始字节序列载荷RBSP(Raw Byte Sequence Payload)过程:
如果SODB是空的(长度为0字节),生成的RBSP也是空的。
否则,RBSP由如下方式生成。
1、RBSP的第一字节直接取SODB的最左端的8bit,第二字节去SODB接下来的8bit,以此类推,直到SODB中所剩的内容不足8bit(包括0)为止。
2、RBSP的下一字节首先包含SODB的最后几比特,然后添加比特1(RBSP停止比特)。如果该字节包含的比特数小于8,在后面添加0知道该字节包含8bit
3、最后可能会加入若干16bit的语法元素cabac_zero_word作为填充比特,其值为0x0000.
RBSP可以包含一个SS的压缩数据、VPS、SPS、PPS、补充增强信息等,也可以为定界、序列结束、比特流结束、填充数据等。
在字节流应用环境中0x000001位NALU的起始码,0x000000为结束码,因此需要对RBSP字节流做冲突避免处理
0x000000->0x00000300
0x000001->0x00000301
当RBSP数据的最后一字节等于0x00时(只会在末尾是cabac_zero_word时出现),字节0x03会被加入数据的末尾。
NALU头
NALU头主要承载NALUT载荷的内容特性,由定长的4部分组成:forbidden_zero_bit、nal_unit_type、nuh_layer_id、nuh_temporal_id_plus1组成。
参数集
H.265/HEVC规定了VPS、SPS、PPS参数集。参数集为独立的数据单元,可以采用特殊的传输或保护方式,甚至可以采用带外传输的方式。
VPS和SPS包含了一个CVS的共有参数信息,一个CVS只能使用同一个VPS和SPS。
PPS包含了一幅图像的共有参数信息,一幅图像只能使用同一个PPS。
视频编解码有两种并行方式:功能并行、数据并行。
H265解码过程分为熵编码、反量化、反变换、帧内预测、帧间预测、去方块滤波和样点自适应补偿。
熵解码的依赖关系与后续解码模块的依赖关系不一致,因此H.265/HEVC的解码过程可以分成两个串行的功能模块,即熵解码和并行解码两部分。
H.265/HEVC增加了很多新特性用以实现并行处理,如:Tile、依赖片、波前并行处理。
Slice一般横向跨度较大,而且不一定是规则的。
Tile划分比Slice要规则,块与块之间的空间跨度一般不会很大,相关性较强。
率失真优化
率失真理论只涉及编码问题。
速率控制
编码单元的编码速率主要与量化参数相关,可以基于这一关系直接根据编码单元的目标比特数确定其量化参数。
通常采用分级的方式来简化目标比特分配问题,依次是GOP级、图像及、宏块级。