新一代视频压缩编码标准H.264


新一代视频压缩编码标准 ——H.264/AVC 毕厚杰主编 前 言 数字视频技术在通信和广播领域获得了日益广泛的应用,特别是 90 年代以来,随着 Internet 和移动通信的迅猛发展,视频信息和多媒体信息在 Internet 网络和移动网络中的处理 和传输成为了当前我国信息化中的热点技术。 众所周知,视频信息具有一系列优点,如直观性、确切性、高效性、广泛性等等。但是 视频信息量太大,要使视频得到有效的应用,必须首先解决视频压缩编码问题,其次解决压 缩后视频质量保证的问题。这两者是相互矛盾的,是矛盾的俩各个方面。我们的任务是既要 有较大的压缩比,又要保证一定的视频质量。 为此,人们付出了巨大的辛勤的劳动,现在已结出丰硕的成果。从 1984 年 CCITT 公布 第一个视频编码国际标准以来,至今已有二十年了。ITU-T 等国际标准化组织陆续颁布了接 近十个视频编码国际标准,大大推动了视频通信和数字电视广播的发展,这也是有目共睹的 事实。但是严格地讲,这两大领域至今的发展仍不能令人满意,总起来讲,应用的范围不广, 主要是视频压缩与质量之间的矛盾不能很好解决。例如,可视电话一直被认为是一种理想的 通信设备,可近 30 年来至今未能普及,就是因为性能价格比不高。 2003 年 3 月,ITU-T/ISO 正式公布了 H.264 视频压缩标准,由于其相比以往标准的出色 的性能,被人们称为新一代视频编码标准。具体讲,与 H.263 或 MPEG-4 相比,在同样质 量下,其数码率能降低一半左右;或者说在同样码率下,其信噪比明显提高。这样一来, H.264 标准在国际上受到了广泛地重视和欢迎。在这样的背景下,我们编写了这一本书。 本书的特点是取材新颖、内容全面。它不仅重点论述了 H.264,而且首先介绍了数字视 频和视频编码的基础知识,介绍了已有若干视频编码国际标准(特别是 MPEG-4),以便为 进一步学习 H.264 打下良好的基础。 全书共 9 章,在 H.264 部分(第 6~9 章)详尽地论述了 H.264 特点、编码器原理、解码 器原理、编解码器的实现。为了更好地理解 H.264 编解码原理及其实现,第 7 章详细介绍了 H.264 码流的句法和语义。最后对 H.264 视频编码传输的 QoS 进行了专门地论述。 本书可作为通信、广播电视专业高校本科生教材,可供该领域的硕士生、博士生深入研 究用,也可供广大的从事视频技术、视频服务领域的技术人员参考用。 本书由毕厚杰教授主编,撰写第 1~4 章及第 6 章前 3 节。左雯撰写了第 5 章。马国强、 徐苏珊撰写了第 7 章。焦良葆、王健撰写了第 9 章。其余部分由方晖、焦良葆、王健、马国 强、左雯、李涛、徐苏珊、鹿宝生等人共同编写完成。全书由毕厚杰负责审稿,左雯负责校 样。 由于时间仓促及水平有限,书中难免出现不当之处,恳请广大读者批评指正,以便再版 时进一步修正。 毕厚杰 2004.10.9 目 录 前 言......................................................................................................................................................2 第 1 章 绪 论....................................................................................................................................9 1.1 信息化与视频通信........................................................................................................................9 1.1.1 什么是信息.............................................................................................................................9 1.1.2 什么是信息化.........................................................................................................................9 1.1.3 我国的信息化和视频通信....................................................................................................9 1.2 视频信息和信号的特点 .............................................................................................................10 1.2.1 直观性..................................................................................................................................10 1.2.2 确切性..................................................................................................................................10 1.2.3 高效性..................................................................................................................................10 1.2.4 广泛性..................................................................................................................................10 1.2.5 视频信号的高带宽性..........................................................................................................10 1.3 视频压缩编码要求和可能性 .....................................................................................................11 1.3.1 视频压缩编码目标..............................................................................................................11 1.3.2 视频压缩的可能性..............................................................................................................11 1.4 视频压缩编码技术综述 .............................................................................................................12 1.4.1 基本结构..............................................................................................................................12 1.4.2 基于波形的编码..................................................................................................................12 1.4.3 基于内容的编码..................................................................................................................13 1.4.4 三维(立体)视频编码......................................................................................................13 参考文献............................................................................................................................................14 第 2 章 数字视频..................................................................................................................................15 2.1 数字电视的基本概念 .................................................................................................................15 2.1.1 数字电视的优越性..............................................................................................................15 2.1.2 数字电视的 PCM 原理 .......................................................................................................16 2.2 数字电视信号 .............................................................................................................................18 2.2.1 电视信号的时间和空间取样..............................................................................................18 2.2.2 彩色空间..............................................................................................................................19 2.2.3 彩色电视取样格式..............................................................................................................19 2.2.4 数字电视信号的编码参数..................................................................................................20 2.3 视频信号的预处理 .....................................................................................................................21 2.3.1 色彩插值(Color Interpolation) .......................................................................................21 2.3.2 色彩校正(Color Correction)...........................................................................................22 2.3.3 伽马校正(Gamma Correction) .......................................................................................23 2.3.4 图像增强(Image Enhancement) .....................................................................................24 2.3.5 白平衡(White Balance) ..................................................................................................27 2.4 视频质量 .....................................................................................................................................29 2.4.1 主观质量的评定..................................................................................................................29 2.4.2 客观质量的测量..................................................................................................................29 参考文献............................................................................................................................................31 第 3 章 视频压缩编码的基本原理..................................................................................................32 3.1 预测编码 .....................................................................................................................................32 3.1.1 预测编码的基本概念..........................................................................................................32 3.1.2 帧内预测编码......................................................................................................................33 3.1.3 帧间预测编码......................................................................................................................37 3.1.4 运动估计..............................................................................................................................41 3.2 变换编码 .....................................................................................................................................54 3.2.1 变换编码的基本概念..........................................................................................................54 3.2.2 K-L 变换............................................................................................................................54 3.2.3 离散余弦变换 DCT.............................................................................................................55 3.2.4 锯齿形扫描和游程编码......................................................................................................57 3.3 变换编码与预测编码的比较 .....................................................................................................58 3.4 熵编码 .........................................................................................................................................59 3.4.1 变长编码..............................................................................................................................59 3.4.2 算术编码..............................................................................................................................59 参考文献............................................................................................................................................62 第 4 章 视频编码标准简介..................................................................................................................63 4.1 视频编码发展简史......................................................................................................................63 4.2 H.261 标准 ...................................................................................................................................63 4.2.1 图像格式..............................................................................................................................63 4.2.2 H.261 视频编解码器............................................................................................................64 4.3 H.263 标准 ...................................................................................................................................68 4.3.1 H.263 标准图像格式............................................................................................................68 4.3.2 H.263 视频信源编码算法....................................................................................................69 4.4 MPEG-1 标准...............................................................................................................................69 4.4.1 功能......................................................................................................................................69 4.4.2 图像类型和编码结构..........................................................................................................69 4.5 MPEG-2........................................................................................................................................70 4.5.1 MPEG-2 编码复用系统 .......................................................................................................70 4.5.2 档次和级别..........................................................................................................................71 4.5.3 MPEG-2 视频编码器 ...........................................................................................................72 4.6 JPEG 标准....................................................................................................................................73 参考文献............................................................................................................................................76 第 5 章 MPEG-4 压缩编码标准..........................................................................................................77 5.1 MPEG4 标准概述........................................................................................................................77 5.1.1 MPEG-4 标准特性 ...............................................................................................................77 5.1.2 AVO 及数据结构..................................................................................................................77 5.2 MPEG-4 标准构成.......................................................................................................................78 5.2.1 系统......................................................................................................................................78 5.2.2 音频......................................................................................................................................80 5.2.3 视频......................................................................................................................................80 5.2.4 网格动画..............................................................................................................................84 5.2.5 其余......................................................................................................................................85 5.3 MPEG-4 编码技术.......................................................................................................................85 5.3.1 形状编码..............................................................................................................................85 5.3.2 可扩展性编码......................................................................................................................87 5.3.3 sprite 编码..........................................................................................................................90 5.3.4 视频系统合成......................................................................................................................91 5.4 MPEG-4 档次和级.......................................................................................................................93 参考文献............................................................................................................................................96 第 6 章 H.264/AVC 编码器原理...........................................................................................................97 6.1 H.264/AVC 的应用 ......................................................................................................................97 6.2 H.264/AVC 编解码器 ..................................................................................................................98 6.2.1 H.264 编解码器特点............................................................................................................98 6.2.2 H.264 编码器........................................................................................................................98 6.2.3 H.264 解码器........................................................................................................................99 6.3 H.264/AVC 的结构 ......................................................................................................................99 6.3.1 名词解释..............................................................................................................................99 6.3.2 档次和级..............................................................................................................................99 6.3.3 编码数据格式....................................................................................................................100 6.3.4 参数图像.............................................................................................................................102 6.3.5 片和片组............................................................................................................................102 6.4 帧内预测 ...................................................................................................................................104 6.4.1 4×4 亮度预测模式..............................................................................................................105 6.4.2 16×16 亮度预测模式..........................................................................................................107 6.4.3 8×8 色度块预测模式..........................................................................................................109 6.4.4 信号化帧内预测模式........................................................................................................109 6.5 帧间预测 ...................................................................................................................................110 6.5.1 树状结构运动补偿............................................................................................................110 6.5.2 运动矢量............................................................................................................................ 111 6.5.3 MV 预测 .............................................................................................................................113 6.5.4 B 片预测.............................................................................................................................114 6.5.5 加权预测.............................................................................................................................117 6.6 H.264 的 SP/SI 帧技术(SP 片或 SI 宏块的 P 宏块) ...........................................................117 6.6.1 SP/SI 帧的应用...................................................................................................................118 6.6.2 SP/SI 帧的基本原理...........................................................................................................120 6.6.3 实验结果和性能分析........................................................................................................123 6.7 整数变换与量化 .......................................................................................................................124 6.7.1 整数变换............................................................................................................................125 6.7.2 量化....................................................................................................................................129 6.7.3 DCT 直流系数的变换量化................................................................................................131 6.8 CAVLC(基于上下文自适应的可变长编码).............................................................................132 6.8.1 熵编码的基本原理.............................................................................................................132 6.8.2 CAVLC 的基本原理...........................................................................................................133 6.8.3 CAVLC 的上下文模型.......................................................................................................133 6.8.4 CAVLC 的编码过程...........................................................................................................133 6.8.5 CAVLC 解码过程...............................................................................................................135 6.8.6 CAVLC 编解码过程实例 ...............................................................................................138 6.8.7 CAVLC 与 UVLC 比较 .................................................................................................139 6.9 CABAC(基于上下文的自适应二进制算术熵编码) ................................................................141 6.9.1 自适应算术编码................................................................................................................141 6.9.2 上下文模型........................................................................................................................144 6.9.3 对输入流预编码................................................................................................................146 6.9.4 初始化................................................................................................................................147 6.9.5 结论....................................................................................................................................147 6.10 码率控制 .................................................................................................................................148 6.10.1 基于 Lagrangian 优化算法的 H.264 编码控制模型.......................................................148 6.10.2 实验结果和性能分析......................................................................................................151 6.11 去方块滤波 .............................................................................................................................153 6.11.1 去方块滤波基本概念......................................................................................................154 6.11.2 边界分析..........................................................................................................................155 6.11.3 滤波过程..........................................................................................................................157 6.12 其余特征 .................................................................................................................................160 6.12.1 参考图像管理..................................................................................................................160 6.12.2 重排序..............................................................................................................................160 6.12.3 隔行视频..........................................................................................................................161 6.12.4 数据分割片......................................................................................................................162 6.12.5 H.264 传输........................................................................................................................162 参考文献..........................................................................................................................................164 第 7 章 H.264 的句法和语义...........................................................................................................166 7.1 句法 ...........................................................................................................................................166 7.1.1 句法元素的分层结构.........................................................................................................166 7.1.2 句法的表示方法.................................................................................................................169 7.2 句法表........................................................................................................................................170 7.3 语义 ...........................................................................................................................................189 7.3.1 NAL 层语义 .......................................................................................................................190 7.3.2 序列参数集语义................................................................................................................192 7.3.3 图像参数集语义................................................................................................................194 7.3.4 片头语义.............................................................................................................................196 7.3.5 参考图像序列重排序的语义.............................................................................................201 7.3.6 加权预测的语义.................................................................................................................202 7.3.7 参考图像序列标记 (marking)操作的语义.......................................................................203 7.3.8 片数据的语义....................................................................................................................204 7.3.9 宏块层的语义....................................................................................................................205 7.3.10 宏块预测的语义..............................................................................................................210 7.3.11 子宏块预测的语义...........................................................................................................211 7.3.12 用 CAVLC 方式编码的残差数据的语义.......................................................................213 7.3.13 用 CABAC 方式编码的残差数据的语义 ......................................................................213 7.4 总结............................................................................................................................................213 参考文献..........................................................................................................................................214 第 8 章 H.264/AVC 解码器的原理和实现....................................................................................215 8.1 解码器原理 ...............................................................................................................................215 8.2 NAL 单元...................................................................................................................................216 8.2.1 NAL 单元结构....................................................................................................................216 8.2.2 NAL 单元解码过程............................................................................................................216 8.3 图像序列号(PICTURE ORDER COUNT)的计算.......................................................................217 8.3.1 图像序列号(POC).........................................................................................................217 8.3.2 POC 类型为 0 的 POC 计算 ..............................................................................................219 8.3.3 POC 类型为 1 的 POC 计算 ..............................................................................................220 8.3.4 POC 类型为 2 的 POC 计算 ..............................................................................................221 8.4 宏块片组映射图的产生 ...........................................................................................................221 8.5 片数据分割的解码 ...................................................................................................................223 8.6 参考图像列表的初始化 ...........................................................................................................224 8.6.1 图像序号的计算................................................................................................................224 8.6.2 参考图像列表的初始化....................................................................................................225 8.6.3 参考帧列表的重排序........................................................................................................228 8.7 解码的参考图像的标记过程 ...................................................................................................230 8.7.1 frame_num 不连续的解码过程 .........................................................................................231 8.7.2 参考图像滑窗标记过程....................................................................................................231 8.7.3 参考图像的自适应内存控制标记过程............................................................................231 8.8 帧内预测 ...................................................................................................................................233 8.8.1 4x4 亮度块预测方式的提取...........................................................................................234 8.8.2 4x4 亮度块的帧内预测编码方式...................................................................................235 8.8.3 16x16 亮度块的帧内预测方式.......................................................................................240 8.8.4 8x8 色度块的帧内预测方式...........................................................................................243 8.9 帧间预测解码处理 ...................................................................................................................245 8.9.1 MV 分量及参考索引获取 .................................................................................................246 8.9.2 帧间预测像素解码处理....................................................................................................248 8.10 变换系数解码.........................................................................................................................254 8.10.1 变换系数逆扫描过程......................................................................................................255 8.10.2 DCT 变换系数中直流系数的逆变换量化......................................................................256 8.10.3 残差变换系数的反量化..................................................................................................258 8.10.4 残差变换系数的逆 DCT 变换........................................................................................258 8.10.5 去方块滤波前的图像恢复与重建..................................................................................258 8.11 SP 片中的 P 宏块和 SI 片中的 SI 宏块的解码过程..............................................................259 8.11.1 主 SP 片中 P 宏块的解码过程 .......................................................................................259 8.11.2 辅 SP/SI 片的解码过程...................................................................................................261 参考文献..........................................................................................................................................263 第 9 章 H.264 视频编码传输的 QOS..............................................................................................264 9.1 互联网视频传输 QOS...............................................................................................................264 9.1.1 错误恢复在视频通信中的重要性和实现途径................................................................264 9.1.2 基于块的混合视频编码框架............................................................................................265 9.1.3 视频通信中提高 QoS 的抗误码和错误恢复技术...........................................................266 9.2 无线网视频传输 QOS...............................................................................................................271 9.2.1 无线视频通信系统............................................................................................................271 9.2.2 无线信道编码和错误控制................................................................................................272 9.2.3 无线视频通信的应用........................................................................................................276 9.2.4 H.264 无线通信中传输结构..............................................................................................277 9.2.5 无线视频传输的鲁帮性研究.............................................................................................278 9.3 H.264 视频编解码标准的错误恢复 ......................................................................................279 9.3.1 H.264 的视频编码层的错误恢复......................................................................................279 9.3.1 H.264 的网络提取层的错误恢复......................................................................................281 参考文献..........................................................................................................................................284 术语及英文解释..................................................................................................................................286 附录一 CAVLC 相关码表.....................................................................................................................297 附录二 CABAC 相关码表.....................................................................................................................304 附录三 H.264 档次和级.....................................................................................................................318 第 1 章 绪 论 1.1 信息化与视频通信 本书讨论视频编码之前,简要介绍信息化问题,即研讨当前信息社会背景,然后讨论信息化与 视频通信的关系。 1.1.1 什么是信息 众所周知,人类社会的三大支柱是物质、能量和信息。具体而言,农业现代化的支持是物质; 工业现代化的支柱是能量;而信息化的支柱是信息。 广义地讲,信息就是客观世界的描述和分析,它无所不在,无时不在,具有广泛性和通用性, 这是信息的一个性质;信息没有重量,没有长度,具有抽象性,这是信息的另一个特性,但它确实 存在。 信息的第三个特性是无限性。比如,关于物质的信息,物质具有无限的不可分性,物质由分子 组成,分子由原子组成,下面还有中子、质子、电子、中微子等等;关于通信网络的信息,为了增 加通信容量,最初一对电话线只能通一对电话用户,后来利用 N-ISDN 技术,可在一对电话线上同 时通两对电话,以后又发展 B-ISDN、ATM、IP、MPLS,直到今天,通信网络技术仍在不断地发展, 应该说,它具有无限性。 总之,信息具有通用性、抽象性、无限性三个特征,其中无限性最重要。 从以上描述可知,信息是很有用的,它是客观世界中最本质的客观规律描述和分析,是人类社 会可用的重要资源。信息资源如果能被充分开发和利用,人类社会的物质和精神文明水准将大大提 高。 地球上的物质资源是有限的。石油、煤等在一定期限内总会开采完,但信息资源是无限的,对 客观规律性的探讨是无尽的。而信息是要通过不断研究、不断分析,通过科学研究、反复实践才能 掌握的。 1.1.2 什么是信息化 信息化是这样一个过程:“在现代信息技术广为普及的基础上,通过开发和利用信息资源,各种 社会和经济活动的功能和效益显著提高了。人类社会的物质和精神文明达到了一个新的水平。” 可见,信息化的目的是提高人类的社会和经济效益。而实现信息化的关键在于开发和利用各种 信息资源。 信息化的实现依赖于图 1.1 所示的信息系统构建。 图 1.1 信息系统 信息化的实现首先要开发和利用各种信息资源,其次要有一个信息网络(如宽带通信网),通过 该网络将大量信息传送到信息用户。 1.1.3 我国的信息化和视频通信 我国已成为规模上世界第一的通信大国。电话(包括固定和移动电话)的普及率已达到 30%。 宽带网络正在不断建设中,8 纵 8 横的光纤构成了我国骨干网。以 MSTP(多业务传输平台)技术为 主的城域网正在大力建设,以 ADSL 为主的宽带接入网也迅速发展。应该指出,我国信息化的瓶颈 在信息资源的开发和利用。 经常有这样的疑问:有了宽带网络,传送什么内容呢?实际上,世界上的信息资源是十分丰富 的,问题在于人们没有努力开发或者充分利用。 信息资源中,视频信息的开发、利用更具有重要的理论意义和应用价值。 90 年代初以来,我国的会议电视获得了巨大发展,短短几年,从最初的一个中央到各省的会议 电视骨干网,逐步发展为铁道、电力、石油、公安多系统、各省以至各地县约数千个的会议电视网。 90 年代 Internet 的迅猛发展,导致 IP 技术应用普及到各个方面,网上教育、远程医疗、电子商 务、电子政务、电子游戏、网上证券等等如雨后春笋。一句话,IP 视频通信已十分引人注目。 通信业务已从电话、传真、电报发展为可视电话、会议电视、视频点播等,即由音频为主发展 到以视频为主的多媒体通信。 为了更深入的理解视频通信,有必要对它的特点进一步探讨。 1.2 视频信息和信号的特点 1.2.1 直观性 利用人的视觉获取的信息称为视频信息,它具有直观性的特点。话音信息则利用人的听觉获取。 两者相比,视频信息给人印象深刻、具体,话音信息则相对较浅。从交流信息的客观效果讲,视频 信息的效果更好。 1.2.2 确切性 视频信息直观具体,不易和其他内容相混淆,保证信息的准确性。而话音则会由于地方口音的 不同产生歧义,导致不必要的损失。 1.2.3 高效性 由于利用视觉,人们可以并行地观察一幅图像的各个像素,因而获取视频信息的效率比音频信 息高的多。例如,人们通过一幅电机构建的图,很快搞清楚定子、转子及其相关位置,从而很快弄 清电机的结构及其原理;如果人们没有这样的图,只是一味的讲课,从这样的音频信息中反复讲解 电机结构,也可能仍搞不清楚,其接受的效率要低的多。 1.2.4 广泛性 据统计,人们每天视觉获取的视觉信息约占外界信息总量的 70%左右,即人们每天获得的信息 大部分是视觉信息。 1.2.5 视频信号的高带宽性 视频信息的表示形式是视频信号,通常为视频的电信号,通过网络传送至终端用户,并在屏幕 上显示。 视频信号所包含的信息量大,其内容可以是活动的,也可以是静止的;可以是彩色的,也可以 是黑白的;有时变化多、细节多,有时十分平坦。一般而言,视频信号信息量大,传输网络所需要 的带宽相对较宽。例如,一路可视电话或会议电视信号,由于其活动内容较少,所需带宽较窄,但 要达到良好质量,不压缩约需若干 Mbps,压缩后需要 384Kbps;又如,一路高清晰度电视信号 (HDTV),由于其信息量相当巨大,不压缩需 1Gbps,利用 MPEG-2 压缩后,尚需 20Mbps。可见, 视频信息虽然具有直观性、确定性、高效性等优越性能,但要传送包含视频信息的信号却需要较高 的网络带宽。这就是为获得视频信息所需付出的代价。 1.3 视频压缩编码要求和可能性 1.3.1 视频压缩编码目标 如上所述,视频信号由于信息量大,传输网络带宽要求高,就像一辆庞大的货车只有在宽阔的 马路上才能行驶一样。于是出现一个问题:能否将视频信号在传送前先进行压缩编码,即进行视频 源压缩编码,然后在网络上进行传送,以便节省传送带宽和存储空间。这里有两个要求: 1) 必须压缩在一定的带宽内,即视频编码器应具有足够的压缩比; 2) 视频信号压缩之后,应保持一定的视频质量。这个视频质量有两个标准:一个为主观质量, 由人从视觉上进行评定;一个为客观质量,通常用信噪比(S/N)表示。 如果不问质量,一味地压缩,虽然压缩比很高,但压缩后严重失真,显然达不到要求;反之, 如只讲质量,压缩比太小,也不符合要求。 当然,在以上两个要求下,视频编码器的实现应力求简单、易实现、成本低、可靠性高,这也 是基本的要求。 1.3.2 视频压缩的可能性 1.3.2.1 预测编码 前面讨论了视频信息的优越性,视频信号压缩的必要性,也提出了视频压缩的目标(要求),但 实现这些目标的可能性如何? 众所周知,一幅图像由许多个所谓像素的点组成,如图 1.2 中的“O”表示一个像素,大量的统计 表明,同一幅图像中像素之间具有较强的相关性,两个像素之间的距离越短,则其相关性越强,通 俗地讲,即两个像素的值越接近。换言之,两个相邻像素的值发生突变的概率极小,“相等、相似或 缓变”的概率则极大。 图 1.2 像素间相关性解释 图 1.3 帧间相关性解释 于是,人们可利用这种像素间的相关性进行压缩编码。例如当前像素 X(设为立即传送的像素) 可用前一个像素 a 或 b、c,或三者的线性加权来预测。这些 a,b,c 被称为参考像素。在实际传送 时,把实际像素 X(当前值)和参考像素(预测值)相减,简单起见传送 X-a,到了接收端再把(X -a)+a=X,由于 a 是已传送的(在接收端被存储),于是得到当前值。由于 X 与 a 相似,(X-a) 值很小,视频信号被压缩,这种压缩方式称为帧内预测编码。 不仅如此,还可利用图 1.3 所示的帧间相关性进行压缩编码。由于邻近帧之间的相关性一般比 帧内像素间的相关性更强,压缩比也更大。 由此可见,利用像素之间(帧内)的相关性和帧间的相关性,即找到相应的参考像素或参考帧 作为预测值,可以实现视频压缩编码。 1.3.2.2 变换编码 大量统计表明,视频信号中包含着能量上占大部分的直流和低频成分,即图像的平坦部分,也 有少量的高频成分,即图像的细节。因此,可以用另一种方法进行视频编码,将图像经过某种数学 变换后,得到变换域中的图像(如图 1.4 所示),其中 u,v 分别是空间频率坐标。如图 1.4 所示,用 “o”表示的低频和直流占图像能量中的大部分,而高频成分(用“×”表示)则是少量的,于是可用较 少的码表示直流低频以及高频,而“O”则不必用码,结果完成了压缩编码。 图 1.4 变换域图像 1.4 视频压缩编码技术综述 1.4.1 基本结构 视频编码系统的基本结构如图 1.5 所示。 图 1.5 视频编码系统 由图 1.5 可见,视频编码方法与可采用的信源模型有关。如果采用“一幅图像由许多像素构成” 的信源模型,这种信源模型的参数就是每个像素的亮度和色度的幅度值。对这些参数进行压缩编码 技术称为基于波形的编码。如果采用一个分量有几个物体构成的信源模型,这种信源模型的参数就 是各个物体的形状、纹理和运动。对这些参数进行压缩编码的技术被称为基于内容的编码。 由此可见,根据采用信源模型,视频编码可以分为两大类,基于波形的编码和基于内容的编码。 它们利用不同的压缩编码方法,得到相应的量化前的参数;再对这些参数进行量化,用二进制码表 示其量化值;最后,进行无损熵编码进一步提高码率。解码则为编码的逆过程。 1.4.2 基于波形的编码 如上所述,利用像素间的空间相关性和帧间的时间相关性,采用预测编码和变换编码技术可大 大减少视频信号的相关性,从而显著降低视频序列的码率,实现压缩编码的目标。 基于波形的编码采用了把预测编码和变换编码组合起来的基于块的混合编码方法。 为了减少编码的复杂性,使视频编码操作易于执行,采用混合编码方法时,首先把一幅图像分 成固定大小的块,例如块 8×8(即每块 8 行,每行 8 个像素)、块 16×16(每块 16 行,每行 16 个像 素)等等,然后对块进行压缩编码处理。 自 1989 年 ITU-T 发布第一个数字视频编码标准——H.261 以来,已陆续发布了 H.263 等视频编 码标准及 H.320、H.323 等多媒体终端标准。ISO 下属的运动图像专家组(MPEG)定义了 MPEG-1、 MPEG-2、MPEG-4 等娱乐和数字电视压缩编码国际标准。 2003 年 3 月份,ITU-T 颁布了 H.264 视频编码标准。它不仅使视频压缩比较以往标准有明显提 高,而且具有良好的网络亲和性,特别是对 IP 互联网、无线移动网等易误码、易阻塞、QoS 不易保 证的网络视频传输性能有明显的改善。本书的主要内容即 H.264 视频编码。 所有这些视频编码都采用了基于块的混合编码法,都属于基于波形的编码。 1.4.3 基于内容的编码 如上所述,基于块的编码易于操作,但由于人为地把一幅图像划分成许多固定大小的块,当包 含边界的块属于不同物体时,它们分别具有不同的运动,便不能用同一个运动矢量表示该边界块的 运动状态。如果强制划分成固定大小的块,这种边界块必然会产生高的预测误差和失真,严重影响 了压缩编码信号的质量。 于是产生了基于内容的编码技术。这时先把视频帧分成对应于不同物体的区域,然后对其编码。 具体说来,即对不同物体的形状、运动和纹理进行编码。在最简单情况下,利用二维轮廓描述物体 的形状;利用运动矢量描述其运动状态;而纹理则用颜色的波形进行描述。 当视频序列中的物体种类已知时,可采用基于知识或基于模型的编码。例如,对人的脸部,已 开发了一些预定义的线框对脸的特征进行编码,这时编码效率很高,只需少数比特就能描述其特征。 对于人脸的表情(如生气、高兴等),可能的行为可用语义编码,由于物体可能的行为数目非常 小,可获得非常高的编码效率。 MPEG-4 采用的编码方法就既基于块的混合编码,又有基于内容的编码方法。 1.4.4 三维(立体)视频编码 立体视频编码是视频编码的发展方向之一,其平面信息外增加了深度信息,数据量非常庞大。 立体视频编码也有两种类型的方法:第一种是基于波形的,它组合运动补偿预测和位差补偿预 测。所谓位差估计即在两幅不同图像中寻找对应的点。它对预测残差图像、位差和运动矢量进行编 码;第二种是基于物体的,它直接对成像物体的三维结构和运动进行编码。当物体结构简单时,可 获得非常高的压缩比。其编码结构如图 1.6 所示。 图 1.6 三维物体序列编码系统 参考文献 1 Yao Wang, Jorn Ostermann, Ya-Qin Zhang, Video Processing and Communication, Pearson Education, 2002. 2 毕厚杰,多媒体信息的传输与处理, 人民邮电出版社,1999 3 毕厚杰,信息和信息化, 中国工程科学,2003 第 5 卷第 5 期 92 页。 第 2 章 数字视频 视频压缩编码技术就是对数字的视频信号进行压缩和解压缩的过程。因此讨论视频压缩编码前, 必须先了解数字视频信号的概念和构成。这是本章的主要内容。 什么是数字信号?它是自然电视景象的数字表示。具体说来,在本章中将依次讨论:(1)数字 电视的概念;(2)彩色空间;(3)数字电视景象标准格式;(4)A/D 和 D/A 变换;(5)取样和亚取 样;(6)量化;(7)数字视频的质量。 2.1 数字电视的基本概念 2.1.1 数字电视的优越性 现在,模拟彩色电视已经相当普及,在一定程度上满足了人们的生活需求。但是,模拟电视缺 陷日益暴露出来。为此,数字电视就应运而生,与模拟电视相比,具有许多突出的优点: (1)失真小、噪声低、质量高 模拟电视信号在放大、处理、传输、存储过程中,难免会引入失真噪声,而且多种噪声与失真 叠加到电视信号后,不易去除,且会随着处理次数和传输距离的增加不断累积,导致图像质量及信 噪比的下降。 相反,数字电视信号没有上述的噪声累积效应。如图 2.1 所示,只要噪声电平不超过脉冲幅度 的一半,就可用脉冲再生技术对其整形,并恢复成“0”或“1”两种电平,便不会引入噪声。这样说来, 是否数字电视信号没有任何失真和噪声呢?从下面的叙述可知,它会引入“量化噪声”,这是因为信 号的数字化必须要经过取样、量化、编码三个基本步骤,“量化”是不可缺少的。量化噪声不可避免, 但可控制在相当低的电平一下。 (a) (b) (c) 图 2.1 数字电视信号抗噪声能力 可见,数字电视的第一个突出优点是噪声低、失真小、视频质量好。 (2) 易处理、易校正 模拟电视信号要进行压缩编码处理、加密处理、校正处理都不是一件容易的事情。 数字电视信号利用 VLSI 芯片进行压缩编码处理、加密处理、白平衡调整、γ 校正、彩色校正和 轮廓校正,相对来说容易得多。随着大规模集成电路设计和工艺的不断发展,现在利用专用芯片和 通用 DSP 来实现以上处理的成本不断下降,这是视频数字压缩编码能取得不断发展的一个重要原因。 (3) 容量大、节目多 同样带宽的模拟电路能容纳的数字电视节目比模拟电视节目多得多。例如,CATV 频道中, 550MHz~750MHz 的 200MHz 带宽中,如果传送模拟电视,每个节目需 8MHz 带宽,充其量只能传 送 25 套节目。如果传送数字电视节目,采用 64QAM 调制,其频谱利用率为 5.3,如每路节目用 MPEG-2 压缩为 4Mbps,实际只需 4÷5.3≈0.75MHz 带宽,于是在同样的 200MHz 带宽中可传送数字电视节目 数为 200÷0.75≈260,约为模拟电视的 11 倍! 2.1.2 数字电视的 PCM 原理 将输入的模拟电视信号变成输出的数字电视信号需经过取样、量化、编码三个步骤,如图 2.2 所示,由 A/D 变换器完成这三个步骤。 图 2.2 PCM 原理 2.1.2.1 取样 所谓取样,就是在时间轴上把连续变化的模拟信号变为离散量的过程。图 2.3(a)的 ua(t)在 时间上是连续变化的,经取样后变换成图 2.3(c)的时间上离散的 ud(t)信号。 图 2.3 取样过程 根据取样定理:当输入的模拟信号上限频率为 fc,只要取样脉冲 us(t)的重复频率 fs 不低于 fc 的两倍,总可以无失真地由取样后的离散信号恢复出原来的模拟信号,即不失真输出条件为: fs≥2fc (2.1) ud 通过下式实现: ud=ua×us (2.2) 图 2.3(e)、(f)分别是 ua(t)和 us(t)的频谱 Fa(f)、Fs(f)。于是图 2.3(c)ud(t)的频谱, 即图 2.3(g)的 Fd(f),可由 Fa(f)和 Fs(f)卷积得到: Fd(f)=Fa(f)*Fs(f) (2.3) 由图 2.3(g)可知,当 2fc≤fs 或满足取样定理时,则可恢复出原始的模拟信号,否则会发生频谱 重叠,即所谓的混叠效应,无法恢复出原始信号。 由于实际的低通滤波器(限制模拟信号的上限频率 fc)滤波特性不可能做成理想的陡峭的截止 特性,当低通滤波器的截止频率为 fc 时,实际的取样频率 fs 应取成: fs=(2.2~2.5) fc (2.4) 对于电视信号,经分析可知其信号能量主要集中在行频 fh 及其多次谐波 n fh 附近。而在 f=(2n+1) fh/2 附近,信号能量很弱。当取样频率 fs 取下式: fs=(2n+1) fh/2 (2.5) fs<2fc,即所谓的亚取样时,发生频谱混叠,但频谱以 fh/2 的间隔交错开,因此仍可通过设计得 当的梳状滤波器将所需信号的频谱分离出来。 这种亚取样可显著压缩数字电视的数字码率。 图 2.4 视频信号亚取样的频谱混叠 2.1.2.2 量化 取样后的脉冲信号在时间上是离散的,但在幅值上空间上仍是连续的,即其可能取的值有无限 多个,这就需要对它采用四舍五入的方法,将其可能的幅值数由无限多个变为有限个值。这种将信 号幅值由连续量变成离散量的过程称为量化。 图 2.5 为信号的量化过程。量化器的输入输出特性(图 2.5 (a))具有阶梯形状,图 2.5 (b) 为输 入模拟信号,图 2.5 (c)为其相应的量化后的输出信号。由于采取四舍五入的方法,输出信号不同于 原模拟信号,产生了失真,即所谓的“量化噪声”。 如果模拟信号的动态范围(最大值)为 A,量化级数为 M,量化节距或量化步长为 Q,则 M=A/Q (2.6) 这种量化称为均匀量化,量化节距为恒定值 Q。 2.1.2.3 PCM 编码 对于量化后的信号,通常用“0”和“1”表示,即用二进制码表示。这时的编码称为脉冲编码调制 ——PCM 编码。模拟电视信号经取样、量化、编码(PCM 编码)后得到的二进制序列,即数字电 视信号。 每个取样信号用 8 位二进制码表示,可能取的量化值为 M=28=256。一般讲,当用 n 位二进制 码表示时,有 M=2n (2.7) n愈大,则 M 愈大,Q 愈小,即量化噪声愈小,数字信号愈接近模拟信号。 2.1.2.4 A/D 与 D/A 变换 上述取样、量化、编码过程均由 A/D 变换器完成。反之,数字信号的解码、反量化、恢复成模 拟信号的逆过程则由 D/A 变换器完成,见图 2.5 所示。 图 2.5 D-A 变换 2.2 数字电视信号 2.2.1 电视信号的时间和空间取样 2.2.1.1 时间取样 电视信号的取样有两种:空间取样和时间取样。运动图像可由每秒若干帧静止图像构成,我国 采用的 PAL 制彩色电视规定每秒 25 帧,美日等采用的 NTSC 制彩色电视则为每秒 30 帧。这种取样 方式即时间取样。如果是会议电视、可视电话等运动量不大的视频信号,帧频也可取 15~20 帧/秒, 但低于 15 帧/秒的视频质量不高。 图 2.6 帧、场结构 隔行扫描帧图像由两场组成,每场由若干行组成,奇数行和偶数行各构成一场,它们分别为顶 场和底场,如图 2.6 所示。帧场的邻近行相关性并不相同。帧的邻近行空间相关性强,时间相关性 弱,因为某行的邻近行(下一行)要一场扫描完才能被扫描,在压缩静止图像或运动量不大的图像 时采用帧编码方式。场的邻近行时间相关性强,空间相关性差,因为场的一行扫描完毕,接着对场 中下一行扫描。因此对运动量大的图像常采用场编码方式。实际的视频图像有快有慢,有粗有细, 应根据这个标准自适应选择帧/场编码方式。 2.2.1.2 空间取样 在同一电视信号帧中,同一行由若干取样点构成,这些取样点称为像素,这种取样就属于空间 取样。其前提是假定一帧图像是静止的,每个像素点处于同一时刻及不同的空间位置上。 例如国际上标准电视格式为 720×576 像素,即每帧由 576 行,每行由 720 个像素构成;美国的 GA 制规定了两种扫描格式,即 720×1280 像素和 1080×1920 像素。 现存在三种彩色电视制式,不同的国家采用不同的制式,为了实现国际上的不同彩色电视制式 国家之间视频通信,往往采用一种中间公共格式(CIF),如表 2.1 所示。 表 2.1 视频帧格式 格式 亮度清晰度 亚 QCIF 96×128 QCIF 144×176 CIF 288×352 4CIF 576×720 2.2.2 彩色空间 黑白图像的每个像素只需一个幅值表示其亮度即可;而彩色图像的每个像素至少需要 3 个值表 示表示其亮度和色度。所谓色度空间即表示彩色图像的亮度与色度的方法。 2.2.2.1 RGB 众所周知,任何彩色图像可由不同比例的红色、绿色和蓝色组合而成,即三基色原理。这种表 示彩色图像的方法即 RGB 彩色空间。 彩色显象管(CRT)和液晶显示器件(LCD)可显示彩色图像,彩色摄像机中的电荷耦合器件 (CCD)等传感器可产生彩色电视图像,都是根据 RGB 原理获得的。 2.2.2.2 YCbCr(YUV) 人类视觉系统(HDV)对亮度比彩色更敏感,因此可以把亮度信息从彩色信息分离处来,并使 之具有更高的清晰度,彩色信息的清晰度较低些,可显著压缩带宽,实现视频压缩的一部分,人的 感觉却没有不同。 如果亮度分量用 Y 表示,色度用 Cb,Cr 表示,则由大量实验得出: Y=0.299R+0587G+0.114B Cb=0564(B-Y) Cr=0.713(R-Y) (2.8) 反之,可由下式得到相应的 R、G、B: R=Y+1.402Cr G=Y-0.344Cb-0.714Cr B=Y+1.772Cb (2.9) 2.2.3 彩色电视取样格式 有三种不同的彩色电视取样格式,如图 2.7 所示。 图 2.7 彩色电视取样格式(逐行) (1)4:4:4,Y,Cb 和 Cr 具有同样的水平和垂直清晰度,在每一像素位置,都有 Y,Cb 和 Cr 分量,即不论水平方向还是垂直方向,每 4 个亮度像素相应的有 4 个 Cb 和 4 个 Cr 色度像素。 (2)4:2:2,这时彩色分量和亮度分量具有同样的垂直清晰度,但水平清晰度彩色分量是亮度分 量的一半。水平方向上,每 4 个亮度像素具有 2 个 Cb 和 2 个 Cr。在 CCIR601 标准中,这是分量彩 色电视的标准格式。 (3)4:2:0,在水平和垂直清晰度方面,Cb 和 Cr 都是 Y 的一半。这个名词是历史上一直称呼 的,似乎不合乎逻辑。 4:2:0 的彩电取样格式广泛应用于数字电视、会议电视、DVD 等。因为三种格式中,4:2:0 的彩 色分量最少,对人彩色感觉而言与其它两种类似,最适合数字压缩。 2.2.4 数字电视信号的编码参数 现在介绍电视信号的量化值和取样频率值,即未压缩前数字信号的编码参数。 2.2.4.1 量化值 Qp 量化值(量化节距)取得太大,视频图像显得粗糙;取得太小,视频图像质量好,但带宽浪费 过大。一般认为,每个取样值采用 8 个比特表示,即 256 个灰度级,是比较合理的。在会议电视的 视频通信中,随着网络带宽的变化,Qp 可进行自动调整。 2.2.4.2 取样频率 CCIR601 建议的电视国际标准为:对每幅画面 625/50(625 行,每秒 50 场)的电视系统和 525/60 (525 行,每秒 60 场)的电视系统取样频率都为: fs=13.5MHz (亮度信号,即 Y 信号) fs=6.75MHz (色差信号,即 Cb、Cr 信号) 彩色电视采用 4:2:2 格式时(垂直方向 Cb、Cr 和 Y 具有同等清晰度,水平方向 Cb、Cr 只是 Y 一半),Y 和 Cb、Cr 取样频率如上,则电视信号总数码率为: 13.5×8+2×6.75×8=216Mbps 当会议电视采用 CIF 格式时,帧频为 25 帧/秒,总码率为: 352×288×25×8=20.28Mbps 对于高级窄屏幕的 HDTV(1250×1440),取 4:2:0 格式,亮度 fs=54MHz,色度 fs=27MHz,总 码率为: 54×8+27×8÷4=486Mbps 对于高级宽屏幕的 HDTV(1250×1920),取 4:2:0 格式,亮度 fs=72MHz,色度 fs=36MHz,总 码率为: 72×8+36×8÷4=648Mbps 不论何种数字电视信号,这些值 20.28Mbps、216Mbps、486Mbps、648Mbps 都是没有经过压缩 的码率。如果直接在现有的信道中传输,都需要相当的带宽,因此需对这些数字视频信号进行压缩 编码。 2.3 视频信号的预处理 视频处理和通信系统所要处理的信息是十分庞大的视频图像数据,对于处理的速度和精度都有 相当高的要求,系统的应用也是非常广泛。例如,在个人移动通信、远程医疗诊断设备、智能楼宇、 联网交通监控、自然灾害预测以及国防建设等领域获得了惊人的成果。目前的视频处理和通信系统 有各种各样的结构,但不论结构复杂还是简单,一个基本的视频处理和通信系统大致可如图 2.8 所 示,主要包括采集、预处理、视频编码、通信、图像处理以及显示等几个方面。 采集 预处理 视频编码 通信 视频解码 显示 图像处理 图 2.8 视频处理和通信系统 图像采集的功能由图像传感器实现,目前图像传感器主要有电荷耦合器件(CCD,charge coupled devices)和 CMOS 传感器,前者技术发展成熟,具有高解析度、低噪声、动态范围大等优点,在高 端产品中得到广泛应用,后者随着半导体技术的发展,以其低成本、高的集成度、低功耗等占领了 低端市场,且随着技术的不断发展,CMOS 图像传感器的一些参数性能指标已达到或超过 CCD。但 不论是 CCD 还是 CMOS 传感器在将实际景物转换为图像信号时总会引入各种噪声和畸变失真,因 此一般需要对图像传感器的图像进行预处理,包括伽马校正、图像插值、图像校正、白平衡、图像 增强以及增益控制等技术,一方面改善图像的质量,另一方面,可使得图像有利于视频编码的处理。 至于视频图像编码和通信在后续章节将进行重点论述。 2.3.1 色彩插值(Color Interpolation) 不论是 CCD 还是 CMOS 图像传感器,但为了简化工艺和降低成本,一个像素点往往只能给出 记录从纯白到纯黑的系列色调,因而只能给出单色的色调值,不能同时给出 RGB 三组数据。因此, 对于彩色的图像值的获取,这就需要借助色彩滤镜阵列(CFA,Color Filter Array),即图像传感器的 像素表面覆盖一个多色的滤镜阵列。通过应用不同的色彩滤镜阵列,可以获得不同的图像输出阵列, 其中,最常见的一种滤镜阵列的图像传感器获得的是一幅如图 2.9 所示的马赛克的图像阵列,即 Bayer 模型。 图 2.9 Bayer 图像阵列 显然,这种图像阵列中,每个像素值只有一个颜色的色调值,另外两个颜色的色调必须利用相 邻像素之间的相关性,通过数据计算获得,这些方法通常就被称为色彩插值。这里就以 Bayer 图像 阵列为基础,描述色彩的插值算法。文献[2]给出了多种色彩插值算法的实现和性能比较,例如,相 邻像素复制法、双线性插值算法以及双三次多项式插值等等。这里仅就双线性插值算法为例做个简 单的描述。显然,色彩的插值涉及 RGB 三色的处理。具体如下: z 红色/蓝色点处的像素绿色分量 插值等于其相邻的四个像素点的绿色分量平均值。例如,G8 = (G3+G7+G9+G13) / 4。 z 在绿色点处的红色/蓝色分量的插值 这分两种情况:一种情况是如果存在相邻的两个像素的红色/蓝色分量,就取红色/绿色分量的均 值,例如 B7=(B6+B8)/2,R7= (R2+R12)/2。另一个情况是周围没有相邻的红色/蓝色分量,就取对象 线方形的四角像素点处红色/蓝色分量的均值,R8=(R2+R4+R12+R14)/4,B12=(B6+B8+B16+B18)/4。 2.3.2 色彩校正(Color Correction) 上一节通过插值已经得到了 RGB 三元色齐全的图像(R、G、B)了,但传感器响应的这个图像 与真实场景之间仍存在差异。这存在多方面的原因,涉及图像传感器中光学器件(棱镜)的光谱特 性、场景的光源光照条件(诸如白光、荧光或者钨光)以及色彩滤镜的光谱特性等。图 2.10 给出了 配置 RGB 色彩滤镜阵列的 CMOS 图像传感器的光谱响应曲线。 波长(nm) QE(%) 图 2.10 CMOS 图像传感器的光谱响应曲线 为了补偿这种差异,必须对图像的像素值(R、G、B)进行如公式(2.10)的变换处理。 ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎣ ⎡ • ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎣ ⎡ = ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎣ ⎡ B G R bbb bbb bbb B G R 333231 232221 131211 ' 1 1 (2.10) 其中,系数 bij 是由传感器的光谱特性、光源光照条件和滤镜的光谱特性所决定,不能简单地就 给出,往往需要传感器厂商在满足人眼的视觉效果的前提下,依据性能指标和测试结果综合给出。 因此,这里的色彩校正不可能做到理想的效果,只能做到尽可能地减小上述的差异性。 2.3.3 伽马校正(Gamma Correction) 在计算机图形领域, “伽马校正”这个术语大家并不陌生,但它的含义可能正确理解的不多。这 其中又涉及到另一个术语—强度(Intensity),其表示的是每单位面积传播的(光)辐射能量。在图 像显示器中,这个强度作为参量和输入的电压信号密切相关。 以目前应用最为广泛的阴极射线管显示器 CRT 为例,CRT 的感光材料的响应随着加载电子束电 压信号的不同而不同。在理想状态时,输出的色彩强度 Intensity 和电子束的电压信号之间的关系应 该是线性的,如图 2.11(a)所示;但实际上,如图 2.11(b)所示,输出的强度随着电压信号之间是非线 性的。 输入的电压信号(0~1) 强度(0~1) 图 2.11(a) 理想的线性响应 图 2.11(b) 实际的非线性响应 研究表明,显示器的输出强度和输出电压的相应大致呈幂指数关系,如公式(2.11)所示输出 的强度随着输入电压的增长成指数增长。通常我们就把这个幂指数称为伽马(gamma)。事实上,几 乎各种显示器都存在这种非线性关系,其伽马值大小在 1.7 和 2.7 之间,CRT 的伽马值一般取 2.2。 γPI = (2.11) 其中,I 指显示器输出的光强度;P 指显示器上加载的光束电压,一般光束电压 P 是由图像相应 位置的像素值决定;γ为伽马值。 为了在显示器上显示的图像效果和实际相符,有必要在摄像机获取图像后进行伽马校正,使得 上述这种非线性校正为线性关系,公式如下: r oldnew PP 1 )(= (2.12) 其中,Pnew 是进行了校正处理的对图像的像素值;Pold 是校正前的像素值;伽马值γ影响着校正 的程度,γ=1 时,不进行校正,γ越大,像素值的校正量越大。 伽马校正的具体实现方法是多种多样的,在模拟电视中,伽马校正可采用分段折线与渐变式两 种。对于分段式是通过选择二极管的配置电路,确定不同的分段导通特性来实现校正处理。数字电 路技术的发展,高度灵活的数字化伽马校正得到了广泛应用,可以采用数字电路的硬件实现折线式 的伽马校正电路,也可采用软件实现渐变式伽马校正电路。如图 2.12 所示,软件实现的伽马校正的 步骤分为两步;1)建立伽马校正数据表;2)根据输入的像素值进行查表获取伽马校正后的数据。 其中,伽马校正数据表的可以通过各种公式的修正公式计算获得,也可预先设定。 图 2.12 伽马校正示意图 2.3.4 图像增强(Image Enhancement) 很显然,实际应用中图像传感器的输出图像经过上述的处理并不是完美的,图像质量获得的改 进也是有限的,加之噪声、光照等原因,需要进一步处理,丢弃无用的信息,保留我们感兴趣的重 要信息。图像增强作为一种重要的图像处理技术,目的无非就是两个:第一更适合人眼的感觉;第 二有利于后续的分析处理。 图像增强主要包括直方图均衡、平滑滤波、中值滤波、锐化等内容。一般情况下,图像增强既 可以在空间域实现,也可以在频域内实现。这里我们主要介绍在空间域内对图像进行点运算,它是 一种既简单又重要的图像处理技术,它能让用户改变图像上像素点的灰度值,这样通过点运算处理 将产生一幅新图像。总之,图像增强后,有利于视觉的效果和后续的处理,消除了相关性和高频噪 声,有利于图像的压缩和处理,节省带宽。 z 平滑滤波 图像平滑作为一种主要的图像增强技术,其主要目的是为了消除图像采样系统的质量因素所产 生的噪声。噪声并不限于人眼所能看的见的失真和变形,有些噪声只有在进行图像处理时才可以发 现。图像的常见噪声主要有加性噪声、乘性噪声和量化噪声等。图像中的噪声往往和信号交织在一 起,尤其是乘性噪声,如果平滑不当,就会使图像本身的细节如边界轮廓、线条等变得模糊不清, 如何既平滑掉噪声尽量保持图像细节,是图像平滑主要研究的任务。 一般来说,图像的能量主要集中在其低频部分,噪声所在的频段主要在高频段,同时图像中的 细节信息也主要集中在其高频部分,因此,如何去掉高频干扰又同时保持细节信息是关键。为了去 除噪声,有必要对图像进行平滑,可以采用低通滤波的方法去除高频干扰。图像平滑包括空域法和 频域法两大类,在空域法中,图像平滑的常用方法是采用均值滤波或中值滤波,对于均值滤波,它 是用一个有奇数点的滑动窗口在图像上滑动,将窗口中心点对应的图像像素点的灰度值用窗口内的 各个点的灰度值的平均值代替,如果滑动窗口规定了在取均值过程中窗口各个像素点所占的权重, 也就是各个像素点的系数,这时候就称为加权均值滤波;对于中值滤波,对应的像素点的灰度值用 窗口内的中间值代替。在频域法中,一般采用低通滤波法。这里主要采用介绍空域处理的方法。 加权均值滤波是取一个 n×n 的窗口,取该窗口内的 n2 个像素的加权平均值取代中心像素原来的 值。加权均值算法的一般表达形式为: ∑∑ −=−= ++= k ki k kj jyixfjiwyxg ),(),(),( (2.13) 其中,g(x,y)是窗口的中心元素,f(x+i,y+j)是有噪声图像的像素,w(i,j)为加权值,其窗口大小为 (2k+1)×(2k+1)。把 n×n 的权值排成矩阵,称为加权模板。下面介绍几个 3×3 的加权模板: 相等加权的模板为: ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎣ ⎡ •= 111 111 111 9 1),( jiw (2.14) 锥形加权的模板为: ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎣ ⎡ •= 121 242 121 16 1),( jiw (2.15) 灰度差倒数加权的模板为: ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎣ ⎡ +++−+ +•− +−−−− = )1,1(),1()1,1( )1,(),()1,( )1,1(),1()1,1( yxwyxwyxw yxwyxwyxw yxwyxwyxw W (2.16) 其中,每个加权值为: ⎥ ⎦ ⎤ ⎢ ⎣ ⎡ ++ ++=++ ∑∑ ij jyixd jyixdjyixw ),(2 ),(),( )],(),([ 1),( yxfjyixfjyixd −++=++ 图 2.13 给出了采用锥形加权的模板运算得出平滑效果图。 平滑处理前 平滑处理后 图 2.13 锥形加权模板的平滑效果图 z 中值滤波 中值滤波也是一种典型的低通滤波器,它的目的是保护图像的细节的同时,消除噪声。中值滤 波的原理是指把以某点(x,y)为中心的小窗口内的所有像素的灰度按从大到小的顺序排列,将中间值 作为(x,y)处的灰度值(若窗口中有偶数个像素,则取两个中间值的平均)。 对二维的数字图像,设定一个大小为(2k+1)×(2k+1)的窗口,计算其中值为: { }kkjixmediany kjkiij +−== ++ ,,,, (2.17) 可以采用冒泡法对数组进行排序,然后返回数组元素的中值。 实际处理中可采用多种快速算法求解,例如,Narendra 提出了对图像先进行行方向的一维中值 滤波,再做列方向的一维中值滤波方法,可得到去二维中值滤波相近的结果,但计算量大大降低, 也易于硬件实现。T.S.Huang 提出了对图像用 n×n 的滑动窗口进行中值滤波时,每次求中值只要考虑 去掉最左列,补上最右列的像素,其余的像素不变,因此计算量大大缩小。 z 图像锐化 图像的边缘信息在图像风险和人的视觉中都是非常重要的,物体的边缘是以图像局部特性不连 续的形式出现的。前面介绍的图像滤波对于消除噪声是有益的,但往往使图像中的边界、轮廓变的 模糊,为了减少这类不利效果的影响,这就需要利用图像鋭化技术,使图像的边缘变得更加鲜明。 图像銳化处理的目的就是为了使图像的边缘、轮廓线以及图像的细节变的清晰,经过平滑的图 像变得模糊的根本原因是因为图像受到了平均或积分造成的,因此可以对其进行逆运算(如微分运 算)就可以使图像变的清晰。从频率域来考虑,图像模糊的实质是因为其高频分量被衰减,因此可 以用高通滤波器来使图像清晰。 图像锐化的技术有两种方法:微分法和高通滤波法。这里主要介绍微分法,常用的微分锐化主 要有两种:梯度锐化和拉普拉斯锐化。以拉普拉斯锐化为例,对于给定的图像 f(x,y),其二阶差分为: ⎪ ⎪ ⎩ ⎪⎪ ⎨ ⎧ −−+= ∂ ∂ −−++=∂ ∂ ),(2)1,(),(),( ),(2),1(),1(),( 2 2 2 2 yxfyxfyxf y yxf yxfyxfyxfx yxf (2.18) 从而拉普拉斯算子: ),(4)1,()1,(),1(),(),(),( 2 2 2 2 2 yxfyxfyxfyxfy yxf x yxfyxf −−+++−=∂ ∂+∂ ∂=∇ 锐化 处理: ),(),(),( 2 yxfkyxfyxg ∇−= (2.19) 当 k=1 时,等于: )1,()1,(),1(),(5),( −−+−−−= yxfyxfyxfyxfyxg (2.20) 显然,公式(2.21)可以变成前面的模板运算,从而拉普拉斯锐化运算也变成了模板运算,其 模板形式为: ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎣ ⎡ − −•− − = 010 151 010 ),( jiw (2.21) 图 2.14 给出了采用锐化处理效果图。 锐化处理前 锐化处理后 图 2.14 锐化处理效果图 z 直方图均衡 图像直方图是图像处理中一种十分重要的图像分析工具,它描述了一幅图像的灰度级内容,从 数学上来说图像直方图是图像各灰度值统计特性与图像灰度值的函数,它统计一幅图像中各个灰度 级出现的次数或概率;从图形上来说,它是一个二维图,横坐标表示图像中各个像素点的灰度级, 纵坐标为各个灰度级上图像各个像素点出现的次数或概率。 在介绍灰度直方图均衡之前,先讲讲直方图修正。所谓直方图修正,就是通过一个灰度映射函 数 S=F(r),将原灰度直方图改造成你所希望的直方图。所以,直方图修正的关键就是灰度映射函数。 直方图均衡化是一种最常用的直方图修正。它是把给定图像的直方图分布改造成均匀直方图分布。 由信息学的理论来解释,具有最大熵(信息量)的图像为均衡化图像。 假定图像的总像素数目为 n,而某个灰度级 k 的像素数目为 mk,该灰度级的概率密度为: n nrP k kr =)( (2.22) 则图像直方图均衡的变化函数为: ∑∑ == === k j jr k j j kk rPn nrTS 00 )()( (2.23) 1-L2,1,0 ,=k 图 2.15 给出了采用直方图均衡的效果图。 直方图均衡前 直方图均衡后 图 2.15 直方图均衡的效果图 2.3.5 白平衡(White Balance) 白平衡作为图像处理的一个重要术语,也随着数码相机的普及进入了人们的认识中。白平衡指 的就是对白色物体的还原。当我们用肉眼观看这大千世界时,在不同的光线下,对相同的颜色的感 觉基本是相同的,比如在早晨旭日初升时,我们看一个白色的物体,感到它是白的;而我们在夜晚 昏暗的灯光下,看到的白色物体,感到它仍然是白的。这是由于人类从出生以后的成长过程中,人 的大脑已经对不同光线下的物体的彩色还原有了适应性。但是,图像传感器没有这种人眼的适应性, 在不同的光线下,由于图像传感器输出的不平衡性,造成其输出的彩色失真:或者图像偏蓝,或者 偏红,如图 2.16 所示。 正常图像 色温高 色温低 图 2.16 白平衡示意图 理解白平衡,涉及到另一个重要的概念:色温。所谓色温,简而言之,就是定量地以开尔文温 度表示色彩。色温越高,蓝色成分就越多;色温越低,红色成分就越多,在摄影、摄像时,不同色 温光源下拍摄物体,获得的图像不可避免会出现色彩上的偏差。为了很获得现实际世界中各种色彩 的图像,必须消除环境中光源色温的影响,即进行白平衡处理。 传统的白平衡方法,首先在色温环境中拍摄一纯白色物体,分析所拍摄的图像数据,对白色物 体的数据进行平均。得出三原色的平均值(Rmean、Gmean、Bmean),根据白色的定义: R=G=B 改变 R、B 感应通道的增益可以实现图像的白平衡,这种白平衡方法需要有白色参照物,使用 不便。因此,实际应用中,产生了一些自动白平衡的算法,主要有: 1)全局平衡法 认为所拍摄的图像的 RGB 三色分量的统计平均应该相等,对于拍摄的图像进行统计平均,以 R、 B 分量的均值作为白平衡校准的依据。 2)局部白平衡法 搜索所拍摄的图像中,最亮的区域作为白色区域,该区域的 RGB 三色分量的统计平均值应该相 同,以该区域的 R、B 分量的均值作为白平衡校准的依据。 2.4 视频质量 对压缩后的视频质量估计是一件困难的工作。大体上,可分为主观视频质量评定和客观视频质 量评定两种估计方法。 2.4.1 主观质量的评定 由于个人的视觉系统(HVS)不尽相同,对视频内容的熟悉程度也不一样。为了减少主观随意 性,在对视频图像主观评定前,选若干名专家和“非专家”作为评分委员,共同利用五项或七项评分 法对同一种视频图像进行压缩编码构图像评定。最后按加权平均法则对该压缩后的图像质量进行主 观评定,如表 2.2 所示。 表 2.2 主观评价分数标准 CCIR 五级评分等级 评分等级 高清晰度采用七级评分等级 评价 7 不能觉察任何图像损伤 特别好 6 刚能觉察有图像损伤 相当好 优 5 不同程度的觉察,轻度损伤 很好 好 4 有损伤,但不令人讨厌 好 稍差 3 有令人讨厌损伤 稍差 很差 2 损伤令人讨厌,但尚可忍受 很差 劣 1 非常令人讨厌损伤,无法观看 劣 测试方法可用随机次序请评委观察比较原始图像和压缩编码的图像。国际上称为 DSCOS 的测 试系统如图 2.17 所示。其中 A 为原始图像,B 为编码解码后的图像,以任意的 A、B 次序让评委打 分评定。 图 2.17 DSCQS 测试系统 2.4.2 客观质量的测量 主观的视频质量评分更接近人的真实视觉感受,但需耗费人力和时间,成本较高。客观质量的 测定方法速度快、易实行,但往往不会太符合人眼的视觉感受,只能说大体上的质量。客观质量测 定方法应致力于改进其测试标准和测试方法,使其符合人的视觉感受。 最常用的测试标准是峰值信号与噪声之比(PSNR): PSNRdB=10 ㏒ 10(2n-1)2/MSE (2.24) 其中 MSE 为原始和编解码后图像之间的均方误差,(2n-1)2为图像种最大可能的信号值平方,n 为 表示每个像素的比特数。 一般讲,PSNR 愈高视频质量愈高;反之亦然。但实际上有时并非如此,如图 2.18 和图 2.19 所 示。图 2.19 的 PSNR=27.7dB,其主观评定可能比图 2.18(b)(c)的高,但客观质量 PSNR 却低于 图 2.18(b)(c)的 30.6dB 和 28.3dB。这是因为图 2.19 中 的脸部更清晰,只是背景模糊,而人眼 对脸部往往更敏感更重视。 图 2.18 PSNR 举例 (a)原始;(b)30.6dB;(c)28.3dB 图 2.19 背景模糊图像 27.7dB 参考文献 1 Iain E.G.Richardon, H.264 and MPEG-4 Video Compression Video Coding for Next Generation Multimedia, Wiley Press ,2003 2 孙景鳌,蔡安妮,彩色电视基础,人民邮电出版社,1996 3 许志祥,数字电视与图像通信,上海大学出版社,2000 4 张兆扬,陈加卿,徐在方,数字电视原理,科学出版社,1987.12 5 http://www-ise.stanford.edu/~tingchen/main.htm 6 Color Correction for Image Sensors,Kodak Image Sensor Solution,2003.10 7 http://graphics.stanford.edu/gamma.html 8 http://www.teamten.com/lawrence/graphics/gamma/ 9 钟志光,卢君,刘伟荣,Visual C++.NET 数字图像处理实例与解析,清华大学出版社,2003.5 10 胡波,林青,陈光梦,基于先验知识的自动白平衡,电路与系统学报,2001.6 第 3 章 视频压缩编码的基本原理 3.1 预测编码 3.1.1 预测编码的基本概念 预测法是最简单和实用的视频压缩编码方法,这时压缩编码后传输的并不是像素本身的取样幅 值,而是该取样的预测值和实际值之差。 为什么取像素预测值与实际值之差作为传输的信号?因为大量统计表明,同一幅图像的邻近像 素之间有着相关性,或者说这些像素值相似。邻近像素之间发生突变或“很不相似”概率很小。而且 同帧图像中邻近行之间对应位置的像素之间也有较强的相关性。人们可以利用这些性质进行视频压 缩编码。 图 3.1 邻近像素间的相关性 例如,同一帧内邻近像素,当前像素为 X,其左邻近像素为 A,上邻近像素为 B,上左邻近像 素为 C 等。显然与 X 之间的距离近的像素,如 A 和 B 与 X 的相关性强,愈远相关性愈弱,如 C、D、 E、F 等像素。以 P 作为预测值,按与 X 的距离不同给以不同的权值,把这些像素的加权和作为 X 的预测值,与实际值相减,得到差值 q。由于临近像素之间相关性强,q 值非常小,达到压缩编码的 目的。 接收端把差值 q 与预测值(事先已定义好,比当前 X 早到达接收端像素,如A)相加,恢复原 始值 X。归纳如下: 编码端:X-A=q 解码端:q+A=X 按以上原理可得预测编码框图,如图 3.2 所示。这种预测编码也称为差分脉冲编码(DPCM)。 图 3.2 预测编码 其中,x(n)为当前像素的实际值,p(n)为其预测值,d(n)为差值或残差值。该差值经量 化后得到残差量化值 q(n)。预测值 p(n)经预测器得到,预测器输入为已存储在预测器内前面的各像 素,和当前值,它们的加权和即为下一个预测器输出。 由图 3.2 可见,解码输出 x’(n)与原始信号 x(n)之间有个因量化而产生的量化误差。 现在进一步说明预测法可压缩视频信息的理由。大量统计表明,由于相关性的存在,邻近像素 值之差很小。其差值信号的概率分布如图 3.3 所示。可见该差值信号的方差是比较小的。由于图像 的误差信号 d(n)方差相对图像信号本身方差较小,其量化器的动态范围可以缩小,相应的量化分层 数目就可减少,每个像素的编码比特数也显著下降,而且不致视频质量明显降低,达到视频压缩的 目的。 图 3.3 图像差值信号的概率分布 3.1.2 帧内预测编码 3.1.2.1 一维最佳预测 现在按上述的概念重新画成如图 3.4 所示的预测编码器。 ()'f x ()f x ()ex ()'ex ()xf ∧ ( )'ex ( )'f x ()xf ∧ 图 3.4 一维预测编码器 预测模型可以是一维的,也可以是二维或多维的;可以是线性的,也可是非线性的。下面先讨 论一维线性预测方法。 设预测值为 () 1 () m k k x afx kf ∧ = = −∑ (3.1) 其中 f(x)为当前像素值,以 f(x)为基准,f(x-1)为前一个像素值,f(x-2)为前两个像素值。把前 m 个像素值的加权和 ()xf ∧ 作为 f(x)的预测值。ak 是预测系数,m 为预测阶数。其预测误差如下: () 1 () () () ( ) m k k ex fx x fx afx kf ∧ = = −=− −∑ (3.2) e(x)经量化得到 e’(x),为获得最佳预测效果,应使 e(x)的均方误差最小,编码效率最高: ( ){ }22 e E exσ = 令 2 e ja σ∂ ∂ =0 (3.3) 设 E{f(x-j)f(x-k)}=Rk-j 为信号间的相关函数,因信号是平稳信源,即像素间自相关是常数,与位置无 关,像素间相关性对称,可得出: 1 01 111 21012 110 ...... ...... ................... ...... m m mmm RR R R R RR R RRRR α α α − − − − ⎡⎤⎡⎤ ⎡⎤ ⎢⎥⎢⎥ ⎢⎥ ⎢⎥⎢⎥ ⎢⎥= ⎢⎥⎢⎥ ⎢⎥ ⎢⎥⎢⎥ ⎢⎥ ⎣⎦ ⎣⎦⎣⎦ (3.4) 即预测系数: α=[R]-1*r (3.5) 可以证明,这时预测误差的方差为: 22 0 11 mm ekkxkk kk R RRσασα == =− =−∑∑ (3.6) 可见,相关性 Rk 越大,预测误差方差 2 eσ 越小于信号方差,压缩效率也就越高。 3.1.2.2 二维最佳预测 二维预测编码器框图如图 3.5 所示。 ( ),f xy ( ),exy ( )' ,exy (),x yf ∧ ( )' ,f xy ( )' ,exy ( )' ,f xy (),x yf ∧ 图 3.5 二维预测编码 图 3.5 中 f(x,y)为当前像素值,(x,y)为其所在水平和垂直位置的 x,y 坐标值。由一维预测可推广, 其二维预测值为: () , (,) ,(,)kl kl Z x yfxkylf α ∧ ∈ = −−∑∑ (3.7) αk,l 为二维预测系数,Z 为预测区域,(k,l)分别为对当前点进行预测点像素的水平和垂直位置坐标 值。设 f(x,y)为二维平稳随机过程,预测误差为: () () (),, ,exy f xy xyf ∧ =− (3.8) 令 2 e ja σ∂ ∂ =0 得: ( ) , (,) ,(,)0kl kl Z Rij Rx iy jα ∈ − −−=∑ ∑ (3.9) 由二维图像得相关函数,可得其预测误差方差: ( )2 , (,) 0,0 ( , )ekl kl Z R Rklσα ∈ =−∑ ∑ (3.10) 为了利用数字电路实现预测系数,往往将其取为 1/2、1/4、1/8 之类的分数表示。有人提出了一 下预测值: () ()()()()11 11,,11,11,1,128 48xy fxy fx y fx y fx yf ∧ =−+−−+−+−+ (3.11) 其中各预测点得位置如图 3.6 所示。 ()1, 1fx y−− ( )1,f xy− ( )1, 1fx y− + (),1fxy− ( ),f xy ( ),1fxy+ 图 3.6 二维图像像素位置 3.1.2.3 预测编码增益 视频预测编码的效果是得到了视频的压缩编码,即相对于不压缩的 PCM 而言,每个像素值被分 配的比特数被减少。换言之,可用相同比特率下,产生量化失真之比来定义编码增益。 由文献 3 可知,对于 PCM,其率失真 DPCM 为: 22 22 R PCM fD εσ −= (3.12) 其中 2 fσ 为原始信号的方差, 2 PCMσ 为该信号量化误差的方差,ε 为量化误差的概率密度函 数。如预测误差采用最佳标量量化,量化失真 DDPCM 与码率 R 之间关系为: 22 22 R DPCM pD ρεσ −= (3.13) 其中, 2 ρσ 为预测误差的方差, 2 pε 是预测误差的概率密度函数,预测编码增益为: 22 22 fPCM DPCM DPCM p DG D ρ ε σ ε σ== (3.14) 对于高斯信源, 2ε 和 2 pε 两者可以认为相等,于是得: 2 2 f DPCMG ρ σ σ= (3.15) 例:设一幅图像中每个 2×2 块,进行预测编码(图 3.7),其中 hρ 、 vρ 、 dρ 分别为相邻像素之间的 相关系数,设 hρ = vρ = ρ =0.95, dρ = 2ρ =0.9025,求 GDPCM。 vρ hρ dρ 图 3.7 2×2 块 解:由前面推导可知, 1 2 2 3 a a a ρ ρ ρ ⎡ ⎤⎡⎤ ⎢ ⎥⎢⎥= ⎢ ⎥⎢⎥ ⎢ ⎥⎢⎥⎣⎦⎣ ⎦ 22 22 R DPCM pD ρεσ −= () 2 22 2 1 105.19 1 f DPCMG ρ σ σ ρ == = − (3.16) 3.1.2.4 预测编码的量化器 图 3.3 给出了大量统计后差值信号的概率分布,一般说图像中平坦区域比突变区域多得多,例 如人脸中,只有眼睛、鼻子、嘴等少量地方细节出现,其余则为平坦或缓变区域。 人眼视觉特性实验表明,在亮度突变部分或变化大的部分,量化误差大些不会使人眼敏感,可 采取粗量化,量化节距可取大一些,这时虽然需多些比特数,但面积小总比特数不大;反之,在亮 度变化缓慢区域,则应取细量化,但由于平坦区域 e(x,y)小,也不会增加很多比特数。总之,利用人 眼这种掩盖效应采用非线性(不均匀)量化,可使总码率有所下降。表 3.1 为量化器输入输出值举 例。由于误差信号值有正有负,总量化级数为 19。 表 3.1 量化值举例 输出量化值 0 3 6 11 18 29 46 71 110 150 输入量化值 0~1 2~45~8 9~14 15~23 24~37 38~58 59~90 91~139 140~225 由于量化,预测编码会产生过载、颗粒噪声、伪轮廓以及边沿忙乱等,如图 3.8 所示。它们都 是由于量化值过小或不够小及像素变化过快等跟不上变化造成的。 图 3.8 预测编码的各种噪声 3.1.2.5 二维预测编码器 图 3.9、3.10 为一具体的二维预测编码器举例,设原数字序列为 f(x,y),预测公式为: () ()()()()15 1 9 1,,11,11,1,132 8 32 8xy fxy fx y fx y fx yf ∧ =−+−−+−+−+ (3.17) A/D 量化器 编码 并/串 D/D 限幅器 1样值延迟 一行减去1 样值延迟1样值延迟1样值延迟 (),f xy (),f xy + - ( ),exy ( )',exy ( ),nexy ( )',exy ( )' ,f xy ( ),1fxy− ( )1, 1fx y− − ()1, 1fx y−− ( )1,f xy− ( )1, 1fx y− + 1/8 1/32+1/4 1/8 (),x yf ∧ -1/32 +1/2 模拟图像 数字 预测编码 数据流 预测器 图 3.9 二维预测编码器 ()',exy ( )' ,f xy ( ),1fxy− ( )1, 1fx y− − ()1, 1fx y−− ( )1,f xy− ( )1, 1fx y− + (),x yf ∧ 图 3.10 二维预测解码器 3.1.3 帧间预测编码 一般而言,帧间预测编码编码效率比帧内更高。有人测得,对缓慢变化 256 级灰度的黑白图像 序列,帧间差超过阈值 3 的像素不到一帧像素的 4%;对剧烈变化 256 亮度值的彩色电视序列,帧 间差超过阈值 6 的像素平均只占一帧的 7.5%。下文将讨论单向预测、双向预测、重叠块运动补偿三 个内容。 3.1.3.1 单向预测 (1)预测原理 图 3.11 为单向预测的预测编码框图。 量化器 运动补偿 预测器 运动参数 估值器 帧存储器 ( ),tf xy ( ),texy ( )' ,texy (),x ytf ∧ (),x ytf ∧ ( )' ,tf xy ( )1 ,tf xy− 前帧或后帧 预测器 当前帧 图 3.11 单向预测帧间编码 当前帧图像 (),tf xy 与预测图像 (),x ytf ∧ 相减后的帧误差 ( ),texy,经量化器量化后输出 ()' ,texy,传送到信道。预测图像 (),x ytf ∧ 与 ( )' ,texy相加,得 ( )' ,tf xy,当不计量化失真时, ()' ,tf xy即当前的 (),tf xy 。 把当前帧 ()' ,tf xy与帧存储器输出的前一帧 ( )1 ,tf xy− (也称参考帧)同时输入运动参数估值器, 经搜索、比较得到运动矢量 MV。此 MV 输入运动补偿预测器,得到预测图像 (),x ytf ∧ 。 预测图 像 (),x ytf ∧ 不可能完全等同于当前图像 ( ),tf xy ,无论预测得如何精确,总存在帧误差 (),texy。 由上述可知,利用上一帧的图像经运动矢量位移作为预测值的方法称为单向预测或单向时间预 测。这时, () ( ),,tx yfxiyjtf ∧ = ++ (3.18) 其中,(i, j)即运动矢量。 如何减小帧差和更精确预测当前像素是提高帧间压缩编码效率的关键之处。 (2)基于块匹配算法的运动矢量估计 上述原理以像素为单位进行预测,除了传送帧差外,还增加了每个像素的运动矢量,编码效率 显著下降。 实际上,两帧之差的物体运动一般是刚体的平移运动,位移量不大,因此往往把一帧图像分成 若干 M×N 块,以块为单位分配运动矢量,大大降低总码率。如图 3.12 所示。 Wx Wx Wx W W 当前 帧块 前一帧搜索区 图 3.12 块匹配算法 设前一帧搜索区为(M+2Wx, N+2Wy),当前帧块与前一帧块的位移为 d(i, j),在搜索区中,如 能找到与当前帧块匹配的前一帧块,则该 d(i, j)即为所需的运动矢量。 常用的匹配准则有: a) 均方误差(MSE)最小准则: () () ( ) 2 1 11 1,,, MN tt xy MSE i j f x y f x i y jMN − == =−++⎡ ⎤⎣ ⎦∑∑ (3.19) b) 绝对误差均值(MAD)最小准则: () () ( )1 11 1,,, MN tt xy MAD i j f x y f x i y jMN − == = −++∑∑ (3.20) (3) 搜索方法 a 穷尽搜索法 穷尽搜索法对搜索窗内的每一点都用匹配准则进行计算,找到 MSE 或 MAD 最小时的点(i,j)值, 作为所需的运动矢量 d(i,j)。 该法计算量大,如采用 MAD 准则,需计算(2Wx+1)×(2Wy+1)个 MAD 值,但它能够找到 全局最优运动矢量。 b 快速搜索法 为了更快找到 d(i,j),可采用一些快速搜索法,这里只以三步搜索法为例加以说明。如图 3.13 所 示。 图 3.13 三步搜索法 一个 16×16 搜索区中心点(i,j)=(0,0),以搜索区最大搜索长度的一半为步长,计算中心点及周围 8 个邻近点的 MAD 值,如找到某个点 MAD 最小,再以该点为中心,步长减为原来的一半,依次类 推,到了第三步,再把步长减半,计算 MAD 值,其中 MAD 最小点运动矢量即为所求的值。快速算 法的速度快,但不能保证全局最优。 3.1.3.2 双向预测 有时,不只是利用前一帧像素预测,还需利用后一帧像素,即预测值为: () ( ) ()'' 11,, ,tt ttx yfxiyjfxiyjtf αα ∧ −+=+++++ (3.21) 其中 (, )di j和 ''(, )di j 分别为 t 到 t-1 和 t 到 t+1 间的运动矢量 MV, 1tα − 和 1tα + 分别为前向和后 向预测系数,可按最佳预测公式确定。 这时,前向参考帧预测当前帧称为前向运动补偿,利用后向参考帧预测当前帧称为后向运动补 偿,利用前后向同时预测的就称为双向预测运动补偿。 双向预测在实时通信中是不能应用的,例如会议电视、可视电话等,因为后向预测在当前帧之 后进行,会引入编码时延。它可用在广播电视系统中,如采用 MPEG 标准的编码系统,特别针对一 些暴露区域,即 t-1 帧尚未暴露而 t+1 帧已呈现出来的区域。图 3.14 为单向和双向预测编码举例。 图 3.14 单向和双向预测举例 为了进一步提高编码效率,多帧预测(包括单向和双向预测)被引入,如 H.264 标准参考帧可 达 5~15 帧。 3.1.3.3 重叠块运动补偿 OBMC 以上基于块的运动补偿从计算量上看是比较简单,但这种人为的块划分使得每个块由一个运动 矢量,容易产生方块效应,特别是运动矢量估计不准确或物体运动非简单的平移运动及一个块中有 几个不同运动物体时。OBMC 方法解决了运动矢量估计不准确的方法。 采用 OBMC 时,一个像素的预测不仅基于它所属的 MV 估计,还基于其相邻的 MV 估计。如图 3.15 所示,以 4 个邻块为例。 x1 x0 x3 x2x4 Bm 1 Bm 3 Bm 4 Bm 2 ( )40xh ( )30xh ( )20xh ( )10xh ( )00xh 图 3.15 4 邻块的 OBMC 这时预测值为: () ( )( ) 4 1 ,,,kkkrk kk k k x yhxyfxiyjpf ∧ = =++∑ (3.22) 为找到最佳预测估计,应使下式最小: () ( ) 24 1 ,,kr k k k k k Efxy hfx iy j = ⎧⎫⎪⎪−++⎨⎬ ⎪⎪⎩⎭ ∑ (3.23) 为保持图像的均值,还需加上如下约束: () 4 1 ,1kkk k hxy = =∑ (3.24) 可用迭代法进行运动估计和 OBMC。 3.1.4 运动估计 3.1.4.1 基本概念 在帧间预测编码中,由于活动图像邻近帧中的景物存在着一定的相关性。因此,可将活动图像 分成若干块或宏块,并设法搜索出每个块或宏块在邻近帧图像中的位置,并得出两者之间的空间位 置的相对偏移量,得到的相对偏移量就是通常所指的运动矢量,得到运动矢量的过程被称为运动估 计。 运动矢量和经过运动匹配后得到的预测误差共同发送到解码端,在解码端按照运动矢量指明的 位置,从已经解码的邻近参考帧图像中找到相应的块或宏块,和预测误差相加后就得到了块或宏块 在当前帧中的位置。 通过运动估计可以去除帧间冗余度,使得视频传输的比特数大为减少,因此,运动估计是视频 压缩处理系统中的一个重要组成部分。本节先从运动估计的一般方法入手,重点讨论了运动估计的 三个关键问题:将运动场参数化、最优化匹配函数定义以及如何寻找到最优化匹配。 3.1.4.2 运动估计的方法 一般的运动估计方法如下:设 t 时刻的帧图像为当前帧 f(x,y), t’时刻的帧图像为参考帧 f’(x, y),参考帧在时间上可以超前或者滞后于当前帧,如图 6.12 所示,当 t’t 时,称之为前向运动估计。当在参考帧 t’中搜索到当前帧 t 中的块的最佳匹配时,可以得到相 应的运动场 d(x; t, t + t△ ),即可得到当前帧的运动矢量。 图 6.12 前向和后向运动估计 H.264 编码标准和以往采用的视频压缩标准很大的不同在于,在运动估计过程中采用了多参考 帧预测来提高预测精度,多参考帧预测就是在编解码端建一个存储 M 个重建帧的缓存,当前的待编 码块可以在缓存内的所有重建帧中寻找最优的匹配块进行运动补偿,以便更好地去除时间域的冗余 度。由于视频序列的连续性,当前块在不同的参考帧中的运动矢量也是有一定的相关性的。假定当 前块所在帧的时间为 t, 则对应前面的多个参考帧的时间分别为:t-1, t-2, ……。则当在帧 t-2 中搜索 当前块的最优匹配块时,可以利用当前块在帧 t-1 中的运动矢量 MVNR 来估测出当前块在帧 t-2 的运 动矢量。 3.1.4.3 运动表示法 由于在成象的场景中一般有多个物体作不同的运动,如果直接按照不同类型的运动将图像分割 成复杂的区域是比较困难的。最直接和不受约束的方法是在每个像素都指定运动矢量,这就是所谓 基于像素表示法。这种表示法是对任何类型图像都是适用的,但是它需要估计大量的未知量,并且 它的解时常在物理上是不正确,除非在估计过程中施加适当的物理约束。这在具体实现时是不可能 的,通常采用基于块的物体运动表示法。 3.1.4.3.1 基于块的运动表示法 一般对于包含多个运动物体的景物,实际中普遍采用的方法是把一个图像帧分成多个块,使得 在每个区域中的运动可以很好地用一个参数化模型表征,这被称为块匹配法,即将图像分成若干个 n×n 块(典型值:16×16 宏块),为每一个块寻找一个运动矢量 MV,并进行运动补偿预测编码。 每一个帧间宏块或块都是根据先前已编码的数据预测出的,根据已编码的宏块、块预测的值和 当前宏块、块作差值,结果被压缩传送给解码器,与解码器所需要的其他信息如(运动矢量、预测 模型等)一起用来重复预测过程。 每个分割区域都有其对应的运动矢量,并必须对运动矢量以及块的选择方式进行编码和传输。 在细节比较多的帧中如果选择较大的块尺寸,意味着用于表明运动矢量和分割区域类型的比特数会 少些,但是运动压缩的冗余度要多一些;如果选择小一点的块尺寸,那么运动压缩后冗余度要少一 些,但是所需比特数要比较多。因此必须要权衡块尺寸选择上对压缩效果的影响,一般对于细节比 较少、比较平坦的区域选择块尺寸大一些,对于图像中细节比较多的区域选择块尺寸小一些。 宏块中的每个色度块(Cb 和 Cr)尺寸宽高都是亮度块的一半,色度块的分割方法和亮度块同样, 只是尺寸上宽高都是亮度块一半(如亮度块是 8×16 块尺寸大小,那么色度块就是 4×8,如果亮度块 尺寸为 8×4,那么色度块便是 4×2 等等)。每个色度块的运动矢量的水平和垂直坐标都是亮度块的一 半。 3.1.4.3.2 亚像素位置的内插 帧间编码宏块中的每个块或亚宏块分割区域都是根据参考帧中的同尺寸的区域预测得到的,它 们之间的关系用运动矢量来表示。 由于自然物体运动的连续性,相邻两帧之间的块的运动矢量不是以整像素为基本单位的,可能 真正的运动位移量是以 1/4 像素或者甚至 1/8 像素等亚像素作为为单位的。 图 3.17 给出了一个视频序列当采用 1/2 像素精度、1/4 像素精度和 1/8 像素精度时编码效率的情 况,从图中可以看到 1/4 像素精度相对于 1/2 像素精度的编码效率有很明显的提高,但是 1/8 像素精 度相对于 1/4 像素精度的编码效率除了在高码率情况下并没有明显的提高,而且 1/8 像素的内插公式 更为复杂,因此在 H.264 的制定过程中 1/8 像素精度的运动矢量模型逐渐被取消而只采用了 1/4 像素 精度的运动矢量模型。 图 3.17 高精度的亚像素运动搜索对编码效率的影响 3.1.4.3.3 运动矢量在时空域的预测方式 如果对每个块的运动矢量进行编码,那么将花费相当数目的比特数,特别是如果选择小尺寸的 块的时候。由于一个运动物体会覆盖多个分块,所以空间域相邻块的运动矢量具有很强的相关性, 因此,每个运动矢量可以根据邻近先前已编码的块进行预测,预测得到的运动矢量用 MVp 表示,当 前矢量和预测矢量之间的差值用 MVD 表示。同时由于物体运动的连续性,运动矢量在时间域也存 在一定相关性,因此也可以用邻近参考帧的运动矢量来预测。 1) 运动矢量空间域预测方式 a、运动矢量中值预测(Median Prediction) 利用与当前块 E 相邻的左边块 A,上边块 B 和右上方的块 C 的运动矢量,取其中值来作为当前 块的预测运动矢量。 设 E 为当前宏块、宏块分割或者亚宏块分割, A在 E 的左侧,B 在 E 的上方、C 在 E 的右上 方,如果 E 的左侧多于一个块,那么选择最上方的块作为 A,在 E 的上方选择最左侧的块作为 B。 图 3.18 表示所有的块尺寸相同,图 3.19 表示邻近块尺寸不同时作为预测 E 的运动矢量的块的选择。 图 3.18 块尺寸相同的当前块和邻近块 图 3.19 块尺寸不同的当前块和邻近块 在预测 E 的过程中遵守以下准则: 1、 对于除了块尺寸为 16×8 和 8×16 的块来说,MVp 是块 A、B 和 C 的运动矢量的中值; 2、 对于 16×8 块来说,上方的 16×8 块的 MVp 根据 B 预测得到,下方的 16×8 块的 MVp 根据 A 得到; 3、 对于 8×16 块来说,左侧的 16×8 块的 MVp 根据 A 预测得到,右侧的 16×8 块的 MVp 根据 C 得到; 4、 对于不用编码的可跳过去的宏块,16×16 矢量 MVp 如第一种情况得到。 b、空间域的上层块模式运动矢量(Uplayer Prediction) H.264 标准中提供的块尺寸有 16×16,8×16,16×8,8×8,8×4,4×8,4×4,它们的图象分割区 域分别定义为搜索模式 Mode1-Mode7。假设当前分割区域的预测模式为 Modecurr,上层模式 Modeup 定义为: ,1 1, 2, 3 2, 4 4, 5, 6 5, 7 curr curr Up curr curr curr unavailable if Mode Mode Mode if Mode Mode Mode Mode Mode if Mode Mode Mode if Mode Mode Mode Mode if Mode Mode ==⎧ ⎪ ==⎪⎪===⎨ ⎪ ==⎪ ⎪ ==⎩ (3.25) 如图 3.20 所示为利用空间域上层搜索模式的运动矢量作为当前块的预测运动矢量的预测方式。 MVpred_up = MVUplayer (3.26) 图 3.20 空间域上层预测的模式 2) 运动矢量在时间域预测方式 a、前帧对应块运动矢量预测(Corresponding-block Prediction) 利用前一帧的与当前块相同坐标位置的块的运动矢量来作为当前块的预测运动矢量,如图 3.21 所示。 图 3.21 前帧对应位置的运动矢量预测的模式 b、时间域的邻近参考帧运动运动矢量预测(Neighboring Reference-frame Prediction) 由于视频序列的连续性,当前块在不同的参考帧中的运动矢量也是有一定的的相干性的。如图 3.22 所示,假设当前块所在帧的时间为 t,则当在前面的参考帧 t’中搜索当前块的最优匹配块时,可 以利用当前块在参考帧 t’+1 中的运动矢量来估测出当前块在帧他 t’的运动矢量: MVpred_NRP = MVNR×(t-t’) / (t-t’-1) (3.27) 图 3.22 时间域邻近参考帧预测的模式 在上述运动矢量的四种预测方式中,经过实验证明,空间域的预测更为准确,其中上层块预测 的性能最优,因为其充分利用了不同预测块模式运动矢量之间的相关性。而中值预测性能随着预测 块尺寸的减小而增加,这是因为当前块尺寸越小,相关性越强。 3.1.4.3.4 匹配误差在时空域的预测方式 H.264 中定义的匹配误差函数如下: J(MV,λMOTION)=SAD(s, c (MV))+λMOTION×R(MV-PMV) (3.28) 其中 SAD(绝对差值和)计算公式如下: , 1, 1 (,( )) |[, ] [ , ]|,, 16,8 4 xyBB xyxy xy SAD s c MV s x y c x MV y MV B B or == =−−−=∑ (3.29) 其中 s 是当前进行编码的原始数据,而 c 是已经编码重建的用于进行运动补偿的参考帧的数据。 MV 为候选的运动矢量,λMOTION 为拉格朗日常数,PMV 为中值预测矢量,R(MV-PMV)代表了运动矢 量差分编码可能耗费的比特数,由于在接下来的四种匹配误差预测方式中匹配误差中的 λMOTION×R(MV-PMV)部分通常很接近而抵消,SAD 部分的预测特性基本上可以反映整个匹配函数的 预测特性,因此 J(MV,λMOTION)用 SAD 来表示。 匹配误差在时空域的预测方式和运动矢量类似,具体分为: 1)匹配误差在空间域预测方式 a、中值预测(Median Prediction) 与当前块 E 相邻的左边块 A,上边块 B 和右上方的块 C 搜索得到的最小 SAD 值分别为 SADA, SADB,SADC,取当前块的预测 SAD 值为: SADpred_MD = min (SADx_median,SADy_median) (3.30) SADx_median 是相邻块中对应运动矢量横坐标为 x_median=Median(MVA(x),MVB(x)MVC(x)) (3.31) 的相邻块的最小 SAD 值,SADy_median 也同理。如图 3.23 所示 图 3.23 SAD 空间域中值预测模式 b、上层预测(Uplayer Prediction) H.264 标准中提供的块尺寸有 16×16,8×16,16×8,8×8,8×4,4×8,4×4,它们的图象分割区 域分别定义为搜索模式 Mode1-Mode7。假设当前分割区域的预测模式为 Modecurr,上层模式 Modeup 定义为 ,1 1, 2, 3 2, 4 4, 5, 6 5, 7 curr curr Up curr curr curr unavailable if Mode Mode Mode if Mode Mode Mode Mode Mode if Mode Mode Mode if Mode Mode Mode Mode if Mode Mode ==⎧ ⎪ ==⎪⎪===⎨ ⎪ ==⎪ ⎪ ==⎩ (3.32) 利用空间域上层搜索模式的搜索所得的最小 SAD 值作为当前模式下的预测 SAD 值的方法如图 3.24 所示: SADpred_up = SADuplayer/2 (3.33) 图 3.24 SAD 空间域上层预测模式 2) 匹配函数在时间域预测方式 a、前帧对应块的预测(Corresponding-block Prediction) 利用前一帧的与当前块相同坐标位置的块在帧 t’-1 中搜索得到的最小 SAD,作为当前搜索块在 帧 t’中进行搜索的 SAD 的预测值,如图 3.25 所示: 图 3.25 SAD 时间域前帧对应块预测模式 b、时间域的邻近参考帧预测(Neighboring Reference-frame Prediction) 如图 3.26 所示,假设当前块所在帧的时间为 t,则当在前面的参考帧 t’中搜索时,可以利用当前 块在参考帧t’+1中搜索得到的最小SAD值SADNR作为当前块在帧t’搜索的SAD预测值,即SADpred_NRP =SADNR。 图 3.26 SAD 时间域邻近参考帧预测模式 以上所述的匹配误差的四种预测方式中,时间域的预测更为准确,其中邻近参考帧预测方式性 能最优,这是由于在这种预测方式下当前块相同,邻近参考帧预测方式中,邻近的参考帧之间具有 比较强的相关性。但是它的性能受量化参数影响比较大,这是由于量化参数大的时候图象细节模糊, 相邻参考帧图象内容之间的相似度增加,因而用邻近参考帧预测的方式会更为准确一些。 3.1.4.4 运动估计准则分类 运动搜索的目的就是在搜索窗内寻找与当前块最匹配的数据块,这样就存在着如何判断两个块 是否匹配的问题,即如何定义一个匹配准则。而匹配准则的定义与运算复杂度和编码效率都是直接 相关的,通常有如下几类比较常用的匹配函数的定义: 设当前帧 f2,参考帧 f1, (1)最小均方差函数(MSE) MSE (MV) =Σ|f2(x,MV)-f1(x)|2 (3.34) (2)最小平均绝对值误差(MAD)等效于常用的绝对差值和(SAD)准则,性能很好,而且相对简单 的硬件需求,因而得到了最广泛的应用。 MAD (MV) =Σ|f2(x,MV)-f1(x)| (3.35) (3)阈值差别计数(NTD) NTD(MV)=ΣG(f2(x,MV)-f1(x)) (3.36) 其中: 当 | α-β | >T0 时,G(α,β)=1; 当 | α-β | |t-td|) fc(x,y,t)=f(x,y,ta) (其余) If s(x,y,ta)=1 and s(x,y,td)=0 fc(x,y,t)=f(x,y,td) If s(x,y,ta)=0 and s(x,y,td)=1 fc(x,y,t)=f(x,y,ta) If s(x,y,ta)=1 and s(x,y,td)=1 fc(x,y,t)像素值用周围区域填充。 其中,fc 表示合成图像,f 表示基本层解码图像,s 表示形状信息,(x,y)表示点空间坐标,t 为当前帧时刻,ta 表示前一帧时刻,td 表示下一帧时刻。s(x,y,ta)称为前向形状, s(x,y,td)称为后向 形状。 5.3.4.2 Sprite 合成 如前所述,静态 sprite 技术可有效编码视频对象,它的内容可能不在视频序列的任何时刻出现, 适合表示场景背景。 ISO/IEC14496-2 语法定义了从静态 sprite 获得 VOP(称 S-VOP)编码方式,即通过由参数控制 处理从静态 sprite 抽取获得。与其它 VOP 合成时,S-VOP 没有空域限制,经常作为背景添加对象。 5.3.4.3 网格对象合成 一个网格对象表示 2D 三角形网格序列的几何形状。这些数据和编码图形纹理通过 ISO/IEC14496-1 定义的合成过程得到纹理映射图像。网格对象流包含在 ISO/IEC14496-1 定义的 BIFS 流中。在实现网格操作的终端中,解码网格数据用来更新 BIFS IndexedFaceSet2D 结点的适当区域。 更新过程如下: (1)从网格对象解码器获得网格结点坐标。 (2)从网格解码器获得网格结点索引。 (3)根据内部编码网格对象平面和范围矩形结点位置,计算纹理映射到网格几何形状纹理坐 标。 (4)得出纹理坐标索引(同结点坐标索引),并对结点适当区域更新。 5.4 MPEG-4 档次和级 这里着重介绍MPEG-4 Visual档次及其相应级。MPEG-4 Visual通过工具、对象和档次的联合提 供其编码函数。工具是一些支持一特定特征(如基本视频编码、编码对象形状等)的编码函数集合。 对象是利用工具编码的视频元素(如矩形帧、静态图像等)。举个例子来说,一个简单视频对象用 针对矩形视频帧序列的工具编码,而一核心视频对象用针对任意形状对象的工具编码等等。档次则 是对象类型的集合,是相应编解码器必须支持的。 MPEG-4 Visual档次中针对自然视频场景编码部分如表5.1所示,其档次范围从针对矩形视频帧 编码的Simple档次到了针对任意形状及扩展对象、工作室级视频编码的档次。表5.2列出了人工合成 视频和混合视频编码档次。 表 5.1 MPEG-4Visual 自然视频档次 档 次 主 要 特 征 Simple 矩形视频帧低复杂度编码 Advanced Simple 较高效率的矩形帧编码,支持隔行扫描视频 Advanced Real-Time Simple 实时流矩形帧编码 Core 任意形状视频对象的核心编码 Main 多特征视频对象的主要编码 Advanced Coding Efficiency 高效的视频对象编码 N-Bit N 比特的视频对象编码 Simple Scalable 矩形帧扩展分级编码 Fine Granular Scalability 高级矩形帧扩展分级编码 Core Scalable 视频对象扩展核心可分级编码 Scalable Texture 静态纹理扩展分级编码 Advanced Scalable Texture 高效的、基于对象的静态纹理扩展编码 Advanced Core 包含 Simple、 Core、 Advanced Scalable Texture 档次所有特征 Simple Studio 基于对象的高质量视频序列编码 Core Studio 基于对象的高压缩率高质量核心视频编码 表 5.2 MPEG-4Visual 合成视频档次 档 次 主 要 特 征 Basic Animated Texture 静态纹理二维编码 Simple Face Animation 动态人脸模型 Simple Face and Body Animation 动态人脸和身体模型 Hybrid 上面三种综合 表 5.3 MPEG-4 Visual 档次和视觉对象类型 表 5.4 Simple 档次级 表 5.3 列出了 MPEG-4 Visual 档次和视觉对象类型。该表显示了每个档次包含的对象类型。例 如,支持 Simple 档次的编解码器必须能编解码 Simple 对象,而支持 Core 档次的编解码器必须能编 解码 Simple 和 Core 对象。 档次是不同制造商编解码器件之间能够交互的重要机制。MPEG-4 Visual 标准定义了多种编码 工具,而并非每个商业编解码器件都要支持所有的工具。相反,设计者通常根据应用情况选择包含 所需工具的档次。例如,基于低性能处理器的基本编解码器可能用 Simple 档次,而流视频应用编解 码器则会选择 ARTS 档次等等。 档次定义了编码工具的集合,级则定义了比特流参数的限制。表 5.4 列出了常用的基于 Simple 档次(Simple、Advanced Simple 及 Advanced Real Time Simple)的级。每个级都给出了能够解码 MPEG-4 编码序列所需要求的最大性能。例如,一个只有有限处理能力和内存的多媒体终端只能支 持 Simple 档次 0 级的比特流解码。级定义限制了缓冲大小、解码帧大小、处理速度(宏块每秒)以 及视频对象数目。终端如能支持这些参数便能解码符合 Simple 档次 0 级的比特流。Simple 档次的更 高级则要求解码器支持 4 个 Simple 档次视频对象,如包括 CIF 或者 QCIF 显示分辨率的 4 个矩形对 象。 参考文献 1 Yao Wang, Jorn Ostermann, Ya-Qin Zhang, Video Processing and Communication, Pearson Education, 2002. 2 Iain E.G.Richardon, H.264 and MPEG-4 Video Compression Video Coding for Next Generation Multimedia, Wiley Press ,2003 3 毕厚杰,多媒体信息的传输与处理, 人民邮电出版社,1999 4 钟玉琢等.《基于对象的多媒体数据压缩编码国际标准——MPEG-4 及其校验模型》.北京:科学出版社,2000 第 6 章 H.264/AVC 编码器原理 6.1 H.264/AVC 的应用 MPEG(Moving Picture Experts Group)和 VCEG(Video Coding Experts Group)已经联合开发 了一个比早期研发的 MPEG 和 H.263 性能更好的视频压缩编码标准,这就是被命名为 AV C(Advanced Video Coding)的,也被称为 ITU-T H.264 建议和 MPEG-4 的第 10 部分的标准,在这里,就简称 它为 H.264/AVC 或 H.264。这个国际标准已于 2003.3 正式被 ITU-T 所通过并在国际上正式颁布。 应该说,H.264 的颁布是视频压缩编码学科发展中的一件大事,它的优异的压缩性能也将在数 字电视广播、视频实时通信、网络视频流媒体传递以及多媒体短信等各个方面发挥重要作用。 数字电视的优越性已是公认的,但它的广泛应用还有赖于高效的压缩技术。例如利用 MPEG-2 压缩的一路高清晰度电视(HDTV),约需 20Mb/s 的带宽,有人作过初步试验,如利用 H.264 进行一 路 HDTV 的压缩,大概只需 5Mb/s 的带宽。众所周知,美国已公布在 2010 年(我国约在 2015 年) 停止模拟电视广播,全部采用数字电视广播,如果那时 HDTV 要获得迅猛发展,必须要降低成本。 以传输费用而言,采用 H.264,可使传输费用降为原来的 1/4,这是一个十分诱人的前景,据了解, 这次 2008 年在我国北京举行的奥运会,也将是一个“科技奥运”,HDTV 必然将呈现在人们的眼前一 个高质量的压缩性能优异的 H.264 视频编码技术和设备的市场前景是可以想象的!现在有的省市(如 南京)已在有线电视信道上开通了数字电视,采用压缩性能优异的 H.264 显得更为迫切! 视频通信是 H.264 又一个重要应用,上世纪 90 年代初以来,会议电视在我国获得了迅速发展, 主要是利用它召开行政会议,其优点是节约大量旅途出差时间,节约出差费用,还争取了时间及时 作出了重大决策,短短几年,全国从中央到省,到地市甚至县,建立了几千个会议电视室,在国民 经济的发展中发挥了重要作用,其不足之处为:(1)不方便:必须到电信局专门的电视会议室才能 参加会议,这对一些领导同志更是十分不便;(2)价格昂贵:当时采用 H.261 作为视频压缩编码标 准,压缩比不高,而且图像质量也不够好,设备价格昂贵,传输费用也昂贵;可视电话是视频通信 的另一个重要应用,人们一直把它作为实现古人的“千里眼、顺风耳”理想的通信工具,可是直到今 天,尚未很好地广泛地被应用,其中一个重要原因是视频质量不理想,这与视频压缩技术有密切关 系。特别是,由于互联网在 90 年代的迅猛发展,人们希望利用 IP 技术传输视频,现在人们已可看 到,在网络流量不大时,人们看到的可视电话质量尚能接受(尽管也不是很好),由于 IP 数据流的 突发性,当流量大时,网络会发生拥塞,这时经常发生丢包、误码,看到图像中带有不少方块,这 样的视频质量是无法让人们接受的,于是对视频编码的要求,不仅仅要高压缩比,而且应在恶劣的 传输条件下(包括移动网络的衰落)具有抗阻塞、抗误码的鲁棒性。 H.264 不仅具有优异的压缩性能,而且具有良好的网络亲和性,这对实时的视频通信是十分重 要的。现在已有基于 DSP 的采用 H.264 编码的可视电话出现在市场上,进一步说明了在视频通信中 H.264 的重要应用价值。 H.264 还有一个重要应用,即网络的流媒体。众所周知,应用流媒体技术的电视点播(VOD) 最近有了迅速发展,韩国的宽带上网的应用中 VOD 占据了第二位。我国宽带上网用户今年已达 1000 万户以上,而且还在继续发展,VOD 的迅速发展也是可以期待的。 多媒体短信息也是 H.264 的重要应用之一,我国的短信市场正方兴未艾,相信多媒体短信也将 有巨大发展。 和 MPEG-4 中的重点是灵活性不同,H.264 着重在压缩的高效率和传输的高可靠性,因而其应 用面十分广泛,具体说来,H.264 支持三个不同档次: 1、 基本档次:主要用于“视频会话”,如会议电视,可视电话,远程医疗、远程教学等; 2、 扩展档次:主要用于网络的视频流,如视频点播; 3、 主要档次:主要用于消费电子应用,如数字电视广播,数字视频存储等。 6.2 H.264/AVC 编解码器 6.2.1 H.264 编解码器特点 H.264 并不明确地规定一个编解码器如何实现,而是规定了一个编了码的视频比特流的句法, 和该比特流的解码方法,各个厂商的编码器和解码器在此框架下应能够互通,在实现上具有较大灵 活性,而且有利于相互竞争。 H.264 编码器和解码器的功能组成分别见图 6.1,6.2。 图 6.1 H.264 编码器 图 6.2 H.264 解码器 从上述二图可见,H.264 和基于以前的标准(如 H.261、H.263、MPEG-1、MPEG-4)中的编解码 器功能块的组成并没有什么区别,主要的不同在于各功能块的细节。由于视频内容时刻在变化,有 时空间细节很多,有时大面积的平坦。这种内容的多变性就必须采用相应的自适应的技术措施;由 于信道在环境恶劣下也是多变的,例如互联网,有时畅通,有时不畅,有时阻塞,又如无线网络, 有时发生严重衰落,有时衰耗很小,这就要求采取相应的自适应方法来对抗这种信道畸变带来的不 良影响。这两方面的多变带来了自适应压缩技术的复杂性。H.264 就是利用实现的复杂性获得压缩 性能的明显改善。由于大规模集成电路技术和工艺的迅猛进步,今天已完全具备了实现的可能性。 在描述多功能块的细节前,我们还是对 H.264 编码器、解码器的主要功能描述如后,以便对编码 器有一个总的了解。 6.2.2 H.264 编码器 编码器采用的仍是变换和预测的混合编码法。 由图 6.1,输入的帧或场 Fn 以宏块为单位被编码器处理。首先,按帧内或帧间预测编码的方法进 行处理。 如果采用帧内预测编码,其预测值 PRED(图中用 P 表示)是由当前片中前面已编码的参考图像 经运动补偿(MC)后得出,其中参考图像用 F’n-1 表示。为了提高预测精度,从而提高压缩比,实 际的参考图像可在过去或未来(指显示次序上)已编码解码重建和滤波的帧中进行选择。 预测值 PRED 和当前块相减后,产生一个残差块 Dn,经块变换、量化后产生一组量化后的变换 系数 X,再经熵编码,与解码所需的一些边信息(如预测模式量化参数、运动矢量等)一起组成一 个压缩后的码流,经 NAL(网络自适应层)供传输和存储用。 正如上述,为了提供进一步预测用的参考图像,编码器必须有重建图像的功能。因此必须使残差 图像经反量化、反变换后得到的 Dn’与预测值 P 相加,得到 uFn’(未经滤波的帧)。为了去除编码解 码环路中产生的噪声,为了提高参考帧的图像质量,从而提高压缩图像性能,设置了一个环路滤波 器,滤波后的输出 Fn’即重建图像可用作参考图像。 6.2.3 H.264 解码器 由图 6.1 可知,由编码器的 NAL 输出一个压缩后的 H.264 压缩比特流。由图 6.2,经熵解码得到 量化后的一组变换系数 X,再经反量化、反变换,得到残差 Dn’。利用从该比特流中解码出的头信 息,解码器就产生一个预测块 PRED,它和编码器中的原始 PRED 是相同的。当该解码器产生的 PRED 与残差 Dn’相加后,就产生 uFu’,再经滤波后,最后就得到滤波后的 Fn’,这个 Fn’就是最后的解码 输出图像。 6.3 H.264/AVC 的结构 6.3.1 名词解释 为了弄清 H.264 编解码器的细节,必须先对以下名词的定义有清楚的理解: 1)场和帧 视频的一场或一帧可用来产生一个编码图像。通常,视频帧可分成两种类型:连续或隔行视频帧。 在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场。显然,这时场内邻行之间的空间相 关性较强,而帧内邻近行空间相关性强,因此活动量较小或静止的图像宜采用帧编码方式,对活动 量较大的运动图像则宜采用场编码方式。 2)宏块、片 一个编码图像通常划分成若干宏块组成,一个宏块由一个 16×16 亮度像素和附加的一个 8×8 Cb 和一个 8×8 Cr 彩色像素块组成。每个图象中,若干宏块被排列成片的形式。 I 片只包含 I 宏块,P 片可包含 P 和 I 宏块,而 B 片可包含 B 和 I 宏块。 I 宏块利用从当前片中已解码的像素作为参考进行帧内预测(不能取其它片中的已解码像素作为 参考进行帧内预测)。 P 宏块利用前面已编码图象作为参考图象进行帧内预测,一个帧内编码的宏块可进一步作宏块的 分割:即 16×16、16×8、8×16 或 8×8 亮度像素块(以及附带的彩色像素);如果选了 8×8 的子宏块, 则可再分成各种子宏块的分割,其尺寸为 8×8、8×4、4×8 或 4×4 亮度像素块(以及附带的彩色像素)。 B 宏块则利用双向的参考图象(当前和未来的已编码图象帧)进行帧内预测。 6.3.2 档次和级 H.264 规定了三种档次,每个档次支持一组特定的编码功能,并支持一类特定的应用。 1)基本档次:利用 I 片和 P 片支持帧内和帧间编码,支持利用基于上下文的自适应的变长编码 进行的熵编码(CAVLC)。主要用于可视电话、会议电视、无线通信等实时视频通信; 2)主要档次:支持隔行视频,采用 B 片的帧间编码和采用加权预测的帧内编码;支持利用基于 上下文的自适应的算术编码(CABAC)。主要用于数字广播电视与数字视频存储; 3)扩展档次:支持码流之间有效的切换(SP 和 SI 片)、改进误码性能(数据分割),但不支持 隔行视频和 CABAC。 图 6.3 为 H.264 各个档次具有的不同功能,可见扩展档次包括了基本档次的所有功能,而不能包 括主要档次的。每一档次设置不同参数(如取样速率、图像尺寸、编码比特率等),得到编解码器性 能不同的级。 图 6.3 H.264 档次 6.3.3 编码数据格式 6.3.3.1 H.264 的视频格式 H.264支持 4:2:0 的连续或隔行视频的编码和解码,缺省的 4:2:0 的取样格式见图 6.4,图 6.5。 6.3.3.2 H.264 的编码格式 制订 H.264 的主要目标有二个: 1)高的视频压缩比,当初提出的指标是比 H.263,MPEG-4,约为它们的 2 倍,现在都已基本实 现; 2)良好的网络亲和性,即可适用于各种传输网络。 为此,H.264 的功能分为两层,即视频编码层(VCL)和网络提取层(NAL,Network Abstraction Layer)。VCL 数据即编码处理的输出,它表示被压缩编码后的视频数据序列。在 VCL 数据传输或存 储之前,这些编码的 VCL 数据,先被映射或封装进 NAL 单元中。 每个 NAL 单元包括一个原始字节序列负荷(RBSP)、一组对应于视频编码数据的 NAL 头信息。 NAL 单元序列的结构见图 6.6 图 6.4 连续视频取样格式 图 6.5 隔行视频取样格式 图 6.6 NAL 单元序列 6.3.4 参数图像 为了提高预测精度,H.264 编码器可从一组前面或后面已编码图像中选出一个或两个与当前最匹 配的图像作为帧间编码间的参数图像,这样一来,复杂度大为增加,但多次比较的结果,使匹配后 的预测精度显著改进。H.264 中最多可从 15 个参数图像中进行选择,选出最佳的匹配图像。 对于 P 片中帧间编码宏块和宏块分割的预测可从表“0”中选择参数图像;对于 B 片中的帧间编码 宏块和宏块分割的预测,可从表“0”和“1”中选择参考图像。 6.3.5 片和片组 现在再详细讨论关于片的结构 6.3.5.1 片 一个视频图像可编码成一个或更多个片,每片包含整数个宏块(MB),即每片至少一个 MB,最 多时每片包含整个图像的宏块。总之,一幅图像中每片的宏块数不一定固定。 设片的目的是为了限制误码的扩散和传输,应使编码片相互间是独立的。某片的预测不能以其它 片中的宏块为参考图像,这样某一片中的预测误差才不会传播到其它片中去。 编码片共有 5 种不同类型,除已讲过的 I 片、P 片、B 片外,还有 SP 片和 SI 片。其中 SP(切换 P)是用于不同编码流之间的切换;它包含 P 和/或 I 宏块。它是扩展档次中必须具有的切换,它包 含了一种特殊类型的编码宏块,叫做 SI 宏块,SI 也是扩展档次中的必备功能。 片的句法结构见图 6.7,其中片头规定了片的类型,该片属于哪个图像,有关的参考图像等,片 的数据包含一系列的编码 MB,和/或跳编码(不编码)数据。每个 MB 包含头单元(见表 6.1)和残 差数据。 图 6.7 片的句法结构 表 6.1 宏块的句法单元 mb_type 确定该 MB 是帧内或帧间(P 或 B)编码模式,确定该 MB 分割的尺寸 mb_pred 确定帧内预测模式(帧内宏块)确定表 0 或表 1 参考图 像,和每一宏块分割的差分编码的运动矢量(帧间宏块,除 8×8 宏块分割的帧内 MB) sub_mb_pred (只对 8×8MB 分割的帧内 MB)确定每一子宏块的子宏 块分割,每一宏块分割的表 0 和/或表 1 的参考图象;每一 宏块子分割的差分编码运动矢量。 coded_block_pattern 指出哪个 8×8 块(亮度和彩色)包含编码变换系数 mb_qp_delta 量化参数的改变值 residual 预测后对应于残差图象取样的编码变换系数 6.3.5.2 片组 片组是一个编码图象中若干 MB 的一个子集,它可包含一个或若干个片。 在一个片组中,每片的 MB 按光栅扫描次序被编码,如果每幅图象仅取一个片组,则该图象中所 有的 MB 均按光栅扫描次序被编码(除非使用 ASO,即任意的片次序,即一个编码帧中的片之后可 跟随任一解码程序的片)。 还有一种片组,叫灵活宏块次序(FMO),它可用灵活的方法,把编码 MB 序列映射到解码图象 中 MB 的分配用 MB 到片组之间的映射来确定,它表示每一个 MB 属于哪个片组。表 6.2 为 MB 到 片组的各种映射类型。 表 6.2 MB 到片组的映射 类型 名称 描述 0 交错 MB 游程被依次分配给每一块组(图 6.8) 1 散乱 每一片组中的 MB 被分散在整个图象中(图 6.9) 2 前景和背景 例见图 6.10 3 Box-out 从帧的中心开始,产生一个箱子,其 MB 属于片组 0, 其它 MB 属于片组(图 6.11) 4 光栅扫描 片组 0 包含按光栅扫描次序从顶-左的所有 MB,其余 MB 属片组 1(图 6.11) 5 手绢 片组 0 包含从顶-左垂直扫描次序的 MB,其余 MB 属 片组 1(图 6.11) 6 显式 每一 Mbslice_group_id,用于指明它的片组(即 MB 映射 完全是用户定义的) 图 6.8 交错型片组 图 6.9 散乱型片组 图 6.10 前景和背景型片组 图 6.11 片组 6.4 帧内预测 在帧内预测模式中,预测块 P 是基于已编码重建块和当前块形成的。对亮度像素而言,P 块用 于 4×4 子块或者 16×16 宏块的相关操作。4×4 亮度子块有 9 种可选预测模式,独立预测每一个 4×4 亮度子块,适用于带有大量细节的图像编码;16×16 亮度块有 4 种预测模式,预测整个 16×16 亮度 块,适用于平坦区域图像编码;色度块也有 4 种预测模式,类似于 16×16 亮度块预测模式。编码器 通常选择使 P 块和编码块之间差异最小的预测模式。 此外,还有一种帧内编码模式称为 I_PCM 编码模式。该模式下,编码器直接传输图像像素值, 而不经过预测和变换。在一些特殊的情况下,特别是图像内容不规则或者量化参数非常低时该模式 比起“常规操作”(帧内预测—变换—量化—熵编码)效率更高。I_PCM 模式用于以下目的: 1) 允许编码器精确的表示像素值 2) 提供表示不规则图像内容的准确值,而不引起重大的数据量增加。 3) 严格限制宏块解码比特数,但不损害编码效率。 在以往 H.263+、MPEG-4 等视频压缩编码标准中,帧内编码被引入变换域。H.264 帧内编码则 参考预测块左方或者上方的已编码块的邻近像素点,被引入空间域。但是,如果参考预测块是帧间 编码宏块,该预测会因参考块的运动补偿引起误码扩散。所以,参考块通常选取帧内编码的邻近块。 如图 6.12 和图 6.13 所示,图 6.12 是采用帧内模式编码的 QCIF 视频帧,其块或者宏块是通过邻 近已编码像素预测而得。图 6.13 给出了根据最佳模式而得的预测亮度 P 帧,该模式使得编码信息量 最小。 图 6.12 QCIF 帧 图 6.13 预测帧(帧内预测) 6.4.1 4×4 亮度预测模式 图 6.14 a)利用像素 A-Q 对方块中 a-p 像素进行帧内 4×4 预测 b)帧内 4×4 预测的 8 个预测方向 如图 6.14 所示,4×4 亮度块的上方和左方像素 A~Q 为已编码和重构像素,用作编解码器中的 预测参考像素。a~p 为待预测像素,利用 A~Q 值和 9 种模式实现。其中模式 2(DC 预测)根据 A~ Q 中已编码像素预测,而其余模式只有在所需预测像素全部提供才能使用。图 6.15 箭头表明了每种 模式预测方向。对模式3~8,预测像素由A~Q加权平均而得。例如,模式4中,p=round(B/4+C/2+D/4)。 表 6.5.1 给出了这 9 种模式的描述。 图 6.15 4×4 亮度块预测模式 表 6.3 预测模式描述 模式 描 述 模式 0(垂直) 由 A、B、C、D 垂直推出相应像素值 模式 1(水平) 由 I、J、K、L 水平推出相应像素值 模式 2(DC) 由 A~D 及 I~L 平均值推出所有像素值 模式 3(下左对角线) 由 450 方向像素内插得出相应像素值 模式 4(下右对角线) 由 450 方向像素内插得出相应像素值 模式 5(右垂直) 由 26.60 方向像素值内插得出相应像素值 模式 6(下水平) 由 26.60 方向像素值内插得出相应像素值 模式 7(左垂直) 由 26.60 方向像素值内插得出相应像素值 模式 8(上水平) 由 26.60 方向像素值内插得出相应像素值 举例:图 6.13 所示的 4×4 块的 9 种预测模式计算产生图 6.16 所示的相应预测块(SAE 定义了 每种预测的预测误差)。该例中,与当前块的最匹配的模型为模式 8,因为该模式 SAE 最小且最接近 于原始 4×4 块。 图 6.16 预测块(亮度 4×4) 6.4.2 16×16 亮度预测模式 宏块的全部 16×16 亮度成分可以整体预测,有 4 种预测模式,如表 6.4 和图 6.17 所示。 图 6.17 16×16 预测模式 表 6.4 16×16 预测模式 模式 描 述 模式 0(垂直) 由上边像素推出相应像素值 模式 1(水平) 由左边像素推出相应像素值 模式 2(DC) 由上边和左边像素平均值推出相应像素值 模式 3(平面) 利用线形“plane”函数及左、上像素推出相应像素值,适用于亮度变化平缓区域 举例:图 6.18 给出了一个左上方像素已编码的亮度宏块。图 6.19 给出了 4 种预测模式预测结果。其 中模式 3 最匹配原始宏块。帧内 16×16 模式适用于图像平坦区域预测。 图 6.18 16×16 宏块 图 6.19 帧内 16×16 预测块 6.4.3 8×8 色度块预测模式 每个帧内编码宏块的 8×8 色度成分由已编码左上方色度像素预测而得,两种色度成分常用同一 种预测模式。4 种预测模式类似于帧内 16×16 预测的 4 种预测模式,只是模式编号不同。其中 DC(模 式 0)、水平(模式 1)、垂直(模式 2)、平面(模式 3)。 6.4.4 信号化帧内预测模式 每个 4×4 块帧内预测模式必须转变成信号传给解码器。该信息可能需大量比特表示,但邻近块 的帧内模式通常是相关的。例如,A、B、E 分别为左边、上边和当前块,如果 A 和 B 预测模式为模 式 1,E 的最佳预测模式很可能也为模式 1。所以通常利用这种关联性信号化 4×4 帧内模式。 对每个当前块 E,编码器和解码器计算最可能预测模式和 A、B 预测模式的较小者。如果这些 相邻块不被提供(当前片外或者非帧内 4×4 模式),相应值 A 或 B 置 2(DC 预测模式)。 编码器分配每个 4×4 块一个标志 prev_intra4×4_pred_mode。该标志置 1 时,使用最可能预测模 式;置 0 时,使用参数 rem_intra4×4_pred_mode 来指明模式变化。rem_intra4×4_pred_mode 小于当前 最可能模式时,预测模式选 rem_intra4×4_pred_mode。否则预测模式为 rem_intra4×4_pred_mode+1。 rem_intra4×4_pred_mode 值为 0~7。 举例:块 A 和 B 分别用模式 3 和模式 1 预测。最可能模式则为 1,prev_intra4×4_pred_mode 置 0,rem_intra4×4_pred_mode 被传送。取决于 rem_intra4×4_pred_mode 的值,表 6.5 所示的 8 种预测 模式中的一种被选定。 表 6.5 预测模式选择(最可能模式为 1) 帧内 16×16 亮度和色度预测模式在宏块头中指明。 这里需说明的是,包括帧内预测的所有预测都不能跨片边界预测,每片必须独立编解码。 可见,帧内预测以绝对误差和(SAE)为标准选取最佳预测模式,使预测帧更加接近原始帧, 减少了相互间的差异,去除时间上的数据冗余,提高了编码的压缩效率。帧内预测中,块或宏块利 用已编码并重建的块作为参考,进行预测。具体编程时,编码器通过计算并比较各种模式下的 SAE, 选取 SAE 值最小的模式作为最佳预测模式,并将该模式信息化,同时传送至解码端,以供正确解码。 其具体操作可见第八章相关部分。 6.5 帧间预测 H.264 帧间预测是利用已编码视频帧/场和基于块的运动补偿的预测模式。与以往标准帧间预测 的区别在于块尺寸范围更广(从 16×16 到 4×4)、亚像素运动矢量的使用(亮度采用 1/4 像素精度 MV)及多参考帧的运用等等。 下文将重点讨论基本(Baseline)档次支持的 P 片帧间预测工具及主要(Main)和扩展(Extended) 档次支持的 B 片和加权预测等帧间预测工具。SP/SI 的内容将在后面的章节中有详细的阐述。 6.5.1 树状结构运动补偿 每个宏块(16×16 像素)可以 4 种方式分割:一个 16×16,两个 16×8,两个 8×16,四个 8×8。 其运动补偿也相应有四种。而 8×8 模式的每个子宏块还可以四种方式分割:一个 8×8,两个 4×8 或 两个 8×4 及 4 个 4×4。这些分割和子宏块大大提高了各宏块之间的关联性。这种分割下的运动补偿 则称为树状结构运动补偿。 图 6.20 宏块及子宏块分割 每个分割或子宏块都有一个独立的运动补偿。每个 MV 必须被编码、传输,分割的选择也需编 码到压缩比特流中。对大的分割尺寸而言,MV 选择和分割类型只需少量的比特,但运动补偿残差 在多细节区域能量将非常高。小尺寸分割运动补偿残差能量低,但需要较多的比特表征 MV 和分割 选择。分割尺寸的选择影响了压缩性能。整体而言,大的分割尺寸适合平坦区域,而小尺寸适合多 细节区域。 宏块的色度成分(Cr 和 Cb)则为相应亮度的一半(水平和垂直各一半)。色度块采用和亮度块 同样的分割模式,只是尺寸减半(水平和垂直方向都减半)。例如,8×16 的亮度块相应色度块尺寸 为 4×8,8×4 亮度块相应色度块尺寸为 4×2 等等。色度块的 MV 也是通过相应亮度 MV 水平和垂直 分量减半而得。 举例:图 6.21 显示了一个残差帧(没有进行运动补偿)。H.264 编码器为帧的每个部分选择了最 佳分割尺寸,使传输信息量最小,并将选择的分割加到残差帧上。在帧变化小的区域(残差显示灰 色),选择 16×16 分割;多运动区域(残差显示黑色或白色),选择更有效的小的尺寸。 图 6.21 残差帧 6.5.2 运动矢量 帧间编码宏块的每个分割或者子宏块都是从参考图像某一相同尺寸区域预测而得。两者之间的 差异(MV)对亮度成分采用 1/4 像素精度,色度 1/8 像素精度。亚像素位置的亮度和色度像素并不 存在于参考图像中,需利用邻近已编码点进行内插而得。图 6.6.3 中,当前帧的 4×4 块通过邻近参考 图像相应区域预测。如果 MV 的垂直和水平分量为整数,参考块相应像素实际存在(灰色点)。如果 其中一个或两个为分数,预测像素(灰色点)通过参考帧中相应像素(白色点)内插获得。 图 6.22 亮度半像素位置内插 内插像素生成: 首先生成参考图像亮度成分半像素像素。半像素点(如 b,h,m)通过对相应整像素点进行 6 抽头 滤波得出,权重为(1/32 ,-5/32 ,5/8, 5/8, -5/32, 1/32)。b 计算如下: (6.1) 类似的,h 由 A、C、G、M、R、T 滤波得出。一旦邻近(垂直或水平方向)整像素点的所有像 素都计算出,剩余的半像素点便可以通过对 6 个垂直或水平方向的半像素点滤波而得。例如,j 由 cc, dd, h,m,ee,ff 滤波得出。这里说明的是,6 抽头滤器比较复杂,但可明显改善运动补偿性能。 图 6.23 亮度 1/4 像素内插 半像素点计算出来以后,1/4 像素点就可通过线性内插得出,如图 6.23 所示。1/4 像素点(如 a, c, i, k, d, f, n, q)由邻近像素内插而得,如 (6.2) 剩余 1/4 像素点(p, r)由一对对角半像素点线性内插得出。如,e 由 b 和 h 获得。 相应地,色度像素需要 1/8 精度地 MV,也同样通过整像素地线性内插得出,如图 6.24 所示。 图 6.24 色度 1/8 像素内插 其中, (6.3) 当 dx=2,dy=3 时, (6.4) 6.5.3 MV 预测 每个分割 MV 的编码需要相当数目的比特,特别是使用小分割尺寸时。为减少传输比特数,可 利用邻近分割的 MV 较强的相关性,MV 可由邻近已编码分割的 MV 预测而得。预测矢量 MVp 基 于已计算 MV 和 MVD(预测与当前的差异)并被编码和传送。MVp 则取决于运动补偿尺寸和邻近 MV 的有无。 E为当前宏块或宏块分割子宏块。A、B、C 分别为 E 的左、上、右上方的三个相对应块。如果 E 的左边不止一个分割,取其中最上的一个为 A;上方不止一个分割时,取最左边一个为 B。图 6.25 显示所有分割有相同尺寸时的邻近分割选择。图 6.26 给出了不同尺寸时临近分割的选择。 图 6.25 当前和邻近分割(相同尺寸) 图 6.26 当前和邻近分割(不同尺寸) 其中: 1) 传输分割不包括 16×8 和 8×16 时,MVp 为 A、B、C 分割 MV 的中值; 2) 16×8 分割,上面部分 MVp 由 B 预测,下面部分 MVp 由 A 预测; 3) 8×16 分割,左面部分 MVp 由 A 预测,右面部分 MVp 由 C 预测; 4) 跳跃宏块(skipped MB),同 1)。 如果图 6.26 所示的已传送块不提供时(如在当前片外),MVp 选择需重新调整。在解码端,MVp 以相同方式形成并加到 MVD 上。对跳跃宏块,不存在 MVD,运动补偿宏块也由 MV 直接生成。 6.5.4 B 片预测 B 片中的帧间编码宏块的每个子块都是由一个或两个参考图像预测而得。该参考图像在当前图 像的前面或者后面。参考图像存储于编解码器中,其选择有多种方式。图 6.27 显示了三种方式:一 个前向和一个后向的(类似于 MPEG 的 B 图像预测);两个前向;两个后向。 图 6.27 分割预测举例 (1)参考图像 B 片用到了两个已编码图像列表:list0 和 list1,包括短期和长期图像两种。这两个列表都可包 含前向和后向的已编码图像(按显示顺序排列)。其中, List0:最近前向图像(基于 POC)标为 index0,接着是其余前向图像(POC 递增顺序),及后 向图像(从当前图像 POC 递增顺序)。 List1:最近后向图像标为 index0,接着是其余后向图像(POC 递增顺序),及前向图像(从当前 图像 POC 递增顺序)。 举例:一个 H.264 解码器存储了 6 幅短期参考图像。其 POC 分别为:123,125,126,128,129 和 130。当前图像为 127。所有 6 幅短期参考图像在 list0 和 list1 中都标为“用作参考”,如表 6.6 所示。 表 6.6 短期缓冲索引 选择的缓冲索引作为 Exp-Golomb codeword 发送。最有效的参考索引(codeword 最小)便是 index0(例如:前向编码图像在 list0 中,后向编码图像在 list1 中)。 (2) 预测模式选择 B片的预测方式包括:宏块分割方式、双向选择方式、参考列表选择方式等等。具体说,B 片 中宏块分割可由多种预测方式中的一种实现,如直接模式、利用 list0 的运动补偿模式、利用 list1 的 运动补偿模式或者利用 list0 和 list1 的双向运动补偿模式。每个分割可选择各自的不同的预测模式(如 表 6.7 所示)。如果 8×8 分割被使用,每个 8×8 分割所选则的模式适用于分割中的所有亚分割。图 6.28 给出了例子,左边的两个 16×8 分割分别使用 List0 和双向预测模式,而右边的 4 个 8×8 分割分别采 用直接、list0、list1 和双向预测四种模式。 表 6.7 B 片宏块预测选则 分割 选 择 16×16 直接、list0、list1、双向 16×8/8×16 list0、list1、双向(每个分割独立选择) 8×8 直接、list0、list1、双向(每个分割独立选择) 图 6.28 B 片中分割预测模式举例 (3) 双向预测 双向预测中,参考块(与当前分割或亚分割同尺寸)是由 list0 和 list1 的参考图像推出的。从 list0 和 list1 分别得出两个运动补偿参考区域(需要两个 MV),而预测块的像素取 list0 和 list1 相应像素 的平均值。当不用加权预测时,用下列等式: (6.5) 其中,pred0(i,j)和 pred1(i,j)为由 list0 和 list1 参考帧推出的预测像素,pred(i,j)为双向预测像素。 计算出每个预测像素后,运动补偿残差通过当前宏块像素减 pred(i,j)而得。 举例:一宏块用 B_Bi_16×16 模式预测。图 6.29 和图 6.30 分别给出了基于 list0 和 list1 参考图像的运 动补偿参考区域。图 6.31 给出了根据者两个参考区域的双向预测。 图 6.29 参考区域(list0) 图 6.30 参考区域(list1) 图 6.31 双向预测(无加权) 双向预测宏块或块中的 list0 和 list1 矢量根据邻近相同方向的 MV 预测而得。 (4) 直接预测 直接预测模式编码的 B 片宏块或宏块分割不传送 MV。相反,解码器计算基于已编码 MV 的 list0 和 list1MV 并计算出解码残差像素的双向预测运动补偿。B 片中的 skipped 宏块便由解码器用直接模 式重建而得。 片头会指明将用时间还是空间方式计算直接模式或其分割的矢量。 在空间模式中,list0 和 list1 预测矢量计算如下: 如果第一幅 list1 参考图像的 co-located MB 或分割有一个 MV 幅度上小于±1/2 亮度像素,其一 个或两个预测矢量置为 0;否则预测 list0 和 list1 矢量用以计算双向运动补偿。 在时间模式中,计算步骤如下: 1) 找出 list1 图像 co-located MB 或分割相应的 list0 参考图像。该 list0 参考作为当前 MB 或分 割的 list0 参考; 2) 找出 list1 图像 co-located MB 或分割相应的 list0MV; 3) 计算当前图像和 list1 图像的 POC 的 MV,作为新的 list1 MV1; 4) 计算当前图像和 list0 图像的 POC 的 MV,作为新的 list0 MV0。 这些模式在预测参考宏块或分割不提供或帧内编码等情况下需作出调整。 举例:当前宏块 list1 参考在当前帧两幅图像后出现,如图 6.32 所示。List1 参考 co-located MB 有一 MV(+2.5,+5),指 向 list0 参考图像(出现于当前图像 3 幅图像前)。解码器分别计算指向 list1 和 list0 的 MV1(-1,-2)和 MV0(+1.5,+3)。 图 6.32 时间直接运动矢量举例 6.5.5 加权预测 加权预测是一种用来修正 P 或 B 片中运动补偿预测像素方法。H.264 中由 3 中加权预测 类型: 1) P 片宏块“explicit”加权预测; 2) B 片宏块“explicit”加权预测; 3) B 片宏块“implicit”加权预测; 每个预测像素 pred0(i,j)和 pred1(i,j)在运动补偿之前通过加权系数 ω0 和 ω1 修正。在 “explicit”类型中,加权系数由编码器决定并在片头中传输。在“implicit”类型中,系数 ω0 和 ω1 由相 应 list0 和 list1 参考图像的时间位置推出。大的系数用于时间上接近当前图像的情况,小的则用于时 间上远离当前图像的情况。 可见,H.264 采用树状结构的运动补偿技术,提高了预测能力。特别是,小块预测提高了模型 处理更好的运动能够描述的能力,产生更好的图像质量。H.264 运动向量的精度提高到 1/4 像素(亮 度),运动补偿算法的预测能力得到进一步提高。H.264 还提供多参考帧可选模式,,这将产生更好 的视频质量和效率更高的视频编码。相对于 1 帧参考,5 个参考帧可以节约 5%~10%的比特率,且 有助于比特流的恢复。当然,并不是说参考帧越多越好,经实验,考虑到缓冲区的能力和编码器的 效率,目前一般都选取 3~5 个参考帧。 6.6 H.264 的 SP/SI 帧技术(SP 片或 SI 宏块的 P 宏块) 当前视频编码标准主要包括三种的帧类型:I 帧、P 帧和 B 帧。随着 H.264/AVC 为了顺应视频 流的带宽自适应性和抗误码性能的要求,又定义了两种新的帧类型:SP 帧和 SI 帧。 SP 帧编码的基本原理同 P 帧类似,仍是基于帧间预测的运动补偿预测编码,两者之间的差异在 于 SP 帧能够参照不同参考帧重构出相同的图像帧。充分利用这一特性,SP 帧可取代了 I 帧,广泛 应用于流间切换(bitstream switching)、拼接(splicing)、随机接入(random access)、快进快退(fast forward, fast backward)以及错误恢复(error recovery)等应用中,同时大大降低了码率的开销。与 SP 帧相对应,SI 帧则是基于帧内预测编码技术,其重构图像和对 SP 的重构图像完全相同。 SP 帧的编码效率尽管略低于 P 帧,但却远远高于 I 帧,大大改善了 H.264 的网络亲和性,支持 灵活的流媒体服务应用,具有很强的抗误码性能,适应在噪声干扰大、丢包率高的无线信道中传输。 6.6.1 SP/SI 帧的应用 视频流传输已经成为了“尽力而为”的因特网和无线网络的基本应用,而网络传输条件是时变的。 正是为了满足视频流切换的需求,H.264 提出了 SP/SI 帧技术,从而解决视频流应用中终端用户可用 带宽不断变化、不同内容节目拼接时数据量的激增、快进快退以及错误恢复等问题。 z 流间切换 视频服务器应该可以根据网络条件,调整编码码率,实现带宽的自适应性。这涉及会话业务和 流业务两种应用场合。其中会话业务的特点是实时编解码、点对点传输,一般根据解码端的反馈信 息,调整码率或帧率;而流业务的特点是非实时编解码,这往往采用预先编码出不同质量和带宽要 求的视频码流。 下面主要以流业务的应用为例,众所周知,实现带宽自适应的最好方法是设置多组不同的信源 编码参数对同一视频序列分别进行压缩,从而生成适应不同质量和带宽要求的多组相互独立的码流。 这样,视频服务器只需在不同的码流间切换,以适应网络有效带宽的不断变化。 设{P1,n-1,P1,n,P1,n+1}和{P2,n-1,P2,n,P2,n+1} 分别是同一视频序列采用了不同的信源编码参数编 码所得到的两个视频流。由于编码参数不同,两个码流中同一时刻的帧,如 P1,n-1 和 P2,n-1,并不完全 一样。假设服务器首先发送视频流 P1,到时刻 n 再发送视频流 P12,则解码端接收到的视频流为{P1,n-2, P1,n-1,P2,n,P2,n+1,P2,n+2}。在这种情况下,由于接收的 P2,n 应使用的参考帧应该是 P2,n-1 而不是 P1,n-1,所以 P2,n 帧就不能完全正确地解码。在以往的视频压缩标准中,实现码流间的切换功能时, 确保完全正确解码的前提条件是切换帧不得使用当前帧之前的帧信息,即只使用 I 帧。在实际的流 业务码流切换中,往往通过周期性地放置 I 帧确实能实现流间切换等功能,但 I 帧的插入势必造成视 频流数据量增大,增加传输带宽的要求。 从 SP 帧的特性可知,使用不同的参考帧作预测,也可以得到完全相同的解码帧。这一特点正好 适用于流间切换。如图 6.33 所示中,视频流明确的切换点处放置主 SP 帧( Primary SP-frames)—S1,n 帧和 S2,n 帧。在不同编码参数的视频流间进行切换时,发送与主 SP 帧相对应的辅 SP 帧(Secondary SP-frames)—S12,n。当然信源编码部分根据需要插入 SP/SI 帧,也适当增加了编码的复杂度。 图 6.33 SP 帧进行流间切换 z 拼接(Splicing)与随机接入(Random Access) 上述流间切换的例讨论了同一图像序列、不同编码参数压缩编码的流间切换。然而,实际的流 间切换的应用并不单单如此。例如,关注同一事件而处于不同视角的多台摄像机的输出码流间的切 换和电视节目中插入广告等,这就涉及到拼接不同图像序列生成码流的问题。如图 6.34 所示,由于 各个码流来自于不同的信源,帧间缺乏相关性,切换点处的辅帧如果仍采用帧间预测的辅 SP 帧,编 码效率就不会那么有效,而应采用空间预测的 SI 帧——SI2,n 帧。 PP主SP PP 辅帧 PP主SP PP P2,n-2 P2,n-1 S2,n P2,n+1 P2,n+2 P1,n-2 P1,n-1 S1,n P1,n+1 P1,n+2 SI2,n 图 6.34 SI 帧进行拼接和随机接入 综上所述,SP 帧与 SI 帧均可用于流间切换。当视频流的内容相同,编码参数不同采用 SP 帧; 而当视频流的内容相差很大时,则采用 SI 帧将更加有效。 z 错误恢复 采用不同的参考帧预测,可以获得同一帧的多个 SP 帧,利用这种特性可以增强错误恢复的能力。 例如,如图 6.35 所示,正在进行视频流传输的比特流中的一个帧 P1,n-1 无法正确解码,得到用户端反 馈的错误报告后,服务器就可以发送其后最邻近主 SP 帧的一个辅 SP 帧—S12,n,以避免错误影响更 多后续帧,S12,n 帧的参考帧是已经正确解码的帧。当然,用户端也可以使用辅 SI 帧—SI1,n 来实现相 同的功能。 图 6.35 SP 帧进行错误恢复 6.6.2 SP/SI 帧的基本原理 从上述的应用可知,SP 帧分为主 SP 帧(Primary SP-Frame)和辅 SP 帧(Secondary SP-Frame)。 其中,前者的参考帧和当前编码帧属于同一个码流,而后者则不属于同一个码流。与此同时,如图 6.36 所示,主 SP 帧作为切换插入点,不切换时,码流进行正常的编码传输;而切换时,辅 SP 帧取 代主 SP 帧进行传输。其中,△:编码器的输入;〇:解码器的输出。 图 6.36 流间切换中 SP 帧编码顺序图 下面描述 SP 帧实现的功能原理。SI 帧的功能实现与 SP 帧相类似,都能恢复出相同的解码图像 帧,只是前者利用的是帧间预测,而后者利用的则是帧内预测。 z 主 SP 帧的编码过程 主 SP 帧的编码过程如图 6.37 所示。从结构上看,与传统 P 帧编码不同之处在于:变换处理提 到了求差值,即前者的预测残差是变换系数的差值。改进的目的是在于使得主辅两种 SP 帧的编码器 能相结合。主 SP 帧的编码的具体过程如下:预测预测块 P(x,y)是利用原始图像和已重建帧进行运动 补偿预测得到的。对预测块 P(x,y)和原始图像中相对应的块分别进行正向变换,然后用量化参数 SPQP 对预测块 P(x,y)的变换系数进行量化和反量化,得到系数 dpred。从原始图像中相对应的变换系数中减 去 dpred 就得到预测残差 cerr,然后将 cerr 用量化参数 PQP 进行量化,其结果 lerr 和运动矢量一起传送 到多路复用器。 在这个编码器中,用于对 crec 也就是对预测重构块系数进行量化的量化参数 SPQP 与对预测残差 系数 cerr 进行量化的量化参数 PQP 没有必要相同。因此可对预测块系数采用不同于对预测残差系数 采用的、引入更小失真的量化参数,以使产生的重建误差更小。 反量化 量化 变换 运动补偿 预测 帧存储 反量化和 反变换 量化 反量化 量化 多 路 复 用 变换原始图像 corig cerr - PQP derr cpred crec rec P(x,y) predSPQP 运动信息 SPQP err dpred 图 6.37 SP 帧的编码原理图 以主 SP 帧 A2 的编码过程为例,如图 6.38 所示。与 P 帧编码过程相比,主 SP 帧的编解码过程 有所不同。视频序列中帧 A2 和帧 A1 ’(帧 A2 参考帧 A1 的重建图像)分别经过变换处理,得到的变 换系数计算出变换系数差值,再进行量化和熵编码,最终得到主 SP 帧的编码。 变换 变换运动补偿 预测 + 量化 熵编码帧A2 帧A1' + - 主SP帧 A2 图 6.38 主 SP 帧 A2 的编码过程示意图 z 主 SP 帧的解码 图 6.39 描述了主 SP 帧的解码原理图。获得预测块 P(x,y),后进行正变换,变换后得到的系数记 为 cpred,将编码端输出的已经量化的预测残差系数 lerr 采用量化参数 PQP 进行反量化,得到的系数 记为 derr。derr 与 cpred 的和记为 crec,重建系数 crec 采用量化参数 SPQP 进行量化和反量化,并对反量 化后获得的 drec 进行反变换和滤波即得重建图像。 图 6.39 主 SP 帧解码原理图 以主 SP 帧 A2 的解码过程为例,如图 6.40 所示。主 SP 帧 A2 经过熵解码和反量化,和(帧 A2 参考帧 A1 的重建图像)分别经过运动补偿预测和变换处理的结果相加,得到重建图像的变换系数值, 再进行反变换,最终得到主 SP 帧的重构图像帧 A2 ’。 反量化 变换运动补偿 预测 + 反变换主SP帧 A2 帧A1' + 帧 A2'熵解码 + 图 6.40 主 SP 帧 A2 的解码过程示意图 z 辅 SP/SI 帧编码过程 设以 P1(x.y)作为预测帧时,主 SP 帧的重建图像为 Ic(x,y),Ic(x,y)由重建系数 lrec 做反量化和反变 换得到。假设另一预测帧为 P2(x,y),若要得到与主 SP 帧具有相同重建图像 Ic(x,y)的辅 SP 帧,所要 做的就是找到新的预测残差系数 lrec,2,使得利用 P2(x,y)而不是 P1(x,y)也能准确地重建图像 Ic(x,y)。对 P2(x,y)进行变换并量化,量化后的系数记为 lpred,2,则 辅 SP 帧的预测残差系数 lerr,2 可按下式计算得到 lerr,2=lrec-lpred,2 然后把计算所得的预测残差系数 lerr,2 进行无损的熵编码。解码端生成 P2(x,y)后,对 P2(x,y)进行 变换和量化,得到 lpred,2,其值与编码器端的值相同。lpred,2 与接收到的预测残差系数 lerr,2 相加,所得 和为 lrec,对 lrec 进行反量化和反变换,就可得到了重建图像 Ic(x,y),其与以 P1(x,y)作为预测帧得主 SP 帧所重建得图像完全相同。辅 SP 帧的编码过程也如图 6.37 所示。 以辅 SP 帧 AB2 的编码过程为例,如图 6.41 所示。 量化 量化运动补偿 预测 + 熵编码帧B2 帧A1' + - 辅SP帧 AB2变换 变换 图 6.41 辅 SP 帧 AB2 的编码过程示意图 z 辅 SP/SI 帧的解码 图 6.42 是辅 SP/SI 帧的解码原理图。首先获得预测块 P(x,y),对于 SP 帧,P(x,y)是利用编码端 输出的运动矢量和参考帧号等信息经过运动补偿预测得到。对于 SI 帧,P(x,y)则是利用编码端输出 的帧内预测模式信息通过空间预测得到。然后,对 P(x,y)进行正向变换,并将获得的变换系数量化, 记为 lpred。lpred 和量化后的预测残差系数 lerr 相加得到已经量化的重建系数 lrec,lrec 量化得到 drec,drec 反变换并加以滤波即得重建图像。 + 反量化 去 复 用 量化 lerr 反变换 帧存储 运动补偿预测 变换 SPQP drec 运动信息 P(x,y) dprec 帧内预测 lpred lrec 重构图像 帧内预测模式 SPQP 辅SP帧 SI帧 图 6.42 辅 SP/SI 帧的解码原理图 以辅 SP 帧 AB2 的编码过程为例,如图 6.43 所示。 量化运动补偿 预测 + 反变换辅SP帧 AB2 帧A1' + 帧 B2'熵解码 变换 + 反量化 图 6.43 辅 SP 帧 AB2 的解码过程示意图 6.6.3 实验结果和性能分析 在 TML8.7 参考测试模型基础上,采用 5 个参考帧的 UVLC 模式,并选用率失真优化选项。仿 真选用的 JVT 测试序列,帧率为 10 帧/秒。针对 SP 帧的编码效率和序列周期性插入 SP 帧的编码效 率分别进行了测试,实验结果参考了文献 1。 z SP 帧的编码效率 图 6.44 给出了 SP 帧、I 帧和 P 帧编码效率的比较。序列的起始帧均按 I 帧编码处理,其余帧分 别按 SP 帧、I 帧和 P 帧进行编码。图中 SP 帧编码又给出了三种不同的 SPQP 值:SPQP=PQP、SPQP=3、 SPQP=PQP-6。可以看出,SP 帧的编码效率低于 P 帧,当要远远高于 I 帧。选择恰当的 SPQP 值, 可以改善 SP 帧的编码效率。其中,SPQP 的值相对于 PQP 的下降,SP 帧的编码效率逐渐提高。当 SPQP=3 时,SP 帧的编码效率非常接近 P 帧的编码效率。 图 6.44 SP 帧、I 帧、P 帧编码效率的比较 z 序列周期性插入 SP 帧的编码性能 如上所述,在流间切换或随机接入等应用中,往往需要在序列中周期性地插入 SP 帧或 I 帧。设 定序列的起始帧为 I 帧,每隔一个固定周期为 1s 插入一个 SP 帧或 I 帧,其余帧则仍采用 P 帧。当 然只是周期性插入 SP 帧和 I 帧,还不能实现上述功能,当可以给出序列插入 I 帧和 SP 帧后编码性 能地的比较。由图 6.45 中可以看出,在实现同样功能的情况下,SP 帧的编码效率比 I 帧高得多,而 通过降低 SPQP 值,SP 帧的编码效率将获得进一步改善,逐步逼近 P 帧的编码效率。 图 6.45 序列周期性插入 SP 帧、I 帧的比较 6.7 整数变换与量化 为了进一步节省图像传输码率,需要对图像信号进行压缩,一般方法为去除图像信号中的相关 性及减小图像编码的动态范围,通常采用变换编码及量化。变换编码将图像时域信号变换成频域信 号,在频域中图像信号能量大部分集中在低频区域,相对时域信号,码率有较大的下降。H.264 对 图像或预测残差采用了 4×4 整数离散余弦变换技术,避免了以往标准中使用的通用 8×8 离散余弦变 换逆变换经常出现的失配问题。量化过程根据图像的动态范围大小确定量化参数,既保留图像必要 的细节,又减少码流。 在图像编码中,变换编码和量化从原理上讲是两个独立的过程。但在 H.264 中,将两个过程中 的乘法合二为一,并进一步采用整数运算,减少编解码的运算量,提高图像压缩的实时性,这些措 施对峰值信噪比(PSNR)的影响很小,一般低于 0.02dB,可不计。H.264 中整数变换及量化具体过 程如图 6.46 所示。其中,如果输入块是色度块或帧内 16×16 预测模式的亮度块,则将宏块中各 4×4 块的整数余弦变换的直流分量组合起来再进行 Hadamard 变换,进一步压缩码率。图 6.47 所示的变 换量化过程可以用图 6.46 的流程图表示。 图 6.46 编码器中变换编码及量化过程 本节将介绍图 6.46 和图 6.47 中各部分流程。 图 6.47 编码变换及量化过程流程图 6.7.1 整数变换 一维 N 点离散余弦余弦变换(DCT)可以表示为: 输入 4×4 的图像或残差块 X 对 X 块进行 4×4 整数离散余弦变换,得到 W 块 是色度块或帧内 16×16 预测模式的亮度块? 是 对 W 中的直流分量进行 Hadamard 变换,得到 YD 块 对 W 块进行比例缩放及量化 对 YD 块进行比例缩放及量化 否 输出 4×4 整数离 散余弦变换 输入图像块 X 比例缩放及量化 直流 Hadamard 变换 比例缩放及量化 色度或帧内 16×16 亮度块 编码输出 Z ∑ − = += 1 0 2 )12(cos N n nkk N knxCy π (6.6) 其中,xn 是输入时域序列中第 n 项,yk 是输出频域序列中第 k 项,系数 Ck 定义如下: ⎪ ⎪ ⎩ ⎪⎪ ⎨ ⎧ −= = = 1,,2,12 01 NkN kNCk (6.7) 每个 DCT 系数 yk 确定信号 xn 在相应频率点上的贡献。最低的系数(即 k=0)为 DC 系数,代 表信号的平均值,也称为直流分量。其它系数称为 AC 系数,与递增的较高频率相联系。 一维 N 点离散余弦逆变换(IDCT)可以表示为: ∑ − = += 1 0 2 )12(cos N k kkn N knyCx π (6.8) 二维 N×N 图像块的 DCT 可以理解为先对图像块的每行进行一维 DCT,然后对经行变换的块的 每列再应用一维 DCT。可以表示为: ∑∑ − = − = ++= 1 0 1 0 2 )12(cos2 )12(cos N j ij N i nmmn N mi N njXCCY ππ (6.9) ∑∑ − = − = ++= 1 0 1 0 2 )12(cos2 )12(cos N j mnnm N i ij N mi N njYCCX ππ (6.10) 其中,Xij 是图像块 X 中第 i 行第 j 列图像或残差值,Ymn 是变换结果矩阵 Y 相应频率点上的 DCT 系 数。可以用矩阵表示: Y = AXAT (6.11) X = ATYA (6.12) 其中 N×N 变换矩阵 A 中的系数: N ijCA iij 2 )12(cos π+= (6.13) H.264 对 4×4 的图像块(亮度块或 Cr、Cb 色度块)进行操作,则相应的 4×4DCT 变换矩阵 A 为: ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −− −− −− = ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ = )8 3cos(2 1)8cos(2 1)8cos(2 1)8 3cos(2 1 2 1 2 1 2 1 2 1 )8 1cos(2 1)8 3cos(2 1)8 3cos(2 1)8cos(2 1 2 1 2 1 2 1 2 1 )8 21cos(2 1)8 15cos(2 1)8 9cos(2 1)8 3cos(2 1 )8 14cos(2 1)8 10cos(2 1)8 6cos(2 1)8 2cos(2 1 )8 7cos(2 1)8 5cos(2 1)8 3cos(2 1)8cos(2 1 )0cos(2 1)0cos(2 1)0cos(2 1)0cos(2 1 ππππ ππππ ππππ ππππ ππππ A (6.14) 设 2 1=a , )8cos(2 1 π=b 及 )8 3cos(2 1 π=c ,则: ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −− −− −= cbbc aaaa bccb aaaa A (6.15) A 中的 a、b 和 c 是实数,而图像块 X 中的元素是整数。对实数的 DCT,由于在解码端的浮点 运算精度问题,会造成解码后的数据的失配,进而引起漂移。H.264 较其它图像编码使用了更多的 预测过程,甚至内部编码模式也依赖于空间预测。因此,H.264 对预测漂移是十分敏感的。为此, H.264 对 4×4DCT 中的 A 进行了改造,采用整数 DCT 技术,有效地减少计算量,同时不损失图像 准确度。式(6.11)可以等效为: ⎥⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢⎢ ⎢ ⎢ ⎢ ⎣ ⎡ ⊗ ⎟⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜ ⎜ ⎜ ⎝ ⎛ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −− −− −− ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −− −− −−= ⊗= 22 22 22 22 T 111 111 111 111 11 1111 11 1111 )( babbab abaaba babbab abaaba d d d d dd dd X ECXCY (6.16) 其中,d=c/b(≈0.414)。符号“⊗”表示(CXCT)结果中的每个元素乘以矩阵 E 中对应位置上的系数 值的运算。为了简化计算,取 d 为 0.5。同时又要保持变换的正交性,对 b 进行修正,取 5 2=b 。 对矩阵 C 中的第 2 行和第 4 行,以及矩阵 CT 中的第 2 列和第 4 列元素乘以 2,相应地改造矩阵 E 为 Ef,以保持式(6.16)成立,得到: ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ ⊗ ⎟⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜ ⎜ ⎜ ⎝ ⎛ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −− −− −− ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −− −− −−= ⊗= 4242 22 4242 22 1121 2111 2111 1121 1221 1111 2112 1111 )( 22 22 22 22 T babbab abaaba babbab abaaba fff X EXCCY (6.17) 其中,运算“⊗”对每个矩阵元素只进行一次乘法,同时它将被归纳到量化运算中。这样,(CfXCf T) 中只剩下整数的加法、减法和移位(乘以 2)运算。被称为整数 DCT 的式(6.17)与通常 DCT 运算结 果近似,但因为 b 和 d 的值有所变化,所以两者结果有差别。例如:输入图像或残差块 X 为: j=0 1 2 3 i=0 1 2 3 其 4×4DCT 输出为: Y = AXAT= ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −−− − 086.1782.1036.6467.6 558.140.1277.90.16 036.1150.6914.3679.2 594.90.17097.100.48 (6.18) 而式(6.17)对应的整数 DCT 变换结果为: Y’ = (CXCT)⊗E= ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −−− − 60.1214.22.6641.6 179.150.1222.80.16 20.1008.64.3214.2 854.80.17751.100.48 (6.19) 两者之差为: Y − Y’= ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −− − − 514.00.432-164.00.174- 0.6210.01.055-0.0 164.0142.0514.00.465 0.74-0.0654.00.0 (6.20) H.264 将 DCT 中“⊗Ef”运算的乘法融合到后面的量化过程中,实际的 DCT 输出为: W = CXCT (6.21) 如上如述,可以将式(6.17)的矩阵乘法运算改造成两次一维整数 DCT 变换,例如先对图像或其 残差块的每行进行一维整数 DCT,然后对经行变换的块的每列再应用一维整数 DCT。而每次一维整 数 DCT 可以采用蝶形快速算法,节省计算时间,如图 6.48 所示。 24 20 3 24 16 2 1 6 23 7 4 5 10 20 5 22 图 6.48 一维快速变换算法 其中,r=2:整数 DCT 变换;r=1:Hadamard 变换 6.7.2 量化 量化过程在不降低视觉效果的前提下减少图像编码长度,减少视觉恢复中不必要的信息。H.264 采用标量量化技术,它将每个图像样点编码映射成较小的数值。一般标量量化器的原理为: ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛= QP yroundFQ (6.22) 其中,y 为输入样本点编码,QP 为量化步长,FQ 为 y 的量化值,round()为取整函数(其输出为与 输入实数最近的整数)。其相反过程,即反量化为: y’=FQ⋅QP (6.23) 在量化和反量化过程中,量化步长 QP 决定量化器的编码压缩率及图像精度。如果 QP 比较大, 则量化值 FQ 动态范围较小,其相应的编码长度较小,但反量化时损失较多的图像细节信息;如果 QP 比较小,则 FQ 动态范围较大,相应的编码长度也较大,但图像细节信息损失较少。编码器根据 图像值实际动态范围自动改变 QP 值,在编码长度和图像精度之间折衷,达到整体最佳效果。 在 H.264 中,量化步长 Qstep 共有 52 个值。如表 6.8 所示。其中 QP 是量化参数,是量化步长 的序号。当 QP 取最小值 0 时代表最精细的量化,当 QP 取最大值 51 时代表最粗糙的量化。QP 每增 加 6,Qstep 增加一倍。应用时可以在这个较宽的量化步长范围根据实际需要灵活选择。对于色度编 码,一般使用与亮度编码同样的量化步长。为了避免在较高量化步长时的出现颜色量化人工效应, 现在的 H.264 草案把色度的 QP 最大值大约限制在亮度 QP 最大值的 80%范围内,最后的 H.264 草 案规定,亮度 QP 的最大值是 51,而色度 QP 的最大值是 39。 表 6.8 H.264 中编解码器的量化步长 QP Qstep QP Qstep QP Qstep QP Qstep QP Qstep 0 0.625 12 2.5 24 10 36 40 48 160 1 0.6875 13 2.75 25 11 37 44 49 176 2 0.8125 14 3.25 26 13 38 52 50 208 3 0.875 15 3.5 27 14 39 56 51 224 4 1 16 4 28 16 40 64 5 1.125 17 4.5 29 18 41 72 6 1.25 18 5 30 20 42 80 7 1.375 19 5.5 31 22 43 88 8 1.625 20 6.5 32 26 44 104 9 1.75 21 7 33 28 45 112 10 2 22 8 34 32 46 128 11 2.25 23 9 35 36 47 144 x(0) x(1) x(2) x(3) 输入 + + + + - - + + + + - r-r X(0) X(2) X(1) X(3) 输出 在 H.264 中,量化过程是对前面(6.17)式的 DCT 结果进行操作: ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛= Qstep YroundZ ij ij (6.24) 其中,Yij 是矩阵 Y 中的转换系数,Zij 是输出的量化系数,Qstep 是量化步长。 H.264 量化过程还要同时完成 DCT 变换中“⊗Ef”乘法运算,它可以表述为: ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛= Qstep PFWroundZ ijij (6.25) 其中,Wij 是矩阵 W 中的转换系数,PF 是矩阵 Ef 中的元素,根据样本点在图像块中的位置(i, j)取值: ⎪⎩ ⎪⎨ ⎧ = 其它情况 或 或 2/ )3,3( )1,3( ),3,1( ),1,1(4/ )2,2( )2,0( ),0,2( ),0,0( 2 2 ab b a PF (6.26) 利用量化步长随量化参数每增加 6 而增加一倍的性质,可以进一步简化计算。设: qbits = 15 + floor(QP/6) (6.27) 令 qbits Qstep PFMF 2= (6.28) 其中,floor()为取整函数(其输出为不大于输入实数的最大整数)。则式(6.25)可以写成: ⎟ ⎠ ⎞⎜ ⎝ ⎛= qbitsijij MFWroundZ 2 (6.29) 这样,MF 可以取整数,如表 6.9 所示的量化表。表 6.9 只列出对应 QP 值为 0 到 5 的 MF 值,对于 QP 值大于 5 的情况,只是 qbits 值随 QP 值每增加 6 而增加 1,而对应的 MF 值不变。这样,量化过 程则为整数运算,并且可以避免使用除法,并且确保用 16 位算法来处理数据,在没有 PSNR 性能恶 化的情况下实现最小的运算复杂度。 表 6.9 H.264 中 MF 值 样点位置 QP (0,0),(2,0), (2,2),(0,2) (1,1),(1,3), (3,1),(3,3) 其它样 点位置 0 13107 5243 8066 1 11916 4660 7490 2 10082 4194 6554 3 9362 3647 5825 4 8192 3355 5243 5 7282 2893 4559 具体量化过程的运算为: ⏐Zij⏐ = (⏐Wij⏐⋅MF + f)>>qbits sign(Zij) = sign (Wij) (6.30) 其中,“>>”为右移运算,右移一次完成整数除以 2;sign()为符号函数;f 为偏移量,它的作用是改善 恢复图像的视觉效果,例如,对帧内预测图像块 f 取 2qbits/3,对帧间预测图像块 f 取 2qbits/6。 6.7.3 DCT 直流系数的变换量化 如果当前处理的图像宏块是色度块或帧内 16×16 预测模式的亮度块,则需要将其中各图像块的 DCT 变换系数矩阵 W 中的直流分量或直流系数 W00 按对应图像块顺序排序,组成新的矩阵 WD,再 对 WD 进行 Hadamard 变换及量化。对这种情况,在 6.7.2 节中介绍的量化过程就不需要对各图像块 中的 W00 单独进行量化。 6.7.3.1 帧内 16×16 预测模式亮度块的直流系数变换量化 16×16 的图像宏块中有 4×4 个 4×4 图像亮度块,所以亮度块的 WD 为 4×4 矩阵,其组成元素为 各图像块 DCT 的直流系数 W00,这些 W00 在 WD 中的排列顺序为对应图像块在宏块的位置。宏块中 亮度块序号与其在宏块中位置的对应关系如图 6.49 所示。其中,16 个大方块代表宏块中 16 个图像 亮度块,大方块中的数字为对应图像亮度块在宏块中的序号,大方块左上方的小方块中两个数字代 表该图像亮度块在宏块中的行和列。 图 6.49 宏块中亮度块序号与其在宏块中位置的对应关系 对亮度块 WD 的 Hadamard 变换为: 2/ 1111 1111 1111 1111 1111 1111 1111 1111 ⎟⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜ ⎜ ⎜ ⎝ ⎛ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −− −− −− ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −− −− −−= DD WY (6.31) 其中,YD 是 Hadamard 变换结果。接着要对 YD 再进行量化输出: ⏐ZD(i, j)⏐ = (⏐YD(i, j)⏐⋅MF(0, 0) + 2f)>>(qbits+1) sign(ZD(i, j)) = sign (WD(i, j)) (6.32) 其中,MF(0, 0)是位置为(0, 0)的 MF 系数值,其它参数见上节。4×4Hadamard 变换也可以采用快速算 法。 0 00 1 01 4 02 5 03 2 10 3 11 6 12 7 13 8 20 9 21 13 2322 12 11 3130 10 15 3332 14 6.7.3.2 色度块的直流系数变换量化 16×16 的图像宏块中包含图像色度 Cr 及 Cb 块各 2×2 个,所以色度 Cr 或 Cb 块的 WD 为 2×2 矩 阵,其组成元素为各对应图像块色度信号 DCT 的直流系数 W00,这些 W00 在 WD 中的排列顺序为对 应图像块在宏块的位置。宏块中色度块序号与其在宏块中位置的对应关系如图 6.50 所示。其中,4 个大方块代表宏块中 4 个图像色度块,大方块中的数字为对应图像色度块在宏块中的序号,大方块 左上方的小方块中两个数字代表该图像色度块在宏块中的行和列。可以看出,这四个方块的对应关 系与图 6.49 中亮度块前四个序号的对应关系一致,有利于软件开发时减少程序代码。 图 6.50 宏块中色度块序号与其在宏块中位置的对应关系 对各色度块 WD 的 Hadamard 变换为: ⎥⎦ ⎤ ⎢⎣ ⎡ −⎥⎦ ⎤ ⎢⎣ ⎡ −= 11 11 11 11 DD WY (6.33) 其中,YD 是 Hadamard 变换结果。接着要对 YD 再进行量化输出: ⏐ZD(i, j)⏐ = (⏐YD(i, j)⏐⋅MF(0, 0) + 2f)>>(qbits+1) sign(ZD(i, j)) = sign (WD(i, j)) (6.34) 其中,MF(0, 0)、f、qbits 等定义同亮度块部分。 6.8 CAVLC(基于上下文自适应的可变长编码) 6.8.1 熵编码的基本原理 熵编码是无损压缩编码方法,它生成的码流可以经解码无失真地恢复出原数据。熵编码是建立 在随机过程的统计特性基础上的。 设信息源 X 可发出的消息符号集合为 iaA {= | },,2,1 mi = ,并设 X 发出符号 ia 的概率 ( )iap 为,则定义符号 ia 出现的自信息量为: ( ) ( )ii apaI log−= (6.35) 通常,上式中的对数取 2 为底,这时定义的信息量单位为”比特”(bit)。 如果各符号 a 的出现是独立的,那么 X 发出一符号序列的概率等干各符号的概率之积,因而该 序列出现的信息量等于相继出现的各符号的自信息量之和。这类信源称为无记忆信源。 对信息源 X 的各符号的自信息量取统计个均,可得平均信息量: () () ()i m i i apapXH 2 1 log∑ = −= (6.36) 称 ()XH 为信息源 X 的熵(entropy),单位为 bit/符号, 通常也称为 X 的一阶熵,它可以理解为 0 00 1 01 2 10 3 11 信息源 X 发任意一个符号的平均信息量。由信息论的基本概念可以知道,一阶熵是无记忆信息源(在 无失真编码时)所需数码率的下界。 熵的大小与信源的概率模型有着密切的关系,各个符号出现的概率不同,信源的熵也不同。当 信源中各事件是等概率分布时,熵具有极大值。信源的熵与其可能达到的最大值之间的差值反映了 该信源所含有的冗余度。信源的冗余度越小,即每个符号所独立携带的信息量越大,那么传送相同 的信息量所需要的序列长度越短,符号位越少。因此,数据压缩的一个基本的途径是去除信源的符 号之间的相关性,尽可能地使序列成为无记忆的,即前一符号的出现不影响以后任何一个符号出现 的概率。 6.8.2 CAVLC 的基本原理 在 H.264 的 CAVLC(基于上下文自适应的可变长编码)中,通过根据已编码句法元素的情况动态 调整编码中使用的码表,取得了极高的压缩比。 CAVLC 用于亮度和色度残差数据的编码。残差经过变换量化后的数据表现出如下特性:4*4 块 数据经过预测、变换、量化后,非零系数主要集中在低频部分,而高频系数大部分是零;量化后的 数据经过 zig-zag 扫描,DC 系数附近的非零系数值较大,而高频位置上的非零系数值大部分是+1 和 -1;相邻的 4*4 块的非零系数的数目是相关的。CAVLC 充分利用残差经过整数变换、量化后数据的 特性进行压缩,进一步减少数据中的冗余信息,为 H.264 卓越的编码效率奠定了基础。 6.8.3 CAVLC 的上下文模型 利用相邻已编码符号所提供的相关性,为所要编码的符号选择合适的上下文模型。利用合适的 上下文模型,就可以大大降低符号间的冗余度。在 CAVLC 中上下文模型的选择主要体现在两个方 面, 非零系数编码所需表格的选择以及拖尾系数后缀长度的更新,以下有详细的论述。 6.8.4 CAVLC 的编码过程 6.8.4.1 编码非零系数的数目(TotalCoeffs)以及拖尾系数的数目(TrailingOnes) 非零系数数目的范围是从 0 到 16,拖尾系数数目的范围是从 0 到 3。如果±1 的个数大于 3 个, 只有最后 3 个被视为拖尾系数,其余的被视为普通的非零系数。对非零系数数目和拖尾系数数目的 编码是通过查表的方式,共有 4 个变长表格和 1 个定长表格可供选择。其中的定长表格的码字是 6 个比特长,高 4 位表示非零系数的个数(TotalCoeffs),最低两位表示拖尾系数的个数(TrailingOnes)。 表格的选择是根据变量 NC(Number Current,当前块值)的值来选择的,在求变量 NC 值的过 程中,体现了基于上下文的思想。除了色度的直流系数外,其它系数类型的 NC 值是根据当前块左 边 4*4 块的非零系数数目(NA)和当前块上面 4*4 块的非零系数数目(NB)求得的。当输入的系 数是色度的直流系数时,NC= -1。求 NC 的过程见表 6.10,X 表示与当前块同属于一个片并可用。 选择非零系数数目和拖尾系数数目的编码表格的过程见表 6.11。CAVLC 的码表见附录。 表 6.10 计算 NC 的值 上面的块(NB) 左边的块(NA) NC X X (NA+NB)/2 X NA X NB 0 表 6.11 选择非零系数数目和拖尾系数数目的编码表格 6.8.4.2 编码每个拖尾系数的符号 对于每个拖尾系数(±1)只需要指明其符号,其符号用一个比特表示(0 表示+,1 表示-)。编 码的顺序是按照反向扫描的顺序,从高频数据开始。 6.8.4.3 编码除了拖尾系数之外的非零系数的幅值(Levels) 非零系数的幅值(Levels)的组成分为两个部分,前缀(level_prefix)和后缀(level_suffix)。 levelSuffixsSize 和 suffixLength 是编码过程中需要使用的两个变量。后缀是长度为 LevelSuffixsSize 位的无符号整数。通常情况下变量 levelSuffixsSize 的值等于变量 suffixLength 的值,有两种情况例外: 1. 当前缀等于 14 时,suffixLength 等于 0,levelSuffixsSize 等于 4。 2. 当前缀等于 15 时,levelSuffixsSize 等于 12。 变量 suffixLength 是基于上下文模式自适应更新的,suffixLength 的更新与当前的 suffixLength 的值以及已经解码好的非零系数的值(Level)有关。suffixLength 数值的初始化以及更新过程如下所 示: 1. 普通情况下 suffixLength 初始化为 0,但是当块中有多于 10 个非零系数并且其中拖尾系数的 数目少于 3 个,suffixLength 初始化为 1。 2. 编码在最高频率位置上的非零系数。 3. 如果当前已经解码好的非零系数值大于预先定义好的阈值,变量 suffixLength 加 1。 决定是否要将变量 suffixLength 的值加一的阈值如表 3 所示。第一个阈值是 0,表示在第一个非 零系数被编码后,suffixLength 的值总是增加 1。 表 6.12 决定增加 suffixLength 的域值 当前 suffixLength 域值 0 0 1 3 2 6 3 12 4 24 5 48 6 N/A 6.8.4.4 编码最后一个非零系数前零的数目(TotalZeros) TotalZeros 指的是在最后一个非零系数前零的数目,此非零系数指的是按照正向扫描的最后一个 非零系数。例如:已知一串系数 0 0 5 0 3 0 0 0 1 0 0 -1 0 0 0 0,最后一个非零系数是-1,TotalZeros NC 表格 0 <= NC < 2 变长表格 1 2 <= NC < 4 变长表格 2 5 <= NC < 8 变长表格 3 NC=-1 变长表格 4 NC >= 8 定长表格 的值等于 2+3+1+2=8。因为非零系数数目(TotalCoeffs)是已知,这就决定了 TotalZeros 可能的最大 值。根据这一特性,CAVLC 在编排 TotalZeros 的码表时做了进一步的优化。 6.8.4.5 编码每个非零系数前零的个数(RunBefore) 每个非零系数前零的个数(RunBefore)是按照反序来进行编码的,从最高频的非零系数开始。 RunBefore 在以下两种情况下是不需要编码的: 1. 最后一个非零系数(在低频位置上)前零的个数。 2. 如果没有剩余的零需要编码(Σ[RunBefore]=TotalZeros)时,没有必要再进行 RunBefore 的 编码。 在 CAVLC 中,对每个非零系数前零的个数的编码是依赖于 ZerosLeft 的值,ZerosLeft 表示当前 非零系数左边的所有零的个数,ZerosLeft 的初始值等于 TotalZeros,在每个非零系数的 RunBefore 值编码后进行更新。用这种编码方法,有助于进一步压缩编码的比特数目。例如:如果当前 ZerosLeft 等于 1,就是只剩下一个零没有编码,下一个非零系数前零的数目只可能是 0 或 1, 编码只需要一 个比特。 6.8.5 CAVLC 解码过程 CAVLC 解码过程可参考图 6.51 到图 6.53 的程序流程图。CAVLC 解码程序的流程图如图 6.51 所示,其中解析除了拖尾系数之外的非零系数幅值的子程序流程图如 6.52 所示,解析每个非零系数 前零的个数(Run_Before[i])的子程序流程图如图 6.53 所示。 在图 6.51 解码程序流程图中,第一步根据输入的参数求得输入数据的块类型、输入数据的个数 等参数,这是初始化的工作。随后求变量 NC,并根据变量 NC 的值来选择所要查的表格,其中变量 NA 表示与当前块相邻的左边块中非零系数的个数,变量 NB 表示与当前块相邻的上面块中非零系数 的个数。Coeff_token 是一个句法元素,以这个句法元素为入口参数,可查表求得非零系数的个数 (TotalCoeffs)、拖尾系数的个数(TrailingOnes)。TotalZeros 值的编码方式是查表,用 TotalCoeff 作 为入口参数。 在图 6.52 解析除拖尾系数之外的非零系数幅值的子程序流程图中,首先根据条件初始化变量 suffixLength 的值,随后进入循环求解非零系数幅值的过程中。因为拖尾系数已经在前面的过程中解 析好了,此时的非零系数不包括拖尾系数,所以求解的循环次数是 TotalCoeff-TrailingOnes。在循环 中,levelCode 是求解过程中所要使用的中间变量,判断 levelCode 的奇偶性,使用不同的公式求解 非零系数幅值。循环中最后的步骤是变量 suffixLength 的更新,如果已经解码好的非零系数的幅值大 于相应的预先设定好的域值,变量 suffixLength 的值加一,否则 suffixLength 的值不变,决定 suffixLength 是否需要增加的域值见表 3。 在图 6.53 每个非零系数前零的个数(Run_Before[i])的子程序流程图中,Run_before 的值是查 表求得的,表格的入口参数是 Zeroleft,表示当前非零系数之前 0 的个数。查表解析 Run_before 的 值到 ZeroLeft 等于零或者已经解码到最后一个非零系数(低频位置)时结束。 图6.51 解码程序流程图 图6.52 解析除拖尾系数之外的非零系数的幅值子程序流程图 图 6.53 解析每个非零系数前零的数(Run_Before[i])的子程序流程图 6.8.6 CAVLC 编解码过程实例 4×4 块数据: 0 0 -1 0 5 2 0 0 3 0 0 0 1 0 0 0 数据重排序: 0,0,5,3,2,-1,0,0,0,1… 非零系数的数目(TotalCoeffs)=5 以及拖尾系数的数目(TrailingOnes)=2 最后一个非零系数前零的数目(Total_zeros)=5 变量 NC=3 编码过程: 表 6.13 编码过程 元素 数值 编码 Coeff_token Trailing_ones_sign_flag Trailing_ones_sign_flag Level(1) Level(0) Total_zeros Run_before(4) Run_before(3) Run_before(2) Run_before(1) Run_before(0) TotalCoeffs=5,TraillingOnes=2 + - 2 (suffixLength=0) 3 (suffixLength=1) 5 Zreoleft=5,run_before=3 Zreoleft=2,run_before=0 Zreoleft=2,run_before=0 Zreoleft=2,run_before=0 Zreoleft=2,run_before=2 0000101 1 0 001(前缀) 001(前缀)0(后缀) 101 010 1 1 1 最后一个系数不需要编码 CAVLC 编码输出的码流:0000101100010010101010111 解码过程: 表 6.14 解码过程 输入码字 元素 数值 输出序列 0000101 1 0 001 0010 101 010 1 1 1 Coeff_token Trailing_ones_sign_flag Trailing_ones_sign_flag Level Level Total_zeros Run_before Run_before Run_before Run_before TotalCoeffs=5,TraillingOnes=2 + - 2 (suffixLength=0) 3 (suffixLength=1) 5 3 0 0 0 空 1 -1,1 2,-1,1 3,2,-1,1 5,3,2,-1,1 5,3,2,-1,0,0,0,1 5,3,2,-1,0,0,0,1 5,3,2,-1,0,0,0,1 5,3,2,-1,0,0,0,1 解码后输出序列:0,0,5,3,2,-1,0,0,0,1 6.8.7 CAVLC 与 UVLC 比较 CAVLC 代替 H.264 早期草案中提出的 UVLC(统一的可变长编码)对残差数据进行熵编码。 CAVLC 提出的原因可总结为以下的方面: 1. 基于上下文的自适应编码方法可全面的提高编码的质量。 2. 应用 Zig-zag 扫描方法,将非零系数值(Level)和零行程(Run)分开编码可提高编码的自 适应性,有助于提高编码的效率。 3. 将非零系数值(Level)和零行程(Run)分开编码可降低对存储数据的复杂度。 CAVLC 与 UVLC 相比在编码方法上有如下的改进: 1. 可以很容易的观察到,量化后的数据经过 zig-zag 扫描,高频位置上的非零系数值只可能是 +1 或-1,这些值为+1、-1 的非零系数被称为拖尾系数(TrailingOnes)。在 CAVLC 拖尾系数 的编码中,只对拖尾系数的数目以及各个系数的符号进行编码。 2. 除了拖尾系数外,其它的非零系数(Level)是一维参数,使用的是结构化的 VLC 编码,不 需要查表。 3. 在编码零行程(Run)时,输入系数的总数目和其中非零系数的数目是已知,这限制了零行 程的范围。CAVLC 利用了此特性将零行程分为最后一个非零系数前零的数目(TotalZeros) 和每个非零系数前零的个数(RunBefore),并在码表的安排上进行了进一步的优化。 对 CAVLC 和 UVLC 分别做测试,使用的测试序列是 Silent,15fps,QCIF;使用的测试软件是 JVT 公布的标准测试软件,测试结果见图 6.54 和图 6.55。可以看出来,CAVLC 相对于 UVLC 在编码性 能上占有优势。在相同码率的情况下,用 CAVLC 编码的 PSNR 的值高于用 UVLC 编码的 PSNR 的 值,并且随着比特率的增加 CAVLC 的优势更加明显。 图6.54 实验结果(1) Silent QCIF Inter 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 0 50 100 150 200 250 300 350 400 450 UV LC CV LC 图6.55 实验结果(2) 6.9 CABAC(基于上下文的自适应二进制算术熵编码) 6.9.1 自适应算术编码 算术编码的思想是用 0 到 1 的区间上的一个数来表示一个字符输入流,它的本质是为整个输入 流分配一个码字,而不是给输入流中的每个字符分别指定码字。算术编码是用区间递进的方法来为 输入流寻找这个码字的,它从于第一个符号确定的初始区间(0 到 1)开始,逐个字符地读入输入流, 在每一个新的字符出现后递归地划分当前区间,划分的根据是各个字符的概率,将当前区间按照各 个字符的概率划分成若干子区间,将当前字符对应的子 2 区间取出,作为处理下一个字符时的当前 区间。到处理完最后一个字符后,得到了最终区间,在最终区间中任意挑选一个数作为输出。解码 器按照和编码相同的方法和步骤工作,不同的是作为逆过程,解码器每划分一个子区间就得到输入 流中的一个字符。 6.9.1.1 算法流程 在算术编码的递进计算过程中,编码器必须保存以下变量记录状态: 1)当前区间的下限 L 2)当前区间的大小 R 3)当前字符 binval 4)各字符的概率 Px L 和 R 用来确定当前区间;Px 则是当前区间的划分根据,在二进制编码中,只有 1 和 0 两个字 符,所以只需记录 P1 或 P0 即可;最后确定 binval 所在的子区间作为下一个递进中的当前区间。有 R 的递进关系: PxRR ×= (6.37) Silent QCIF Intra 28.00 29.00 30.00 31.00 32.00 33.00 34.00 35.00 36.00 37.00 38.00 39.00 40.00 41.00 42.00 43.00 44.00 45.00 46.00 47.00 48.00 49.00 50.00 51.00 0 20000 40000 60000 80000 100000 120000 140000 UVLC CVLC 图 6.56 算术编码流程 6.9.1.2 自适应 在实际过程中,输入流中字符的概率分布是动态改变的,这需要维护一个概率表去记录概率变化 的信息。在作递进计算时,通过对概率表中的值估计当前字符的概率,当前字符处理后,需要重新 刷新概率表。这个过程表现为对输入流字符的自适应。编码器和解码器按照同样的方法估计和刷新 概率表,从而保证编码后的码流能够顺利解码。 6.9.1.3 码流输出 在实际操作过程中,编码器并不是等递进到最终区间才输出码字的,这里有两方面的原因,一 是在编码器的递进计算过程中,如果没有输出,信道会出现空闲,形成浪费;二是如果输入流较长 时,最终得到的区间非常小,必须以极高的精度来记录 L 和 R 。幸运的是,在二进制编码中,区间 的上下限以二进制形式表示,每当下限的最高有效位与上限的最高有效位一样时,就可以移出这个 比特。这样的方法可以保证编码器在递进计算的同时不断地输出码流。序列出现的可能性越大,区 间就越长,确定该区间所需要的比特数就越少。 6.9.1.4 算术编码与哈夫曼性能比较 下面通过对比哈夫曼编码来评价算术编码的优势。算术编码的比特率由下式限制: NNHRNH NN /2/)(/)( +ℜ≤≤ℜ (6.38) 其中,N 是编码序列中的符号数而 )(ℜNH 是序列的 N 阶熵。参照矢量哈夫曼编码的情况: NNHRNH NN /1/)(/)( +ℜ≤≤ℜ (6.39) 可以看到,当 N 足够大时,都有: )()(lim ℜ=ℜ ∞→ HRNN (6.40) 也就是说当输入流足够长时可使比特率接近信源熵率,从这点看,这两者都是优秀的熵编码算法。 然而,用哈夫曼编码,必须为所有可能的长度为 N 的序列设计和存储码书,这样做的复杂度随 N 呈 指数增长。用算术编码则不需要预先为每个可能的信源序列指定码书。而是每当所确定区间的下限 和上限有公共最高有效位时,就可以连续地得到比特。编码序列的长度可以和信源的长度一样长。 因此,实际上,算术编码可以更接近熵率。 算术编码的另一个优点是可以简单地通过更新符号概率表来实现对信源统计特性的自适应。通 过对不同上下文用不同的概率表也可以容易地实现条件编码。对于哈夫曼编码,则不得不基于更新 的概率表重新设计码书,或对不同的上下文设计多个码表。 由于较高的编码效率和易于自适应,只要所涉及的计算量是能接受的,无疑算术编码比哈夫曼 Binval= 0 ? L=L R=R*P0 L=L+R*P0 R=R*P1 yes no 当前字符结束 编码是一种更好的选择。 6.9.1.5 自适应算术编码的计算复杂度及优化 从上文可以看到,算术编码的计算复杂度主要体现在两个方面: 1) 概率的估计、更新 2) 划分子区间时的乘法运算: PxRR ×= 1) CABAC 的概率模型 假设输入流为 T ,当前字符 binval ,在 binval 之前的字符流为 z , z ∈ T, 条件概率 P(binval|z)就是当前字符的概率估计值。随着条件因子 z 的增长,带来的计算量急剧增大,而且每处 理一个字符,需要作两次类似的计算,必须找到一种更好的法则来解决这个问题。 首先来研究如果当前字符的概率估计值 Px 不是取自 P(binval|z)会有什么影响。首先毫无疑问 这会影响编码效率,P(binval|z)是取自一个较严格的统计模型,对应于它的输出流的码率能取得对 信源熵率的最大逼近;其次,而从解码的可行性上讲,只要保证编码和解码双方在划分当前区间时 能得到同样的 Px ,也就是通过同样的法则估计和更新 Px ,就能顺利解码。 CABAC 在计算的复杂度和编码效率之间作了折中,建立了一个基于查表的概率模型,将从 0 到 0.5 范围内的概率量化为 64 个值,这些概率对应于 LPS(Least ProbabilitySymbol)字符,则 MPS (Most Probability Symbol)字符的概率为 1- lpsP 。字符的概率估计值被限制在表内,概率的刷新也 不是去计算 P(binval|z),而是按照某种法则在表中查找。 图 6.57 CABAC 概率估计与刷新模型 如图 6.57 所示,列出了 LPS 被量化后的概率值,这些值以σ 为编号,实线和虚线指示了概率的 刷新值。在处理当前字符 binval 时,概率的刷新有两个方向:一,如果当前字符是 LPS,则 lpsP 变 大,在图上顺着虚线往左寻找;二,如果当前字符是 MPS,则 lpsP 变小,在图上顺着实线往右寻找。 可以看到,在 CABAC 建立的这个概率模型中,出现 MPS 时的刷新值都只是简单地指向当前值的下 一位,即 1+→ σσ ,这一点可以被利用来降低计算量。 在 CABAC 建立的概率模型中,有三个值是较特殊的: 0=σ 时,LPS 的概率已经达到了最大 值 0.5,如果下一个出现的字符仍是 LPS,则此时 LPS 和 MPS 的字符交换位置; 63=σ 对应着 LPS 的最小概率值,但它并没有被纳入 CABAC 的概率估计和更新的范围,这个值被用作特殊的场合, 传达特殊的信息。比如,当解码器检测到当前区间的划分依据是这个概率值时,认为这表示当前流 的结束; 62=σ ,这是表中可用的最小值,它对应的刷新值是它自身,当 MPS 连续出现,LPS 的 0.1 概 率 0.2 0.3 0.4 0.5 10 20 30 40 50 600 0.0 概率表索引 σ 概率持续减小,直到 62=σ ,保持不变。 2) 乘法优化 CABAC 的概率模型很有效地降低了了概率估计和刷新中的计算量,而对于在算术编码频繁使 用的乘法运算 PxRR ×= ,CABAC 也应用了类似的思想。 CABAC 首先建立一个 644× 的二维表格,存储预先计算好的乘法结果。表格的入口参数毫无 疑问一个来自 Px ,另一个来自 R。 Px 可以直接以σ 作为参数,下面的式子给出 R 的量化方法: 3&)6( >>= Rρ (6.41) 每次在需要做乘法运算时,携带 ρ 和σ 进行查表操作就得到结果。 建立了概率模型和乘法模型后,在递进计算过程中 CABAC 必须保存以下变量记录状态: 1)当前区间的下限 L 2)当前区间的大小 R 3)当前 MPS 字符ϖ 4)LPS 的概率编号σ 算法流程: 图 6.58 CABAC 做算术编码时流程图 图中,灰色部分是概率的刷新部分。表 TabRangeLPS 存储预先计算好的乘法结果,表 TransIdxLPS 是图 2 对应的概率表。 6.9.2 上下文模型 6.9.2.1 算术编码的生命期 算术编码是对整个流分配码字,但考虑到如果有某个比特丢失,编码和解码将错位。为了将差错 控制在一定范围内,CABAC 将片(slice)作为算术编码的生命期,在每个片开始时,CABAC 进行 初始化,按照一定的法则为编码器指定初始ϖ 、σ ,并初始化[0,1)为当前区间。 ρ σ ρ ϖ σ σσ ϖϖ σ σ 6.9.2.2 CABAC 的上下文模型 即使对片内的数据,CABAC 也不是将它们作为整体来处理的,而是继续分割为若干个子部分, 分别编码。除了上文提到的差错控制的原因外,也是由于如果输入流过长,则要求 L 和 R 必须有足 够的精度和长度来保存中间数据,这对于编码器是个不小的负担。 H.264 将一个片内可能出现的数据划分为 399 个上下文模型,每个模型以 ctxIdx 标识,在每个模 型内部进行概率的查找和更新。H.264 共要建立 399 个概率表,每个上下文模型都独立地使用对应 的表维护概率状态。这些模型的划分精确到比特,几乎大多数的比特和它们邻近的比特处于不同的 上下文模型中。 解码器对于输入的每一个比特首先要做的工作是查找它属于哪个上下文模型,然后查找该上下 文模型对应的概率表以递进区间。查找某个比特对应的上下文模型一般有以下两个步骤: 1. 确定该比特所属的句法元素,H.264 对每个句法元素都分配了一个上下文模型的区间,该句法 元素中的每个比特的上下文模型的 ctxIdx 都在这一区间。表 6.15 描述了用 CABAC 编码的各句 法元素所在上下文模型区间的起始 ctxIdx。句法元素的具体含义在第七章句法与语义中详细介 绍。 表 6.15 句法元素与上下文模型区间 片类型 句法元素 SI I P, SP B mb_skip_flag 11-13 24-26 mb_field_decoding_flag 70-72 70-72 70-72 70-72 mb_type 0-10 3-10 14-20 27-35 coded_block_pattern (luma) 73-76 73-76 73-76 73-76 coded_block_pattern (chroma) 77-84 77-84 77-84 77-84 mb_qp_delta 60-63 60-63 60-63 60-63 prev_intra4x4_pred_mode_flag 68 68 68 68 rem_intra4x4_pred_mode 69 69 69 69 intra_chroma_pred_mode 64-67 64-67 64-67 64-67 ref_idx_l0 54-59 54-59 ref_idx_l1 54-59 mvd_l0[ ][ ][ 0 ] 40-46 40-46 mvd_l1[ ][ ][ 0 ] 40-46 mvd_l0[ ][ ][ 1 ] 47-53 47-53 mvd_l1[ ][ ][ 1 ] 47-53 sub_mb_type 21-23 36-39 coded_block_flag 85-104 85-104 85-104 85-104 significant_coeff_flag[ ] 105-165, 277-337 105-165, 277-337 105-165, 277-337 105-165, 277-337 last_significant_coeff_flag[ ] 166-226, 338-398 166-226, 338-398 166-226, 338-398 166-226, 338-398 coeff_abs_level_minus1[ ] 227-275 227-275 227-275 227-275 2. 按照某个法则为当前比特在 a)中得到的区间中找到所对应的 ctxIdx。该法则对于每个句法元素 都不同。这个法则一般是用表来定义的,表 2 描述了大多数句法元素为所属各比特查找 ctxIdx 的法则。在这个表中,binIdx 是各比特在对应句法元素中的序号。ctsOffset 是表 6.15 中所示各 句法元素对应上下文模式区间的起始偏移。我们看到,在表 6.16 中某些比特对应多个上下文模 型,这一般是在解码中需要根据前后宏块在空间上的相关性再作进一步确定。 表 6.16 句法元素中各比特的 ctxIdx binIdx ctxIdxOffset 0 1 2 3 4 5 >= 6 0 0,1,2 无 无 无 无 无 无 3 0,1,2 ctxIdx=276 3 4 5,6 6,7 7 11 0,1,2 无 无 无 无 无 无 14 0 1 2,3 无 无 无 无 17 0 ctxIdx=276 1 2 2,3 3 3 21 0 1 2 无 无 无 无 24 0,1,2 无 无 无 无 无 无 27 0,1,2 3 4,5 5 5 5 5 32 0 ctxIdx=276 1 2 2,3 3 3 36 0 1 2,3 3 3 3 无 40 0,1,2 3 4 5 6 6 6 47 0,1,2 3 4 5 6 6 6 54 0,1,2,3 4 5 5 5 5 5 60 0,1 2 3 3 3 3 3 64 0,1,2 3 3 无 无 无 无 68 0 无 无 无 无 无 无 69 0 0 0 无 无 无 无 70 0,1,2 无 无 无 无 无 无 73 0,1,2,3 0,1,2,3 0,1,2,3 0,1,2,3 无 无 无 77 0,1,2,3 4,5,6,7 无 无 无 无 无 276 0 无 无 无 无 无 无 6.9.3 对输入流预编码 CABAC 围绕算术编码的特性作了许多优化,这其中也包括从统计角度对输入流作的一套预编 码方法。由图 3 可以看到,当前处理的字符为 MPS 时,区间递进只是子区间的长度发生改变,而 作为影响实际输出值的 L 却并没有变化。这个现象意味着如果输入流中连续出现大量 MPS,或者 MPS 对 LPS 的概率比非常高时,可以达到极高的压缩效果。算术编码对这种输入流的压缩性能达 到最优,编码输出的码率也更能接近信源熵率。由此 CABAC 体系包含了一个预编码过程,将输入 流重新编码后再进行算术编码。这个预编码过程叫做输入流的二进制化,经它编码输出的是 MPS 概 率极高的比特流。 CABAC 中对不同的句法元素一共应用了四种二进制化方法: - U - TU - UEGK - FL 表 6.17 是其中 U 变换的码表其它二进制化编码方法类似。binIdx 是编码后各比特的序号。 表 6.17 U 二进制化码表 编码前 编码后比特流 0 0 1 1 0 2 1 1 0 3 1 1 1 0 4 1 1 1 1 0 5 1 1 1 1 1 0 … binIdx 0 1 2 3 4 5 6.9.4 初始化 前文提到,CABAC 的生命期是片,每个片开始时,要对 399 种上下文模型全部进行初始化工 作。初始化的步骤是, a) 将递进区间复位到[0,1) b) 为每个上下文模型指定一个初始的ϖ 、σ 。这又由以下几步得到: - H.264 为每个上下文模型定义了初始化常量 m、n,通过查表获得上下文模型相对应的 m、n。 - 按照如下算法计算ϖ 、σ : preCtxState = Clip3( 1, 126, ( ( m ∗ SliceQPY ) >> 4 ) + n ) if( preCtxState <= 63 ) { σ = 63 - preCtxState ϖ = 0 } else { σ = preCtxState - 64 ϖ = 1 } 式中,函数 Clip3(a,b,c)表示将 c 的值限制在[a,b]。preCtxState 是一个中间变量。 6.9.5 结论 CABAC 中内建了由大量实验统计而得到的概率模型。在编码过程中,CABAC 根据当前所要编 码的内容以及先前已编码好内容,动态地选择概率模型来进行编码,并实时更新相对应的概率模型。 并且,CABAC 在计算量和编码速度上进行了优化,用了量化查表、移位、逻辑运算等方法代替复 杂的概率估计和乘法运算。在实际应用中,CABAC 与其它主流的熵编码方式相比有更高的编码效 率,用一组质量在 28~40dB 的视频图像做测试,应用 CABAC 可使比特率进一步提高 9%~14%。图 6.59 描述了图象质量在各信噪比时 CABAC 节省码率的性能。 图 6.59 各测试序列中 CABAC 节省码率的性能 6.10 码率控制 在 H.264 视频编码标准中仅仅规定了编码后比特流的句法结构和解码器的结构,而对于编码器 的结构和实现模式没有具体的规定。然而无论编码器的结构如何,相应的视频编码的控制都是编码 器实现的核心问题。在对数字视频信号进行压缩编码时,编码器通过相应的编码控制算法以确定各 种编码模式,如宏块的划分类型、运动矢量以及量化参数等,已选定的各种编码模式进一步确定了 编码器输出比特流的比特率和失真度。 H.264 编码器采用了基于 Lagrangian 优化算法的编码控制模型,其编码性能相较于以往的所有 编码标准有了重大提高。 6.10.1 基于 Lagrangian 优化算法的 H.264 编码控制模型 视频编码的控制都是编码器实现的核心问题。由于视频序列中的图像内容随着空间与时间的不 同而变化很大,需要为图像的不同部分选择不同的编码参数进行压缩编码,而编码控制的目的就是 确定一组编码参数。H.264 编码器采用基于 Lagrangian 优化算法的率失真优化模型实现视频编码的 控制,其实现简单而且效率高。下面将分析 Lagrangian 优化算法及其在 H.264 视频编码控制中的应 用。 6.10.1.1 Lagrangian 优化算法 考虑K个信源样本值的集合S= (S1,…,SK),其中SK可以是矢量或标量。每一个样本值SK可以通过 选取编码模式集Ok= (Ok1,…,OkN)中的某些编码模式Ik(Ik O∈ k)进行压缩编码。因此对应于样本值集 合S存在相应的编码模式集合I= (I1,…,IK)。在给定的限定码率Rc下,对于给定信源样本序列所选的编 码模式,应使编码后的失真度最小,如(1)式所示。 ),(min ISD I cRISR ≤),( (6.42) (6.42)式中,D(S,I)与R(S,I)分别表示输出比特流的失真度和码率,其中比特流由采用编码模 式I对样本S进行编码并进行量化后输出。 在实际应用中,通常采用下式来选取编码模式。 )|,(minarg λISJI =∗ 其中 ),(),()|,( ISRISDISJ ×+= λλ (6.43) (6.43)式中λ是Lagrange参数。对于样本S及其选定的编码模式I,当其编码后得到的比特率和 失真度的线性组合J(S,I |λ)(Lagrangian代价函数)最小时,此时的编码模式是最优的。 考虑某一样本Sk,可认为其编码后的比特率和失真度仅与相应的编码模式Ik有关,因此有下面2 式成立。 )|,()|,( λλ kkk ISJISJ = (6.44) ∑∑ == = K k kkI K k kI ISJISJ 11 )|,(min)|,(min λλ (6.45) 因此,只要分别对每一个样本Sk S∈ 选择最优的编码模式,便可以很容易的得到J(S,I |λ)的最小值, 从而实现相应的编码控制。 6.10.1.2 编码控制模型 由于编码后比特流的比特率和失真度与时间和空间的关系密切,基于 Lagrangian 优化算法的编 码控制不可能在混合视频编码器中简单的实现。假设图像序列 s 被分割为 K 个不同的块 Ak,相应的 像素用 Sk 表示。编码 Sk 所选择的编码模式 Ok 分为帧内模式和帧间模式两类。每种模式均包括预测 编码的模式以及相应的编码参数,其中编码参数为变换系数和量化参数等,对于帧间模式编码参数 还应包括一个或多个运动矢量。在对图像序列 s 进行基于块的混合视频编码时,对于每块 Sk 所选定 的编码模式应当使编码后的 Lagrangian 代价函数 J(S,I |λ)达到最小,当且仅当此时认为基于块的混合 视频编码器达到最优化。 对帧间模式的选择,通常通过搜索使得编码后 Lagrangian 代价函数 J(S,I |λ)最小化的运动矢量实 现,相应的运动矢量作为编码参数被编码并传输。因此在编码控制模型中,宏块分割模式的判决与 帧间模式运动估计的最佳比特分配这两个问题将会被分别处理。 在 Lagrange 参数 λMODE 与量化参数 Q 选定后,H.264 的编码器通过最小化 Lagrangian 代价函数 实现对每一个宏块的编码模式的选定。宏块 Sk 的 Lagrangian 代价函数如(6.46)式所示。 )|,()|,(),|,( QISRQISDQISJ kkRECMODEkkRECMODEkkMODE ×+= λλ (6.46) Ik 为相应宏块的编码模式。 在不同编码模式下,编码后比特流的比特率 RREC 与失真度 DREC 的计算并不完全相同。在帧内模式 下,RREC(Sk,INTRA|Q)为熵编码后比特流的比特率,失真度 DREC(Sk,INTRA|Q)则由宏块的原始像素和 重建像素决定,且共有 2 种计算方式,分别如式(6.47)、(6.48)所示。 [ ]∑ ∈ ′−= Ayx tyxstyxsSSD ),( 2],,[,, (6.47) [ ]∑ ∈ ′−= Ayx tyxstyxsSAD ),( ],,[,, (6.48) 其中 A 为当前的宏块。 对于 SKIP 模式,由于无需残差信号,因此比特率 RREC(Sk,INTRA|Q)与失真度 DREC(Sk,INTRA|Q) 与量化参数无关。其中失真度 DREC(Sk,INTRA|Q)由宏块的原始像素值和预测像素值决定,而比特率 RREC(Sk,INTRA|Q)则在 H.264 中被近似为 1bit/MB。 在帧间模式下由于采用了基于块的运动估计,Lagrangian 代价函数的计算比较于帧内模式与 SKIP 模式要复杂。对于采用帧间编码模式的 A×B 大小的块 Si,在给定的 Lagrange 参数 λMOTION 和 参考图像 s′的情况下,通过最小化 Lagrangian 代价函数来实现块 Si 的运动估计,如式(6.49)所示。 {}),(),(minarg mSRmSDm iMOTIONMOTIONiDFD Mm i λ+= ∈ (6.49) 其中 M 为可能的编码模式的集合,RDFD (Si,m)为传输运动矢量(mx,my,mt)所需的比特数,失真度 DDFD 由式(6.50)或式(6.51)得到。 [][ ]∑ ∈ −−−′−= iAyx tyx mtmymxstyxsSSD ),( 2 ,,,, (6.50) [][ ]∑ ∈ −−−′−= iAyx tyx mtmymxstyxsSAD ),( ,,,, (6.51) 在运动估计时水平与垂直方向的搜索范围为±32 个整像素,并采用一帧或多帧参考图像。 为寻找满足式(6.49)要求的运动矢量 mt,首先在整像素位置进行运动估计的运算,求得满足 式(6.49)要求的运动矢量后,需进一步确定周围半像素位置的运动矢量是否可使 Lagrangian 代价 函数进一步降低。由于在 H.264 中采用了 1/4 像素的运动估计精度,之前确定的半像素周围 1/4 像素位置的运动矢量被进一步考察,以确定当采用此 1/4 像素精度的运动矢量后 Lagrangian 代价函 数是否获得进一步的降低。通过以上分析可知,最终选定使得 Lagrangian 代价函数最小的运动矢量 具有 1/4 像素精度。 同帧内模式相同,在帧间模式下比特率 RREC(Sk,INTER|Q)为熵编码后比特流的比特率,失真度 DREC(Sk,INTER|Q)则由宏块的原始像素和重建像素决定,由式(6.46)或式(6.47)得到。 在 H.264 视频编码控制模型中,λMODE 由量化参数确定,如式(6.52)所示。 3/)12(285.0 −×= Q MODEλ (6.52) 另一个 Lagrange 参数 λMOTION 与 λMODE 有关,由式(6.53)或式(6.54)确定。其中式(6.53) 对应于式(6.47)与式(6.50),式(13)对应于式(7)与式(10)。 MODEMOTION λλ = (6.53) MODEMOTION λλ = (6.54) 在 H.264 中,通常通过速率控制相关算法选择合适的量化参数,并通过相应的 Lagrange 参数进 行视频编码控制。 由上所述,H.264 视频编码器中的基于 Lagrangian 优化算法的编码控制模型可由图 6.60 表示。 图 6.60 H.264 视频编码控制模型 6.10.2 实验结果和性能分析 分别针对 H.264 在流媒体与视频会议中的应用进行实验。视频会议与流媒体应用的主要区别在 于,视频会议需要满足满足低时延和实时的要求,而流媒体的相关应用则侧重于图像细节的处理。 因此基于 H.264 编码标准的视频会议与流媒体应用所实现的编码器的构成区别很大。在合理的为两 种编码器选择编码工具的基础上,实现了基于 Lagrangian 优化算法的编码控制模型,并与其他编码 标准 MPEG-2,MPEG-4,H.263 的编码器的编码性能进行比较。 6.10.2.1 流媒体应用中的实验结果和性能分析 针对于流媒体应用,基于 H.264 测试模型 JM-61e 所实现的主档次(MP)编码器的构成特性如 表 6.18 所示,并在此基础上实现了基于 Lagrangian 优化算法的编码控制模型。考虑到流媒体应用的 特点,选取 4:2:0 CIF 格式标准测试序列 Mobile&Calendar 进行测试,输入帧频为 30f/s,长度为 8.33 秒。该视频序列具有复杂的运动和较高的空间色彩细节,适于测试流媒体应用中编码器的性能。 表 6.18 编码器的构成特性 运动估计中整像素搜索范围 ±32 熵编码方式 CABAC 参考帧数目 5 每一组图像序列的结构 IPBBP 在实验中,设定编码后帧率为 30f/s,实验结果如图 6.61 所示。其中在编码码率分别为 512Kbits /s,1024 Kbits/s 的条件下,得到相应输出比特率的码率和亮度色度分量的信噪比如表 6.19 所示。 为公平比较编码性能,在同样条件下对基于 H.263 HLP,MPEG2,MPEG4 ASP 编码标准的编码器 也进行了测试,相应的测试模型分别为 TMN-10,TM-5,VM-18。 图 6.61 流媒体应用中各编码器的性能比较 表 6.19 流媒体应用中各编码器的实验结果 序列编码码率 编码标准 输出码率 (Kbits/s) 亮度分量(Y) 信噪比(dB) 色度分量(U) 信噪比(dB) 色度分量(V) 信噪比(dB) 512Kbits/s MPEG2 H.263 HLP MPEG4 ASP H.264 MP 506.26 513.05 505.03 512.58 25.31 26.74 28.36 31.27 30.26 32.40 33.12 35.18 30.47 32.85 33.54 35.65 1024 Kbits/s MPEG2 H.263 HLP MPEG4 ASP H.264 MP 1029.58 1024.27 1029.18 1026.00 28.16 29.82 31.37 34.64 33.00 34.43 35.29 37.27 33.27 34.83 35.74 37.74 通过表 6.19 可知,实现了基于 Lagrangian 优化算法的编码控制模型的 H.264 编码器,其编码性 能也即输出亮度色度分量的信噪比相较于 MPEG4 ASP 提高了 1-3dB,相较于 H.263HLP 提高了 1-5dB,相较于 MPEG2 提高了 3-6dB。 6.10.2.2 视频会议应用中的实验结果和性能分析 针对于视频会议应用,基于 H.264 测试模型 JM-61e 所实现的基本档次(Baseline)编码器的构 成特性如表 6.20 所示,并在此基础上实现了基于 Lagrangian 优化算法的编码控制模型。考虑到视频 会议应用的特点,选取 4:2:0 CIF 格式标准测试序列 Paris 进行测试,输入帧频为 30f/s,长度为 10 秒。该视频序列中的物体几乎处于静止状态,适于测试视频会议应用中编码器的性能。 表 6.20 编码器的构成特性 运动估计中整像素搜索范围 ±32 熵编码方式 CAVLC 参考帧数目 5 每一组图像序列的结构 IPPPP 在实验中,设定编码后帧率为 15f/s,实验结果如图 3 所示。在编码码率为 128Kbits/s 的条件 下,得到相应输出比特率的码率和亮度色度分量的信噪比。为公平比较编码性能,在同样条件下对 基于 H.263 Baseline,H.263 CHC,MPEG4 SP 编码标准的编码器也进行了测试,相应的测试模型分 别为 TMN-10,TMN-10,VM-18。 图 6.62 视频会议应用中各编码器的性能比较 表 6.21 视频会议应用中各编码器的实验结果 序列编码码率 编码标准 输出码率 (Kbits/s) 亮度分量(Y) 信噪比(dB) 色度分量(U) 信噪比(dB) 色度分量(V) 信噪比(dB) 128Kbits/s H.263Baseline H.263 CHC MPEG4 SP H.264Baseline 127.38 128.29 127.95 128.52 28.30 29.34 29.18 30.81 33.30 35.56 33.59 35.80 33.84 36.32 34.25 36.18 通过表 6.21 可知,实现了基于 Lagrangian 优化算法的编码控制模型的 H.264 编码器,其编码性 能也即输出亮度色度分量的信噪比相较于 MPEG4 提高了 1-2dB,相较于 H.263 Baseline 提高了 1-3dB。 以上两个实验结果证实:实现了基于 Lagrangian 优化算法的编码控制模型的 H.264 编码器,其 编码性能相较于以往的所有编码标准有了重大提高,并在流媒体及视频会议等视频应用中显示出了 巨大潜力。 6.11 去方块滤波 H.264/MPEG-4 AVC 视频编码标准中,在编解码器反变换量化后图像会出现方块效应。其产生 的原因有两个。最重要的一个原因是基于块的帧内和帧间预测残差的 DCT 变换。变换系数的量化过 程相对粗糙,因而反量化过程恢复的变换系数带有误差,会造成在图像块边界上的视觉不连续。第 二个原因来自于运动补偿预测。运动补偿块可能是从不是同一帧的不同位置上的内插样点数据复制 而来。因为运动补偿块的匹配不可能是绝对准确的,所以就会在复制块的边界上产生数据不连续。 当然,参考帧中存在的边界不连续也被复制到需要补偿的图像块内。尽管 H.264/MPEG-4 AVC 采用 较小的 4×4 变换尺寸可以降低这种不连续现象,但仍需要一个去方块滤波器以最大程度提高编码性 能。 在视频编解码器中加入去方块滤波器的方法有两种:后置滤波器和环路滤波器。后置滤波器只 处理编码环路外的显示缓冲器中的数据,所以它不是标准化过程中的规范内容,在标准中只是可选 项。相反,环路滤波器处理编码环路中的数据。在编码器中,被滤波的图像帧作为后续编码帧运动 补偿的参考帧;在解码器中,滤波后的图像输出显示。这要求所有与本标准一致的解码器采用同一 个滤波器以与编码器同步。当然如果有必要,解码器也还可以在使用环路滤波器的同时使用后置滤 波器。 在编码环路中使用滤波器比后置滤波有几点优点。首先,环路滤波器可以保证不同水平的图像 质量。其次,在解码器端没有必要再为滤波器准备额外帧缓存。第三,经验试验已显示环路滤波比 后置滤波更能增加视频流的主客观质量,同时有效降低解码器的复杂度。 尽管有以上这些优点,环路滤波器的复杂度还是较高的。即使经过很大努力进行滤波算法的时 间优化,去除其中的乘除法,滤波器也轻易地达到解码器计算复杂度的三分之一。 高复杂度的主要原因是滤波器的高度自适应性,它需要对方块边界及样点量化值进行条件判断 和处理。这样,在算法的主要内部循环中不可避免地出现条件分支。众所周知,这是很耗时的。另 一个高复杂度的原因是 H.264 中编码算法中残差编码的尺寸。对于 4×4 的方块大小及平均在每个方 向上滤波 2 个点,这样几乎图像中每个点都要被调入到内存中,要么被修正,要么用来判断边界点 是否要被修正。而对 H.263 环路滤波器或任何 MPEG-4/H.263 后置滤波器来说不是这样的,因为它 们对 8×8 方块进行操作。 下面介绍的自适应去方块滤波器利用简单的算法可靠地提高图像的主客观质量。其较好的性能 是因为可靠地区分了真实的和人为的图像边界,并有效地滤除后者。在相同的 PSNR 下可以节省码 流超过 9%,并同时明显地提高图像视觉质量。因为去方块滤波在 H.265 编码器和解码器中的作法是 一致的,所以在第八章解码器中就不再赘述。 6.11.1 去方块滤波基本概念 图 6.63(a)显示不采用去方块滤波器的编解码器的效果图。基于上述原因,图中在 DCT 变换边界 上有明显的痕迹,呈现出方块形状。图 6.63b)则是采用去方块滤波器的编解码器对同一幅图像的处 理效果图。图(a)中的方块已不明显了。 显然,去方块滤波器的作用是去除 H.264 编解码算法带来的方块效应。但是,如果在 DCT 边界 上,正好是图像的边界,如家具边等,若不加以判断而误认为是方块效应,则可能造成新的误差。 为此,在滤波方块效应时,应该先判断该边界是图像真实边界还是方块效应所形成的边界(假边界)。 对真实边界不进行滤波处理,而对假边界则要根据周围图像块的性质和编码方法采用不同强度的滤 波。 (a) (b) 图 6.63 不采用(a)和采用(b)去方块滤波器的 H.264 编解码器的效果 6.11.2 边界分析 6.11.2.1 4×4 方块的误差分析 当对残差用方块变换进行编码时,方块边界比内部的编码误差大。对这个现象的合理解释是内 部点的重建是对周围点进行加权平均得到。而边界点所用到的加权平均点较少,所以重建效果较差。 这个误差分布不均匀的后果是需要方块边界滤波以提高图像客观质量。 H.264/MPEG-4 AVC 去方块滤波器能适应以下不同水平的需要: • 片级,全局滤波强度能根据视频序列个体特征进行调节。 • 图像块边界级,滤波强度依赖于边界两边图像块的帧间/帧内预测、运动矢量差别及变换量化 是否是对残差编码的。特别强的滤波应用于非常平坦的图像宏块以去除“马赛克效应”。 • 图像样点级,样点值及与量化参数相关的阈值可以决定是否对每个样点进行滤波。 下面将讨论 H.264/MPEG-4 AVC 去方块滤波器如何根据这些自适应性设计的细节。 6.11.2.2 自适应边界级滤波器 边界强度(Bs)决定去方块滤波器选择滤波参数,控制去除方块效应的程度。对所有 4×4 亮度 块间的边界,边界强度参数值在 0 到 4 之间,它与边界的性质有关。表 6.22 说明 Bs 与相邻图像块 的模式及编码条件的关系。表中的条件是从表的上部至下部进行判断的,直到某一条件满足,给 Bs 相应赋值。 表 6.22 滤波器强度参数与编码模式的关系 图像块模式与条件 Bs 边界两边一个图像块为帧内预测并且边界为宏块边界 4 边界两边一个图像块为帧内预测 3 边界两边一个图像块对残差编码 2 边界两边图像块运动矢量差不小于 1 个亮度图像点距离 1 边界两边图像块运动补偿的参考帧不同 1 其它 0 在实际滤波算法中,Bs 决定对边界的滤波强度,包括对两个主要滤波模式的选择。当其值为 4 时表示要用特定最强的滤波模式,而其值为 0 表示不需要对边界进行滤波。对其值为 1 到 3 的标准 滤波模式,Bs 值影响滤波器对样点的最大修正程度。Bs 值的下降趋势说明最强的方块效应主要来自 于帧内预测模式及对预测残差编码,而在较小程度上与图像的运动补偿有关。 色度块边界滤波的 Bs 值不另外单独计算,而是从相应亮度块边界的 Bs 值复制而来。 在帧场自适应宏块中,表 6.22 中的条件相对复杂些,因为相邻两图像块中的一个可能来自帧编 码宏块或来自场编码宏块。滤波强度变化的原则不变。为了避免将图像过度模糊化,对于来自场编 码宏块的水平边界需要特别考虑以避免过强的滤波强度,这是因为这种宏块的垂直滤波的空间扩展 范围是其它情况的两倍。 6.11.2.3 自适应样点级滤波器 在去方块滤波中,非常重要的是要区分图像中的真实边界和由 DCT 变换系数量化而造成的假边 界。为了保持图像的逼真度,应该尽量滤除假边界以不致被看出的同时保持图像真实边界不被滤波。 为了区分这两种情况,要分析每个需要被滤波的边界两边的样点值。这里,定义两个相邻 4×4 块中一条直线上的样点为 p3、p2、p1、p0、q0、q1、q2、q3,实际的图像边界在 p0 和 q0 之间,如图 6.64 所示。 图 6.64 典型的不需要去方块滤波的图像边界 如上小节所述,当 Bs 值为 0 时,滤波器对边界不起作用。对于 Bs 值为非 0 的边界,为区分上 述真假两种边界,定义一对与量化有关的参数,为α和β,用来检查图像内容,以决定每个样本点集 是否要被滤波。只有下述三个条件同时满足,直线上的样点才被滤波: ⏐p0 − q0⏐ < α (IndexA) (6.55) ⏐p1 − p0⏐ < β (IndexB) (6.56) ⏐q1 − q0⏐ < β (IndexB) (6.57) α和β值根据边界两边的平均量化参数查表得到, α和β的查表指数根据下式计算: ⎪⎩ ⎪⎨ ⎧ ≥+ <+<+ ≤+ = 5151 510 00 A AA A A OffsetQP OffsetQPOffsetQP OffsetQP Index (6.58) ⎪⎩ ⎪⎨ ⎧ ≥+ <+<+ ≤+ = 5151 510 00 B BB B B OffsetQP OffsetQPOffsetQP OffsetQP Index (6.59) 其中,0 到 51 为 QP 的范围。OffsetA 和 OffsetB 为在编码器中选择的偏移值,以在片级上控制去方块 滤波的性能。 α和β值满足下面近似经验关系: )12(8.0)( 6/ −=α xx (6.60) β (x) =0.5x − 7 (6.61) 这个关系式中的变量是根据测试进行选择的,让不同的内容得到满意的视觉效果。一般来说β (x)比α (x)小。为了节省计算量,α和β值通过查找与上式关系一致的表格得到,如表 6.23。特别地,在表格 低端,取值被限为 0,这样对 IndexA<16 或 IndexB<16,α和β中的一个或两个全部为 0,相应地不进 行滤波。 p3 p2 p1 p0 q3q2q1 q0 表 6.23 阈值变量α和β与变量 indexA 和 indexB 的关系 IndexA(对应α)或者indexB(对应β) <16 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 α 0 4 4 5 6 7 8 9 10 12 13 15 17 20 22 25 28 32 36 40 45 50 β 0 2 2 2 3 3 3 34446677889 9 10 10 11 IndexA(对应α)或者indexB(对应β) 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 α 56 63 71 80 90 101 113 127 144 162 182 203 226 255 255 β 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 α和β与 QP 的关系将滤波强度与滤波前重建的图像一般质量联系起来。因为阈值随 QP 增加, 当 QP 较大时,含有较多内容活性的边界需要被滤波,这是由于编码误差随 QP 增加。α中的指数特 性反映期望的方块效应与α的关系,因为 QP 每增加 6 则量化步长增加一倍。 6.11.2.4 自适应片级滤波器 在片级上,编码器可以选择偏移(OffsetA 和 OffsetB)来调整滤波器中的α和β值,相对于 0 偏移 增加或减少滤波强度。偏移值在图像片头通过句法元素传输,应用于根据 QP 值查表求α和β值,如 式(6.60)和(6.61)。 利用传递非 0 偏移控制去方块滤波性能,使解码器设计者可以优化解码视频质量,获得比默认 表(当偏移为 0 时)效果好的图像。例如,通过传递负的偏移以减少滤波强度,可以有助于小的空 间细节的逼真度,特别是高分辨率的视频内容,因为这时小的方块效应不容易被觉察。相反,采用 正的偏移以增加滤波强度,可以去除默认表所不能滤除的方块效应,增加图像主观质量。这有助于 平滑过渡的低分辨率内容的亮度块情况,去除可能由次优的运动估计、模式选择或残差编码引起的 额外方块。 6.11.3 滤波过程 6.11.3.1 滤波运算概述 为了保证编码器和解码器中的滤波过程完全一致,对每个编码图像的滤波运算必需按规定顺序 进行。滤波应该在适当位置上进行,这样边界两边直线上修改过的样点值作为后续运算的输入值而 不引入的误差。 滤波是基于宏块基础上的,先对垂直边界进行水平滤波,再对水平边界进行垂直滤波。对宏块 的两个方向滤波都完成后才能进行后面宏块的滤波。对图像中宏块的滤波按 raster 扫描方式进行。 对帧场自适应编码帧,它们在垂直方向上相邻的宏块对放在一起,则滤波顺序按宏块对进行,即在 帧中对宏块对进行按 raster 扫描方式,对每个宏块对先进行顶部宏块的滤波。 对每个亮度宏块,先滤波宏块最左边的边界(如图 6.65 中的 a),然后依次从左到右宏块内三个 垂直边界(如图 6.65 中的 b 到 d)。类似的,对水平边界先滤波宏块顶部的边界(如图 6.65 中的 e), 然后依次从上到下宏块内三个水平边界(如图 6.65 中的 f 到 h)。色度滤波次序类似,对 8×8 的色度 宏块,在每个方向上,先滤波宏块外部边界再滤波一个内部边界(如在图 6.65 中,水平方向先滤波 i,再滤波 j;垂直方向上先滤波 k,再滤波 l)。 16×16 亮度 8×8 色度 图 6.65 宏块中边界滤波顺序 根据样点集的 Bs 值选择两种滤波方式。特定滤波方式是针对 Bs 为 4 的强滤波,普通滤波方式 应用于其它情况(Bs=1,2,3)。 对每种方式,用β阈值估计另外两个空间变化条件,以决定亮度点的滤波范围。 ⏐p2 − p0⏐ < β (IndexB) (6.62) ⏐q2 − q0⏐ < β (IndexB) (6.63) 当上述条件成立,说明边界变化强度不大,滤波强度设定值相对实际滤波来说偏大。 6.11.3.2 Bs 值从 1 到 3 的边界滤波 滤波运算可以分为基本滤波运算和限幅两个阶段。 (1) 基本滤波运算 先讨论对亮度点的滤波。对这种模式的滤波,滤波后的 p0’和 q0’值按下式计算: p0’= p0 + Δ0 (6.64) q0’= q0 − Δ0 (6.65) 其中Δ0 分两步计算,先计算它的初始值Δ0i,再对这个初始值进行限幅后代入上式。 初始值Δ0i 根据边界两边的样点值计算: Δ0i = (4(q0 − p0) + (p1 − q1) + 4) >> 3 (6.66) 计算 p0’的脉冲响应运算为(1,4,4,-1)/8。 只有式(6.62)或(6.63)成立,才修正对应 p1 或 q1 值。即如果式(6.62)成立,滤波后的 p1’值按下式 计算: p1’= p1 + Δp1 (6.67) 同样,如果式(6.63)成立,滤波后的 q1’值按下式计算: q1’= q1 + Δq1 (6.68) 这些同样要经过两步计算。对 p1’的初始值Δ按下式计算: Δp1i = (p2+ ((p0+q0+1)>>1) −2 p1) >> 1 (6.69) Δq1i 按同样关系式计算,用 q2 和 q1 分别代替 p2 和 p1。上式相应的脉冲响应为(1,0,0.5,-0.5) /2,具有很强的低通特性。 (2) 限幅 如果上述初始值Δ0i、Δp1i 和Δq1i 直接应用在滤波计算中,则可能导致滤波频率过低,出现图像模 糊。自适应滤波器的一个重要部分是限制Δ的值。这个过程称为限幅。对于内部和边界上的样点,限 a b c d e f g h i j k l 幅过程不同。 对于内部样点,用于滤波的Δ值被限制在−c1 到 c1 范围内,c1 是从二维表(表 6.24)中查找的参 数,它是根据用于计算α的 IndexA 和 Bs 查找。IndexA 和 Bs 越大,则 c1 也越大,允许更强的滤波。最 终对 p1 和 q1 滤波的限幅值为: ⎪⎩ ⎪⎨ ⎧ ≥Δ <Δ<−Δ −≤Δ− =Δ 111 1111 111 1 cc cc cc ip ipip ip p (6.70) ⎪⎩ ⎪⎨ ⎧ ≥Δ <Δ<−Δ −≤Δ− =Δ 111 1111 111 1 cc cc cc iq iqiq iq q (6.71) 对于滤波边界 p0 和 q0 样点, Δ0i 的限幅值由 c1 和式(6.62)或(6.63)决定。先将它的限幅值 c0 定为 c1。 如果式(6.62 或(6.63)都成立,说明边界两边内部的变化强度小于β阈值,需要对边界进行更强的滤波 (同时如上述需要对 p1 和/或 q1 样点进行修正),c0 将增加 1。这样对边界样点的修正值为: ⎪⎩ ⎪⎨ ⎧ ≥Δ <Δ<−Δ −≤Δ− =Δ 000 0000 000 0 cc cc cc i ii (6.72) 对色度点滤波,只有 p0 和 q0 才被修正。滤波方法与亮度点一样,只是限幅值 c0 为 c1 加 1。这样 对 Bs 小于 4 的边界没有必要对色度的式(6.62)或(6.63)进行估计,也不必存取变量 p2 和 q2 值。 表 6.24 滤波限幅变量 c1 值与 indexA 和 Bs 的关系 IndexA <17 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 Bs=1 0 0 0 0 0 0 0 1111111111 2 2 2 2 Bs=2 0 0 0 0 0 1 1 1111111122 2 2 3 3 Bs=3 0 1 1 1 1 1 1 1111222233 3 4 4 4 IndexA 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 Bs=1 3 3 3 44 4 5 66789101113 Bs=2 3 4 4 5 5 6 7 8 8 10 11 12 13 15 17 Bs=3 5 6 6 7 8 9 10 11 13 14 16 18 20 23 25 6.11.3.3 Bs 值为 4 的边界滤波 H.264/MPEG-4 AVC 的帧内编码在对同一图像区域编码时倾向采用 16×16 亮度预测模式。这会 在宏块边界引起小幅度的方块效应。但是由于 Mach band 效应,在这种情况下,即使是很小的强度 值差别在视觉上的感觉是陡峭的阶梯。为了消除这种马赛克效应,需要在图像内容平滑的两个宏块 边界采用较强的滤波器。 对亮度滤波,根据图像内容判断选择较强的 4 拍或 5 拍滤波器,还是较弱的 3 拍滤波器。4 拍 或 5 拍滤波器对边界两边的边界点及两个内部点进行修正,而 3 拍滤波器仅改变边界点。只有下面 的跨边界差异的约束条件成立才使用较强的滤波器: ⏐p0 − q0⏐ < (α>>2) +2 (6.73) 注意,式(6.73)与式(6.53)很相似,只是它跨边界的最大样点值差异的约束很严格。 对亮度滤波,当式(6.62)和(6.73)都成立,根据下式计算滤波后的样点值: p0’ = (p2 + 2p1 + 2p0 + 2q0 + q1 + 4) >> 3 (6.74) p1’ = (p2 + p1 + p0 + q0 + 2) >> 2 (6.75) p2’ = (2p3 + 3p2 + p1 + p0 + q0 + 4) >> 3 (6.76) 否则,对色度点或当式(6.62)和(6.73)中只要有一个不成立的亮度点,只根据下式修正 p0: p0’ = (2p1 + p0 + q1 + 2) >> 2 (6.77) q 点值的修正方法相同,只是在选择亮度滤波器时用式(6.63)代替式(6.62)。 6.12 其余特征 6.12.1 参考图像管理 H.264 中,已编码图像存储在编码器和解码器的参考缓冲区(DPB,解码图像缓冲区),并有相 应的参考图像列表 list0,以供帧间宏块的运动补偿预测使用。对 B 片预测而言,list0 包含当前图像 的前面和后面两个方向的图像,并以显示次序排列;也可同时包含短期和长期参考图像。这里,已 编码图像由编码器重建的标为短期图像或刚刚编码图像,并由其帧号标定。长期参考图像是较早的 图像,由 LongTermPicNum 标定,保存在 DPB 中,直到被代替或删除。 当一幅图像在编码器被编码重建或在解码器被解码时,它存放在 DPB 并标定为以下中的一种: 1)“非参考”,不用于进一步的预测;2)短期参考图像;3)长期参考图像;4)直接输出显示。list0 中短期参考图像是按 PicNum(由帧号推出的变量)从高到低的顺序排列,长期参考图像按 LongTermPicNum 从低到高的顺序排列。当新的图像加在短期列表的位置 0 时,剩余的短期图像索 引号依次增加。当短期和长期图像号达到参考帧最大数时,最高索引号的图像被移出缓冲区,即实 行滑动窗内存控制。该操作使得编码器和解码器保持 N 幅短期参考图像,包括一幅当前图像和(N-1) 幅已编码图像。 由编码器发送的自适应内存控制命令用来管理短期和长期参考图像索引。这样,短期图像才可 能被指定长期帧索引,短期或长期图像才可能标定为“非参考”。编码器从 list0 中选择参考图像,进 行帧间宏块编码。而该参考图像的选择由索引号标志,索引 0 对应于短期部分的第一帧,长期帧索 引开始于最后一个短期帧。 参考图像缓冲区通常由编码器发送的 IDR(瞬时解码器刷新)编码图像刷新,IDR 图像一般为 I 片或 SI 片。当接受到 IDR 图像时,解码器立即将缓冲区中的图像标为“非参考”。后继的片进行无 图像参考编码。通常,编码视频序列的第一幅图像都是 IDR 图形。 6.12.2 重排序 在编码器中,每个已量化变换系数的 4×4 块以图 6.66 所示的 zig-zag 顺序映射为一个 16 元素的 矩阵。在 16×16 帧内模式编码的宏块中,每个 4×4 亮度块的 DC 系数首先以图 6.66 所示的顺序扫描。 剩余的 15 个 AC 系数从第二个位置开始扫描。类似的,色度的 2×2DC 系数以光栅顺序首先扫描, 剩余的 15 个 AC 系数从从第二个位置开始扫描。 图 6.66 zig-zag 扫描(帧模式) 6.12.3 隔行视频 效率高的隔行视频编码工具应该能优化场宏块的压缩。如果场编码被支持,图像的类型(场或 帧)在片头中表示。H.264 采用宏块自适应帧场编码(MB-AFF)模式中,帧场编码的选择在宏块级 中指定。且当前片通常是 16 亮度像素宽和 32 亮度像素高的单元组成,并以宏块对的形式编码,如 图 6.67 所示。编码器可按两个帧宏块或者两个场宏块来编码每个宏块对,也可根据图像每个区域选 择最佳编码模式。 帧模式 场模式 图 6.67 宏块自适应帧场编码 显然,以场模式编码片或宏块对须对编解码的一些步骤进行调整。比如,P 片和 B 片预测中, 每个编码场作为一个独立的参考图像;帧内宏块编码模式和帧间宏块 MV 的预测需根据宏块类型(帧 还是场)进行调整;图 6.67 所示的重排序扫描也须按图 6.68 所示的顺序进行。 图 6.68 zig-zag 扫描(场模式) 6.12.4 数据分割片 组成片的编码数据存放在 3 个独立的 DP(数据分割,A、B、C)中,各自包含一个编码片的子 集。分割A包含片头和片中每个宏块头数据。分割B包含帧内和 SI 片宏块的编码残差数据。分割 C 包含帧间宏块的编码残差数据。每个分割可放在独立的 NAL 单元并独立传输。 如果分割 A 数据丢失,便很难或者不能重建片,因此分割 A 对传输误差很敏感。解码器可根据 要求只解 A 和 B 或者A和 C,以降低在一定传输条件下的复杂度。 6.12.5 H.264 传输 H.264 的编码视频序列包括一系列的 NAL 单元,每个 NAL 单元包含一个 RBSP。如表 6.25 所 示。编码片(包括数据分割片和 IDR 片)和序列 RBSP 结束符被定义为 VCL NAL 单元,其余的为 NAL 单元。典型的 RBSP 单元序列如图 6.69 所示。每个单元都按独立的 NAL 单元传送。NAL 单元 的头信息(一个字节)定义了 RBSP 单元的类型,NAL 单元的其余部分则为 RBSP 数据。 图 6.69 RBSP 序列举例 表 6.25 RBSP 描述 RBSP 类型 描 述 参数集 PS 序列的全局参数,如图像尺寸、视频格式等等 增强信息 SEI 视频序列解码的增强信息 图像定界符 PD 视频图像的边界 编码片 片的头信息和数据 数据分割 DP 片层的数据,用于错误恢复解码 序列结束符 表明下一图像为 IDR 图像 流结束符 表明该流中已没有图像 填充数据 哑元数据,用于填充字节 1)参数集 H.264 引入了参数集的概念,每个参数集包含了相应的编码图像的信息。序列参数集 SPS 包含 的是针对一连续编码视频序列的参数,如标识符 seq_parameter_set_id、帧数及 POC 的约束、参考帧 数目、解码图像尺寸和帧场编码模式选择标识等等。图像参数集 PPS 对应的是一个序列中某一幅图 像或者某几幅图像 ,其参数如标识符 pic_parameter_set_id、可选的 seq_parameter_set_id、熵编码模 式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等等。 通常,SPS 和 PPS 在片的头信息和数据解码前传送至解码器。每个片的头信息对应一个 pic_parameter_set_id,PPS 被其激活后一直有效到下一个 PPS 被激活;类似的,每个 PPS 对应一个 seq_parameter_set_id,SPS 被其激活以后将一直有效到下一个 SPS 被激活。 参数集机制将一些重要的、改变少的序列参数和图像参数与编码片分离,并在编码片之前传送 至解码端,或者通过其他机制传输。 2)NAL 单元传输和存储 H.264 标准并未定义 NAL 单元的传输方式,但实际中根据不同的传输环境其传输方式还是存在 一定的差异。如在包传输网络中,每个 NAL 单元以独立的包传输,在解码之前进行重新排序。在电 路交换传输环境中,传输之前须在每个 NAL 单元之前加上起始前缀码,使解码器能够找出 NAL 单 元的起始位置。 在一些应用中,编码视频需要和音频及相关信息一起传输存储,这就需要一些机制来实现,目 前通常用的是 RTP/UDP 协议协同实现。MPEG-2 System 部分的一个改进版本规定了 H.264 视频传 输机制,ITU-T H.241 定义了用 H.264 连接 H.32*多媒体终端。对要求视频、音频及其他信息一起存 储流媒体回放、DVD 回放等应用,将推出的 MPEG-4 System 改进版本定义了 H.264 编码数据和相 关媒体流是如何以 ISO 的媒体文件格式存储的。 H.264 提供了许多优化视频编码压缩的机制,并希望能够满足多种媒体通信应用。相对 MPEG-4 来说,H.264 编码工具有一定的限制,但仍可选择多种编码参数和档次。H.264 实际应用是否成功取 决于编解码器的设计和编码参数的选择。 参考文献 1. T. Wiegand, G. J. Sullivan, G. Bjøntegaard, and A. Luthra, “Overview of the H.264/AVC Video Coding Standard,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 560–576, July 2003. 2. S. Wenger, “H.264/AVC over IP,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 645–656, July 2003. 3. T. Stockhammer, M. M. Hannuksela, and T. Wiegand, “H.264/AVC in wireless environments,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 657–673, July 2003. 4. T. Wedi, “Motion compensation in H.264/AVC,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 577–586, July 2003. 5. M. Flierl and B. Girod, “Generalized B pictures and the draft JVT/H.264 video compression standard,” IEEE Trans. Circuits Syst. Video Technol.,vol. 13, pp. 587–597, July 2003. 6. T. Wiegand, H. Schwarz, A. Joch, F. Kossentini, and G. J. Sullivan, “Rate-constrained coder control and comparison of video coding standards,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 688–703, July 2003. 7. Schafer Ralf, Wiegand Thomas, Schwarz Heiko. “The emerging H.264/AVC Standard EBU Technical Review”, Jan.2003 8. M. Karczewicz and R. Kurçeren, “The SP and SI frames design forH.264/AVC,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 637–644, July 2003. 9. H. Malvar, A. Hallapuro, M. Karczewicz, and L. Kerofsky, “Low-Complexity transform and quantization in H.264/AVC,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 598–603, July 2003. 10. P. List, A. Joch, J. Lainema, G. Bjøntegaard, and M. Karczewicz, “Adaptive deblocking filter,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 614–619, July 2003. 11. J. Ribas-Corbera, P. A. Chou, and S. Regunathan, “A generalized hypothetical reference decoder for H.264/AVC,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 674–687, July 2003. 12. Mathias Wien, “Variable Block-Size Transforms for H.264/AVC” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 604–613, July 2003. 13. Michael Horowitz, Anthony Joch, Faouzi Kossentini,“H.264/AVC Baseline Profile Decoder Complexity Analysis” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 704–716, July 2003. 14. T. Wiegand and G. J. Sullivan, “Draft ITU-T Recommendation H.264 and Final Draft International Standard of Joint Video Specification (ITU-T Recommendation H.264 | ISO/IEC 14496-10 AVC)”, Joint Video Team of ISO/IEC JTC1/SC29/WG11 and ITU-T SG16/Q.6 Doc. JVT-G050, Pattaya, Thailand, Mar. 2003. 15. JVT Document JVT-C028 G .Bjontegarrd and K.Lillevold, ”Context –adaptive VLC Coding of Coefficients ”,Fairfax , VA, MAY 2002 16. Yao Wang, Jorn Ostermann, Ya-qin Zhang . 视频处理与通信 . 北京:电子工业出版社 . 2003。 17. X. L. Ce Zhu, and Lap-Pui Chau. Hexagon-Based Search Pattern for Fast Block Motion Estimation, IEEE Trans. on CSVT, vol. Vol.12, 2002: 349-355. 18. Ghanbari, M. The cross-search algorithm for motion estimation, Communications, IEEE Transactions on, Volume: 38 Issue:7, July 1990: 950-953. 19. Chang, Y.-C., D. G. Messerschmitt, T. Carney, and S. A. Klein. Delay cognizant video coding: architecture, applications, and quality evaluations. Forthcoming in IEEE Trans. Image Processing. 20. Iain E. G. Richarson. H.264 and MPEG-4 Video Compression. Aberdeen, UK. 2003. 21. Joint Model for Non-normative Aspects of Advanced Video Coding. Study of ISO/IEC 14496-6 / PDAM6: 2003 (E). 22. 陈志波 . H.264运动估值与网络视频传输关键问题研究,清华大学,毕业论文,2002. 23. 王汇源 . 数字图像通信原理与技术 . 北京:国防工业出版社,2000:89-92 24. 丁贵广,计文平,郭宝龙 ,Visual C++6.0 数字图像编码 ,机械工业出版社,2004。 25. 朱秀昌,刘峰,胡栋,数字图像处理与图像通信,北京邮电大学出版社,,2002。 26. Marta KarczewiczThe. SP- and SI- Frames Design for H.264/AVC. IEEE Trans. Circuits and Systems for Video Technology, Vol 13, No.7, July 2003 27. TML 8.7 Software ftp://standard.pictel.com/video/h26l/ 28. 万萍,陈仁雷,王海婴,H.264/AVC中的SP/SI帧技术,电视技术,2004.1,p22-25 第 7 章 H.264 的句法和语义 7.1 句法 在编码器输出的码流中,数据的基本单位是句法元素,每个句法元素由若干比特组成,它表示 某个特定的物理意义,例如:宏块类型、量化参数等。句法表征句法元素的组织结构,语义阐述句 法元素的具体含义。所有的视频编码标准都是通过定义句法和语义来规范编解码器的工作流程。 7.1.1 句法元素的分层结构 编码器输出的比特码流中,每个比特都隶属某个句法元素,也就是说,码流是由一个个句法元 素依次衔接组成的,码流中除了句法元素并不存在专门用于控制或同步的内容。在 H.264 定义的码 流中,句法元素被组织成有层次的结构,分别描述各个层次的信息。图 7.1 表现了这种结构。 图 7.1 句法元素的分层结构 句法元素的分层结构有助于更有效地节省码流。例如,在一个图像中,经常会在各个片之间有 相同的数据,如果每个片都同时携带这些数据,势必会造成码流的浪费。更为有效的做法是将该图 像的公共信息抽取出来,形成图像一级的句法元素,而在片级只携带该片自身独有的句法元素。在 H.264 中,句法元素共被组织成 序列、图像、片、宏块、子宏块五个层次。 H.264 的分层结构是经过精心设计的,与以往的视频编码标准相比有很大的改进,这些改进主 要针对传输中的错误掩藏,在有误码发生时可以提高图像重建的性能。在以往的标准中,分层的组 织结构如图 7.2,它们如同 TCP/IP 协议的结构,每一层都有头部,然后在每层的数据部分包含该层 的数据。 图 7.2 以往标准中句法元素的分层结构 在这样的结构中,每一层的头部和它的数据部分形成管理与被管理的强依赖关系,头部的句法 元素是该层数据的核心,而一旦头部丢失,数据部分的信息几乎不可能再被正确解码出来。尤其在 序列层及图像层,由于网络中 MTU(最大传输单元)大小的限制,不可能将整个层的句法元素全部 放入同一个分组中,这个时候如果头部所在的分组丢失,该层其他分组即使能被正确接收也无法解 码,造成资源浪费。 图 7.3 H.264 中句法元素的分层结构 在 H.264 中,分层结构最大的不同是取消了序列层和图像层,并将原本属于序列和图像头部的 大部分句法元素游离出来形成序列和图像两级参数集,其余的部分则放入片层。参数集是一个独立 的数据单位,不依赖于参数集外的其他句法元素。图 7.3 描述了参数集与参数集外句法元素的关系, 在图中我们可以看到,参数集只是在片层句法元素需要的时候被引用,而且,一个参数集并不对应 某个特定的图像或序列,同一个序列参数集可以被多个序列中的图像参数集引用,同理,同一个图 像参数集也可以被多个图像引用。只在编码器认为需要更新参数集的内容时,才会发送出新的参数 集。在这种机制下,由于参数集是独立的,可以被多次重发或者采用特殊技术加以保护。 在图 7.3 的描述中,参数集与参数集外部的句法元素处于不同信道中,这是 H.264 的一个建议, 我们可以使用更安全但成本更昂贵的通道来传输参数集,而使用成本低但不够可靠的信道传输其他 句法元素,只需要保证片层中的某个句法元素需要引用某个参数集时,那个参数集已经到达解码器, 也就是参数集在时间上必须先被传送。当然,在条件不允许的情况下,我们也可以采用妥协的办法: 在同一个物理信道中传输所有的句法元素,但专门为参数集采用安全可靠的通信协议,如 TCP。当 然,H.264 也允许我们为包括参数集在内的所有句法元素指定同样的通信协议,但这时所有参数集 必须被多次重发,以保证解码器最终至少能接收到一个。在参数集和片使用同个物理信道的情况下, 图 7.3 中的信道 1 和信道 2 应该被理解为逻辑上的信道,因为从逻辑上看,参数集与其它句法元素 还是处于各自彼此独立的信道中。 H.264 在片层增加了新的句法元素指明所引用的参数集的编号,同时因为取消了图像层,片成 为了信道 2 中最上层的独立的数据单位,每个片必须自己携带关于所属图像的编号、大小等基本信 息,这些信息在同一图像的每个片中都必须是一致的。在编码时,H.264 的规范要求将参数集、片 这些独立的数据单位尽可能各自完整地放入一个分组中被传送。 从表面上看来,H.264 关于参数集和片层的结构增加了编码后数据的冗余度(比如参数集必须 多次重发,又如每个片都必须携带一部分相同的关于整个图像的信息,而这些数据完全是重复的), 降低了编码效率,但这些技术的采用使得通信的鲁棒性大大增强,当数据传输中出现丢包,能够将 使错误限制在最小范围,防止错误的扩散,解码后对错误的掩藏和恢复也能起到很好的作用。 一个 片的丢失将不会影响其它片的解码,还可以通过该片前后的片来恢复该片的数据。 H.264 片层以下的句法元素的结构大体上和以往标准类似,但在相当多的细节上有所改进,所 有的改进的目的不外乎两个:在错误发生时防止错误扩散、减少冗余信息提高编码效率。这两者往 往是矛盾的,H.264 在这两者上的取舍显得颇具匠心,读者在 7.3 语义一节及第八章解码器原理中将 会深刻体会到这些。 图 7.3 所示的码流的结构是一种简化的模型,这个模型已经能够正确工作,但还不够完善,不 适合复杂的场合。在复杂的通信环境中,除了片和参数集外还需要其他的数据单位来提供额外的信 息。图 7.4 描述了在复杂通信中的码流中可能出现的数据单位。如前文所述,参数集可以被抽取出 来使用其它信道。 图 7.4 H.264 码流中的数据单位 (这里的数据单位是指可以被独立放入一个分组传输的句法元素集合) 在图 7.4 中我们看到,一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列 清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果在前一 个序列的传输中发生重大错误,如严重的丢包,或其他原因引起数据错位,在这里可以获得重新同 I P P P I P P I P P PP 步。IDR 图像之后的图像永远不会引用 IDR 图像之前的图像的数据来解码。 要注意 IDR 图像和 I 图像的区别,IDR 图像一定是 I 图像,但 I 图像不一定是 IDR 图像。一个 序列中可以有很多的 I 图像,I 图像之后的图像可以引用 I 图像之间的图像做运动参考。 在图 7.4 中,除了参数集与片外还有其它的数据单位,这些数据单位可以提供额外的数据或同 步信息,这些数据单位也是一系列句法元素的集合。它们在解码过程中不是必需的,但却可以适当 提高同步性能或定义图像的复杂特征。 7.1.2 句法的表示方法 7.1.2.1 句法元素与变量 编码器将数据编码为句法元素然后依次发送。在解码器端,通常要将句法元素作求值计算,得 出一些中间数据,这些中间数据就是 H.264 定义的变量。如图 7.5: 图 7.5 从句法元素解出变量 图中,pic_width_in_mbs_minus1 是解码器直接从码流中提取的句法元素,这个句法元素表征图 像的宽度,以宏块为单位。我们看到,为了提高编码效率,H.264 将图像实际的宽度减去 1 后再传 送。 PicWidthInMbs = pic_width_in_mbs_minus1 + 1 PicWidthInSamplesL = PicWidthInMbs * 16 PicWidthInSamplesC = PicWidthInMbs * 8 以上变量 PicWidthInMbs 表示图像以宏块为单位的宽,变量 PicWidthInSamplesL 、 PicWidthInSamplesC 分别表示图像的亮度、色度分量以像素为单位的宽。H.264 定义这些变量是因 为在后续句法元素的提取算法或图像的重建中需要用到它们的值。在 H.264 中,句法元素的名称是 由小写字母和一系列的下划线组成,而变量名称是大小写字母组成,中间没有下划线。 7.1.2.2 语法 句法是句法元素的组织结构,而对一个结构的描述必然少不了对应的语法,语法提供判断、循 环等必要的描述方法。H.264 采用一种类 C 语法。 7.1.2.2.1 判断 if ( 条件 ) { … } else { … } 7.1.2.2.2 循环 与 C 语言类似,H.264 有三种循环体: a) do { … }while ( 条件 ) b) while ( 条件 ) { … } c) for ( 初始 ; 条件 ; 求值 ) { … } 7.1.2.3 描述子 描述子是指从比特流提取句法元素的方法,即句法元素的解码算法,每个句法元素都有相对应 的描述子。由于 H.264 编码的最后一步是熵编码,所以这里的描述子大多是熵编码的解码算法。H.264 定义了如下几种描述子: a) ae(v) 基于上下文自适应的二进制算术熵编码 b) b(8) 读进连续的 8 个比特 c) ce(v) 基于上下文自适应的可变长熵编码 d) f(n) 读进连续的 n 个比特 e) i(n)/i(v) 读进连续的若干比特,并把它们解释为有符号整数 f) me(v) 映射指数 Golomb 熵编码 g) se(v) 有符号指数 Golomb 熵编码 h) te(v) 截断指数 Golomb 熵编码 i) u(n)/u(v) 读进连续的若干比特,并将它们解释为无符号整数 j) ue(v) 无符号指数 Golomb 熵编码 我们看到,描述子都在括号中带有一个参数,这个参数表示需要提取的比特数。当参数是 n 时, 表明调用这个描述子的时候会指明 n 的值,也即该句法元素是定长编码的。当参数是 v 时,对应的 句法元素是变长编码,这时有两种情况:i(v) 和 u(v) 两个描述子的 v 由以前的句法元素指定,也就 是说在前面会有句法元素指定当前句法元素的比特长度;除了这两个描述子外,其它描述子都是熵 编码,它们的解码算法本身能够确定当前句法元素的比特长度。 7.2 句法表 句法表定义了 H.264 的句法,指明在码流中依次出现的句法元素及它们出现的条件、提取描述 子等。就象前文所提,句法表是分层嵌套的。 在句法表中的 C 字段表示该句法元素的分类,这是为片分区服务的,句法元素分类的具体含义 在表 7.20 详细介绍。Descriptor 指定对应句法元素的描述子。 表 7.1 NAL 层句法 nal_unit( NumBytesInNALunit ) { C Descriptor forbidden_zero_bit All f(1) nal_ref_idc All u(2) nal_unit_type All u(5) NumBytesInRBSP = 0 for( i = 1; i < NumBytesInNALunit; i++ ) { if( i + 2 < NumBytesInNALunit && next_bits( 24 ) = = 0x000003 ) { rbsp_byte[ NumBytesInRBSP++ ] All b(8) rbsp_byte[ NumBytesInRBSP++ ] All b(8) i += 2 emulation_prevention_three_byte /* equal to 0x03 */ All f(8) } else rbsp_byte[ NumBytesInRBSP++ ] All b(8) } } 表 7.2 序列参数集层句法 seq_parameter_set_rbsp( ) { C Descriptor profile_idc 0u(8) constraint_set0_flag 0u(1) constraint_set1_flag 0u(1) constraint_set2_flag 0u(1) reserved_zero_5bits /* equal to 0 */ 0u(5) level_idc 0u(8) seq_parameter_set_id 0ue(v) log2_max_frame_num_minus4 0ue(v) pic_order_cnt_type 0ue(v) if( pic_order_cnt_type = = 0 ) log2_max_pic_order_cnt_lsb_minus4 0ue(v) else if( pic_order_cnt_type = = 1 ) { delta_pic_order_always_zero_flag 0u(1) offset_for_non_ref_pic 0se(v) offset_for_top_to_bottom_field 0se(v) num_ref_frames_in_pic_order_cnt_cycle 0ue(v) for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ ) offset_for_ref_frame[ i ] 0se(v) } num_ref_frames 0ue(v) gaps_in_frame_num_value_allowed_flag 0u(1) pic_width_in_mbs_minus1 0ue(v) pic_height_in_map_units_minus1 0ue(v) frame_mbs_only_flag 0u(1) if( !frame_mbs_only_flag ) mb_adaptive_frame_field_flag 0u(1) direct_8x8_inference_flag 0u(1) frame_cropping_flag 0u(1) if( frame_cropping_flag ) { frame_crop_left_offset 0ue(v) frame_crop_right_offset 0ue(v) frame_crop_top_offset 0ue(v) frame_crop_bottom_offset 0ue(v) } vui_parameters_present_flag 0u(1) if( vui_parameters_present_flag ) vui_parameters( ) 0 rbsp_trailing_bits( ) 0 } 表 7.3 图像参数集层句法 pic_parameter_set_rbsp( ) { C Descriptor pic_parameter_set_id 1 ue(v) seq_parameter_set_id 1 ue(v) entropy_coding_mode_flag 1 u(1) pic_order_present_flag 1 u(1) num_slice_groups_minus1 1 ue(v) if( num_slice_groups_minus1 > 0 ) { slice_group_map_type 1 ue(v) if( slice_group_map_type = = 0 ) for( iGroup = 0; iGroup <= num_slice_groups_minus1; iGroup++ ) run_length_minus1[ iGroup ] 1 ue(v) else if( slice_group_map_type = = 2 ) for( iGroup = 0; iGroup < num_slice_groups_minus1; iGroup++ ) { top_left[ iGroup ] 1 ue(v) bottom_right[ iGroup ] 1 ue(v) } else if( slice_group_map_type = = 3 | | slice_group_map_type = = 4 | | slice_group_map_type = = 5 ) { slice_group_change_direction_flag 1 u(1) slice_group_change_rate_minus1 1 ue(v) } else if( slice_group_map_type = = 6 ) { pic_size_in_map_units_minus1 1 ue(v) for( i = 0; i <= pic_size_in_map_units_minus1; i++ ) slice_group_id[ i ] 1 u(v) } } num_ref_idx_l0_active_minus1 1 ue(v) num_ref_idx_l1_active_minus1 1 ue(v) weighted_pred_flag 1 u(1) weighted_bipred_idc 1 u(2) pic_init_qp_minus26 /* relative to 26 */ 1 se(v) pic_init_qs_minus26 /* relative to 26 */ 1 se(v) chroma_qp_index_offset 1 se(v) deblocking_filter_control_present_flag 1 u(1) constrained_intra_pred_flag 1 u(1) redundant_pic_cnt_present_flag 1 u(1) rbsp_trailing_bits( ) 1 } 表 7.4 片层句法(不分区) slice_layer_without_partitioning_rbsp( ) { C Descriptor slice_header( ) 2 slice_data( ) /* all categories of slice_data( ) syntax */ 2 | 3 | 4 rbsp_slice_trailing_bits( ) 2 } 表 7.5 片层 A 分区句法 slice_data_partition_a_layer_rbsp( ) { C Descriptor slice_header( ) 2 slice_id 2 ue(v) slice_data( ) /* only category 2 parts of slice_data( ) syntax */ 2 rbsp_slice_trailing_bits( ) 2 } 表 7.6 片层 B 分区句法 slice_data_partition_b_layer_rbsp( ) { C Descriptor slice_id 3 ue(v) if( redundant_pic_cnt_present_flag ) redundant_pic_cnt 3 ue(v) slice_data( ) /* only category 3 parts of slice_data( ) syntax */ 3 rbsp_slice_trailing_bits( ) 3 } 表 7.7 片层 C 分区句法 slice_data_partition_c_layer_rbsp( ) { C Descriptor slice_id 4 ue(v) if( redundant_pic_cnt_present_flag ) redundant_pic_cnt 4 ue(v) slice_data( ) /* only category 4 parts of slice_data( ) syntax */ 4 rbsp_slice_trailing_bits( ) 4 } 表 7.8 拖尾(trailing bits)句法 rbsp_trailing_bits( ) { C Descriptor rbsp_stop_one_bit /* equal to 1 */ All f(1) while( !byte_aligned( ) ) rbsp_alignment_zero_bit /* equal to 0 */ All f(1) } 表 7.9 片头句法 slice_header( ) { C Descriptor first_mb_in_slice 2 ue(v) slice_type 2 ue(v) pic_parameter_set_id 2 ue(v) frame_num 2 u(v) if( !frame_mbs_only_flag ) { field_pic_flag 2 u(1) if( field_pic_flag ) bottom_field_flag 2 u(1) } if( nal_unit_type = = 5 ) idr_pic_id 2 ue(v) if( pic_order_cnt_type = = 0 ) { pic_order_cnt_lsb 2 u(v) if( pic_order_present_flag && !field_pic_flag ) delta_pic_order_cnt_bottom 2 se(v) } if( pic_order_cnt_type = = 1 && !delta_pic_order_always_zero_flag ) { delta_pic_order_cnt[ 0 ] 2 se(v) if( pic_order_present_flag && !field_pic_flag ) delta_pic_order_cnt[ 1 ] 2 se(v) } if( redundant_pic_cnt_present_flag ) redundant_pic_cnt 2 ue(v) if( slice_type = = B ) direct_spatial_mv_pred_flag 2 u(1) if( slice_type = = P | | slice_type = = SP | | slice_type = = B ) { num_ref_idx_active_override_flag 2 u(1) if( num_ref_idx_active_override_flag ) { num_ref_idx_l0_active_minus1 2 ue(v) if( slice_type = = B ) num_ref_idx_l1_active_minus1 2 ue(v) } } ref_pic_list_reordering( ) 2 if( ( weighted_pred_flag && ( slice_type = = P | | slice_type = = SP ) ) | | ( weighted_bipred_idc = = 1 && slice_type = = B ) ) pred_weight_table( ) 2 if( nal_ref_idc != 0 ) dec_ref_pic_marking( ) 2 if( entropy_coding_mode_flag && slice_type != I && slice_type != SI ) cabac_init_idc 2 ue(v) slice_qp_delta 2 se(v) if( slice_type = = SP | | slice_type = = SI ) { if( slice_type = = SP ) sp_for_switch_flag 2 u(1) slice_qs_delta 2 se(v) } if( deblocking_filter_control_present_flag ) { disable_deblocking_filter_idc 2 ue(v) if( disable_deblocking_filter_idc != 1 ) { slice_alpha_c0_offset_div2 2 se(v) slice_beta_offset_div2 2 se(v) } } if( num_slice_groups_minus1 > 0 && slice_group_map_type >= 3 && slice_group_map_type <= 5) slice_group_change_cycle 2 u(v) } 表 7.10 参考帧队列重排序(reordering)句法 ref_pic_list_reordering( ) { C Descriptor if( slice_type != I && slice_type != SI ) { ref_pic_list_reordering_flag_l0 2 u(1) if( ref_pic_list_reordering_flag_l0 ) do { reordering_of_pic_nums_idc 2 ue(v) if( reordering_of_pic_nums_idc = = 0 | | reordering_of_pic_nums_idc = = 1 ) abs_diff_pic_num_minus1 2 ue(v) else if( reordering_of_pic_nums_idc = = 2 ) long_term_pic_num 2 ue(v) } while( reordering_of_pic_nums_idc != 3 ) } if( slice_type = = B ) { ref_pic_list_reordering_flag_l1 2 u(1) if( ref_pic_list_reordering_flag_l1 ) do { reordering_of_pic_nums_idc 2 ue(v) if( reordering_of_pic_nums_idc = = 0 | | reordering_of_pic_nums_idc = = 1 ) abs_diff_pic_num_minus1 2 ue(v) else if( reordering_of_pic_nums_idc = = 2 ) long_term_pic_num 2 ue(v) } while( reordering_of_pic_nums_idc != 3 ) } } 表 7.11 加权预测句法 pred_weight_table( ) { C Descriptor luma_log2_weight_denom 2 ue(v) chroma_log2_weight_denom 2 ue(v) for( i = 0; i <= num_ref_idx_l0_active_minus1; i++ ) { luma_weight_l0_flag 2 u(1) if( luma_weight_l0_flag ) { luma_weight_l0[ i ] 2 se(v) luma_offset_l0[ i ] 2 se(v) } chroma_weight_l0_flag 2 u(1) if( chroma_weight_l0_flag ) for( j =0; j < 2; j++ ) { chroma_weight_l0[ i ][ j ] 2 se(v) chroma_offset_l0[ i ][ j ] 2 se(v) } } if( slice_type = = B ) for( i = 0; i <= num_ref_idx_l1_active_minus1; i++ ) { luma_weight_l1_flag 2 u(1) if( luma_weight_l1_flag ) { luma_weight_l1[ i ] 2 se(v) luma_offset_l1[ i ] 2 se(v) } chroma_weight_l1_flag 2 u(1) if( chroma_weight_l1_flag ) for( j = 0; j < 2; j++ ) { chroma_weight_l1[ i ][ j ] 2 se(v) chroma_offset_l1[ i ][ j ] 2 se(v) } } } 表 7.12 参考帧队列标记(marking)句法 dec_ref_pic_marking( ) { C Descriptor if( nal_unit_type = = 5 ) { no_output_of_prior_pics_flag 2 | 5 u(1) long_term_reference_flag 2 | 5 u(1) } else { adaptive_ref_pic_marking_mode_flag 2 | 5 u(1) if( adaptive_ref_pic_marking_mode_flag ) do { memory_management_control_operation 2 | 5 ue(v) if( memory_management_control_operation = = 1 | | memory_management_control_operation = = 3 ) difference_of_pic_nums_minus1 2 | 5 ue(v) if(memory_management_control_operation = = 2 ) long_term_pic_num 2 | 5 ue(v) if( memory_management_control_operation = = 3 | | memory_management_control_operation = = 6 ) long_term_frame_idx 2 | 5 ue(v) if( memory_management_control_operation = = 4 ) max_long_term_frame_idx_plus1 2 | 5 ue(v) } while( memory_management_control_operation != 0 ) } } 表 7.13 片层数据句法 slice_data( ) { C Descriptor if( entropy_coding_mode_flag ) while( !byte_aligned( ) ) cabac_alignment_one_bit 2 f(1) CurrMbAddr = first_mb_in_slice * ( 1 + MbaffFrameFlag ) moreDataFlag = 1 prevMbSkipped = 0 do { if( slice_type != I && slice_type != SI ) if( !entropy_coding_mode_flag ) { mb_skip_run 2 ue(v) prevMbSkipped = ( mb_skip_run > 0 ) for( i=0; i 0 | | CodedBlockPatternChroma > 0 | | MbPartPredMode( mb_type, 0 ) = = Intra_16x16 ) { mb_qp_delta 2 se(v) | ae(v) residual( ) 3 | 4 } } } 表 7.15 宏块层预测句法 mb_pred( mb_type ) { C Descriptor if( MbPartPredMode( mb_type, 0 ) = = Intra_4x4 | | MbPartPredMode( mb_type, 0 ) = = Intra_16x16 ) { if( MbPartPredMode( mb_type, 0 ) = = Intra_4x4 ) for( luma4x4BlkIdx=0; luma4x4BlkIdx<16; luma4x4BlkIdx++ ) { prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ] 2 u(1) | ae(v) if( !prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ] ) rem_intra4x4_pred_mode[ luma4x4BlkIdx ] 2 u(3) | ae(v) } intra_chroma_pred_mode 2 ue(v) | ae(v) } else if( MbPartPredMode( mb_type, 0 ) != Direct ) { for( mbPartIdx = 0; mbPartIdx < NumMbPart( mb_type ); mbPartIdx++) if( ( num_ref_idx_l0_active_minus1 > 0 | | mb_field_decoding_flag ) && MbPartPredMode( mb_type, mbPartIdx ) != Pred_L1 ) ref_idx_l0[ mbPartIdx ] 2 te(v) | ae(v) for( mbPartIdx = 0; mbPartIdx < NumMbPart( mb_type ); mbPartIdx++) if( ( num_ref_idx_l1_active_minus1 > 0 | | mb_field_decoding_flag ) && MbPartPredMode( mb_type, mbPartIdx ) != Pred_L0 ) ref_idx_l1[ mbPartIdx ] 2 te(v) | ae(v) for( mbPartIdx = 0; mbPartIdx < NumMbPart( mb_type ); mbPartIdx++) if( MbPartPredMode ( mb_type, mbPartIdx ) != Pred_L1 ) for( compIdx = 0; compIdx < 2; compIdx++ ) mvd_l0[ mbPartIdx ][ 0 ][ compIdx ] 2 se(v) | ae(v) for( mbPartIdx = 0; mbPartIdx < NumMbPart( mb_type ); mbPartIdx++) if( MbPartPredMode( mb_type, mbPartIdx ) != Pred_L0 ) for( compIdx = 0; compIdx < 2; compIdx++ ) mvd_l1[ mbPartIdx ][ 0 ][ compIdx ] 2 se(v) | ae(v) } } 表 7.16 子宏块预测句法 sub_mb_pred( mb_type ) { C Descriptor for( mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++ ) sub_mb_type[ mbPartIdx ] 2 ue(v) | ae(v) for( mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++ ) if( ( num_ref_idx_l0_active_minus1 > 0 | | mb_field_decoding_flag ) && mb_type != P_8x8ref0 && sub_mb_type[ mbPartIdx ] != B_Direct_8x8 && SubMbPredMode( sub_mb_type[ mbPartIdx ] ) != Pred_L1 ) ref_idx_l0[ mbPartIdx ] 2 te(v) | ae(v) for( mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++ ) if( (num_ref_idx_l1_active_minus1 > 0 | | mb_field_decoding_flag ) && sub_mb_type[ mbPartIdx ] != B_Direct_8x8 && SubMbPredMode( sub_mb_type[ mbPartIdx ] ) != Pred_L0 ) ref_idx_l1[ mbPartIdx ] 2 te(v) | ae(v) for( mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++ ) if( sub_mb_type[ mbPartIdx ] != B_Direct_8x8 && SubMbPredMode( sub_mb_type[ mbPartIdx ] ) != Pred_L1 ) for( subMbPartIdx = 0; subMbPartIdx < NumSubMbPart( sub_mb_type[ mbPartIdx ] ); subMbPartIdx++) for( compIdx = 0; compIdx < 2; compIdx++ ) mvd_l0[ mbPartIdx ][ subMbPartIdx ][ compIdx ] 2 se(v) | ae(v) for( mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++ ) if( sub_mb_type[ mbPartIdx ] != B_Direct_8x8 && SubMbPredMode( sub_mb_type[ mbPartIdx ] ) != Pred_L0 ) for( subMbPartIdx = 0; subMbPartIdx < NumSubMbPart( sub_mb_type[ mbPartIdx ] ); subMbPartIdx++) for( compIdx = 0; compIdx < 2; compIdx++ ) mvd_l1[ mbPartIdx ][ subMbPartIdx ][ compIdx ] 2 se(v) | ae(v) } 表 7.17 残差句法 residual( ) { C Descriptor if( !entropy_coding_mode_flag ) residual_block = residual_block_cavlc else residual_block = residual_block_cabac if( MbPartPredMode( mb_type, 0 ) = = Intra_16x16 ) residual_block( Intra16x16DCLevel, 16 ) 3 for( i8x8 = 0; i8x8 < 4; i8x8++ ) /* each luma 8x8 block */ for( i4x4 = 0; i4x4 < 4; i4x4++ ) /* each 4x4 sub-block of block */ if( CodedBlockPatternLuma & ( 1 << i8x8 ) ) { if( MbPartPredMode( mb_type, 0 ) = = Intra_16x16 ) residual_block( Intra16x16ACLevel[ i8x8 * 4 + i4x4 ], 15 ) 3 else residual_block( LumaLevel[ i8x8 * 4 + i4x4 ], 16 ) 3 | 4 } else { if( MbPartPredMode( mb_type, 0 ) = = Intra_16x16 ) for( i = 0; i < 15; i++ ) Intra16x16ACLevel[ i8x8 * 4 + i4x4 ][ i ] = 0 else for( i = 0; i < 16; i++ ) LumaLevel[ i8x8 * 4 + i4x4 ][ i ] = 0 } for( iCbCr = 0; iCbCr < 2; iCbCr++ ) if( CodedBlockPatternChroma & 3 ) /* chroma DC residual present */ residual_block( ChromaDCLevel[ iCbCr ], 4 ) 3 | 4 else for( i = 0; i < 4; i++ ) ChromaDCLevel[ iCbCr ][ i ] = 0 for( iCbCr = 0; iCbCr < 2; iCbCr++ ) for( i4x4 = 0; i4x4 < 4; i4x4++ ) if( CodedBlockPatternChroma & 2 ) /* chroma AC residual present */ residual_block( ChromaACLevel[ iCbCr ][ i4x4 ], 15 ) 3 | 4 else for( i = 0; i < 15; i++ ) ChromaACLevel[ iCbCr ][ i4x4 ][ i ] = 0 } 表 7.18 CAVLC 残差句法 residual_block_cavlc( coeffLevel, maxNumCoeff ) { C Descriptor for( i = 0; i < maxNumCoeff; i++ ) coeffLevel[ i ] = 0 coeff_token 3 | 4 ce(v) if( TotalCoeff( coeff_token ) > 0 ) { if( TotalCoeff( coeff_token ) > 10 && TrailingOnes( coeff_token ) < 3 ) suffixLength = 1 else suffixLength = 0 for( i = 0; i < TotalCoeff( coeff_token ); i++ ) if( i < TrailingOnes( coeff_token ) ) { trailing_ones_sign_flag 3 | 4 u(1) level[ i ] = 1 – 2 * trailing_ones_sign_flag } else { level_prefix 3 | 4 ce(v) levelCode = ( level_prefix << suffixLength ) if( suffixLength > 0 | | level_prefix >= 14 ) { level_suffix 3 | 4 u(v) levelCode += level_suffix } if( level_prefix = = 15 && suffixLength = = 0 ) levelCode += 15 if( i = = TrailingOnes( coeff_token ) && TrailingOnes( coeff_token ) < 3 ) levelCode += 2 if( levelCode % 2 = = 0 ) level[ i ] = ( levelCode + 2 ) >> 1 else level[ i ] = ( –levelCode – 1 ) >> 1 if( suffixLength = = 0 ) suffixLength = 1 if( Abs( level[ i ] ) > ( 3 << ( suffixLength – 1 ) ) && suffixLength < 6 ) suffixLength++ } if( TotalCoeff( coeff_token ) < maxNumCoeff ) { total_zeros 3 | 4 ce(v) zerosLeft = total_zeros } else zerosLeft = 0 for( i = 0; i < TotalCoeff( coeff_token ) – 1; i++ ) { if( zerosLeft > 0 ) { run_before 3 | 4 ce(v) run[ i ] = run_before } else run[ i ] = 0 zerosLeft = zerosLeft – run[ i ] } run[ TotalCoeff( coeff_token ) – 1 ] = zerosLeft coeffNum = -1 for( i = TotalCoeff( coeff_token ) – 1; i >= 0; i-- ) { coeffNum += run[ i ] + 1 coeffLevel[ coeffNum ] = level[ i ] } } } 表 7.19 CABAC 残差句法 residual_block_cabac( coeffLevel, maxNumCoeff ) { C Descriptor coded_block_flag 3 | 4 ae(v) if( coded_block_flag ) { numCoeff = maxNumCoeff i = 0 do { significant_coeff_flag[ i ] 3 | 4 ae(v) if( significant_coeff_flag[ i ] ) { last_significant_coeff_flag[ i ] 3 | 4 ae(v) if( last_significant_coeff_flag[ i ] ) { numCoeff = i + 1 for( j = numCoeff; j < maxNumCoeff; j++ ) coeffLevel[ j ] = 0 } } i++ } while( i < numCoeff-1 ) coeff_abs_level_minus1[ numCoeff-1 ] 3 | 4 ae(v) coeff_sign_flag[ numCoeff-1 ] 3 | 4 ae(v) coeffLevel[ numCoeff-1 ] = ( coeff_abs_level_minus1[ numCoeff – 1 ] + 1 ) * ( 1 – 2 * coeff_sign_flag[ numCoeff – 1 ] ) for( i = numCoeff-2; i >= 0; i-- ) { if( significant_coeff_flag[ i ] ) { coeff_abs_level_minus1[ i ] 3 | 4 ae(v) coeff_sign_flag[ i ] 3 | 4 ae(v) coeffLevel[ i ] = ( coeff_abs_level_minus1[ i ] + 1 ) * ( 1 – 2 * coeff_sign_flag[ i ] ) } else coeffLevel[ i ] = 0 } } else for( i = 0; i < maxNumCoeff; i++ ) coeffLevel[ i ] = 0 } 7.3 语义 本节将对句法表中的句法元素作详细解释。 7.3.1 NAL 层语义 在网络传输的环境下,编码器将每个 NAL 各自独立、完整地放入一个分组,由于分组都有头部, 解码器可以很方便地检测出 NAL 的分界,依次取出 NAL 进行解码。为了节省码流,H.264 没有另 外在 NAL 的头部设立表示起始的句法元素,我们从表 7.1 可以看到这点。但是如果编码数据是储存 在介质(如 DVD 光盘)上,由于 NAL 是依次紧密排列,解码器将无法在数据流中分辨每个 NAL 的起始和终止,所以必须要有另外的机制来解决这个问题。 针对这个问题,H.264 草案的附录 B 中指明了一种简单又高效的方案。当数据流是存储在介质 上时,在每个 NAL 前添加起始码: 0x000001 在某些类型的介质上,为了寻址的方便,要求数据流在长度上对齐,或必须是某个常数的倍数。考 虑到这种情况,H.264 建议在起始码前添加若干字节的 0 来填充,直到该 NAL 的长度符合要求。 在这样的机制下,解码器在码流中检测起始码,作为一个 NAL 的起始标识,当检测到下一个 起始码时当前 NAL 结束。H.264 规定当检测到 0x000000 时也可以表征当前 NAL 的结束,这是因为 连着的三个字节的 0 中的任何一个字节的 0 要么属于起始码要么是起始码前面添加的 0。 添加起始码是一个解决问题的很好的方法,但上面关于起始码的介绍还不完整,因为忽略了一 个重要的问题:如果在 NAL 内部出现了 0x000001 或是 0x000000 的序列怎么办?毫无疑问这种情 况是致命的,解码器将把这些本来不是起始码的字节序列当作起始码,而错误地认为这里往后是一 个新的 NAL 的开始,进而造成解码数据的错位!而我们做的大量实验证明,NAL 内部经常会出现 这样的字节序列。 于是 H.264 提出了另外一种机制,叫做“防止竞争”,在编码器编码完一个 NAL 时,应该检测是 否出现图 7.6 左侧 中的四个字节序列,以防止它们和起始码竞争。如果检测到这些序列存在,编 码器将在最后一个字节前插入一个新的字节:0x03,从而使它们变成图 7.6 右测的样子。当解码器 在 NAL 内部检测到有 0x000003 的序列时,将把 0x03 抛弃,恢复原始数据。 图 7.6 NAL 内部为防止与起始码竞争插入 0x03 图 7.6 中的前两个序列我们前文中已经提到,第三个 0x000002 是作保留用,而第四个 0x000003 是为了保证解码器能正常工作,因为我们刚才提到,解码器恢复原始数据的方法是检测到 0x000003 就抛弃其中的 0x03,这样当出现原始数据为 0x000003 时会破坏数据,所以必须也应该给这个序列 插入 0x03。 我们可以从句法表 7.1 中看到解码器在 NAL 层的处理步骤,其中变量 NumBytesInNALunit 是 解码器计算出来的,解码器在逐个字节地读一个 NAL 时并不同时对它解码,而是要通过起始码机 制将整个 NAL 读进、计算出长度后再开始解码。 forbidden_zero_bit 等于 0 nal_ref_idc 指示当前 NAL 的优先级。取值范围为 0-3, ,值越高,表示当前 NAL 越重要,需要优先受 到保护。H.264 规定如果当前 NAL 是属于参考帧的片,或是序列参数集,或是图像参数集这些重要 的数据单位时,本句法元素必须大于 0。但在大于 0 时具体该取何值,却没有进一步规定,通信双方 可以灵活地制定策略。 nal_unit_type 指明当前 NAL unit 的类型,具体类型的定义如表 7.20: 表 7.20 nal_uint_type 语义 nal_unit_type NAL类型 C 0 未使用 1 不分区、非 IDR 图像的片 2, 3, 4 2 片分区 A 2 3 片分区 B 3 4 片分区 C 4 5 IDR 图像中的片 2, 3 6 补充增强信息单元(SEI) 5 7 序列参数集 0 8 图像参数集 1 9 分界符 6 10 序列结束 7 11 码流结束 8 12 填充 9 13..23 保留 24..31 未使用 nal_unit_type=5 时,表示当前 NAL 是 IDR 图像的一个片,在这种情况下,IDR 图像中的每个片的 nal_unit_type 都应该等于 5。注意 IDR 图像不能使用片分区。 rbsp_byte[i] RBSP 的第 i 个字节。RBSP 指原始字节载荷,它是 NAL 单元的数据部分的封装格式, 封装的数据来自 SODB(原始数据比特流)。SODB 是编码后的原始数据,SODB 经封装为 RBSP 后 放入 NAL 的数据部分。下面介绍一个 RBSP 的生成顺序。 从 SODB 到 RBSP 的生成过程: - 如果 SODB 内容是空的,生成的 RBSP 也是空的 - 否则,RBSP 由如下的方式生成: 1) RBSP 的第一个字节直接取自 SODB 的第 1 到 8 个比特,(RBSP 字节内的比特按照从左到 右对应为从高到低的顺序排列,most significant),以此类推,RBSP 其余的每个字节都直接 取自 SODB 的相应比特。RBSP 的最后一个字节包含 SODB 的最后几个比特,及如下的 rbsp_trailing_bits() 2) rbsp_trailing_bits()的第一个比特是 1,接下来填充 0,直到字节对齐。(填充 0 的目的也是为了 字节对齐) 3) 最后添加若干个 cabac_zero_word(其值等于 0x0000) emulation_prevention_three_byte NAL 内部为防止与起始码竞争而引入的填充字节 ,值为 0x03。 7.3.2 序列参数集语义 profile_idc、 level_idc 指明所用 profile、level。 constraint_set0_flag 等于 1 时表示必须遵从附录 A.2.1 所指明的所有制约条件。等于 0 时表示不必 遵从所有条件。 constraint_set1_flag 等于 1 时表示必须遵从附录 A.2.2 所指明的所有制约条件。等于 0 时表示不必 遵从所有条件。 constraint_set2_flag 等于 1 时表示必须遵从附录 A.2.3 所指明的所有制约条件。等于 0 时表示不必 遵从所有条件。 注意: 当 constraint_set0_flag,constraint_set1_flag,constraint_set2_flag 中的两个以上等于 1 时,A.2 中的所有制约条件都要被遵从。 reserved_zero_5bits 在目前的标准中本句法元素必须等于 0,其他的值保留做将来用,解码器应该 忽略本句法元素的值。 seq_parameter_set_id 指明本序列参数集的 id 号,这个 id 号将被 picture 参数集引用,本句法元素 的值应该在[0,31]。 注意:当编码器需要产生新的序列参数集时,应该使用新的 seq_parameter_set_id,即使用新的序列参 数集,而不是去改变原来的参数集中的内容 log2_max_frame_num_minus4 这个句法元素主要是为读取另一个句法元素 frame_num 服务的, frame_num 是最重要的句法元素之一,它标识所属图像的解码顺序。可以在句法表看到,fram-num 的解码函数是 ue(v),函数中的 v 在这里指定: v = log2_max_frame_num_minus4 + 4 从另一个角度看,这个句法元素同时也指明了 frame_num 的所能达到的最大值: MaxFrameNum = 2( log2_max_frame_num_minus4 + 4 ) 变量 MaxFrameNum 表示 frame_num 的最大值,在后文中可以看到,在解码过程中它也是一个非常 重要的变量。 值得注意的是 frame_num 是循环计数的,即当它到达 MaxFrameNum 后又从 0 重新开始新一轮 的计数。解码器必须要有机制检测这种循环,不然会引起类似千年虫的问题,在图像的顺序上造成 混乱。在第八章会详细讲述 H.264 检测这种循环的机制。 pic_order_cnt_type 指明了 poc (picture order count) 的编码方法,poc 标识图像的播放顺序。由于 H.264 使用了 B 帧预测,使得图像的解码顺序并不一定等于播放顺序,但它们之间存在一定的映射 关系。poc 可以由 frame-num 通过映射关系计算得来,也可以索性由编码器显式地传送。H.264 中一 共定义了三种 poc 的编码方法,这个句法元素就是用来通知解码器该用哪种方法来计算 poc。而以下 的几个句法元素是分别在各种方法中用到的数据。 在如下的视频序列中本句法元素不应该等于 2: - 一个非参考帧的接入单元后面紧跟着一个非参考图像(指参考帧或参考场)的接入单元 - 两个分别包含互补非参考场对的接入单元后面紧跟着一个非参考图像的接入单元. - 一个非参考场的接入单元后面紧跟着另外一个非参考场,并且这两个场不能构成一个互补场对 log2_max_pic_order_cnt_lsb_minus4 指明了变量 MaxPicOrderCntLsb 的值: MaxPicOrderCntLsb = 2( log2_max_pic_order_cnt_lsb_minus4 + 4 ) 该变量在 pic_order_cnt_type = 0 时使用。 delta_pic_order_always_zero_flag 等于 1 时,句法元素 delta_pic_order_cnt[0]和 delta_pic_order_cnt[1] 不在片头出现,并且它们的值默认为 0; 本句法元素等于 0 时,上述的两个句法元素将在片头出现。 offset_for_non_ref_pic 被用来计算非参考帧或场的 picture order count (在 8.2.1),本句法元素的值应 该在[-231 , 231 – 1]。 offset_for_top_to_bottom_field 被用来计算帧的底场的 picture order count (在 8.2.1), 本句法元素的 值应该在[-231 , 231 – 1]。 num_ref_frames_in_pic_order_cnt_cycle 被用来解码 picture order count (在 8.2.1),本句法元素的值 应该在[0,255]。 offset_for_ref__frame[i] 在 picture order count type=1 时用,用于解码 POC,本句法元素对循环 num_ref_frames_in_pic_order_cycle 中的每一个元素指定一个偏移。 num_ref_frames 指定参考帧队列可能达到的最大长度,解码器依照这个句法元素的值开辟存储区, 这个存储区用于存放已解码的参考帧,H.264 规定最多可用 16 个参考帧,本句法元素的值最大为 16。 值得注意的是这个长度以帧为单位,如果在场模式下,应该相应地扩展一倍。 gaps_in_frame_num_value_allowed_flag 这个句法元素等于 1 时,表示允许句法元素 frame_num 可 以不连续。当传输信道堵塞严重时,编码器来不及将编码后的图像全部发出,这时允许丢弃若干帧 图像。在正常情况下每一帧图像都有依次连续的 frame_num 值,解码器检查到如果 frame_num 不连 续,便能确定有图像被编码器丢弃。这时,解码器必须启动错误掩藏的机制来近似地恢复这些图像, 因为这些图像有可能被后续图像用作参考帧。 当这个句法元素等于 0 时,表不允许 frame_num 不连续,即编码器在任何情况下都不能丢弃图像。 这时,H.264 允许解码器可以不去检查 frame_num 的连续性以减少计算量。这种情况下如果依然发 生 frame_num 不连续,表示在传输中发生丢包,解码器会通过其他机制检测到丢包的发生,然后启 动错误掩藏的恢复图像。 pic_width_in_mbs_minus1 本句法元素加 1 后指明图像宽度,以宏块为单位: PicWidthInMbs = pic_width_in_mbs_minus1 + 1 通过这个句法元素解码器可以计算得到亮度分量以像素为单位的图像宽度: PicWidthInSamplesL = PicWidthInMbs * 16 从而也可以得到色度分量以像素为单位的图像宽度: PicWidthInSamplesC = PicWidthInMbs * 8 以上变量 PicWidthInSamplesL、PicWidthInSamplesC 分别表示图像的亮度、色度分量以像素为单位 的宽。 H.264 将图像的大小在序列参数集中定义,意味着可以在通信过程中随着序列参数集动态地改变图 像的大小,在后文中可以看到,甚至可以将传送的图像剪裁后输出。 pic_height_in_map_units_minus1 本句法元素加 1 后指明图像高度: PicHeightInMapUnits = pic_height_in_map_units_minus1 + 1 PicSizeInMapUnits = PicWidthInMbs * PicHeightInMapUnits 图像的高度的计算要比宽度的计算复杂,因为一个图像可以是帧也可以是场,从这个句法元素可以 在帧模式和场模式下分别计算出出亮度、色度的高。值得注意的是,这里以 map_unit 为单位,map_unit 的含义由后文叙述。 frame_mbs_only_flag 本句法元素等于 0 时表示本序列中所有图像的编码模式都是帧,没有其他编 码模式存在;本句法元素等于 1 时 ,表示本序列中图像的编码模式可能是帧,也可能是场或帧场自 适应,某个图像具体是哪一种要由其他句法元素决定。 结合 map_unit 的含义,这里给出上一个句法元素 pic_height_in_map_units_minus1 的进一步解析步骤: 当 frame_mbs_only_flag 等于1,pic_height_in_map_units_minus1 指的是一个 picture 中帧的高度;当 frame_mbs_only_flag 等于0,pic_heght_in_map_units_minus1 指的是一个 picture 中场的高度,所以 可以得到如下以宏块为单位的图像高度: FrameHeightInMbs = ( 2 – frame_mbs_only_flag ) * PicHeightInMapUnits PictureHeightInMbs= ( 2 – frame_mbs_only_flag ) * PicHeightInMapUnits mb_adaptive_frame_field_flag 指明本序列是否属于帧场自适应模式。mb_adaptive_frame_field_flag 等于1时表明在本序列中的图像如果不是场模式就是帧场自适应模式,等于0时表示本序列中的图 像如果不是场模式就是帧模式。。表 列举了一个序列中可能出现的编码模式: a. 全部是帧,对应于 frame_mbs_only_flag =1 的情况。 b. 帧和场共存。frame_mbs_only_flag =0, mb_adaptive_frame_field_flag =0 c. 帧场自适应和场共存。frame_mbs_only_flag =0, mb_adaptive_frame_field_flag =1 值得注意的是,帧和帧场自适应不能共存在一个序列中。 direct_8x8_inference_flag 用于指明 B 片的直接和 skip 模式下运动矢量的预测方法。 frame_cropping_flag 用于指明解码器是否要将图像裁剪后输出,如果是的话,后面紧跟着的 四个句法元素分别指出左右、上下裁剪的宽度。 frame_crop_left_offset,frame_crop_right_offset,frame_crop_bottom_offset,frame_crop_bottom_offs et 如上一句法元素所述。 vui_parameters_present_flag 指明 vui 子结构是否出现在码流中,vui 的码流结构在附录中指明, 用以表征视频格式等额外信息。 7.3.3 图像参数集语义 pic_parameter_set_id 用以指定本参数集的序号,该序号在各片的片头被引用。 seq_parameter_set_id 指明本图像参数集所引用的序列参数集的序号。 entropy_coding_mode_flag 指明熵编码的选择,本句法元素为0时,表示熵编码使用 CAVLC,本句 法元素为1时表示熵编码使用 CABAC pic_order_present_flag POC 的三种计算方法在片层还各需要用一些句法元素作为参数,本句法 元素等于1时表示在片头会有句法元素指明这些参数;本句法元素等于0时,表示片头不会给出这 些参数,这些参数使用默认值。 num_slice_groups_minus1 本句法元素加1后指明图像中片组的个数。H.264 中没有专门的句法元 素用于指明是否使用片组模式,当本句法元素等于0(即只有一个片组),表示不使用片组模式,后 面也不会跟有用于计算片组映射的句法元素。 slice_group_map_type 当 num_slice_group_minus1 大于0,既使用片组模式时,本句法元素出现在 码流中,用以指明片组分割类型。 map_units 的定义: - 当 frame_mbs_only_flag 等于1时,map_units 指的就是宏块 - 当 frame_mbs_only_falg 等于0时 - 帧场自适应模式时,map_units 指的是宏块对 - 场模式时,map_units 指的是宏块 - 帧模式时,map_units 指的是与宏块对相类似的,上下两个连续宏块的组合体。 run_length_minus1[i] 用以指明当片组类型等于0时,每个片组连续的 map_units 个数。 top_left[i],bottom_right[i] 用以指明当片组类型等于2时,矩形区域的左上及右下位置。 slice_group_change_direction_flag 当片组类型等于3、4、5时,本句法元素与下一个句法元素 一起指明确切的片组分割方法。 slice_group_change_rate_minus1 用以指明变量 SliceGroupChangeRAte pic_size_in_map_units_minus1 在片组类型等于6时,用以指明图像以 map_units 为单位的大小。 slice_group_id[i] 在片组类型等于6时,用以指明某个 map_units 属于哪个片组。 num_ref_idx_l0_active_minus1 加1后指明目前参考帧队列的长度,即有多少个参考帧(包括短期 和长期)。值得注意的是,当目前解码图像是场模式下,参考帧队列的长度应该是本句法元素再乘以 2,因为场模式下各帧必须被分解以场对形式存在。(这里所说的场模式包括图像的场及帧场自适应 下的处于场模式的宏块对) 本句法元素的值有可能在片头被重载。 读者可能还记得在序列参数集中有句法元素 num_ref_frames 也是跟参考帧队列有关,它们的区 别是 num_ref_frames 指明参考帧队列的最大值,解码器用它的值来分配内存空间; num_ref_idx_l0_active_minus1 指明在这个队列中当前实际的、已存在的参考帧数目,这从它的名字 “active”中也可以看出来。 这个句法元素是 H.264 中最重要的句法元素之一,在第章我们可以看到,编码器要通知解码器 某个运动矢量所指向的是哪个参考图像时,并不是直接传送该图像的编号,而是传送该图像在参考 帧队列中的序号。这个序号并不是在码流中传送的,而是编码器和解码器同步地、用相同的方法将 参考图像放入队列,从而获得一个序号。这个队列在每解一个图像,甚至是每个片后都会动态地更 新。维护参考帧队列是编解码器十分重要的工作,而本句法元素是维护参考帧队列的重要依据。参 考帧队列的复杂的维护机制是 H.264 重要也是很有特色的组成部分 num_ref_idx_l1_active_minus1 与上一个句法元素的语义一致,只是本句法元素用于 list1,而上一 句法元素用于 list0 weighted_pred_flag 用以指明是否允许P和SP片的加权预测,如果允许,在片头会出现用以计 算加权预测的句法元素。 weighted_bipred_flag 用以指明是否允许 B 片的加权预测,本句法元素等于 0 时表示使用默认加权 预测模式,等于 1 时表示使用显式加权预测模式,等于 2 时表示使用隐式加权预测模式。 pic_init_qp_minus26 加 26 后用以指明亮度分量的量化参数的初始值。在 H.264 中,量化参数 分三个级别给出:图像参数集、片头、宏块。在图像参数集给出的是一个初始值。 pic_init_qs_minus26 与上一个句法元素语义一致,只是用于 SP 和 SI chroma_qp_index_offset 色度分量的量化参数是根据亮度分量的量化参数计算出来的,本句 法元素用以指明计算时用到的参数。 deblocking_filter_control_present_flag 编码器可以通过句法元素显式地控制去块滤波的强 度,本句法元素指明是在片头是否会有句法元素传递这个控制信息。如果本句法元素等于 0,那些 用于传递滤波强度的句法元素不会出现,解码器将独立地计算出滤波强度。 constrained_intra_pred_flag 在 P 和 B 片中,帧内编码的宏块的邻近宏块可能是采用的帧间 编码。当本句法元素等于 1 时,表示帧内编码的宏块不能用帧间编码的宏块的像素作为自己的预测, 即帧内编码的宏块只能用邻近帧内编码的宏块的像素作为自己的预测;而本句法元素等于 0 时,表 示不存在这种限制。 redundant_pic_cnt_present_flag 指明是否会出现 redundant_pic_cnt 句法元素。 7.3.4 片头语义 first_mb_in_slice 片中的第一个宏块的地址, 片通过这个句法元素来标定它自己的地址。 要注意的是在帧场自适应模式下,宏块都是成对出现,这时本句法元素表示的是第几个宏块对,对 应的第一个宏块的真实地址应该是 2 * first_mb_in_slice slice_type 指明片的类型,具体语义见表7.21。 表 7.21 slice_type 语义 slice_type Name of slice_type 0 P (P slice) 1 B (B slice) 2 I (I slice) 3 SP (SP slice) 4 SI (SI slice) 5 P (P slice) 6 B (B slice) 7 I (I slice) 8 SP (SP slice) 9 SI (SI slice) IDR 图像时, slice_type 等于 2, 4, 7, 9。 pic_parameter_set_id 图像参数集的索引号. 范围 0 到 255。 frame_num 每个参考帧都有一个依次连续的 frame_num 作为它们的标识,这指明了各图像的解码顺 序。但事实上我们在表 中可以看到,frame_num 的出现没有 if 语句限定条件,这表明非参考帧的片 头也会出现 frame_num。只是当该个图像是参考帧时,它所携带的这个句法元素在解码时才有意义。 如表 7.21 所示例子: 表 7.21 某个序列的 frame_num 值 (该序列中 B 帧一律不作为参考帧,而 P 帧一律作为参考帧。) 图像序号 图像类型 是否用作参考 frame_num 1 I 是 0 2 P 是 1 3 B 否 2 4 P 是 2 5 B 否 3 6 P 是 3 7 B 否 4 8 P 是 4 … … … … H.264 对 frame_num 的值作了如下规定:当参数集中的句法元素 gaps_in_frame_num_value_allowed_flag 不为 1 时,每个图像的 frame_num 值是它前一个参考帧的 frame_num 值增加 1。这句话包含有两层意思: 1) 当 gaps_in_frame_num_value_allowed_flag 不为 1,即 frame_num 连续的情况下,每个图像的 frame_num 由前一个参考帧图像对应的值加 1,着重点是“前一个参考帧”。在表 7.21 中第 3 个图像 是 B 帧,按照定义,它的 frame_nun 值应是前一个参考帧,即第 2 个图像对应的值加 1,即为 2;第 4 个图像是 P 帧,由于该序列 B 帧都不作为参考帧,所以对于该图像来说,定义中所谓的“前一个参 考帧”,仍旧是指的第 2 个图像,所以对于第 4 个图像来说,它的 frame_num 的取值和第 3 个图像一 样,也为 2。相同的情况也发生在第 6 和第 8 帧上。 前面我们曾经提到,对于非参考帧来说,它的 frame_num 值在解码过程中是没有意义的,因为 frame_num 值是参考帧特有的,它的主要作用是在该图像被其他图像引用作运动补偿的参考时提供 一个标识。但 H.264 并没有在非参考帧图像中取消这一句法元素,原因是在 POC 的第二种和第三种 解码方法中可以通过非参考帧的 frame_num 值计算出他们的 POC 值,在第八章中会详细讲述这个问 题。 2) 当 gaps_in_frame_num_value_allowed_flag 等于 1,前文已经提到,这时若网络阻塞,编码器可 以将编码后的若干图像丢弃,而不用另行通知解码器。在这种情况下,解码器必须有机制将缺失的 frame_num 及所对应的图像填补,否则后续图像若将运动矢量指向缺失的图像将会产生解码错误。 field_pic_flag 这是在片层标识图像编码模式的唯一一个句法元素。所谓的编码模式是指的帧编码、 场编码、帧场自适应编码。当这个句法元素取值为 1 时 属于场编码; 0 时为非场编码。 序列参数集中的句法元素 frame_mbs_only_flag 和 mb_adaptive_frame_field_flag 再加上本句法元 素共同决定图像的编码模式,如图 7.7 所示。 图 7.7 图像编码模式的判断流程 在序列参数集中我们已经能够计算出图像的高和宽的大小,但曾强调那里的高是指的该序列中 图像的帧的高度,而一个实际的图像可能是帧也可能是场,对于图像的实际高度,应进一步作如下 处理: PicHeightInMbs = FrameHeightInMbs / ( 1 + field_pic_flag ) 从而我们可以得到在解码器端所用到的其他与图像大小有关的变量: PicHeightInSamplesL = PicHeightInMbs * 16 PicHeightInSamplesC = PicHeightInMbs * 8 PicSizeInMbs = PicWidthInMbs * PicHeightInMbs 前文已提到,frame_num 是参考帧的标识,但是在解码器中,并不是直接引用的 frame_num 值, 而是由 frame_num 进一步计算出来的变量 PicNum,在第八章会详细讲述由 frame_num 映射到 PicNum 的算法。这里介绍在该算法中用到的两个变量。 MaxPicNum: 表征 PicNum 的最大值,PicNum 和 frame_num 一样,也是嵌在循环中,当达到这个最大值时, PicNum 将从 0 开始重新计数。 - 如果field_pic_flag= 0, MaxPicNum = MaxFrameNum. - 否则,MaxPicNum =2*MaxFrameNum. CurrPicNum: 当前图像的 PicNum 值,在计算 PicNum 的过程中,当前图像的 PicNum 值是由 frame_num 直接 算出(在第八章中会看到,在解某个图像时,要将已经解码的各参考帧的 PicNum 重新计算一遍, 新的值参考当前图像的 PicNum 得来)。 - 如果field_pic_flag= 0, CurrPicNum = frame_num. - 否则, CurrPicNum= 2 * frame_num + 1. Frame_num是对帧编号的,也就是说如果在场模式下,同属一个场对的顶场和底场两个图像的 frame_num的值是相同的。在帧或帧场自适应模式下,就直接将图像的frame_num赋给PicNum, 而在场模式下,将2 * frame_num 和 2 * frame_num + 1两个值分别赋给两个场。2 * frame_num + 1 这个值永远被赋给当前场,解码到当前场对的下一个场时,刚才被赋为2 * frame_num + 1的场的 PicNum值被重新计算为2 * frame_num ,而将2 * frame_num + 1赋给新的当前场。 bottom_field_flag 等于 1 时表示当前图像是属于底场;等于 0 时表示当前图像是属于顶场。 idr_pic_id IDR 图像的标识。不同的 IDR 图像有不同的 idr_pic_id 值。值得注意的是,IDR 图像 有不等价于 I 图像,只有在作为 IDR 图像的 I 帧才有这个句法元素,在场模式下,IDR 帧的两个 场有相同的 idr_pic_id 值。idr_pic_id 的取值范围是 [0,65535],和 frame_num 类似,当它的值超 出这个范围时,它会以循环的方式重新开始计数。 pic_order_cnt_lsb 在 POC 的第一种算法中本句法元素来计算 POC 值,在 POC 的第一种算法中是 显式地传递 POC 的值,而其他两种算法是通过 frame_num 来映射 POC 的值。注意这个句法元素的 读取函数是 u(v),这个 v 的来自是图像参数集: v=log2_max_pic_order_cnt_lsb_minus4 + 4。 delta_pic_order_cnt_bottom 如果是在场模式下,场对中的两个场都各自被构造为一个图像,它们 有各自的 POC 算法来分别计算两个场的 POC 值,也就是一个场对拥有一对 POC 值;而在是帧模式 或是帧场自适应模式下,一个图像只能根据片头的句法元素计算出一个 POC 值。根据 H.264 的规定, 在序列中有可能出现场的情况,即 frame_mbs_only_flag 不为 1 时,每个帧或帧场自适应的图像在解 码完后必须分解为两个场,以供后续图像中的场作为参考图像。所以当 frame_mb_only_flag 不为 1 时,帧或帧场自适应中包含的两个场也必须有各自的 POC 值。在第八章中我们会看到,通过本句法 元素,可以在已经解开的帧或帧场自适应图像的 POC 基础上新映射一个 POC 值,并把它赋给底场。 当然,象句法表指出的那样,这个句法元素只用在 POC 的第一个算法中。 delta_pic_order_cnt[ 0 ], delta_pic_order_cnt[ 1 ]: 前文已经提到,POC 的第二和第三种算法是从 frame_num 映射得来,这两个句法元素用于映射 算法。delta_pic_order_cnt[ 0 ]用于帧编码方式下的底场和场编码方式的场,delta_pic_order_cnt[ 1 ] 用于帧编码方式下的顶场。在第八章会详细讲述 POC 的三种算法。 redundant_pic_cnt 冗余片的 id 号。 direct_spatial_mv_pred_flag 指出在B图像的直接预测的模式下,用时间预测还是用空间预测。1: 空间预测;0:时间预测。 num_ref_idx_active_override_flag 在图像参数集中我们看到已经出现句法元素 num_ref_idx_l0_active_minus1 和 num_ref_idx_l1_active_minus1 指定当前参考帧队列中实际可用的参 考帧的数目。在片头可以重载这对句法元素,以给某特定图像更大的灵活度。这个句法元素就是指 明片头是否会重载,如果该句法元素等于 1,下面会出现新的 num_ref_idx_l0_active_minus1 和 num_ref_idx_l1_active_minus1 值。 num_ref_idx_l0_active_minus1 、num_ref_idx_l1_active_minus1 如上个句法元素中所介绍,这是重载的num_ref_idx_l0_active_minus1 及 num_ref_idx_l1_active_minus1 cabac_init_idc 给出 cabac 初始化时表格的选择,范围 0 到 2。 slice_qp_delta 指出在用于当前片的所有宏块的量化参数的初始值。QPY SliceQPY = 26 + pic_init_qp_minus26 + slice_qp_delta QPY 的范围是 0 to 51。 我们前文已经提到,H.264 中量化参数是分图像参数集、片头、宏块头三层给出的,前两层各 自给出一个偏移值,这个句法元素就是片层的偏移。 sp_for_switch_flag 指出 SP 帧中的 p 宏块的解码方式是否是 switching 模式,在第八章有详细的说明。 slice_qs_delta 与 slice_qp_delta 的与语义相似,用在 SI 和 SP 中的 QSY = 26 + pic_init_qs_minus26 + slice_qs_delta QSY 值的范围是 0 到 51。 disable_deblocking_filter_idc H.264指定了一套算法可以在解码器端独立地计算图像中各边界的滤 波强度进行滤波。除了解码器独立计算之外,编码器也可以传递句法元素来干涉滤波强度,当这个 句法元素指定了在块的边界是否要用滤波,同时指明那个块的边界不用块滤波,在第八章会详细讲 述。. slice_alpha_c0_offset_div2 给出用于增强 α 和 tC0 的偏移值 FilterOffsetA = slice_alpha_c0_offset_div2 << 1 slice_alpha_c0_offset_div2 值的范围是 -6 到+6。 slice_beta_offset_div2 给出用于增强 β 和 tC0 的偏移值 FilterOffsetB = slice_beta_offset_div2 << 1 slice_beta_offset_div2 值的范围是 -6 到+6。 slice_group_change_cycle 当片组的类型是 3, 4, 5,由句法元素可获得片组中 映射单元的数目: MapUnitsInSliceGroup0 = Min( slice_group_change_cycle * SliceGroupChangeRate, PicSizeInMapUnits ) slice_group_change_cycle 由 Ceil( Log2( PicSizeInMapUnits ÷ SliceGroupChangeRate + 1 ) )位比特表示 slice_group_change_cycle 值的范围是 0 到 Ceil( PicSizeInMapUnits÷SliceGroupChangeRate )。 7.3.5 参考图像序列重排序的语义 每一个使用帧间预测的图像都会引用前面已解码的图像作为参考帧。如前文所述,编码器给每 个参考帧都会分配一个唯一性的标识,即句法元素 frame_num。但是,当编码器要指定当前图像的 参考图像时,并不是直接指定该图像的 frame_num 值,而是使用通过下面步骤最终得出的 ref_id 号: frame_num PicNum ref_id计算 排序 图 7.8 由 frame_num 到 ref_id 其中,从 frame_num 到变换到变量 PicNum 主要是考虑到场模式的需要,当序列中允许出现场时, 每个非场的图像(帧或 帧场自适应)解码后必须分解为一个场对,从而需要为它们分解后的两个场 各自指定一个标识;进一步从 PicNum 到 ref_id 是为了能节省码流,因为 PicNum 的值通常都比较大, 而在帧间预测时,需要为每个运动矢量都指明相对应的参考帧的标识,如果这个标识选用 PicNum 开销就会比较大,所以 H.264 又将 PicNum 映射为一个更小的变量 ref_id。在编码器和解码器都同步 地维护一个参考帧队列,每解码一个片就将该队列刷新一次,把各图像按照特定的规则进行排序,排序 后各图像在队列中的序号就是该图像的 ref_id 值,在下文中我们可以看到在宏块层表示参考图像的标 识就是 ref_id, 在第八章我们会详细讲述队列的初始化、排序等维护算法。本节和下节介绍的是在维 护队列时两个重要操作:重排序(reordering)和标记(marking)所用到的句法元素。 说明:句法元素的后缀名带有 L0 指的是第一个参数列表;句法元素的后缀名带有 L1 指的是第二个 参数列表(用在 B帧预测中)。 ref_pic_list_reordering_flag_l0 指明是否进行重排序操作,这个句法元素等于 1 时表明紧跟着会有一 系列句法元素用于参考帧队列的重排序。 re_pic_list_reordering_flag_l1 与上个句法元素的语义相同,只是本句法元素用于参考帧队列 L1。 reordering_of_pic_nums_idc 指明执行哪种重排序操作,具体语义见表 7.22。 表 7.22 重排序操作 reordering_of_pic_nums_idc 操作 0 短期参考帧重排序,abs_diff_pic_num_minus1会出现在码流中,从当 前图像的PicNum减去 (abs_diff_pic_num_minus1 + 1) 后指明需要重 排序的图像。 1 短期参考帧重排序,abs_diff_pic_num_minus1会出现在码流中,从当 前图像的PicNum加上 (abs_diff_pic_num_minus1 + 1) 后指明需要重 排序的图像。 2 长期参考帧重排序,long_term_pic_num会出现在码流中,指明需要重 排序的图像。 3 结束循环,退出重排序操作。 abs_diff_pic_num_minus1 在对短期参考帧重排序时指明重排序图像与当前的差。见表 7.22。 long_term_pic_num 在对长期参考帧重排序时指明重排序图像。见表 7.22。 从上文可以看到,每组 reordering_of_pic_nums_idc 、 abs_diff_pic_num_minus1 或 reordering_of_pic_nums_idc、 long_term_pic_num 只能对一个图像操作,而通常情况下都需要对一 组图像重排序,所以在码流中一般会有个循环,反复出现这些重排序的句法元素,如图,循环直到 reordering_of_pic_nums_id 等于 3 结束,我们在表 7 .22 中也可以看到这种情况。 图 7.8 重排序流程 7.3.6 加权预测的语义 luma_log2_weight_denom 给出参考帧列表中参考图像所有亮度的加权系数,是个初始值 luma_log2_weight_denom 值的范围是 0 to 7。 chroma_log2_weight_denom 给出参考帧列表中参考图像所有色度的加权系数,是个初始值 chroma_log2_weight_denom 值的范围是 0 to 7。 luma_weight_l0_flag 等于 1 时,指的是在参考序列 0 中的亮度的加权系数存在;等于 0 时,在参考 序列 0 中的亮度的加权系数不存在。 luma_weight_l0[ i ] 用参考序列 0 预测亮度值时,所用的加权系数。如果 luma_weight_l0_flag is = 0, luma_weight_l0[ i ] = 2luma_log2_weight_denom 。 luma_offset_l0[ i ] 用参考序列 0 预测亮度值时,所用的加权系数的额外的偏移。luma_offset_l0[ i ] 值 的范围–128 to 127。如果 luma_weight_l0_flag is = 0, luma_offset_l0[ i ] = 0 。 chroma_weight_l0_flag,chroma_weight_l0[ i ][ j ] ,chroma_offset_l0[ i ][ j ] 与上述三个类似,不 同的是这三个句法元素是用在色度预测。 luma_weight_l1_flag, luma_weight_l1, luma_offset_l1, chroma_weight_l1_flag, chroma_weight_l1, chroma_offset_l1。 与 luma_weight_l0_flag, luma_weight_l0, luma_offset_l0, chroma_weight_l0_flag, chroma_weight_l0, chroma_offset_l0 的语义相似,不同点是这几个句法元素是用在参考序列 1 中。 7.3.7 参考图像序列标记 (marking)操作的语义 前文介绍的重排序(reordering)操作是对参考帧队列重新排序,而标记(marking)操作负责将 参考图像移入或移出参考帧队列。 no_output_of_prior_pics_flag 仅在当前图像是 IDR 图像时出现这个句法元素,指明是否要将前面已 解码的图像全部输出。 long_term_reference_flag 与上个图像一样,仅在当前图像是 IDR 图像时出现这一句法元素。这个 句法元素指明是否使用长期参考这个机制。如果取值为 1,表明使用长期参考,并且每个 IDR 图像 被解码后自动成为长期参考帧,否则(取值为 0),IDR 图像被解码后自动成为短期参考帧。 adaptive_ref_pic_marking_mode_flag 指明标记(marking)操作的模式,具体语义见表 7.23。 表 7.23 标记(marding)模式 adaptive_ref_pic_marking_mode_flag 标记(marking)模式 0 先入先出(FIFO):使用滑动窗的机制,先入先出,在这种模式 下没有办法对长期参考帧进行操作。 1 自适应标记(marking):后续码流中会有一系列句法元素显式指 明操作的步骤。自适应是指编码器可根据情况随机灵活地作出决 策。 memory_management_control_operation 在自适应标记(marking)模式中,指明本次操作的具体内 容,具体语义见表 7.24。 表 7.24 标记(marking)操作 memory_management_control_operation 标记(marking)操作 0 结束循环,退出标记(marding)操作。 1 将一个短期参考图像标记为非参考图像,也 即将一个短期参考图像移出参考帧队列。 2 将一个长期参考图像标记为非参考图像,也 即将一个长期参考图像移出参考帧队列。 3 将一个短期参考图像转为长期参考图像。 4 指明长期参考帧的最大数目。 5 清空参考帧队列,将所有参考图像移出参考 帧队列,并禁用长期参考机制 6 将当前图像存为一个长期参考帧。 difference_of_pic_nums_minus1 当 memory_management_control_operation 等于 3 或 1 时,由 这个 句法元素可以计算得到需要操作的图像在短期参考队列中的序号。参考帧队列中必须存在这个图像。 long_term_pic_num 当 memory_management_control_operation 等于 2 时, 从此句法元素得到所要 操作的长期参考图像的序号。 long_term_frame_idx 当 memory_management_control_operation 等于 3 或 6 ,分配一个长期参考 帧的序号给一个图像。 max_long_term_frame_idx_plus1 此句法元素减 1 ,指明长期参考队列的最大数目。 max_long_term_frame_idx_plus1 值的范围 0 to num_ref_frames。 7.3.8 片数据的语义 cabac_alignment_one_bit 当熵编码模式是 CABAC 时,此时要求数据字节对齐,即数据从下一个字节 的第一个比特开始,如果还没有字节对齐将出现若干个 cabac_alignment_one_bit 作为填充。 mb_skip_run 当图像采用帧间预测编码时,H.264 允许在图像平坦的区域使用“跳跃”块,“跳跃”块 本身不携带任何数据,解码器通过周围已重建的宏块的数据来恢复“跳跃”块。在表 我们可以看到, 当熵编码为 CAVLC 或 CABAC 时,“跳跃”块的表示方法不同。当 entropy_coding_mode_flag 为 1, 即熵编码为 CABAC 时,是每个“ 跳跃” 块都会有句法元素 mb_skip_flag 指明,而 entropy_coding_mode_flag 等于 0,即熵编码为 CAVLC 时,用一种行程的方法给出紧连着的“跳跃” 块的数目,即句法元素 mb_skip_run。mb_skip_run 值的范围 0 to PicSizeInMbs – CurrMbAddr 。 mb_skip_flag 见上一条,指明当前宏块是否是跳跃编码模式的宏块。 mb_field_decoding_flag 在帧场自适应图像中,指明当前宏块所属的宏块对是帧模式还是场模式。0 帧模式;1 场模式。如果一个宏块对的两个宏块句法结构中都没有出现这个句法元素,即它们都是“跳 跃”块时,本句法元素由以下决定: - 如果这个宏块对与相邻的、左边的宏块对属于同一个片时,这个宏块对的 mb_field_decoding_flag 的值等于左边的宏块对的 mb_field_decoding_flag 的值。 - 否则,这个宏块对的 mb_field_decoding_flag 的值等于上边同属于一个片的宏块对的 mb_field_decoding_flag 的值。 - 如果这个宏块对既没有相邻的、上边同属于一个片的宏块对;也没有相邻的、左边同属于一个片 的宏块对,这个宏块对的 mb_field_decoding_flag 的值等于 0,即帧模式。 end_of_slice_flag 指明是否到了片的结尾。 7.3.9 宏块层的语义 mb_type 指明当前宏块的类型。H.264规定,不同的片中允许出现的宏块类型也不同。下表指明在 各种片类型中允许出现的宏块种类。 表 7.25 各种片中允许出现的宏块类型 片类型 允许出现的宏块种类 I (slice) I 宏块 P (slice) P 宏块、 I宏块 B (slice) B 宏块、 I宏块 SI (slice) SI 宏块、 I宏块 SP (slice) P 宏块、 I 宏块 可以看到,I 片中只允许出现 I 宏块,而 P 片中即可以出现 P 宏块也可以出现 I 宏块,也就是说,在 帧间预测的图像中也可以包括帧内预测的图像。其它片也有类似情况。 每一种宏块包含许多的类型。比起以往的视频编码标准,H.264 定义了更多的宏块的类型。 在帧间预测模式下,宏块可以有七种运动矢量的划分方法。 在帧内预测模式下,可以是帧内 16x16 预测,这时可以宏块有四种预测方法,即四种类型;也可以 是 4x4 预测,这时每个 4x4 块可以有九种预测方法,整个宏块共有 144 种类型。 mb_type 并不能描述以上所有有关宏块类型的信息。事实上可以体会到,mb_tye 是出现在宏块层的 第一个句法元素,它描述跟整个宏块有关的基本的类型信息。在不同的片中 mb_type 的定义是不同 的,下面我们分别讨论 I、P、B 片中这个句法元素的意义。 a) I 片中的 mb_type,具体语义见表 表 7.26 I 片中的 mb_type mb_type 类型名称 预测方式 帧内16x16的预测模式 CodedBlockPatternChroma CodedBlockPatternLuma 0 I_4x4 Intra_4x4 无 无 无 1 I_16x16_0_0_0 Intra_16x16 0 0 0 2 I_16x16_1_0_0 Intra_16x16 1 0 0 3 I_16x16_2_0_0 Intra_16x16 2 0 0 4 I_16x16_3_0_0 Intra_16x16 3 0 0 5 I_16x16_0_1_0 Intra_16x16 0 1 0 6 I_16x16_1_1_0 Intra_16x16 1 1 0 7 I_16x16_2_1_0 Intra_16x16 2 1 0 8 I_16x16_3_1_0 Intra_16x16 3 1 0 9 I_16x16_0_2_0 Intra_16x16 0 2 0 10 I_16x16_1_2_0 Intra_16x16 1 2 0 11 I_16x16_2_2_0 Intra_16x16 2 2 0 12 I_16x16_3_2_0 Intra_16x16 3 2 0 13 I_16x16_0_0_1 Intra_16x16 0 0 15 14 I_16x16_1_0_1 Intra_16x16 1 0 15 15 I_16x16_2_0_1 Intra_16x16 2 0 15 16 I_16x16_3_0_1 Intra_16x16 3 0 15 17 I_16x16_0_1_1 Intra_16x16 0 1 15 18 I_16x16_1_1_1 Intra_16x16 1 1 15 19 I_16x16_2_1_1 Intra_16x16 2 1 15 20 I_16x16_3_1_1 Intra_16x16 3 1 15 21 I_16x16_0_2_1 Intra_16x16 0 2 15 22 I_16x16_1_2_1 Intra_16x16 1 2 15 23 I_16x16_2_2_1 Intra_16x16 2 2 15 24 I_16x16_3_2_1 Intra_16x16 3 2 15 25 I_PCM 无 无 无 无 表中 , Intra_4x4 表示使用帧内 4x4 预测, Intra_16x16 表示使用帧内 16x16 预测。 当使用帧内 16x16 时,类型名称由了如下的结构组成: I_16x16_x_y_z 其中,x 对应于表中“帧内 16x16 的预测模式”字段的值,y 对应于表中“色度 CBP”字段的值,z 对应 于表中“亮度 CBP”的值。 - 帧内 16x16 的预测模式:当使用帧内 16x16 预测时,指定使用何种预测方式,帧内 16x16 共 有四种预测模式,第八章中会详细介绍这些预测模式的算法。 - CodedBlockPatternLuma:指定当前宏块色度分量的 CBP,CBP(CodedBlockPattern)是指子 宏块残差的编码方案。该变量详细语义见 coded_block_pattern 条目。 - 亮度 CBP:指定当前宏块亮度分量的 CBP,详细语义见 coded_block_pattern 条目。 我们看到,帧内 16x16 宏块类型的 mb_type 语义原比其它宏块类型的复杂,这是因为当使用帧 内 16x16 时,整个宏块是一个统一的整体,宏块中各子宏块、4x4 小块的预测模式信息都是相同的, 所以可以把这些信息放入 mb_type ,以减少码流。其它宏块类型的这些信息必须在各子块中另外用句 法元素指明。 b) P 片中的 mb_type ,具体语义见表 7.26。 表 7.26 P 片中的 mb_type mb_type 类型名称 宏块分区数目 预测模式 ( mb_type,0 ) 预测模式 ( mb_type, 1 ) 宏块分区宽度 ( mb_type ) 宏块分区高度 ( mb_type ) 0 P_L0_16x16 1 Pred_L0 无 16 16 1 P_L0_L0_16x8 2 Pred_L0 Pred_L0 16 8 2 P_L0_L0_8x16 2 Pred_L0 Pred_L0 8 16 3 P_8x8 4 无 无 8 8 4 P_8x8ref0 4 无 无 8 8 无 P_Skip 1 Pred_L0 无 16 16 在表 7.26 中,Pred_L0 表示用 L0,即前向预测。如果当前宏块的 mb_type 等于 0到 4, mb_type 的含 义见 表 7.26;当 mb_type 等于 5 到 30 时, mb_type 的含义见 表 7.25, 用 mb_type-5 所得到的值 来进行查找。预测模式(mb_type,n)预测模式是 mb_type 的函数,n 是宏块的第 n 个分区。 c) B 片中的 mb_type,具体语义见表 7.27。 如果当前宏块是属于 B片且 mb_type 等于 0 到 22, mb_type 的含义见 表 7-11;当 mb_type 等于 23 到 48 时, mb_type 的含义见 表 7-8, 用 mb_type-23 所得到的值来进行查找。 表 7.27 B 片中的 mb_type mb_type 类型名称 宏块分区数目 ( mb_type ) 预测模式 ( mb_type, 0 ) 预测模式 ( mb_type, 1 ) 宏块分区宽度 ( mb_type ) 宏块分区高度 ( mb_type ) 0 B_Direct_16x16 无 Direct 无 8 8 1 B_L0_16x16 1 Pred_L0 无 16 16 2 B_L1_16x16 1 Pred_L1 无 16 16 3 B_Bi_16x16 1 BiPred 无 16 16 4 B_L0_L0_16x8 2 Pred_L0 Pred_L0 16 8 5 B_L0_L0_8x16 2 Pred_L0 Pred_L0 8 16 6 B_L1_L1_16x8 2 Pred_L1 Pred_L1 16 8 7 B_L1_L1_8x16 2 Pred_L1 Pred_L1 8 16 8 B_L0_L1_16x8 2 Pred_L0 Pred_L1 16 8 9 B_L0_L1_8x16 2 Pred_L0 Pred_L1 8 16 10 B_L1_L0_16x8 2 Pred_L1 Pred_L0 16 8 11 B_L1_L0_8x16 2 Pred_L1 Pred_L0 8 16 12 B_L0_Bi_16x8 2 Pred_L0 BiPred 16 8 13 B_L0_Bi_8x16 2 Pred_L0 BiPred 8 16 14 B_L1_Bi_16x8 2 Pred_L1 BiPred 16 8 15 B_L1_Bi_8x16 2 Pred_L1 BiPred 8 16 16 B_Bi_L0_16x8 2 BiPred Pred_L0 16 8 17 B_Bi_L0_8x16 2 BiPred Pred_L0 8 16 18 B_Bi_L1_16x8 2 BiPred Pred_L1 16 8 19 B_Bi_L1_8x16 2 BiPred Pred_L1 8 16 20 B_Bi_Bi_16x8 2 BiPred BiPred 16 8 21 B_Bi_Bi_8x16 2 BiPred BiPred 8 16 22 B_8x8 4 无 无 8 8 无 B_Skip 无 Direct 无 8 8 表中, Pred_L0 表示使用 L0 ,即前向预测, Pred_L1 表示使用 L1 ,即后向预测, Bipred 表示双向预 测, Direct 表示直接预测模式。预测模式( mb_type,n )预测模式是 mb_type 的函数, n 是宏块的第 n 个分区。 pcm_alignment_zero_bit 等于 0 。 pcm_byte [ i ] 像素值。前 256 pcm_byte[ i ] 的值代表亮度像素的值,下一个 ( 256 * ( ChromaFormatFactor - 1 ) ) / 2 个 pcm_byte[ i ] 的值代表 Cb 分量的值. 最后一个 ( 256 * ( ChromaFormatFactor - 1 ) ) / 2 个 pcm_byte[ i ]的值代表 Cr 分量的值。 coded_block_pattern 即 CBP,指亮度和色度分量的各小块的残差的编码方案,所谓编码方案有以 下几种: a) 所有残差(包括 DC、AC)都编码。 b) 只对 DC 系数编码。 c) 所有残差(包括 DC、AC)都不编码。 这个句法元素同时隐含了一个宏块中亮度、色度分量的 CBP,所以第一步必须先分别解算出各 分量各自 CBP 的值。其中,两个色度分量的 CBP 是相同的。变量 CodedBlockPatternLuma 是亮度分 量的 CBP,变量 CodedBlocPatternChroma 是色度分量的 CBP: 对于非 Intra_16x16 的宏块类型: CodedBlockPatternLuma = coded_block_pattern % 16 CodedBlockPatternChroma = coded_block_pattern / 16 对于Intra_16x16宏块类型,CodedBlockPatternLuma 和CodedBlockPatternChroma 的值不是由本 句法元素给出,而是通过mb_type得到。 - CodedBlockPatternLuma:是一个16位的变量,其中只有最低四位有定义。由于非Intra_16x16 的宏块不单独编码DC系数,所以这个变量只指明两种编码方案:残差全部编码或全部不编 码。变量的最低位比特从最低位开始,每一位对应一个子宏块,该位等于1时表明对应子宏 块残差系数被传送;该位等于0时表明对应子宏块残差全部不被传送,解码器把这些残差系 数赋为0。 - CodedBlockPatternChroma:当值为0、1、2时有定义,见表7.28。 表 7.28 CodedBlockPatternChroma 的定义 CodedBlockPatternChroma 定义 0 所有残差都不被传送,解码器把所有残差系数赋为0。 1 只有DC系数被传送,解码器把所有AC系数赋为0。 2 所有残差系数(包括DC、AC)都被传送。解码器用接收到的残差系 数重建图像。 mb_qp_delta 在宏块层中的量化参数的偏移值。mb_qp_delta 值的范围是 -26 to +25。 量化参数是 在图像参数集、片头、宏块分三层给出的,最终用于解码的量化参数由以下公式得到: QPY = ( QPY,PREV + mb_qp_delta + 52 ) % 52 (7-23 QPY, P R EV 是当前宏块按照解码顺序的前一个宏块的量化参数,我们可以看到,mb_qp_delta 所指示 的偏移是前后两个宏块之间的偏移。而对于片中第一个宏块的 QPY, P R E V 是由 7-16 式给出 QPY, P R EV = 26 + pic_init_qp_minus26 + slice_qp_delta 7.3.10 宏块预测的语义 prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ] rem_intra4x4_pred_mode[ luma4x4BlkIdx ] 帧内预测的模式也是需要预测的, prev_intra4x4_pred_mode_flag 用来指明帧内预测时,亮度分 量的预测模式的预测值是否就是真实预测模式,如果是,就不需另外再传预测模式。如果不是,就 由 rem_intra4x4_pred_mode 指定真实预测模式。 intra_chroma_pred_mode 在帧内预测时指定色度的预测模式,具体语义见表 7.29。 表 7.29 intra_chroma_pred_mode 的语义 intra_chroma_pred_mode 预测模式 0 DC 1 Horizontal 2 Vertical 3 Plane ref_idx_l0[ mbPartIdx ] 用参考帧队列 L0 进行预测,即前向预测时,参考图像在参考帧队列中的序 号。 其中 mbPartIdx 是宏块分区的序号。 如果当前宏块是非场宏块, 则 ref_idx_l0[ mbPartIdx ] 值的范围是 0 到 num_ref_idx_l0_active_minus1。 否则,如果当前宏块是场宏块,(宏块所在图像是场,当图像是帧场自适应时当前宏块处于场编 码的宏块对),ref_idx_l0[ mbPartIdx ] 值的范围是 0 到 2 * num_ref_idx_l0_active_minus1 + 1,如前 所述,此时参考帧队列的帧都将拆成场,故参考队列长度加倍。 ref_idx_l1[ mbPartIdx ] 语义同上,只是这个句法元素用于参考帧队列 L1,即后向预测。 mvd_l0[ mbPartIdx ][ 0 ][ compIdx ] 运动矢量的预测值和实际值之间的差。mbPartIdx 是宏块分区的 序号。CompIdx = 0 时水平运动矢量; CompIdx = 1 垂直运动矢量。 mvd_l1[ mbPartIdx ][ 0 ][ compIdx ] 语义同上,只是这个句法元素用于 List1,即后向预测。 7.3.11 子宏块预测的语义 sub_mb_type[ mbPartIdx ] 指明子宏块的预测类型,在不同的宏块类型中这个句法元素的语义不一 样。 a) P 宏块 表 7.30 P 宏块中的子宏块类型 sub_mb_type[ mbPartIdx ] sub_mb_type[ mbPartIdx ] NumSubMbPart ( sub_mb_type[ mbPartIdx ] ) SubMbPredMode ( sub_mb_type[ mbPartIdx ] ) SubMbPartWidth ( sub_mb_type[ mbPartIdx ] ) SubMbPartHeight ( sub_mb_type[ mbPartIdx ] ) 0 P_L0_8x8 1 Pred_L0 8 8 1 P_L0_8x4 2 Pred_L0 8 4 2 P_L0_4x8 2 Pred_L0 4 8 3 P_L0_4x4 4 Pred_L0 4 4 b) B 宏块 表 7.31 B 宏块中的子宏块类型 sub_mb_type[ mbPartIdx ] Name of sub_mb_type[ mbPartIdx ] NumSubMbPart ( sub_mb_type[ mbPartIdx ] ) SubMbPredMode ( sub_mb_type[ mbPartIdx ] ) SubMbPartWidth ( sub_mb_type[ mbPartIdx ] ) SubMbPartHeight ( sub_mb_type[ mbPartIdx ] ) 0 B_Direct_8x8 na Direct 4 4 1 B_L0_8x8 1 Pred_L0 8 8 2 B_L1_8x8 1 Pred_L1 8 8 3 B_Bi_8x8 1 BiPred 8 8 4 B_L0_8x4 2 Pred_L0 8 4 5 B_L0_4x8 2 Pred_L0 4 8 6 B_L1_8x4 2 Pred_L1 8 4 7 B_L1_4x8 2 Pred_L1 4 8 8 B_Bi_8x4 2 BiPred 8 4 9 B_Bi_4x8 2 BiPred 4 8 10 B_L0_4x4 4 Pred_L0 4 4 11 B_L1_4x4 4 Pred_L1 4 4 12 B_Bi_4x4 4 BiPred 4 4 ref_idx_l0[ mbPartIdx ] 与 3.11 中定义的 ref_idx_l0 相同. ref_idx_l1[ mbPartIdx ] 与 3.11 中定义的 ref_idx_l1 相同. mvd_l0[ mbPartIdx ][ subMbPartIdx ][ compIdx ] 与 7.3.11 中定义 mvd_l0 相同,除了 subMbPartIdx: 子宏块中的索引值。 mvd_l1[ mbPartIdx ][ subMbPartIdx ][ compIdx ]同上,list1 7.3.12 用 CAVLC 方式编码的残差数据的语义 coeff_token 指明了非零系数的个数,拖尾系数的个数。 trailing_ones_sign_flag 拖尾系数的符号 - 如果trailing_ones_sign_flag = 0, 相应的拖尾系数是+1。 - 否则,trailing_ones_sign_flag =1,相应的拖尾系数是-1。 - level_prefix and level_suffix 非零系数值的前缀和后缀。 total_zeros 系数中 0 的总个数。 run_before 在非零系数之前连续零的个数。 7.3.13 用 CABAC 方式编码的残差数据的语义 coded_block_flag 指出当前块是否包含非零系数。 如果 coded_block_flag= 0, 这个块不包含非零系数。 如果 coded_block_flag = 1,这个块包含非零系数。 significant_coeff_flag[ i ] 指出在位置为 i 处的变换系数是否为零。 如果 significant_coeff_flag[ i ] = 0, 在位置为 i 处的变换系数为零。 否则,significant_coeff_flag[ i ] =1, 在位置为 i 处的变换系数不为零。 last_significant_coeff_flag[ i ] 表示当前位置 i 处的变换系数是否为块中最后一个非零系数。 如果 last_significant_coeff_flag[ i ] =1, 这个块中随后的系数都为零。 否则, 这个块中随后的系数中还有其它的非零系数. coeff_abs_level_minus1[ i ]系数的绝对值减 1。 coeff_sign_flag[ i ] 系数的符号位。 - coeff_sign_flag = 0, 正数。 - coeff_sign_flag=1, 负数。 7.4 总结 H.264 的句法是经过精心设计的,构成句法的各句法元素既相互依赖而又相互独立。依赖是为 了减少冗余信息,提高编码效率;而独立是为了使通信更加鲁棒,在错误发生时限制错误的扩散。 但是,依赖和独立又是矛盾的,往往要在它们之间作取舍。在实现 H.264 的编解码器时,同样有速 度和健壮性这样一组矛盾的关系,既要在现有硬件平台上提高编解码的速度,又要作充分的安全检 查、建立异常处理机制,如果能详细考察句法元素间的依赖与独立关系,充分利用 H.264 各句法元 素间本身的内在联系与安全机制,便能够设计出即快速,又安全、健壮的编解码算法。 参考文献 1. “Draft ITU-T recommendation and final draft international standard of joint video specification (ITU-T Rec. H.264/ISO/IEC 14 496-10 AVC,”in Joint Video Team (JVT) of ISO/IEC MPEG and ITU-T VCEG, JVTG050,2003. 2. T. Wiegand, G. J. Sullivan, G. Bjøntegaard, and A. Luthra, “Overview of the H.264/AVC Video Coding Standard,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 560–576, July 2003. 3. S. Wenger, “H.264/AVC over IP,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 645–656, July 2003. 4. T. Stockhammer, M. M. Hannuksela, and T. Wiegand, “H.264/AVC in wireless environments,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 657–673, July 2003. 5. T. Wedi, “Motion compensation in H.264/AVC,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 577–586, July 2003. 6. M. Flierl and B. Girod, “Generalized B pictures and the draft JVT/H.264 video compression standard,” IEEE Trans. Circuits Syst. Video Technol.,vol. 13, pp. 587–597, July 2003. 7. T. Wiegand, H. Schwarz, A. Joch, F. Kossentini, and G. J. Sullivan, “Rate-constrained coder control and comparison of video coding standards,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 688–703, July 2003. 8. Schafer Ralf, Wiegand Thomas, Schwarz Heiko. “The emerging H.264/AVC Standard EBU Technical Review”, Jan.2003 9. M. Karczewicz and R. Kurçeren, “The SP and SI frames design forH.264/AVC,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 637–644, July 2003. 10. H. Malvar, A. Hallapuro, M. Karczewicz, and L. Kerofsky, “Low-Complexity transform and quantization in H.264/AVC,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 598–603, July 2003. 11. J. Ribas-Corbera, P. A. Chou, and S. Regunathan, “A generalized hypothetical reference decoder for H.264/AVC,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 674–687, July 2003. 12. Mathias Wien, “Variable Block-Size Transforms for H.264/AVC” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 604–613, July 2003. 13. Michael Horowitz, Anthony Joch, Faouzi Kossentini,“H.264/AVC Baseline Profile Decoder Complexity Analysis” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 704–716, July 2003. 第 8 章 H.264/AVC 解码器的原理和实现 8.1 解码器原理 如前所述,H.264 包含 VCL(视频编码层)和 NAL(网络提取层)。VCL 包括核心压缩引擎和 块、宏块和片的语法级别定义,它的设计目标是尽可能地独立于网络得进行高效地编解码;而 NAL 则负责将 VCL 产生的比特字符串适配到各种各样的网络和多元环境中,它覆盖了所有片级别以上的 语法级别,同时支持以下功能:支持独立片解码;起始码唯一保证;支持 SEI;支持流格式编码数 据传送。 总体来说,NAL 解码器负责将符合 H.264 码流规范的压缩视频流解码,并进行图像重建。根据 图 8.1 中的解码器框图,我们可以看到基本的解码流程如下:解码器从 NAL 中接收压缩的比特流, 经过对码流进行熵解码获得一系列量化系数 X;这些系数经过反量化和反变换得到残差数据 D;解 码器使用从码流中解码得到的头信息创建一个预测块 PRED,PRED 与残差数据 D 求和得到图像块 数据 uF;最后每个 uF 通过去方块滤波得到重建图像的解码块 F。 图 8.1 解码器功能框图 为更清晰的描述解码器的工作流程,我们用如图 8.2 的流程图来描述一帧图像的完整解码过程。 NAL单元解码 检测NAL单元边界,将 码流分割成多个NAL单 元 重建图像 片DPA解码 片DPB解码 片DPC解码 普通片解码 从码流中读入一个片的 编码数据 EBSP->RBSP->SODB 初始化宏块片组映射图 根据当前图像类型初始 化参考图像列表 进行片解码 初始化参考图像序 号数组 初始化当前宏块解 码设置 从NAL中读入当前 宏块的语法元素 进行宏块解码 去方块滤波 参考图像列表存储与处 理 A E C D B 图 8.2 解码流程图 在图 8.2 中,A 框中的 NAL 单元边界检测和单元解码在 8.2 节中描述;8.3 节中将详细介绍解码 过程中所使用到的一个重要参数,参考图像序列号(POC)的计算方法;8.4 节将阐述 B 框中宏块片 组映射图的产生过程;C 框中的片数据分割的解码过程描述在 8.5 节;D 框中的参考图像列表初始化 和 E 框中参考图像存储和列表后处理等过程将在 8.6 节和 8.7 节中详细介绍。 8.2 NAL 单元 早期的视频压缩标准总是集中于比特流的概念,高层语法元素被编码分割,以允许比特流发生 误码时进行重同步。而在 H.264/AVC 标准中,NAL(Network Abstract Layer)则是以 NALU(NAL unit) 为单元来支持编码数据在基于包交换技术网络中的传输的;它定义了符合传输层或存储介质需求的 数据格式,同时提供头信息,从而提供了视频编码与外部世界的接口。网络层和传输层的 RTP 封装 只针对基于 NAL 单元的本地 NAL 接口,且每个 NAL 单元都只包含整数个字节。 8.2.1 NAL 单元结构 一个 NAL 单元定义了可用于基于包和基于比特流系统的基本格式,区别这两种格式的方法在于 每个比特流传输层都有一个起始代码。在 NAL 解码器接口,它假定按传输顺序传递 NALU,同时, 在 NALU 的头部设置标识接收正确的、丢失的或错误的标识位,如果在有效载荷中包含位错误,则 通过标识位来标志。 一个 NAL 单元结构上是一个包含一定语法元素的可变长字节字符串,例如 NAL 单元可以携带 一个编码片,A、B、C 型数据分割或一个序列或图像参数集。每个 NAL 单元由一个字节的头和一 个包含可变长编码符号的字符串组成。头部含三个定长比特区,如图 8.3 所示:NALU 类型(T), NAL-REFERENCE-IDC(R)和隐藏比特位(F)。NALU 类型用 5bit 来代表 NALU 的 32 种中不同 类型特征,类型 1-12 是 H.264 的定义的,类型 24-31 是用于 H.264 以外的,RTP 负荷规范使用这 其中的一些值来定义包聚合和分裂,其他值为 H.264 保留。R 比特用于在重构过程中标记一个 NAL 单元的重要性,值为 0 表示这个 NAL 单元没有用于预测,因此可被解码器抛弃而不会有错误扩散, 值高于 0 表示此 NAL 单元要用于无漂移重构,且值越高,对此 NAL 单元丢失的影响越大。最后是 隐藏比特位,在 H.264 编码中默认置为 0,当网络识别到单元中存在比特错误时,可将其置为 1。F 位主要用于适应不同种类的网络环境(比如有线无线相结合的环境)。例如对于从无线到有线的网关, 一边是无线的非 IP 协议环境,一边是有线网络的无比特错误的环境。假设一个 NAL 单元到达无线 那边时,校验和检测失败,网关可以选择从 NAL 流中去掉这个 NALU 单元,,也可以把已知被破坏 的 NAL 单元前传给接收端。在这种情况下,智能的解码器将尝试重构这个 NAL 单元(已知它可能 包含比特错误)。而非智能的解码器将简单的抛弃这个 NAL 单元。 图 8.3 NALU 头结构 8.2.2 NAL 单元解码过程 在进行 NAL 单元解码之前,首先或者通过 RTP 协议解析(采用 RTP 封装),或者通过起始码检 测(采用比特流方式),从传输码流中获取 NAL 单元数据。NAL 单元解码的总体流程是:首先从 NAL 单元中提取出 RBSP 语法结构,然后按照如图 8.4 所示的流程处理 RBSP 语法结构。因此对于 NAL 单元的解码过程,其输入是 NAL 单元,输出结果是经过解码的当前图像(CurrPic)的样点值。 在 H.264 规范文档中规定:对于同一码流,所有的解码器必须产生数值上相同的结果,且必须符合 规范定义的解码过程的标准。 从码流中获取NALU 将NALU中数据转换成RBSP NALU的类型 SLICE=1 IDR=5 进入普 通片解 码过程 DPA=2 进入A 型分割 解码过 程 DPB=3 进入B 型分割 解码过 程 DPC=4 进入C 型分割 解码过 程 SEI=6 PPS=7 SPS=8 出错处 理 进入 SPS解 码过程 进入 PPS 解码过 程 进入 SEI数 据解析 过程 Else 图 8.4 NAL 单元解码 在图 8.4 中,类型为 7、8 的 NAL 单元中分别包含了序列参数集和图像参数集。图像参数集和 序列参数集在其它数据 NAL 单元的解码过程中作为参数使用,在这些数据 NAL 单元的片头中通过 语法元素 pic_parameter_set_id 设置它们使用的图像参数集编号,而相应的每个图像参数集中通过 语法元素 seq_parameter_set_id 设置它所使用的序列参数集编号。 8.3 图像序列号(picture order count)的计算 8.3.1 图像序列号(POC) 在 H.264 中,图像序列号(POC)主要用于标识图象的播放顺序,同时还用于在对帧间预测片 解码时,标记参考图像的初始图像序号,表明下列情况下帧或场之间的图像序号差别:使用时间直 接预测模式的运动矢量推算时;B 片中使用固有模式加权预测时;解码器一致性检测时。 其中对于每个编码帧有两个图像序列号,分别称为顶场序列号(TopFieldOrderCnt)和底场序列 号(BottomFieldOrderCnt);对于每个编码场有一个图像序列号,对于一个编码顶场其称为 TopFieldOrderCnt,对于编码底场,其称为 BottomFieldOrderCnt;对于每个编码场对有两个图像序列 号,TopFieldOrderCnt 和 BottomFieldOrderCnt 分别用于标记该场对的顶场和底场。TopFieldOrderCnt 和 BottomFieldOrderCnt 分别指明了相应的顶场/底场相对于前一个 IDR 图像(或解码顺序中前一个 包含 memory_management_control_operation=5 的参考图像)的第一个输出场的相对位置。 由于 H.264 使用了 B 帧预测,使得图象的解码顺序并不一定等于播放顺序,但它们之间存在一 定的映射关系。H.264 中一共定义了三种 POC 的编码方法,句法元素 pic_order_cnt_type 就是用来 通知解码器该用哪种方法来计算 POC, 下面我们称之为 POC 类型。TopFieldOrderCnt 和 BottomFieldOrderCnt 根据当前序列参数集中的语法元素 pic_order_cnt_type(POC 类型)的值不同, 按照如图 8.5 的计算流程获得。 如当前图像的语法元素 memory_management_control_operation 等于 5 时,在当前图像解码完 成后,进行图像序列号的重新初始化操作,即将顶场和底场的 POC 均减去 PicOrderCnt( CurrPic )。 CurrPic 标志当前图像。函数 PicOrderCnt( )的实现参见图 8.6。 当前序列参数集中变量 pic_order_cnt_type PrevPicOrderCntMsb=0 0 2 idr_flag或 last_has_mmco_5 PrevPicOrderCntLsb=0 PrevPicOrderCntLsb = toppoc 计算当前图像PicOrderCntMsb 根据当前图像的帧场模式和顶/ 底场属性对ThisPOC、 framepoc、bottompoc进行修正 进行序列号计算环境后处理 idr_flag 根据idr_flag 和last_has_mmco_5 两变量情况计算变量帧序号偏 移FrameNumOffset 计算ExpectedPicOrderCnt 根据当前图像的帧场模式和顶/ 底场属性对ThisPOC、 framepoc、bottompoc进行修正 进行序列号计算环境后处理 帧号偏移和所 有的POC赋值 为0 计算变量帧序号偏移 FrameNumOffset 根据当前图像的帧场模式和顶/ 底场属性计算ThisPOC、 framepoc、bottompoc 进行序列号计算环境后处理 Start END Y N N Y 图 8.5 图像序列号的计算 对于图像序列号 POC,H.264 规范规定在 H.264 码流中不会出现下列情况: z 一个IDR帧的Min( TopFieldOrderCnt, BottomFieldOrderCnt )不等于0; z 一个IDR顶场的TopFieldOrderCnt不等于0; z 一个IDR底场的BottomFieldOrderCnt不等于0。 因此对于一个编码 IDR 帧的两个场,TopFieldOrderCnt 和 BottomFieldOrderCnt 中至少有一个等 于 0。 同时规范规定码流中不允许存在数据导致 TopFieldOrderCnt , BottomFieldOrderCnt , PicOrderCntMsb ,或 FrameNumOffset 超出-231 到 231-1 的范围。如我们使用 DiffPicOrderCnt( picA, picB )表明两幅图像播放的时间间隔,即 DiffPicOrderCnt( picA, picB ) = PicOrderCnt( picA ) - PicOrderCnt( picB ),这样码流中的所有数据必须满足 DiffPicOrderCnt( picA, picB )的取值范围 -215 到 215 – 1。理由如下:假设 X 是当前图像, Y和 Z 是同一序列中的另两个图 像,Y 和 Z 被认为是从 X 起始的相同输出顺序方向,当 DiffPicOrderCnt( X, Y ) 和 DiffPicOrderCnt( X, Z ) 均为正或负时,其和不能超出-231 到 231-1 的范围。 根据当前图像性质的不同,其使用的图像序列号 POC 会有所区别,因此使用函数 PicOrderCnt( picX )标记图像 picX 的图像序列号,很多应用中 PicOrderCnt( X )正比于图像 X 的采样 时间与 IDR 采样时间的差值,其函数如图 8.6 中定义: picX的类型 顶场 PicOrderCnt( picX ) = 场picX的TopFieldOrderCnt 帧或场对 PicOrderCnt( picX ) = Min( TopFieldOrderCnt, BottomFieldOrderCnt ) 底场 PicOrderCnt( picX ) = 场picX的BottomFieldOrderCnt 图 8.6 PicOrderCnt( picX )函数实现 下面我们分别介绍 POC 类型分别为 0,1 和 2 的情况下,POC 的计算过程。 8.3.2 POC 类型为 0 的 POC 计算 当 pic_order_cnt_type 等于 0 时,基于前一个参考图像(按照解码顺序)的 PicOrderCntMsb 计算 当前图像的 TopFieldOrderCnt 和(或) BottomFieldOrderCnt。首先计算变量 prevPicOrderCntMsb(前 一个参考图像的 PicOrderCntMsb),然后计算当前图像的 PicOrderCntMsb,最后计算当前图像的 TopFieldOrderCnt 和(或) BottomFieldOrderCnt。具体的计算流程参见图 8.7。 图 8.7 POC 类型=0 时 POC 的计算流程 8.3.3 POC 类型为 1 的 POC 计算 当 pic_order_cnt_type 等于 1 时,TopFieldOrderCnt 和(或) BottomFieldOrderCnt 按照流程图 8.8 计算。主要基于前一图像(按照解码顺序)的 FrameNumOffset,来计算 TopFieldOrderCnt 和( 或 ) BottomFieldOrderCnt。计算过程中涉及到两个变量 prevFrameNum 和 prevFrameNumOffset ,其中 prevFrameNum 是前一图像的 frame_num ,而对于 prevFrameNumOffset,如当前图像不是 IDR,而 前一图像的 memory_management_control_operation 等于 5,prevFrameNumOffset 设为 0;否则, prevFrameNumOffset 设置等于前一图像的 FrameNumOffset。 Start END FrameNumOffset = prevFrameNumOffset 是IDR图像片 FrameNumOffset = 0前一图像的帧号比 当前图像大 FrameNumOffset = prevFrameNumOffset + MaxFrameNum absFrameNum > 0 计算picOrderCntCycleCnt和fra meNumInPicOrderCntCycle 计算变量expectedDeltaPerPicOr derCntCycle 计算变量expectedPicOrderCnt 当前图像为帧 计算变量TopFieldOrderCnt 当前图像为顶场 计算变量TopFieldOrderCnt 计算变量BottomFieldOrderCnt 计算变量BottomFieldOrderCnt N Y Y N Y N Y Y N 计算变量absFrameNum 图 8.8 POC 类型=1 时 POC 的计算流程 8.3.4 POC 类型为 2 的 POC 计算 当 pic_order_cnt_type 等于 2 时, TopFieldOrderCnt 和(或) BottomFieldOrderCnt 的计算流程 如图 8.9。Picture order count 类型 2 不能用于包含连续非参考图像的序列中,且解码结果导致输出的 顺序与解码顺序相同。流程图中 prevFrameNum 表示按照解码顺序的前一图像的 frame_num。如当 前图像不是 IDR 图像,而前一图像的 memory_management_control_operation 等于 5 , prevFrameNumOffset 设为 0;否则, prevFrameNumOffset 设置等于前一图像的 FrameNumOffset。 Start END FrameNumOffset = prevFrameNumOffset 是IDR图像片 FrameNumOffset = 0前一图像的帧号比 当前图像大 FrameNumOffset = prevFrameNumOffset + MaxFrameNum nal_ref_idc = = 0 tempPicOrderCnt=2 * (FrameNumOffset + frame_num) –1tempPicOrderCnt = 2 * (FrameNumOffset + frame_num) 当前图像为帧 计算变量TopFieldOrderCnt 当前图像为顶场 计算变量TopFieldOrderCnt 计算变量BottomFieldOrderCnt 计算变量BottomFieldOrderCnt N Y Y N Y N Y Y N N 是IDR图像片 tempPicOrderCnt = 0 N Y 图 8.9 POC 类型=2 时 POC 的计算流程 8.4 宏块片组映射图的产生 解码器在对每个片解码之前,首先需要基于当前有效图像参数集和需解码的片头,产生宏块片 组映射图变量 MbToSliceGroupMap ,且此变量对于一个接入单元中的所有片均有效。当 num_slice_groups_minus1 等于 1 而且 slice_group_map_type 等于 3,4,或 5 时,片组 0 和 1 的大小 和形状根据表 8.1 由 slice_group_change_direction_flag 确定。 表 8.1 片组图类型 片组图类型 片组变化方向标记 说明 3 0 顺时针盒状展开 3 1 逆时针盒状展开 4 0 光栅扫描 4 1 逆光栅扫描 5 0 向右擦除 5 1 向左擦除 此时,按照定义的增长顺序的片组图单元 MapUnitsInSliceGroup0 被分配给片组 0,剩余的片组 图单元 PicSizeInMapUnits – MapUnitsInSliceGroup0 被分配给片组 1。 当 num_slice_groups_minus1 等于 1 且 slice_group_map_type 等于 4 或 5 时,标记左上片组大小 的变量 sizeOfUpperLeftGroup 这样定义:当片组变化方向标记=1 时,等于 PicSizeInMapUnits – MapUnitsInSliceGroup0,否则等于 MapUnitsInSliceGroup0。 变量 mapUnitToSliceGroupMap 的计算方法参见流程图 8.10。 图 8.10 变量 mapUnitToSliceGroupMap 的计算流程 在图 8.10 的前景左切出类型中,在从 0 到 PicSizeInMapUnits – 1 之间至少存在一个 i,满足 mapUnitToSliceGroupMap[ i ]等于 iGroup(对于每个从 0 到 num_slice_groups_minus1 的 iGroup 值) 即每个片组中至少包含一个片组图单元。此时片组覆盖区域的矩形可能重叠。片组 0 包含处于 top_left[ 0 ] 和 bottom_right[ 0 ] 定义的矩形内部的所有宏块。一个 ID 大于 0 且小于 num_slice_groups_minus1 的片组包含所定义的矩形所覆盖的宏块,且这些宏块没有被 ID 较小的片组 覆盖。ID 等于 num_slice_groups_minus1 的片组包含没有被别的片组覆盖的宏块。 计算出 mapUnitToSliceGroupMap 后,会调用下面将要描述的片组图单元转换成宏块片组图的过 程将片组图单元 mapUnitToSliceGroupMap转换成宏块片组映射图MbToSliceGroupMap,完成转换后, 调用函数 NextMbAddress( n )计算变量 nextMbAddress,函数流程如图 8.11。 图 8.11 函数 NextMbAddress( n )的流程 在片组图单元转换成宏块片组图的过程规定如下: – 如frame_mbs_only_flag等于1或field_pic_flag等于1,宏块片组图设置为: MbToSliceGroupMap[ i ] = mapUnitToSliceGroupMap[ i ] (8.1) – 如MbaffFrameFlag等于1,宏块片组图设置为: MbToSliceGroupMap[ i ] = mapUnitToSliceGroupMap[ i / 2 ] (8.2) – 否则(即frame_mbs_only_flag等于0且mb_adaptive_frame_field_flag等于0且field_pic_flag等于0), 宏块片组图设置为: MbToSliceGroupMap[ i ] = mapUnitToSliceGroupMap[ ( i / ( 2 * PicWidthInMbs ) ) * PicWidthInMbs+ ( i % PicWidthInMbs ) ] (8.3) 其中 i 表示从 0 到 PicSizeInMbs – 1 的每个值。 8.5 片数据分割的解码 解码器根据一个片的 A 型数据分割 RBSP,如 NAL 类型为 3 或 4 时,还有一个属于同一片的 B 型数据分割 RBSP 或 C 型数据分割 RBSP,来产生一个完整的编码片。 当不使用片数据分割时,编码片仅有一个片层,没有数据分割 RBSP。分割 RBSP 包含一个片头, 后跟包含了片中宏块数据的分类 2,3,4 语法元素的一个片数据语法结构。 当使用片数据分割时,片中的宏块数据分割成 1 到 3 个分割并位于单独的 NAL 单元中。分割 A 包括一个片数据分割 A 头部和所有的第 2 类语法元素。分割 B 包括一个片数据分割 B 头部和所有的 第 3 类语法元素。分割 C 包括一个片数据分割 C 头部和所有的第 4 类语法元素。其中第 3 类语法元 素与 I 和 SI 宏块类型的残差数据的解码有关。第 4 类语法元素与 P 和 B 宏块类型的残差数据的解码 有关。第 2 类包含了所有其它的宏块解码相关的语法元素,这些信息通常称为头信息。片数据分割 A 的头部包含了片头的所有语法元素,还有一个 slice_id 用于关联相应的分割 B 和分割 C。分割 B 和 C 的头只包含 slice_id,用于建立与相应得分割 A 的联系。 当使用数据分割时,每类语法元素从单独的 NAL 单元中解析出来,如某类语法元素不存在,则 相应的 NAL 单元不需出现。此时片数据分割的解析过程与没有分割 RBSP 类似,只需根据片数据分 割的类型读出相应的语法元素。 8.6 参考图像列表的初始化 解码器在对每个 P、SP 或 B 片解码之前需要进行参考图像列表的初始化,从而生成参考图像列 表 RefPicList0,当对 B 片解码时,还将生成另一个参考图像列表 RefPicList1。在参考图像列表中, 解过码的参考图像根据码流的规定被标记成"used for short-term reference"或"used for long-term reference",其中短期参考图像使用 frame_num 的值作为标志,而长期参考图像则被分配一个长期参 考帧索引,根据码流中的语法元素设定。 下面将对如下几点进行描述: z 对每个短期参考帧,变量FrameNum和FrameNumWrap如何赋值; z 每个短期参考图像的变量PicNum 如何计算; z 长期参考图像的变量LongTermPicNum如何计算。 参考图像通过参考索引来进行标志。一个参考索引是一个变量 PicNum 和 LongTermPicNum 的 数组下标,此数组称为参考图像列表。 如果 RefPicListX[ i ]使用 LongTermPicNum(对于一个长期参考图像),将 LongTermEntry ( RefPicListX[ i ])设置为 1;如果 RefPicListX[ i ]使用 PicNum(对于一个短期参考图像),则设为 0。其中 RefPicListX[ i ]标记参考图像列表 X 的第 i 个分量,其中 X=0 或 1。 在每个片开始解码时,参考图像列表 RefPicList0,对于 B 片有 RefPicList1 如下处理: z 初始参考列表RefPicList0和B片的RefPicList1根据8.6.2中描述计算; z 初始参考列表RefPicList0和B片的RefPicList1根据8.6.3中描述调整。 参考图像列表RefPicList0的下标分量有num_ref_idx_l0_active_minus1 + 1个, B片的RefPicList1 下标分量有 num_ref_idx_l1_active_minus1 + 1 个。一个参考图像可在 RefPicList0 或 RefPicList1 中出 现一次以上。 8.6.1 图像序号的计算 变量 FrameNum,FrameNumWrap,PicNum, LongTermFrameIdx 和 LongTermPicNum 用于参考 图像列表的初始化过程(见 2),调整过程(见 3)和解码参考图像标记过程(见??)。 对于每个短期参考图像,变量 FrameNum 和 FrameNumWrap 的计算过程如下。首先, FrameNum 设置成相应短期参考图像的片头中解码所得得语法元素 frame_num,然后变量 FrameNumWrap 这样 计算:如 FrameNum 大于当前图像片头中的 frame_num,则 FrameNumWrap 等于 FrameNum 减去 MaxFrameNum;否则 FrameNumWrap 等于 FrameNum。 对于每个长期参考图像,变量 LongTermFrameIdx 按照 8.7 中的方法计算。 对于每个短期参考图像,分配一个 PicNum 变量,对于每个长期参考图像,分配一个 LongTermPicNum 变量。这些变量的值由当前图像的 field_pic_flag 和 bottom_field_flag 的值决定,它 们的设置见图 8.12。 图 8.12 PicNum 变量的计算 8.6.2 参考图像列表的初始化 解码器在对 P,SP,或 B 片片头解码时进行参考图像列表的初始化,生成初始化好的参考图像 列表 RefPicList0,和 B 片解码时所需的 RefPicList1。RefPicList0 和 RefPicList1 的各分量使用变量 PicNum 和 LongTermPicNum 初始化,如 8.6.2.1-8.6.2.5 所述。 当 8.6.2.1-8.6.2.5 中产生的 RefPicList0 或 RefPicList1 中的分量个数分别大于 num_ref_idx_l0_active_minus1 + 1 或 num_ref_idx_l1_active_minus1 + 1 时,多余的分量将从列表中 丢弃;如果情况相反,分量个数分别小于 num_ref_idx_l0_active_minus1 + 1 或 num_ref_idx_l1_active_minus1 + 1 时,列表中剩余的分量设置为"no reference picture"。 8.6.2.1 帧中 P 和 SP 片的参考帧列表的初始化 解码器在对一个编码帧中的 P 或 SP 片解码之前通过参考帧列表的初始化生成 RefPicList0。 RefPicList0 是排序的,短期参考帧和短期补充参考场对位于长期参考帧和长期参考场对之前;同时, 短期参考帧和短期补充参考场对根据 PicNum 值进行降序排列;长期参考帧和长期参考场对根据 LongTermPicNum 值进行升序排列。同时在 H.264 中对帧进行解码时,不论 MbaffFrameFlag 取什么 值,帧间预测不使用不成对的参考场。 例如,当三个参考帧使用 PicNum=300,302,303 标记为"用于短期参考",两个参考帧用 LongTermPicNum=0,3 标记为"用于长期参考": z RefPicList0[0] 设置为 PicNum = 303, z RefPicList0[1] 设置为 PicNum = 302, z RefPicList0[2] 设置为 PicNum = 300, z RefPicList0[3] 设置为 LongTermPicNum = 0, z RefPicList0[4] 设置为 LongTermPicNum = 3. 且 LongTermEntry( RefPicList0[ i ] ) 设置为 0,当 i =0, 1, and 2;设置为 1,当 i = 3 ,4。 8.6.2.2 场中 P 和 SP 片的参考帧列表的初始化 解码器在对一个编码场中的 P 或 SP 片解码之前同样需要首先进行 RefPicList0 的初始化,不同 的是对一个场解码时,参考图像列表中的每个场都有单独的列表索引;而且对一个场解码时,可用 的参考图像数将是解码一个帧时的两倍。在此过程中,首先需要计算两个有序的参考帧列表 refFrameList0ShortTerm 和 refFrameList0LongTerm;为方便参考帧列表排列,解码的帧,参考场对, 不成对参考场,和一个场标记为“用于短期参考” 或“用于长期参考”的参考帧均被认为是参考帧。这 两个列表的产生过程如下: z 所有的有一个或更多场标记为“用于短期参考”的帧的 FrameNumWrap 包含在短期参考帧列 表 refFrameList0ShortTerm 中。如当前场是参考场对的第二个场(按照解码顺序)且第一个 场标记为“用于短期参考”,当前场的 FrameNumWrap 也包含在 refFrameList0ShortTerm 中。 refFrameList0ShortTerm 按照 FrameNumWrap 值的降序进行排列; z 所有的有一个或更多场标记为“用于长期参考”的帧的 LongTermFrameIdx 包含在长期参考帧 列表 refFrameList0LongTerm 中。如当前场是参考场对的第二个场(按照解码顺序)且第一 个场标记为“ 用于长期参考” ,第一个场的 LongTermFrameIdx 也包含在 refFrameList0LongTerm。 refFrameList0LongTerm 按照 LongTermFrameIdx 值的升序进行排 列。 在这两个列表产生后,将根据在 8.6.2.5 中定义的过程,使用 refFrameList0ShortTerm 和 refFrameList0LongTerm 作为输入,生成 RefPicList0。 8.6.2.3 帧模式的 B 片参考图像列表的初始化 与 8.6.2.1、8.6.2.2 不同,解码器在对一个编码帧的 B 片解码时首先需要对参考帧列表 RefPicList0 和 RefPicList1 进行初始化。对于 B 片,RefPicList0 和 RefPicList1 中短期参考图像的排列顺序取决 于输出次序,即由 PicOrderCnt( )给定。参考帧列表 RefPicList0 和 RefPicList1 都是有序排列的,其 中短期参考帧和短期参考场对均排在长期参考帧和长期参考场对之前。 参考帧列表 RefPicList0 详细的排列顺序如下: z 短期参考帧和短期参考场对排列顺序如下:首先是 PicOrderCnt( CurrPic )- PicOrderCnt( frm0 ) 值最大的短期参考帧或参考场对 frm0 ,按照降序排列到 PicOrderCnt( frm1 )最小的短期参考帧或参考场对 frm1,然后是 PicOrderCnt( frm2 )- PicOrderCnt( CurrPic )值最小的短期参考帧或参考场对 frm2,然后按照升序排列到 PicOrderCnt( frm3 )值最大的短期参考帧或参考场对; z 长期参考帧和长期参考场对的顺序按照 LongTermPicNum 值的升序排列。 参考帧列表 RefPicList1 详细的排列顺序如下: z 短期参考帧和短期参考场对排列顺序如下:首先是 PicOrderCnt( frm4 )- PicOrderCnt( CurrPic ) 值最小的短期参考帧或参考场对 frm4 ,按照升序排列到 PicOrderCnt( frm5 )最大的短期参考帧或参考场对 frm5,然后是 PicOrderCnt( CurrPic )- PicOrderCnt( frm6 ) 值最大的短期参考帧或参考场对 frm6 ,然后按照降序排列到 PicOrderCnt( frm7 )值最小的短期参考帧或参考场对 frm7; z 长期参考帧和长期参考场对的顺序按照 LongTermPicNum 值的升序排列; z 当参考图像列表 RefPicList1 有多于一个入口且它与 RefPicList0 相同时,头两个入口 RefPicList1[0] 和 RefPicList1[1]将被交换。 8.6.2.4 场模式下 B 片的参考帧列表初始化 同样解码器在对一个编码场的 B 片解码之前首先需要初始化参考帧列表 RefPicList0 和 RefPicList1。当对一个场解码时,存储的参考帧的每个场使用一个唯一的索引标记为一个单独的参 考图象。RefPicList0 和 RefPicList1 中短期参考图像的顺序取决于输出次序,即由 PicOrderCnt( )给定。 在此过程中,首先需要推导三个有序的参考帧列表 refFrameList0ShortTerm、refFrameList1ShortTerm 和 refFrameListLongTerm。在下面的描述中,用术语“参考条目”表示已解码参考帧、参考场对和非成 对参考场。 refFrameList0ShortTerm 列表构建方法如下:首先是 PicOrderCnt( CurrPic )- PicOrderCnt( f0 )值最 大的参考条目 f0,按照降序排列到 PicOrderCnt( f1 )最小的参考条目 f1,然后是 PicOrderCnt( f2 )- PicOrderCnt( CurrPic )值最小的短期参考帧或参考场对 f2,然后按照升序排列到 PicOrderCnt( f3 )值 最大的参考条目 f3 。须注意的是如当前场的 nal_ref_idc 大于 0 且根据解码顺序当前编码场前面是属 于同一参考场对的编码场 fld1 时,fld1 必须用 PicOrderCnt( fld1 )包含在列表 refFrameList0ShortTerm 中,且需符合前面所述的排序规则。 refFrameList1ShortTerm 的构建构成如下:首先是 PicOrderCnt( f4 )- PicOrderCnt( CurrPic )值最小 的参考条目 f4 ,按照升序排列到 PicOrderCnt( f5 ) 最大的短期参考条目 f5 ,然后是 PicOrderCnt( CurrPic )- PicOrderCnt( f6 )值最大的参考条目 f6,然后按照降序排列到 PicOrderCnt( f7 ) 值最小的参考条目 f7。如当前场的 nal_ref_idc 大于 0 且根据解码顺序当前编码场前面是属于同一参 考场对的编码场 fld2 时,fld2 必须用 PicOrderCnt( fld2 )包含在列表 refFrameList1ShortTerm 中,且需 符合前面所述的排序规则。 对于 refFrameListLongTerm,其列表次序按照 LongTermPicNum 值的升序排列。如当前图像的场 对标记为“用于长期参考”,它将被包含在列表 refFrameListLongTerm 中。一个仅一个场标记为“用于 长期参考”的参考条目也包含在列表 refFrameListLongTerm 中。 在三个列表生成后,根据 8.6.2.5 中描述的过程,使用 refFrameList0ShortTerm 和 refFrameListLongTerm 作为输入,生成 RefPicList0 ;使用 refFrameList1ShortTerm 和 refFrameListLongTerm 作为输入,生成 RefPicList1。当参考图像列表 RefPicList1 有多于一个入口且 它与 RefPicList0 相同时,头两个入口 RefPicList1[0] 和 RefPicList1[1]将被交换。 8.6.2.5 场模式的参考帧列表的初始化 解码器在场模式下,对 P 片、SP 片和 B 片解码时,首先需要根据上面描述的过程生成参考帧列 表 refFrameListXShortTerm (X 为 0 或 1)和 refFrameListLongTerm;然后在以它们作为输入参数是, 生成参考图像列表 RefPicListX (X 为 0 或 1)。 在参考图像列表 RefPicListX 中,短期参考场位于长期参考场之前。RefPicListX 的推导过程如下: z 短期参考场的顺序根据已排序的帧列表 refFrameListXShortTerm 选择奇偶交替的场得到:首 先是与当前场奇偶性相同的场。如一个参考帧的某个场未解码或未被标记为“用于短期参 考”,丢失的场将被忽略,下一个从 refFrameListXShortTerm 选择的相同奇偶性的有效的存 储参考场被插入 RefPicListX。如 refFrameListXShortTerm 中没有更多的奇偶交替的短期参 考场,下一个未被索引的奇偶有效的场按照它们在 refFrameListXShortTerm 的顺序插入 RefPicListX; z 长期参考场的顺序根据已排序的帧列表 refFrameListLongTerm 选择奇偶交替的场得到:首 先是与当前场奇偶性相同的场。如一个参考帧的某个场未解码或未被标记为“用于长期参 考”,丢失的场将被忽略,下一个从 refFrameListLongTerm 选择的相同奇偶性的有效的存储 参考场被插入 RefPicListX。如 refFrameListLongTerm 中没有更多的奇偶交替的长期参考场, 下一个未被索引的奇偶有效的场按照它们在refFrameListLongTerm的顺序插入RefPicListX。 8.6.3 参考帧列表的重排序 解码器在根据 8.6.2.2 中描述的过程产生参考图像列表 RefPicList0 和 RefPicList1 后,需要根据片 头码流中的相关语法元素,如 ref_pic_list_reordering_flag_l0 、 ref_pic_list_reordering_flag_l1 、 reordering_of_pic_nums_idc、abs_diff_pic_num_minus1 和 long_term_pic_num 等的规定,经过下面的 重排序过程进行列表的重排序。重排序的流程如图 8.13 所示。 Start END ref_pic_list_reordering_flag_l0=1 reordering_of_pic_nums_idc 进行列表0的长期参考帧重排序 参考图像列表0重排序过程结束进行列表0的短期参考帧重排序 refIdxL0=0 ref_pic_list_reordering_flag_l1=1 reordering_of_pic_nums_idc 进行列表1的长期参考帧重排序 参考图像列表1重排序过程结束进行列表1的短期参考帧重排序 refIdxL1=0 Y 0,1 2 3 Y 2 0,1 3 N N 图 8.13 参考帧列表的重排序流程 其中 refIdxL0 是参考图像列表 RefPicList0 的一个索引,refIdxL1 是参考图像列表 RefPicList1 的 一个索引,流程图中的短期参考帧重排序过程和长期参考帧重排序过程在 8.6.2.1 和 8.6.2.2 中详细描 述。请注意,在短期参考帧的重排序和长期参考帧的重排序过程中,表 RefPicListX 的长度比最终列 表需要的长度大 1;在排序过程执行完毕后,仅列表的元素 0 到 num_ref_idx_lX_active_minus1 需要 保留。 8.6.3.1 短期参考帧的重排序 短期参考帧的重排序过程的输入参数是参考图像列表 RefPicListX (X 为 0 或 1)和这个列表的一 个索引 refIdxLX;输出是调整之后的参考图像列表 RefPicListX (X 为 0 或 1)和增加后的索引 refIdxLX。过程的实现流程参见图 8.14。 Start END picNumLXNoWrap > CurrPicNum reordering_of_pic_nums_idc 计算变量picNumLXNoWrap picNumLX = picNumLXNoWrap – MaxPicNum picNumLXNoWrap =预测值 – 实际值 + MaxPicNum picNumLXNoWrap =预测值–实 际值计算变量picNumLX 根据变量picNumLX和refIdxLX 调整列表 修正refIdxLX 变量picNumLXNoWrap的 计算短期参考帧的重排序过程 Start 预测值小于实际值 picNumLXNoWrap =预测值 – 实际值 + MaxPicNum picNumLXNoWrap =预测值–实 际值 预测值与实际值之和 大于MaxPicNum END 0 1 Y N Y N 变量picNumLX的计算 Start END picNumLX = picNumLXNoWrap N Y 图 8.14 短期参考帧的重排序流程 其中图 8.14 中的预测值即 Draft 中的变量 picNumLXPred,是变量 picNumLXNoWrap 的预测值。 当一个片第一次调用本过程时( 即在 ref_pic_list_reordering( ) 语法中第一次出现 reordering_of_pic_nums_idc 等于 0 或 1), picNumL0Pred 和 picNumL1Pred 初始设置等于 CurrPicNum。 在每次 picNumLXNoWrap 的分配之后,picNumLXNoWrap 被赋给 picNumLXPred。 图中的 picNumLX 应指定一个标记为“用于短期参考”的参考图像,而不应指定一个标记为“不存 在”的短期参考图像。需要执行下面的过程将短期图像序号为 picNumLX 的图像放入 refIdxLX 索引 指定的位置,并将后面的其它图像向后移位,增加 refIdxLX 的值。 for( cIdx = num_ref_idx_lX_active_minus1 + 1; cIdx > refIdxLX; cIdx-- ) RefPicListX[ cIdx ] = RefPicListX[ cIdx – 1] RefPicListX[ refIdxLX++ ] = picNumLX nIdx = refIdxLX for( cIdx = refIdxLX; cIdx <= num_ref_idx_lX_active_minus1 + 1; cIdx++ ) (8.4) if( LongTermEntry( RefPicListX[ cIdx ] ) | | RefPicListX[ cIdx ] != picNumLX ) RefPicListX[ nIdx++ ] = RefPicListX[ cIdx ] 8.6.3.2 长期参考帧的重排序 长期参考帧的重排序过程的输入参数是参考图像列表 RefPicListX (X 为 0 或 1)和这个列表的一 个索引 refIdxLX;输出是调整之后的参考图像列表 RefPicListX (X 为 0 或 1)和增加后的索引 refIdxLX。 重排序过程如下:首先根据图像的 LongTermPicNum 等于 long_term_pic_num 这一条件,确定一 个将标记为“ 用于长期参考” 的参考图像;然后需要执行下面的过程将长期图像序号为 long_term_pic_num 的图像放入 refIdxLX 索引指定的位置,并将后面的其它图像向后移位;最后修 正 refIdxLX 的值。 for( cIdx = num_ref_idx_lX_active_minus1 + 1; cIdx > refIdxLX; cIdx-- ) RefPicListX[ cIdx ] = RefPicListX[ cIdx – 1] RefPicListX[ refIdxLX++ ] = LongTermPicNum nIdx = refIdxLX for( cIdx = refIdxLX; cIdx <= num_ref_idx_lX_active_minus1 + 1; cIdx++ ) if( !LongTermEntry( RefPicListX[ cIdx ] ) | | RefPicListX[ cIdx ] != LongTermPicNum ) RefPicListX[ nIdx++ ] = RefPicListX[ cIdx ] (8.5) 8.7 解码的参考图像的标记过程 根据图 8.2 中的解码整体流程可以看到,解码器在完成一幅图像的解码后,需要对已解码图像进 行存储处理,如果此图像用于其它图像的参考,同时还要进行已解码图像的标记操作。当 nal_ref_idc 等于 0 时,不需要进行此操作。也就是说一个 nal_ref_idc 不等于 0 的已解码图像,如是一个参考图 像,将被标记为“用于短期参考”或"用于长期参考"。 标记为“用于短期参考”或“用于长期参考”的帧或参考场对可在帧解码时用于帧间预测的参考;标 记为“用于短期参考”或“用于长期参考”的场可在场解码时用于帧间预测的参考;当一个帧或它的某 个场标记为“不用于参考”,或一个场标记为“不用于参考”时,它们将从参考列表中删除。 一个图像 在参考图像滑窗标记过程(采用先进先出机制)或参考图像自适应内存控制标记过程(采用客户自 适应标记机制)中,进行"不用于参考"的标记操作,这两个过程将在 8.7.1 和 8.7.2 描述。 解码器使用图像序号 PicNum 标记一个短期参考图像,使用长期图像序号 LongTermPicNum 标记 一个长期参考图像。关于 PicNum 和 LongTermPicNum 计算方法在 8.6.1 中已描述。 已解码参考图像标记过程的操作流程参见图 8.15。 图 8.15 参考图像标记流程 图中的图像不连续表示,当前图像与前一幅图像之间出现跳跃,即 frame_num 不等于 PrevRefFrameNum 且不等于 ( PrevRefFrameNum + 1 ) % MaxFrameNum。此外在对当前图像标记完 毕后,至少一个场标记为“用于参考”的帧数加上至少一个场标记为“用于参考”的场对数,加上标记 为“用于参考”的非成对场数的和,不应大于 num_ref_frames。下面详细介绍 frame_num 不连续的解 码过程、参考图像“滑窗”标记过程和参考图像自适应内存控制标记过程。 8.7.1 frame_num 不连续的解码过程 本过程只在 gaps_in_frame_num_value_allowed_flag 等于 1 的相应比特流中调用。如果比特流的 gaps_in_frame_num_value_allowed_flag 等于 0 且 frame_num 不等于 PrevRefFrameNum 或 ( PrevRefFrameNum + 1 ) % MaxFrameNum,解码过程应推断图像丢失已经发生。如本过程被调用, 需要计算一系列“不存在”图像所附属的 frame_num 值,所有的值根据第 7 章中描述的变量 UnusedShortTermFrameNum 获得,除了当前图像的 frame_num 值。 解码过程需要对每个“ 不存在” 图像所附属的 frame_num 值进行标记,按照 UnusedShortTermFrameNum 值的顺序,使用 8.7.2 中描述的“滑窗”图像标记过程。添加的帧必须也标 记为“不存在”和“用于短期参考”。添加帧的采样值设置为任意值。这些标记为“不存在”的添加帧不能 用于帧间预测过程,不能在短期参考图像参考图像列表的重排序命令中使用,不能在分配 LongTermFrameIdx 给一个短期参考图像的过程中使用。当一个标记为“不存在”的帧使用“滑窗”缓冲 过程或“自适应内存控制”机制标记为“不用于参考”,它不应再被标记为“不存在”。 如果任何一个“不存在”图像所附属的 frame_num 值在帧间预测或参考索引分配中使用,解码过 程应能推断图像丢失发生。如内存管理控制操作用到标记为“不存在”的帧,解码过程不必推断图像 丢失发生。 8.7.2 参考图像滑窗标记过程 本过程当 adaptive_ref_pic_marking_mode_flag 等于 0 时调用。 如果当前编码场是一个参考场对中按照解码顺序的第二个场,且第一个场已被标记为“用于短期 参考”,当前图像也标记为“用于短期参考”。否则: z 将 numShortTerm 赋值为至少一个场标记为“用于短期参考”的参考帧、参考场对和非成对参 考场的总数。将 numLongTerm 赋值为至少一个场标记为“用于长期参考”的参考帧、参考场 对和非成对参考场的总数。 z 当 numShortTerm + numLongTerm 等于 num_ref_frames 时,必须满足 numShortTerm 大于 0 且有着最小 FrameNumWrap 值的短期参考帧、参考场对或非成对参考场必须标记为“不用于 参考”。如它是一个帧或场对,那么它的两个场必须均标记为“不用于参考”。 8.7.3 参考图像的自适应内存控制标记过程 本过程当 adaptive_ref_pic_marking_mode_flag 等于 1 时调用。在当前图像解码完毕后,根据 memory_management_control_operation 命令,按照它们在比特流出现的顺序执行,其中命令参数为 从 1 到 6。根据 memory_management_control_operation 的参数值,对于每个不同命令的具体操作, 在(1)到(6)中详细描述。如参数值为 0 意味着操作结束。此外,操作过程中,解码器根据 field_pic_flag 的值确定操作的对象类型,如为 0,则针对指定的帧或场对;如为 1,则针对指定的某个场。具体操 作过程参见流程图 8.16。 在将一个短期或长期参考场标记为“不用于参考”的情况下,另一个场的标记在本过程中不进行 变化,但会在下一次调用本过程时处理,如同第七章中已提到。 在分配一个 LongTermFrameIdx 给一个短期参考图像过程中,根据给定语法元素 difference_of_pic_nums_minus1 的值计算变量 picNumX 的方法参照图 8.16。其中 picNumX 用来指定 一个标记为“用于短期参考”且未被标记为“不存在”的帧、参考场对或非成对参考场。 在根据 MaxLongTermFrameIdx 值进行标记的过程中,所有的 LongTermFrameIdx 大于 max_long_term_frame_idx_plus1 – 1 且标记为“用于长期参考”的图像标记为“不用于参考”。变量 MaxLongTermFrameIdx 的计算方法参见流程图 8.16。请注意发送 max_long_term_frame_idx_plus1 的 频度在当前建议/国际标准中没有定义;然而,编码器在接收到一个错误信息后必须发送一个 memory_management_control_operation 命令 4,例如帧内刷新请求消息。 在将所有参考图像标记为“不用于参考”的过程中,必须首先将所有参考图像标记为“不用于参 考”,然后将 MaxLongTermFrameIdx 设置为“无长期帧索引”。 在分配一个长期帧索引给当前图像的过程中,如果 LongTermFrameIdx 已经分配给一个长期参考 帧或参考场对,相应的参考帧或场对及其两个场均先要标记为“ 不用于参考” 。当这个 LongTermFrameIdx 已经被分配给一个非成对参考场,且这个场不是当前图像的互补场,这个场需被 标记为“不用于参考”。然后将当前图像标记为"用于长期参考"且 LongTermFrameIdx 赋值为 long_term_frame_idx 。当 field_pic_flag 等于 0, 它的两个场也标记为" 用于长期参考" 且 LongTermFrameIdx 赋值为 long_term_frame_idx。当 field_pic_flag 等于 1 且当前图像是一个参考场对 的第二个场(按照解码顺序),相应的场对也标记为"用于长期参考",且 LongTermFrameIdx 赋值为 long_term_frame_idx。 图 8.16 参考图像的自适应内存控制标记过程 8.8 帧内预测 视频压缩中所采用的帧内预测技术用于去除当前图像中的空间冗余度,新的编码标准 H.264/AVC 采用了比以往编码标准更为精确和复杂的帧内预测方式。在当前图像编码过程中,当无 法提供足够的图像之间的时间相关信息时,往往对当前图像采用了帧内预测。由于当前被编码的宏 块与相邻的宏块有很强的相似性,因此在 H.264/AVC 中的帧内预测用于计算编码宏块与其相邻宏块 之间的空间相关性,以提高编码效率。在帧内预测中当前编码的宏块上方及左方的宏块用于计算出 当前宏块的预测值。当前宏块与其预测值的差值将进一步编码并予传输到解码器端。解码器利用该 比特流中用于表示预测方式相关比特与解码出的残差信号的比特,并计算出当前宏块的预测值,恢 复图像宏块的原始像素值。H.264/AVC 也提供了“PCM”的编码方式,采用“PCM”编码时,解码器可 直接恢复当前宏块的像素值而不必经过其他任何计算。 H.264/AVC 提供了四种帧内预测方式:4x4 亮度块的帧内预测(Intra_4x4)、16x16 亮度块的帧 内预测(Intra_16x16)、8x8 色度块的帧内预测(Intra_chroma),以及 PCM 的预测方式(I_PCM)。 8.8.1 4x4 亮度块预测方式的提取 当前宏块采用 4x4 亮度块的帧内预测方式(Intra_4x4)时每一个 4x4 块可使用如表 8.2 所示的 9 种预测方式的任意一种进行预测,各种预测方式的预测方向如图 8.15 所示。 表 8.2 4x4 亮度块的帧内预测模式 预测模式序号 预测模式 0 Intra_4x4_Vertical 1 Intra_4x4_Horizontal 2 Intra_4x4_DC 3 Intra_4x4_Diagonal_Down_Left 4 Intra_4x4_Diagonal_Down_Right 5 Intra_4x4_Vertical_Right 6 Intra_4x4_Horizontal_Down 7 Intra_4x4_Vertical_Left 8 Intra_4x4_Horizontal_Up 图 8.15 4x4 亮度块预测方式下的预测方向 然而全部传输每一个 4x4 亮度块的预测方式必将占用大量的比特数,因此需要考虑利用相邻块 的预测方式之间的相关性。例如,已编码的 4x4 亮度块 A 及 B 位于当前块的上方及左方,若 A 和 B 均采用模式 2的帧内预测方式,对于当前块 C 最有可能的预测方式也是模式 2。 A BC 图 8.16 4x4 亮度块 C 的相对位置 对于当前的 4x4 亮度块 C,若 C 的预测方式与 A 与 B 的预测方式的最小值(predIntra4x4Pred 模式)相同,此时相应的句法单元 prev_intra4x4_pred_模式置为 1。否则(prev_intra4x4_pred_模式 置为 0),另一个句法单元 rem_intra4x4_pred_模式用于指出 C 块的预测方式与 predIntra4x4Pred 模式 的差别。若 rem_intra4x4_pred_模式 的值小于 predIntra4x4Pred 模式则当前块 C 的预测方式为 rem_intra4x4_pred_模式的值;否则当前块 C 的预测方式为 rem_intra4x4_pred_模式+1 的值。此外若 图 8.16 中的 A 或 B 不存在,则其相应的预测方式为直流预测(模式 2)。 8.8.2 4x4 亮度块的帧内预测编码方式 当编码的宏块使用 4x4 亮度块帧内编码方式时,对于宏块中的每一个 4x4 亮度块有 9 种可能的 预测方式。预测的 4x4 块由相邻的像素值(A~M)预测,如图 8.17 所示。 MABCDEFGH I J K L abcd efg h ijkl mn o p 图 8.17 帧内预测时的像素分布 在解码器端,根据相关句法元素的值确定当前块采用的帧内预测方式。下文将进一步详细描述 各种预测方式的特点。 8.8.2.1 Intra_4x4_Vertical(模式 0) 在 Intra_4x4_Vertical 预测模式下,当前 4x4 块的像素值由相邻的像素 A、B、C 和 D 预测得出, 如图 8.18 所示。 像素预测值由下式决定: pred4x4L[ x, y ] = p[ x, -1 ], x, y = 0..3 (8.6) 1 432 MABCD I J K L a b c d e f g h i j k l m n o p 图 8.18 模式 0 帧内预测示意图 8.8.2.2 Intra_4x4_Horizontal 预测模式(模式 1) 在 Intra_4x4_Horizontal 预测模式当前 4x4 块的像素值被相邻的像素 I、J、K 和 L 预测得出,如 图 8.19 所示。 像素预测值由下式决定: pred4x4L[ x, y ] = p[ -1, y ], x,y = 0..3 (8.7) 1 4 3 2 MABCD I J K L a b c d e f g h i j k l m n o p 图 8.19 模式 1 帧内预测示意图 8.8.2.3 Intra_4x4_Diagonal_Down_Left 预测模式(模式 3) 在 Intra_4x4_Diagonal_Down_Left 预测模式下,当前 4x4 块的像素值被相邻的像素 A、B、C、 D、E、F、G 和 H 预测得出,如图 8.20 所示。 像素预测值由下式决定: pred4x4L[ x, y ] = ( p[ 6, -1 ] + 3 * p[ 7, -1 ] + 2 ) >> 2, x,y=3 pred4x4L[ x, y ] = ( p[ x + y, -1 ] + 2 * p[ x + y + 1, -1 ] + p[ x + y + 2, -1 ] + 2 ) >> 2, x,y 为其它值 (8.8) 1 432 MABCD I J K L abcd efg h ijkl mnop 5 6 7 EFGH 图 8.20 模式 3 帧内预测示意图 8.8.2.4 Intra_4x4_Diagonal_Down_Right 预测模式(模式 4) 在 Intra_4x4_Diagonal_Down_Right 预测模式下,当前 4x4 块的像素值被相邻的像素 A、B、C、 D、I、J、K、L 和 M 预测得出,如图 8.21 所示。 像素预测值由下式决定: pred4x4L[ x, y ] = ( p[ x - y - 2, -1] + 2 * p[ x - y - 1, -1 ] + p[ x - y, -1 ] + 2 ) >> 2 , x>y pred4x4L[ x, y ] = ( p[ -1, y - x - 2 ] + 2 * p[ -1, y - x - 1 ] + p[ -1, y - x ] + 2 ) >> 2, x> 2, x,y 为其它值 (8.9) 1 43 2 MABCD I J K L abcd efg h ijkl mn o p 5 6 7 图 8.21 模式 4 帧间预测示意图 8.8.2.5 Intra_4x4_Vertical_Right 预测模式(模式 5) 在 Intra_4x4_Vertical_Right 预测模式下,当前 4x4 块的像素值被相邻的像素 A、B、C、D、I、J、 K、L 和 M 预测得出,如图 8.22 所示。 像素预测值由下式决定: pred4x4L[ x, y ] = ( p[ x - ( y >> 1 ) - 1, -1 ] + p[ x - ( y >> 1 ), -1 ] + 1 ) >> 1, 2 * x – y=0,2,4,6 pred4x4L[ x, y ] = ( p[ x - ( y >> 1 ) - 2, -1] + 2 * p[ x - ( y >> 1 ) - 1, -1 ] + p[ x - ( y >> 1 ), -1 ] + 2 ) >> 2 , 2 * x – y=1,3,5 pred4x4L[ x, y ] = ( p[ -1, 0 ] + 2 * p[ -1, -1 ] + p[ 0, -1 ] + 2 ) >> 2, 2 * x – y=-1 pred4x4L[ x, y ] = ( p[ -1, y - 1 ] + 2 * p[ -1, y - 2 ] + p[ -1, y - 3 ] + 2 ) >> 2, x,y 为其它值 (8.10) 1 MABCD I J K L abcd efg h ijkl mn o p 876510 9 432 图 8.22 模式 5 帧内预测示意图 8.8.2.6 Intra_4x4_Horizontal_Down 预测模式(模式 6) 在 Intra_4x4_Horizontal_Down 预测模式下,当前 4x4 块的像素值被相邻的像素 A、B、C、I、J、 K 和 L 预测得出,如图 8.23 所示。 像素预测值由下式决定: pred4x4L[ x, y ] = ( p[ -1, y -( x >> 1 ) - 1 ] + p[ -1, y - ( x >> 1 ) ] + 1 ) >> 1, 2 * y – x=0,2,4,6 pred4x4L[ x, y ] = ( p[ -1, y - ( x >> 1 ) - 2 ] + 2 * p[ -1, y - ( x >> 1 ) - 1 ] + p[ -1, y - ( x >> 1 ) ] + 2 ) >> 2 , 2 * y – x=1,3,5 pred4x4L[ x, y ] = ( p[ -1, 0 ] + 2 * p[ -1, -1 ] + p[ 0, -1 ] + 2 ) >> 2, 2 * y – x=-1 pred4x4L[ x, y ] = ( p[ x - 1, -1 ] + 2 * p[ x - 2, -1 ] + p[ x - 3, -1 ] + 2 ) >> 2, x,y 为其它值 (8.11) 1 MABCD I J K L abcd efg h ijkl mnop 8 7 6 5 10 9 4 3 2 图 8.23 模式 6 帧内预测示意图 8.8.2.7 Intra_4x4_Vertical_Left 预测模式(模式 7) 在 Intra_4x4_Vertical_Left 预测模式下,当前 4x4 块的像素值被相邻的像素 A、B、C、D、E、F 和 G 预测得出,如图 8.24 所示。 像素预测值由下式决定: pred4x4L[ x, y ] = ( p[ x + ( y >> 1 ), -1 ] + p[ x + ( y >> 1 ) + 1, -1 ] + 1) >> 1, y=0,2 pred4x4L[ x, y ] = ( p[ x + ( y >> 1 ), -1 ] + 2 * p[ x + ( y >> 1 ) + 1, -1 ] + p[ x + ( y >> 1 ) + 2, -1 ] + 2 ) >> 2 , y=1,3 (8.12) 5 MABCD I J K L abcd efg h ijkl mn o p EFGH 4321 10876 9 图 8.24 模式 7 帧内预测示意图 8.8.2.8 Intra_4x4_Horizontal_Up 预测模式(模式 8) 在 Intra_4x4_Horizontal_Up 预测模式下,当前 4x4 块的像素值被相邻的像素 I、J、K 和 L 预测 得出,如图 8.25 所示。 像素预测值由下式决定: pred4x4L[ x, y ] = ( p[ -1, y + ( x >> 1 ) ] + p[ -1, y + ( x >> 1 ) + 1 ] + 1 ) >> 1, x+2*y=0,2,4 pred4x4L[ x, y ] = ( p[ -1, y + ( x >> 1 ) ] + 2 * p[ -1, y + ( x >> 1 ) + 1 ] + p[ -1, y + ( x >> 1 ) + 2 ] + 2 ) >> 2, x+2*y=1,3 pred4x4L[ x, y ] = ( p[ -1, 2 ] + 3 * p[ -1, 3 ] + 2 ) >> 2, x+2*y=5 pred4x4L[ x, y ] = p[ -1, 3 ],x,y 为其它值 (8.13) 5 MABCD I J K L abcd efg h ijkl mnop EFGH 4321 7 6 7 7 7 图 8.25 模式 8 帧内预测示意图 8.8.2.9 Intra_4x4_DC 预测模式(直流预测) 在 Intra_4x4_DC 模式下在这种预测方式下,当相邻像素 A、B,C,D,I,J,K 及 L 均存在时 由其像素值的平均值预测当前 4x4 的亮度块;若只有像素 I~L 存在,则当前 4x4 块由 I~L 像素值 的平均值预测得到;若只有像素 A~D 存在,则当前 4x4 块由 A~D 像素值的平均值预测得到;否 则当前 4x4 块的预测值均为 128,如图 8.26 所示。 MABCD I J K L (A+B+C+D+2)/4 MABCD I J K L (A+B+C+D+I+J+K+L+4)/8 MABCD I J K L (I+J+K+L+2)/4 MABCD I J K L 128 128128128 128 128128128 128 128128128 128 128128128 图 8.26 模式 2 直流预测示意图 8.8.3 16x16 亮度块的帧内预测方式 在这种预测方式下,整个 16x16 的亮度宏块同时被预测,且共有 4 中不同的预测方式,如表 8.3 所示。 表 8.3 16x16 亮度块的预测方式 预测模式序号 预测模式 0 Intra_16x16_Vertical 1 Intra_16x16_Horizontal 2 Intra_16x16_DC 3 Intra_16x16_Plane 8.8.3.1 Intra_16x16_Vertical 预测模式(模式 0) 在 Intra_16x16_Vertical 预测模式下,当前宏块的所有像素由上方的像素 H 预测得到,如图 8.27 所示。 像素预测值由下式决定: predL[ x, y ] = p[ x, -1 ], x, y = 0..15 (8.14) H V 图 8.27 模式 0 帧内预测示意图 8.8.3.2.Intra_16x16_Horizontal 预测模式(模式 1) 在 Intra_16x16_Horizontal 预测模式下,当前宏块的所有像素由左方的像素 V 预测得到,如图 8.28 所示。 像素预测值由下式决定: predL[ x, y ] = p[ -1, y ], x, y = 0..15 (8.15) H V 图 8.28 模式 1 帧内预测示意图 8.8.3.3 Intra_16x16_DC 预测模式(模式 2) 在 Intra_16x16_DC 预测模式下,当前宏块的所有像素由左方及上方的像素 V 及 H 的平均值预 测得到,如图 8.29 所示。 若相邻像素 H 与 V 均存在,当前宏块的所有像素值为(H+V)的平均值;若只有像素 H 存在, 当前宏块的所有像素值为 H 的平均值;若只有像素 V 存在,当前宏块的所有像素值为像素 V 的平均 值;否则(像素 H 与 V 均不存在),当前宏块的所有像素值为 128。 Mean(H+V) H V 图 8.29 模式 2 直流预测示意图 8.8.3.4 Intra_16x16_Plane 预测模式(模式 3) 在 Intra_16x16_Plane 预测模式下,如图 8.30 所示。 像素预测值由下式决定: predL[ x, y ] = Clip1( ( a + b * ( x - 7 ) + c * ( y - 7 ) + 16 ) >> 5 ), (8.16) 在上式中: a = 16 * ( p[ -1, 15 ] + p[ 15, -1 ] ) b = ( 5 * H + 32 ) >> 6 c = ( 5 * V + 32 ) >> 6 (8.17) 其中H,V由下式决定 [][]∑ = −++= 7 0x' ) 1- ,x'-6 p - 1 ,x'8 p (*) 1 x'(H [][]∑ = ++= 7 0y' ) y'-6 1,- p- y'8 1,- p (*) 1y' (V (8.18) H V 图 8.30 模式 3帧内预测示意图 8.8.4 8x8 色度块的帧内预测方式 对于整个 8x8 的色度宏块,共有 4 种不同的预测方式,如表 8.4 所示。 表 8.4 色度块的预测方式 预测模式序号 预测模式 0 Intra_Chroma_DC 1 Intra_Chroma_Horizontal 2 Intra_Chroma_Vertical 3 Intra_Chroma_Plane 8.8.3.1 Intra_Chroma_Vertical l 预测模式(模式 0) 在 Intra_Chroma_Vertical 预测模式下,当前宏块的所有像素由上方的像素 H 预测得到,如图 8.31 所示。 像素预测值由下式决定: predL[ x, y ] = p[ x, -1 ], x, y = 0..15 (8.19) H V 图 8.31 模式 0 帧内预测示意图 8.8.3.2.Intra_ Chroma _Horizontal 预测模式(模式 1) 在 Intra_ Chroma _Horizontal 预测模式下,当前宏块的所有像素由左方的像素 V 预测得到,如图 8.32 所示。 像素预测值由下式决定: predL[ x, y ] = p[ -1, y ], x, y = 0..15 (8.20) H V 图 8.32 模式 1 帧内预测示意图 8.8.3.3 Intra_ Chroma _DC 预测模式(模式 2) 在 Intra_ Chroma _DC 预测模式下,当前宏块的所有像素由左方及上方的像素 V 及 H 的平均值 预测得到,如图 8.33 所示。 若相邻像素 H 与 V 均存在,当前宏块的所有像素值为(H+V)的平均值;若只有像素 H 存在, 当前宏块的所有像素值为 H 的平均值;若只有像素 V 存在,当前宏块的所有像素值为像素 V 的平均 值;否则(像素 H 与 V 均不存在),当前宏块的所有像素值为 128。 Mean(H+V) H V 图 8.33 模式 2 直流预测示意图 8.8.3.4 Intra_ Chroma _Plane 预测模式(模式 3) 在 Intra_ Chroma _Plane 预测模式下,如图 8.34 所示。 像素预测值由下式决定: predL[ x, y ] = Clip1( ( a + b * ( x - 7 ) + c * ( y - 7 ) + 16 ) >> 5 ), (8.21) 在上式中: a = 16 * ( p[ -1, 15 ] + p[ 15, -1 ] ) b = ( 5 * H + 32 ) >> 6 c = ( 5 * V + 32 ) >> 6 (8.22) 其中 H,V 由下式决定 [][]∑ = −++= 7 0x' ) 1- ,x'-6 p - 1 ,x'8 p (*) 1 x'(H [][]∑ = ++= 7 0y' ) y'-6 1,- p- y'8 1,- p (*) 1y' (V (8.23) H V 图 8.34 模式 3帧内预测示意图 8.9 帧间预测解码处理 如第 6 章所述,H.264 采用树状结构的运动补偿技术,提高了预测能力。特别是,小块预测提 高了模型处理更好的运动描述的能力,产生更好的图像质量。H.264 运动向量的精度提高到 1/4 像素 (亮度),运动补偿算法的预测能力得到进一步提高。H.264 还提供多参考帧可选模式,,这将产生 更好的视频质量和效率更高的视频编码。相对于 1 帧参考,5 个参考帧可以节约 5%~10%的比特率, 且有助于比特流的恢复。 在解码端,P 和 B 宏块编解码时需进行帧间预测解码处理,其输出为帧间预测像素矩阵,包括 一个 16×16的亮度点矩阵——predL和两个色度点 8×8 矩阵——predCr 和predCb。其解码流程见图 8.35。 图 8.35 帧间预测解码总流程 其中,获取 MV 分量及参考索引操作见 8.9.1,其输入为 mbPartIdx,subMbPartIdx,输出为 mvL0, mvL1,mvCL0,mvCL1(亮度及色度 MV),refIdxL0,refIdxL1(参考索引),predFlagL0,predFlagL1(预 测表使用标识);帧间预测像素解码处理见 8.9.2,输入为 mbPartIdx,subMbPartIdx,partWidth, partHeight,mvL0,mvL1,mvCL0,mvCL1,refIdxL0,refIdxL1,predFlagL0,predFlagL1;输出为 帧间预测像素,一个 partWidth×partHeight 的亮度点矩阵 predPartL 和两个(partWidth/2)×(partHeight/2) 色度点矩阵,predPartCr, predPartCb。 这里须说明的是帧间预测处理指 mbPartIdx 和 subMbPartIdx 指定的宏块或亚宏块的帧间预测处 理。 简单一点的说,预测宏块的形成就是将分割或者亚宏块分割预测像素放入宏块的正确位置,形 成矩阵。H.264 的帧间预测解码中,宏块矩阵形成如下: predL[ xP + xS + x, yP + yS + y ] = predPartL[ x, y ]; x = 0 .. partWidth – 1, y = 0 .. partHeight – 1 (8.24) predC[ xP / 2 + xS / 2 + x, yP / 2 + yS / 2 + y ] = predPartC[ x, y ]; x = 0 .. partWidth/2 – 1, y = 0 .. partHeight/2 – 1 (8.25) 其中,( xP, yP ) 为宏块分割的左上像素相对宏块左上像素的位置。( xS, yS )为宏块亚分割的左 上像素相对宏块分割的左上像素的位置。 本节只对 H.264 帧间预测解码处理的原理和流程作一定的介绍,其具体操作,如各部分推导请 参考 H.264 Draft G050。 相关符号说明见第 7 章所示。 8.9.1 MV 分量及参考索引获取 该步骤输入为 mbPartIdx 和 subMbPartIdx;输出为 mvL0,mvL1,mvCL0,mvCL1,refIdxL0, refIdxL1,predFlagL0,predFlagL1。如图 8.36 所示。 图 8.36 亮度 MV 及参考索引获取 其具体处理过程见下文。色度 MV 获取 8.9.1.4,以 mvLX and refIdxLX 为输入,mvCLX 为输出。 本文先讲通常情况下的亮度 MV 如何获取,再讨论特殊情况。最后讨论色度 MV 如何获得。 8.9.1.3 亮度 MV 预测获取 当宏块类型为常用类型时,亮度MV的获取如该节所示。该处理输入为mbPartIdx、subMbPartIdx、 LX、refIdxLX.,输出为运动矢量mvLX 的预测mvpLX。 mvLX[ 0 ] = mvpLX[ 0 ] + mvd_lX[ mbPartIdx ][ subMbPartIdx ][ 0 ] (8.26) mvLX[ 1 ] = mvpLX[ 1 ] + mvd_lX[ mbPartIdx ][ subMbPartIdx ][ 1 ] (8.27) 该操作流程如图 8.37 所示。 图 8.37 亮度 MV 推导流程 8.9.1.2 P 片、SP 片中跳跃宏块亮度 MV 获取 该处理用于宏块类型为 P_Skip 时解码。其输出为 mvL0 和 refIdxL0(等于 0)。 此时,mvL0 推导如下: 第一步:根据上一节的邻近运动数据推导,以mbPartIdx =0, subMbPartIdx=0, list suffix L0 为输入, 输出为mbAddrA, mbAddrB, mvL0A, mvL0B, refIdxL0A, 和refIdxL0B. 第二步:如下列任一命题为真,mvL0 的两个分量都置 0: mbAddrA◆ 不提供; mbAddrB◆ 不提供; refIdxL0A◆ =0 且 mvL0A 两个分量都等于 0; refIdxL0B◆ =0 且 mvL0B 两个分量都等于 0。 否则,根据上一节的中值亮度 MV 推导,以 mbPartIdx = 0, subMbPartIdx = 0, refIdxL0, and list suffix L0 为输入,mvL0 为输出。 注:这里输出直接为 mvL0,预测 MV 等于实际 MV。 8.9.1.3 B_skip,B_Direct_16×16,B_Direct_8×8 的亮度 MV 获取 该处理用于宏块类型为 B_Skip 或 B_Direct_16x16,或者亚宏块类型为 B_Direct_8x8 时的解码。 其输入为 mbPartIdx 和 subMbPartIdx.;输出为 refIdxL0, refIdxL1, mvL0 and mvL1,predFlagL0 and predFlagL1。 该处理还取决于 direct_spatial_mv_pred_flag 的值。direct_spatial_mv_pred_flag=1 时,该处理输 出模式为空间直接预测模式;direct_spatial_mv_pred_flag =0 时,该处理输出模式为时间直接预测模 式。详细过程请参考 H.264 Draft G050。 8.9.1.4 色度 MV 获取 该处理过程输入为亮度矢量mvLX 和refIdxLX,输出为色度矢量mvCLX。色度MV是根据相应 亮度MV推导而得。因为亮度MV精度为1/4像素,而色度精度为其一半,应为1/8像素精度。例如, 亮度矢量指定8×16亮度像素时,相应色度矢量应针对4×8色度像素。 为了推出 mvCLX,有如下操作: 1)当前宏块为帧宏块时,色度运动矢量mvCLX的水平和垂直分量通过相应亮度mvLX分量乘以2 推出,该过程通过将1/4像素mvLX单元映射到1/8像素mvCLX单元实现。 mvCLX[ 0 ] = mvLX[ 0 ] (8.28) mvCLX[ 1 ] = mvLX[ 1 ] (8.29) 2)当前宏块为场宏块时,色度矢量的水平分量mvCLX[ 0 ]通过(8.21实现。垂直分量mvCLX[ 1 ] 则取决于当前场对或当前图像及其参考图像,见表8.5。. 表 8.5 场编码模式下色度垂直分量推导 条 件 mvCLX[ 1 ] 参考图像 当前场 顶场 底场 mvLX[ 1 ] + 2 底场 顶场 mvLX[ 1 ] – 2 其余 mvLX[ 1 ] 8.9.2 帧间预测像素解码处理 该处理过程输入为宏块分割mbPartIdx、亚宏块分割subMbPartIdx、分割宽高变量partWidth和 partHeight、亮度运动矢量mvL0和mvL1、色度运动矢量mvCL0和mvCL1、参考索引refIdxL0和 refIdxL1、预测表使用标志predFlagL0和predFlagL1。其输出为帧间预测像素predPart,包括一个 (partWidth)×(partHeight)亮度预测像素predPartL和两个 (partWidth/2)×(partHeight/2) 色度预测像素 predPartCb 和 predPartCr 。这里设predPartL0L 和 predPartL1L 为预测亮度像素值 (partWidth)×(partHeight) 矩阵, predPartL0Cb、predPartL1Cb、predPartL0Cr、predPartL1Cr为相应色度 像素值(partWidth/2)×(partHeight/2) 矩阵。其流程见图8.38。 图8.38 帧间预测像素解码处理流程 8.9.2.1 参考图象选择处理 该处理过程输入为 refIdxLX,输出为 refPicLXL、refPicLXCb 和 refPicLXCr。参考图像列表 RefPicListX 是预先已解码参考帧、互补参考场对、或非成对参考场的 PicNum 和 LongTermPicNum 的 列表,但都标志为“参考图像用”。 PicNum 和 LongTermPicNum 规定如下: 1) 若field_pic_flag=1, RefPicListX所有成员PicNum和LongTermPicNum 为已解码参考场或已解 码参考帧的场。 2) 若field_pic_flag= 0, PicNum 和 LongTermPicNum 为已解码参考帧或已解码互补场对。 参考图像列表RefPicListX推导如图8.39所示。 图 8.39 RefPicListX 推导 8.9.2.2 分像素内插处理 该处理过程输入为mbPartIdx 、subMbPartIdx、亮度像素单元的partWidth和partHeight、mvLX 、 mvCLX 、 refPicLXL 、 refPicLXCb 、 refPicLXCb ;输出为一个预测亮度像素值矩阵 (partWidth)×(partHeight)的 predPartLXL、两个预测色度像素值矩阵 (partWidth/2)x(partHeight/2)的 predPartLXCb, and predPartLXCr 。 这里,设( xAL, yAL )为当前分割左上亮度像素整像素单元位置,这是相对给出亮度像素二维矩 阵左上像素位置而言。设( xIntL, yIntL )为整像素单元亮度位置 ,( xFracL, yFracL ) 为 1/4 像素单元偏 移。 xIntL = xAL + ( mvLX[ 0 ] >> 2 ) + xL (8.30) yIntL = yAL + ( mvLX[ 1 ] >> 2 ) + yL (8.31) xFracL = mvLX[ 0 ] & 3 (8.32) yFracL = mvLX[ 1 ] & 3 (8.33) predLXL[ xL, yL ]推导见8.9.2.2.1,以 ( xIntL, yIntL )、( xFracL, yFracL )、refPicLXL 为输入。 同样,设( xIntC, yIntC )为整像素单元亮度位置,( xFracC, yFracC )为1/8像素单元偏移。 xIntC = ( xAL >> 1 ) + ( mvCLX[ 0 ] >> 3 ) + xC (8.34) yIntC = ( yAL >> 1 ) + ( mvCLX[ 1 ] >> 3 ) + yC (8.35) xFracC = mvCLX[ 0 ] & 7 (8.36) yFracC = mvCLX[ 1 ] & 7 (8.37) predPartLXCb[ xC, yC ]和predPartLXCr[ xC, yC ]推导见2),以( xIntC, yIntC )和( xFracC, yFracC ) 及 refPicLXCb、refPicLXCr 为输入。 1) 亮度像素内插处理 该处理过程输入为亮度整像素位置( xIntL, yIntL )、亮度分像素位置偏移( xFracL, yFracL )、参考图 像refPicLXL的亮度像素矩阵。输出为预测亮度像素值predPartLXL[ xL, yL ]。 bb a cE F I JG h d n H m A C B D R T S U M s NK L P Q fe g ji k qp r aa b cc dd ee ff hh gg 图8.40 1/4亮度像素内插 在图 8.40 中,标有大些字母阴影块位置为参考亮度像素值的二维矩阵的整数位置。这些像素用 来推导 predPartLXL[ xL, yL ]。 参考亮度像素矩阵 refPicLXL 中,各像素位置( xZL, yZL )推导如下, Z 可为A, B, C, D, E, F, G, H, I, J, K, L, M, N, P, Q, R, S, T, 或 U: xZL = Clip3( 0, PicWidthInSamplesL – 1, xIntL + xDZL ) yZL = Clip3( 0, PicHeightInSamplesL – 1, yIntL + yDZL ) (8.38) 表8.6给出了相应亮度像素位置 表8.6 亮度整像素位置 Z A B C DE F G HI J KL MNP Q R S T U xDZL 0 1 0 1 -2 -1 0 1 2 3 -2 -1 0 1 2 3 0 1 0 1 yDZL -2 -2 -1 -1 0 0 0 0 0 0 1 1 1 1 1 1 2 2 3 3 在给出整像素位置( xAL, yAL )到 ( xUL, yUL )像素后,分像素位置“a” 到“s”的像素值便可计算出 来。其中,半像素通过 6 抽头滤波器( 1, -5, 20, 20, -5, 1 )实现,1/4 像素位置像素则通过整像素和半 像素平均而得,具体如下。 (1)计算半像素位置像素b和h,先计算中间量b1和h1 ,再计算b和h。 b1 = ( E – 5 * F + 20 * G + 20 * H – 5 * I + J ) (8.39) h1 = ( A – 5 * C + 20 * G + 20 * M – 5 * R + T ) (8.40) b = Clip1( ( b1 + 16 ) >> 5 ) (8.41) h = Clip1( ( h1 + 16 ) >> 5 ) (8.42) (2)计算半像素位置像素j,同样先计算中间量j1 ,j1通过对水平或垂直方向最近半像素滤波而得。 j1 = cc – 5 * dd + 20 * h1 + 20 * m1 – 5 * ee + ff, 或者 (8.43) j1 = aa – 5 * bb + 20 * b1 + 20 * s1 – 5 * gg + hh (8.44) 这里,中间量aa、bb、gg、s1、hh、cc、dd、ee、m1、ff类似与b1和h1方式获得。最终, j = Clip1( ( j1 + 512 ) >> 10 ) (8.45) (3)s和m 类似于b 和h,方法获得, s = Clip1( ( s1 + 16 ) >> 5 ) (8.46) m = Clip1( ( m1 + 16 ) >> 5 ) (8.47) (4)1/4像素a、c、d、n、f、i、k、q由最近的整像素和半像素平均得出, a = ( G + b + 1 ) >> 1 (8.48) c = ( H + b + 1 ) >> 1 (8.49) d = ( G + h + 1 ) >> 1 (8.50) n = ( M + h + 1 ) >> 1 (8.51) f = ( b + j + 1 ) >> 1 (8.52) i = ( h + j + 1 ) >> 1 (8.53) k = ( j + m + 1 ) >> 1 (8.54) q = ( j + s + 1 ) >> 1. (8.55) (4)1/4像素e、g、p、r 由两个对角线上的半像素获得, e = ( b + h + 1 ) >> 1 (8.56) g = ( b + m + 1 ) >> 1 (8.57) p = ( h + s + 1 ) >> 1 (8.58) r = ( m + s + 1 ) >> 1. (8.59) 分像素单元( xFracL, yFracL )中的亮度位置偏移指定了产生的整像素和分像素中为预测亮度像素 值 predPartLXL[ xL, yL ]的像素,如表 8.7 所示。 表8.7 亮度预测像素predPartLXL[ xL, yL ]分配 xFracL 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 yFracL 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 predPartLXL[ xL, yL ] G d h n a e i p b f j q c g k r 2) 色度像素内插处理 该处理过程输入为一色度整像素位置( xIntC, yIntC )、一色度分像素位置 ( xFracC, yFracC )及参考 图像refPicLXC的色度像素。输出为predPartLXC[ xC, yC ]。 图 8.41 中,A、B、C、D 表示色度像素二维矩阵 refPicLXC 的整像素位置像素。 图8.41 色度分像素内插 这些像素用来产生 predPartLXC[ xC, yC ]。如下, xAC = Clip3( 0, PicWidthInSamplesC – 1, xIntC ) (8.60) xBC = Clip3( 0, PicWidthInSamplesC – 1, xIntC + 1 ) (8.61) xCC = Clip3( 0, PicWidthInSamplesC – 1, xIntC ) (8.62) xDC = Clip3( 0, PicWidthInSamplesC – 1, xIntC + 1 ) (8.63) yAC = Clip3( 0, PicHeightInSamplesC – 1, yIntC ) (8.64) yBC = Clip3( 0, PicHeightInSamplesC – 1, yIntC ) (8.65) yCC = Clip3( 0, PicHeightInSamplesC – 1, yIntC + 1 ) (8.66) yDC = Clip3( 0, PicHeightInSamplesC – 1, yIntC + 1 ) (8.67) 预测色度像素值 predPartLXC[ xC, yC ]推导如下: predPartLXC[ xC, yC ] = ( ( 8 – xFracC ) * ( 8 – yFracC ) * A + xFracC * ( 8 – yFracC ) * B + ( 8 – xFracC ) * yFracC * C+ xFracC * yFracC * D+ 32 )>>6 (8.68) 8.9.2.3 加权像素预测处理 该处理过程输入为 mbPartIdx:、subMbPartIdx、predFlagL0 和 predFlagL1、predPartLXL 、 predPartLXCb 和 predPartLXCr。输出为 predPartL、predPartCb 和 predPartCr。 P 片和 SP 片中 predFlagL0=1 宏块或分割有如下处理过程: 1) 若 weighted_pred_flag=0,采用缺省加权处理,见 1)。 2) 若 weighted_pred_flag=1,采用加权处理,见 2)。 B 片中 predFlagL0=1 或 predFlagL=1 宏块或分割有如下处理过程: 1) 若weighted_bipred_idc=0,采用缺省加权处理,见1)。 2) 若weighted_bipred_idc=1, 采用加权处理,见2)。 3) 若weighted_bipred_idc=2,如下: ·predFlagL0=1且predFlagL1=1, 采用加权处理,见2)。 ·predFlagL0=1或predFlagL1=1,采用缺省加权处理,见1)。 1) 缺省加权像素预测处理 根据预测方块类型,有以下约定: 1) 推导亮度predPartL[ x, y ]时,C设为L,x 为 0~partWidth – 1, y 为0~partHeight – 1。 2) 推导色度Cb predPartCb[ x, y ]时,C 设为Cb,x为0 ~partWidth / 2 – 1,y 为0 ~ partHeight / 2 – 1。 3) 推导色度Cr predPartCr[ x, y ]时,C 设为Cb,x为0~partWidth / 2 – 1,y为 0~partHeight / 2 – 1。 则,缺省加权情况下的预测值如下: 1)predFlagL0=1且predFlagL1=0 时, predPartC[ x, y ] = predPartL0C[ x, y ] (8.69) 2)predFlagL0=0且predFlagL1=1时, predPartC[ x, y ]= predPartL1C[ x, y ] (8.70) 3)predFlagL0=1且predFlagL1=1 时, predPartC[ x, y ] = ( predPartL0C[ x, y ] + predPartL1C[ x, y ] + 1 ) >> 1. (8.71) 2) 加权像素预测处理 根据预测方块类型,有以下约定: 1) 推导亮度predPartL[ x, y ]时,C设为L,x 为 0~partWidth – 1, y 为0~partHeight – 1。 2) 推导色度Cb predPartCb[ x, y ]时,C 设为Cb,x为0 ~ partWidth / 2 – 1,y 为0~partHeight / 2 – 1。 3) 推导色度Cr predPartCr[ x, y ]时,C 设为Cb,x为0~partWidth / 2 – 1,y为 0~partHeight / 2 – 1。 预测值如下: 1) 分割 mbPartIdx\subMbPartIdx 的 predFlagL0=1 且 predFlagL1=0 时, if( logWD >= 1 ) predPartC[ x, y ] = Clip1( ( ( predPartL0C[ x, y ] * w0 + 2logWD - 1 ) >> logWD ) + o0 ) else (8.72) predPartC[ x, y ] = Clip1( predPartL0C[ x, y ] * w0 + o0 ) 2) 分割 mbPartIdx\subMbPartIdx 的 predFlagL0=0 且 predFlagL1=1 时, if( logWD >= 1 ) predPartC[ x, y ] = Clip1( ( ( predPartL1C[ x, y ] * w1 + 2logWD - 1 ) >> logWD ) + o1 ) else (8.73) predPartC[ x, y ] = Clip1( predPartL1C[ x, y ] * w1 + o1 ) 3) 分割 mbPartIdx\subMbPartIdx 的 predFlagL0=1 且 predFlagL1=1 时, predPartC[ x, y ] = Clip1( ( ( predPartL0C[ x, y ] * w0 + predPartL1C[ x, y ] * w1 + 2logWD ) >> ( logWD + 1 ) ) + ( ( o0 + o1 + 1 ) >> 1 ) ) (8.74) 上述推导过程中变量推导如下: 1) 若 weighted_bipred_idc=2 且 slice_type=B 时, logWD = 5 o0 = 0 o1 = 0 (8.75) w0 和 w1 推导如下:. ·DiffPicOrderCnt( picA, picB )=0 或一个或两个参考图像为长期参考图像或(DistScaleFactor >> 2) < -64 或(DistScaleFactor >> 2) > 128 时, w0 = 32 w1 = 32 (8.76) ·否则, w0 = 64 – (DistScaleFactor >> 2) w1 = DistScaleFactor >> 2 (8.77) 2)若 P 片或 SP 片 weighted_pred_flag=1 或 B 片 weighted_bipred_idc=1 时, refIdxL0WP 和 refIdxL1WP 推导如下: ·MbaffFrameFlag=1 且当前宏块为场宏块时, refIdxL0WP = refIdxL0 >> 1 (8.78) refIdxL1WP = refIdxL1 >> 1 (8.79) ·MbaffFrameFlag=0 或当前宏块为帧宏块时, refIdxL0WP = refIdxL0 (8.80) refIdxL1WP = refIdxL1 (8.81) logWD、w0、w1、o0、o1 推导如下: ·predPartC[ x, y ]中 C 为 L 时, logWD = luma_log2_weight_denom w0 = luma_weight_l0[ refIdxL0WP ] w1 = luma_weight_l1[ refIdxL1WP ] o0 = luma_offset_l0[ refIdxL0WP ] o1 = luma_offset_l1[ refIdxL1WP ] (8.82) ·predPartC[ x, y ]中 C 为 Cb 或 Cr,iCbCr = 0,iCbCr = 1 时, logWD = chroma_log2_weight_denom w0 = chroma_weight_l0[ refIdxL0WP ][ iCbCr ] w1 = chroma_weight_l1[ refIdxL1WP ][ iCbCr ] o0 = chroma_offset_l0[ refIdxL0WP ][ iCbCr ] o1 = chroma_offset_l1[ refIdxL1WP ][ iCbCr ] (8.83) 注:在直接加权预测模式中,predFlagL0=1 和 predFlagL1=1 时,必须遵守以下约束: -128 <= w0 + w1 <= 127 (8.84) 而非直接模式中,则满足-64 <= w0, w1 <= 128 即可。 8.10 变换系数解码 H.264 中,变换系数解码包括逆整数 DCT 及反量化。这个过程的输出与整个解码器的实际输出 的差别在于图像样点位置不一致以及存在方块效应。本节介绍 H.264 中的变换系数解码和去方块滤 波(去除方块效应)前的图像重建过程。本节解码器工作过程如图 8.42 所示,图 8.43 显示其流程图。 如果输入块是色度块或帧内 16×16 预测模式的亮度块,则需要先对直流分量进行逆 Hadamard 变换, 恢复整数 DCT 变换的直流分量。 图 8.42 解码器中变换系数解码及图像重建过程 图 8.43 解码器中变换系数解码及图像重建流程图 8.10.1 变换系数逆扫描过程 H.264 多数场合是对 4×4 图像块进行处理的,在一个宏块中包含 4×4 个图像块。往往需要对 4×4 矩阵进行操作运算,而在网络传输等应用中数据是以一维形式进行传递的。在编码器中将二维编码 信息以扫描方式变成一维数据输出,在解码器端则需要将这个一维数据转换成二维数组或矩阵进行 输入图像宏块残差变换量化矩阵 Zr 对各图像块的 Wr 进行逆 4(4 整数离散余弦变换 是色度块或帧内 16(16 预测模式的亮度块? 是 进行反量化,得到 WrD 块,把其中各直流系数放到 各自相应的图像块中 对 Zr 块 AC 分量进行反量化,得到 Wr 对 Zr 中的直流分量 ZrD 进行逆 Hadamard 变换 否 输出 恢复图像样点值,按图像样点实际位置重建 逆 4×4 整数离 散余弦变换 输入 Zr AC 反量化 直流逆 Hadamard 变换 反量化 色度或帧内 16×16 亮度块 输出 图像恢复 重建 运算。本小节的功能是将输入的一个长为 16 的图像变换系数的序列转换成各图像块在宏块中的对应 坐标位置,以一个 4×4 二维数组表示。 解码过程通过逆扫描过程将变换系数量化值序列映射到对应的坐标上。有两种逆扫描模式,如 图 8.44 所示。逆 zig-zag 扫描应用于帧宏块,而逆场扫描应用于场宏块。 0156 247 12 3 8 11 13 9101415 ab 02812 15913 3 6 10 14 4 7 11 15 图 8.44 逆 a) Zig-zag 扫描;b) 逆场扫描 表 8.8 提供输入的 16 个元素数列的序号 idx 到输出的二维数组 c 的序号 i 和 j 的映射。 表 8.8 输入数列序号idx与输出二维数组元素cij 的映射关系 idx 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 逆 zig-zag c00 c 01 c 10 c 20 c 11 c 02 c 03 c 12 c 21 c 30 c 31 c 22 c 13 c 23 c 32 c 33 逆场扫描 c 00 c 10 c 01 c 20 c 30 c 11 c 21 c 31 c 02 c 12 c 22 c 32 c 03 c 13 c 23 c 33 8.10.2 DCT 变换系数中直流系数的逆变换量化 如果当前处理的图像宏块是色度块或帧内 16×16 预测模式的亮度块,则需要先恢复各图像块的 DCT 变换的直流系数。 8.10.2.1 帧内 16×16 预测模式宏块的亮度直流变换系数的比例变换 与一般设象的不同,这个过程是先进行逆 Hadamard 变换,而不是反量化。它的输入是帧内 16×16 预测模式宏块的亮度 DC 变换系数量化值,表示为 4×4 数组 ZrD;输出是恢复的宏块中 4×4 个亮度块 的 DCT 变换直流系数值,表示成一个 4×4 数组 WrD。 4×4 亮度直流变换系数的逆 Hadamard 变换定义为: ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −− −− −− ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −− −− −−= 1111 1111 1111 1111 1111 1111 1111 1111 rDQD ZW (8.85) 类似于正向 Hadamard 变换和 DCT 变换,可以将式(8.85)的矩阵乘法运算改造成两次一维变换, 例如先对量化矩阵的每行进行一维变换,然后对经行变换所得数据块的每列再应用一维变换。而每 次一维变换可以采用蝶形快速算法,节省计算时间,如图 8.45 所示。 图 8.45 一维快速反变换算法 其中,r=1/2:逆整数 DCT 变换;r=1:逆 Hadamard 变换 反变换后,根据亮度的量化参数 QP 进行反量化及逆 DCT 中的比例变换: ⎩ ⎨ ⎧ <−>>+ ≥−<< = − 12)6/2()2( 12)26/()( 6/1 00),( 00),( ),( QPQPVW QPQPVW W QP jiQD jiQD jirD (i, j=0,…,3) (8.86) 其中,V 是融合在反量化过程中的逆 DCT 中的比例变换系数,它的定义类似于 MF 系数,V00 是对应位置在(0,0)上的 V 值。不同位置的 V 值如表 8.9 所示。 表8.9 H.264中V值 样点位置 QP (0,0),(2,0), ( 2, 2),(0,2) (1,1),(1,3), ( 3, 1),(3,3) 其它样点位置 0 10 16 13 1 11 18 14 2 13 20 16 3 14 23 18 4 16 25 20 5 18 29 23 计算后要把相应得到的 DCT 直流系数放到对应图像亮度块的直流分量位置上。 8.10.2.2 色度直流变换系数的比例变换 这个过程与帧内 16×16 预测模式宏块的亮度直流变换系数的比例变换类似,它的输入是宏块色 度直流变换系数量化值,是一个 2×2 数组 ZrD。输出是 4 个反量化过的 DCT 中的直流系数值,表示 成 2×2 数组 WrD。 2×2 色度直流变换系数的逆 Hadamard 变换定义为: ⎥⎦ ⎤ ⎢⎣ ⎡ −⎥⎦ ⎤ ⎢⎣ ⎡ −= 11 11 11 11 rDQD ZW (8.87) 反变换后,根据色度的量化系数 QPC 进行反量化及逆 DCT 中的比例变换: ⎩ ⎨ ⎧ <>> ≥−<< = 61)( 6)16/()( 00),( 00),( ),( CjiQD CCjiQD jirD QPVW QPQPVW W (i, j=0,…,3) (8.88) 其中, QPC 的值由亮度的量化系数 QP 及 H.264 中定义的句法元素 chroma_qp_index_offset 决 Xr(0) Xr(2) Xr(1) Xr(3) 输入 + + + + - - + + + + - r r xr(0) xr(1) Xr(2) xr(3) 输出 - 定。QPC 值由表 8.10 根据 qPI 值查找。qPI 值由下式计算: qPI = Clip3( 0, 51, QPY + chroma_qp_index_offset ) (8.89) 其中,函数 Clip3 为限幅函数,表示如果 QPY + chroma_qp_index_offset 小于函数中第一个参数 值 0,则 qPI 为 0;如果 QPY + chroma_qp_index_offset 大于函数中第二个参数值 51,则 qPI 为 51; 否则 qPI 为实际的 QPY + chroma_qp_index_offset 值。 表8.10 QPC值与qPI的对应关系 qPI <30 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 QPC =qPI 29 30 31 32 32 33 34 34 35 35 36 36 37 37 37 38 38 38 39 39 39 39 计算后要把相应得到的 DCT 直流系数放到对应图像色度块的直流分量位置上。 8.10.3 残差变换系数的反量化 同量化过程一样,反量化过程也融合了逆 DCT 变换中的乘法运算。首先,如果当前处理的图像 块是色度块或帧内 16×16 预测模式的亮度块,则反量化输出矩阵 Wr 中的直流系数 Wr(0, 0)直接为前节 计算结果。对 DCT 交流分量或图像块不是前面情况的直流分量,按式(8.90)计算: )6/()( ),(),(),( QPVWW jijirjir <<= (i, j=0,…,3) (8.90) 其中,QP 为该块(亮度或色度)的量化参数,色度的量化参数的确定见上节。 8.10.4 残差变换系数的逆 DCT 变换 按照整数 DCT 变换的原理,逆 DCT 变换的公式应该为: ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −− −− −− ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ ⎥⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢⎢ ⎢ ⎢ ⎢ ⎣ ⎡ ⊗ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −− −− −−= ⊗= 2 1 2 1 2 1 2 1 22 22 22 22 2 1 2 1 2 1 2 1 T 11 1111 11 1111 111 111 111 111 )( babbab abaaba babbab abaaba W W iiir CECX (8.91) 其中,“⊗Ei”已在前面的反量化中完成,其结果为 Wr,所以这里只进行以下运算: Xr = Ci TWrCi (8.92) 同样,式(8.92)也可以分成两次一维变换。 8.10.5 去方块滤波前的图像恢复与重建 到上节为至,计算结果是图像与预测值之前的残差值矩阵,实际输出的各图像样点值 Uij(i 和 j 为图像样点在图像块中的行和列)应该是在该点上得到的残差值与前面的预测值之和,这样得到图 像各样点的恢复值。 图像的重建是将上面恢复的图像样点值赋值到实际的图像输出矩阵中。设当前宏块亮度样本的 左上角位置为(xP,yP),当前图像块在宏块中的位置为(xO,yO),恢复样本矩阵为 U。 如果 U 是亮度块,对 4×4 亮度块中的每个样本元素 Uij,根据变量 MbaffFrameFlag 进行以下操 作: ① 如果 MbaffFrameFlag 为 1(当前宏块帧场自适应 mb_adaptive_frame_field_flag 为 1,并且当前图 像片为帧编码,即 field_pic_flag 为 0)并且当前宏块是场宏块,则重建图像中样点亮度值为: S'L[ xP + xO + j,yP + 2 × ( yO + i ) ] = Uij i, j = 0, …, 3 (8.93) ② 否则(MbaffFrameFlag 为 0 或者当前宏块是帧宏块),则重建图像中样点亮度值为: S'L[ xP + xO + j,yP + yO + i ] = Uij i, j = 0, …, 3 (8.94) 如果 U 是色度块,对 4×4 色度块中的每个样本元素 Uij,根据变量 MbaffFrameFlag 进行以下操 作: ① 如果 MbaffFrameFlag 为 1 并且当前宏块是场宏块,则重建中图像样点色度值为: S'C[ ( xP >> 1 ) + xO + j,( ( yP + 1 ) >> 1 ) + 2 × ( yO + i ) ] = Uij i, j = 0, …, 3 (8.95) ② 否则(MbaffFrameFlag 为 0 或者当前宏块是帧宏块),则重建中图像样点色度值为: S'C[ ( xP >> 1 ) + xO + j,( ( yP + 1 ) >> 1 ) + yO + i] = Uij i, j = 0, …, 3 (8.96) 8.11 SP 片中的 P 宏块和 SI 片中的 SI 宏块的解码过程 第六章已经着重描述了 SP/SI 帧的应用、编解码基本原理和实验分析。本节结合草案进行 SP/SI 帧中的解码过程进行论述。鉴于片是 H.264 标准的基本编解码单元,因此实质上是阐述对 SP 片中的 P 宏块和 SI 片中的 SI 宏块的解码。 SP 帧分为主 SP 帧和辅 SP 帧,前者参考帧和当前编码帧属于同一码流,而后者则不属于同一码 流。片头语义变量 sp_for_switch_flag 用来区分主辅 SP 帧,0 表示主 SP 帧,1 表示辅 SP 帧。下面分 别描述对这两种 SP 帧的解码过程。 8.11.1 主 SP 片中 P 宏块的解码过程 主 SP 片中 P 宏块的解码原理图如图 8.46 所示,具体又分为亮度变换系数和色度变换系数的解 码过程。输入参数是当前宏块的帧间预测值和残差变换系数的预测值;输出参数为当前宏块的解码 样点值。 图 8.46 主 SP 帧解码原理图 8.11.1.1 亮度变换系数解码过程 输入参数:当前宏块的帧间亮度预测值 predL、残差变换系数预测值 LumaLevel 和变换系数 luma4x4BlkIdx 输出参数:当前宏块的解码亮度样点值 uij 亮度变换系数解码步骤: 1) luma4x4BlkIdx 推导坐标( x,y),详见 Draft6.4.3 2) 求出宏块各点亮度的预测值:pij = predL[x+j,y+i] i,j = 0…3 3) 求 pij 的 DCT 变换 ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −− −− −− ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ −− −− −−= 1121 2111 2111 1121 pppp pppp pppp pppp 1221 1111 2112 1111 c 33323130 23222120 13121110 03020100 p (8.97) 4) 残差变换系数 LumaLevel[ luma4x4BlkIdx ]逆扫描过程映射为二维矩阵 cr 5) cr 反量化后与 cij p 相加求得 cij s cij s = cij p+(((cij r*LevelScale(QPY%6,i,j)*Aij)<<(QPY/6))>>6) (8.98) 6) cij s 进行量化处理,但量化参数与 cij r 不同 cij = (Sign(cij s)*(Abs(cij s)*LevelScale2(QSY%6,i,j) + ( 1<<(14 + QSY / 6))))>>( 15 + QSY / 6 ) (8.99) 7) cij 反变换求得 rij 8) uij = Clip1( rij ) 8.11.1.2 色度的变换系数的解码过程 输入参数:当前宏块的帧间预测色度值 predC 和预测残差变换系数 ChromaDCLevel and ChromaACLevel;输出参数:当前宏块的解码的色度值。 可以看出,色度得变换系数分 AC 和 DC 两种,但两种的区别只是 AC 系数采用了 DCT 变换, 而 DC 系数采用了 Hadamard 变换,其余步骤基本一致,因此,下面只对 AC 系数的解码过程过行描 述。 色度 AC 变换系数的解码过程和亮度类似,步骤如下: 1) chroma4x4BlkIdx 推导坐标(x,y) 2) 求出宏块各点色度的预测值 pij = predC[x+j,y+i] i, j = 0..3 3) 求 pij 的 DCT 变换,得 cp 4) 求变量序列 chromaList[k] ⎩ ⎨ ⎧= 1] -k ][BlkIdx [chroma4x4vel[iCbCr]ChromaACLe 0[k]chromaList 15...1 0 = = k k 5) 变换系数 chromaList [chroma4x4BlkIdx ] 逆扫描求得二维矩阵 cr 6) cr 进行反量化,量化参数为 QPC 和预测值 cij p,得 cij s 7) cij s 量化处理,但量化参数与 cij r 不同,量化参数为 QSC 8) cij 进行反变换得到 rij 样点值 9) uij = Clip1( rij ) i,j = 0..3 8.11.2 辅 SP/SI 片的解码过程 辅 SP/SI 帧的解码原理如图 8.47 所示。同样又分为亮度变换系数和色度变换系数的解码过程。 输入参数是预测残差变换系数值和预测样点值 predL, predCb, predCr,;输出参数是当前宏块的解码样点 值。 + 反量化 去 复 用 量化 lerr 反变换 帧存储 运动补偿预测 变换 SPQP drec 运动信息 P(x,y) dprec 帧内预测 lpred lrec 重构图像 帧内预测模式 SPQP 辅SP帧 SI帧 图 8.47 辅 SP/SI 帧的解码原理图 8.11.2 .1 亮度变换系数解码过程 输入参数:预测亮度样点值 predL 和亮度预测残差变换系数值 LumaLevel. 输出参数:当前宏块的解码亮度样点值 亮度变换系数解码步骤: 1) luma4x4BlkIdx 推导坐标( x,y) ( x, y ) 2) 求出宏块各点亮度的预测值:pij = predL[x+j,y+i] i,j = 0…3 3) 求 pij 的 DCT 变换 4) cij p 求进行量化,量化参数为 QSY 5) 变换系数 LumaLevel[ luma4x4BlkIdx ] 逆扫描过程映射为二维矩阵 cr 6) 求累加值:cij = cij r+cij s i, j = 0..3 7) cij 反变换求得 rij 8) uij = Clip1( rij ) i, j = 0..3 9) 8.11.2.2 色度的变换系数的解码过程 输入参数是预测色度值和预测残差变换系数值 ChromaDCLevel and ChromaACLevel,输出参数 是当前宏块的解码色度值 和上面类似,色度得变换系数分 AC 和 DC 两种,但两种的区别只是 AC 系数采用了 DCT 变换, 而 DC 系数采用了 Hadamard 变换,其余步骤基本一致,因此,下面只对 AC 系数的解码过程过行描 述。 AC 系数解码步骤: 1) chroma4x4BlkIdx 推导坐标(x,y) 2) 求出宏块各点色度的预测值 pij 3) 求 pij 的 DCT 变换,的 cp 4) cp 进行量化:量化参数为 QSC 5) 求变量序列 chromaList[k] ⎩ ⎨ ⎧= 1] -k ][BlkIdx [chroma4x4vel[iCbCr]ChromaACLe 0[k]chromaList 15...1 0 = = k k (8.100) 6) 变换系数 chromaList [chroma4x4BlkIdx ] 逆扫描求得二维矩阵 cr 7) 求重构值:cij( chroma4x4BlkIdx ) = cij r( chroma4x4BlkIdx ) + cij s 8) cr 进行反量化,量化参数为 QPC 9) cij 进行反变换得到 rij 10)uij = Clip1( rij ) i,j =0..3 参考文献 1. “Draft ITU-T recommendation and final draft international standard of joint video specification (ITU-T Rec. H.264/ISO/IEC 14 496-10 AVC,”in Joint Video Team (JVT) of ISO/IEC MPEG and ITU-T VCEG, JVTG050,2003. 2. T. Wiegand, G. J. Sullivan, G. Bjøntegaard, and A. Luthra, “Overview of the H.264/AVC Video Coding Standard,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 560–576, July 2003. 3. S. Wenger, “H.264/AVC over IP,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 645–656, July 2003. 4. T. Stockhammer, M. M. Hannuksela, and T. Wiegand, “H.264/AVC in wireless environments,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 657–673, July 2003. 5. T. Wedi, “Motion compensation in H.264/AVC,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 577–586, July 2003. 6. M. Flierl and B. Girod, “Generalized B pictures and the draft JVT/H.264 video compression standard,” IEEE Trans. Circuits Syst. Video Technol.,vol. 13, pp. 587–597, July 2003. 7. T. Wiegand, H. Schwarz, A. Joch, F. Kossentini, and G. J. Sullivan, “Rate-constrained coder control and comparison of video coding standards,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 688–703, July 2003. 8. Schafer Ralf, Wiegand Thomas, Schwarz Heiko. “The emerging H.264/AVC Standard EBU Technical Review”, Jan.2003 9. M. Karczewicz and R. Kurçeren, “The SP and SI frames design forH.264/AVC,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 637–644, July 2003. 10. H. Malvar, A. Hallapuro, M. Karczewicz, and L. Kerofsky, “Low-Complexity transform and quantization in H.264/AVC,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 598–603, July 2003. 11. P. List, A. Joch, J. Lainema, G. Bjøntegaard, and M. Karczewicz, “Adaptive deblocking filter,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 614–619, July 2003. 12. J. Ribas-Corbera, P. A. Chou, and S. Regunathan, “A generalized hypothetical reference decoder for H.264/AVC,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 674–687, July 2003. 13. Mathias Wien, “Variable Block-Size Transforms for H.264/AVC” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 604–613, July 2003. 14. Michael Horowitz, Anthony Joch, Faouzi Kossentini,“H.264/AVC Baseline Profile Decoder Complexity Analysis” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 704–716, July 2003. 15. Marta KarczewiczThe. SP- and SI- Frames Design for H.264/AVC. IEEE Trans. Circuits and Systems for Video Technology, Vol 13, No.7, July 2003 第 9 章 H.264 视频编码传输的 QoS 9.1 互联网视频传输 QoS Internet 在过去几年所取得的巨大成就和未来所蕴涵的巨大发展潜力几乎没有人怀疑。当人们在 思考未来 Internet 的发展时,如何在 IP 网络上保证用户信息传输的质量就成为一个不容忽视的重要 问题。目前,随着宽带网络的发展和用户需求的驱动,多媒体技术和相关的应用得到越来越多的关 注,被认为是未来高速网络的主流应用之一。多媒体应用相对于传统 Internet 应用如 WWW、EMAIL 等,其对实时性更严,对带宽的需求更大。基于 IP 的多媒体应用分为三类:交互应用,如可视电话 和视频会议;预编码的视频流下载;基于 IP 的视频流。为满足这些应用的需求,必须解决四个 QoS 问题:吞吐量;传输时延;时延抖动;误码率。同时,由于视频应用中大多采用的高压缩率的编码 技术,其对传输误码的要求尤为苛刻,但是因为 Internet 的本质是尽力而为的网络,不提供传输的 QoS 保证,因此在视频应用中提高对传输误码的抗干扰和恢复能力是很有必要的,同时这也一直是 多媒体通信领域研究的热点。 本节首先对错误恢复能力在 IP 视频通信中的重要性和实现途径进行简单地描述;然后对视频通 信中传统的抗干扰和恢复方法[1]进行一个回顾,并为表述的更清晰,简单的介绍了通用的基于块的 混合视频编码框架。 9.1.1 错误恢复在视频通信中的重要性和实现途径 视频通信系统通常由五部分组成,视频源编码、复用/包封装/信道编码、信道传输、解复用/解 包/信道解码和视频解码。视频首先在编码器中进行压缩以减小码率,压缩的比特流然后被分割成固 定的或变长的包,并与数据、音频等复合,然后打包,最后需要经过一个信道编码阶段,通常使用 前向纠错编码(FEC),用来防止传输的错误。在接收端,收到的包按照 FEC 解码并解包,输出的比 特流被放入视频解码器用于重构原始的视频。在实际的使用中,许多应用在源端编码器中内嵌包封 装和信道编码作为一个网络适配层。数据包可能会由于流量拥塞或物理信道的损伤导致的比特错误 而产生丢失或损坏,例如在当前的 Internet 和无线网络中;因此,设计一个能使压缩的比特流在传 输发生错误时可以进行错误恢复的视频编解码方案很必要;同时也必须在编解码器与网络之间设计 一个合适的接口机制以使编解码器能根据网络情况调整操作。 在视频通信中的错误控制由于下面几个原因而显得备受重视: z 压缩的视频流由于在源编码器中采用了预测编码和可变长编码(VLC),对传输的错误特别敏感。 由于使用了空间和时间预测,一个带有错误的采样点将会导致同一帧或后续帧相关采样点的错 误,同样由于VLC的使用,一个比特错误会导致解码器失去同步,从而使后续比特的正确接收 失去意义。 z 视频源和网络环境通常是时变的,因此基于某些源和网络的统计模型设计出一个“优化”的解决 方案是很困难的,甚至是不可能的。 z 视频源有着很高的码率,因此编解码器不可能过于复杂,尤其是对于某些实时应用。 为使压缩的比特流对传输错误具有抗干扰性,必须在流中加入冗余数据,利用这些冗余数据和 有效数据之间的关系,才有可能检测并修正错误。这个冗余可以加入到源端编码或信道编码中,通 常采用源和信道联合编码实现,它在源编码和信道编码中统一分配一个一定总量的冗余。所有的错 误恢复编码(error resilient encoding)方法基本上都符合这个前提,这些通常通过仔细的设计预测编 码循环和变长编码器完成,用以限制错误扩散的范围。 即使一个图像采样或一块采样在传输中由于错误而丢失,解码器仍能基于周围的已经收到的采 样点,利用空间和时间相邻的采样点的内在相关性,进行估计,从而达到错误恢复,这个技术即所 谓“错误隐藏”技术。为保证解码器的错误隐藏,相邻采样点或块的压缩数据在包封装时必须按照 interleaved 交织方式,用以提高损坏区域被未损坏区域包围的概率。错误隐藏相对于错误恢复源端 编码,优点是不需要增加额外的比特率,仅仅增加了解码器上的运算复杂度。 最后,为保证源端编码器中的内嵌冗余的有效性和解码器的错误隐藏能力,编解码器和网络传 输协议必须相互协作。例如,如果比特流中的某些比特比其他的更重要,重要的部分在网络分发时 必须被赋予更高的 QoS 参数集。为抑制错误扩散,网络必须提供反馈信道,这样编码器就能知道在 解码器中那部分重构信号损坏,在预测将来采样点时就不使用这些信号。 总体来说,抗传输误码的设计机制分为三类:在源端编码和信道编码中引入冗余数据的方法, 使比特流对可能的错误具有更强的恢复能力;在解码器中基于错误检测来对错误的影响进行隐藏; 通过源端编码器和解码器之间的交互,来使编码器根据解码器检测到的丢失情况调整操作。在本文 中,我们将它们统称为错误恢复技术 (ER techniques)。 下面将要简单回顾一下基于块的时间预测和变换编码的编码器。因为这些编码器是迄今最实用 和有效的编码器,并已被国际视频编码标准采纳。 9.1.2 基于块的混合视频编码框架 图 9.1 显示了编码框架中的关键步骤。如图所示,每个视频帧被分成固定大小的块,每个块进行 独立的处理,因此命名为“基于块的”。“混合”意味着每个块使用运动补偿时间预测和变换编码的联 合编码方法。也就是说,一个块首先通过前一个编码参考帧中的匹配块预测,最佳匹配块位置的估 计即“运动估计”,当前块和匹配块之间的位移即“运动矢量”(MV)。基于 MV 预测一个块的过程称为 “运动补偿”。块的预测误差(残差),通过 DCT 变换后,对相应的系数进行量化,并使用 VLC 将它 们转换成二进制码字,使用 DCT 的目的在于减少相邻像素点误差的空间相关性。因为大量的高频系 数在量化后为 0,VLC 采用游程编码的方法,使用 zig-zag 扫描将系数排序进一个一维数组,这样低 频系数放置在高频系数之前。这种方法中,量化后的变换系数通过非零值和其前面的零的数目来表 示。每个不同的符号都代表着一对零游程和非零值,它们使用变长码字进行编码。上述的讨论都假 设时间预测是成功的,即预测残差块只需要比原始图像较少的比特。这种编码方式称为 P 模式。当 情况不同时,原始的块将直接采用 DCT 和游程编码进行编码,这种编码方式称为帧内模式(I 模式)。 除了使用一个参考帧来进行预测的方法外,也可以使用双向预测的方法,即寻找两个最佳的匹配块, 其中一个位于前向序列中,一个位于后向序列中,并使用两个匹配块的权重均值作为当前块的预测 值。这种情况中,两个运动矢量与每个块相关,这种编码方式称为 B 模式。P 模式和 B 模式又统称 为帧间模式。模式信息、运动矢量和其他枝节信息(例如图像格式、块位置等)也通过 VLC 编码。 在实际使用中,用于运动估计的块大小不一定与用于变换编码的相同。通常运动估计一般采用 较大的块,即宏块 (MB),它可以再划分为一些块。例如在大部分的视频编码标准中,宏块的大小 为 16x16 点阵,而块大小为 8x8 点阵。编码模式在宏块级进行决定。因为相邻宏块的运动矢量往往 类似,当前宏块的运动矢量首先使用前一个宏块的运动矢量来进行预测,同样块的 DC 系数采用同 样的方法处理。在所有的视频编码标准中,一些宏块构成宏块组(GOB)或片,一些片构成一帧。片 的大小和形状在不同的视频编码标准和图像大小中也不同,并可以根据应用需求进行调整。运动矢 量和 DC 系数的预测通常局限在同一片中。如果一帧都采用帧内模式编码,这一帧就称为 I 帧。一 般用于一个序列的第一帧。在使用高码率或对实时性限制较松的应用中,会周期地使用 I 帧来阻止 潜在的错误扩散,并提供随机的存取。低时延应用不能采用这个有效方法,因为 I 帧通常比任何预 测帧大好几倍。P 帧只使用过去的帧进行预测,一个 MB 既可以通过帧内模式也可以通过 P 模式编 码。最后,一个 B 帧使用双向预测,一个 B 帧内的 MB 可以使用 I 模式、P 模式或 B 模式编码。一 个 B 帧只能在周围的 I 帧或 P 帧编码后再进行编码。 图 9.1 基于块的混合视频编码框架图 从图 9.1 的基于块的混合视频编码框架可以看到,由于采用了帧内和帧间预测的模式,尤其是 P 模式(单向帧间预测)和 B 模式(双向帧间预测)的大量使用,视频流压缩效率大大提高,但随之 而来的是,由于传输误码甚至丢包所导致的影响会迅速扩展,这使采用误码恢复技术更具重要性。 9.1.3 视频通信中提高 QoS 的抗误码和错误恢复技术 在错误恢复编码中,编码器通常在编码流中加入适量的冗余比特,因此,ER 编码器效率不是最 高的。其设计的目标在于使用最小的冗余来获得错误恢复的最大增益。有很多方法用于添加冗余比 特,一些有益于防止错误扩散,另一些用于帮助解码器通过错误监测进行更好的错误隐藏,还有一 类目标在于保证基本级别的质量,并提供传输错误发生时质量比较平滑的下降。通常错误恢复编码 技术分为鲁棒熵编码和错误恢复预测两类。 鲁棒熵编码是一种常用方法。由于使用 VLC 编码,因此一个码字中间任意一个比特错误或丢失 都会导致这个码字以及后续码字不能解码。一个简单有效的提高码流鲁棒性的方法就是在比特流中 周期的插入重同步标记。这样,解码器可以在检测到重同步标记之后继续正确的解码。然而很明显, 重同步标记的插入会降低编码效率,首先,标记越长,使用频率越高,占用的比特就越多;其次, 标记的使用通常会中断图像内预测机制,例如 MV 或 DC 系数的预测,同样会增加更多的比特。但 是, 标记越长,使用频率越高,解码器就能更快的获得重同步,这样一个传输错误就会只影响一个 更小的区域。因此,在实际的视频编码系统中,一般使用相对较长的同步码字。 9.1.3.1 反向变长编码 反向变长编码 (RVLC)[3,4]是另一种常用方法,其原理图参见图 9.2。上面我们都假设一旦错误 发生,解码器将丢掉所有比特直到获得重同步。但是如果使用 RVLC,解码器就能在重同步前通过 如图 2 所示的反向操作进行解码。这样,更少的正确接收的比特被丢弃,传输错误影响的区域将会 变小。通过提供前向解码器和后向解码器之间的交叉检查的能力,和适度的复杂度增加,RVLC 能 帮助解码器检测到使用非逆向 VLC 不能检测到的错误,并提供错误位置的更多信息,因此减少了不 必丢弃的数据量。RVLC 和同步标记插入已经被 MPEG-4 和 H.263 采纳。 重同步标记 头 运动/模式信息 MM 细节数据 RVLC 重同步标记XX 1 前向解码 2 错误检测,跳到下一个 同步标记 3 后向解码 4 错误定位 错误消除 图 9.2 反向变长编码解码原理图 错误恢复预测技术是另外一种常用方法。我们知道压缩视频对传输错误敏感的一个主要原因就 是使用了时间预测和空间预测。一旦有误码发生,在解码器上重构的帧将会与原图像有较大差别, 这样会导致使用这一帧作为参考帧的后续帧产生错误。DC 系数和 MV 使用了空间预测,这同样会 导致错误扩散,尽管这种扩散限制在一帧内。在绝大多数的视频编码标准中,这样的空间预测都进 一步的限制在一帧中的子区域(块组或片)中。在实际的编码系统中通常采用下面四种方法解决上 述问题:插入 I 模式的宏块或帧;独立的段预测;带有非均衡错误保护的分层编码;多描述编码 (multiple description coding ,MDC)。 阻止时域错误扩散的一个方法是周期的插入帧内编码的帧或宏块[6]。对于实时应用由于时延限 制通常不可能采用一帧的帧内编码。然而使用足够数量的帧内编码的宏块却是一个有效的具有高扩 展性的错误恢复工具。当使用宏块的帧内编码作为错误恢复的目的时,宏块的数量和它们的空间位 置需要仔细决定。必需的帧内编码的宏块的数量很明显由连接的质量决定。大量的实用系统提供关 于网络质量的带外信息,或 heuristic 的方法用于获得这类信息,例如无线环境中的天线信号强度和 因特网连接中的 RTCP 接收器报文。对于 I 模式块的空间位置有多个方案,位置随机分配是一种有 效方法,同样位置分配于高活动区域(由 MV 的平均幅度值决定)同样有效。目前所知最好的方法 是使用基于丢包率的率失真优化方案[7]来决定 I 模式宏块的数量和位置。最后还有一个闭环的方法, 使用一个反馈信道将丢失或损坏的宏块数据信息传达给发送端,用于触发帧内编码。 非均衡错误保护的分层编码属于错误恢复预测技术的一种。另一个限制错误扩散范围的方法就 是将数据分成多个段,仅在同一段内部进行时间和空间预测。一个途径是将奇数帧作为一段,偶数 帧作为另一段,这种方法在[8,9]中称为视频冗余编码。它同样可作为完成下面即将阐述的多描述编 码的一个方法。另一个途径是将帧分为多个区域(GOB 或片),某个区域只能由前一帧的相应区域 进行预测,这在 H.263 中称为独立段解码(ISD)。 9.1.3.2 分层编码 分层编码(分级编码,LC)是指将视频编码成一个基本层和一个或多个加强层。基本层提供了一 个较低的但可接受的质量,每个附加的加强层逐步的提高质量。本质上,LC 是一个向用户针对同一 视频提供不同的质量等级,占用不同带宽和不同的解码能量的方法。因此 LC 也称作 scalable 编码。 用于错误恢复时,LC 必须与传输系统中的非均衡错误保护(UEP)相结合,因此基本层使用更强的保 护,例如分配更可靠的子信道,使用更强的 FEC 编码,或允许更多的重传等[10,11]。UEP 的实现有 网络层的和应用层的,目前绝大部分网络不提供支持,相对来说应用层的实现比较灵活,如使用基 于包的 FEC 等,只是需要另外的比特。 在使用 LC 的编码方法中,可以通过编码级别,来提高视频的解析度、帧频和图像的质量。视频 的可分级性就是指能够同时获得多于一种解析度或图像质量的能力。由于用于多个编码流,那个基 本比特流称为基本层(B 级),其它的比特流均称为加强层(E1 级,E2 级等)。基本层中包含了解码 必须的重要信息,如头信息,运动矢量和 DC 分量等。因此加强层必须在基本层正确的前提下才能 完成解码操作。由于加强层以基本层为参考的主要或唯一来源,因此由加强层的数据报丢失而导致 的错误扩散将被最小化。在 H.263 和 MPEG-4 有三类分级方式:时间、信噪比(SNR)和空间。 z SNR 分级:在 SNR 分级情况中,基本层码流由于使用了更高的压缩,获得的视频质量较低, 而加强层码流按照较高的质量进行编码。其它参数,如空间和时间的解析度,基本层与加 强层相同。 z 空间分级:在空间分级情况中,加强层用于提高图像的解析度。例如,基本层的解析度为 QCIF,而加强层则为 CIF 解析度。这样,当输出需要 QCIF 解析度时,就只需要基本层的 码流被解码;而当输出需要 CIF 解析度时,基本层和加强层都必须被解码。但是它的编码 复杂度比其它的编码方法复杂。 z 时间分级:在基于对象的时间分级中,某个给定的对象的帧频被提高,这样它就能拥有比 其它区域更平滑的移动。也就是说,给定的对象的帧频比其它区域的帧频。这个编码方法 的复杂度是分级编码中最小的,因此这个分级方法在 Windows Media Player 使用。 有两类加强层编码方法,一类称为 PPP,仅由 P 帧组成,如图 9.3;另一类称为 PBB,由 P 帧和 B 帧组成,如图 9.4。在 PPP 方式的加强层编码过程中,它仅参考基本层中的一个帧用于运动估计, 这样加强层以基本层或同层的一个帧的上采样作为参考,它减少了估计时间,但码率较高,使用于 FGS 中。而在 PBB 模式中,同时参考基本层和加强层,有着更高的压缩率,但增加了帧之间的复杂 度,同样,这种方法可以有效地阻止错误扩散。 图 9.3 只含 P 帧的增强层格式 图 9.4 含 P 帧和 B 帧的增强层格式 9.1.3.3 多描述编码 同 LC 一样,MDC 也将一个源编码成多个子流,称为描述,区别是产生的描述是相关的,有着 同样的重要性。任何一个单独的描述必须提供一个基本级别的质量,多个描述一起提供改善的质量。 因此所有的描述必须共享源的一些基本信息。这种相关性使解码器能够根据正确接收的一个描述估 计一个丢失的描述,因此能从任意一个描述提供一个可接受的视频质量。另一方面,这种相关性就 是 MDC 中源端的冗余。MDC 相对于 LC 的一个优点是它不需要网络提供可靠的子信道。 多描述视频编码是一个可用于解决尽力而为的网络所引起的 detrimental 影响的方法。在一个多 描述系统中,视频序列被编码成两个或更多个互补码流,且每个码流独立解码。当所有互补码流相 结合时,视频流提供最高的质量级别,但即使分别解码,它们也能提供可接受的质量级别。这些流 可通过各自的网络路径传送,从而经历或多或少的各自的丢包率和延迟。当一个流的某一部分丢失 或延迟太大时,视频的播放将不会受到严重地影响而引起完全停止等待重新缓冲。相反,其它的流 可以继续播放,仅仅总体的视频质量有轻微下降。 在两个独立流的情况下,如图 9.5,问题可以描述如下:一个给定的源被编码成两个流,码率分 别是 R1 和 R2;这两个流分别通过两个网络信道进行传送;接受端由三个独立的子解码器组成,当 两个流全部按时到达时,中间的解码器输出图像序列,当其中一个流按时到达时,两个边缘解码器其 中之一输出图像序列。中间解码器输出的失真定义为 D0,两个边缘解码器的输出失真分别定义为 D1 和 D2。状态选择器从最适当的解码器输出视频流。 图 9.5 两个独立流的 MD 系统模型 目标在于对于给定情形下寻找最优的性能,{R1,R2,D0,D1,D2}。这五个因素的每个的相 对重要性根据当时的情形而定。在某些系统中,可靠性最重要,此时 D1 和 D2 变得更重要,比特率 的重要性可能会下降;在另外的情况中,可能正好相反,编码效率的鲁棒性显得更迫切。系统不必 对任何一个流平衡,即 R1 可以拥有比 R2 更大的权重等。 作为 MD(多描述)系统的一个简单例子,一个序列被分割成两部分,所有的奇数场作为一个 流,所有的偶数场作为另一个流,这个过程产生了两个有着一半垂直解析度的新序列。然后这两个 序列可以被独立编码和进行网络传输。当两个流均按时接收,两个流的行通过交织从而重构一个带 有失真的完整解析度序列。如果一个流丢失,滤镜(deinterlacing)算法可用于估计丢失的行。通常, 估计的失真(D1 或 D2)将比两个流同时接收所得到的大,但尽管一个流全部失效(outage),播放 仍能继续。 当然,鲁棒性的获得需要付出代价。对帧进行空间下采样会降低空间的相关性。根据上面的问 题所对应的公式,中间解码器要获得某个失真 D0 所需的总体码率 R1+R2 肯定大于某个单独的流编 码器达到 D0 所需的码率。然而,根据特定的应用考虑,放弃一些效率从而获得可靠性的增加,是 很有必要的。 这儿需要注意的是多描述编码与分级视频编码的区别。与 MD 编码一样,一个分级编码器将一 个序列编成多个流,称为层;然而分级编码中,一个独立的基本层后面是一个或多个不独立的增强 层,(参见图 9.6)。这就允许某些接收者只对基本层解码而获得基本视频,同时另一些接收者同时对 基本层和一个或多个加强层同时解码,从而获得改善的图像质量、空间解析度或帧频。与 MD 编码 不同,基本层的丢失会导致加强层无用。 基本层比特流 加强层比特流 基本层视频 增强的视频 流2视频 比特流1 比特流2 流1视频 合并的视频 图 9.6 LC 系统模型和 MD 系统模型之比较 9.1.3.4 解码器错误掩盖 解码器错误掩盖是指对传输错误导致的丢失信息的恢复和估计。在基于块的混合编码范例中, 在损坏的 MB 有三类信息需要估计:纹理信息,包括原始图像块和预测错误块的像素或 DCT 系数的 值;运动信息,包括 P 模式或 B 模式编码的 MB 中的 MV;宏块的编码模式。众所周知,原始图像 的能量主要集中在低频分量,例如空间和时间相邻的像素点的色度值的变化很平滑,除了在区域的 边缘。所有的用于恢复纹理信息的技术都是基于上述特性进行某种空间、时间内插。MV 域也采取 同样的方法,对于编码模式,开发的方法倾向于 heuristics。 对于纹理信息的恢复,有四种方法:运动补偿时间预测;空间内插[19];基于重构图像最平滑的 空间和时间内插[21];使用Projection onto Convex Sets (POCS) 技术的空间内插[22,23]。运动补偿时 间预测是一个简单有效的恢复损坏MB的方法,即基于宏块的MV复制前一帧中相应的宏块,这种方 法需要MV是有效的;当MV也丢失时,先要估计MV,其方法下面会描述;为减少估计MV中误差的 影响,时间预测将与空间内插相结合。空间内插是根据相邻的正确接收的块中的像素点内插估计损 坏的块中的像素点,通常只使用相邻块中的边缘像素点用于内插估计;一个更简单的方法是估计损 坏块的DC系数(例如均值方法)[20],并使用一个等于估计DC值的常量替换整块,DC值的估计可 以通过周围块的平均获得。在进行空间内插时存在一个问题就是如何决定合适的内插过滤器 (interpolation filter),另一个问题是不能忽略正确接收的DCT系数,这些问题可以如下解决:使损 坏块中的像素点平滑的连接到它在时间和空间上相邻的像素点,如果部分的DCT系数正确接收,估 计必须保证恢复的块尽可能的平滑,并满足恢复的块的DCT与接收到的系数相同的条件,上述的目 标可以公式化成非限制性优化问题,在不同丢包率的模型中解决方案对应到不同的时域、空间域和 频域的内插过滤器。 此外还有一个进行空间内插的方法是使用POCS方法,但是由于基于POCS估计 的方法通过一个迭代的过程进行,因此对于实时应用不适用,本文不多加讨论。 编码模式和运动矢量同样可能损坏。一个估计损坏MB的编码模式的方法是收集相邻的MB的编 码模式的统计信息,并选择一个最可能的模式 [24]。另一个简单保守的方式就是假设MB是采用帧 内模式的,仅使用空间内插用于恢复下面的块[21]。对于估计丢失的MV有下面几个简单的方法[25]: (a) 假设丢失的MV为零,这对于相对变化较小的视频序列很有效;(b) 使用前一帧中的对应块的MV; (c)使用空间相邻的块的MV的均值;(d) 使用空间相邻的块的MV的中间值;(e)重新估计MV [19]。通 常如果一个宏块损坏了,那么其水平相邻的MB也一般已经损坏,因此平均和取中间值主要针对垂直 方向。实验显示最后两个方法能取得最好的重构结果[26]。 9.1.3.5 编码器和解码器的交互错误控制 通过编码器和解码器的交互进行错误控制是一个有效方法。当在编码器和解码器之间建立一个 反馈信道时,解码器可以通知编码器哪块数据损坏,这样编码器可相应调整操作来抑制甚至消除错 误造成的影响。当网络的时延允许的情况下,在实时交互应用中甚至可以采取ARQ机制,重传损坏 的参考帧,只要这些数据在解码器使用之前到达,就能部分的消除错误影响。用于编码器基于解码 器反馈的信息调整操作的方法有基于反馈信息的参考帧选择和基于反馈信息的错误跟踪。 一种有效利用反馈信道的途径就是参考帧的选择RPS[27]。如果编码器通过反馈了解某个编码帧 N受到损坏,那么它可以决定下一个P帧不使用帧N作为参考帧,而使用更前一帧(已经被解码器正 确接收)。这要求编码器和解码器存储多个过去的解码帧。关于使用的参考帧在比特流中传递。相对 于使用I帧,这种方法效率更高,同时使用RPS并不意味着更多的时延。当然,随着反馈信息分发时 间的变长,编码效率就会更多的丢失。 除了使用更早的帧作为参考帧外,编码器可以跟踪第N帧中损坏的区域对其后d帧的影响,基于 反馈信息的错误跟踪,并采取下列某种方法:(a) 将帧n+d中将要使用帧n+d-1中的损坏像素点进行预 测的区域使用I模式;(b) 避免使用帧n+d-1中的损坏区域来预测帧n+d;(c)对帧n+1 到n+d-1进行与 解码器相同的错误隐藏,这样编码器中的参考帧在进行帧n+d编码时将与解码器一致。最后一个方 法相对复杂,第一个方法最简单,但效率最低,实验显示它比RPS方法效率低[28]。 9.2 无线网视频传输 QoS 在过去二十年里,移动通信和多媒体通信获得了史无前例的发展,并获得了巨大的商业成功。 移动通信和多媒体技术的融合正在加速进行,在诸如网络架构、低功耗的集成电路、功能强大的数 字信号处理芯片、高效的压缩算法等方面的研究成果不断涌现。面向无线通信的视频图像编码与传 输技术已成为当今信息科学与技术的前沿课题。 无线网络除了提供语音服务之外.还提供多媒体、高速数据和视频图像业务。无线通信环境(无 线信道、移动终端等)以及移动多媒体应用业务的特点对视频图像的编码与传播技术提出了新的要 求。首先,传输带宽一直是至关重要的,这也对无线视频通信网络的架构、通信协议以及视音频编 码标准的研究产生了重要的影响。多媒体信息的信息量十分庞大,例如广播级质量的数字电视信号 码率未压缩时为 216Mbps,即使采用 CIF 格式也需达 37Mbps。采用当前最新的视频编码标准,广播 质量的视频图像需要的带宽大约为几 Mbps;而对于诸如可视电话这类低分辨率和图像相对静止的视 频,要获得令人满意的图像质量至少需要几十 kps 的带宽。与此同时,当前广泛使用的全球移动通 信系统 GSM,通常只能提供 10-15kbps 的带宽,刚够满足压缩语音编码的需求,对于视频传输是远 远不够的。幸运的是,随着第三代移动通信技术 3G 以及未来移动通信技术的发展,视频传输的带 宽瓶颈会得到进一步的缓解。 2003 年 ISO/IEC 的运动图像专家组(MPEG)与 ITU-T 的视频编码专家组(VCEG)在再次联 手制定了最新的视频编码标准 H.264/AVC。其主要目的和特点是更高的编码效率和更好的网络适应 性。在相同重构图象质量下,与 H.263+和 MPEG-4 ASP 标准相比,节约 50%的码流;采用分层模 式,定义了视频编码层(VCL)和网络提取层(NAL),后者专为网络传输设计,能适应于不同网 络中的视频传输,进一步提高网络“亲和性”。引入了面向 IP 包的编码机制,有利于网络中的分组传 输,支持网络中视频的流媒体传输。具有较强的抗误码特性,特别适应丢包率高、干扰严重的无线 视频传输的要求。 9.2.1 无线视频通信系统 图 9.7 给出了无线视频通信系统的框图。发送端,视频信源的输入视频经视频编码器压缩到特 定的码率的码流,经过传输层和网络层的封装打包后,进行信道编码,信道编码过程引入信道错误 控制措施:前向纠错编码 FEC、自动请求重发 ARQ 和数据交织 Interleaving,增强码流在无线信道 的传输性能,信道编码输出的经调制在无线信道上传输;接受端,进行解调和信道解码后,再进行 解包处理,得出编码视频流,进行视频解码,输出的重建的视频信号,可根据应用进行视频图像后 处理。 图 9.7 无线视频通信系统框图 从上图可以看出,无线视频通信系统与有线视频通信系统的区别在于,其包含一个无线的链路。 众所周知,无线信道的有效传输带宽是非常宝贵的,而且各种噪声干扰也会影响无线信道的数据传 输质量。因此,无线信道成为了无线视频传输关注的一个焦点。无线传输中面临的衰落和突发性错 误必须采用多种错误控制技术处理,这其中典型的有前向纠错编码 FEC 和 ARQ。FEC 和数据交织 结合明显消弱了无线信道突发性错误的影响,而基于反馈信道的 ARQ 则可正确的恢复错误的数据, 避免错误的传播。这些错误控制技术作为信道编解码的组成部分,在下一节进行详细描述。 9.2.2 无线信道编码和错误控制 要实现无线环境下的视频通信,首先必须搞清无线信道的物理特性,因此下面,首先对无线信 道的特性进行描述,同时为了便于理论研究和模拟仿真,建立了三种常用的无线信道模型。众所周 知,信道的编解码策略对于无线信道传输的质量至关重要,在此分别讨论信道编解码的错误控制技 术,其中主要包括前向纠错编码 FEC。数据交织和自动重发请求 ARQ。最后,讨论了 IP 协议在无 线通信中的应用。 9.2.2.1 无线信道的特性 通信信道有有线信道和无线信道。有线信道可视为恒定参量的信道,是人为制造的信道,它从 起初的明线、到同轴电缆,直到今天的光纤组成的光缆,通信容量越来越大,通信质量也越来越好, 其性能指标正逐步趋向理想的传输信道。但无线信道却与之不同,是开放的变参量信道。无线通信 的是以传输环境中的电磁波传播为基础,发送的电磁波有散射、折射和衰落。各种散射成分的干扰, 形成分布不规则的场强,因而接收信号衰落且失真。这种干扰的严重程度取决于散射环境的具体物 理性能。 因此,无线信道环境恶劣,实现无线网络上传输高质量的视频是一个富有挑战性的任务。存在 以下问题: z 有限的带宽 当前的移动通信网络为用户提供的传输带宽仍是非常有限的,尽管这个问题在 3G 会得到某种 程度上的缓解,考虑到无线传输信道的容量有限,多媒体信息的信息量又异常庞大,而且,目前市 场上最终用户大部分是按照流量付费的方式来使用无线网络数据服务的,视频编码标准的高压缩效 率就显得尤为重要。 z 带宽波动 无线信道的吞吐量会因为多径衰落、同频干扰和噪声扰动会造成无线信道的吞吐量降低,而且 基站和移动终端之间距离的变化以及不同网络之间的移动等情况均会造成信道带宽发生剧烈波动, 严重影响无线网络上的实时视频传输。 z 高误码率 与有线信道相比,无线信道一般具有大得多的噪声,而且多径和阴影衰落,使得误码率(BER) 非常高,误码严重影响视频传输的质量,因此,视频编码标准是否具有很强的抗误码能力成为了确 保无线视频传输 QoS 的关键之一。 9.2.2.2 信道模型 要实现无线视频传输,首先需要了解无线信道的传输特性,建立一个既实用又有一定精度的无 线信道模型是十分必要。下面总结了几种在理论研究和系统仿真中经常使用的几种无线信道模型。 z 高斯白噪声衰减模型(AWGN) 加性高斯白噪声 AWGN(Additive White Gaussian Noise)是最常见的一种噪声,它表现为信号 围绕平均值的一种随机波动过程。加性高斯白噪声的均值为 0,方差表现为噪声功率的大小,一般 情况下,噪声功率越大,信道的波动幅度就越大,接收端的信号的误码率也就随着越大。研究通信 系统的误码率与信道质量的关系,加性高斯白噪声信道的研究是基础。下面假设为在整个信道带宽 下功率谱密度为常数,且振幅符合高斯概率分布,则高斯信道的概率函数为: ) 2 exp( 2 1)( 2 2 σπσ vmvvP −−⋅= (9.1) z Markov 模型 由于用户的移动和外界自然条件的变化,无线信道容易产生 Rayleigh 衰减和多用户干扰,传输 码流往往会引起突发性错误,表现为几个到几十个毫秒时间内连续出现误码,误码持续时间与环境 特性以及接收端的运动速度有关,在此原理基础上建立了 Markov 模型,图 9.8 给出了最简单的二阶 的 Markov 无线信道模型。其中,信道有两个状态 S0 和 Sl。当信道处于状态 S0 时,报文正确传送和 接收,当信道处于状态 Sl 时,报文将会出错。突发性错误造成的连续出错报文的数量由信道处 Sl 的 时间长短和每个报文大小所决定。状态 S0 和状态 Sl 之间的状态为 ⎭ ⎬ ⎫ ⎩ ⎨ ⎧ − −= 1010 0101 1 1 PP PPP (9.2) 其中,P01 表示信道传输状态由 S0 到 S1 的概率,P10 表示信道传输状态由 S1 到 S0 的概率。 图 9.8 二阶 Markov 无线信道模型 z 随机出错模型 为了克服无线传输中的突发性出错,可以通过交织编码(interleaveing coding),将突发性出错转 换为随机性出错。要实现出错类型的转变,需要一定的交织编码深度,但交织编码深度越大,带来 的延时越大,限制了交织编码在实时传输中的应用。 在基于 IP 网络中,随机性出错会带来报文丢失。位出错率和报文丢失率满足以下关系: l e pP )1(1 −−= (9.3) 其中 p 为位出错率,l 为报文长度。若采用了纠错容量为 t 的 FEC 编码,则报文丢失率可以表示 为 ∑ = −−= t i li ec ppi lP 0 )1()(1 (9.4) 9.2.2.3 信道编码和错误控制 在这节,将主要讨论信道的编码和错误控制技术:FEC 和 ARQ,后者需要编解码器之间存在一 条反馈信道,而前者则不需要,同时为了增强 FEC 处理突发性错误的效果,对数据交织的原理进行 了阐述。 z 前向纠错编码(FEC,Forward Error Correction) 前向纠错技术是一种重要的纠错编码方式,在视频传输容错技术中得到了广泛的应用,常用的 有 BCH 码和 RS 码。在 H.263 标准中使用了(5ll,493)的 BCH 码,可以检测并纠正 2bit。但是 FEC 明显的缺点是降低了编码的效率。同时 FEC 的适用范围也是有限的,它只对平均分布的随机性位错 比较有效,对于较高的误码率或者突发性错误效果较差。而无线传输系统中,突发性的错误是常见 的,因此为了使 FEC 在无线视频传输中能发挥容错效力,其实际应用中 FEC 编码、数据随机化和数 据交织相互结合,共同作用。 为了实现良好的容错性能和较高的编码效率,需要根据信道的传输特点如位出错率、报文出错 率、传输速率、出错类型等对 FEC 编码策略进行调整。视频比特流中不同部分的重要性不同,报头 (包括视频图像的尺寸、与解码有关的时间戳以及编码的格式 )和 MV 信息比 DCT 系数对视频质量的 影响要大,同样,低频的 DCT 系数要比高频的 DCT 系数对视频质量的影响大。对重要部分优先保 护称为不等保护(UEP)。在 H.264 中,可以采用数据分割(Data Partition)的编码模式,将片的编码 信息分为运动向量和 DCT 系数两部分,这样就可以优先对运动向量进行 FEC 编码,充分发挥 FEC 的纠错能力,提高编码效率。此外, FEC 还可以和自动重传 (ARQ)或分层编码模式相结合,发挥更 大作用 z 数据交织 许多容错算法能够很好地解决平均分布的随机性位错误,但对于突发性错误和某一段时间内的 连续错误,效果就很差了。而数据交织就是一种把码流中突发性错误转变成随机错误的方法。 数据交织实质上就是一个置换器,目的就是要最大程度地置乱原数据排列顺序,避免置换前两 个相邻数据在置换后再次相邻。 图 9.9 描述了数据交织的基本原理。其中,假定输入的码流 P0={1,2,4,…,15},经过图 9.9(a)的交 织器,读出的码流为 P1={1,6,11,2,7…,15},在解交织时,按图 6(b)的解交织器,正好可以输出码流 P2=P0={1,2,4,…,15}。图 9.9(c)给出了在传输过程中发生了突发性错误的情况,可以看出,没有经过 交织的比特流的错误是连续的,对于这种错误情况,诸如 FEC、错误隐藏等容错算法的效率很低, 而经过交织处理的比特流中,突发性错误的已经分别开,这就有利于其他容错的算法的实现,同时, 从图 9.9(c)中可以看出,交织的效果与交织器的设计 M×N 紧密相关,最佳的交织器的设计能够实现 相邻位置,交织后再次相邻。这样可以充分利用错误位周围正确接收位的相关性,从而纠正恢复错 误位。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 写入 读出 N M 图 9.9(a) 交织 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 读出 写入 N M 图 9.9(b) 解交织 图 9.96(c) 无交织和有交织处理突发错误的比较 z ARQ 自动请求重发 ARQ 是依靠反馈信息重传出错报文的差错控制方法。其实现过程如下,首先发送 端发送数据报文,经信道传输后,接收端计算接收报文中的校验,如果校验和正确,则要求发送端 继续发送后续报文,否则,要求发送端重发错误的报文。接收端的反馈信息分为两种 ACK 和 NACK, 根据实现过程的不同,ARQ 大致可分为三种基本模型:停等型(SW, Stop and Wait)、选择重复型(SP, Selective Repeat)和返回 N 型(GBN, Go-Back-N)。 停等型(SW, Stop and Wait) 发送端发送数据报文后,等待接收端的反馈信息 ACK,如果 ACK 正确接收到,则继续发送后 续报文,否则,在过了限定时间后,发送端重发数据报文。因此,停等型 ARQ 只能一个报文一个报 文地发送,实现简单,但效率低。 选择重复型(SP, Selective Repeat) 发送端连续发送数据报文,接收端也逐一发送正确接收报的 ACK,如果在限定时间内没有接收 到某个报文的 ACK,发送端则只重发出错报文,而后,继续前面连续发送的报文的工作。例如,当 前发送端刚发送完报文 n,同时确定 n-3 报文错误,则只再重发报文 n-3,然后,继续发送报文 n+1。 这就要求接收端有接收缓存,方法实现复杂,但效率高 返回 N 型(GBN, Go-Back-N) 返回 N 型的 ARQ 和选择重发一样,采用连续发送报文,一旦确定前面发送的某个报文出错, 则发送端从出错报文的位置开始,重新发送。返回 N 型的实现较为简单,效率介于停等型和选择重 发型之间。 ARQ 差错控制方法实质就是以时延和吞吐量为代价换取传输的可靠性。ARQ 会引入传输时延, 限制了其在视频传输中的使用。但重传技术作为能够正确地恢复出错数据的方法,其作用是解码端 的错误隐藏技术无法比拟的,可以彻底避免视频错误的传播。 当然,上面只是简单地描述了三种基本 ARQ 模型,在实时视频传输有着严格的时延要求,这一 点与传统的非实时数据通信中显著不同。因此,在视频传输中 ARQ 往往进行了改进,使得整个系统 在不影响实时的视频显示的情况下,重传出错的信息,阻止误码的传输,例如利用连续修正的误码 扩展进行误码恢复的视频重传技术 RESCU。 为了尽量减少重传报文的数量,可以将 FEC 和 ARQ 结合起来,形成混合型 ARQ,混合型 ARQ 将 FEC 检错纠错功能和 ARQ 结合起来,最大限度的降低需要重传的比特流数量,提高网络的有效 带宽。目前,以上各种 ARQ 的研究主要集中在如何根据信道的传输条件以及变化情况对 ARQ 进行 优化计算等。 9.2.2.4 无线信道的 IP 协议 未来的无线视频通信必然是开放分层的,需要和固定的 IP 网络进行互连互通。因此,制定能够 在有线网络和无线网络共用的传输协议受到了愈来愈多的关注。这类传输协议是无法脱离现在广泛 应用的 IP 协议。而无线信道上传输的帧往往小于最大 IP 报文,这势必会引入 IP 报文的分段和重装 问题,即太大的 IP 报文必须在发送端分割成适当大小,以利于无线信道的传输,在接收端接收到这 些小报文后,重新组装。这就产生一个不利因素:如果某个小报文损坏,原来大的 IP 报文就会完全 丢弃,从而严重影响传输的丢包率。而且 IP 报文头(典型的 IP/UDP/RTP 头为 48 字节)也是一项不 容忽视的额外开销。 9.2.3 无线视频通信的应用 移动终端传输视频流已经成为了第三代移动通信 3G 的主体业务之一。具体来说,无线视频通 信业务服务可分为以下三类: 1) 应用于视频电话和视频会议的包交换会话服务(PCS) 2) 应用于直播和视频录像的包交换流媒体服务(PSS) 3) 多媒体信息服务(MMS) 编码器 解码器无线 信道MMS PPS PCS MMS PCS,PPS 图 9.10 移动通信视频应用示意图 不同的视频应用具有不同的QoS等级和工作方式,如图9.10所示。 z 包交换会话服务(PCS) 编码、传输和解码实时双向同时进行,最小化会话服务中的端到端时延,确保视频和音频的同 步; z 包交换流媒体服务(PSS) 传输和解码同时进行,编码提前处理,一般把编码好的视频放入视频服务器的队列中; z 多媒体信息服务(MMS) 编码,传输和解码三者完全分离。记录的视频信号进行离线编码和本地存储。然后可在任何时 间进行发送,接受端在完全下载下来后才进行解码。 正如前面所说,无线网络的传输能力与日益增长的多媒体信息需求相比,有效带宽总是非常有 限的,自然,用户希望他们使用无线网络所付出的代价与占用的带宽资源是成正比的。因此,低码 流迎合了大众的需求,在移动环境的视频编码标准的成功取决于压缩效率。这样使能够提供目前最 高压缩效率的视频编码标准 H.264/AVC 当仁不让地成为了无线系统的最佳候选标准。 除此之外,移动网络由于受地理环境、天气以及多用户冲突等因素的影响,造成网络波动较大。 频道变化的频率高度地依赖环境、用户的位置、用户移动的速度和信号载波的频率。 尽管可以采用 诸如时空编码、多天线系统、快速控制、交叉等技术来改善信道的性能,但要正在为用户提供具有 QoS 保障的上述无线视频应用,因此,除了高压缩效率和合理的复杂度,适用于无线环境视频服务 的视频编码标准必须具有较高的抗误码的能力。H.264/AVC 视频编码标准的制定着重考虑到这一点, 相对于以往的视频编码标准,添加了多项错误控制技术,进一步改善了多种环境下的视频传输抗误 码能力,满足了无线视频传输业务的需求。 9.2.4 H.264 无线通信中传输结构 多媒体视频在不同环境下的传输,不仅需要高效率的编码,同时编码后的视频应能容易地无缝 集成到当前和未来的网络协议架构当中。鉴于H.263和MPEG-4标准制订过程中面临的网络应用的相 关问题,H.264在系统层面提出了一个全新的概念,定义了视频编码层VCL(Video Coding Layer) 和网络提取层NAL(Network Adaptation Layer),如图9.11所示。 VCL包括VCL编码器与VCL解码器,主要功能是采用运动补偿、变换编码、熵编码以及去方块 滤波等多种技术,进行视频压缩数据的高效组织和表示。与以往的编码标准不同的是,引入了一系 列新特性,使得 H.264的编码压缩效率得到了极大提升。H.264只明确地规定解码过程,对视频捕捉、 预处理、编码等阶段的具体实现留有了充分的余地。 VCL也可根据当前的网络情况调整编码参数(如 帧率等)来适应网络的变化。 NAL 由 NAL 编码器和 NAL 解码器组成,主要功能是定义了数据封装的格式,为 VCL 提供与 网络无关的统一接口。数据承载在网络提取层单元(NALU)中,NALU 采用统一的数据格式,包 含单个字节的包头信息和多个字节的数据。包头信息包含存储标志和类型标志。存储标志用于指示 当前数据不属于被参考的帧,从而便于服务器根据网络的拥塞情况进行丢弃;类型标志用于指示图 像数据的类型。NAL 支持众多基于包的有线/无线通信网络,诸如 H.320、MPEG-2 和 RTP/IP 等。 图9.11 H.264的传输结构 以移动通信中的视频传输而言,除了高效的视频压缩,视频数据传输如何适应无线信道和移动 通信的特点,同样也是一个非常关键的问题。诸如 GSM/GPRS,UMTS 和 CDMA-2000 等移动网络, 都设计了基于包的传输模式,以便为用户提供一种简单灵活基于 IP 协议的数据传输机制。第三代合 作方案(3GPP)在其多媒体规范中也集成了几种多媒体编码器,为 3G 系统提供基本的视频服务。 图 9.12 给出了 NAL 单元通过 3GPP 用户平面协议栈被封装在 RTP/UDP/IP 的典型过程。NAL 首先作为 RTP 的有效载荷,加上 IP/UDP/RTP 的报文头,构成 IP 包;在头压缩(RoHC)后,此 IP/UDP/RTP 包被封装进 PPP 报文中,就变成了无线链路控制服务数据单元 RLC-SDU。RLC 有三种 工作模式:透明、非确认和确认模式,为用户和数据提供分段和重传机制。其中,在透明和非确认 模式,RLC 是单向的,对于出错协议数据单元 PDU,采用丢弃或标记的方法;在确认模式,RLC 是 双向的,使用自动重转机制来确保数据的正确传输。 视频数据的大小是变化的,其封装的 RLC-SDU 长度自然也随之变化。协议数据单元 PDU 是数 据传输的处理单位。因此,如果 RLC-SDU 比 RLC-PDU 大,SDU 就会被分成若干 PDU。 IP UDP RTP NAL单元 PPP HC NAL单元 帧 帧 帧RLP RLP RLP Physical frame LTU CRC Physical frame LTU CRC RTP/UDP/IP Framing, ROHC 链路层 物理层 图 9.12 3GPP 用户平面协议栈封装过程 9.2.5 无线视频传输的鲁棒性研究 无线视频传输的鲁棒性在近几年无线视频应用的需求迅猛高涨起来后显得越来越突出。无线信 道中存在着 Rayleigh 衰减和多用户干扰,会在传输位流中产生突发性错误(burst error)。视频压缩国 际标推如 MPEG-x 和 H.26x 等都是基于宏块的压缩算法,通过运动估计 /运动补偿(MP/MC)消除视频 时间冗余,对差值图像进行离散余弦变换 (DCT)变换消除空间冗余,对量化后的系数进行可变长编码 (VLC)消除统计冗余。实践表明,通过上述方法,视频编码标准获得了极高的压缩效率。但压缩后的 码流在无线信道上的传输仍然存在着一些棘手的问题,其中很突出的一点是:一方面,这些压缩后 的码流对信道比特误码非常地敏感,而另一方面无线信道由于多径反射和衰落引入了大量的随机误 码和突发误码,影响了码流的正常传输。尤其是当采用了 VLC 方案后,码流更加容易受到误码的 影响,结果在解码端将失去与编码端的同步,导致在遇到下一个同步码字之前无法对 VLC 码字进 行正确的解码;同时预测编码技术会将错误扩散到整个视频序列中,极大地降低重建图像的质量。 因此,为了实现良好质量的视频传输,必须结合无线信道的传输特性,采取一定的容错措施。 文献[2]对视频通信中的容错算法进行了系统的回顾。根据在视频传输系统中位置的不同容错算 法主要可分为基于编码器的容错算法、基于解码器的容错算法和基于反馈信道的容错算法。其中, 1)基于编码器的容错算法,通过再编码比特流中添加冗余信息,这些冗余信息被添加在信源或 信道编码器中,降低了编码的效率,增加了实现的复杂度,以换取编码的容错性能,大致包括:分 层编码、多描述编码、独立分段编码、再同步编码和前向纠错编码 FEC 等; 2)基于解码器的容错算法,是指利用被损坏的宏块与其相邻的宏块之间的相关性来完成恢复工 作的,这部分工作包括错误检测和错误恢复。对于错误的检测,一般采用针对语法的检错和嵌入数 据的检错;对于错误恢复,可采用时域和空域的错误隐藏方法。 3)基于反馈信道的容错算法,指利用解码器获得误码信息,并通过反馈信道,传送给编码器进 行误码处理的一种方式。主要包括:误码跟踪、有条件的 ARQ、帧内 /帧间编码模式选择和参考图像 选择模式等。 与此同时,随着无线视频应用的兴起,在信源编码器中,从视频码流结构上研究其抗误码性能, 成为近两年来研究的一个热点。H.264/AVC 作为最新的视频编码标准,采取了一系列的切合实际的 技术措施,提高了网络适应性,增强了数据的抗误码的鲁棒性,从而保证无线视频传输后的压缩视 频的 QoS,下一节将进行详细论述。 9.3 H.264 视频编解码标准的错误恢复 与以往的视频编码标准不同的是,H.264/AVC 标准从系统层面定义了视频编码层(VCL,Video Coding Layer)和网络提取层(NAL,Network Abstraction Layer)。其中,视频编码层独立于网络, 主要包括核心压缩引擎和块、宏块和片的语法句法定义。通过引入一系列新特性,不但使 H.264 的 编码压缩效率提升了近 1 倍,而且多种错误恢复工具又增强了视频流的鲁棒性。网络提取层的主要 功能是定义数据的封装格式,把 VCL 产生的比特字符串适配到各种各样的网络和多元环境中。涉及 片级别以上的语法定义,包括独立片解码所要求的数据表示,类似以往视频压缩标准中的图像和头部 顺序数据;防止竞争的编码;附加的增强信息以及编码片的比特字符串。 H.264 从框架结构上将 NAL 与 VCL 的分离,主要有两个目的:首先,可以定义 VCL 视频压 缩处理与 NAL 网络传输机制的接口,这样允许视频编码层 VCL 的设计可以在不同的处理器平台进 行移植,而与 NAL 层的数据封装格式无关;其二,VCL 和 NAL 都被设计成工作于不同的传输环境, 异构的网络环境并不需要对 VCL 比特流进行重构和重编码。下面分别就 VCL 和 NAL 对于视频传输 的 QoS 进行分析。 9.3.1 H.264 的视频编码层的错误恢复 在 H.261、H.263、MPEG-1、MPEG-2、MPEG-4 中,许多错误恢复工具已经得到了很好的应 用:图像分割的不同形式(片、块组)、I 模式宏块,片和图像的内插、参考图像选择 (带有和不带 反馈,图像级别,GOB/SLICE 或 MB 级别)、数据分割等。 H.264 标准继承以前视频编码标准中某些优秀的错误恢复工具,同时也改进和创新了多种错误 恢复工具。这里主要介绍的 H.264 的错误恢复工具:参数集;灵活的宏块排序;冗余片 RS。 z 参数集 参数集是 H.264 标准的一个新概念,是一种通过改进视频码流结构增强错误恢复能力的方法。 H.264 的参数集又分为序列参数集和图像参数集,其中,序列参数集包括一个图像序列的所有信息, 即两个 IDR 图像间的所有图像信息。图像参数集包括一个图像的所有分片的所有相关信息,包括图 像类型、序列号等,解码时某些序列号的丢失可用来检验信息包的丢失与否。多个不同的序列和图 像参数集存贮在解码器中,编码器通依据每个编码分片的头部的存贮位置来选择适当的参数集,图 像参数集本身也包括使用的序列参数集参考信息。 众所周知,一些关键信息比特的丢失(如序列和图像的头信息)会造成解码的严重负面效应, 而 H.264 把这些关键信息分离出来,凭借参数集的设计,确保在易出错的环境中能正确地传输。这 种码流结构的设计无疑增强了码流传输的错误恢复能力。 参数集具体实现的方法也是多样化的:1)通过带外传输,这种方式要求参数集通过可靠的协议, 在首个片编码到达之前传输到解码器;2)通过带内传输,这需要为参数集提供更高级别的保护,例 如发送复制包来保证至少有一个到达目标;3)在编码器和解码器采用硬件处理参数集。 z 片、片组和 FMO 一幅图像由若干片组成,每片包含一系列的宏块(MB)。MB 的排列可按光栅扫描顺序,也可 不按扫描顺序。每个片独立解码,不同片的宏块不能用于自身片中作预测参考。因此,片的设置不 会造成误码扩散。如图 9.13 所示,片 0、片 1 和片 2 中的宏块相互之间不能作为预测参考。 图 9.13 不采用 FMO 的片划分 灵活的宏块排序 FMO 是 H.264 的一大特色,适用于 H.264 的基本档次和扩展档次的应用。FMO 通过宏块分配映射技术,把每个宏块分配到不按扫描顺序的片中,图像内部预测机制,例如帧内预 测或运动矢量预测,仅允许用同一片组里的空间相邻的宏块。FMO 模式划分图像的模式各种各样, 重要的有棋盘模式、矩形模式等。当然 FMO 模式也可以使一帧中的宏块顺序分割,使得分割后的片 的大小小于无线网络的 MTU 尺寸,经过 FMO 模式分割后的图像数据分开进行传输。 以图 9.14 所示,所有的 MB 被分成了片组 0 和片组 1,相应地分别采用黑色和白色表示。当白 片丢失时,因为其周围的宏块都属于其他片的宏块,利用邻域相关性,黑片宏块的某种加权可用来 代替白片相应宏块。这种错误隐藏机制可以明显提高抗误码性能。实验证明,在 CIF 图象的视频会 议中,在丢包率达 10%时,视频失真低到需要训练有素的眼睛才能识别。使用 FMO 的代价是稍微 降低了编码效率,(因为它打破了原先非邻居 MB 之间的预测),而且在高度优化的环境中,有比较 高的延迟。 图 9.14 FMO 棋盘分片例图 z 数据分割 通常情况下,一个宏块的数据是存放在一起而组成片的,数据划分使得一个片中的宏块数据重 新组合,把宏块语义相关的数据组成一个划分,由划分来组装片。H.264 视频编码标准使用了三种 不同类型的数据分割: 1) A 型分割 A 型分割是头信息划分,包括宏块类型、量化参数和运动矢量,这个信息是最重要的。 2) B 型分割 B 型分割是帧内信息划分,包括帧内 CBPs 和帧内系数,帧内信息可以阻止错误的传播,该型 数据分割要求给定分片的 A 型分割有效,相对于帧间信息,帧内信息能更好地阻止漂移效应,因此 它比帧间分割更为重要。 3) C 型分割 C 型分割是帧间信息划分,包括帧间 CBPs 和帧间系数,一般情况下它是编码分片的最大分区。 帧间分割是最不重要的,它的使用要求 A 型分割有效。 当使用数据分割时,源编码器把不同的类型的分割安排在三个不同的缓冲器中,同时分片的尺 寸必须进行调整以保证小于 MTU 长度,因此是编码器而不是 NAL 来实现数据分割。在解码器上, 所有分割用于信息重建。这样,如果帧内或帧间信息丢失了,有效的帧头信息仍然能用来提高错误 隐藏效率,即有效的宏块类型和运动矢量,保留了宏块的基本特征,从而仍可获得一个相当高的信 息重构质量,而仅仅丢失了细节信息。 z 冗余片方法 H.264 中的参考图像的选择与以前在 H.263 一样,在基于反馈的系统中,解码器接收到丢失或 被破坏的图像信息时,选择参考图像序列中正确的参考宏块,来进行错误恢复;而对于无反馈的系 统,H.264 提出了冗余分片编码。 冗余分片允许编码器把在同一个码流中添加同一 MB 的一个或更多冗余表示。需要注意的是这 些冗余片的编码参数与非冗余片的编码参数不同,例如主片可用低 QP(高质量)来编码,而冗余信 息中能用一个高 QP(低质量)的方式来编码,这样质量粗糙一些但码率更低。解码器在重构时,首 先使用主片,如果它可用就抛弃冗余片;而如主片丢失(比如因为包的丢失)冗余片也能被用于重 构。冗余片主要用于支持高误码的移动环境。 z 帧内编码 H.264 中帧内编码大体上类似于以往的视频编码标准,但也进行了重要的改进,主要体现在: 1)H.264 中帧内预测宏块的参考宏块可以是帧间编码宏块,帧内预测宏块并不像 H.263 中的帧 内编码一样,而采用预测的帧内编码比非预测的帧内编码有更好的编码效率,但降低了帧内编码的 重同步性能,可以通过设置限制帧内预测标记来恢复这一性能。 2)只包含帧内宏块的片有两种,一种是帧内片(I Slice),一种是立即刷新片(IDR Slice),立即刷 新片需存在于立即刷新图像(IDR Picture)中。与短期参考图像相比,立即刷新图像有更强壮的重同步 性能。 为了更适用无线 IP 网络环境中的应用,H.264 通过采用率失真优化编码和设置帧内预测标志, 来提高帧内图像的重同步性能, 9.3.1 H.264 的网络提取层的错误恢复 NAL 支持众多基于包的有线/无线通信网络,诸如 H.320、MPEG-2 和 RTP/IP 等。但目前,绝大 部分的视频应用所采用的网络协议层次是 RTP/UDP/IP,因此在下面的描述中主要基于这个传输框 架。下面首先分析 NAL 层的基本处理单元 NALU 以及它的网络封装、分割和合并的方法, z NAL 单元 每个 NAL 单元是一个一定语法元素的可变长字节字符串,包括包含一个字节的头信息(用来表 示数据类型),以及若干整数字节的负荷数据。一个 NAL 单元可以携带一个编码片、A/B/C 型数据 分割或一个序列或图像参数集。 NAL 单元的头信息结构如图 2 所示,NAL 单元按 RTP 序列号按序传送。其中,T 为负荷数据 类型,占 5 个比特;R 为重要性指示位,占 2 个比特;最后的 F 为禁止位,占 1 个比特。具体如下: 图 9.15 NAL 单元头结构示意图 1)NALU 类型位 可以表示 NALU 的 32 种中不同类型特征,类型 1~12 是 H.264 的定义的,类型 24~31 是用于 H.264 以外的,RTP 负荷规范使用这其中的一些值来定义包聚合和分裂,其他值为 H.264 保留。 2)重要性指示位 用于在重构过程中标记一个 NAL 单元的重要性,值越大,越重要。值为 0 表示这个 NAL 单元 没有用于预测,因此可被解码器抛弃而不会有错误扩散,值高于 0 表示此 NAL 单元要用于无漂移重 构,且值越高,对此 NAL 单元丢失的影响越大。 3) 禁止位 编码中默认置为 0,当网络识别此单元中存在比特错误时,可将其置为 1,以便接收方丢掉该单 元,主要用于适应不同种类的网络环境(比如有线无线相结合的环境)。例如对于从无线到有线的网关, 一边是无线的非 IP 协议环境,一边是有线网络的无比特错误的环境。假设一个 NAL 单元到达无线 那边时,校验和检测失败,网关可以选择从 NAL 流中去掉这个 NALU 单元,,也可以把已知被破坏 的 NAL 单元前传给接收端。在这种情况下,智能的解码器将尝试重构这个 NAL 单元(已知它可能 包含比特错误)。而非智能的解码器将简单的抛弃这个 NAL 单元。 NAL 单元结构规定了用于面向分组或用于流的传输子系统的通用格式。在 H.320 和 MPEG-2 系 统中,NAL 单元的流应该在 NAL 单元边界内,每个 NAL 单元前加一个 3 个字节的起始前缀码。在 分组传输系统中,NAL 单元由系统的传输规程确定帧界,因此不需要上述的起始前缀码。 一组 NAL 单元被称为一个接入单元,定界后加上定时信息(SEI),形成基本编码图像。该基本 编码图像(PCP)由一组已编码的 NAL 单元组成,其后是冗余编码图像(RCP),它是 PCP 同一视 频图像的冗余表示,用于解码中 PCP 丢失情况下恢复信息。如果该编码视频图像是编码视频序列的 最后一幅图像,应出现序列 NAL 单元的 end,表示该序列结束。一个图像序列只有一个序列参数组, 并被独立解码。如果该编码图像是整个 NAL 单元流的最后一幅图像,则应出现流的 end。于是一个 接入单元的组成见图 9.16。 图 9.16 接入单元头结构 如图 9.16 所示,H.264 采用上述严格的接入单元,不仅使 H.264 可自适应于多种网络,而且进 一步提高其抗误码能力。序列号的设置可发现丢的是哪一个 VCL 单元。冗余编码图像使得即使基本 编码图像丢失,仍可得到较“粗糙”图像。 z H.264 中的 RTP 上面阐述了 NAL 单元的结构和实现,这里要详细讨论 RTP 的载荷规范和抗误码性能。RTP 可 通过发送冗余信息来减少接收端的丢包率,会增加时延,与冗余片不同的是它增加的冗余信息是个 别重点信息的备份,适合于的非平等保护机制。相应的多媒体传输规范有: a)分组复制多次重发,发送端对最重要的比特信息分组进行复制重发,使得保证接收端能至少 正确接收到一次,同时接收端要丢弃已经正确接收的分组的多余备份。 b)基于分组的前向纠错,对被保护的分组进行异或运算,将运算结果作为冗余信息发送到接收 方。由于时延,不用于对话型应用,可用于流媒体。 c)音频冗余编码,可保护包括视频在内的任何数据流。每个分组由头标、载荷以及前一分组的 载荷组成,H.264 中可与数据分割一起使用。 RTP 的封装规范总结如下: a)额外开销要少,使 MTU 尺寸在 100~64k 字节范围都可以; b)易于区分分组的重要性,而不必对分组内的数据解码; c)载荷规范应当保证不用解码就可识别由于其他的比特丢失而造成的分组不可解码; d)支持将 NALU 分割成多个 RTP 分组; e)支持将多个 NALU 汇集在一个 RTP 分组中。 H.264 采用了简单打包的方案,即一个 RTP 分组里放入一个 NALU,将 NALU(包括同时作为载 荷头标的 NALU 头)放入 RTP 的载荷中,设置 RTP 头标值。理想情况下,VCL 不会产生超过 MTU 尺寸的 NAL 单元,来避免 IP 层的分拆。在接收端,通过 RTP 序列信息识别复制包并丢弃,取出有 效 RTP 包里的 NAL 单元。基本档次和扩展档次允许片的无序解码,这样在抖动缓存中就不必对包 重新排序。在使用主档次时(不允许片的乱序),要通过 RTP 序列信息来对包重新排序,解码顺序 号(DON)的概念现正在 IETF 的讨论中。 存在如下情况,例如当使用内容预编码时,编码器不了解底层网络的 MTU 大小,将产生许多 大于 MTU 尺寸的 NALU。这就需要涉及 NALU 分割和合并。 1)NALU 的分割 虽然 IP 层的分割可以使数据块小于 64 千字节,但无法在应用层实现保护,从而降低了非平等 保护方案的效果。由于 UDP 数据包小于 64 千字节,而且一个片的长度对某些应用场合来说太小, 所以应用层打包是 RTP 打包方案的一部分。目前的拆分方案正在 IETF 的讨论之中,大致具有一下 特点: a)NALU 的分块以按 RTP 次序号升序传输; b)能够标记第一个和最后一个 NALU 分块; c)可以检测丢失的分块。 2)NALU 的合并 一些 NALU 如 SEI、参数集等非常小,将它们合并在一起有利于减少头标开销。现有的两种集 合分组: a)单一时间集合分组(STAP),按时间戳进行组合,一般用于低延迟环境; b)多时间集合分组(MTAP),不同时间戳也可以组合,一般用于高延迟环境,比如流应用。 本节针对最新推出的视频编解码标准 H.264 的抗误码性能进行了单独阐述,可以看到 H.264 除 了拥有面向高效编码的特性, 还引入了一些新工具用于提高错误恢复能力。特别是,参数集、NAL 上的 NALU 的概念、灵活的宏块排序 FMO、数据分割以及帧内编码等都极大地复杂网络环境下的 抗误码能力。同时,详细介绍了于视频比特流传输密切相关的 RTP 封装规范,与 H.264 的 NAL 紧 密结合,提供了对数据封装的指导。通过附加了一些传输层的低开销机制来用于 NALU 包的高效拆 分和聚合。当联合使用这些工具时,可以达到更高的性能,在因特网和恶劣的无线网络上进行高质 量的视频压缩也将最终成为现实。 参考文献 1. Y. Wang and Q. Zhu, “Error control and concealment for video communication: a review,” Proceedings of the IEEE, vol. 86, pp. 974-997. May 1998 2. Stephan Wenger , “H.264/AVC Over IP,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 645–656, July 2003. 3. J. Wen and J. Villasenor, “A class of reversible variable length codes for robust iamge and video coding”, Proc. 1997 IEEE International Conf. On Image Proc., Santa Barbara, CA Oct. 1997. 4. J. Wen and J. Villasenor, "Reversible variable length codes for robust image and video transmission". 1997 Asilomar Conference, Pacific Grove, CA, Nov. 1997. 5. D. W. Redmill and N. G. Kingsbury, “The EREC: An error resilient technique for coding variablelength blocks of data,” IEEE Trans. Image Proc., vol. 5, no. 4, pp. 565-574, Apr. 1996. 6. P. Haskell and D.Messerschmitt, “Resynchronization of motion compensated video affected by ATM cell loss,” in ICASSP-92, San Francisco, CA, USA, Mar. 1992, vol.3, pp. 545-548 7. G. Côté, S. Shirani and F. Kossentini: “Optimal mode selection and synchronization for robust video communications over error prone networks” IEEE Journal on Selected Areas in Communications, May 1999, Submitted. 8. S. Wenger, “Video redundancy coding in H.263+,” Proc. AVSPN, (Aberdeen, UK), Sept. 1997. 9. S. Wenger, G. Knorr, J. Ott, F. Kossentini: "Error resilience support in H.263+", IEEE Trans. on circuit and System for Video Technology, vol. 8, no. 6 pp. 867-877, Nov. 1998. 10. K. N. Ngan and C. W. Yap, “Combined source-channel video coding,” in Signal Recovery Techniques for Image and Video Compression and Transmission, A. K. Katsaggelos and N. P. Galatsanos, editors, ch. 9, pp. 269-297, Kluwer Academic Publishers, 1998 11. L. Kondi, F. Ishtiaq, and A. K. Katsaggelos, “Joint source-channel coding for scalable video,” Proc. 2000 SPIE Conf. On Visual Communications and Image Processing, San Jose, CA, Jan. 2000. 12. V. A. Vaishampayan, “Design of multiple description scalar quantizers,” IEEE Trans. Info. Theo., vol. 39, pp. 821-834, May 1993. 13. A. Ingle and V.~A. Vaishampayan, ``DPCM system design for diversity systems with applications to packetized speech,'' IEEE Trans. Speech and Audio Processing, vol. 3, pp.~48-57, Jan. 1995. 14. Y. Wang, M. Orchard, and A. Reibman, ``Optimal pairwise correlating transforms for multiple description coding'', IEEE Int. Conf. Image Proc. (ICIP98), (Chicago, IL), Oct, 1998. Vol. 1, pp. 679-683. 15. V. K. Goyal, J. Kovacevic, R. Arean and M. Vetterli, ``Multiple description transform coding of images,'' IEEE Int. Conf. Image Proc. (ICIP98), (Chicago, IL), Oct, 1998. Vol. 1, pp. 674-678. 16. X. Yang and K. Ramchandran, “Optimal multiple description subband coding,” IEEE Int. Conf. Image Proc. (ICIP98), (Chicago, IL), Oct, 1998. Vol. 1, pp. 684-658. 17. Y. Wang and D. Chung, “Non-hierarchical signal decomposition and maximally smooth reconstruction for wireless video transmission,” in Goodman and Raychaudhuri, eds., Mobile Multimedia Communications, pp. 285-292. Plenum Press. 1997. 18. Q. Zhu and Y. Wang, ``Error concealment in visual communications", in A. R. Reibman and M. T. Sun, eds. Compressed Video over Networks. Marcel Dekker, Inc. To appear 2000. 19. S. Aign, ``Error concealment for MPEG-2 video,’’ in Signal Recovery Techniques for Image and Video Compression and Transmission, A. K. Katsaggelos and N. P. Galatsanos, editors, ch. 8, pp. 235-268, Kluwer Academic Publishers, 1998. 20. M.C. Hong, L. Kondi, H. Scwab, and A. K. Katsaggelos, “Video Error Concealment Techniques,” Signal Processing: Image Communications, special issue on Error Resilient Video, 14(6-8), pp. 437-492, 1999. 21. Q.-F. Zhu, Y. Wang, and L. Shaw, “Coding and cell loss recovery for DCT-based packet video,” IEEE Trans. CAS for Video Tech., vol. 3, no. 3, pp. 248-258, June 1993. 22. H. Sun and W. Kwok, “Concealment of damaged block transform coded images using projections onto convex sets,” IEEE Trans. Image Proc., vol. 4, no. 4, pp. 470-477, Apr. 1995. 23. G.-S. Yu, M. M.-K. Liu, and M. W. Marcellin, “POCS-based error concealment for packet video using multiframe overlap information,” IEEE Trans. CAS for Video Tech., vol. 8, no. 4, pp. 422-434, Aug. 1998. 24. H. Sun, K. Challapali, and J. Zdepski, “Error concealment in digital simulcast AD-HDTV decoder,” IEEE Trans. Consumer Electronics, vol. 38, no. 3, pp. 108-117, Aug. 1992. 25. W.-M. Lam, A. R. Reibman, and B. Liu, “Recovery of lost or erroneously received motion vectors”, Proc. ICASSP’93, Minneapolis, Apr. 1993, pp. V417-V420. 26. A. Narula and J. S. Lim, “Error concealment techniques for an all-digital high-definition television system,” SPIE Visual Commun. And Image Proc., Cambridge, MA, 1993, pp. 304-315. 27. B. Girod and N. Färber: "Feedback-based error control for mobile video transmission", Proc. IEEE, Special Issue on Video for Mobile Multimedia, vol. 87, pp. 1707-1723, Oct. 1999. 28. Y. Tomita, T. Kimura and T. Ichikawa, “Error resilient modified inter-frame coding system for limited reference picture memories,” Int. Picture Coding Symp. (PCS), Berlin, Germany, Sept. 1997, pp.743-748. 29. T. Stockhammer,M. Hannuksela, and T.Wiegand, “H.264/AVC in wireless environments,” IEEE Trans. Circuits Syst. Video Technol., vol. 13, pp. 657–673, July 2003. 30. Yao Wang, Jorn Ostermann, Ya-Qin Zhang, Video Processing and Communication, Pearson Education, 2002. 31. Bernd Girod and Niko Farkber, Compressed Video Over Networks,1999.10 32. 毕厚杰,陈启美,方晖,IP宽带通信网络技术,北京邮电大学出版社,2004.4 33. 毕厚杰,H.264/AVC视频编码标准的技术特点和评价,世界电信,2004.7 34. 沈兰荪,田冻,无线视频传输技术的发展,电子技术应用,2001.1 35. 吴伟陵,移动通信中的关键技术,北京邮电大学出版社,2000.11 36. 冯秀波,谢剑英,无线视频传输容错算法研究新进展,通信学报,2003.11 37. Hang Liu,Haruo Ma,Error control schemes for networks: An overview,Journal on Mobile Networks and Application,1997.2, p167-182 术语及英文解释 „ access unit: A set of NAL units always containing a primary coded picture. In addition to the primary coded picture, an access unit may also contain one or more redundant coded pictures or other NAL units not containing slices or slice data partitions of a coded picture. The decoding of an access unit always results in a decoded picture. „ AC transform coefficient: Any transform coefficient for which the frequency index in one or both dimensions is non-zero. „ adaptive binary arithmetic decoding process: An entropy decoding process that recovers the values of bins from a bitstream produced by an adaptive binary arithmetic encoding process. „ adaptive binary arithmetic encoding process: An entropy encoding process, not normatively specified in this Recommendation | International Standard, that codes a sequence of bins and produces a bitstream that can be decoded using the adaptive binary arithmetic decoding process. „ arbitrary slice order: A decoding order of slices in which the macroblock address of the first macroblock of some slice of a picture may be smaller than the macroblock address of the first macroblock of some other preceding slice of the same coded picture. „ B slice: A slice that may be decoded using intra prediction from decoded samples within the same slice or inter prediction from previously-decoded reference pictures, using at most two motion vectors and reference indices to predict the sample values of each block. „ bin: One bit of a bin string. „ binarization: The set of intermediate binary representations of all possible values of a syntax element. „ binarization process: A unique mapping process of possible values of a syntax element onto a set of bin strings. „ bin string: A string of bins. A bin string is an intermediate binary representation of values of syntax elements. „ bi-predictive slice: See B slice. „ bitstream: A sequence of bits that forms the representation of coded pictures and associated data forming one or more coded video sequences. Bitstream is a collective term used to refer either to a NAL unit stream or a byte stream. „ block: An MxN (M-column by N-row) array of samples, or an MxN array of transform coefficients. „ bottom field: One of two fields that comprise a frame. Each row of a bottom field is spatially located immediately below a corresponding row of a top field. „ bottom macroblock (of a macroblock pair): The macroblock within a macroblock pair that contains the samples in the bottom row of samples for the macroblock pair. For a field macroblock pair, the bottom macroblock represents the samples from the region of the bottom field of the frame that lie within the spatial region of the macroblock pair. For a frame macroblock pair, the bottom macroblock represents the samples of the frame that lie within the bottom half of the spatial region of the macroblock pair. „ broken link: A location in a bitstream at which it is indicated that some subsequent pictures in decoding order may contain serious visual artefacts due to unspecified operations performed in the generation of the bitstream. „ byte: A sequence of 8 bits, written and read with the most significant bit on the left and the least significant bit on the right. When represented in a sequence of data bits, the most significant bit of a byte is first. „ byte-aligned: A bit in a bitstream is byte-aligned when its position is an integer multiple of 8 bits from the first bit in the bitstream. „ byte stream: An encapsulation of a NAL unit stream containing start code prefixes and NAL units as specified in Annex B. „ category: A number associated with each syntax element. The category is used to specify the allocation of syntax elements to NAL units for slice data partitioning. It may also be used in a manner determined by the application to refer to classes of syntax elements in a manner not specified in this Recommendation | International Standard. „ chroma: An adjective specifying that a sample array or single sample is representing one of the two colour difference signals related to the primary colours. The symbols used for a chroma array or sample are Cb and Cr. z NOTE - The term chroma is used rather than the term chrominance in order to avoid the implication of the use of linear light transfer characteristics that is often associated with the term chrominance. „ coded field: A coded representation of a field. „ coded frame: A coded representation of a frame. „ coded picture: A coded representation of a picture. A coded picture may be either a coded field or a coded frame. Coded picture is a collective term referring to a primary coded picture or a redundant coded picture, but not to both together. „ coded picture buffer (CPB): A first-in first-out buffer containing access units in decoding order specified in the hypothetical reference decoder in Annex C. „ coded representation: A data element as represented in its coded form. „ coded video sequence: A sequence of access units that consists, in decoding order, of an IDR access unit followed zero or more non-IDR access units including all subsequent access units up to but not including any subsequent IDR access unit. „ component: An array or single sample from one of the three arrays (luma and two chroma) that make up a field or frame. „ complementary field pair: A collective term for a complementary reference field pair or a complementary non-reference field pair. „ complementary non-reference field pair: Two non-reference fields that are in consecutive access units in decoding order as two coded fields of opposite parity where the first field is not already a paired field. „ complementary reference field pair: Two reference fields that are in consecutive access units in decoding order as two coded fields and share the same value of frame number, where the second field in decoding order is not an IDR picture and does not include a memory_management_control_operation syntax element equal to 5. „ context variable: A variable specified for the adaptive binary arithmetic decoding process of a bin by an equation containing recently decoded bins. „ DC transform coefficient: A transform coefficient for which the frequency index is zero in all dimensions. „ decoded picture: A decoded picture is derived by decoding a coded picture. A decoded picture is either a decoded frame, or a decoded field. A decoded field is either a decoded top field or a decoded bottom field. „ decoded picture buffer (DPB): A buffer holding decoded pictures for reference, output reordering, or output delay specified for the hypothetical reference decoder in Annex C. „ decoder: An embodiment of a decoding process. „ decoding order: The order in which syntax elements are processed by the decoding process. „ decoding process: The process specified in this Recommendation | International Standard that reads a bitstream and produces decoded pictures. „ direct prediction: An inter prediction for a block for which no motion vector is decoded. Two direct prediction modes are specified that are referred to as spatial direct prediction and temporal prediction mode. „ decoder under test (DUT): A decoder that is tested for conformance to this Recommendation | International Standard by operating the hypothetical stream scheduler to deliver a conforming bitstream to the decoder and to the hypothetical reference decoder and comparing the values and timing of the output of the two decoders. „ emulation prevention byte: A byte equal to 0x03 that may be present within a NAL unit. The presence of emulation prevention bytes ensures that no sequence of consecutive byte-aligned bytes in the NAL unit contains a start code prefix. „ encoder: An embodiment of an encoding process. „ encoding process: A process, not specified in this Recommendation | International Standard, that produces a bitstream conforming to this Recommendation | International Standard. „ field: An assembly of alternate rows of a frame. A frame is composed of two fields, a top field and a bottom field. „ field macroblock: A macroblock containing samples from a single field. All macroblocks of a coded field are field macroblocks. When macroblock-adaptive frame/field decoding is in use, some macroblocks of a coded frame may be field macroblocks. „ field macroblock pair: A macroblock pair decoded as two field macroblocks. „ field scan: A specific sequential ordering of transform coefficients that differs from the zig-zag scan by scanning columns more rapidly than rows. Field scan is used for transform coefficients in field macroblocks. „ flag: A variable that can take one of the two possible values 0 and 1. „ frame: A frame contains an array of luma samples and two corresponding arrays of chroma samples. A frame consists of two fields, a top field and a bottom field. „ frame macroblock: A macroblock representing samples from two fields of a coded frame. When macroblock-adaptive frame/field decoding is not in use, all macroblocks of a coded frame are frame macroblocks. When macroblock-adaptive frame/field decoding is in use, some macroblocks of a coded frame may be frame macroblocks. „ frame macroblock pair: A macroblock pair decoded as two frame macroblocks. „ frequency index: A one-dimensional or two-dimensional index associated with a transform coefficient prior to an inverse transform part of the decoding process. „ hypothetical reference decoder (HRD): A hypothetical decoder model that specifies constraints on the variability of conforming NAL unit streams or conforming byte streams that an encoding process may produce. „ hypothetical stream scheduler (HSS): A hypothetical delivery mechanism for the timing and data flow of the input of a bitstream into the hypothetical reference decoder. The HSS is used for checking the conformance of a bitstream or a decoder. „ I slice: A slice that is decoded using prediction only from decoded samples within the same slice. „ instantaneous decoding refresh (IDR) access unit: An access unit in which the primary coded picture is an IDR picture. „ instantaneous decoding refresh (IDR) picture: A coded picture containing only slices with I or SI slice types that causes the decoding process to mark all reference pictures as "unused for reference" immediately after decoding the IDR picture. After the decoding of an IDR picture all following coded pictures in decoding order can be decoded without inter prediction from any picture decoded prior to the IDR picture. The first picture of each coded video sequence is an IDR picture. „ inter coding: Coding of a block, macroblock, slice, or picture that uses inter prediction. „ inter prediction: A prediction derived from decoded samples of reference pictures other than the current decoded picture. „ intra coding: Coding of a block, macroblock, slice, or picture that uses intra prediction. „ intra prediction: A prediction derived from the decoded samples of the same decoded slice. „ intra slice: See I slice. „ inverse transform: A part of the decoding process by which a set of transform coefficients are converted into spatial-domain values, or by which a set of transform coefficients are converted into DC transform coefficients. „ layer: One of a set of syntactical structures in a non-branching hierarchical relationship. Higher layers contain lower layers. The coding layers are the coded video sequence, picture, slice, and macroblock layers. „ level: A defined set of constraints on the values that may be taken by the syntax elements and variables of this Recommendation | International Standard. The same set of levels is defined for all profiles, with most aspects of the definition of each level being in common across different profiles. Individual implementations may, within specified constraints, support a different level for each supported profile. In a different context, level is the value of a transform coefficient prior to scaling. „ list 0 (list 1) motion vector: A motion vector associated with a reference index pointing into reference picture list 0 (list 1). „ list 0 (list 1) prediction: Inter prediction of the content of a slice using a reference index pointing into reference picture list 0 (list 1). „ luma: An adjective specifying that a sample array or single sample is representing the monochrome signal related to the primary colours. The symbol used for luma is Y. z NOTE – The term luma is used rather than the term luminance in order to avoid the implication of the use of linear light transfer characteristics that is often associated with the term luminance. „ macroblock: A 16x16 block of luma samples and two corresponding blocks of chroma samples. The division of a slice or a macroblock pair into macroblocks is a partitioning. „ macroblock-adaptive frame/field decoding: A decoding process for coded frames in which some macroblocks may be decoded as frame macroblocks and others may be decoded as field macroblocks. „ macroblock address: When macroblock-adaptive frame/field decoding is not in use, a macroblock address is the index of a macroblock in a macroblock raster scan of the picture starting with zero for the top-left macroblock in a picture. When macroblock-adaptive frame/field decoding is in use, the macroblock address of the top macroblock of a macroblock pair is two times the index of the macroblock pair in a macroblock pair raster scan of the picture, and the macroblock address of the bottom macroblock of a macroblock pair is the macroblock address of the corresponding top macroblock plus 1. The macroblock address of the top macroblock of each macroblock pair is an even number and the macroblock address of the bottom macroblock of each macroblock pair is an odd number. „ macroblock location: The two-dimensional coordinates of a macroblock in a picture denoted by ( x, y ). For the top left macroblock of the picture ( x, y ) is equal to ( 0, 0 ). x is incremented by 1 for each macroblock column from left to right. When macroblock-adaptive frame/field decoding is not in use, y is incremented by 1 for each macroblock row from top to bottom. When macroblock-adaptive frame/field decoding is in use, y is incremented by 2 for each macroblock pair row from top to bottom, and is incremented by an additional 1 when a macroblock is a bottom macroblock. „ macroblock pair: A pair of vertically contiguous macroblocks in a frame that is coupled for use in macroblock-adaptive frame/field decoding processing. The division of a slice into macroblock pairs is a partitioning. „ macroblock partition: A block of luma samples and two corresponding blocks of chroma samples resulting from a partitioning of a macroblock for inter prediction. „ macroblock to slice group map: A means of mapping macroblocks of a picture into slice groups. The macroblock to slice group map consists of a list of numbers, one for each coded macroblock, specifying the slice group to which each coded macroblock belongs. „ map unit to slice group map: A means of mapping slice group map units of a picture into slice groups. The map unit to slice group map consists of a list of numbers, one for each slice group map unit, specifying the slice group to which each coded slice group map unit belongs. „ memory management control operation: Seven operations that control reference picture marking. „ motion vector: A two-dimensional vector used for inter prediction that provides an offset from the coordinates in the decoded picture to the coordinates in a reference picture. „ NAL unit: A syntax structure containing an indication of the type of data to follow and bytes containing that data in the form of an RBSP interspersed as necessary with emulation prevention bytes. „ NAL unit stream: A sequence of NAL units. „ non-paired field: A collective term for a non-paired reference field or a non-paired non-reference field. „ non-paired non-reference field: A decoded non-reference field that is not part of a complementary non-reference field pair. „ non-paired reference field: A decoded reference field that is not part of a complementary reference field pair. „ non-reference field: A field coded with nal_ref_idc equal to 0. „ non-reference frame: A frame coded with nal_ref_idc equal to 0. „ non-reference picture: A picture coded with nal_ref_idc equal to 0. A non-reference picture is not used for inter prediction of any other pictures. „ opposite parity: The opposite parity of top is bottom, and vice versa. „ output order: The order in which the decoded pictures are output from the decoded picture buffer. „ P slice: A slice that may be decoded using intra prediction from decoded samples within the same slice or inter prediction from previously-decoded reference pictures, using at most one motion vector and reference index to predict the sample values of each block. „ parameter: A syntax element of a sequence parameter set or a picture parameter set. Parameter is also used as part of the defined term quantisation parameter. „ parity: The parity of a field can be top or bottom. „ partitioning: The division of a set into subsets such that each element of the set is in exactly one of the subsets. „ picture: A collective term for a field or a frame. „ picture order count: A variable having a value that is non-decreasing with increasing picture position in output order relative to the previous IDR picture in decoding order or relative to the previous picture containing the memory management control operation that marks all reference pictures as “unused for reference”. „ prediction: An embodiment of the prediction process. „ prediction process: The use of a predictor to provide an estimate of the sample value or data element currently being decoded. „ predictive slice: See P slice. „ predictor: A combination of previously decoded sample values or data elements used in the decoding process of subsequent sample values or data elements. „ primary coded picture: The coded representation of a picture to be used by the decoding process for a bitstream conforming to this Recommendation | International Standard. The primary coded picture contains all macroblocks of the picture. The only pictures that have a normative effect on the decoding process are primary coded pictures. See also redundant coded picture. „ profile: A specified subset of the syntax of this Recommendation | International Standard. „ quantisation parameter: A variable used by the decoding process for scaling of transform coefficient levels. „ random access: The act of starting the decoding process for a bitstream at a point other than the beginning of the stream. „ raster scan: A mapping of a rectangular two-dimensional pattern to a one-dimensional pattern such that the first entries in the one-dimensional pattern are from the first top row of the two-dimensional pattern scanned from left to right, followed similarly by the second, third, etc. rows of the pattern (going down) each scanned from left to right. „ raw byte sequence payload (RBSP): A syntax structure containing an integer number of bytes that is encapsulated in a NAL unit. An RBSP is either empty or has the form of a string of data bits containing syntax elements followed by an RBSP stop bit and followed by zero or more subsequent bits equal to 0. „ raw byte sequence payload (RBSP) stop bit: A bit equal to 1 present within a raw byte sequence payload (RBSP) after a string of data bits. The location of the end of the string of data bits within an RBSP can be identified by searching from the end of the RBSP for the RBSP stop bit, which is the last non-zero bit in the RBSP. „ recovery point: A point in the bitstream at which the recovery of an exact or an approximate representation of the decoded pictures represented by the bitstream is achieved after a random access or broken link. „ redundant coded picture: A coded representation of a picture or a part of a picture. The content of a redundant coded picture shall not be used by the decoding process for a bitstream conforming to this Recommendation | International Standard. A redundant coded picture is not required to contain all macroblocks in the primary coded picture. Redundant coded pictures have no normative effect on the decoding process. See also primary coded picture. „ reference field: A reference field may be used for inter prediction when P, SP, and B slices of a coded field or field macroblocks of a coded frame are decoded. See also reference picture. „ reference frame: A reference frame may be used for inter prediction when P, SP, and B slices of a coded frame are decoded. See also reference picture. „ reference index: An index into a reference picture list. „ reference picture: A picture with nal_ref_idc not equal to 0. A reference picture contains samples that may be used for inter prediction in the decoding process of subsequent pictures in decoding order. „ reference picture list: A list of short-term picture numbers and long-term picture numbers that are assigned to reference pictures. „ reference picture list 0: A reference picture list used for inter prediction of a P, B, or SP slice. All inter prediction used for P and SP slices uses reference picture list 0. Reference picture list 0 is one of two reference picture lists used for inter prediction for a B slice, with the other being reference picture list 1. „ reference picture list 1: A reference picture list used for inter prediction of a B slice. Reference picture list 1 is one of two lists of reference picture lists used for inter prediction for a B slice, with the other being reference picture list 0. „ reference picture marking: Specifies, in the bitstream, how the decoded pictures are marked for inter prediction. „ reserved: The term reserved, when used in the clauses specifying some values of a particular syntax element, are for future use by ITU-T | ISO/IEC. These values shall not be used in bitstreams conforming to this Recommendation | International Standard, but may be used in future extensions of this Recommendation | International Standard by ITU-T | ISO/IEC. „ residual: The decoded difference between a prediction of a sample or data element and its decoded value. „ run: A number of consecutive data elements represented in the decoding process. In one context, the number of zero-valued transform coefficient levels preceding a non-zero transform coefficient level in the list of transform coefficient levels generated by a zig-zag scan or a field scan. In other contexts, run refers to a number of macroblocks. „ sample aspect ratio: Specifies, for assisting the display process, which is not specified in this Recommendation | International Standard, the ratio between the intended horizontal distance between the columns and the intended vertical distance between the rows of the luma sample array in a frame. Sample aspect ratio is expressed as h:v, where h is horizontal width and v is vertical height (in arbitrary units of spatial distance). „ scaling: The process of multiplying transform coefficient levels by a factor, resulting in transform coefficients. „ SI slice: A slice that is coded using prediction only from decoded samples within the same slice and using quantisation of the prediction samples. An SI slice can be coded such that its decoded samples can be constructed identically to an SP slice. „ skipped macroblock: A macroblock for which no data is coded other than an indication that the macroblock is to be decoded as "skipped". This indication may be common to several macroblocks. „ slice: An integer number of macroblocks or macroblock pairs ordered consecutively in the raster scan within a particular slice group. For the primary coded picture, the division of each slice group into slices is a partitioning. Although a slice contains macroblocks or macroblock pairs that are consecutive in the raster scan within a slice group, these macroblocks or macroblock pairs are not necessarily consecutive in the raster scan within the picture. The addresses of the macroblocks are derived from the address of the first macroblock in a slice (as represented in the slice header) and the macroblock to slice group map. „ slice data partitioning: A method of partitioning selected syntax elements into syntax structures based on a category associated with each syntax element. „ slice group: A subset of the macroblocks or macroblock pairs of a picture. The division of the picture into slice groups is a partitioning of the picture. The partitioning is specified by the macroblock to slice group map. „ slice group map units: The units of the map unit to slice group map. „ slice header: A part of a coded slice containing the data elements pertaining to the first or all macroblocks represented in the slice. „ source: Term used to describe the video material or some of its attributes before encoding. „ SP slice: A slice that is coded using inter prediction from previously-decoded reference pictures, using at most one motion vector and reference index to predict the sample values of each block. An SP slice can be coded such that its decoded samples can be constructed identically to another SP slice or an SI slice. „ start code prefix: A unique sequence of three bytes equal to 0x000001 embedded in the byte stream as a prefix to each NAL unit. The location of a start code prefix can be used by a decoder to identify the beginning of a new NAL unit and the end of a previous NAL unit. Emulation of start code prefixes is prevented within NAL units by the inclusion of emulation prevention bytes. „ string of data bits (SODB): A sequence of some number of bits representing syntax elements present within a raw byte sequence payload prior to the raw byte sequence payload stop bit. Within an SODB, the left-most bit is considered to be the first and most significant bit, and the right-most bit is considered to be the last and least significant bit. „ sub-macroblock: One quarter of the samples of a macroblock, i.e., an 8x8 luma block and two 4x4 chroma blocks of which one corner is located at a corner of the macroblock. „ sub-macroblock partition: A block of luma samples and two corresponding blocks of chroma samples resulting from a partitioning of a sub-macroblock for inter prediction. „ switching I slice: See SI slice. „ switching P slice: See SP slice. „ syntax element: An element of data represented in the bitstream. „ syntax structure: Zero or more syntax elements present together in the bitstream in a specified order. „ top field: One of two fields that comprise a frame. Each row of a top field is spatially located immediately above the corresponding row of the bottom field. „ top macroblock (of a macroblock pair): The macroblock within a macroblock pair that contains the samples in the top row of samples for the macroblock pair. For a field macroblock pair, the top macroblock represents the samples from the region of the top field of the frame that lie within the spatial region of the macroblock pair. For a frame macroblock pair, the top macroblock represents the samples of the frame that lie within the top half of the spatial region of the macroblock pair. „ transform coefficient: A scalar quantity, considered to be in a frequency domain, that is associated with a particular one-dimensional or two-dimensional frequency index in an inverse transform part of the decoding process. „ transform coefficient level: An integer quantity representing the value associated with a particular two-dimensional frequency index in the decoding process prior to scaling for computation of a transform coefficient value. „ universal unique identifier (UUID): An identifier that is unique with respect to the space of all universal unique identifiers. „ unspecified: The term unspecified, when used in the clauses specifying some values of a particular syntax element, indicates that the values have no specified meaning in this Recommendation | International Standard and will not have a specified meaning in the future as an integral part of this Recommendation | International Standard. „ variable length coding (VLC): A reversible procedure for entropy coding that assigns shorter bit strings to symbols expected to be more frequent and longer bit strings to symbols expected to be less frequent. „ zig-zag scan: A specific sequential ordering of transform coefficient levels from (approximately) the lowest spatial frequency to the highest. Zig-zag scan is used for tra nsform coefficient levels in frame macroblocks. „ CATV Cable TV on optical networks, copper, etc. „ DBS Direct broadcast satellite video services „ DSL Digital subscriber line video services „ DTTB Digital terrestrial television broadcasting „ ISM Interactive storage media (optical disks, etc.) „ MMM Multimedia mailing „ MSPN Multimedia services over packet networks „ RTC Real-time conversational services (videoconferencing, videophone, etc.) „ RVS Remote video surveillance „ SSM Serial storage media (digital VTR, etc.) 附录一 CAVLC 相关码表 表 1 coeff_token 到 TotalCoeff( coeff_token ) 和 TrailingOnes( coeff_token )映射 TrailingOnes ( coeff_token ) TotalCoeff ( coeff_token ) 0 <= nC < 2 2 <= nC < 4 4 <= nC < 8 8 <= nC nC = = -1 0 0 1 11 1111 0000 11 01 0 1 0001 01 0010 11 0011 11 0000 00 0001 11 1 1 01 10 1110 0000 01 1 0 2 0000 0111 0001 11 0010 11 0001 00 0001 00 1 2 0001 00 0011 1 0111 1 0001 01 0001 10 2 2 001 011 1101 0001 10 001 0 3 0000 0011 1 0000 111 0010 00 0010 00 0000 11 1 3 0000 0110 0010 10 0110 0 0010 01 0000 011 2 3 0000 101 0010 01 0111 0 0010 10 0000 010 3 3 0001 1 0101 1100 0010 11 0001 01 0 4 0000 0001 11 0000 0111 0001 111 0011 00 0000 10 1 4 0000 0011 0 0001 10 0101 0 0011 01 0000 0011 2 4 0000 0101 0001 01 0101 1 0011 10 0000 0010 3 4 0000 11 0100 1011 0011 11 0000 000 0 5 0000 0000 111 0000 0100 0001 011 0100 00 - 1 5 0000 0001 10 0000 110 0100 0 0100 01 - 2 5 0000 0010 1 0000 101 0100 1 0100 10 - 3 5 0000 100 0011 0 1010 0100 11 - 0 6 0000 0000 0111 1 0000 0011 1 0001 001 0101 00 - 1 6 0000 0000 110 0000 0110 0011 10 0101 01 - 2 6 0000 0001 01 0000 0101 0011 01 0101 10 - 3 6 0000 0100 0010 00 1001 0101 11 - 0 7 0000 0000 0101 1 0000 0001 111 0001 000 0110 00 - 1 7 0000 0000 0111 0 0000 0011 0 0010 10 0110 01 - 2 7 0000 0000 101 0000 0010 1 0010 01 0110 10 - 3 7 0000 0010 0 0001 00 1000 0110 11 - 0 8 0000 0000 0100 0 0000 0001 011 0000 1111 0111 00 - 1 8 0000 0000 0101 0 0000 0001 110 0001 110 0111 01 - 2 8 0000 0000 0110 1 0000 0001 101 0001 101 0111 10 - 3 8 0000 0001 00 0000 100 0110 1 0111 11 - 0 9 0000 0000 0011 11 0000 0000 1111 0000 1011 1000 00 - 1 9 0000 0000 0011 10 0000 0001 010 0000 1110 1000 01 - 2 9 0000 0000 0100 1 0000 0001 001 0001 010 1000 10 - 3 9 0000 0000 100 0000 0010 0 0011 00 1000 11 - 0 10 0000 0000 0010 11 0000 0000 1011 0000 0111 1 1001 00 - 1 10 0000 0000 0010 10 0000 0000 1110 0000 1010 1001 01 - 2 10 0000 0000 0011 01 0000 0000 1101 0000 1101 1001 10 - 3 10 0000 0000 0110 0 0000 0001 100 0001 100 1001 11 - 0 11 0000 0000 0001 111 0000 0000 1000 0000 0101 1 1010 00 - 1 11 0000 0000 0001 110 0000 0000 1010 0000 0111 0 1010 01 - 2 11 0000 0000 0010 01 0000 0000 1001 0000 1001 1010 10 - 3 11 0000 0000 0011 00 0000 0001 000 0000 1100 1010 11 - 0 12 0000 0000 0001 011 0000 0000 0111 1 0000 0100 0 1011 00 - 1 12 0000 0000 0001 010 0000 0000 0111 0 0000 0101 0 1011 01 - 2 12 0000 0000 0001 101 0000 0000 0110 1 0000 0110 1 1011 10 - 3 12 0000 0000 0010 00 0000 0000 1100 0000 1000 1011 11 - 0 13 0000 0000 0000 1111 0000 0000 0101 1 0000 0011 01 1100 00 - 1 13 0000 0000 0000 001 0000 0000 0101 0 0000 0011 1 1100 01 - 2 13 0000 0000 0001 001 0000 0000 0100 1 0000 0100 1 1100 10 - 3 13 0000 0000 0001 100 0000 0000 0110 0 0000 0110 0 1100 11 - 0 14 0000 0000 0000 1011 0000 0000 0011 1 0000 0010 01 1101 00 - 1 14 0000 0000 0000 1110 0000 0000 0010 11 0000 0011 00 1101 01 - 2 14 0000 0000 0000 1101 0000 0000 0011 0 0000 0010 11 1101 10 - 3 14 0000 0000 0001 000 0000 0000 0100 0 0000 0010 10 1101 11 - 0 15 0000 0000 0000 0111 0000 0000 0010 01 0000 0001 01 1110 00 - 1 15 0000 0000 0000 1010 0000 0000 0010 00 0000 0010 00 1110 01 - 2 15 0000 0000 0000 1001 0000 0000 0010 10 0000 0001 11 1110 10 - 3 15 0000 0000 0000 1100 0000 0000 0000 1 0000 0001 10 1110 11 - 0 16 0000 0000 0000 0100 0000 0000 0001 11 0000 0000 01 1111 00 - 1 16 0000 0000 0000 0110 0000 0000 0001 10 0000 0001 00 1111 01 - 2 16 0000 0000 0000 0101 0000 0000 0001 01 0000 0000 11 1111 10 - 3 16 0000 0000 0000 1000 0000 0000 0001 00 0000 0000 10 1111 11 - 表 2 level_prefix 码表 level_prefix bit string 0 1 1 01 2 001 3 0001 4 0000 1 5 0000 01 6 0000 001 7 0000 0001 8 0000 0000 1 9 0000 0000 01 10 0000 0000 001 11 0000 0000 0001 12 0000 0000 0000 1 13 0000 0000 0000 01 14 0000 0000 0000 001 15 0000 0000 0000 0001 表 3 TotalCoeff( coeff_token ) 为 1~7 时 4x4 块的 total_zeros 表 total_zeros TotalCoeff( coeff_token ) 1 2 3 4 5 6 7 0 1 111 0101 0001 1 0101 0000 01 0000 01 1 011 110 111 111 0100 0000 1 0000 1 2 010 101 110 0101 0011 111 101 3 0011 100 101 0100 111 110 100 4 0010 011 0100 110 110 101 011 5 0001 1 0101 0011 101 101 100 11 6 0001 0 0100 100 100 100 011 010 7 0000 11 0011 011 0011 011 010 0001 8 0000 10 0010 0010 011 0010 0001 001 9 0000 011 0001 1 0001 1 0010 0000 1 001 0000 00 10 0000 010 0001 0 0001 0 0001 0 0001 0000 00 11 0000 0011 0000 11 0000 01 0000 1 0000 0 12 0000 0010 0000 10 0000 1 0000 0 13 0000 0001 1 0000 01 0000 00 14 0000 0001 0 0000 00 15 0000 0000 1 表 4 TotalCoeff( coeff_token ) 为 8~15 时 4x4 块的 total_zeros 表 total_zeros TotalCoeff( coeff_token ) 8 9 10 11 12 13 14 15 0 0000 01 0000 01 0000 1 0000 0000 000 00 0 1 0001 0000 00 0000 0 0001 0001 001 01 1 2 0000 1 0001 001 001 01 1 1 3 011 11 11 010 1 01 4 11 10 10 1 001 5 10 001 01 011 6 010 01 0001 7 001 0000 1 8 0000 00 表 5 色度 DC 2x2 块的 total_zeros 表 total_zeros TotalCoeff( coeff_token ) 1 2 3 0 1 1 1 1 01 01 0 2 001 00 3 000 表 6 run_before 表 zerosLeft run_before 1 2 3 4 5 6 >6 0 1 1 11 11 11 11 111 1 0 01 10 10 10 000 110 2 - 00 01 01 011 001 101 3 - - 00 001 010 011 100 4 - - - 000 001 010 011 5 - - - - 000 101 010 6 - - - - - 100 001 7 - - - - - - 0001 8 - - - - - 00001 9 - - - - - - 000001 10 - - - - - - 0000001 11 - - - - - - 00000001 12 - - - - - - 000000001 13 - - - - - - 0000000001 14 - - - - - - 00000000001 附录二 CABAC 相关码表 表 1 ctxIdx 为 0~398 时变量 m 和 n 的取值表 ctxIdx Initialisation variables 0 1 2 3 4 5 6 7 8 9 10 m 20 2 3 20 2 3 -28 -23 -6 -1 7 n -15 54 74 -15 54 74 127 104 53 54 51 ctxIdx Value of cabac_init_idc Initialisation variables 11 12 13 14 15 16 17 18 19 20 21 22 23 m 23 23 21 1 0 -37 5 -13 -11 1 12 -4 170 n 33 2 0 9 49 118 57 78 65 62 49 73 50 m 22 34 16 -2 4 -29 2 -6 -13 5 9 -3 101 n 25 0 0 9 41 118 65 71 79 52 50 70 54 m 29 25 14 -10 -3 -27 26 -4 -24 5 6 -17 142 n 16 0 0 51 62 99 16 85 102 57 57 73 57 ctxIdx Value of cabac_init_ idc Initialisat ion variables 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 m 18 9 29 26 16 9 -4 6 -2 0 1 -1 3 -1 1 1 -6 -1 7 -6 9 0 n 64 43 0 67 90 10 4 12 7 10 4 67 78 65 62 86 95 61 45 m 26 19 40 57 41 26 -4 5 -1 5 -4 -6 -1 3 5 6 -1 3 08 1 n 34 22 0 2 36 69 12 7 10 1 76 71 79 52 69 90 52 43 m 20 20 29 54 37 12 -3 2 -2 2 -2 -4 -2 4 5 -6 -1 4 -6 4 2 n 40 10 0 0 42 97 12 7 11 7 74 85 10 2 57 93 88 44 55 ctxIdx Value of cabac_init_id c Initialisatio n variables 40 41 42 4 3 4 4 4 5 46 4 7 4 8 49 5 0 5 1 5 2 53 m -3 -6 -11 6 7 -5 2 0 -3 -10 5 4 -3 0 0 n 69 81 96 5 5 6 7 8 6 88 5 8 7 6 94 5 4 6 9 8 1 88 m -2 -5 -10 2 2 -3 -3 1 -3 -6 0 -3 -7 -51 n 69 82 96 5 9 7 5 8 7 10 0 5 6 7 4 85 5 9 8 1 8 6 95 m -1 1 -15 -21 1 9 2 0 4 6 1 -5 -13 5 6 -3 -12 n 89 10 3 11 6 5 7 5 8 8 4 96 6 3 8 5 10 6 6 3 7 5 9 0 10 1 ctxIdx Value of cabac_init_idc Initialisation variables 54 55 56 57 58 59 m -7 -5 -4 -5 -7 1 0 n 67 74 74 80 72 58 m -1 -1 1 -2 -5 0 1 n 66 77 70 86 72 61 m 3 -4 -2 -12 -7 1 2 n 55 79 75 97 50 60 ctxIdx Initialisation variables 60 61 62 63 64 65 66 67 68 69 m 0 0 0 0 -9 4 0 -7 13 3 n 41 63 63 63 83 86 97 72 41 62 Value of cabac_init_idc Value of cabac_init_idc I and SI slices 0 1 2 I and SI slices 0 1 2 ctxI dx m n m n m n m n ctxIdx mn mn m n mn 70 0 11 0 45 13 15 7 34 88 -1 1 11 5 -1 3 10 8 -4 92 5 78 71 1 55 -4 78 7 51 -9 88 89 -1 2 63 -3 46 0 39 -6 55 72 0 69 -3 96 2 80 -2 0 127 90 -2 68 -1 65 0 65 4 61 73 -1 7 12 7 -2 7 12 6 -3 9 12 7 -3 6 127 91 -1 5 84 -1 57 -1 5 84 -1 4 83 74 -1 3 10 2 -2 8 98 -1 8 91 -1 7 91 92 -1 3 10 4 -9 93 -3 5 12 7 -3 7 12 7 75 0 82 -2 5 10 1 -1 7 96 -1 4 95 93 -3 70 -3 74 -2 73 -5 79 76 -7 74 -2 3 67 -2 6 81 -2 5 84 94 -8 93 -9 92 -1 2 10 4 -1 1 10 4 77 -2 1 10 7 -2 8 82 -3 5 98 -2 5 86 95 -1 0 90 -8 87 -9 91 -1 1 91 78 -2 7 12 7 -2 0 94 -2 4 10 2 -1 2 89 96 -3 0 12 7 -2 3 12 6 -3 1 12 7 -3 0 12 7 79 -3 1 12 7 -1 6 83 -2 3 97 -1 7 91 97 -1 74 5 54 3 55 0 65 80 -2 4 12 7 -2 2 11 0 -2 7 11 9 -3 1 127 98 -6 97 6 60 7 56 -2 79 81 -1 8 95 -2 1 91 -2 4 99 -1 4 76 99 -7 91 6 59 7 55 0 72 82 -2 7 12 7 -1 8 10 2 -2 1 11 0 -1 8 103 100 -2 0 12 7 6 69 8 61 -4 92 83 -2 1 11 4 -1 3 93 -1 8 10 2 -1 3 90 101 -4 56 -1 48 -3 53 -6 56 84 -3 0 12 7 -2 9 12 7 -3 6 12 7 -3 7 127 102 -5 82 0 68 0 68 3 68 85 -1 7 12 3 -7 92 0 80 11 80 103 -7 76 -4 69 -7 74 -8 71 86 -1 2 11 5 -5 89 -5 89 5 76 104 -2 2 12 5 -8 88 -9 88 -1 3 98 87 -1 6 12 2 -7 96 -7 94 2 84 Value of cabac_init_idc Value of cabac_init_idc I and SI slices 0 1 2 I and SI slices 0 1 2 ctxI dx m n m n m n m n ctxId x m n m n m n m n 105 -7 93 -2 85 -1 3 10 3 -4 86 136 -13 10 1 5 53 0 58 -5 75 106 -1 1 87 -6 78 -1 3 91 -1 2 88 137 -13 91 -2 61 -1 60 -8 80 107 -3 77 -1 75 -9 89 -5 82 138 -12 94 0 56 -3 61 -21 83 108 -5 71 -7 77 -1 4 92 -3 72 139 -10 88 0 56 -8 67 -21 64 109 -4 63 2 54 -8 76 -4 67 140 -16 84 -13 63 -25 84 -13 31 110 -4 68 5 50 -1 2 87 -8 72 141 -10 86 -5 60 -14 74 -25 64 111 -1 2 84 -3 68 -2 3 11 0 -1 6 89 142 -7 83 -1 62 -5 65 -29 94 112 -7 62 1 50 -2 4 10 5 -9 69 143 -13 87 4 57 5 52 9 75 113 -7 65 6 42 -1 0 78 -1 59 144 -19 94 -6 69 2 57 17 63 114 8 61 -4 81 -2 0 11 2 5 66 145 1 70 4 57 0 61 -8 74 115 5 56 1 63 -1 7 99 4 57 146 0 72 14 39 -9 69 -5 35 116 -2 66 -4 70 -7 8 12 7 -4 71 147 -5 74 4 51 -11 70 -2 27 117 1 64 0 67 -7 0 12 7 -2 71 148 18 59 13 68 18 55 13 91 118 0 61 2 57 -5 0 12 7 2 58 149 -8 10 2 3 64 -4 71 3 65 119 -2 78 -2 76 -4 6 12 7 -1 74 150 -15 10 0 1 61 0 58 -7 69 120 1 50 11 35 -4 66 -4 44 151 0 95 9 63 7 61 8 77 121 7 52 4 64 -5 78 -1 69 152 -4 75 7 50 9 41 -10 66 122 10 35 1 61 -4 71 0 62 153 2 72 16 39 18 25 3 62 123 0 44 11 35 -8 72 -7 51 154 -11 75 5 44 9 32 -3 68 124 11 38 18 25 2 59 -4 47 155 -3 71 4 52 5 43 -20 81 125 1 45 12 24 -1 55 -6 42 156 15 46 11 48 9 47 0 30 126 0 46 13 29 -7 70 -3 41 157 -13 69 -5 60 0 44 1 7 127 5 44 13 36 -6 75 -6 53 158 0 62 -1 59 0 51 -3 23 128 31 17 -1 0 93 -8 89 8 76 159 0 65 0 59 2 46 -21 74 129 1 51 -7 73 -3 4 11 9 -9 78 160 21 37 22 33 19 38 16 66 130 7 50 -2 73 -3 75 -1 1 83 161 -15 72 5 44 -4 66 -23 12 4 131 28 19 13 46 32 20 9 52 162 9 57 14 43 15 38 17 37 132 16 33 9 49 30 22 0 67 163 16 54 -1 78 12 42 44 -18 133 14 62 -7 10 0 -4 4 12 7 -5 90 164 0 62 0 60 9 34 50 -34 134 -1 3 10 8 9 53 0 54 1 67 165 12 72 9 69 0 89 -22 12 7 135 -1 5 10 0 2 53 -5 61 -1 5 72 Value of cabac_init_idc Value of cabac_init_idc I and SI slices 0 1 2 I and SI slices 0 1 2 ctxIdx m n m n m n m n ctxIdx mn mn m n mn 166 24 0 11 28 4 45 4 39 197 26 -17 28 3 36 -28 28 -3 167 15 9 2 40 10 28 0 42 198 30 -25 28 4 38 -28 24 10 168 8 25 3 44 10 31 7 34 199 28 -20 32 0 38 -27 27 0 169 13 18 0 49 33 -11 11 29 200 33 -23 34 -1 34 -18 34 -14 170 15 9 0 46 52 -43 8 31 201 37 -27 30 6 35 -16 52 -44 171 13 19 2 44 18 15 6 37 202 33 -23 30 6 34 -14 39 -24 172 10 37 2 51 28 0 7 42 203 40 -28 32 9 32 -8 19 17 173 12 18 0 47 35 -22 3 40 204 38 -17 31 19 37 -6 31 25 174 6 29 4 39 38 -25 8 33 205 33 -11 26 27 35 0 36 29 175 20 33 2 62 34 0 13 43 206 40 -15 26 30 30 10 24 33 176 15 30 6 46 39 -18 13 36 207 41 -6 37 20 28 18 34 15 177 4 45 0 54 32 -12 4 47 208 38 1 28 34 26 25 30 20 178 1 58 3 54 102 -94 3 55 209 41 17 17 70 29 41 22 73 179 0 62 2 58 0 0 2 58 210 30 -6 1 67 0 75 20 34 180 7 61 4 63 56 -15 6 60 211 27 3 5 59 2 72 19 31 181 12 38 6 51 33 -4 8 44 212 26 22 9 67 8 77 27 44 182 11 45 6 57 29 10 11 44 213 37 -16 16 30 14 35 19 16 183 15 39 7 53 37 -5 14 42 214 35 -4 18 32 18 31 15 36 184 11 42 6 52 51 -29 7 48 215 38 -8 18 35 17 35 15 36 185 13 44 6 55 39 -9 4 56 216 38 -3 22 29 21 30 21 28 186 16 45 11 45 52 -34 4 52 217 37 3 24 31 17 45 25 21 187 12 41 14 36 69 -58 13 37 218 38 5 23 38 20 42 30 20 188 10 49 8 53 67 -63 9 49 219 42 0 18 43 18 45 31 12 189 30 34 -1 82 44 -5 19 58 220 35 16 20 41 27 26 27 16 190 18 42 7 55 32 7 10 48 221 39 22 11 63 16 54 24 42 191 10 55 -3 78 55 -29 12 45 222 14 48 9 59 7 66 0 93 192 17 51 15 46 32 1 0 69 223 27 37 9 64 16 56 14 56 193 17 46 22 31 0 0 20 33 224 21 60 -1 94 11 73 15 57 194 0 89 -1 84 27 36 8 63 225 12 68 -2 89 10 67 26 38 195 26 -19 25 7 33 -25 35 -18 226 2 97 -9 108 -10 116 -24 127 196 22 -17 30 -7 34 -30 33 -25 Value of cabac_init_idc Value of cabac_init_idc I and SI slices 0 1 2 I and SI slices 0 1 2 ctxId x m n m n m n m n ctxId x mn mn m n mn 227 -3 7 1 -6 76 -2 3 11 2 -2 4 11 5 252 -1 2 73 -6 5 5 -1 6 7 2 -1 4 75 228 -6 4 2 -2 44 -1 5 71 -2 2 82 253 -8 76 0 5 8 -7 6 9 -1 0 79 229 -5 5 0 0 45 -7 61 -9 62 254 -7 80 0 6 4 -4 6 9 -9 83 230 -3 5 4 0 52 0 53 0 53 255 -9 88 -3 7 4 -5 7 4 -1 2 92 231 -2 6 2 -3 64 -5 66 0 59 256 -1 7 11 0 -1 0 9 0 -9 8 6 -1 8 10 8 232 0 5 8 -2 59 -1 1 77 -1 4 85 257 -1 1 97 0 7 0 2 6 6 -4 79 233 1 6 3 -4 70 -9 80 -1 3 89 258 -2 0 84 -4 2 9 -9 3 4 -2 2 69 234 -2 7 2 -4 75 -9 84 -1 3 94 259 -1 1 79 5 3 1 1 3 2 -1 6 75 235 -1 7 4 -8 82 -1 0 87 -1 1 92 260 -6 73 7 4 2 11 3 1 -2 58 236 -9 9 1 -1 7 10 2 -3 4 12 7 -2 9 12 7 261 -4 74 1 5 9 5 5 2 1 58 237 -5 6 7 -9 77 -2 1 10 1 -2 1 10 0 262 -1 3 86 -2 5 8 -2 5 5 -1 3 78 238 -5 2 7 3 24 -3 39 -1 4 57 263 -1 3 96 -3 7 2 -2 6 7 -9 83 239 -3 3 9 0 42 -5 53 -1 2 67 264 -1 1 97 -3 8 1 0 7 3 -4 81 240 -2 4 4 0 48 -7 61 -1 1 71 265 -1 9 11 7 -1 1 9 7 -8 8 9 -1 3 99 241 0 4 6 0 55 -1 1 75 -1 0 77 266 -8 78 0 5 8 3 5 2 -1 3 81 242 -1 6 6 4 -6 59 -1 5 77 -2 1 85 267 -5 33 8 5 7 4 -6 38 243 -8 6 8 -7 71 -1 7 91 -1 6 88 268 -4 48 10 1 4 10 8 -1 3 62 244 -1 0 7 8 -1 2 83 -2 5 10 7 -2 3 10 4 269 -2 53 14 1 8 17 8 -6 58 245 -6 7 7 -1 1 87 -2 5 11 1 -1 5 98 270 -3 62 13 2 7 16 1 9 -2 59 246 -1 0 8 6 -3 0 11 9 -2 8 12 2 -3 7 12 7 271 -1 3 71 2 4 0 3 3 7 -1 6 73 247 -1 2 9 2 1 58 -1 1 76 -1 0 82 272 -1 0 79 0 5 8 -1 6 1 -1 0 76 248 -1 5 5 5 -3 29 -1 0 44 -8 48 273 -1 2 86 -3 7 0 -5 7 3 -1 3 86 249 -1 0 6 0 -1 36 -1 0 52 -8 61 274 -1 3 90 -6 7 9 -1 7 0 -9 83 250 -6 6 2 1 38 -1 0 57 -8 66 275 -1 4 97 -8 8 5 -4 7 8 -1 0 87 251 -4 6 5 2 43 -9 58 -7 70 Value of cabac_init_idc Value of cabac_init_idc I and SI slices 0 1 2 I and SI slices 0 1 2 ctxId x m n m n m n m n ctxId x mnmn m n mn 277 -6 93 -13 10 6 -2 1 12 6 -2 2 12 7 308 -1 6 9 6 -1 5 1 -1 6 7 7 -1 0 6 7 278 -6 84 -16 10 6 -2 3 12 4 -2 5 12 7 309 -7 8 8 7 4 9 -2 6 4 1 6 8 279 -8 79 -10 87 -2 0 11 0 -2 5 12 0 310 -8 8 5 8 5 2 2 6 1 0 7 7 280 0 66 -21 11 4 -2 6 12 6 -2 7 12 7 311 -7 8 5 9 4 1 -6 6 7 2 6 4 281 -1 71 -18 11 0 -2 5 12 4 -1 9 11 4 312 -9 8 5 6 4 7 -3 6 4 0 6 8 282 0 62 -14 98 -1 7 10 5 -2 3 11 7 313 -1 3 8 8 2 5 5 2 5 7 -5 7 8 283 -2 60 -22 11 0 -2 7 12 1 -2 5 11 8 314 4 6 6 1 3 4 1 -3 6 5 7 5 5 284 -2 59 -21 10 6 -2 7 11 7 -2 6 11 7 315 -3 7 7 1 0 4 4 -3 6 6 5 5 9 285 -5 75 -18 10 3 -1 7 10 2 -2 4 11 3 316 -3 7 6 6 5 0 0 6 2 2 6 5 286 -3 62 -21 10 7 -2 6 11 7 -2 8 11 8 317 -6 7 6 5 5 3 9 5 1 14 5 4 287 -4 58 -23 10 8 -2 7 11 6 -3 1 12 0 318 10 5 8 1 3 4 9 -1 6 6 15 4 4 288 -9 66 -26 11 2 -3 3 12 2 -3 7 12 4 319 -1 7 6 4 6 3 -2 7 1 5 6 0 289 -1 79 -10 96 -1 0 95 -1 0 94 320 -1 8 3 6 6 4 -2 7 5 2 7 0 290 0 71 -12 95 -1 4 10 0 -1 5 10 2 321 -7 9 9 -2 6 9 -1 7 0 -2 7 6 291 3 68 -5 91 -8 95 -1 0 99 322 -1 4 9 5 -2 5 9 -9 7 2 -1 8 8 6 292 10 44 -9 93 -1 7 11 1 -1 3 10 6 323 2 9 5 6 7 0 14 6 0 12 7 0 293 -7 62 -22 94 -2 8 11 4 -5 0 12 7 324 0 7 6 1 0 4 4 16 3 7 5 6 4 294 15 36 -5 86 -6 89 -5 92 325 -5 7 4 9 3 1 0 4 7 -1 2 7 0 295 14 40 9 67 -2 80 17 57 326 0 7 0 1 2 4 3 18 3 5 11 5 5 296 16 27 -4 80 -4 82 -5 86 327 -1 1 7 5 3 5 3 11 3 7 5 5 6 297 12 29 -10 85 -9 85 -1 3 94 328 1 6 8 1 4 3 4 12 4 1 0 6 9 298 1 44 -1 70 -8 81 -1 2 91 329 0 6 5 1 0 3 8 10 4 1 2 6 5 299 20 36 7 60 -1 72 -2 77 330 -1 4 7 3 -3 5 2 2 4 8 -6 7 4 300 18 32 9 58 5 64 0 71 331 3 6 2 1 3 4 0 12 4 1 5 5 4 301 5 42 5 61 1 67 -1 73 332 4 6 2 1 7 3 2 13 4 1 7 5 4 302 1 48 12 50 9 56 4 64 333 -1 6 8 7 4 4 0 5 9 -6 7 6 303 10 62 15 50 0 69 -7 81 334 -1 3 7 5 7 3 8 3 5 0 -1 1 8 2 304 17 46 18 49 1 69 5 64 335 11 5 5 1 3 5 0 19 4 0 -2 7 7 305 9 64 17 54 7 69 15 57 336 5 6 4 1 0 5 7 3 6 6 -2 7 7 306 -12 104 10 41 -7 69 1 67 337 12 7 0 2 6 4 3 18 5 0 25 4 2 307 -11 97 7 46 -6 67 0 68 Value of cabac_init_idc Value of cabac_init_idc I and SI slices 0 1 2 I and SI slices 0 1 2 ctxIdx m n m n m n m n ctxIdx mn mn m n m n 338 15 6 14 11 19 -6 17 -13 369 32 -26 31 -4 40 -37 37 -17 339 6 19 11 14 18 -6 16 -9 370 37 -30 27 6 38 -30 32 1 340 7 16 9 11 14 0 17 -12 371 44 -32 34 8 46 -33 34 15 341 12 14 18 11 26 -12 27 -21 372 34 -18 30 10 42 -30 29 15 342 18 13 21 9 31 -16 37 -30 373 34 -15 24 22 40 -24 24 25 343 13 11 23 -2 33 -25 41 -40 374 40 -15 33 19 49 -29 34 22 344 13 15 32 -15 33 -22 42 -41 375 33 -7 22 32 38 -12 31 16 345 15 16 32 -15 37 -28 48 -47 376 35 -5 26 31 40 -10 35 18 346 12 23 34 -21 39 -30 39 -32 377 33 0 21 41 38 -3 31 28 347 13 23 39 -23 42 -30 46 -40 378 38 2 26 44 46 -5 33 41 348 15 20 42 -33 47 -42 52 -51 379 33 13 23 47 31 20 36 28 349 14 26 41 -31 45 -36 46 -41 380 23 35 16 65 29 30 27 47 350 14 44 46 -28 49 -34 52 -39 381 13 58 14 71 25 44 21 62 351 17 40 38 -12 41 -17 43 -19 382 29 -3 8 60 12 48 18 31 352 17 47 21 29 32 9 32 11 383 26 0 6 63 11 49 19 26 353 24 17 45 -24 69 -71 61 -55 384 22 30 17 65 26 45 36 24 354 21 21 53 -45 63 -63 56 -46 385 31 -7 21 24 22 22 24 23 355 25 22 48 -26 66 -64 62 -50 386 35 -15 23 20 23 22 27 16 356 31 27 65 -43 77 -74 81 -67 387 34 -3 26 23 27 21 24 30 357 22 29 43 -19 54 -39 45 -20 388 34 3 27 32 33 20 31 29 358 19 35 39 -10 52 -35 35 -2 389 36 -1 28 23 26 28 22 41 359 14 50 30 9 41 -10 28 15 390 34 5 28 24 30 24 22 42 360 10 57 18 26 36 0 34 1 391 32 11 23 40 27 34 16 60 361 7 63 20 27 40 -1 39 1 392 35 5 24 32 18 42 15 52 362 -2 77 0 57 30 14 30 17 393 34 12 28 29 25 39 14 60 363 -4 82 -14 82 28 26 20 38 394 39 11 23 42 18 50 3 78 364 -3 94 -5 75 23 37 18 45 395 30 29 19 57 12 70 -16 123 365 9 69 -19 97 12 55 15 54 396 34 26 22 53 21 54 21 53 366 -12 109 -35 125 11 65 0 79 397 29 39 22 61 14 71 22 56 367 36 -35 27 0 37 -33 36 -16 398 19 66 11 86 11 83 25 61 368 36 -34 28 0 39 -36 37 -14 表 2 I 片中宏块类型二进制流 mb_type Bin string 0 (I_4x4) 0 1 (I_16x16_0_0_0) 1 0 0 0 0 0 2 (I_16x16_1_0_0) 1 0 0 0 0 1 3 (I_16x16_2_0_0) 1 0 0 0 1 0 4 (I_16x16_3_0_0) 1 0 0 0 1 1 5 (I_16x16_0_1_0) 1 0 0 1 0 0 0 6 (I_16x16_1_1_0) 1 0 0 1 0 0 1 7 (I_16x16_2_1_0) 1 0 0 1 0 1 0 8 (I_16x16_3_1_0) 1 0 0 1 0 1 1 9 (I_16x16_0_2_0) 1 0 0 1 1 0 0 10 (I_16x16_1_2_0) 1 0 0 1 1 0 1 11 (I_16x16_2_2_0) 1 0 0 1 1 1 0 12 (I_16x16_3_2_0) 1 0 0 1 1 1 1 13 (I_16x16_0_0_1) 1 0 1 0 0 0 14 (I_16x16_1_0_1) 1 0 1 0 0 1 15 (I_16x16_2_0_1) 1 0 1 0 1 0 16 (I_16x16_3_0_1) 1 0 1 0 1 1 17 (I_16x16_0_1_1) 1 0 1 1 0 0 0 18 (I_16x16_1_1_1) 1 0 1 1 0 0 1 19 (I_16x16_2_1_1) 1 0 1 1 0 1 0 20 (I_16x16_3_1_1) 1 0 1 1 0 1 1 21 (I_16x16_0_2_1) 1 0 1 1 1 0 0 22 (I_16x16_1_2_1) 1 0 1 1 1 0 1 23 (I_16x16_2_2_1) 1 0 1 1 1 1 0 24 (I_16x16_3_2_1) 1 0 1 1 1 1 1 25 (I_PCM) 1 1 binIdx 0 1 2 3 4 5 6 表 3 IP, SP, 和 B 片中宏块类型二进制流 Slice type Value (name) of mb_type Bin string 0 (P_L0_16x16) 0 0 0 1 (P_L0_L0_16x8) 0 1 1 2 (P_L0_L0_8x16) 0 1 0 3 (P_8x8) 0 0 1 4 (P_8x8ref0) na P, SP slice 5 to 30 (Intra, prefix only) 1 0 (B_Direct_16x16) 0 1 (B_L0_16x16) 1 0 0 2 (B_L1_16x16) 1 0 1 3 (B_Bi_16x16) 1 1 0 0 0 0 4 (B_L0_L0_16x8) 1 1 0 0 0 1 5 (B_L0_L0_8x16) 1 1 0 0 1 0 6 (B_L1_L1_16x8) 1 1 0 0 1 1 7 (B_L1_L1_8x16) 1 1 0 1 0 0 8 (B_L0_L1_16x8) 1 1 0 1 0 1 9 (B_L0_L1_8x16) 1 1 0 1 1 0 10 (B_L1_L0_16x8) 1 1 0 1 1 1 11 (B_L1_L0_8x16) 1 1 1 1 1 0 12 (B_L0_Bi_16x8) 1 1 1 0 0 0 0 13 (B_L0_Bi_8x16) 1 1 1 0 0 0 1 14 (B_L1_Bi_16x8) 1 1 1 0 0 1 0 15 (B_L1_Bi_8x16) 1 1 1 0 0 1 1 16 (B_Bi_L0_16x8) 1 1 1 0 1 0 0 17 (B_Bi_L0_8x16) 1 1 1 0 1 0 1 18 (B_Bi_L1_16x8) 1 1 1 0 1 1 0 19 (B_Bi_L1_8x16) 1 1 1 0 1 1 1 20 (B_Bi_Bi_16x8) 1 1 1 1 0 0 0 21 (B_Bi_Bi_8x16) 1 1 1 1 0 0 1 22 (B_8x8) 1 1 1 1 1 1 B slice 23 to 48 (Intra, prefix only) 1 1 1 1 0 1 binIdx 0 1 2 3 4 5 6 表 4 IP, SP, 和 B 片中子宏块类型二进制流 Slice type Value (name) of sub_mb_type Bin string 0 (P_L0_8x8) 1 1 (P_L0_8x4) 0 0 2 (P_L0_4x8) 0 1 1 P, SP slice 3 (P_L0_4x4) 0 1 0 0 (B_Direct_8x8) 0 1 (B_L0_8x8) 1 0 0 2 (B_L1_8x8) 1 0 1 3 (B_Bi_8x8) 1 1 0 0 0 4 (B_L0_8x4) 1 1 0 0 1 5 (B_L0_4x8) 1 1 0 1 0 6 (B_L1_8x4) 1 1 0 1 1 7 (B_L1_4x8) 1 1 1 0 0 0 8 (B_Bi_8x4) 1 1 1 0 0 1 9 (B_Bi_4x8) 1 1 1 0 1 0 10 (B_L0_4x4) 1 1 1 0 1 1 11 (B_L1_4x4) 1 1 1 1 0 B slice 12 (B_Bi_4x4) 1 1 1 1 1 binIdx 0 1 2 3 4 5 表 5 TabLPS 取值表 qCodIRangeIdx qCodIRangeIdx pStateIdx 0 1 2 3 pStateIdx 0 1 2 3 0 128 176 208 240 32 27 33 39 45 1 128 167 197 227 33 26 31 37 43 2 128 158 187 216 34 24 30 35 41 3 123 150 178 205 35 23 28 33 39 4 116 142 169 195 36 22 27 32 37 5 111 135 160 185 37 21 26 30 35 6 105 128 152 175 38 20 24 29 33 7 100 122 144 166 39 19 23 27 31 8 95 116 137 158 40 18 22 26 30 9 90 110 130 150 41 17 21 25 28 10 85 104 123 142 42 16 20 23 27 11 81 99 117 135 43 15 19 22 25 12 77 94 111 128 44 14 18 21 24 13 73 89 105 122 45 14 17 20 23 14 69 85 100 116 46 13 16 19 22 15 66 80 95 110 47 12 15 18 21 16 62 76 90 104 48 12 14 17 20 17 59 72 86 99 49 11 14 16 19 18 56 69 81 94 50 11 13 15 18 19 53 65 77 89 51 10 12 15 17 20 51 62 73 85 52 10 12 14 16 21 48 59 69 80 53 9 11 13 15 22 46 56 66 76 54 9 11 12 14 23 43 53 63 72 55 8 10 12 14 24 41 50 59 69 56 8 9 11 13 25 39 48 56 65 57 7 9 11 12 26 37 45 54 62 58 7 9 10 12 27 35 43 51 59 59 7 8 10 11 28 33 41 48 56 60 6 8 9 11 29 32 39 46 53 61 6 7 9 10 30 30 37 43 50 62 6 7 8 9 31 29 35 41 48 63 2 2 2 2 表 6 State transition 表 pStateIdx 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 transIdxLPS 0 0 1 2 2 4 4 5 6 7 8 9 9 11 11 12 transIdxMPS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 pStateIdx 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 transIdxLPS 13 13 15 15 16 16 18 18 19 19 21 21 22 22 23 24 transIdxMPS 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 pStateIdx 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 transIdxLPS 24 25 26 26 27 27 28 29 29 30 30 30 31 32 32 33 transIdxMPS 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 pStateIdx 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 transIdxLPS 33 33 34 34 35 35 35 36 36 36 37 37 37 38 38 63 transIdxMPS 49 50 51 52 53 54 55 56 57 58 59 60 61 62 62 63 附录三 H.264 档次和级 表 1 级限制 级数 最大宏块处 理速率 MaxMBPS (MB/s) 最大帧尺 寸 MaxFS (MBs) 最大解码缓 冲区尺寸 MaxDPB (1024 bytes) 最大视频比 特率 MaxBR (1000 bits/s or 1200 bits/s) 最大 CPB 尺 寸 MaxCPB (1000 bits or 1200 bits) 垂直 MV 范 围 MaxVmvR (亮度帧样电) 最小压 缩率 MinCR 每两个连续 MB 的 MV 最大数 MaxMvsPer2Mb 1 1 485 99 148.5 64 175 [-64,+63.75] 2 - 1.1 3 000 396 337.5 192 500 [-128,+127.75] 2 - 1.2 6 000 396 891.0 384 1 000 [-128,+127.75] 2 - 1.3 11 880 396 891.0 768 2 000 [-128,+127.75] 2 - 2 11 880 396 891.0 2 000 2 000 [-128,+127.75] 2 - 2.1 19 800 792 1 782.0 4 000 4 000 [-256,+255.75] 2 - 2.2 20 250 1 620 3 037.5 4 000 4 000 [-256,+255.75] 2 - 3 40 500 1 620 3 037.5 10 000 10 000 [-256,+255.75] 2 32 3.1 108 000 3 600 6 750.0 14 000 14 000 [-512,+511.75] 4 16 3.2 216 000 5 120 7 680.0 20 000 20 000 [-512,+511.75] 4 16 4 245 760 8 192 12 288.0 20 000 25 000 [-512,+511.75] 4 16 4.1 245 760 8 192 12 288.0 50 000 62 500 [-512,+511.75] 2 16 4.2 491 520 8 192 12 288.0 50 000 62 500 [-512,+511.75] 2 16 5 589 824 22 080 41 310.0 135 000 135 000 [-512,+511.75] 2 16 5.1 983 040 36 864 69 120.0 240 000 240 000 [-512,+511.75] 2 16 表 2 基本档次级限制 Level number MaxSubMbRectSize 1 576 1.1 576 1.2 576 1.3 576 2 576 2.1 576 2.2 576 3 576 3.1 - 3.2 - 4 - 4.1 - 4.2 - 5 - 5.1 - 表 3 主要档次级限制 Level number SliceRat e MinLumaBiPredSiz e direct_8x8_inference_fla g frame_mbs_only_fla g 1 - - - 1 1.1 - - - 1 1.2 - - - 1 1.3 - - - 1 2 - - - 1 2.1 - - - - 2.2 - - - - 3 22 - 1 - 3.1 60 8x8 1 - 3.2 60 8x8 1 - 4 60 8x8 1 - 4.1 24 8x8 1 - 4.2 24 8x8 1 1 5 24 8x8 1 1 5.1 24 8x8 1 1 表 4 扩展档次级限制 Level number MaxSubMbRectSize MinLumaBiPredSize frame_mbs_only_flag 1 576 - 1 1.1 576 - 1 1.2 576 - 1 1.3 576 - 1 2 576 - 1 2.1 576 - - 2.2 576 - - 3 576 - - 3.1 - 8x8 - 3.2 - 8x8 - 4 - 8x8 - 4.1 - 8x8 - 4.2 - 8x8 1 5 - 8x8 1 5.1 - 8x8 1 表 5 最大帧率举例 级数: 1 1.1 1.2 1.3 2 2.1 2.2 最大帧尺寸(宏块): 99 396 396 396 396 792 1 620 最大宏块数/s: 1 485 3 000 6 000 11 880 11 880 19 800 20 250 最大帧尺寸(样点): 25 344 101 376 101 376 101 376 101 376 202 752 414 720 最大样点数/s: 380 160 768 000 1 536 000 3 041 280 3 041 280 5 068 800 5 184 000 格式 亮度 宽度 亮度 高度 总宏 块数 亮度样 点数 SQCIF 128 96 48 12 288 30.9 62.5 125.0 172.0 172.0 172.0 172.0 QCIF 176 144 99 25 344 15.0 30.3 60.6 120.0 120.0 172.0 172.0 QVGA 320 240 300 76 800 - 10.0 20.0 39.6 39.6 66.0 67.5 525 SIF 352 240 330 84 480 - 9.1 18.2 36.0 36.0 60.0 61.4 CIF 352 288 396 101 376 - 7.6 15.2 30.0 30.0 50.0 51.1 525 HHR 352 480 660 168 960----- 30.030.7 625 HHR 352 576 792 202 752----- 25.025.6 VGA 640 480 1 200 307 200----- -16.9 525 4SIF 704 480 1 320 337 920----- -15.3 525 SD 720 480 1 350 345 600----- -15.0 4CIF 704 576 1 584 405 504----- -12.8 625 SD 720 576 1 620 414 720----- -12.5 SVGA 800 600 1 900 486 400----- -- XGA 1024 768 3 072 786 432----- -- 720p HD 1280 720 3 600 921 600----- -- 4VGA 1280 960 4 800 1 228 800----- -- SXGA 1280 1024 5 120 1 310 720----- -- 525 16SIF 1408 960 5 280 1 351 680----- -- 16CIF 1408 1152 6 336 1 622 ----- - - 016 4SVGA 1600 1200 7 500 1 920 000----- -- 1080 HD 1920 1088 8 160 2 088 960----- -- 2Kx1K 2048 1024 8 192 2 097 152----- -- 4XGA 2048 1536 12 288 3 145 728----- -- 16VGA 2560 1920 19 200 4 915 200----- -- 3616x1536 (2.35:1) 3616 1536 21 696 5 554 176----- -- 3672x1536 (2.39:1) 3680 1536 22 080 5 652 480----- -- 4Kx2K 4096 2048 32 768 8 388 608----- -- 4096x2304 (16:9) 4096 2304 36 864 9 437 184----- -- 表 6 最大帧率举例(续) 级数: 3 3.1 3.2 4 4.1 4.2 最大帧尺寸(宏块): 1 620 3 600 5 120 8 192 8 192 8 192 最大宏块数/s 40 500 108 000 216 000 245 760 245 760 589 824 最大帧尺寸(样点): 414 720 921 600 1 310 720 2 097 152 2 097 152 2 097 152 最大样点数/s 10 368 000 27 648 000 55 296 000 62 914 560 62 914 560 125 829 120 格式 亮度 宽度 亮度 高度 总宏 块数 亮度样 点数 SQCIF 128 96 48 12 288 172.0 172.0 172.0 172.0 172.0 172.0 QCIF 176 144 99 25 344 172.0 172.0 172.0 172.0 172.0 172.0 QVGA 320 240 300 76 800 135.0 172.0 172.0 172.0 172.0 172.0 525 SIF 352 240 330 84 480 122.7 172.0 172.0 172.0 172.0 172.0 CIF 352 288 396 101 376 102.3 172.0 172.0 172.0 172.0 172.0 525 HHR 352 480 660 168 960 61.4 163.6 172.0 172.0 172.0 172.0 625 HHR 352 576 792 202 752 51.1 136.4 172.0 172.0 172.0 172.0 VGA 640 480 1 200 307 200 33.8 90.0 172.0 172.0 172.0 172.0 525 4SIF 704 480 1 320 337 920 30.7 81.8 163.6 172.0 172.0 172.0 525 SD 720 480 1 350 345 600 30.0 80.0 160.0 172.0 172.0 172.0 4CIF 704 576 1 584 405 504 25.6 68.2 136.4 155.2 155.2 172.0 625 SD 720 576 1 620 414 720 25.0 66.7 133.3 151.7 151.7 172.0 SVGA 800 600 1 900 486 400 - 56.8 113.7 129.3 129.3 172.0 XGA 1024 768 3 072 786 432 - 35.2 70.3 80.0 80.0 160.0 720p HD 1280 720 3 600 921 600 - 30.0 60.0 68.3 68.3 136.5 4VGA 1280 960 4 800 1 228 800 - - 45.0 51.2 51.2 102.4 SXGA 1280 1024 5 120 1 310 720 - - 42.2 48.0 48.0 96.0 525 16SIF 1408 960 5 280 1 351 680 - - - 46.5 46.5 93.1 16CIF 1408 1152 6 336 1 622 016 - - - 38.8 38.8 77.6 4SVGA 1600 1200 7 500 1 920 000 - - - 32.8 32.8 65.5 1080 HD 1920 1088 8 160 2 088 960 - - - 30.1 30.1 60.2 2Kx1K 2048 1024 8 192 2 097 152 - - - 30.0 30.0 60.0 4XGA 2048 1536 12 288 3 145 728---- - - 16VGA 2560 1920 19 200 4 915 200---- - - 3616x1536 (2.35:1) 3616 1536 21 696 5 554 176---- - - 3672x1536 (2.39:1) 3680 1536 22 080 5 652 480---- - - 4Kx2K 4096 2048 32 768 8 388 608---- - - 4096x2304 (16:9) 4096 2304 36 864 9 437 184---- - - 表 7 最大帧率举例(续) 级数: 5 5.1 最大帧尺寸(宏块): 21 696 36 864 最大宏块数/s 589 824 983 040 最大帧尺寸(样点): 5 554 176 9 437 184 最大样点数/s 150 994 944 251 658 240 格式 亮度 宽度 亮度 高度 总宏 块数 亮度样 点数 SQCIF 128 96 48 12 288 172.0 172.0 QCIF 176 144 99 25 344 172.0 172.0 QVGA 320 240 300 76 800 172.0 172.0 525 SIF 352 240 330 84 480 172.0 172.0 CIF 352 288 396 101 376 172.0 172.0 525 HHR 352 480 660 168 960 172.0 172.0 625 HHR 352 576 792 202 752 172.0 172.0 VGA 640 480 1 200 307 200 172.0 172.0 525 4SIF 704 480 1 320 337 920 172.0 172.0 525 SD 720 480 1 350 345 600 172.0 172.0 4CIF 704 576 1 584 405 504 172.0 172.0 625 SD 720 576 1 620 414 720 172.0 172.0 SVGA 800 600 1 900 486 400 172.0 172.0 XGA 1024 768 3 072 786 432 172.0 172.0 720p HD 1280 720 3 600 921 600 163.8 172.0 4VGA 1280 960 4 800 1 228 800 122.9 172.0 SXGA 1280 1024 5 120 1 310 720 115.2 172.0 525 16SIF 1408 960 5 280 1 351 680 111.7 172.0 16CIF 1408 1152 6 336 1 622 93.1 155.2 016 4SVGA 1600 1200 7 500 1 920 000 78.6 131.1 1080 HD 1920 1088 8 160 2 088 960 72.3 120.5 2Kx1K 2048 1024 8 192 2 097 152 72.0 120.0 4XGA 2048 1536 12 288 3 145 728 48.0 80.0 16VGA 2560 1920 19 200 4 915 200 30.7 51.2 3616x1536 (2.35:1) 3616 1536 21 696 5 554 176 27.2 45.3 3672x1536 (2.39:1) 3680 1536 22 080 5 652 480 26.7 44.5 4Kx2K 4096 2048 32 768 8 388 608 - 30.0 4096x2304 (16:9) 4096 2304 36 864 9 437 184 - 26.7
还剩325页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 20 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

pxh2022

贡献于2011-10-14

下载需要 20 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf