您当前的位置:首页 > T/AI 129.1-2024 信息技术 感知无损压缩 第1部分:图像 > 下载地址2
T/AI 129.1-2024 信息技术 感知无损压缩 第1部分:图像
- 名 称:T/AI 129.1-2024 信息技术 感知无损压缩 第1部分:图像 - 下载地址2
- 类 别:电子信息
- 下载地址:[下载地址2]
- 提 取 码:
- 浏览次数:3
发表评论
加入收藏夹
错误报告
目录| 新闻评论(共有 0 条评论) |
资料介绍
ICS 35.040
CCS L 71
团体标准
T/AI 129.1—2024
信息技术 感知无损压缩 第1部分:图像
Information technology - Perceptual lossless compression - Part 1: Image
2024 - 10 - 14 发布 2024 - 10 - 14 实施
中关村视听产业技术创新联盟 发布
目 次
前言 .............................................................................. II
引言 ............................................................................. III
1 范围 ............................................................................. 1
2 规范性引用文件 ................................................................... 1
3 术语和定义 ....................................................................... 1
4 缩略语 ........................................................................... 4
5 约定 ............................................................................. 5
6 编码位流的结构 .................................................................. 10
7 位流的语法和语义 ................................................................ 14
8 解析过程 ........................................................................ 44
9 解码过程 ........................................................................ 49
附录A (规范性) RGB 与YCoCg 的转换方法 ............................................ 67
附录B (规范性) 档次 ............................................................. 68
附录C (规范性) 位流参考缓冲区管理 ............................................... 69
附录D (资料性) 编码端参考方案 ................................................... 71
附录E (规范性) 图像填补参考方案 ................................................. 83
附录F (资料性) 子流交织参考方案 ................................................. 86
附录G (规范性) 接口档次传输层适配信息 ........................................... 88
T/AI 129.1—2024
II
前 言
本文件按照GB/T 1.1—2020《标准化工作导则 第1部分:标准化文件的结构和起草规则》的规定起
草。
本文件是T/AI 129《信息技术 感知无损压缩》的第1部分。T/AI 129已经发布了以下部分:
——第1 部分:图像。
本文件由数字音视频编解码技术标准工作组提出。
本文件由中关村视听产业技术创新联盟归口。
本文件起草单位:鹏城实验室、北京大学、杭州海康威视数字技术股份有限公司、上海海思技术
有限公司、绍兴市北大信息技术科创中心、深圳市大疆创新科技有限公司、中山大学、广州柯维新数码
科技有限公司、紫光展锐(上海)科技有限公司、绍兴文理学院、广东博华超高清创新中心有限公司。
本文件起草人:高文、黄铁军、马思伟、郑萧桢、梁凡、孙煜程、杨海涛、潘冬萍、魏亮、张嘉琪、
王岩、曹小强、任荟文、宋泽田、罗忆、王丹妮、江桥、陈方栋、王莉、冯俊凯、王苫社、贾川民、张
伟民、郑建铧、王泽镐、赵利平、孟现东、熊瑞勤、曾志华、岳泊暄、王丽萍、卫小涛、李荣、罗小伟、
赵海英、崔晓冉。
T/AI 129.1—2024
III
引 言
T/AI 129旨在确立智能媒体压缩的方法,拟由三个部分构成。
——第1部分:图像。目的在于确立智能媒体感知无损图像压缩方法。
——第2部分:符合性。目的在于确立智能媒体感知无损图像压缩的符合性测试方法。
——第3部分:参考软件。目的在于确立智能媒体感知无损图像压缩的软件实现方法。
本文件的发布机构提请注意,声明符合本文件时,可能涉及到9.6与《视频压缩码率控制的方法及
装置》(专利号:CN202210687517.7);9.6与《用于视频压缩的量化方法及装置》(专利号:
CN202310035243.8);9.6与《码率控制的方法及装置》(专利号:CN202310035241.9);9.6与《码率
控制的方法及装置》(专利号:CN202310437128.3);7.1.4、7.1.5、7.2.4、7.2.5、9.4、9.7与《图
像解码方法、编码方法及装置》(专利号:CN202111335613.7);7.1.4、7.2.4、9.6与《解码方法、
编码方法及装置》(专利号:CN202111334223.8);7.1.5、7.2.5、9.5、9.7.2.2与《一种视频编解码
方法及装置》(专利号:CN202111333832.1);7.1.4、7.2.4、9.4、9.7与《图像编解码方法、装置及
存储介质》(专利号:CN202210016199.1);7.1.5、7.2.5与《一种系数解码方法、装置、图像解码器
及电子设备》(专利号:CN202210062532.2);7.1.4、7.2.4、9.4、9.7与《一种解码、编码方法、装
置及其设备》(专利号:CN202210061340.X);9.7.2.3与《一种图像解码方法、编码方法及装置》(专
利号:CN202210062756.3);9.7.2.3与《一种图像解码方法、编码方法及装置》(专利号:
CN202210976078.1);9.6与《一种视频译码方法、装置及存储介质》(专利号:CN202210887907.9);
7.1.4、7.1.5、7.2.4、7.2.5、8.2.3.9与《一种图像编解码方法及装置》(专利号:CN202210894255.1);
9.7.3.4.2.2、7.1.5、7.2.5与《一种编解码方法、装置及其设备》(专利号:CN202210887893.0);
7.1.4、7.2.4、9.7.1与《图像编解码方法、装置及存储介质》(专利号:CN202211146464.4);7.1.2、
7.1.1.2、7.2.1.1、9.6.2与《图像编解码方法、装置及存储介质》(专利号:CN202211448399.0);
7.1.4、7.2.4、9.7.3.2与《量化参数调整方法、装置、设备及存储介质》(专利号:CN202211741038.5);
6.3、7.1.1.2、7.2.1.1与《一种编码、解码方法, 装置及其设备》(专利号:CN202210273469.7);
7.1.5、7.2.5、9.5、9.7.2.2与《图像编解码方法、装置、电子设备及存储介质》(专利号:
CN202310440975.5);7.1.4、7.2.4、9.7.3.4.3与《一种解码、编码方法、装置及其设备》(专利号:
CN202210458047.7);7.1.4、7.2.4、9.6与《一种视频译码方法、装置及存储介质》(专利号:
CN202210612716.1);7.1.4、7.1.5、7.2.4、7.2.5、8.2.3.9与《一种图像编解码方法及装置》(专
利号:CN202210631100.9);7.1.4、7.2.4、9.7.3.4.2.1与《图像重建方法、装置、设备及存储介质》
(专利号:CN202310264176.7);3.44、3.45、6.4、6.5、7.1、7.2、8.1、F与编解码方法和装置(专
利号:202210186914.6);7.1、7.2、8.1与《编码方法及编码器》(专利号:202210860456.X);3.44、
3.45、6.4、6.5、7.1、7.2、8.1,F与《编解码方法和装置》(专利号:202280015193.0);3.25、7.2、
9.4、9.6、9.7、D.2与《一种编解码方法及装置》(专利号:202211698666.X);3.44、3.45、6.4、
6.5、7.1、7.2、8.1、F与《一种编解码方法及装置》(专利号:202211698950.7);3.1、3.15、3.31、
3.8、7.1.4.1、7.2.1.1、9.3、9.4、9.6.2、9.6.4、9.7.3.1、D.2与《图像编解码方法、装置、编码
器、解码器和系统》(专利号:202211696812.5);3.1、3.31、3.8、7.1.4.1、9.6.2、9.6.4、9.7、
9.7.3.1、D.2与《图像编解码方法、装置、编码器、解码器和系统》(专利号:202211698013.1);3.1、
3.15、3.31、5.7、7.1.4.1、7.2.1.1、9.3、9.4、9.6.2、9.7.3.1、D.2与《图像编解码方法、装置、
编码器、解码器和系统》(专利号:202211696765.4);3.1、3.31、6.5、7.1.4.1、7.2.1.1、7.2.5、
T/AI 129.1—2024
IV
8.2.3.2、8.2.3.9与《一种解码方法、编码方法及相关设备》(专利号:202310258261.2);3.1、3.9、
3.21、3.23、3.31、9.6.1、D.1、D.2、D.2.3与《编解码方法和装置》(专利号:202211373846.0);
3.1、3.8、3.9、7.2.1.1、9.6.1、9.7.2.3.2、9.7.2.3.3、D.2与《量化参数获取方法和装置》(专利
号:202310283307.6);3.1、3.15、3.31、5.7、7.1.4.1、7.2.1.1、9.3、9.4、9.6.2、9.7.3.1、D.2
与《一种图像编解码方法、装置、编码器、解码器和系统》(专利号:202310301666.X);3.1、3.29、
3.31、3.45、7.1.4.1、9.4、9.6.4、E.1、E.2与《编解码方法和装置》(专利号:202310290271.4);
3.1、3.8、3.21、3.22、3.31、3.34、3.39、7.1.4.2、7.2.1.1、9.6.1、9.7.3.4.2.2、9.7.3.2、D.2、
D.3.3.2.1与《编解码方法及电子设备》(专利号:202310284038.5);3.1、3.8、3.21、3.22、3.31、
3.34、3.39、7.1.4.2、7.2.1.1、9.6.1、9.7.3.4.2.1、9.7.3.4.2.2、9.7.3.2、D.2、D.3.3.2.1、D.3.3.2.3
与《编解码方法及电子设备》(专利号:202310280913.2)。
本文件的发布机构对于该专利的真实性、有效性和范围无任何立场。
该专利持有人已向本文件的发布机构保证,他愿意同任何申请人在合理且无歧视的条款和条件下,
就专利授权许可进行谈判。该专利持有人的声明已在本文件的发布机构备案,相关信息可以通过以下联
系方式获得:
专利持有人:北京大学
地址:北京市海淀区颐和园路5号理科2号楼2604室
邮编:100871
专利持有人: 华为技术有限公司
地址:北京市上地信息路3号华为大厦
邮编:100085
专利持有人:杭州海康威视数字技术股份有限公司
地址: 浙江省杭州市滨江区阡陌路555号
邮编: 310051
联 系 人:黄铁军
通讯地址:北京大学理科2号楼2641室
邮政编码:100871
电子邮件:tjhuang@pku.edu.cn
电 话:+8610-62756172
传 真:+8610-62751638
网 址:http://www.avs.org.cn
请注意除上述专利外,本文件的某些内容仍可能涉及专利。本文件的发布机构不承担识别这些专利
的责任。
T/AI 129.1—2024
1
信息技术 感知无损压缩 第1 部分:图像
1 范围
本文件规定了图像感知无损压缩方法的编码位流的结构、位流的语法和语义、解析过程和解码过程。
本文件适用于静止图像、网络视频、数字电影、即时通信、视频监控、虚拟现实和增强现实等领域
的高速视频压缩传输应用。
2 规范性引用文件
本文件无规范性引用文件。
3 术语和定义
下列术语和定义适用于本文件。
3.1
编码单元 coding unit
包括一个宽为M高为N的亮度样值矩阵和对应的色度样值矩阵,由图像划分得到。
3.2
编码块 coding block
一个宽为M高为N的样值矩阵,由图像的三个样值矩阵(亮度和两个色度)中的一个矩阵划分得到。
3.3
编码图像 coded picture
一幅图像的编码表示。
3.4
残差 residual
样本或数据元素的重建值与其预测值之差。
3.5
残差集合 residual set
包括一个或多个残差的集合,由残差块划分得到,一个残差块由一个或多个互不重叠的残差集合构
成。
3.6
残差块 residual block
一个M×N的残差矩阵,由编码块对应的残差构成。
3.7
残差组 residual group
包括多个残差的组,由残差集合划分得到,一个残差集合由一个或多个互不重叠的残差组构成。
3.8
重建样本 reconstructed sample
由解码器根据位流解码得到并构成解码图像的样本。
3.9
T/AI 129.1—2024
2
点预测模式 point prediction mode
编码单元中的部分样值须依次获取其预测值的预测模式。
3.10
二元符号 bin
组成二元符号串的符号,包括‘0’和‘1’。
3.11
二元符号串 bin string
有限位二元符号组成的有序序列,最左边符号是最高有效位,最右边符号是最低有效位。
3.12
分量 component
图像的三个样值矩阵(亮度和两个色度)中的一个矩阵或矩阵中的单个样值。
3.13
反量化 dequantization
对量化残差缩放后得到残差重建值的过程。
3.14
光栅扫描 raster scan
将二维矩形光栅映射到一维光栅,一维光栅的入口从二维光栅的第一行开始,然后扫描第二行、第
三行,依次类推。光栅中的行从左到右扫描。
3.15
缓冲区 buffer
用于在解码前临时存放位流的存储区域。
3.16
划分 partition
将一个集合分为子集。集合中的每个元素属于且只属于某一个子集。
3.17
划分方式 partition type
划分获得的子集的组织方式。
3.18
解码图像 decoded picture
解码器根据位流重建的图像。
3.19
解析过程 parse
由位流获得语法元素的过程。
3.20
块 block
一个M×N(M列N行)的样值矩阵。
3.21
块复制帧内预测 intra block copy prediction
在相同解码图像中使用已解码的样值复制至当前样本区域,作为当前样本预测值的模式。复制样值
的区域与当前样本区域大小相同。
3.22
块矢量 block vector
T/AI 129.1—2024
3
用于块复制帧内预测模式的一维矢量,其值为当前预测块和参考块之间的坐标偏移量,其中,当前
预测块与参考块均在当前图像中。
3.23
块预测模式 block prediction mode
编码单元中的所有样值可独立获取其预测值的预测模式。
3.24
亮度 luma
表示图像明暗程度的信号。
注:符号为Y,表示亮度信号的样值矩阵或单个样值。
3.25
量化参数 quantization parameter
在解码过程对量化残差进行反量化的参数。
3.26
量化残差 quantization residual
反量化前量化残差的值。
3.27
色度 chroma
用于表示两个色彩差值分量信号。
注:符号为Cr和Cb或者Co和Cg,表示两种色差信号的样值矩阵或单个样值。
3.28
填充位 stuffing bits
编码时插入位流中的位串,在解码时被丢弃。
3.29
条带 slice
由按光栅扫描顺序排列的相邻若干编码单元构成的样值矩阵。
3.30
位串 bit string
有限个二进制位的有序序列,其最左边位是最高有效位,最右边位是最低有效位。
3.31
位流 bitstream
编码图像的全部或部分样本所形成的二进制数据流。
3.32
位流段 chunk
一个条带编码产生的位流可划分为多个位流段,水平排列的条带编码产生的位流段交织构成一幅编
码图像的位流。
3.33
样本 sample
构成图像的基本元素。
3.34
预测 prediction
预测过程的具体实现。
3.35
预测补偿 prediction compensation
T/AI 129.1—2024
4
求由语法元素解码得到的样本残差与其对应的预测值之和。
3.36
预测单元 prediction unit
可包含一个亮度预测块和对应的色度预测块。
3.37
预测过程 prediction process
使用先前已解码的样值获取当前样值的预测值。
3.38
预测块 prediction block
一个使用相同预测过程的M×N的样值矩阵,由编码单元划分得到。
3.39
预测值 prediction value
在样值的解码过程中,用到的先前已解码的样值。
3.40
语法元素 syntax element
位流中的数据单元解析后的结果。
3.41
样值 sample value
样本的幅值。
3.42
字节 byte
8位的位串。
3.43
字节对齐 byte alignment
从位流的第一个二进制位开始,某二进制位的位置是8的整数倍。
3.44
子流 substream
编码一个分量的样本所形成的二进制数据流。
3.45
子流片 substream segment
子流片包含子流索引和子流片数据,子流片数据从子流划分得到,子流片数据长度与比特深度以及
图像格式有关,子流索引用以指示当前子流片所属的子流。子流片交织成位流段。
4 缩略语
下列缩略语适用于本文件。
BBV 位流参考缓冲区管理(bitstream buffer verifier)
BRC 块级重建值补偿(block reconstruction compensation)
BWQ 块级量化参数调整(block wise quantization)
CB 编码块(coding block)
CU 编码单元(coding unit)
DP 差值预测(difference prediction)
IBC 帧内块复制(intra block copy)
T/AI 129.1—2024
5
MSB 最高有效位(most significant bit)
PWQ 像素级级量化参数调整(pixel wise quantization)
RG 残差组(residual group)
RS 残差集合(residual set)
5 约定
5.1 概述
本文件中使用的数学运算符和优先级参照C语言。但对整型除法和算术移位操作进行了特定定义。
除特别说明外,约定编号和计数从0开始。
5.2 算术运算符
算术运算符定义见表1。
表1 算术运算符定义
算术运算符 定义
+ 加法运算
- 减法运算(二元运算符)或取反(一元前缀运算符)
× 乘法运算
ab 幂运算,表示a的b次幂。也可表示上标
/
整除运算,沿向0的取值方向截断。例如,7/4和-7/-4截断至1,-7/4和7/-4截断至
-1
÷ 除法运算,不做截断或四舍五入
b
a
除法运算,不做截断或四舍五入
( )
b
i a
f i
= Σ
自变量i取由a到b(含b)的所有整数值时,函数f (i)的累加和
a % b 模运算,a除以b的余数,其中a与b都是正整数
. 上取整
5.3 逻辑运算符
逻辑运算符定义见表2。
T/AI 129.1—2024
6
表2 逻辑运算符定义
逻辑运算符 定义
a && b a和b之间的与逻辑运算
a || b a和b之间的或逻辑运算
! 逻辑非运算
express ? a :
b
如果表达式express的结果为真或不为0,则使用a进行赋值;否则,使用b进行赋值
5.4 关系运算符
关系运算符定义见表3。
表3 关系运算符定义
关系运算符 定义
> 大于
>= 大于或等于
< 小于
<= 小于或等于
== 等于
!= 不等于
5.5 位运算符
位运算符定义见表4。
表4 位运算符定义
位运算符 定义
& 与运算
| 或运算
~ 取反运算
a >> b 将a以2的补码整数表示的形式向右移b位。仅当b取正数时定义此运算
a << b 将a以2的补码整数表示的形式向左移b位。仅当b取正数时定义此运算
5.6 赋值
赋值运算定义见表5。
T/AI 129.1—2024
7
表5 赋值运算定义
赋值运算 定义
= 赋值运算符
++ 递增,x++相当于x = x + 1。当用于数组下标时,在自加运算前先求变量值
-- 递减,x--相当于x = x – 1。当用于数组下标时,在自减运算前先求变量值
+= 自加指定值,例如x += 3相当于x = x + 3,x += (-3)相当于x = x + (-3)
-= 自减指定值,例如x -= 3相当于x = x - 3,,x -= (-3)相当于x = x - (-3)
5.7 数学函数
数学函数定义见式(1)~式(7)。
; 0
Abs( )
; 0
x x
x
x x
>=
= − <
............................. (1)
式中:
x ——自变量x。
Ceil(x) = x .................................. (2)
式中:
x ——自变量x。
;
Clip3( , , ) ;
;
i x i
i j x j x j
x
<
= >
其他
............................. (3)
式中:
x ——自变量x;
i ——下界;
j ——上界。
;
Min( , )
;
x x y
x y
y x y
<=
= >
............................ (4)
式中:
x ——自变量x;
y ——自变量y。
;
Max( , )
;
x x y
x y
y x y
>=
= <
............................ (5)
式中:
x ——自变量x;
y ——自变量y。
T/AI 129.1—2024
8
1 ; 0
Sign( )
1 ; 0
x
x
x
>=
= − <
............................. (6)
式中:
x ——自变量x。
2 Log(x) = log x ..................................... (7)
式中:
x ——自变量x。
5.8 结构关系符
结构关系符定义见表6。
表6 结构关系符
结构关系符 定义
-> 例如:a->b表示a是一个结构,b是a的一个成员变量
5.9 位流语法、解析过程和解码过程的描述方法
5.9.1 位流语法的描述方法
位流语法描述方法类似C语言。位流的语法元素使用粗体字表示,每个语法元素通过名字(用下划
线分割的英文字母组,所有字母都是小写)、语法和语义来描述。语法表和正文中语法元素的值用常规
字体表示。
某些情况下,可在语法表中应用从语法元素导出的其他变量值,这样的变量在语法表或正文中用不
带下划线的小写字母和大写字母混合命名。大写字母开头的变量用于解码当前以及相关的语法结构,也
可用于解码后续的语法结构。小写字母开头的变量只在它们所在的小节内使用。
语法元素值的助记符和变量值的助记符与它们的值之间的关系在正文中说明。在某些情况下,二者
等同使用。助记符由一个或多个使用下划线分隔的字母组表示,每个字母组以大写字母开始,也可包括
多个大写字母。
位串的长度是4的整数倍时,可使用十六进制符号表示。十六进制的前缀是“0x”,例如“0x1a”
表示位串“0001 1010”。
条件语句中0表示FALSE,非0表示TRUE。
语法表描述了所有符合本文件的位流语法的超集,附加的语法限制在相关条中说明。
表7给出了描述语法的伪代码例子。当语法元素出现时,表示从位流中读一个数据单元。
表7 语法描述的伪代码
伪代码 描述符
/*语句是一个语法元素的描述符,或者说明语法元素的存在、类型和数值,下
面给出两个例子。*/
syntax_element ce(v)
conditioning statement
T/AI 129.1—2024
9
表7(续)
伪代码 描述符
/*花括号括起来的语句组是复合语句,在功能上视作单个语句。*/
{
statement
…
}
/*“while”语句测试condition是否为TRUE,如果为TRUE,则重复执行循环体,
直到condition不为TRUE。*/
while ( condition )
statement
/*“do … while”语句先执行循环体一次,然后测试condition是否为TRUE,
如果为TRUE,则重复执行循环体,直到condition不为TRUE。*/
do
statement
while ( condition )
/*“if … else”语句首先测试condition,如果为TRUE,则执行primary语句,
否则执行alternative语句。如果alternative语句不需要执行,结构的“else”
部分和相关的alternative语句可忽略。*/
if ( condition )
primary statement
else
alternative statement
/*“for”语句首先执行initial语句,然后测试condition,如果condition为
TRUE,则重复执行primary语句和subsequent语句直到condition不为TRUE。*/
for ( initial statement; condition; subsequent statement )
primary statement
/*“break”语句用于do-while、while和for循环体中,可使当前循环体立即
终止循环。*/
break
解析过程和解码过程用文字和类似C语言的伪代码描述。
5.9.2 函数
5.9.2.1 概述
以下函数用于语法描述。假定解码器中存在一个位流指针,这个指针指向位流中要读取的下一个二
进制位的位置。函数由函数名及左右圆括号内的参数构成。函数也可没有参数。
5.9.2.2 byte_aligned( )
如果位流的当前位置是字节对齐的,返回TRUE,否则返回FALSE。
5.9.2.3 read_bits( n )
T/AI 129.1—2024
10
返回位流的随后n个二进制位,MSB在前,同时位流指针前移n个二进制位。如果n等于0,则返回0,
位流指针不前移。
函数也用于解析过程和解码过程的描述。
5.9.3 描述符
描述符表示不同语法元素的解析过程,见表8。
表8 描述符
描述符 说明
ce(v) 变长的语法元素。解析过程在8.2 中定义
b(n) 一个任意取值的n个二进制位。解析过程由函数read_bits(n)的返回值规定
f(n) 取特定值的连续n个二进制位。解析过程由函数read_bits(n)的返回值规定
r(n) 连续n个‘0’。解析过程由函数read_bits(n)的返回值规定
u(n)
n位无符号整数。在语法表中,如果n是“v”,其位数由其他语法元素值确定。解析过程由函数
read_bits(n)的返回值规定,该返回值用高位在前的二进制表示
5.9.4 保留、禁止和标记位
本文件定义的位流语法中,某些语法元素的值被标注为“保留”(reserved)或“禁止”(forbidden)。
“保留”定义了一些特定语法元素值用于将来对本文件的扩展。这些值不应出现在符合本文件的位
流中。
“禁止”定义了一些特定语法元素值,这些值不应出现在符合本文件的位流中。
位流中的“保留位”(reserved_bits)表明保留了一些语法单元用于将来对本文件的扩展,解码
处理应忽略这些位。
6 编码位流的结构
6.1 图像
6.1.1 概述
图像是位流的最高层语法结构,本文件仅支持逐行图像。一幅图像的编码数据由图像头开始。
图像由三个样本矩阵构成,包括一个亮度样本矩阵(Y)和两个色度样本矩阵(Cb和Cr,或Co和Cg)。
样本矩阵元素的值为整数。亮色度之间的关系,包括原始信号的色度和转移特性等可在位流中定义,这
些信息不影响解码过程。图像的解码处理包括解析过程和解码过程。
如果MultiplexingEnableFlag等于1,则位流由位流段交织而成。一个条带编码产生的位流可划分
为多个位流段,水平排列的条带编码产生的位流段交织构成一幅编码图像的位流。其中,条带编码产生
的位流是由子流片交织而成。子流片包含子流索引和子流片数据。一个分量的样本所形成的二进制数据
流可划分为多个等尺寸的子流片数据。子流片数据长度与比特深度以及图像格式有关。子流索引用以指
示当前子流片所属的子流。
6.1.2 图像格式
6.1.2.1 4:0:0 格式
T/AI 129.1—2024
11
对于4:0:0格式,只包括Y矩阵。
亮度样本位置见图1 。
代表亮度样本
图1 4:0:0 格式下亮度样本位置
6.1.2.2 4:2:0 格式
对于4:2:0格式,Cb和Cr矩阵水平和垂直方向的尺寸都只有Y矩阵的一半。Y矩阵的行数和每行样本
数都应是偶数。
一种可能的亮度和色度样本位置见图2。
代表亮度样本代表色度样本
图2 4:2:0 格式下亮度和色度样本位置
6.1.2.3 4:2:2 格式
对于4:2:2格式,Cb和Cr矩阵在水平方向的尺寸只有Y矩阵的一半,在垂直方向的尺寸和Y相同。Y
矩阵的每行样本数应是偶数。
亮度和色度样本位置见图3。
代表亮度样本代表色度样本
图3 4:2:2 格式下亮度和色度样本位置
T/AI 129.1—2024
12
6.1.2.4 4:4:4 格式
对于4:4:4格式,Cb和Cr矩阵(Co和Cg矩阵)在水平和垂直方向的尺寸都和Y矩阵一样。
亮度和色度样本位置见图4。
代表亮度样本代表色度样本
图4 4:4:4 格式下亮度和色度样本位置
6.2 条带
条带是图像中的矩形区域,条带之间不应重叠,每个条带的尺寸一致,一种可行的条带结构见图5 。
其中,最小的矩形为宽为16高为2的编码单元,粗线为条带划分线,A~I表示尺寸相同的9个条带。
A
D
B
E
G H
C
F
I
图5 条带结构
6.3 位流段
如果MultiplexingEnableFlag等于1,则位流由位流段交织而成。一个条带编码产生的位流可划分
为多个位流段,水平排列的条带编码产生的位流段交织构成一幅编码图像的位流。
记当前图像每行的条带个数为a,每列的条带个数为b,每个条带中的位流段数量为n,其中:
a = PictureWidthInSlice
b = PictureHeightInSlice
n = ChunkNum
位流段的交织如图6所示。
T/AI 129.1—2024
13
size0 size0 size0
S0,0_C0 S1,0_C0 … Sa-1,0_C0
size1 size1 size1
S0,0_Cn-1 S1,0_Cn-1 … Sa-1,0_Cn-1
size0 size0 size0
S0,0_C1 S1,0_C0 … Sa-1,0_C1
…
size0 size0 size0
S0,1_C0 S1,1_C0 … Sa-1,1_C0
size1 size1 size1
S0,1_Cn-1 S1,1_Cn-1 … Sa-1,1_Cn-1
size0 size0 size0
S0,1_C1 S1,1_C1 … Sa-1,1_C1
…
…
图6 位流段交织示意图
其中,Si,j_Ck表示水平索引为i,竖直索引为j的条带的第(k+1)个位流段,size0,size1的计算过程
为:
size0 = ChunkSizeInBit
size1 = TotalBits – (n – 1) ×ChunkSizeInBit
6.4 子流片
如果MultiplexingEnableFlag等于1,则条带位流由子流片交织而成。子流片包含子流索引和子流
片数据。一个分量的样本所形成的二进制数据流可划分为多个等尺寸的子流片数据。子流片数据长度与
比特深度以及图像格式有关。子流索引用以指示当前子流片所属的子流。
记当前图像的子流片个数为n,alignmentBit长度为m,其中:
size = SubstreamSegmentSize – 2
n = SubstreamSegmentNumAll
m = SliceAlignmentBitNum
子流片的交织如图7 所示。
2 size m
ssIdx0 ssBody0 …
2 size
ssIdxn-1 ssBodyn-1
2 size
ssIdx1 ssBody1 alignmentBit
图7 子流片交织示意图
其中,ssIdxi表示第i个子流片的子流索引(长度为2比特),ssBodyi表示第i个子流片的子流片数
据(长度为SubstreamSegmentSize–2比特),alignmentBits表示条带对齐填充位(其值均为‘0’)。
T/AI 129.1—2024
14
6.5 编码单元,残差块,残差集合和残差组
图像划分为相同大小的编码单元,编码单元之间不应重叠,编码单元不应超出图像边界。其中,
CuWidth为编码单元的宽,其值等于16,CuHeight为编码单元的高,其值等于2,CuSize为编码单元的面
积,其值等于CuWidth×CuHeight。
编码单元包括一个或三个编码块。
一个编码块对应一个残差块,残差块中的残差被划分为一个或多个残差集合,每个残差集合被划分
为若干个残差组。
如果MultiplexingEnableFlag等于1,则编码单元相同分量的语法元素进入同一子流。
7 位流的语法和语义
7.1 语法描述
7.1.1 图像语法
7.1.1.1 图像定义
图像定义见表9。
表9 图像定义
图像定义 描述符
picture( ) {
picture_header( )
picture_data( )
}
7.1.1.2 图像头定义
图像头定义见表10。附录G提供了图像头字节说明用于在接口档次下适配传输层。
表10 图像头定义
图像头定义 描述符
picture_header( ) {
profile_id u(8)
if (profile_id == 0x20) { /* Frame buffer profile */
MultiplexingEnableFlag = 0
} else {
MultiplexingEnableFlag = 1
}
input_image_width u(32)
input_image_height u(32)
slice_width u(32)
T/AI 129.1—2024
15
表10(续)
图像头定义 描述符
slice_height u(32)
image_format u(3)
bit_depth u(5)
reserved_bits r(4)
target_bpp u(12)
padding_type_flag u(1)
lossless_enable_flag u(1)
transform_enable_flag u(1)
dp_enable_flag u(1)
brc_enable_flag u(1)
ibc_enable_flag u(1)
pwq_enable_flag u(1)
bwq_enable_flag u(1)
vbr_enable_flag r(1)
pwq_max_qp u(4)
bwq_complex_th u(3)
qp_refine_th0 u(4)
qp_refine_th1 u(4)
jnd_qp u(4)
strict_jnd_qp u(4)
chunk_size_in_cu u(32)
chunk_num u(32)
slice_cu_num_max_bit u(8)
reserved_bits r(2)
padding_stuff_flag u(1)
substream_expansion_ratio_log2 u(3)
substream_segment_size u(10)
transmission_delay_cu u(16)
rc_buffer_size u(16)
for (compL=0; compL<5; compL++) {
for (compC=0; compC<5; compC++) {
reserved_bits r(4)
rc_qp_bias[compL][compC] u(4)
}
}
rc_decrease_step_log2 u(8)
rc_fullness_calc_multiplier u(8)
T/AI 129.1—2024
16
表10(续)
图像头定义 描述符
reserve_bits u(3)
rc_fullness_calc_shift u(5)
rc_extra_buffer_decrease_step_log2 u(8)
rc_extra_buffer_penalty_log2_minus3 u(8)
reserved_bits r(6)
rc_target_end_ratio_minus4 u(2)
rc_ratio0 u(8)
reserved_bits r(5)
rc_param0 u(11)
reserved_bits r(7)
rc_ratio1 u(9)
reserved_bits r(5)
rc_param1 u(11)
reserved_bits r(5)
rc_ratio2 u(11)
reserved_bits r(5)
rc_param2 u(11)
rc_max_relative_bits u(8)
for (comp=0; comp<5; comp++) {
reserved_bits r(5)
rc_lossless_bits[comp] u(11)
}
reserved_bits r(5)
rc_avg_lossless_bits u(11)
reserved_bits r(5)
rc_bits_offset u(11)
reserved_bits r(5)
rc_max_lossless_bits u(11)
reserved_bits r(6)
rc_relative_th u(10)
reserved_bits r(5)
rc_complex_th u(3)
}
7.1.1.3 图像数据定义
图像数据定义见表11。
T/AI 129.1—2024
17
表11 图像数据定义
图像数据定义 描述符
picture_data( ) {
SliceAlignAdj = (((((SliceWidth × TargetBpp) >> 4) + 7) >> 3) << 3) – ((SliceWidth × TargetBpp) >> 4)
for (j=0; j for (i=0; i slice_data(i, j)
}
}
}
7.1.2 条带定义
条带定义见表12。
表12 条带定义
条带定义 描述符
slice_data(i, j) {
CurrSlicePosX = SliceInfo[i][j]->posX
CurrSlicePosY = SliceInfo[i][j]->posY
PrevComplexityLevel = 0
CurrCuIdx = 0 /* CU index within current Slice */
CurrPos = 0
SubstreamBits[0] = 0
SubstreamBits[1] = 0
SubstreamBits[2] = 0
SubstreamSegmentNum[0] = 0
SubstreamSegmentNum[1] = 0
SubstreamSegmentNum[2] = 0
cost = BitDepth[0] × CuSize
if (image_format == ‘001’) { /* YUV420 */
cost += ((BitDepth[1] × (CuWidth / 2) × (CuHeight / 2)) << 1)
} else if (image_format == ‘010’) { /* YUV422 */
cost += ((BitDepth[1] × (CuWidth / 2) × CuHeight) << 1)
} else if (image_format == ‘011’ || image_format == ‘100’) { /* YUV444 or RGB444 */
cost += ((BitDepth[MultiplexingEnableFlag ? 0 : 1] × CuSize) << 1)
}
ExtraBufferSize = (cost – ((CuSize × TargetBpp) >> 4)) << 1
MaxBufferSize = RcBufferSize + ExtraBufferSize /* Actual buffer size for rate control */
T/AI 129.1—2024
18
表12(续)
条带定义 描述符
EndDecreaseBits = MaxBufferSize – DelayBits + (!MultiplexingEnableFlag ? 0 : (image_format ==
‘000’? 1 : 3) × (SubstreamSegmentSize – 1)
EndControlBlocks = (EndDecreaseBits + (1 << RcDecreaseStepLog2) – 1) >> RcDecreaseStepLog2
EndControlBegin = SliceWidthInCu × SliceHeightInCu – EndControlBlocks
RemainBlksLog2 = SliceCuNumMaxBit
CurrRcBufferLevel = 0
PhysicalBufferLevel = CurrSlicePosY == 0 ? 0 : DelayBits
VirtualStartStuff = CurrSlicePosY == 0 ? DelayBits : 0
VirtualEndStuff = 0
if (MultiplexingEnableFlag) {
SubstreamSegmentNumAll = TotalBits / SubstreamSegmentSize
for (idx=0; idx substream_segment( )
}
SliceAlignmentBitNum = TotalBits – SubstreamSegmentSize × substreamSegmentNumAll
for (bitIdx=0; bitIdx slice_alignment_bit0 f(1)
}
} else {
coding_unit(i, j)
}
}
注:SubstreamBits[ssIdx]用于记录第(ssIdx+1)子流的已解析比特数。
7.1.3 子流片定义
子流片定义见表13。
表13 子流片定义
子流片定义 描述符
substream_segment( ) {
substream_index b(2)
substream_segment_data b(v)
}
7.1.4 编码单元语法
7.1.4.1 编码单元定义
编码单元定义见表14。
T/AI 129.1—2024
19
表14 编码单元定义
编码单元定义 描述符
coding_unit(sliceIdxX, sliceIdxY) {
alignNum = 0
remainPixels = 0
isHfSliceWidthInCu = (((SliceWidth >> 5) & 1) == 0) ? 1 : 0
for (x=0; x for (y=0; y CuBits = 0 /* Current CU bits without counting sub stream header */
tmpSliceAlignAdj = 0 /* Additional bits for interface profile */
RemainBlksLog2 = (RemainBlksLog2 > 4 && !((SliceWidthInCu × SliceHeightInCu –
CurrCuIdx) & (1 << RemainBlksLog2))) ? RemainBlksLog2 – 1 : RemainBlksLog2
bppAdj = (EndTargetFullness – PhysicalBufferLevelRecord[CurrPos]) << 7
bppAdj = bppAdj >= 0 ? bppAdj >> (5 + RemainBlksLog2) : –((–bppAdj) >> (5 +
RemainBlksLog2))
bppAdj = Clip3(–512, 1536, bppAdj)
Currbpp = (Targetbpp << 3) + bppAdj
bitsRecordSubstream[0] = SubstreamBits[0]
FallbackFlag = 0
CbLumaSize = CuWidth × CuHeight
if (image_format == ‘000’) { /* YUV400 */
CbChromaSize = 0
ModeBits = DpEnableFlag ? 13 : 8
} else if (image_format == ‘001’) { /* YUV420 */
CbChromaSize = CbLumaSize >> 2
ModeBits = DpEnableFlag ? 20 : 15
} else if (image_format == ‘010’) { /* YUV422 */
CbChromaSize = CbLumaSize >> 1
ModeBits = DpEnableFlag ? 20 : 15
} else if (image_format == ‘011’ || image_format == ‘100’) { /* YUV444 or RGB444 */
CbChromaSize = CbLumaSize
ModeBits = DpEnableFlag ? 26 : 21
}
if (CurrCuIdx >= EndControlBegin) {
VirtualEndStuff = VirtualEndStuff + (1 << RcDecreaseStepLog2)
}
TmpCurrRcBufferLevel = PhysicalBufferLevel + VirtualStartStuff + VirtualEndStuff
Allowfallback = MultiplexingEnableFlag ? 6 : 0 + ModeBits + (BitDepth[0] × CbLumaSize +
BitDepth[MultiplexingEnableFlag ? 0 : 1] × CbChromaSize × 2 – ((CuSize × TargetBpp) >> 4)) >
MaxBufferSize – TmpCurrRcBufferLevel
coding_block_data_substream0(x + SliceWidthInCu × sliceIdxX, y + SliceHeightInCu ×
sliceIdxY)
T/AI 129.1—2024
20
表14(续)
编码单元定义 描述符
CurSubstreamBits[0] = SubstreamBits[0] – bitsRecordSubstream[0]
CuBits += CurSubstreamBits[0]
if (image_format != ‘000’) { /* Not YUV400 */
bitsRecordSubstream[1] = SubstreamBits[1]
coding_block_data_substream1(x + SliceWidthInCu × sliceIdxX, y + SliceHeightInCu ×
sliceIdxY)
CurSubstreamBits[1] = SubstreamBits[1] – bitsRecordSubstream[1]
CuBits += CurSubstreamBits[1]
bitsRecordSubstream[2] = SubstreamBits[2]
coding_block_data_substream2(x + SliceWidthInCu × sliceIdxX, y + SliceHeightInCu ×
sliceIdxY)
CurSubstreamBits[2] = SubstreamBits[2] – bitsRecordSubstream[2]
CuBits += CurSubstreamBits[2]
}
if (!VbrEnableFlag) {
if (MultiplexingEnableFlag) {
if (!(CurrSlicePosY == 0 && CurrCuIdx < TransmissionDelayCu)) {
alignNum++
}
if ((alignNum <<5 ) + remainPixels >= SliceWidth) {
tmpSliceAlignAdj = SliceAlignAdj
alignNum = 0
if (isHfSliceWidthInCu) {
remainPixels = 0
} else {
remainPixels = (remainPixels == 0) ? 16 : 0
}
}
}
bitsGap=0
if (!AllowFallback && PaddingTypeFlag && PaddingStuffFlag && ((x +
SliceWidthInCu × sliceIdxX) >= (PictureWidthInSlice × SliceWidthInCu – (ImageWidth – InputImageWidth)
/ CuWidth) && (y + SliceHeightInCu × sliceIdxY) < (PictureHeightInSlice × SliceHeightInCu –
(ImageHeight – InputImageHeight) / CuHeight))) {
bitsGap = Min((image_format == ‘000’? 1 : 3) × SubstreamSegmentSize, Currbpp >>
2) – CuBits – 6 – (VirtualEndStuff > 0 ? (1 << RcDecreaseStepLog2) : 0)
bitsGap = bitsGap < 0 ? 0 : bitsGap
}
T/AI 129.1—2024
21
表14(续)
编码单元定义 描述符
if (((CurrSlicePosY == 0 && CurrCuIdx >= TransmissionDelayCu) || CurrSlicePosY != 0)
&& (PhysicalBufferLevel + CuBits – ((CuSize × TargetBpp) >> 4) + tmpSliceAlignAdj) < 0) { /*
Underflow */
underflowBits = ((CuSize × TargetBpp) >> 4) + tmpSliceAlignAdj –
(PhysicalBufferLevel + CuBits)
} else {
underflowBits = 0
}
underflowBits=Max(underflowBits ,bitsGap)
StuffBits = 0
if (image_format == ‘000’) { /* 1 substream for YUV400 */
stuffing_data_substream0(underflowBits, CurSubstreamBits, CurSubstreamBits)
StuffBits = StuffBits[0]
} else { /* 3 substreams for other cases */
maxStuffSize = SubstreamSegmentSize – 2
zeroBits[0] = (CurSubstreamBits[0] + underflowBits > maxStuffSize) ? (maxStuffSize
– CurSubstreamBits[0]) : underflowBits
if (CurSubstreamBits[0] + CurSubstreamBits[1] + underflowBits > 2 * maxStuffSize)
{
zeroBits[1] = maxStuffSize – CurSubstreamBits[1]
} else if (CurSubstreamBits[0] + underflowBits > maxStuffSize) {
zeroBits[1] = CurSubstreamBits[0] + underflowBits – maxStuffSize
} else {
zeroBits[1] = 0
}
zeroBits[2] = (CurSubstreamBits[0] + CurSubstreamBits[1] + underflowBits >
(maxStuffSize << 1) ? (CurSubstreamBits[0] + CurSubstreamBits[1] + underflowBits – (maxStuffSize <<
1)) : 0
CurSubstreamBitsMax = Max(CurSubstreamBits[0] + zeroBits[0],
Max(CurSubstreamBits[1] + zeroBits[1], CurSubstreamBits[2] + zeroBits[2]))
stuffing_data_substream0(zeroBits[0], CurSubstreamBits[0], CurSubstreamBitsMax)
stuffing_data_substream1(zeroBits[1], CurSubstreamBits[1], CurSubstreamBitsMax)
stuffing_data_substream2(zeroBits[2], CurSubstreamBits[2], CurSubstreamBitsMax)
StuffBits = StuffBits[0] + StuffBits[1] + StuffBits[2]
}
}
if (MultiplexingEnableFlag) {
headerBits = 0
for (ssIdx=0; ssIdx T/AI 129.1—2024
22
表14(续)
编码单元定义 描述符
tmpSubstreamSegmentNum = (SubstreamBits[ssIdx] + SubstreamSegmentSize – 3) /
(SubstreamSegmentSize – 2)
headerBits += ((tmpSubstreamSegmentNum – SubstreamSegmentNum[ssIdx]) << 1)
SubstreamSegmentNum[ssIdx] = tmpSubstreamSegmentNum
}
}
if (CurrSlicePosY == 0 && CurrCuIdx < TransmissionDelayCu) {
PhysicalBufferLevel = PhysicalBufferLevel + CuBits + headerBits + StuffBits
} else {
PhysicalBufferLevel = PhysicalBufferLevel + CuBits + headerBits + StuffBits – ((CuSize
× TargetBpp) >> 4) – tmpSliceAlignAdj
}
if (CurrCuIdx < TransmissionDelayCu) {
VirtualStartStuff = VirtualStartStuff – ((CuSize × TargetBpp) >> 4)
}
CurrRcBufferLevel = PhysicalBufferLevel + VirtualStartStuff + VirtualEndStuff
if (x == SliceWidthInCu – 1 && y == SliceHeightInCu – 1) { /* Final CU in current Slice */
stuffNum = SubstreamSegmentSize – 2
if (MultiplexingEnableFlag) {
if (SubstreamBits[0] % (SubstreamSegmentSize – 2) != 0)
for(i=0; i substream0_alignment_bit0 f(1)
}
}
if (image_format != ‘000’) { /* Not YUV400 */
if (SubstreamBits[1] % (SubstreamSegmentSize – 2) != 0)
for(i=0; i substream1_alignment_bit0 f(1)
}
}
if (SubstreamBits[2] % (SubstreamSegmentSize – 2) != 0)
for(i=0; i substream2_alignment_bit0 f(1)
}
}
} else {
while (!byte_aligned( )) {
T/AI 129.1—2024
23
表14(续)
编码单元定义 描述符
slice_alignment_bit0 f(1)
}
}
}
}
CurrCuIdx++
CurrPos = (CurrPos + 1) % 3
}
}
}
注:一种典型的实现方式,不同子流可以采用不同的熵解码器进行解析。
7.1.4.2 第一子流编码块定义
第一子流编码块定义见表15。
表15 第一子流编码块定义
第一子流编码块定义 描述符
coding_block_data_substream0(cuIdxX, cuIdxY) {
CbWidth[0] = CuWidth
CbHeight[0] = CuHeight
CbSize[0] = CbWidth[0] ×CbHeight[0]
CbPosX[0] = cuIdxX × CbWidth[0]
CbPosY[0] = cuIdxY × CbHeight[0]
complexity_level_flag[0] u(1)
if (!ComplexityLevelFlag[0]) {
delta_level[0] u(2)
if (delta_level[0] >= PrevComplexityLevel) {
ComplexityLevel[0] = DeltaLevel[0] + 1
} else {
ComplexityLevel[0] = DeltaLevel[0]
}
} else {
ComplexityLevel[0] = PrevComplexityLevel
}
PrevComplexityLevel = ComplexityLevel[0]
T/AI 129.1—2024
24
表15(续)
第一子流编码块定义 描述符
pred_mode[0] ce(v)
if (PredMode[0] == ‘SAMPLE_MODE’ && Allowfallback) {
FallbackFlag = 1
if (IbcEnableFlag) {
fallback_type u(1)
}
PredMode[0] == (FallbackType == 1 || !IbcEnableFlag) ? ‘SAMPLE_MODE’ : ‘IBC_MODE’
}
if (DpEnableFlag && PredMode[0] == ‘SAMPLE_MODE’ && !Allowfallback) {
cu_dp_intra_flag u(1)
if (CuDpIntraFlag) {
for (index=0; index<(CbSize[0]>>3); index++) {
cu_sdp_intra_flag[index] u(1)
}
}
}
if (PredMode[0] == ‘IBC_MODE’) {
if (image_format == ‘000’ || !MultiplexingEnableFlag) { /* YUV400 or multiplexing disabled */
for (blkIdx=0; blkIdx<8; blkIdx++) {
abs_bvd_minus1[blkIdx] u(5)
}
if (DpEnableFlag && !FallbackFlag) {
for (blkIdx=0; blkIdx<8; blkIdx++) {
if (AbsBvDMinus1[blkIdx] == 31) {
if (image_format != ‘000’) { /* Not YUV400 */
sdp_ibc_offset[0][blkIdx] ce(v)
sdp_ibc_offset[1][blkIdx] ce(v)
sdp_ibc_offset[0][blkIdx] ce(v)
} else {
sdp_ibc_offset[0][blkIdx] ce(v)
}
}
}
}
} else {
for (blkIdx=0; blkIdx<5; blkIdx+=4) {
abs_bvd_minus1[blkIdx] u(5)
T/AI 129.1—2024
25
表15(续)
第一子流编码块定义 描述符
}
if (DpEnableFlag && !FallbackFlag) {
for (blkIdx=0; blkIdx<5; blkIdx+=4) {
if (AbsBvDMinus1[blkIdx] == 31) {
sdp_ibc_offset[0][blkIdx] ce(v)
sdp_ibc_offset[1][blkIdx] ce(v)
sdp_ibc_offset[2][blkIdx] ce(v)
}
}
}
}
} else if (PredMode[0] == ‘INTRA_MODE_DC’ || PredMode[0] == ‘INTRA_MODE_ANG_0’ ||
PredMode[0] == ‘INTRA_MODE_ANG_1’ || PredMode[0] == ‘INTRA_MODE_ANG_2’ || PredMode[0] ==
‘INTRA_MODE_ANG_3’ || PredMode[0] == ‘INTRA_MODE_ANG_4’ || PredMode[0] ==
‘INTRA_MODE_ANG_5’) {
if (DpEnableFlag) {
cu_dp_intra_flag u(1)
}
if (CuDpIntraFlag) {
for (index=0; index<(CbSize[0]>>3); index++) {
cu_sdp_intra_flag[index] u(1)
}
for (index=0; index<((CbSize[0]>>3); index++) {
if (CuSdpIntraFlag[index]) {
sdp_intra_offset[0][index] ce(v)
}
}
} else {
if (BrcEnableFlag) {
brc_flag[0] u(1)
}
if (BwqEnableFlag && (!BrcFlag[0] || PredMode[0] == ‘INTRA_MODE_ANG_1’)) {
bwq_flag[0] u(1)
}
if (BrcFlag[0]) {
for (index=0; index<(CbWidth[0]>>2); index++) {
brc_offset_flag[0][index] u(1)
}
T/AI 129.1—2024
26
表15(续)
第一子流编码块定义 描述符
for (index=0; index<(CbWidth[0]>>2); index++) {
if (BrcOffsetFlag[0][index] == 1) {
brc_offset[0][index] u(5)
}
}
}
}
}
residual_block(0)
}
7.1.4.3 第一子流填充数据定义
第一子流填充数据定义见表16。
表16 第一子流填充数据定义
第一子流填充数据定义 描述符
stuffing_data_substream0(zeroBits, curSubstreamBits, curSubstreamBitsMax) {
stuffBits = (curSubstreamBitsMax + SubstreamExpansionRatio – 1) / SubstreamExpansionRatio –
curSubstreamBits
StuffBits[0] = Max(zeroBits, stuffBits)
for (bitIdx = 0; bitIdx block_substream_stuffing_bit0 f(1)
}
}
注:符合本文件位流在当前CU为回退模式时,StuffBits[0]的值应为0。
7.1.4.4 第二子流编码块定义
第二子流编码块定义见表17。
表17 第二子流编码块定义
第二子流编码块定义 描述符
coding_block_data_substream1(cuIdxX, cuIdxY) {
complexity_level_flag[1] u(1)
if (!ComplexityLevelFlag[1]) {
delta_level[1] u(2)
T/AI 129.1—2024
27
表17(续)
第二子流编码块定义 描述符
if (delta_level[1] >= ComplexityLevel[0]) {
ComplexityLevel[1] = DeltaLevel[1] + 1
} else {
ComplexityLevel[1] = DeltaLevel[1]
}
} else {
ComplexityLevel[1] = ComplexityLevel[0]
}
if (MultiplexingEnableFlag && FallbackFlag && (FallbackType == 1 || !IbcEnableFlag)) {
if (SubstreamExpansionRatio >= 4 && SubstreamExpansionRatio < 8)
reserved_bits u(10)
} else if (SubstreamExpansionRatio >= 8 && SubstreamExpansionRatio < 16)
reserved_bits u(5)
} else if(SubstreamExpansionRatio >= 16)
reserved_bits u(2)
}
} else if (PredMode[0] != ‘IBC_MODE’) {
pred_mode[1] ce(v)
} else if (MultiplexingEnableFlag) {
for (blkIdx=1; blkIdx<4; blkIdx++) {
abs_bvd_minus1[blkIdx] u(5)
}
if (DpEnableFlag && !FallbackFlag) {
for (blkIdx=1; blkIdx<4; blkIdx++) {
if (AbsBvDMinus1[blkIdx] == 31) {
sdp_ibc_offset[0][blkIdx] ce(v)
sdp_ibc_offset[1][blkIdx] ce(v)
sdp_ibc_offset[2][blkIdx] ce(v)
}
}
}
}
if (image_format == ‘001’) /* YUV420 */
{
CbWidth[1] = CuWidth >> 1
CbHeight[1] = CuHeight >> 1
} else if (image_format == ‘010’) { /* YUV422 */
T/AI 129.1—2024
28
表17(续)
第二子流编码块定义 描述符
CbWidth[1] = CuWidth >> 1
CbHeight[1] = CuHeight
} else if (image_format == ‘011’ || image_format == ‘100’) { /* YUV444 or RGB444 */
CbWidth[1] = CuWidth
CbHeight[1] = CuHeight
}
CbSize[1] = CbWidth[1] ×CbHeight[1]
CbPosX[1] = cuIdxX × CbWidth[1]
CbPosY[1] = cuIdxY × CbHeight[1]
if (PredMode[1] == ‘INTRA_MODE_DC’ || PredMode[1] == ‘INTRA_MODE_ANG_0’ || PredMode[1]
== ‘INTRA_MODE_ANG_1’ || PredMode[1] == ‘INTRA_MODE_ANG_2’ || PredMode[1] ==
‘INTRA_MODE_ANG_3’ || PredMode[1] == ‘INTRA_MODE_ANG_4’ || PredMode[1] ==
‘INTRA_MODE_ANG_5’) {
if (CuDpIntraFlag) {
for (index=0; index<(CbSize[0]>>3); index++) {
if (CuSdpIntraFlag[index]) {
sdp_intra_offset[1][index] ce(v)
}
}
} else {
if (BrcEnableFlag) {
brc_flag[1] u(1)
}
if (BwqEnableFlag && (!BrcFlag[1] || PredMode[1] == ‘INTRA_MODE_ANG_1’)) {
bwq_flag[1] u(1)
}
if (BrcFlag[1]) {
for (index=0; index<(CbWidth[1]>>2); index++) {
brc_offset_flag[1][index] u(1)
}
for (index=0; index<(CbWidth[1]>>2); index++) {
if (BrcOffsetFlag[1][index] == 1) {
brc_offset[1][index] u(5)
}
}
}
}
}
residual_block(1)
}
T/AI 129.1—2024
29
7.1.4.5 第二子流填充数据定义
第二子流填充数据定义见表18。
表18 第二子流填充数据定义
第二子流填充数据定义 描述符
stuffing_data_substream1(zeroBits, curSubstreamBits, curSubstreamBitsMax) {
stuffBits = (curSubstreamBitsMax + SubstreamExpansionRatio – 1) / SubstreamExpansionRatio –
curSubstreamBits
StuffBits[1] = Max(zeroBits, stuffBits)
for (bitIdx = 0; bitIdx block_substream_stuffing_bit0 f(1)
}
}
注:符合本文件位流在当前CU为回退模式时,StuffBits[1]的值应为0。
7.1.4.6 第三子流编码块定义
第三子流编码块定义见表19。
表19 第三子流编码块定义
第三子流编码块定义 描述符
coding_block_data_substream2(cuIdxX, cuIdxY) {
if (MultiplexingEnableFlag && FallbackFlag && (FallbackType == 1 || !IbcEnableFlag)) {
if (SubstreamExpansionRatio >=4 && SubstreamExpansionRatio < 8)
reserved_bits u(11)
} else if (SubstreamExpansionRatio >= 8 && SubstreamExpansionRatio < 16)
reserved_bits u(6)
} else if (SubstreamExpansionRatio >= 16)
reserved_bits u(3)
}
} else if (PredMode[0] != ‘IBC_MODE’) {
pred_mode[2] ce(v)
} else if (MultiplexingEnableFlag) {
for (blkIdx=5; blkIdx<8; blkIdx++) {
abs_bvd_minus1[blkIdx] u(5)
}
if (DpEnableFlag && !FallbackFlag) {
for (blkIdx=5; blkIdx<8; blkIdx++) {
if (AbsBvDMinus1[blkIdx] == 31) {
sdp_ibc_offset[0][blkIdx] ce(v)
T/AI 129.1—2024
30
表19(续)
第三子流编码块定义 描述符
sdp_ibc_offset[1][blkIdx] ce(v)
sdp_ibc_offset[2][blkIdx] ce(v)
}
}
}
}
if (image_format == ‘001’) /* YUV420 */
{
CbWidth[2] = CuWidth >> 1
CbHeight[2] = CuHeight >> 1
} else if (image_format == ‘010’) { /* YUV422 */
CbWidth[2] = CuWidth >> 1
CbHeight[2] = CuHeight
} else if (image_format == ‘011’ || image_format == ‘100’) { /* YUV444 or RGB444 */
CbWidth[2] = CuWidth
CbHeight[2] = CuHeight
}
CbSize[2] = CbWidth[2] ×CbHeight[2]
CbPosX[2] = cuIdxX × CbWidth[2]
CbPosY[2] = cuIdxY × CbHeight[2]
if (PredMode[2] == ‘INTRA_MODE_DC’ || PredMode[2] == ‘INTRA_MODE_ANG_0’ || PredMode[2]
== ‘INTRA_MODE_ANG_1’ || PredMode[2] == ‘INTRA_MODE_ANG_2’ || PredMode[2] ==
‘INTRA_MODE_ANG_3’ || PredMode[2] == ‘INTRA_MODE_ANG_4’ || PredMode[2] ==
‘INTRA_MODE_ANG_5’) {
if (CuDpIntraFlag) {
for (index=0; index<(CbSize[0]>>3); index++) {
if (CuSdpIntraFlag[index]) {
sdp_intra_offset[2][index] ce(v)
}
}
} else {
if (BrcEnableFlag) {
brc_flag[2] u(1)
}
if (BwqEnableFlag && (!BrcFlag[2] || PredMode[2] == ‘INTRA_MODE_ANG_1’)) {
bwq_flag[2] u(1)
}
if (BrcFlag[2]) {
T/AI 129.1—2024
31
表19(续)
第三子流编码块定义 描述符
for (index=0; index<(CbWidth[2]>>2); index++) {
brc_offset_flag[2][index] u(1)
}
for (index=0; index<(CbWidth[2]>>2); index++) {
if (BrcOffsetFlag[2][index] == 1) {
brc_offset[2][index] u(5)
}
}
}
}
}
residual_block(2)
}
7.1.4.7 第三子流填充数据定义
第三子流填充数据定义见表20。
表20 第三子流填充数据定义
第三子流填充数据定义 描述符
stuffing_data_substream2(zeroBits, curSubstreamBits, curSubstreamBitsMax) {
stuffBits = (curSubstreamBitsMax + SubstreamExpansionRatio – 1) / SubstreamExpansionRatio –
curSubstreamBits
StuffBits[2] = Max(zeroBits, stuffBits)
for (bitIdx = 0; bitIdx block_substream_stuffing_bit0 f(1)
}
}
注:符合本文件位流在当前CU为回退模式时,StuffBits[2]的值应为0。
7.1.5 残差块语法
7.1.5.1 残差块定义
残差块定义见表21。
T/AI 129.1—2024
32
表21 残差块定义
残差块定义 描述符
residual_block(component) {
if (PredMode[component] == ‘SAMPLE_MODE’ || FallbackFlag) {
for (x=0; x for (y=0; y sample_data u(v)
if (FallbackFlag && FallbackType == 0) {
ResiData[component][x][y] = SampleData
} else {
SampleValue[component][x][y] = SampleData << (BitDepth[component] –
BitDepth[0])
}
}
}
} else {
SetNum = CbWidth[component] < CuWidth ? 1 : 2
ResiNum = CbHeight[component] == CuHeight ? 16 : 8
GroupNum = CbHeight[component] == CuHeight ? 4 : 2
for (i=0; i resi_group_type_index ce(v)
GroupType[component][i] = ResiGroupTypeIndex
}
rb_rg_cl(component)
rb_resi_residual(component)
rb_rg_trailing(component)
}
}
7.1.5.2 残差块残差组编码长度定义
残差块残差组编码长度定义见表22。
表22 残差块残差组编码长度定义
残差块残差组编码长度定义 描述符
rb_rg_cl(component) {
if (image_format == ‘010’ && component != 0) { /* YUV422 Chroma */
if (GroupType[component][0] == 0) {
GroupType[component][0] == 1
} else {
T/AI 129.1—2024
33
表22(续)
残差块残差组编码长度定义 描述符
GroupType[component][0] == 4
}
}
for (j=0; j if (GroupType[component][j] == 0) {
groupNum = 1
} else if ((GroupType[component][j] == 1) {
groupNum = 2
} else if (GroupType[component][j] == 2 || GroupType[component][j] == 3) {
groupNum = 3
} else {
groupNum = 4
}
for (i=0; i rg_cl[component][i][j] ce(v)
}
if (ResiNum == 16) {
if (GroupType[component][j] == 0) {
SubRgCl[component][0][j] = RgCl[component][0][j]
SubRgCl[component][1][j] = RgCl[component][0][j]
SubRgCl[component][2][j] = RgCl[component][0][j]
SubRgCl[component][3][j] = RgCl[component][0][j]
} else if (GroupType[component][j] == 1) {
SubRgCl[component][0][j] = RgCl[component][0][j]
SubRgCl[component][1][j] = RgCl[component][0][j]
SubRgCl[component][2][j] = RgCl[component][1][j]
SubRgCl[component][3][j] = RgCl[component][1][j]
} else if (GroupType[component][j] == 2) {
SubRgCl[component][0][j] = RgCl[component][0][j]
SubRgCl[component][1][j] = RgCl[component][0][j]
SubRgCl[component][2][j] = RgCl[component][1][j]
SubRgCl[component][3][j] = RgCl[component][2][j]
} else if (GroupType[component][j] == 3) {
SubRgCl[component][0][j] = RgCl[component][0][j]
SubRgCl[component][1][j] = RgCl[component][1][j]
SubRgCl[component][2][j] = RgCl[component][2][j]
SubRgCl[component][3][j] = RgCl[component][2][j]
T/AI 129.1—2024
34
表22(续)
残差块残差组编码长度定义 描述符
} else if (GroupType[component][j] == 4) {
SubRgCl[component][0][j] = RgCl[component][0][j]
SubRgCl[component][1][j] = RgCl[component][1][j]
SubRgCl[component][2][j] = RgCl[component][2][j]
SubRgCl[component][3][j] = RgCl[component][3][j]
}
} else {
if (GroupType[component][j] == 0) {
SubRgCl[component][0][j] = RgCl[component][0][j]
SubRgCl[component][1][j] = RgCl[component][0][j]
} else if (GroupType[component][j] == 1) {
SubRgCl[component][0][j] = RgCl[component][0][j]
SubRgCl[component][1][j] = RgCl[component][1][j]
}
}
}
}
7.1.5.3 残差块残差数据定义
残差块残差数据定义见表23。
表23 残差块残差数据定义
残差块残差数据定义 描述符
rb_resi_residual(component) {
for (j=0; j for (i=0; i idx = i >> 2
clValue = SubRgCl[component][idx][j]
if (clValue == 0) {
ScanResiData[component][i][j] = 0
} else {
rg_resi_data u(v)
if ((BitDepth[component] != clValue || PredMode[component] == ‘POINT_MODE’) &&
RgResiData > (1 << (clValue – 1))) {
ScanResiData[component][i][j] = RgResiData – (1 << clValue)
} else {
T/AI 129.1—2024
35
表23(续)
残差块残差数据定义 描述符
ScanResiData[component][i][j] = RgResiData
}
}
}
}
}
}
7.1.5.4 残差块残差组边界值标记定义
残差块残差组边界值标记定义见表24。
表24 残差块残差组边界值标记定义
残差块残差组边界值标记定义 描述符
rb_rg_trailing(component) {
for (j=0; j for (i=0; i index = i >> 2
if (SubRgCl[component][index][j] <= 2 && SubRgCl[component][index][j] != 0) {
rg_trailing_flag u(1)
for (subIdx=i; subIdx<(i+4); subIdx++) {
if ((RgTrailingFlag && ScanResiData[component][subIdx][j] == (1 <<
(SubRgCl[component][index][j] – 1))) {
ScanResiData[component][subIdx][j] = – ScanResiData[component][subIdx][j]
}
}
}
}
}
}
7.2 语义描述
7.2.1 图像
7.2.1.1 图像头
档次标号 profile_id
8 位无符号整数。表示位流符合的档次。
档次和级别见附录B。
T/AI 129.1—2024
36
输入图像宽度 input_image_width
32位无符号整数。规定输入图像亮度分量的宽度,即水平方向样本数。input_image_width的单位
应是图像每行样本数。可显示区域的左上角样本应与解码图像左上角样本对齐。InputImageWidth的值
等于input_image_width的值,ImageWidth的值等于((InputImageWidth+SliceWidth-1)/SliceWidth)×
SliceWidth的值,ImageWidth的值不应为0。
输入图像高度 input_image_height
32位无符号整数。规定输入图像亮度分量的高度,即竖直方向扫描行数。input_image_height的单
位应是图像样本的行数,InputImageHeight的值等于input_image_height的值,ImageHeight的值等于
((InputImageHeight + SliceHeight – 1) / SliceHeight) × SliceHeight的值,ImageHeight的值不
应为0。
ImageWidth、ImageHeight与图像边界的关系见图8。图8中,实线表示图像可显示区域边界,其宽
度和高度分别由InputImageWidth和InputImageHeight决定;虚线表示图像边界,其宽度和高度分别由
ImageWidth和ImageHeight决定。
注:图8只是给出了输入图像和解码图像的尺寸关系,一种可行的图像填补方案见附录E。
InputImageWidth
ImageWidth
InputImageHeight
ImageHeight
图8 图像边界示意图
条带宽度 slice_width
条带高度 slice_height
32 位无符号整数。规定条带的宽度和高度。SliceWidth 的值等于slice_width 的值。SliceHeight
的值等于slice_height 的值,slice_width 的值应为CuWidth 的倍数,slice_height 的值应为CuHeight
的倍数。如果MultiplexingEnableFlag 的值为0 , 则TotalBits 的值等于
((((SliceWidth×SliceHeight×TargetBpp)>>4)+7)>>3)<<3 ; 否则, TotalBits 的值等于
(((((SliceWidth×TargetBpp)>>4)+7)>>3)<<3)×SliceHeight。SliceInfo 数组存储了当前图像的条带
信息,其中SliceInfo[i][j]表示当前图像水平索引为i,竖直索引为j 的条带信息。SliceInfo[i][j]
为一结构体,其中每个变量包括posX 和posY 两个参数,SliceInfo[i][j]->posX 表示当前图像水平索
引为i,竖直索引为j 的条带的左上角位置在图像中的横坐标位置,SliceInfo[i][j]->posY 表示当前
图像水平索引为i,竖直索引为j 的条带的左上角位置在图像中的纵坐标位置。
PictureWidthInSlice = (ImageWidth + SliceWidth – 1) / SliceWidth
PictureHeightInSlice = (ImageHeight + SliceHeight – 1) / SliceHeight
SliceWidthInCu = SliceWidth / CuWidth
SliceHeightInCu = SliceHeight / CuHeight
T/AI 129.1—2024
37
for (i=0; i for (j=0; j< PictureHeightInSlice; j++) {
SliceInfo[i][j
CCS L 71
团体标准
T/AI 129.1—2024
信息技术 感知无损压缩 第1部分:图像
Information technology - Perceptual lossless compression - Part 1: Image
2024 - 10 - 14 发布 2024 - 10 - 14 实施
中关村视听产业技术创新联盟 发布
目 次
前言 .............................................................................. II
引言 ............................................................................. III
1 范围 ............................................................................. 1
2 规范性引用文件 ................................................................... 1
3 术语和定义 ....................................................................... 1
4 缩略语 ........................................................................... 4
5 约定 ............................................................................. 5
6 编码位流的结构 .................................................................. 10
7 位流的语法和语义 ................................................................ 14
8 解析过程 ........................................................................ 44
9 解码过程 ........................................................................ 49
附录A (规范性) RGB 与YCoCg 的转换方法 ............................................ 67
附录B (规范性) 档次 ............................................................. 68
附录C (规范性) 位流参考缓冲区管理 ............................................... 69
附录D (资料性) 编码端参考方案 ................................................... 71
附录E (规范性) 图像填补参考方案 ................................................. 83
附录F (资料性) 子流交织参考方案 ................................................. 86
附录G (规范性) 接口档次传输层适配信息 ........................................... 88
T/AI 129.1—2024
II
前 言
本文件按照GB/T 1.1—2020《标准化工作导则 第1部分:标准化文件的结构和起草规则》的规定起
草。
本文件是T/AI 129《信息技术 感知无损压缩》的第1部分。T/AI 129已经发布了以下部分:
——第1 部分:图像。
本文件由数字音视频编解码技术标准工作组提出。
本文件由中关村视听产业技术创新联盟归口。
本文件起草单位:鹏城实验室、北京大学、杭州海康威视数字技术股份有限公司、上海海思技术
有限公司、绍兴市北大信息技术科创中心、深圳市大疆创新科技有限公司、中山大学、广州柯维新数码
科技有限公司、紫光展锐(上海)科技有限公司、绍兴文理学院、广东博华超高清创新中心有限公司。
本文件起草人:高文、黄铁军、马思伟、郑萧桢、梁凡、孙煜程、杨海涛、潘冬萍、魏亮、张嘉琪、
王岩、曹小强、任荟文、宋泽田、罗忆、王丹妮、江桥、陈方栋、王莉、冯俊凯、王苫社、贾川民、张
伟民、郑建铧、王泽镐、赵利平、孟现东、熊瑞勤、曾志华、岳泊暄、王丽萍、卫小涛、李荣、罗小伟、
赵海英、崔晓冉。
T/AI 129.1—2024
III
引 言
T/AI 129旨在确立智能媒体压缩的方法,拟由三个部分构成。
——第1部分:图像。目的在于确立智能媒体感知无损图像压缩方法。
——第2部分:符合性。目的在于确立智能媒体感知无损图像压缩的符合性测试方法。
——第3部分:参考软件。目的在于确立智能媒体感知无损图像压缩的软件实现方法。
本文件的发布机构提请注意,声明符合本文件时,可能涉及到9.6与《视频压缩码率控制的方法及
装置》(专利号:CN202210687517.7);9.6与《用于视频压缩的量化方法及装置》(专利号:
CN202310035243.8);9.6与《码率控制的方法及装置》(专利号:CN202310035241.9);9.6与《码率
控制的方法及装置》(专利号:CN202310437128.3);7.1.4、7.1.5、7.2.4、7.2.5、9.4、9.7与《图
像解码方法、编码方法及装置》(专利号:CN202111335613.7);7.1.4、7.2.4、9.6与《解码方法、
编码方法及装置》(专利号:CN202111334223.8);7.1.5、7.2.5、9.5、9.7.2.2与《一种视频编解码
方法及装置》(专利号:CN202111333832.1);7.1.4、7.2.4、9.4、9.7与《图像编解码方法、装置及
存储介质》(专利号:CN202210016199.1);7.1.5、7.2.5与《一种系数解码方法、装置、图像解码器
及电子设备》(专利号:CN202210062532.2);7.1.4、7.2.4、9.4、9.7与《一种解码、编码方法、装
置及其设备》(专利号:CN202210061340.X);9.7.2.3与《一种图像解码方法、编码方法及装置》(专
利号:CN202210062756.3);9.7.2.3与《一种图像解码方法、编码方法及装置》(专利号:
CN202210976078.1);9.6与《一种视频译码方法、装置及存储介质》(专利号:CN202210887907.9);
7.1.4、7.1.5、7.2.4、7.2.5、8.2.3.9与《一种图像编解码方法及装置》(专利号:CN202210894255.1);
9.7.3.4.2.2、7.1.5、7.2.5与《一种编解码方法、装置及其设备》(专利号:CN202210887893.0);
7.1.4、7.2.4、9.7.1与《图像编解码方法、装置及存储介质》(专利号:CN202211146464.4);7.1.2、
7.1.1.2、7.2.1.1、9.6.2与《图像编解码方法、装置及存储介质》(专利号:CN202211448399.0);
7.1.4、7.2.4、9.7.3.2与《量化参数调整方法、装置、设备及存储介质》(专利号:CN202211741038.5);
6.3、7.1.1.2、7.2.1.1与《一种编码、解码方法, 装置及其设备》(专利号:CN202210273469.7);
7.1.5、7.2.5、9.5、9.7.2.2与《图像编解码方法、装置、电子设备及存储介质》(专利号:
CN202310440975.5);7.1.4、7.2.4、9.7.3.4.3与《一种解码、编码方法、装置及其设备》(专利号:
CN202210458047.7);7.1.4、7.2.4、9.6与《一种视频译码方法、装置及存储介质》(专利号:
CN202210612716.1);7.1.4、7.1.5、7.2.4、7.2.5、8.2.3.9与《一种图像编解码方法及装置》(专
利号:CN202210631100.9);7.1.4、7.2.4、9.7.3.4.2.1与《图像重建方法、装置、设备及存储介质》
(专利号:CN202310264176.7);3.44、3.45、6.4、6.5、7.1、7.2、8.1、F与编解码方法和装置(专
利号:202210186914.6);7.1、7.2、8.1与《编码方法及编码器》(专利号:202210860456.X);3.44、
3.45、6.4、6.5、7.1、7.2、8.1,F与《编解码方法和装置》(专利号:202280015193.0);3.25、7.2、
9.4、9.6、9.7、D.2与《一种编解码方法及装置》(专利号:202211698666.X);3.44、3.45、6.4、
6.5、7.1、7.2、8.1、F与《一种编解码方法及装置》(专利号:202211698950.7);3.1、3.15、3.31、
3.8、7.1.4.1、7.2.1.1、9.3、9.4、9.6.2、9.6.4、9.7.3.1、D.2与《图像编解码方法、装置、编码
器、解码器和系统》(专利号:202211696812.5);3.1、3.31、3.8、7.1.4.1、9.6.2、9.6.4、9.7、
9.7.3.1、D.2与《图像编解码方法、装置、编码器、解码器和系统》(专利号:202211698013.1);3.1、
3.15、3.31、5.7、7.1.4.1、7.2.1.1、9.3、9.4、9.6.2、9.7.3.1、D.2与《图像编解码方法、装置、
编码器、解码器和系统》(专利号:202211696765.4);3.1、3.31、6.5、7.1.4.1、7.2.1.1、7.2.5、
T/AI 129.1—2024
IV
8.2.3.2、8.2.3.9与《一种解码方法、编码方法及相关设备》(专利号:202310258261.2);3.1、3.9、
3.21、3.23、3.31、9.6.1、D.1、D.2、D.2.3与《编解码方法和装置》(专利号:202211373846.0);
3.1、3.8、3.9、7.2.1.1、9.6.1、9.7.2.3.2、9.7.2.3.3、D.2与《量化参数获取方法和装置》(专利
号:202310283307.6);3.1、3.15、3.31、5.7、7.1.4.1、7.2.1.1、9.3、9.4、9.6.2、9.7.3.1、D.2
与《一种图像编解码方法、装置、编码器、解码器和系统》(专利号:202310301666.X);3.1、3.29、
3.31、3.45、7.1.4.1、9.4、9.6.4、E.1、E.2与《编解码方法和装置》(专利号:202310290271.4);
3.1、3.8、3.21、3.22、3.31、3.34、3.39、7.1.4.2、7.2.1.1、9.6.1、9.7.3.4.2.2、9.7.3.2、D.2、
D.3.3.2.1与《编解码方法及电子设备》(专利号:202310284038.5);3.1、3.8、3.21、3.22、3.31、
3.34、3.39、7.1.4.2、7.2.1.1、9.6.1、9.7.3.4.2.1、9.7.3.4.2.2、9.7.3.2、D.2、D.3.3.2.1、D.3.3.2.3
与《编解码方法及电子设备》(专利号:202310280913.2)。
本文件的发布机构对于该专利的真实性、有效性和范围无任何立场。
该专利持有人已向本文件的发布机构保证,他愿意同任何申请人在合理且无歧视的条款和条件下,
就专利授权许可进行谈判。该专利持有人的声明已在本文件的发布机构备案,相关信息可以通过以下联
系方式获得:
专利持有人:北京大学
地址:北京市海淀区颐和园路5号理科2号楼2604室
邮编:100871
专利持有人: 华为技术有限公司
地址:北京市上地信息路3号华为大厦
邮编:100085
专利持有人:杭州海康威视数字技术股份有限公司
地址: 浙江省杭州市滨江区阡陌路555号
邮编: 310051
联 系 人:黄铁军
通讯地址:北京大学理科2号楼2641室
邮政编码:100871
电子邮件:tjhuang@pku.edu.cn
电 话:+8610-62756172
传 真:+8610-62751638
网 址:http://www.avs.org.cn
请注意除上述专利外,本文件的某些内容仍可能涉及专利。本文件的发布机构不承担识别这些专利
的责任。
T/AI 129.1—2024
1
信息技术 感知无损压缩 第1 部分:图像
1 范围
本文件规定了图像感知无损压缩方法的编码位流的结构、位流的语法和语义、解析过程和解码过程。
本文件适用于静止图像、网络视频、数字电影、即时通信、视频监控、虚拟现实和增强现实等领域
的高速视频压缩传输应用。
2 规范性引用文件
本文件无规范性引用文件。
3 术语和定义
下列术语和定义适用于本文件。
3.1
编码单元 coding unit
包括一个宽为M高为N的亮度样值矩阵和对应的色度样值矩阵,由图像划分得到。
3.2
编码块 coding block
一个宽为M高为N的样值矩阵,由图像的三个样值矩阵(亮度和两个色度)中的一个矩阵划分得到。
3.3
编码图像 coded picture
一幅图像的编码表示。
3.4
残差 residual
样本或数据元素的重建值与其预测值之差。
3.5
残差集合 residual set
包括一个或多个残差的集合,由残差块划分得到,一个残差块由一个或多个互不重叠的残差集合构
成。
3.6
残差块 residual block
一个M×N的残差矩阵,由编码块对应的残差构成。
3.7
残差组 residual group
包括多个残差的组,由残差集合划分得到,一个残差集合由一个或多个互不重叠的残差组构成。
3.8
重建样本 reconstructed sample
由解码器根据位流解码得到并构成解码图像的样本。
3.9
T/AI 129.1—2024
2
点预测模式 point prediction mode
编码单元中的部分样值须依次获取其预测值的预测模式。
3.10
二元符号 bin
组成二元符号串的符号,包括‘0’和‘1’。
3.11
二元符号串 bin string
有限位二元符号组成的有序序列,最左边符号是最高有效位,最右边符号是最低有效位。
3.12
分量 component
图像的三个样值矩阵(亮度和两个色度)中的一个矩阵或矩阵中的单个样值。
3.13
反量化 dequantization
对量化残差缩放后得到残差重建值的过程。
3.14
光栅扫描 raster scan
将二维矩形光栅映射到一维光栅,一维光栅的入口从二维光栅的第一行开始,然后扫描第二行、第
三行,依次类推。光栅中的行从左到右扫描。
3.15
缓冲区 buffer
用于在解码前临时存放位流的存储区域。
3.16
划分 partition
将一个集合分为子集。集合中的每个元素属于且只属于某一个子集。
3.17
划分方式 partition type
划分获得的子集的组织方式。
3.18
解码图像 decoded picture
解码器根据位流重建的图像。
3.19
解析过程 parse
由位流获得语法元素的过程。
3.20
块 block
一个M×N(M列N行)的样值矩阵。
3.21
块复制帧内预测 intra block copy prediction
在相同解码图像中使用已解码的样值复制至当前样本区域,作为当前样本预测值的模式。复制样值
的区域与当前样本区域大小相同。
3.22
块矢量 block vector
T/AI 129.1—2024
3
用于块复制帧内预测模式的一维矢量,其值为当前预测块和参考块之间的坐标偏移量,其中,当前
预测块与参考块均在当前图像中。
3.23
块预测模式 block prediction mode
编码单元中的所有样值可独立获取其预测值的预测模式。
3.24
亮度 luma
表示图像明暗程度的信号。
注:符号为Y,表示亮度信号的样值矩阵或单个样值。
3.25
量化参数 quantization parameter
在解码过程对量化残差进行反量化的参数。
3.26
量化残差 quantization residual
反量化前量化残差的值。
3.27
色度 chroma
用于表示两个色彩差值分量信号。
注:符号为Cr和Cb或者Co和Cg,表示两种色差信号的样值矩阵或单个样值。
3.28
填充位 stuffing bits
编码时插入位流中的位串,在解码时被丢弃。
3.29
条带 slice
由按光栅扫描顺序排列的相邻若干编码单元构成的样值矩阵。
3.30
位串 bit string
有限个二进制位的有序序列,其最左边位是最高有效位,最右边位是最低有效位。
3.31
位流 bitstream
编码图像的全部或部分样本所形成的二进制数据流。
3.32
位流段 chunk
一个条带编码产生的位流可划分为多个位流段,水平排列的条带编码产生的位流段交织构成一幅编
码图像的位流。
3.33
样本 sample
构成图像的基本元素。
3.34
预测 prediction
预测过程的具体实现。
3.35
预测补偿 prediction compensation
T/AI 129.1—2024
4
求由语法元素解码得到的样本残差与其对应的预测值之和。
3.36
预测单元 prediction unit
可包含一个亮度预测块和对应的色度预测块。
3.37
预测过程 prediction process
使用先前已解码的样值获取当前样值的预测值。
3.38
预测块 prediction block
一个使用相同预测过程的M×N的样值矩阵,由编码单元划分得到。
3.39
预测值 prediction value
在样值的解码过程中,用到的先前已解码的样值。
3.40
语法元素 syntax element
位流中的数据单元解析后的结果。
3.41
样值 sample value
样本的幅值。
3.42
字节 byte
8位的位串。
3.43
字节对齐 byte alignment
从位流的第一个二进制位开始,某二进制位的位置是8的整数倍。
3.44
子流 substream
编码一个分量的样本所形成的二进制数据流。
3.45
子流片 substream segment
子流片包含子流索引和子流片数据,子流片数据从子流划分得到,子流片数据长度与比特深度以及
图像格式有关,子流索引用以指示当前子流片所属的子流。子流片交织成位流段。
4 缩略语
下列缩略语适用于本文件。
BBV 位流参考缓冲区管理(bitstream buffer verifier)
BRC 块级重建值补偿(block reconstruction compensation)
BWQ 块级量化参数调整(block wise quantization)
CB 编码块(coding block)
CU 编码单元(coding unit)
DP 差值预测(difference prediction)
IBC 帧内块复制(intra block copy)
T/AI 129.1—2024
5
MSB 最高有效位(most significant bit)
PWQ 像素级级量化参数调整(pixel wise quantization)
RG 残差组(residual group)
RS 残差集合(residual set)
5 约定
5.1 概述
本文件中使用的数学运算符和优先级参照C语言。但对整型除法和算术移位操作进行了特定定义。
除特别说明外,约定编号和计数从0开始。
5.2 算术运算符
算术运算符定义见表1。
表1 算术运算符定义
算术运算符 定义
+ 加法运算
- 减法运算(二元运算符)或取反(一元前缀运算符)
× 乘法运算
ab 幂运算,表示a的b次幂。也可表示上标
/
整除运算,沿向0的取值方向截断。例如,7/4和-7/-4截断至1,-7/4和7/-4截断至
-1
÷ 除法运算,不做截断或四舍五入
b
a
除法运算,不做截断或四舍五入
( )
b
i a
f i
= Σ
自变量i取由a到b(含b)的所有整数值时,函数f (i)的累加和
a % b 模运算,a除以b的余数,其中a与b都是正整数
. 上取整
5.3 逻辑运算符
逻辑运算符定义见表2。
T/AI 129.1—2024
6
表2 逻辑运算符定义
逻辑运算符 定义
a && b a和b之间的与逻辑运算
a || b a和b之间的或逻辑运算
! 逻辑非运算
express ? a :
b
如果表达式express的结果为真或不为0,则使用a进行赋值;否则,使用b进行赋值
5.4 关系运算符
关系运算符定义见表3。
表3 关系运算符定义
关系运算符 定义
> 大于
>= 大于或等于
< 小于
<= 小于或等于
== 等于
!= 不等于
5.5 位运算符
位运算符定义见表4。
表4 位运算符定义
位运算符 定义
& 与运算
| 或运算
~ 取反运算
a >> b 将a以2的补码整数表示的形式向右移b位。仅当b取正数时定义此运算
a << b 将a以2的补码整数表示的形式向左移b位。仅当b取正数时定义此运算
5.6 赋值
赋值运算定义见表5。
T/AI 129.1—2024
7
表5 赋值运算定义
赋值运算 定义
= 赋值运算符
++ 递增,x++相当于x = x + 1。当用于数组下标时,在自加运算前先求变量值
-- 递减,x--相当于x = x – 1。当用于数组下标时,在自减运算前先求变量值
+= 自加指定值,例如x += 3相当于x = x + 3,x += (-3)相当于x = x + (-3)
-= 自减指定值,例如x -= 3相当于x = x - 3,,x -= (-3)相当于x = x - (-3)
5.7 数学函数
数学函数定义见式(1)~式(7)。
; 0
Abs( )
; 0
x x
x
x x
>=
= − <
............................. (1)
式中:
x ——自变量x。
Ceil(x) = x .................................. (2)
式中:
x ——自变量x。
;
Clip3( , , ) ;
;
i x i
i j x j x j
x
<
= >
其他
............................. (3)
式中:
x ——自变量x;
i ——下界;
j ——上界。
;
Min( , )
;
x x y
x y
y x y
<=
= >
............................ (4)
式中:
x ——自变量x;
y ——自变量y。
;
Max( , )
;
x x y
x y
y x y
>=
= <
............................ (5)
式中:
x ——自变量x;
y ——自变量y。
T/AI 129.1—2024
8
1 ; 0
Sign( )
1 ; 0
x
x
x
>=
= − <
............................. (6)
式中:
x ——自变量x。
2 Log(x) = log x ..................................... (7)
式中:
x ——自变量x。
5.8 结构关系符
结构关系符定义见表6。
表6 结构关系符
结构关系符 定义
-> 例如:a->b表示a是一个结构,b是a的一个成员变量
5.9 位流语法、解析过程和解码过程的描述方法
5.9.1 位流语法的描述方法
位流语法描述方法类似C语言。位流的语法元素使用粗体字表示,每个语法元素通过名字(用下划
线分割的英文字母组,所有字母都是小写)、语法和语义来描述。语法表和正文中语法元素的值用常规
字体表示。
某些情况下,可在语法表中应用从语法元素导出的其他变量值,这样的变量在语法表或正文中用不
带下划线的小写字母和大写字母混合命名。大写字母开头的变量用于解码当前以及相关的语法结构,也
可用于解码后续的语法结构。小写字母开头的变量只在它们所在的小节内使用。
语法元素值的助记符和变量值的助记符与它们的值之间的关系在正文中说明。在某些情况下,二者
等同使用。助记符由一个或多个使用下划线分隔的字母组表示,每个字母组以大写字母开始,也可包括
多个大写字母。
位串的长度是4的整数倍时,可使用十六进制符号表示。十六进制的前缀是“0x”,例如“0x1a”
表示位串“0001 1010”。
条件语句中0表示FALSE,非0表示TRUE。
语法表描述了所有符合本文件的位流语法的超集,附加的语法限制在相关条中说明。
表7给出了描述语法的伪代码例子。当语法元素出现时,表示从位流中读一个数据单元。
表7 语法描述的伪代码
伪代码 描述符
/*语句是一个语法元素的描述符,或者说明语法元素的存在、类型和数值,下
面给出两个例子。*/
syntax_element ce(v)
conditioning statement
T/AI 129.1—2024
9
表7(续)
伪代码 描述符
/*花括号括起来的语句组是复合语句,在功能上视作单个语句。*/
{
statement
…
}
/*“while”语句测试condition是否为TRUE,如果为TRUE,则重复执行循环体,
直到condition不为TRUE。*/
while ( condition )
statement
/*“do … while”语句先执行循环体一次,然后测试condition是否为TRUE,
如果为TRUE,则重复执行循环体,直到condition不为TRUE。*/
do
statement
while ( condition )
/*“if … else”语句首先测试condition,如果为TRUE,则执行primary语句,
否则执行alternative语句。如果alternative语句不需要执行,结构的“else”
部分和相关的alternative语句可忽略。*/
if ( condition )
primary statement
else
alternative statement
/*“for”语句首先执行initial语句,然后测试condition,如果condition为
TRUE,则重复执行primary语句和subsequent语句直到condition不为TRUE。*/
for ( initial statement; condition; subsequent statement )
primary statement
/*“break”语句用于do-while、while和for循环体中,可使当前循环体立即
终止循环。*/
break
解析过程和解码过程用文字和类似C语言的伪代码描述。
5.9.2 函数
5.9.2.1 概述
以下函数用于语法描述。假定解码器中存在一个位流指针,这个指针指向位流中要读取的下一个二
进制位的位置。函数由函数名及左右圆括号内的参数构成。函数也可没有参数。
5.9.2.2 byte_aligned( )
如果位流的当前位置是字节对齐的,返回TRUE,否则返回FALSE。
5.9.2.3 read_bits( n )
T/AI 129.1—2024
10
返回位流的随后n个二进制位,MSB在前,同时位流指针前移n个二进制位。如果n等于0,则返回0,
位流指针不前移。
函数也用于解析过程和解码过程的描述。
5.9.3 描述符
描述符表示不同语法元素的解析过程,见表8。
表8 描述符
描述符 说明
ce(v) 变长的语法元素。解析过程在8.2 中定义
b(n) 一个任意取值的n个二进制位。解析过程由函数read_bits(n)的返回值规定
f(n) 取特定值的连续n个二进制位。解析过程由函数read_bits(n)的返回值规定
r(n) 连续n个‘0’。解析过程由函数read_bits(n)的返回值规定
u(n)
n位无符号整数。在语法表中,如果n是“v”,其位数由其他语法元素值确定。解析过程由函数
read_bits(n)的返回值规定,该返回值用高位在前的二进制表示
5.9.4 保留、禁止和标记位
本文件定义的位流语法中,某些语法元素的值被标注为“保留”(reserved)或“禁止”(forbidden)。
“保留”定义了一些特定语法元素值用于将来对本文件的扩展。这些值不应出现在符合本文件的位
流中。
“禁止”定义了一些特定语法元素值,这些值不应出现在符合本文件的位流中。
位流中的“保留位”(reserved_bits)表明保留了一些语法单元用于将来对本文件的扩展,解码
处理应忽略这些位。
6 编码位流的结构
6.1 图像
6.1.1 概述
图像是位流的最高层语法结构,本文件仅支持逐行图像。一幅图像的编码数据由图像头开始。
图像由三个样本矩阵构成,包括一个亮度样本矩阵(Y)和两个色度样本矩阵(Cb和Cr,或Co和Cg)。
样本矩阵元素的值为整数。亮色度之间的关系,包括原始信号的色度和转移特性等可在位流中定义,这
些信息不影响解码过程。图像的解码处理包括解析过程和解码过程。
如果MultiplexingEnableFlag等于1,则位流由位流段交织而成。一个条带编码产生的位流可划分
为多个位流段,水平排列的条带编码产生的位流段交织构成一幅编码图像的位流。其中,条带编码产生
的位流是由子流片交织而成。子流片包含子流索引和子流片数据。一个分量的样本所形成的二进制数据
流可划分为多个等尺寸的子流片数据。子流片数据长度与比特深度以及图像格式有关。子流索引用以指
示当前子流片所属的子流。
6.1.2 图像格式
6.1.2.1 4:0:0 格式
T/AI 129.1—2024
11
对于4:0:0格式,只包括Y矩阵。
亮度样本位置见图1 。
代表亮度样本
图1 4:0:0 格式下亮度样本位置
6.1.2.2 4:2:0 格式
对于4:2:0格式,Cb和Cr矩阵水平和垂直方向的尺寸都只有Y矩阵的一半。Y矩阵的行数和每行样本
数都应是偶数。
一种可能的亮度和色度样本位置见图2。
代表亮度样本代表色度样本
图2 4:2:0 格式下亮度和色度样本位置
6.1.2.3 4:2:2 格式
对于4:2:2格式,Cb和Cr矩阵在水平方向的尺寸只有Y矩阵的一半,在垂直方向的尺寸和Y相同。Y
矩阵的每行样本数应是偶数。
亮度和色度样本位置见图3。
代表亮度样本代表色度样本
图3 4:2:2 格式下亮度和色度样本位置
T/AI 129.1—2024
12
6.1.2.4 4:4:4 格式
对于4:4:4格式,Cb和Cr矩阵(Co和Cg矩阵)在水平和垂直方向的尺寸都和Y矩阵一样。
亮度和色度样本位置见图4。
代表亮度样本代表色度样本
图4 4:4:4 格式下亮度和色度样本位置
6.2 条带
条带是图像中的矩形区域,条带之间不应重叠,每个条带的尺寸一致,一种可行的条带结构见图5 。
其中,最小的矩形为宽为16高为2的编码单元,粗线为条带划分线,A~I表示尺寸相同的9个条带。
A
D
B
E
G H
C
F
I
图5 条带结构
6.3 位流段
如果MultiplexingEnableFlag等于1,则位流由位流段交织而成。一个条带编码产生的位流可划分
为多个位流段,水平排列的条带编码产生的位流段交织构成一幅编码图像的位流。
记当前图像每行的条带个数为a,每列的条带个数为b,每个条带中的位流段数量为n,其中:
a = PictureWidthInSlice
b = PictureHeightInSlice
n = ChunkNum
位流段的交织如图6所示。
T/AI 129.1—2024
13
size0 size0 size0
S0,0_C0 S1,0_C0 … Sa-1,0_C0
size1 size1 size1
S0,0_Cn-1 S1,0_Cn-1 … Sa-1,0_Cn-1
size0 size0 size0
S0,0_C1 S1,0_C0 … Sa-1,0_C1
…
size0 size0 size0
S0,1_C0 S1,1_C0 … Sa-1,1_C0
size1 size1 size1
S0,1_Cn-1 S1,1_Cn-1 … Sa-1,1_Cn-1
size0 size0 size0
S0,1_C1 S1,1_C1 … Sa-1,1_C1
…
…
图6 位流段交织示意图
其中,Si,j_Ck表示水平索引为i,竖直索引为j的条带的第(k+1)个位流段,size0,size1的计算过程
为:
size0 = ChunkSizeInBit
size1 = TotalBits – (n – 1) ×ChunkSizeInBit
6.4 子流片
如果MultiplexingEnableFlag等于1,则条带位流由子流片交织而成。子流片包含子流索引和子流
片数据。一个分量的样本所形成的二进制数据流可划分为多个等尺寸的子流片数据。子流片数据长度与
比特深度以及图像格式有关。子流索引用以指示当前子流片所属的子流。
记当前图像的子流片个数为n,alignmentBit长度为m,其中:
size = SubstreamSegmentSize – 2
n = SubstreamSegmentNumAll
m = SliceAlignmentBitNum
子流片的交织如图7 所示。
2 size m
ssIdx0 ssBody0 …
2 size
ssIdxn-1 ssBodyn-1
2 size
ssIdx1 ssBody1 alignmentBit
图7 子流片交织示意图
其中,ssIdxi表示第i个子流片的子流索引(长度为2比特),ssBodyi表示第i个子流片的子流片数
据(长度为SubstreamSegmentSize–2比特),alignmentBits表示条带对齐填充位(其值均为‘0’)。
T/AI 129.1—2024
14
6.5 编码单元,残差块,残差集合和残差组
图像划分为相同大小的编码单元,编码单元之间不应重叠,编码单元不应超出图像边界。其中,
CuWidth为编码单元的宽,其值等于16,CuHeight为编码单元的高,其值等于2,CuSize为编码单元的面
积,其值等于CuWidth×CuHeight。
编码单元包括一个或三个编码块。
一个编码块对应一个残差块,残差块中的残差被划分为一个或多个残差集合,每个残差集合被划分
为若干个残差组。
如果MultiplexingEnableFlag等于1,则编码单元相同分量的语法元素进入同一子流。
7 位流的语法和语义
7.1 语法描述
7.1.1 图像语法
7.1.1.1 图像定义
图像定义见表9。
表9 图像定义
图像定义 描述符
picture( ) {
picture_header( )
picture_data( )
}
7.1.1.2 图像头定义
图像头定义见表10。附录G提供了图像头字节说明用于在接口档次下适配传输层。
表10 图像头定义
图像头定义 描述符
picture_header( ) {
profile_id u(8)
if (profile_id == 0x20) { /* Frame buffer profile */
MultiplexingEnableFlag = 0
} else {
MultiplexingEnableFlag = 1
}
input_image_width u(32)
input_image_height u(32)
slice_width u(32)
T/AI 129.1—2024
15
表10(续)
图像头定义 描述符
slice_height u(32)
image_format u(3)
bit_depth u(5)
reserved_bits r(4)
target_bpp u(12)
padding_type_flag u(1)
lossless_enable_flag u(1)
transform_enable_flag u(1)
dp_enable_flag u(1)
brc_enable_flag u(1)
ibc_enable_flag u(1)
pwq_enable_flag u(1)
bwq_enable_flag u(1)
vbr_enable_flag r(1)
pwq_max_qp u(4)
bwq_complex_th u(3)
qp_refine_th0 u(4)
qp_refine_th1 u(4)
jnd_qp u(4)
strict_jnd_qp u(4)
chunk_size_in_cu u(32)
chunk_num u(32)
slice_cu_num_max_bit u(8)
reserved_bits r(2)
padding_stuff_flag u(1)
substream_expansion_ratio_log2 u(3)
substream_segment_size u(10)
transmission_delay_cu u(16)
rc_buffer_size u(16)
for (compL=0; compL<5; compL++) {
for (compC=0; compC<5; compC++) {
reserved_bits r(4)
rc_qp_bias[compL][compC] u(4)
}
}
rc_decrease_step_log2 u(8)
rc_fullness_calc_multiplier u(8)
T/AI 129.1—2024
16
表10(续)
图像头定义 描述符
reserve_bits u(3)
rc_fullness_calc_shift u(5)
rc_extra_buffer_decrease_step_log2 u(8)
rc_extra_buffer_penalty_log2_minus3 u(8)
reserved_bits r(6)
rc_target_end_ratio_minus4 u(2)
rc_ratio0 u(8)
reserved_bits r(5)
rc_param0 u(11)
reserved_bits r(7)
rc_ratio1 u(9)
reserved_bits r(5)
rc_param1 u(11)
reserved_bits r(5)
rc_ratio2 u(11)
reserved_bits r(5)
rc_param2 u(11)
rc_max_relative_bits u(8)
for (comp=0; comp<5; comp++) {
reserved_bits r(5)
rc_lossless_bits[comp] u(11)
}
reserved_bits r(5)
rc_avg_lossless_bits u(11)
reserved_bits r(5)
rc_bits_offset u(11)
reserved_bits r(5)
rc_max_lossless_bits u(11)
reserved_bits r(6)
rc_relative_th u(10)
reserved_bits r(5)
rc_complex_th u(3)
}
7.1.1.3 图像数据定义
图像数据定义见表11。
T/AI 129.1—2024
17
表11 图像数据定义
图像数据定义 描述符
picture_data( ) {
SliceAlignAdj = (((((SliceWidth × TargetBpp) >> 4) + 7) >> 3) << 3) – ((SliceWidth × TargetBpp) >> 4)
for (j=0; j
}
}
}
7.1.2 条带定义
条带定义见表12。
表12 条带定义
条带定义 描述符
slice_data(i, j) {
CurrSlicePosX = SliceInfo[i][j]->posX
CurrSlicePosY = SliceInfo[i][j]->posY
PrevComplexityLevel = 0
CurrCuIdx = 0 /* CU index within current Slice */
CurrPos = 0
SubstreamBits[0] = 0
SubstreamBits[1] = 0
SubstreamBits[2] = 0
SubstreamSegmentNum[0] = 0
SubstreamSegmentNum[1] = 0
SubstreamSegmentNum[2] = 0
cost = BitDepth[0] × CuSize
if (image_format == ‘001’) { /* YUV420 */
cost += ((BitDepth[1] × (CuWidth / 2) × (CuHeight / 2)) << 1)
} else if (image_format == ‘010’) { /* YUV422 */
cost += ((BitDepth[1] × (CuWidth / 2) × CuHeight) << 1)
} else if (image_format == ‘011’ || image_format == ‘100’) { /* YUV444 or RGB444 */
cost += ((BitDepth[MultiplexingEnableFlag ? 0 : 1] × CuSize) << 1)
}
ExtraBufferSize = (cost – ((CuSize × TargetBpp) >> 4)) << 1
MaxBufferSize = RcBufferSize + ExtraBufferSize /* Actual buffer size for rate control */
T/AI 129.1—2024
18
表12(续)
条带定义 描述符
EndDecreaseBits = MaxBufferSize – DelayBits + (!MultiplexingEnableFlag ? 0 : (image_format ==
‘000’? 1 : 3) × (SubstreamSegmentSize – 1)
EndControlBlocks = (EndDecreaseBits + (1 << RcDecreaseStepLog2) – 1) >> RcDecreaseStepLog2
EndControlBegin = SliceWidthInCu × SliceHeightInCu – EndControlBlocks
RemainBlksLog2 = SliceCuNumMaxBit
CurrRcBufferLevel = 0
PhysicalBufferLevel = CurrSlicePosY == 0 ? 0 : DelayBits
VirtualStartStuff = CurrSlicePosY == 0 ? DelayBits : 0
VirtualEndStuff = 0
if (MultiplexingEnableFlag) {
SubstreamSegmentNumAll = TotalBits / SubstreamSegmentSize
for (idx=0; idx
}
SliceAlignmentBitNum = TotalBits – SubstreamSegmentSize × substreamSegmentNumAll
for (bitIdx=0; bitIdx
}
} else {
coding_unit(i, j)
}
}
注:SubstreamBits[ssIdx]用于记录第(ssIdx+1)子流的已解析比特数。
7.1.3 子流片定义
子流片定义见表13。
表13 子流片定义
子流片定义 描述符
substream_segment( ) {
substream_index b(2)
substream_segment_data b(v)
}
7.1.4 编码单元语法
7.1.4.1 编码单元定义
编码单元定义见表14。
T/AI 129.1—2024
19
表14 编码单元定义
编码单元定义 描述符
coding_unit(sliceIdxX, sliceIdxY) {
alignNum = 0
remainPixels = 0
isHfSliceWidthInCu = (((SliceWidth >> 5) & 1) == 0) ? 1 : 0
for (x=0; x
tmpSliceAlignAdj = 0 /* Additional bits for interface profile */
RemainBlksLog2 = (RemainBlksLog2 > 4 && !((SliceWidthInCu × SliceHeightInCu –
CurrCuIdx) & (1 << RemainBlksLog2))) ? RemainBlksLog2 – 1 : RemainBlksLog2
bppAdj = (EndTargetFullness – PhysicalBufferLevelRecord[CurrPos]) << 7
bppAdj = bppAdj >= 0 ? bppAdj >> (5 + RemainBlksLog2) : –((–bppAdj) >> (5 +
RemainBlksLog2))
bppAdj = Clip3(–512, 1536, bppAdj)
Currbpp = (Targetbpp << 3) + bppAdj
bitsRecordSubstream[0] = SubstreamBits[0]
FallbackFlag = 0
CbLumaSize = CuWidth × CuHeight
if (image_format == ‘000’) { /* YUV400 */
CbChromaSize = 0
ModeBits = DpEnableFlag ? 13 : 8
} else if (image_format == ‘001’) { /* YUV420 */
CbChromaSize = CbLumaSize >> 2
ModeBits = DpEnableFlag ? 20 : 15
} else if (image_format == ‘010’) { /* YUV422 */
CbChromaSize = CbLumaSize >> 1
ModeBits = DpEnableFlag ? 20 : 15
} else if (image_format == ‘011’ || image_format == ‘100’) { /* YUV444 or RGB444 */
CbChromaSize = CbLumaSize
ModeBits = DpEnableFlag ? 26 : 21
}
if (CurrCuIdx >= EndControlBegin) {
VirtualEndStuff = VirtualEndStuff + (1 << RcDecreaseStepLog2)
}
TmpCurrRcBufferLevel = PhysicalBufferLevel + VirtualStartStuff + VirtualEndStuff
Allowfallback = MultiplexingEnableFlag ? 6 : 0 + ModeBits + (BitDepth[0] × CbLumaSize +
BitDepth[MultiplexingEnableFlag ? 0 : 1] × CbChromaSize × 2 – ((CuSize × TargetBpp) >> 4)) >
MaxBufferSize – TmpCurrRcBufferLevel
coding_block_data_substream0(x + SliceWidthInCu × sliceIdxX, y + SliceHeightInCu ×
sliceIdxY)
T/AI 129.1—2024
20
表14(续)
编码单元定义 描述符
CurSubstreamBits[0] = SubstreamBits[0] – bitsRecordSubstream[0]
CuBits += CurSubstreamBits[0]
if (image_format != ‘000’) { /* Not YUV400 */
bitsRecordSubstream[1] = SubstreamBits[1]
coding_block_data_substream1(x + SliceWidthInCu × sliceIdxX, y + SliceHeightInCu ×
sliceIdxY)
CurSubstreamBits[1] = SubstreamBits[1] – bitsRecordSubstream[1]
CuBits += CurSubstreamBits[1]
bitsRecordSubstream[2] = SubstreamBits[2]
coding_block_data_substream2(x + SliceWidthInCu × sliceIdxX, y + SliceHeightInCu ×
sliceIdxY)
CurSubstreamBits[2] = SubstreamBits[2] – bitsRecordSubstream[2]
CuBits += CurSubstreamBits[2]
}
if (!VbrEnableFlag) {
if (MultiplexingEnableFlag) {
if (!(CurrSlicePosY == 0 && CurrCuIdx < TransmissionDelayCu)) {
alignNum++
}
if ((alignNum <<5 ) + remainPixels >= SliceWidth) {
tmpSliceAlignAdj = SliceAlignAdj
alignNum = 0
if (isHfSliceWidthInCu) {
remainPixels = 0
} else {
remainPixels = (remainPixels == 0) ? 16 : 0
}
}
}
bitsGap=0
if (!AllowFallback && PaddingTypeFlag && PaddingStuffFlag && ((x +
SliceWidthInCu × sliceIdxX) >= (PictureWidthInSlice × SliceWidthInCu – (ImageWidth – InputImageWidth)
/ CuWidth) && (y + SliceHeightInCu × sliceIdxY) < (PictureHeightInSlice × SliceHeightInCu –
(ImageHeight – InputImageHeight) / CuHeight))) {
bitsGap = Min((image_format == ‘000’? 1 : 3) × SubstreamSegmentSize, Currbpp >>
2) – CuBits – 6 – (VirtualEndStuff > 0 ? (1 << RcDecreaseStepLog2) : 0)
bitsGap = bitsGap < 0 ? 0 : bitsGap
}
T/AI 129.1—2024
21
表14(续)
编码单元定义 描述符
if (((CurrSlicePosY == 0 && CurrCuIdx >= TransmissionDelayCu) || CurrSlicePosY != 0)
&& (PhysicalBufferLevel + CuBits – ((CuSize × TargetBpp) >> 4) + tmpSliceAlignAdj) < 0) { /*
Underflow */
underflowBits = ((CuSize × TargetBpp) >> 4) + tmpSliceAlignAdj –
(PhysicalBufferLevel + CuBits)
} else {
underflowBits = 0
}
underflowBits=Max(underflowBits ,bitsGap)
StuffBits = 0
if (image_format == ‘000’) { /* 1 substream for YUV400 */
stuffing_data_substream0(underflowBits, CurSubstreamBits, CurSubstreamBits)
StuffBits = StuffBits[0]
} else { /* 3 substreams for other cases */
maxStuffSize = SubstreamSegmentSize – 2
zeroBits[0] = (CurSubstreamBits[0] + underflowBits > maxStuffSize) ? (maxStuffSize
– CurSubstreamBits[0]) : underflowBits
if (CurSubstreamBits[0] + CurSubstreamBits[1] + underflowBits > 2 * maxStuffSize)
{
zeroBits[1] = maxStuffSize – CurSubstreamBits[1]
} else if (CurSubstreamBits[0] + underflowBits > maxStuffSize) {
zeroBits[1] = CurSubstreamBits[0] + underflowBits – maxStuffSize
} else {
zeroBits[1] = 0
}
zeroBits[2] = (CurSubstreamBits[0] + CurSubstreamBits[1] + underflowBits >
(maxStuffSize << 1) ? (CurSubstreamBits[0] + CurSubstreamBits[1] + underflowBits – (maxStuffSize <<
1)) : 0
CurSubstreamBitsMax = Max(CurSubstreamBits[0] + zeroBits[0],
Max(CurSubstreamBits[1] + zeroBits[1], CurSubstreamBits[2] + zeroBits[2]))
stuffing_data_substream0(zeroBits[0], CurSubstreamBits[0], CurSubstreamBitsMax)
stuffing_data_substream1(zeroBits[1], CurSubstreamBits[1], CurSubstreamBitsMax)
stuffing_data_substream2(zeroBits[2], CurSubstreamBits[2], CurSubstreamBitsMax)
StuffBits = StuffBits[0] + StuffBits[1] + StuffBits[2]
}
}
if (MultiplexingEnableFlag) {
headerBits = 0
for (ssIdx=0; ssIdx
22
表14(续)
编码单元定义 描述符
tmpSubstreamSegmentNum = (SubstreamBits[ssIdx] + SubstreamSegmentSize – 3) /
(SubstreamSegmentSize – 2)
headerBits += ((tmpSubstreamSegmentNum – SubstreamSegmentNum[ssIdx]) << 1)
SubstreamSegmentNum[ssIdx] = tmpSubstreamSegmentNum
}
}
if (CurrSlicePosY == 0 && CurrCuIdx < TransmissionDelayCu) {
PhysicalBufferLevel = PhysicalBufferLevel + CuBits + headerBits + StuffBits
} else {
PhysicalBufferLevel = PhysicalBufferLevel + CuBits + headerBits + StuffBits – ((CuSize
× TargetBpp) >> 4) – tmpSliceAlignAdj
}
if (CurrCuIdx < TransmissionDelayCu) {
VirtualStartStuff = VirtualStartStuff – ((CuSize × TargetBpp) >> 4)
}
CurrRcBufferLevel = PhysicalBufferLevel + VirtualStartStuff + VirtualEndStuff
if (x == SliceWidthInCu – 1 && y == SliceHeightInCu – 1) { /* Final CU in current Slice */
stuffNum = SubstreamSegmentSize – 2
if (MultiplexingEnableFlag) {
if (SubstreamBits[0] % (SubstreamSegmentSize – 2) != 0)
for(i=0; i
}
}
if (image_format != ‘000’) { /* Not YUV400 */
if (SubstreamBits[1] % (SubstreamSegmentSize – 2) != 0)
for(i=0; i
}
}
if (SubstreamBits[2] % (SubstreamSegmentSize – 2) != 0)
for(i=0; i
}
}
} else {
while (!byte_aligned( )) {
T/AI 129.1—2024
23
表14(续)
编码单元定义 描述符
slice_alignment_bit0 f(1)
}
}
}
}
CurrCuIdx++
CurrPos = (CurrPos + 1) % 3
}
}
}
注:一种典型的实现方式,不同子流可以采用不同的熵解码器进行解析。
7.1.4.2 第一子流编码块定义
第一子流编码块定义见表15。
表15 第一子流编码块定义
第一子流编码块定义 描述符
coding_block_data_substream0(cuIdxX, cuIdxY) {
CbWidth[0] = CuWidth
CbHeight[0] = CuHeight
CbSize[0] = CbWidth[0] ×CbHeight[0]
CbPosX[0] = cuIdxX × CbWidth[0]
CbPosY[0] = cuIdxY × CbHeight[0]
complexity_level_flag[0] u(1)
if (!ComplexityLevelFlag[0]) {
delta_level[0] u(2)
if (delta_level[0] >= PrevComplexityLevel) {
ComplexityLevel[0] = DeltaLevel[0] + 1
} else {
ComplexityLevel[0] = DeltaLevel[0]
}
} else {
ComplexityLevel[0] = PrevComplexityLevel
}
PrevComplexityLevel = ComplexityLevel[0]
T/AI 129.1—2024
24
表15(续)
第一子流编码块定义 描述符
pred_mode[0] ce(v)
if (PredMode[0] == ‘SAMPLE_MODE’ && Allowfallback) {
FallbackFlag = 1
if (IbcEnableFlag) {
fallback_type u(1)
}
PredMode[0] == (FallbackType == 1 || !IbcEnableFlag) ? ‘SAMPLE_MODE’ : ‘IBC_MODE’
}
if (DpEnableFlag && PredMode[0] == ‘SAMPLE_MODE’ && !Allowfallback) {
cu_dp_intra_flag u(1)
if (CuDpIntraFlag) {
for (index=0; index<(CbSize[0]>>3); index++) {
cu_sdp_intra_flag[index] u(1)
}
}
}
if (PredMode[0] == ‘IBC_MODE’) {
if (image_format == ‘000’ || !MultiplexingEnableFlag) { /* YUV400 or multiplexing disabled */
for (blkIdx=0; blkIdx<8; blkIdx++) {
abs_bvd_minus1[blkIdx] u(5)
}
if (DpEnableFlag && !FallbackFlag) {
for (blkIdx=0; blkIdx<8; blkIdx++) {
if (AbsBvDMinus1[blkIdx] == 31) {
if (image_format != ‘000’) { /* Not YUV400 */
sdp_ibc_offset[0][blkIdx] ce(v)
sdp_ibc_offset[1][blkIdx] ce(v)
sdp_ibc_offset[0][blkIdx] ce(v)
} else {
sdp_ibc_offset[0][blkIdx] ce(v)
}
}
}
}
} else {
for (blkIdx=0; blkIdx<5; blkIdx+=4) {
abs_bvd_minus1[blkIdx] u(5)
T/AI 129.1—2024
25
表15(续)
第一子流编码块定义 描述符
}
if (DpEnableFlag && !FallbackFlag) {
for (blkIdx=0; blkIdx<5; blkIdx+=4) {
if (AbsBvDMinus1[blkIdx] == 31) {
sdp_ibc_offset[0][blkIdx] ce(v)
sdp_ibc_offset[1][blkIdx] ce(v)
sdp_ibc_offset[2][blkIdx] ce(v)
}
}
}
}
} else if (PredMode[0] == ‘INTRA_MODE_DC’ || PredMode[0] == ‘INTRA_MODE_ANG_0’ ||
PredMode[0] == ‘INTRA_MODE_ANG_1’ || PredMode[0] == ‘INTRA_MODE_ANG_2’ || PredMode[0] ==
‘INTRA_MODE_ANG_3’ || PredMode[0] == ‘INTRA_MODE_ANG_4’ || PredMode[0] ==
‘INTRA_MODE_ANG_5’) {
if (DpEnableFlag) {
cu_dp_intra_flag u(1)
}
if (CuDpIntraFlag) {
for (index=0; index<(CbSize[0]>>3); index++) {
cu_sdp_intra_flag[index] u(1)
}
for (index=0; index<((CbSize[0]>>3); index++) {
if (CuSdpIntraFlag[index]) {
sdp_intra_offset[0][index] ce(v)
}
}
} else {
if (BrcEnableFlag) {
brc_flag[0] u(1)
}
if (BwqEnableFlag && (!BrcFlag[0] || PredMode[0] == ‘INTRA_MODE_ANG_1’)) {
bwq_flag[0] u(1)
}
if (BrcFlag[0]) {
for (index=0; index<(CbWidth[0]>>2); index++) {
brc_offset_flag[0][index] u(1)
}
T/AI 129.1—2024
26
表15(续)
第一子流编码块定义 描述符
for (index=0; index<(CbWidth[0]>>2); index++) {
if (BrcOffsetFlag[0][index] == 1) {
brc_offset[0][index] u(5)
}
}
}
}
}
residual_block(0)
}
7.1.4.3 第一子流填充数据定义
第一子流填充数据定义见表16。
表16 第一子流填充数据定义
第一子流填充数据定义 描述符
stuffing_data_substream0(zeroBits, curSubstreamBits, curSubstreamBitsMax) {
stuffBits = (curSubstreamBitsMax + SubstreamExpansionRatio – 1) / SubstreamExpansionRatio –
curSubstreamBits
StuffBits[0] = Max(zeroBits, stuffBits)
for (bitIdx = 0; bitIdx
}
}
注:符合本文件位流在当前CU为回退模式时,StuffBits[0]的值应为0。
7.1.4.4 第二子流编码块定义
第二子流编码块定义见表17。
表17 第二子流编码块定义
第二子流编码块定义 描述符
coding_block_data_substream1(cuIdxX, cuIdxY) {
complexity_level_flag[1] u(1)
if (!ComplexityLevelFlag[1]) {
delta_level[1] u(2)
T/AI 129.1—2024
27
表17(续)
第二子流编码块定义 描述符
if (delta_level[1] >= ComplexityLevel[0]) {
ComplexityLevel[1] = DeltaLevel[1] + 1
} else {
ComplexityLevel[1] = DeltaLevel[1]
}
} else {
ComplexityLevel[1] = ComplexityLevel[0]
}
if (MultiplexingEnableFlag && FallbackFlag && (FallbackType == 1 || !IbcEnableFlag)) {
if (SubstreamExpansionRatio >= 4 && SubstreamExpansionRatio < 8)
reserved_bits u(10)
} else if (SubstreamExpansionRatio >= 8 && SubstreamExpansionRatio < 16)
reserved_bits u(5)
} else if(SubstreamExpansionRatio >= 16)
reserved_bits u(2)
}
} else if (PredMode[0] != ‘IBC_MODE’) {
pred_mode[1] ce(v)
} else if (MultiplexingEnableFlag) {
for (blkIdx=1; blkIdx<4; blkIdx++) {
abs_bvd_minus1[blkIdx] u(5)
}
if (DpEnableFlag && !FallbackFlag) {
for (blkIdx=1; blkIdx<4; blkIdx++) {
if (AbsBvDMinus1[blkIdx] == 31) {
sdp_ibc_offset[0][blkIdx] ce(v)
sdp_ibc_offset[1][blkIdx] ce(v)
sdp_ibc_offset[2][blkIdx] ce(v)
}
}
}
}
if (image_format == ‘001’) /* YUV420 */
{
CbWidth[1] = CuWidth >> 1
CbHeight[1] = CuHeight >> 1
} else if (image_format == ‘010’) { /* YUV422 */
T/AI 129.1—2024
28
表17(续)
第二子流编码块定义 描述符
CbWidth[1] = CuWidth >> 1
CbHeight[1] = CuHeight
} else if (image_format == ‘011’ || image_format == ‘100’) { /* YUV444 or RGB444 */
CbWidth[1] = CuWidth
CbHeight[1] = CuHeight
}
CbSize[1] = CbWidth[1] ×CbHeight[1]
CbPosX[1] = cuIdxX × CbWidth[1]
CbPosY[1] = cuIdxY × CbHeight[1]
if (PredMode[1] == ‘INTRA_MODE_DC’ || PredMode[1] == ‘INTRA_MODE_ANG_0’ || PredMode[1]
== ‘INTRA_MODE_ANG_1’ || PredMode[1] == ‘INTRA_MODE_ANG_2’ || PredMode[1] ==
‘INTRA_MODE_ANG_3’ || PredMode[1] == ‘INTRA_MODE_ANG_4’ || PredMode[1] ==
‘INTRA_MODE_ANG_5’) {
if (CuDpIntraFlag) {
for (index=0; index<(CbSize[0]>>3); index++) {
if (CuSdpIntraFlag[index]) {
sdp_intra_offset[1][index] ce(v)
}
}
} else {
if (BrcEnableFlag) {
brc_flag[1] u(1)
}
if (BwqEnableFlag && (!BrcFlag[1] || PredMode[1] == ‘INTRA_MODE_ANG_1’)) {
bwq_flag[1] u(1)
}
if (BrcFlag[1]) {
for (index=0; index<(CbWidth[1]>>2); index++) {
brc_offset_flag[1][index] u(1)
}
for (index=0; index<(CbWidth[1]>>2); index++) {
if (BrcOffsetFlag[1][index] == 1) {
brc_offset[1][index] u(5)
}
}
}
}
}
residual_block(1)
}
T/AI 129.1—2024
29
7.1.4.5 第二子流填充数据定义
第二子流填充数据定义见表18。
表18 第二子流填充数据定义
第二子流填充数据定义 描述符
stuffing_data_substream1(zeroBits, curSubstreamBits, curSubstreamBitsMax) {
stuffBits = (curSubstreamBitsMax + SubstreamExpansionRatio – 1) / SubstreamExpansionRatio –
curSubstreamBits
StuffBits[1] = Max(zeroBits, stuffBits)
for (bitIdx = 0; bitIdx
}
}
注:符合本文件位流在当前CU为回退模式时,StuffBits[1]的值应为0。
7.1.4.6 第三子流编码块定义
第三子流编码块定义见表19。
表19 第三子流编码块定义
第三子流编码块定义 描述符
coding_block_data_substream2(cuIdxX, cuIdxY) {
if (MultiplexingEnableFlag && FallbackFlag && (FallbackType == 1 || !IbcEnableFlag)) {
if (SubstreamExpansionRatio >=4 && SubstreamExpansionRatio < 8)
reserved_bits u(11)
} else if (SubstreamExpansionRatio >= 8 && SubstreamExpansionRatio < 16)
reserved_bits u(6)
} else if (SubstreamExpansionRatio >= 16)
reserved_bits u(3)
}
} else if (PredMode[0] != ‘IBC_MODE’) {
pred_mode[2] ce(v)
} else if (MultiplexingEnableFlag) {
for (blkIdx=5; blkIdx<8; blkIdx++) {
abs_bvd_minus1[blkIdx] u(5)
}
if (DpEnableFlag && !FallbackFlag) {
for (blkIdx=5; blkIdx<8; blkIdx++) {
if (AbsBvDMinus1[blkIdx] == 31) {
sdp_ibc_offset[0][blkIdx] ce(v)
T/AI 129.1—2024
30
表19(续)
第三子流编码块定义 描述符
sdp_ibc_offset[1][blkIdx] ce(v)
sdp_ibc_offset[2][blkIdx] ce(v)
}
}
}
}
if (image_format == ‘001’) /* YUV420 */
{
CbWidth[2] = CuWidth >> 1
CbHeight[2] = CuHeight >> 1
} else if (image_format == ‘010’) { /* YUV422 */
CbWidth[2] = CuWidth >> 1
CbHeight[2] = CuHeight
} else if (image_format == ‘011’ || image_format == ‘100’) { /* YUV444 or RGB444 */
CbWidth[2] = CuWidth
CbHeight[2] = CuHeight
}
CbSize[2] = CbWidth[2] ×CbHeight[2]
CbPosX[2] = cuIdxX × CbWidth[2]
CbPosY[2] = cuIdxY × CbHeight[2]
if (PredMode[2] == ‘INTRA_MODE_DC’ || PredMode[2] == ‘INTRA_MODE_ANG_0’ || PredMode[2]
== ‘INTRA_MODE_ANG_1’ || PredMode[2] == ‘INTRA_MODE_ANG_2’ || PredMode[2] ==
‘INTRA_MODE_ANG_3’ || PredMode[2] == ‘INTRA_MODE_ANG_4’ || PredMode[2] ==
‘INTRA_MODE_ANG_5’) {
if (CuDpIntraFlag) {
for (index=0; index<(CbSize[0]>>3); index++) {
if (CuSdpIntraFlag[index]) {
sdp_intra_offset[2][index] ce(v)
}
}
} else {
if (BrcEnableFlag) {
brc_flag[2] u(1)
}
if (BwqEnableFlag && (!BrcFlag[2] || PredMode[2] == ‘INTRA_MODE_ANG_1’)) {
bwq_flag[2] u(1)
}
if (BrcFlag[2]) {
T/AI 129.1—2024
31
表19(续)
第三子流编码块定义 描述符
for (index=0; index<(CbWidth[2]>>2); index++) {
brc_offset_flag[2][index] u(1)
}
for (index=0; index<(CbWidth[2]>>2); index++) {
if (BrcOffsetFlag[2][index] == 1) {
brc_offset[2][index] u(5)
}
}
}
}
}
residual_block(2)
}
7.1.4.7 第三子流填充数据定义
第三子流填充数据定义见表20。
表20 第三子流填充数据定义
第三子流填充数据定义 描述符
stuffing_data_substream2(zeroBits, curSubstreamBits, curSubstreamBitsMax) {
stuffBits = (curSubstreamBitsMax + SubstreamExpansionRatio – 1) / SubstreamExpansionRatio –
curSubstreamBits
StuffBits[2] = Max(zeroBits, stuffBits)
for (bitIdx = 0; bitIdx
}
}
注:符合本文件位流在当前CU为回退模式时,StuffBits[2]的值应为0。
7.1.5 残差块语法
7.1.5.1 残差块定义
残差块定义见表21。
T/AI 129.1—2024
32
表21 残差块定义
残差块定义 描述符
residual_block(component) {
if (PredMode[component] == ‘SAMPLE_MODE’ || FallbackFlag) {
for (x=0; x
if (FallbackFlag && FallbackType == 0) {
ResiData[component][x][y] = SampleData
} else {
SampleValue[component][x][y] = SampleData << (BitDepth[component] –
BitDepth[0])
}
}
}
} else {
SetNum = CbWidth[component] < CuWidth ? 1 : 2
ResiNum = CbHeight[component] == CuHeight ? 16 : 8
GroupNum = CbHeight[component] == CuHeight ? 4 : 2
for (i=0; i
GroupType[component][i] = ResiGroupTypeIndex
}
rb_rg_cl(component)
rb_resi_residual(component)
rb_rg_trailing(component)
}
}
7.1.5.2 残差块残差组编码长度定义
残差块残差组编码长度定义见表22。
表22 残差块残差组编码长度定义
残差块残差组编码长度定义 描述符
rb_rg_cl(component) {
if (image_format == ‘010’ && component != 0) { /* YUV422 Chroma */
if (GroupType[component][0] == 0) {
GroupType[component][0] == 1
} else {
T/AI 129.1—2024
33
表22(续)
残差块残差组编码长度定义 描述符
GroupType[component][0] == 4
}
}
for (j=0; j
groupNum = 1
} else if ((GroupType[component][j] == 1) {
groupNum = 2
} else if (GroupType[component][j] == 2 || GroupType[component][j] == 3) {
groupNum = 3
} else {
groupNum = 4
}
for (i=0; i
}
if (ResiNum == 16) {
if (GroupType[component][j] == 0) {
SubRgCl[component][0][j] = RgCl[component][0][j]
SubRgCl[component][1][j] = RgCl[component][0][j]
SubRgCl[component][2][j] = RgCl[component][0][j]
SubRgCl[component][3][j] = RgCl[component][0][j]
} else if (GroupType[component][j] == 1) {
SubRgCl[component][0][j] = RgCl[component][0][j]
SubRgCl[component][1][j] = RgCl[component][0][j]
SubRgCl[component][2][j] = RgCl[component][1][j]
SubRgCl[component][3][j] = RgCl[component][1][j]
} else if (GroupType[component][j] == 2) {
SubRgCl[component][0][j] = RgCl[component][0][j]
SubRgCl[component][1][j] = RgCl[component][0][j]
SubRgCl[component][2][j] = RgCl[component][1][j]
SubRgCl[component][3][j] = RgCl[component][2][j]
} else if (GroupType[component][j] == 3) {
SubRgCl[component][0][j] = RgCl[component][0][j]
SubRgCl[component][1][j] = RgCl[component][1][j]
SubRgCl[component][2][j] = RgCl[component][2][j]
SubRgCl[component][3][j] = RgCl[component][2][j]
T/AI 129.1—2024
34
表22(续)
残差块残差组编码长度定义 描述符
} else if (GroupType[component][j] == 4) {
SubRgCl[component][0][j] = RgCl[component][0][j]
SubRgCl[component][1][j] = RgCl[component][1][j]
SubRgCl[component][2][j] = RgCl[component][2][j]
SubRgCl[component][3][j] = RgCl[component][3][j]
}
} else {
if (GroupType[component][j] == 0) {
SubRgCl[component][0][j] = RgCl[component][0][j]
SubRgCl[component][1][j] = RgCl[component][0][j]
} else if (GroupType[component][j] == 1) {
SubRgCl[component][0][j] = RgCl[component][0][j]
SubRgCl[component][1][j] = RgCl[component][1][j]
}
}
}
}
7.1.5.3 残差块残差数据定义
残差块残差数据定义见表23。
表23 残差块残差数据定义
残差块残差数据定义 描述符
rb_resi_residual(component) {
for (j=0; j
clValue = SubRgCl[component][idx][j]
if (clValue == 0) {
ScanResiData[component][i][j] = 0
} else {
rg_resi_data u(v)
if ((BitDepth[component] != clValue || PredMode[component] == ‘POINT_MODE’) &&
RgResiData > (1 << (clValue – 1))) {
ScanResiData[component][i][j] = RgResiData – (1 << clValue)
} else {
T/AI 129.1—2024
35
表23(续)
残差块残差数据定义 描述符
ScanResiData[component][i][j] = RgResiData
}
}
}
}
}
}
7.1.5.4 残差块残差组边界值标记定义
残差块残差组边界值标记定义见表24。
表24 残差块残差组边界值标记定义
残差块残差组边界值标记定义 描述符
rb_rg_trailing(component) {
for (j=0; j
if (SubRgCl[component][index][j] <= 2 && SubRgCl[component][index][j] != 0) {
rg_trailing_flag u(1)
for (subIdx=i; subIdx<(i+4); subIdx++) {
if ((RgTrailingFlag && ScanResiData[component][subIdx][j] == (1 <<
(SubRgCl[component][index][j] – 1))) {
ScanResiData[component][subIdx][j] = – ScanResiData[component][subIdx][j]
}
}
}
}
}
}
7.2 语义描述
7.2.1 图像
7.2.1.1 图像头
档次标号 profile_id
8 位无符号整数。表示位流符合的档次。
档次和级别见附录B。
T/AI 129.1—2024
36
输入图像宽度 input_image_width
32位无符号整数。规定输入图像亮度分量的宽度,即水平方向样本数。input_image_width的单位
应是图像每行样本数。可显示区域的左上角样本应与解码图像左上角样本对齐。InputImageWidth的值
等于input_image_width的值,ImageWidth的值等于((InputImageWidth+SliceWidth-1)/SliceWidth)×
SliceWidth的值,ImageWidth的值不应为0。
输入图像高度 input_image_height
32位无符号整数。规定输入图像亮度分量的高度,即竖直方向扫描行数。input_image_height的单
位应是图像样本的行数,InputImageHeight的值等于input_image_height的值,ImageHeight的值等于
((InputImageHeight + SliceHeight – 1) / SliceHeight) × SliceHeight的值,ImageHeight的值不
应为0。
ImageWidth、ImageHeight与图像边界的关系见图8。图8中,实线表示图像可显示区域边界,其宽
度和高度分别由InputImageWidth和InputImageHeight决定;虚线表示图像边界,其宽度和高度分别由
ImageWidth和ImageHeight决定。
注:图8只是给出了输入图像和解码图像的尺寸关系,一种可行的图像填补方案见附录E。
InputImageWidth
ImageWidth
InputImageHeight
ImageHeight
图8 图像边界示意图
条带宽度 slice_width
条带高度 slice_height
32 位无符号整数。规定条带的宽度和高度。SliceWidth 的值等于slice_width 的值。SliceHeight
的值等于slice_height 的值,slice_width 的值应为CuWidth 的倍数,slice_height 的值应为CuHeight
的倍数。如果MultiplexingEnableFlag 的值为0 , 则TotalBits 的值等于
((((SliceWidth×SliceHeight×TargetBpp)>>4)+7)>>3)<<3 ; 否则, TotalBits 的值等于
(((((SliceWidth×TargetBpp)>>4)+7)>>3)<<3)×SliceHeight。SliceInfo 数组存储了当前图像的条带
信息,其中SliceInfo[i][j]表示当前图像水平索引为i,竖直索引为j 的条带信息。SliceInfo[i][j]
为一结构体,其中每个变量包括posX 和posY 两个参数,SliceInfo[i][j]->posX 表示当前图像水平索
引为i,竖直索引为j 的条带的左上角位置在图像中的横坐标位置,SliceInfo[i][j]->posY 表示当前
图像水平索引为i,竖直索引为j 的条带的左上角位置在图像中的纵坐标位置。
PictureWidthInSlice = (ImageWidth + SliceWidth – 1) / SliceWidth
PictureHeightInSlice = (ImageHeight + SliceHeight – 1) / SliceHeight
SliceWidthInCu = SliceWidth / CuWidth
SliceHeightInCu = SliceHeight / CuHeight
T/AI 129.1—2024
37
for (i=0; i
SliceInfo[i][j
相关推荐
- T/CNFPIA 4015-2023 人造板企业快速清洁生产审核指南 胶合板
- T/CWA 211-2022 水性非固化橡胶沥青防水涂料
- T/APOCN 0023-2024 聚氯乙烯绝缘电缆
- T/CWAN 0099-2023 液化天然气用奥氏体不锈钢管焊接工艺规程
- T/QGCML 817-2023 高固体份环氧绝缘漆试验方法
- T/CESA 1151-2021 智能光伏云平台 系统集成方案
- T∕CSPSTC 81-2021 露天矿山边坡生态修复施工技术规程
- T/QGCML 311-2022 用于高盐有机废水处理的蒸发结晶制盐设备
- T/CICC 37004-2023 城市大脑 基本建设流程
- T/CNTAC 205-2024 T/CWTA 3-2024 产品碳足迹 产品种类规则 毛针织品

