6. 解码过程 (Decoding Process)
调用此过程是为了从比特流 (bitstream) 中获得一个已解码帧 (decoded frame). 此过程的输入是一个已编码帧 (coded frame) 的比特流. 此过程的输出是一个已解码帧.
对于当前帧, 解码过程按如下方式运行:
-
解析已编码帧的语法结构 (syntax structure), 以获得已解析的语法结构.
-
第 6.1 节, 第 6.2 节和第 6.3 节中的过程, 使用所有语法结构中的语法元素 (syntax element) 来规定解码过程. 对于符合本文档的比特流, 帧中的已编码瓦片 (coded tile) 必须包含该帧每个 MB 的瓦片数据 (tile data), 从而使帧到瓦片的划分以及瓦片到 MB 的划分共同构成该帧的一个分区 (partitioning).
-
当前帧中的所有瓦片都完成解码后, 如果
FrameWidthInSamplesY不等于FrameWidthInMbsY * MbWidth, 或FrameHeightInSamplesY不等于FrameHeightInMbsY * MbHeight, 则使用裁剪矩形 (cropping rectangle) 对已解码帧进行裁剪. -
裁剪矩形规定一个帧中要输出的样本 (sample), 其推导方式如下:
-
裁剪矩形包含水平帧坐标从 0 到
FrameWidthInSampleY - 1, 垂直帧坐标从 0 到FrameHeightInSamplesY - 1的亮度样本 (luma sample), 两端均包含在内. -
裁剪矩形包含两个色度数组 (chroma array), 它们的帧坐标为
(x//SubWidthC, y//SubHeightC), 其中(x,y)是指定亮度样本的帧坐标.
-
6.1. MB 解码过程 (MB Decoding Process)
对每个 MB 调用此过程.
此过程的输入是一个亮度位置 (luma location) (xMb, yMb), 它指定当前亮度 MB 左上样本相对于当前帧左上亮度样本的位置. 此过程的输出是所有颜色分量 (color component) 的重建样本 (reconstructed sample). 颜色分量总数由当前 MB 的 NumComps 值指示. 例如, 当 chroma_format_idc 等于 2 或 3 时, NumComps 的值等于 3, 并重建三个分量: Y 分量, Cb 分量和 Cr 分量.
以下步骤适用:
-
令
recSamples[0]为第一颜色分量的重建样本的(MbWidth)x(MbHeight)数组. 当chroma_format_idc等于 2 或 3 时, 第一颜色分量为 Y. -
按第 6.2 节规定的块重建过程 (block reconstruction process) 被调用, 输入为亮度位置
(xMb, yMb), 设置为等于MbWidth的变量nBlkW, 设置为等于MbHeight的变量nBlkH, 设置为等于 0 的变量cIdx, 以及(MbWidth)x(MbHeight)数组recSamples[0]. 输出是(MbWidth)x(MbHeight)数组recSamples[0]的修改版本, 即当前 MB 的第一颜色分量的重建样本. -
当
chroma_format_idc不等于 0 时, 令recSamples[1]为第二颜色分量的重建样本的(MbWidthC)x(MbHeightC)数组. 例如, 当chroma_format_idc等于 2 或 3 时,recSamples[1]是 Cb 颜色分量. -
当
chroma_format_idc不等于 0 时, 按第 6.2 节规定的块重建过程被调用, 输入为亮度位置(xMb, yMb), 设置为等于MbWidthC的变量nBlkW, 设置为等于MbHeightC的变量nBlkH, 设置为等于 1 的变量cIdx, 以及(MbWidthC)x(MbHeightC)数组recSamples[1]. 输出是(MbWidthC)x(MbHeightC)数组recSamples[1]的修改版本, 即当前 MB 的第二颜色分量的重建样本. -
当
chroma_format_idc不等于 0 时, 令recSamples[2]为第三颜色分量的重建样本的(MbWidthC)x(MbHeightC)数组. 例如, 当chroma_format_idc等于 2 或 3 时,recSamples[2]是 Cr 颜色分量. -
当
chroma_format_idc不等于 0 时, 按第 6.2 节规定的块重建过程被调用, 输入为亮度位置(xMb, yMb), 设置为等于MbWidthC的变量nBlkW, 设置为等于MbHeightC的变量nBlkH, 设置为等于 2 的变量cIdx, 以及(MbWidthC)x(MbHeightC)数组recSamples[2]. 输出是(MbWidthC)x(MbHeightC)数组recSamples[2]的修改版本, 即当前 MB 的第三颜色分量的重建样本. -
当
chroma_format_idc等于 4 时, 令recSamples[3]为第四颜色分量的重建样本的(MbWidthC)x(MbHeightC)数组. -
当
chroma_format_idc等于 4 时, 按第 6.2 节规定的块重建过程被调用, 输入为亮度位置(xMb, yMb), 设置为等于MbWidthC的变量nBlkW, 设置为等于MbHeightC的变量nBlkH, 设置为等于 3 的变量cIdx, 以及(MbWidthC)x(MbHeightC)数组recSamples[3]. 输出是(MbWidthC)x(MbHeightC)数组recSamples[3]的修改版本, 即当前 MB 的第四颜色分量的重建样本.
6.2. 块重建过程 (Block Reconstruction Process)
此过程的输入为:
-
一个亮度位置
(xMb, yMb), 它指定当前 MB 左上样本相对于当前帧左上亮度样本的位置. -
两个变量
nBlkW和nBlkH, 分别指定当前块 (block) 的宽度和高度. -
一个变量
cIdx, 指定当前块的颜色分量. -
一个重建块的
recSamples的(nBlkW)x(nBlkH)数组.
此过程的输出是重建样本的 (nBlkW)x(nBlkH) 数组 recSamples 的修改版本.
以下内容适用:
-
变量
numBlkX和numBlkY推导如下:-
numBlkX = nBlkW // TrSize -
numBlkY = nBlkH // TrSize
-
-
对于
yIdx = 0..numBlkY - 1, 以下内容适用:-
对于
xIdx = 0..numBlkX - 1, 以下内容适用:-
变量
xBlk和yBlk推导如下:-
xBlk = xMb // (cIdx==0? 1: SubWidthC) + xIdx*TrSize -
yBlk = yMb // (cIdx==0? 1: SubHeightC) + yIdx*TrSize
-
-
按第 6.3 节规定的缩放和变换过程 (scaling and transformation process) 被调用, 输入为位置
(xBlk, yBlk), 设置为等于cIdx的变量cIdx, 设置为等于TrSize的变换宽度nBlkW, 以及设置为等于TrSize的变换高度nBlkH. 输出是一个重建块的(TrSize)x(TrSize)数组r. -
(TrSize)x(TrSize)数组recSamples修改如下:recSamples[(xIdx * TrSize) + i, (yIdx * TrSize) + j] = r[i,j], 其中i=0..TrSize-1,j=0..TrSize-1
-
-
6.3. 缩放和变换过程 (Scaling and Transformation Process)
此过程的输入为:
-
当前颜色分量的位置
(xBlkY, yBlkY), 它指定当前块左上样本相对于当前帧左上样本的位置. -
一个变量
cIdx, 指定当前块的颜色分量. -
一个变量
nBlkW, 指定当前块的宽度. -
一个变量
nBlkH, 指定当前块的高度.
此过程的输出是重建样本 r 的 (nBlkW)x(nBlkH) 数组, 元素为 r[x][y].
量化参数 (quantization parameter) qP 推导如下:
qP = Qp[cIdx] + QpBdOffset
重建样本 r 的 (nBlKW)x(nBlkH) 数组推导如下:
-
按第 6.3.1 节规定的变换系数缩放过程 (scaling process for transform coefficients) 被调用, 输入为块位置
(xBlkY, yBlkY), 块宽度nBlkW, 块高度nBlkH, 颜色分量变量cIdx, 以及量化参数qP. 输出是缩放后变换系数 (scaled transform coefficient)d的(nBlkW)x(nBlkH)数组. -
按第 6.3.2 节规定的缩放后变换系数的变换过程 (transformation process for scaled transform coefficients) 被调用, 输入为块位置
(xBlkY, yBlkY), 块宽度nBlkW, 块高度nBlkH, 颜色分量变量cIdx, 以及缩放后变换系数d的(nBlkW)x(nBlkH)数组. 输出是重建样本r的(nBlkW)x(nBlkH)数组. -
变量
bdShift推导如下:bdShift = 20 - BitDepth
-
对于
x = 0..nBlkW - 1,y = 0..nBlkH - 1的重建样本值r[x][y], 修改如下:r[x][y] = clip(0, (1 << BitDepth)-1, ((r[x][y]+(1 << (bdShift-1)))>>bdShift) + (1 << (BitDepth-1)))
6.3.1. 变换系数缩放过程 (Scaling Process for Transform Coefficients)
此过程的输入为:
-
当前颜色分量的位置
(xBlkY, yBlkY), 它指定当前块左上样本相对于当前帧左上样本的位置. -
一个变量
nBlkW, 指定当前块的宽度. -
一个变量
nBlkH, 指定当前块的高度. -
一个变量
cIdx, 指定当前块的颜色分量. -
一个变量
qP, 指定量化参数.
此过程的输出是缩放后变换系数 d 的 (nBlkW)x(nBlkH) 数组, 元素为 d[x][y].
变量 bdShift 推导如下:
bdShift = BitDepth + ((log2(nBlkW) + log2(nBlkH)) // 2) - 5
列表 levelScale[] 规定如下:
levelScale[k] = {40, 45, 51, 57, 64, 71}, 其中k = 0..5.
对于 x = 0..nBlkW - 1, y = 0..nBlkH - 1 的缩放后变换系数 d[x][y] 的推导, 以下内容适用:
-
缩放后变换系数
d[x][y]推导如下:d[x][y] = clip(-32768, 32767, ((TransCoeff[cIdx][xBlkY][yBlkY] * QMatrix[cIdx][x][y] * levelScale[qP % 6] << (qP//6)) + (1 << (bdShift-1)) >> bdShift))
6.3.2. 缩放后变换系数的处理 (Process for Scaled Transform Coefficients)
6.3.2.1. 通用 (General)
此过程的输入为:
-
当前颜色分量的位置
(xBlkY, yBlkY), 它指定当前块左上样本相对于当前帧左上样本的位置. -
一个变量
nBlkW, 指定当前块的宽度. -
一个变量
nBlkH, 指定当前块的高度. -
一个缩放后变换系数
d的(nBlkW)x(nBlkH)数组, 元素为d[x][y].
此过程的输出是重建样本 r 的 (nBlkW)x(nBlkH) 数组, 元素为 r[x][y].
重建样本 r 的 (nBlkW)x(nBlkH) 数组推导如下:
-
对于
x = 0..nBlkW - 1,y = 0..nBlkH - 1的缩放后变换系数d[x][y]的每个垂直列 (vertical column), 通过为每个列x = 0..nBlkW - 1调用第 6.3.2.2 节规定的一维变换过程 (one-dimensional transformation process), 将其变换为x = 0..nBlkW - 1,y = 0..nBlkH - 1的e[x][y]. 输入为变换块大小nBlkH, 以及y = 0..nBlkH - 1的列表d[x][y]. 输出为y = 0..nBlkH - 1的列表e[x][y]. -
以下内容适用:
g[x][y] = (e[x][y] + 64) >> 7
-
对于所得数组
g[x][y]中x = 0..nBlkW - 1,y = 0..nBlkH - 1的每个水平行 (horizontal row), 通过为每个行y = 0..nBlkH - 1调用第 6.3.2.2 节规定的一维变换过程, 将其变换为x = 0..nBlkW - 1,y = 0..nBlkH - 1的r[x][y]. 输入为变换块大小nBlkW, 以及x = 0..nBlkW - 1的列表g[x][y]. 输出为x = 0..nBlkW - 1的列表r[x][y].
6.3.2.2. 变换过程 (Transformation Process)
此过程的输入为:
-
一个变量
nTbS, 指定缩放后变换系数的样本大小. -
一个缩放后变换系数列表
x, 元素为x[j], 其中j = 0..(nTbS - 1).
此过程的输出是已变换样本 (transformed sample) 的列表 y, 元素为 y[i], 其中 i = 0..(nTbS - 1).
按第 6.3.2.3 节规定的变换矩阵推导过程 (transformation matrix derivation process) 被调用, 输入为变换大小 nTbS, 输出为变换矩阵 (transformation matrix) transMatrix.
对于 i = 0..(nTbS - 1) 的已变换样本列表 y[i], 推导如下:
y[i] = sum(j = 0, nTbS - 1, transMatrix[i][j] * x[j])
6.3.2.3. 变换矩阵推导过程 (Transformation Matrix Derivation Process)
此过程的输入是一个变量 nTbS, 它指定缩放后变换系数的水平样本大小.
此过程的输出是变换矩阵 transMatrix.
变换矩阵 transMatrix 基于 nTbs 推导如下:
- 如果
nTbS等于 8, 以下内容适用:
transMatrix[m][n] =
{
{ 64, 64, 64, 64, 64, 64, 64, 64 }
{ 89, 75, 50, 18, -18, -50, -75, -89 }
{ 84, 35, -35, -84, -84, -35, 35, 84 }
{ 75, -18, -89, -50, 50, 89, 18, -75 }
{ 64, -64, -64, 64, 64, -64, -64, 64 }
{ 50, -89, 18, 75, -75, -18, 89, -50 }
{ 35, -84, 84, -35, -35, 84, -84, 35 }
{ 18, -50, 75, -89, 89, -75, 50, -18 }
}
图 25: nTbS == 8 的变换矩阵 (Transform matrix)