AVS3中的patch(片)

  对比AVS3和AVS2标准,我们发现AVS2中的slice语法结构在AVS3中被替换为patch(片)。

片的定义

  片是图像中的矩形区域,包含若干最大编码单元在图像内的部分,片之间不应重叠。片结构见图1。

图1、AVS3中的片结构示意图

片在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

四、片对获取相邻块的影响

图2、块E和相邻块的空间位置关系

 

  相邻块X(X为A、B、C、D、F或G)“存在”指该块应在图像内并且该块应与块E属于同一片;否则相邻块“不存在”。

  如果块“不存在”或者尚未解码,则此块“不可用”;否则此块“可用”。如果图像样本所在的块“不存在”或者此样本尚未解码,则此样本“不可用”;否则此样本“可用”。

  1、根据AVS3标准中的定义,帧内预测不能使用相邻片的相邻像素做参考

  2、块复制帧内预测的限制:从符合本部分的位流中解码得到的块矢量指向的参考块应限制在当前最大编码单元或左边N个最大编码单元的范围内。参考块的所有参考样本均应与当前块的样本属于同一个片,且已完全重建。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITRonnie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值