对比AVS3和AVS2标准,我们发现AVS2中的slice语法结构在AVS3中被替换为patch(片)。
片的定义
片是图像中的矩形区域,包含若干最大编码单元在图像内的部分,片之间不应重叠。片结构见图1。
片在AVS3中的使用
一、序列头中关于patch的语法
... ... | |
cross_patch_loop_filter_enable_flag | u(1) |
ref_colocated_patch_flag | u(1) |
stable_patch_flag | u(1) |
if (stable_patch_flag == '1') { |
|
uniform_patch_flag | u(1) |
if (uniform_patch_flag == '1') { |
|
marker_bit | f(1) |
patch_width_minus1 | ue(v) |
patch_height_minus1 | ue(v) |
} |
|
} |
|
cross_patch_loop_filter_enable_flag 跨片环路滤波允许标志
二值变量。值为‘1’时表示可跨越片边界进行Deblock、SAO及ALF;值为‘0’表示不应跨越片边界进行Deblock、SAO及ALF。
ref_colocated_patch_flag 参考同位置片标志
二值变量。值为‘1’时表示进行帧间预测时只使用参考图像同位置片边界内的采样值进行参考;值为‘0’表示进行帧间预测时可使用参考图像同位置片边界外的采样值进行参考。
stable_patch_flag 片划分一致性标志
二值变量。值为‘1’时表示当前视频序列中所有图像划分为片的方式均应相同;值为‘0’表示当前视频序列中图像划分为片的方式可不相同。事实上,在目前AVS3标准中的所有profile内,都要求stable_patch_flag等于1。
uniform_patch_flag 统一片大小标志
二值变量。值为‘1’时表示除最右边和最下边的片外,图像中其他片的大小应相同;值为‘0’表示片的大小可不同。事实上,在目前AVS3标准中的所有profile内,都要求uniform_patch_flag等于1。
patch_width_minus1 片宽度
patch_height_minus1 片高度
片的宽度和高度,以LCU为单位。patch_width_minus1的值应小于256,patch_height_minus1的值应小于144。
二、如何计算以LCU为单位的每个片的宽、高以及位置等信息
序列头中已经定义了patch_width_minus1和patch_height_minus1,利用这两个参数可以计算出每个patch的位置,只是需要注意图像右边界和下边界的处理方式存在差异。
没遇到边界,patch是均匀划分的。
1、如果图像宽度不是整数个patch width的宽度,则右边存在多余的LCU,将多余LCU合并到最右边的patch中。可以计算出图像中包含了NumPatchColumns 列的Patch。
2、如果图像高度不是整数个patch height的高度,则下边存在多余的LCU,在图像下边新增一行patch。所以图像中实际的patch的行数NumPatchColumns,可能等于patch_height_minus1 + 2。
3、将每个Patch的(x, y, w, h)信息存入PatchSizeInLCU[i][j]数组中。(x, y)为以LCU为单位的Patch起始点坐标, w、h为Patch以LCU为单位的宽高大小。
Patch位置计算过程如下动画所示:
三、Patch的解码过程
1、首先从Intra Picture或者Inter Picture数据找到片起始码(4 Byte),为00 00 01 00 ~ 00 00 01 7F,其中最后1Byte为patch_idx。
2、根据Patch_idx,计算Patch首LCU的位置:
PatchIndexX = Patch_index % NumPatchColumns
PatchIndexY = Patch_index / NumPatchColumns
LcuRow = PatchSizeInLCU[PatchIndexY][PatchIndexX]->PosY
LcuColumn = PatchSizeInLCU[PatchIndexY][PatchIndexX]->PosX
3、计算Patch首个LCU的LcuIdx
LcuIdx = LcuRow * PictureWidthInLcu + LcuColumn
4、计算Patch边界:
PatchLeftInLcu = LcuIdx % PictureWidthInLcu (Patch内部,LcuIdx满足此公式,则该Lcu在Patch的左边界)
PatchRightInLcu = PatchLeftInLcu + PatchSizeInLCU[PatchIndexY][PatchIndexX]->Width
PatchAboveInLcu = LcuIdx / PictureWidthInLcu
PatchBelowInLcu = PatchAboveInLcu + PatchSizeInLCU[PatchIndexY][PatchIndexX]->Height
四、片对获取相邻块的影响
相邻块X(X为A、B、C、D、F或G)“存在”指该块应在图像内并且该块应与块E属于同一片;否则相邻块“不存在”。
如果块“不存在”或者尚未解码,则此块“不可用”;否则此块“可用”。如果图像样本所在的块“不存在”或者此样本尚未解码,则此样本“不可用”;否则此样本“可用”。
1、根据AVS3标准中的定义,帧内预测不能使用相邻片的相邻像素做参考;
2、块复制帧内预测的限制:从符合本部分的位流中解码得到的块矢量指向的参考块应限制在当前最大编码单元或左边N个最大编码单元的范围内。参考块的所有参考样本均应与当前块的样本属于同一个片,且已完全重建。