跳到主要内容

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 左上样本相对于当前帧左上亮度样本的位置.

  • 两个变量 nBlkWnBlkH, 分别指定当前块 (block) 的宽度和高度.

  • 一个变量 cIdx, 指定当前块的颜色分量.

  • 一个重建块的 recSamples(nBlkW)x(nBlkH) 数组.

此过程的输出是重建样本的 (nBlkW)x(nBlkH) 数组 recSamples 的修改版本.

以下内容适用:

  • 变量 numBlkXnumBlkY 推导如下:

    • numBlkX = nBlkW // TrSize

    • numBlkY = nBlkH // TrSize

  • 对于 yIdx = 0..numBlkY - 1, 以下内容适用:

    • 对于 xIdx = 0..numBlkX - 1, 以下内容适用:

      • 变量 xBlkyBlk 推导如下:

        • 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 - 1e[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 - 1r[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)