首页> 中国专利> 对末位有效系数的位置进行编码和解码的方法和设备

对末位有效系数的位置进行编码和解码的方法和设备

摘要

本发明公开了使用熵编码器编码量化后的变换域系数数据来对数据进行熵编码的方法和设备。使用末位有效系数的二维坐标,在比特流中发信号通知末位有效系数信息。坐标之一的二进制数的上下文部分基于另一坐标的值。在一种情形下,对非零系数的数目进行二进制化和熵编码,以替代发信号通知末位有效系数信息。

著录项

  • 公开/公告号CN103597838A

    专利类型发明专利

  • 公开/公告日2014-02-19

    原文格式PDF

  • 申请/专利权人 黑莓有限公司;

    申请/专利号CN201180071591.6

  • 发明设计人 何大可;王競;

    申请日2011-04-15

  • 分类号H04N19/61;H04N19/13;H03M7/30;

  • 代理机构中科专利商标代理有限责任公司;

  • 代理人苏志莲

  • 地址 加拿大安大略省沃特卢市

  • 入库时间 2024-02-19 22:53:23

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-03-29

    授权

    授权

  • 2014-03-19

    实质审查的生效 IPC(主分类):H04N19/61 申请日:20110415

    实质审查的生效

  • 2014-02-19

    公开

    公开

说明书

技术领域

本申请总体涉及数据压缩,具体地涉及对末位有效变换系数进行编 码和解码的编码器、解码器和方法。

背景技术

无论是有损的还是无损的数据压缩都常常使用熵编码来将去相关 的信号编码为比特序列,即比特流。有效的数据压缩具有广泛的应用, 诸如图像、音频以及视频编码。视频编码的当前最新技术是ITU-T H.264/MPEG AVC视频编码标准。该标准定义了针对不同应用的多个不 同简档,包括主简档、基线简档等等。通过MPEG-ITU的联合发起,当 前正在开发的下一代视频编码标准是高效视频编码(HEVC)。

存在用于编码/解码图像和视频的多个标准,包括H.264,其使用有 损压缩过程来产生二进制数据。例如,H.264包括用于获取残差数据的 预测操作,其后跟着DCT变换和对DCT系数的量化。然后,对包括量 化后的系数、运动矢量、编码模式和其他相关数据在内的产生的数据进 行熵编码以生成数据比特流,以供传输或存储在计算机可读介质上。可 以预期HEVC也将具有这些特征。

已经开发了多种编码方案来编码二进制数据。例如,使用Huffman 编码来编码JPEG图像。H.264标准允许两种可能的熵编码过程:上下文 自适应可变长度编码(CAVLC)或者上下文自适应二进制算术编码 (CABAC)。CABAC得到比CAVLC更大的压缩,但是CABAC具有更 高的计算需求。在这些情形中的任一情形中,编码方案对二进制数据进 行操作,以产生编码数据的顺序比特流。在解码器处,解码方案接收该 比特流,并且对该顺序比特流进行熵解码以重构该二进制数据。

提供改进的编码器、解码器以及熵编码方法和熵解码方法将是有利 的。

附图说明

现在参照附图作为示例,附图示出了本申请的示例实施例,在附图 中:

图1以框图形式示出了用于对视频进行编码的编码器;

图2以框图形式示出了用于对视频进行解码的解码器;

图3示出了编码过程的框图;

图4示出了编码器的示例实施例的简化框图;

图5示出了解码器的示例实施例的简化框图;

图6说明了针对4×4的系数块的zig-zag编码顺序;

图7图解示出了比特流的一部分;

图8以流程图的形式示出了对末位有效系数信息进行熵编码的示例 方法;

图9以流程图的形式示出了对编码数据的比特流进行熵解码以重构 量化后的变换域系数数据的示例方法;

图10以流程图的形式示出了对有效图进行编码的示例方法;以及

图11示出了对4×4的块中的系数的反对角线分组。

已经在不同的图中使用相同的参考标号以表示类似的组件。

具体实施方式

本发明描述了用于对二进制数据进行编码和解码的设备、方法和过 程。具体地,本申请描述了按照基于块的编码方案对末位有效系数位置 进行编码和解码的方法以及设备。

在一个方面,本申请描述了一种用于对包括末位有效系数信息的量 化后的变换域系数数据进行编码的方法。所述方法包括:对所述末位有 效系数的二维坐标的两个位置中的每个位置进行二进制化;确定所述两 个位置中的一个位置的每个二进制数的上下文;确定所述两个位置中的 另一个位置的每个二进制数的上下文,其中所述两个位置中的所述另一 个位置的每个二进制数的上下文部分地基于所述两个位置中的所述一个 位置;以及基于针对二进制化的位置的每个二进制数确定的上下文,对 所述二进制化的位置进行熵编码,以产生编码数据。

在另一方面,本申请描述了一种用于对编码数据的比特流进行解码 以重构量化后的变换域系数数据的方法。所述方法包括:对编码数据的 一部分进行熵解码,以产生定义末位有效系数的二维坐标的两个二进制 化的位置,其中对所述数据的所述部分进行熵解码包括确定所述两个二 进制化的位置中的一个位置的每个二进制数的上下文以及确定所述两个 二进制化的位置中的另一个位置的每个二进制数的上下文,其中所述两 个二进制化的位置中的所述另一个位置的每个二进制数的上下文部分地 基于所述两个二进制化的位置中的所述一个位置;基于所述末位有效系 数的二维坐标对有效系数序列进行熵解码;基于所述有效系数序列对级 别信息进行熵解码;以及使用所述级别信息和所述有效系数序列来重构 所述量化后的变换域系数数据。

在又一方面,本申请描述了存储计算机可执行程序指令的计算机可 读介质,所述程序在被执行时,配置处理器以执行所描述的编码方法和/ 或解码方法。

通过结合附图仔细阅读下面对示例的描述,本领域技术人员将理解 本申请的其他方面和特征。

下面的描述总体涉及数据压缩,具体地涉及对有限字母表源(诸如 二进制源)的有效的编码和解码。在下面给出的多个示例中,给出了这 种编码和解码机制的具体应用。例如,下面的示例说明中的多个参考了 视频编码。应该理解,本申请不一定限于视频编码或图像编码。其可以 适用于服从基于上下文的数据编码方案的任何类型的数据,该数据编码 方案是基于块的并且涉及发信号通知块中的末位有效比特或符号的位置。

本文描述的示例实施例涉及对有限字母表源的数据压缩。相应地, 描述经常提及“符号(symbol)”,该符号是字母表的元素。在某些情形 中,本文的描述提到二进制源,并且将符号称为比特。有时,针对给定 示例,术语“符号”和“比特”可以互换地使用。应该理解,二进制源仅是 有限字母表源的一个示例。本申请不限于二进制源。

在以下描述中,参考H.264标准描述了示例实施例。本领域技术人 员应该理解,本申请不限于H.264,而是可适用于其他视频编码/解码标 准,包括可能的将来的标准,如HEVC。还应该理解,本申请不必然局 限于视频编码/解码,并且可以适用于编码/解码任何有限字母表源。

现在参照图1,图1以框图形式示出了用于对视频进行编码的编码 器10。还参照图2,图2示出了用于对视频进行解码的解码器50的框图。 可以认识到,这里描述的编码器10和解码器50均可以在专用或通用计 算设备(包含一个或多个处理单元和存储器)上实现。编码器10或解码 器50执行的操作可以通过例如专用集成电路或通过通用处理器可执行 的存储的程序指令来实现,这视情况而定。设备可以包括附加软件,包 括例如用于控制基本设备功能的操作系统。关于以下描述,本领域技术 人员可以认识到在其中可以实现编码器10或解码器50的设备和平台的 范围。

编码器10接收视频源12并产生编码比特流14。解码器50接收编 码比特流14并输出解码视频帧16。编码器10和解码器50可以被配置 为符合多个视频压缩标准来操作。例如,编码器10和解码器50可以符 合H.264/AVC。在其他实施例中,编码器10和解码器50可以符合其他 视频压缩标准,包括诸如HEVC之类的H.264/AVC标准的演进。

编码器10包括空间预测器21、编码模式选择器20、变换处理器22、 量化器24和熵编码器26。本领域技术人员可以认识到,编码模式选择 器20确定视频源的适合编码模式,例如对象帧/片是I、P还是B类型, 帧/片内的特定宏块(或者编码单元)是帧间还是帧内编码。变换处理器 22对空间域数据执行变换。具体地,变换处理器22采用基于块的变换 来将空间域数据转换为频谱分量。例如,在许多实施例中,使用离散余 弦变换(DCT)。在一些实例中,可以使用其他变换,如离散正弦变换等 等。将基于块的变换应用于像素数据块得到变换域系数的集合。量化器 24对变换域系数的集合进行量化。然后,熵编码器26对量化后的系数 和关联信息(诸如运动矢量、量化参数等等)进行编码。

帧内编码的帧/片(即,类型I)不参照其他帧/片进行编码。换言之, 它们不采用时间预测。然而,帧内编码的帧依赖于帧/片内的空间预测, 如图1中通过空间预测器21进行说明。即,在对特定块进行编码时,可 以将块中的数据与针对该帧/片已经编码的块内的邻近像素的数据进行 比较。使用预测算法,可以将块的源数据转换为残差数据。然后,变换 处理器22对残差数据进行编码。例如,H.264规定了4×4变换块的9种 空间预测模式。在一些实施例中,这9种模式中的每一种可以用于独立 处理块,然后使用速率失真优化来选择最佳模式。

H.264标准还规定了使用运动预测/补偿来利用时间预测。相应地, 编码器10具有反馈环路,反馈环路包括:解量化器28、反变换处理器 30和解块处理器32。这些单元反映了解码器50实现以再现帧/片的解码 过程。帧存储器34用于存储再现帧。按照这种方式,运动预测基于在解 码器50处重构帧是什么,而不基于原始帧,由于编码/解码中涉及的有 损压缩,原始帧可能不同于重构帧。运动预测器36使用帧存储器34中 存储的帧/片作为源帧/片,来与当前帧进行比较,以识别相似块。相应 地,对于应用运动预测的宏块,变换处理器22编码的“源数据”是出自运 动预测过程的残差数据。残差数据是表示参考块与当前块之间的差异(如 果存在)的像素数据。关于参考帧和/或运动矢量的信息可以不由变换处 理器22和/或量化器24处理,而是可以提供给熵编码器26,以作为比特 流的一部分与量化后的系数一起编码。

本领域技术人员将认识到用于实现H.264编码器的细节和可能变型。

解码器50包括:熵解码器52、解量化器54、反变换处理器56、空 间补偿器57和解块处理器60。帧缓冲器58提供重构帧以便运动补偿器 62在应用运动补偿中使用。空间补偿器57表示根据先前解码块来恢复 特定帧内编码块的视频数据的操作。

熵解码器52接收并解码比特流14,以恢复量化后的系数。在熵解 码过程中,还可以恢复辅助信息,如果适用,一些辅助信息可以提供给 运动补偿环路,以用于运动补偿。例如,熵解码器52可以恢复运动矢量 和/或针对帧间编码宏块的参考帧信息。

然后,解量化器54对量化后的系数进行解量化,以产生变换域系 数,然后,反变换处理器56对变换域系数进行反变换,以重建“视频数 据”。可以认识到,在一些情况下,如对于帧内编码宏块,重建的“视频 数据”是相对于帧内的先前解码块的、用于空间补偿的残差数据。空间补 偿器57根据残差数据和来自先前解码块的像素数据来产生视频数据。在 其他情况下,如对于帧间编码宏块,来自反变换处理器56的重建“视频 数据”是相对于来自不同帧的参考块的、用于运动补偿的残差数据。这里, 空间和运动补偿均可以称为“预测操作”。

运动补偿器62在帧缓冲器58内定位专用于特定帧间编码宏块的参 考块。运动补偿器62基于专用于帧间编码宏块的参考帧信息和运动矢量 来进行该操作。然后,运动补偿器62提供参考块像素数据,以与残差数 据组合,得到针对该宏块的重建视频数据。

然后,可以对重构帧/片应用解块过程,如解块处理器60所示。在 解块之后,输出帧/片作为解码视频帧16,例如以在显示设备上显示。可 以理解,视频回放机(如计算机、机顶盒、DVD或蓝光播放器和/或移 动手持设备)可以在输出设备上显示之前将解码帧缓冲在存储器中。

熵编码是包括上文描述的视频压缩在内的所有无损和有损压缩方 案的基础部分。熵编码的目的是将推测的去相关的信号表示为比特序列, 其常常通过独立的但非恒等分布的过程来建模。用于实现此的技术必须 不依赖于去相关的信号的生成方式,而可以依赖于针对每个即将到来的 符号的有关概率估计。

实践中存在两种常用的熵编码方案:第一种是可变长度编码,其按 码字来识别输入符号或者输入序列;第二种是范围(或算术)编码,其 封装[0,1)间隔的子间隔的序列以达到单个间隔,根据其可以使用定义那 些间隔的概率分布来重构原始序列。典型地,范围编码方法倾向于提供 较好的压缩,而VLC方法有可能更快速。在任一情形下,输入序列的符 号都来自有限字母表。

熵编码的一种特殊情形是当输入字母表被限制为二进制符号时。此 处,HLC方案必须将输入符号归在一起以具有任何压缩可能,但是因为 概率分布可能在每个比特之后发生改变,所以有效的码构造是困难的。 因此,范围编码由于其较大的灵活性而被认为具有较大的压缩,但是其 实际应用因算术编码的较高的计算要求而受到妨碍。

这两种编码方案的共同挑战在于:它们天性上是顺序的。在一些重 要的实践应用中,如在高质量视频解码中,熵解码必须达到非常高的输 出速度,这会对具有有限处理功率或速度的设备造成问题。

与一些熵编码方案(如CAVLC和CABAC,两者都是H.264/AVC 中使用)一起使用的技术之一是上下文建模。利用上下文建模,输入序 列的每个比特具有上下文,其中该上下文可以由其他比特(诸如在它之 前的比特,或边信息,或二者)的某个子集来给出。在一阶上下文模型 中,上下文可以完全取决于先前的比特(符号)。在许多情形下,上下文 模型可以是自适应的,使得针对给定上下文的与符号关联的概率在该序 列的其他比特被处理时可以发生改变。在又一些情形中,给定比特的上 下文可以取决于其在序列中的位置,例如,系数在系数矩阵或块中的位 置或序号。

现在参考图3,其示出了示例编码过程100的框图。编码过程100 包括上下文建模组件104和熵编码器106。上下文建模组件104接收输 入序列x102,在该示例中其是比特序列(b0,b1,...,bn)。在该示例说明中, 上下文建模组件104:确定每个比特bi的上下文,该确定有可能基于序 列中的先前的一个或多个比特或者基于边信息;以及基于该上下文确定 与比特bi关联的概率pi,其中,该概率是该比特将是最小可能符号(LPS) 的概率。在二进制实施例中,取决于公约或应用,LPS可以是“0”或“1”。 该概率的确定本身可以取决于针对该相同上下文的先前的比特/符号。

上下文建模组件输出输入序列,即比特(b0,b1,...,bn)及其对应的 概率(P0,p1,...,Pn)。该概率是通过该上下文模型确定的估计概率。然后, 将该数据输入到熵编码器106,其使用该概率信息对该输入序列进行编 码。例如,熵编码器106可以是二进制算术编码器。熵编码器106输出 编码数据的比特流108。

应该理解,该输入序列的每个比特被顺序处理以更新上下文模型, 以及该连续的比特和概率信息被提供给熵编码器106,熵编码器106于 是顺序地对这些比特进行熵编码以创建比特流108。本领域技术人员将 明白,在一些实施例中,可能不从上下文建模组件104向熵编码器106 传递显式的概率信息;相反,在一些示例中,对于每个比特,上下文建 模组件104可以向熵编码器106发送反映由上下文建模组件104基于上 下文模型和输入序列102的当前上下文做出的概率估计的索引或其他指 示符。该索引或其他指示符指示与其对应比特关联的概率估计。

在一些实施例中,熵编码器106可以具有用于对输入序列102进行 编码的并行处理架构。在这种实施例中,熵编码器106可以包括多个熵 编码器,每个熵编码器处理输入序列102的一部分。在一些情形下,输 入序列可被解复用,并且基于与相应比特关联的估计概率在这些并行熵 编码器之间进行分配。换言之,来自输入序列102的比特可以基于其估 计概率而被分配给并行编码器之一。

在解码器处,使用逆过程对编码比特流进行解码。具体地,解码器 执行相同的上下文建模和概率估计过程,以确定重构序列的下一个重构 符号的上下文。基于针对下一个重构符号确定的上下文,确定估计概率。 对编码比特流(其可以由熵编码器输出的码字组成)进行解码,以获得 解码符号。上下文/概率的确定与对码字的解码交织在一起,以获得与那 些估计概率对应的解码符号。

在并行编码的实施例中,解码器可以配置为将编码比特流解复用成 多个解码子序列,每个解码子序列与一个估计概率相关联。上下文建模 和概率估计于是得到对来自关联的解码子序列的重构符号的选择。应该 理解,在这种实现中,对编码比特流的解码可被认为是根据上下文建模 和概率估计进行解交织。

根据下面的详细描述,应该理解本申请适用于串行或并行的熵编码 和解码。

本申请提出一种编码和解码过程,其中末位有效系数位置被编码, 并且其中位置的轴之一的上下文取决于另一轴。

下面的示例可能特别参考了视频编码,并且具体地参考了对如在 ITU-T H.264/AVC标准中规定的CABAC中定义的序列sig[i,j]和last[i, j]的编码。应该明白,本申请不限于对CABAC中的这两个特定序列的 编码和解码;也不限于视频编码和解码或者H.264/AVC标准。本申请描 述了可被应用到其他数据序列(包括视频、图像,以及在一些实例中, 包括音频)的编码和解码方法和过程。本文的方法和过程可以适用于涉 及上下文模型的编码和解码过程,所述上下文模型对末位有效系数位置 进行编码,以及在所述过程中位置被建模为二维的或者可被建模为二维 的。下面的示例可以参考作为示例的二进制源,尽管更一般性地讲,本 申请可适用于任何有限字母表源。

如上文描述的,示例视频和图像编码和解码过程利用基于块的变换 将残差数据从像素域转换到变换域。示例的基于块的变换是4x4DCT或 8x8DCT。在一些应用中,可以使用其他大小或类型的变换(DST或DFT 等)。然后,由量化器对变换数据的矩阵或集合进行量化,以产生量化后 的变换域系数的矩阵或集合。本申请可以将量化后的变换域系数的矩阵 称为矩阵、集合或块,其表示数据的有序集合,其中任何一个系数的位 置可以由二维坐标[x,y]来指定。

对量化后的变换域系数的块的熵编码基于上下文模型。例如,在 H.264/AVC中,通过对有效图的第一编码来对块进行熵编码。有效图包 括两个序列:last[i,j]和sig[i,j]。序列sig[i,j]是指示DCT块中的每个 位置上是否存在非零系数的二进制序列。另一序列last[i,j]是被映射到 DCT块的非零系数的并且指示该非零系数是否是DCT块的末位非零系 数的二进制序列(在H.264和其他变换域图像或视频编码方案中的 zig-zag扫描顺序中)。应该注意,索引[i,j]不是块中的二维坐标位置; 索引i是对块的索引,索引j是对下面描述的zig-zag扫描顺序中的一维 系数位置的索引。

H.264标准规定了zig-zag扫描顺序,用于对DCT块的系数进行编 码。例如参考4×4DCT块,H.264标准以图6所示的zig-zag顺序对16 个系数进行编码。如图6中所示,该扫描顺序开始于块的左上角,服从 zig-zag图案直到右下角。一旦以该编码顺序安排,针对第i个块所得的 系数序列是X(i,0),...,X(i,15)。

H.264/AVC标准使用其中顺序地对块进行编码的方案。换言之,依 次对每个序列X(i,0),...,X(i,15)进行编码。H.264/AVC中使用的上下文 模型包括:针对每个矢量X[i,j],确定两个二进制序列sig[i,j]和last[i,j]。 然后还对系数的实际值(称为级别)进行编码。

为了通过示例进行说明,考虑下面的示例系数序列X:

3,5,2,0,1,1,0,1,0,0,0,0,0,0,0,0  i0

6,4,0,3,3,0,1,0,0,0,0,0,0,0,0,0  i1

4,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0  i=2

针对这些系数序列的序列sig[i,j]和last[i,j]如下:

sig[0,j]=1,1,1,0,1,1,0,1

last[0,j]=0,0,0,    0,0,    1

sig[1,j]=1,1,0,1,1,0,1

last[1,j]=0,0,     0,0,    1

sig[2,j]=1,1,0,0,1

last[2,j]=0,0,           1

应该理解,last[i,j]序列仅包括sig[i,j]为非零时的值,并且两个序列 都在末位非零系数之后终止。相应地,last[i,j]将不一定包括针对sig[i,j] 中的每个比特j的比特。应该理解,这些序列的长度可以根据系数值而 变化。最后,应该理解,如果知道sig[i,j]序列是否包含非零比特,则将 知道在last[i,j]序列中是否存在对应的比特,这意味着对这些序列的编码 和解码是通过比特位置来交织的。

在H.264/AVC示例中,基于比特的上下文来确定比特的概率(有时 称为“状态”)。特别地,相同上下文的比特历史确定被选择或分配给该比 特的概率。例如,对于给定序列i中的第j个位置上的比特,其概率是 基于先前的序列(i-1,等等)中的第j个位置上的比特历史,从64个可 能概率中选择的。

如上文所述,基于比特的概率对比特进行编码。在一些示例实施例 中可以使用并行编码,以及在一些实例中,并行编码可以包括特定于每 个概率的熵编码器。在其他示例实施例中,可以使用串行熵编码。在任 一情形下,熵编码器基于符号关联的概率对符号进行编码。

在解码器处,在重构序列时,发生相同的上下文建模和概率估计。 概率估计被用于对编码比特流进行解码,以获得重构的符号。符号是从 编码比特流的解码出的部分中选择的,并且基于其关联的概率和上下文 模型进行交织以形成重构的符号序列。

在下表中阐述了使用CABAC的H.264/AVC中的残差块的语法:

表1

residual_block_cabac(coeffLevel,startIdx,endIdx,maxNumCoeff){ 描述符 if(maxNumCoeff!=64||ChromaArrayType==3) ae(v) coded_block_flag ae(v) for(i=0;i<maxNumCoeff;i++)   coeffLevel[i]=0   if(coded_block_flag){   numCoeff=endIdx+1   i=startIdx   while(i<numCoeff-1){   significant_coeff_flag[i] ae(v) if(significant_coeff_flag[i]){   last_significant_coeff_flag[i] ae(v) if(last_significant_coeff_flag[i])   numCoeff=i+1   }   i++   }   coeff_abs_level_minusl[numCoeff-1] ae(v) coeff_sign_flag[mumCoeff-1] ae(v) coeffLevel[numCoeff-1]=   (coeff_abs_level_minusl[numCoeff-1]+1)*   (1-2*coeffsign_flag[numCoeff-1])   for(i=numCoeff-2;i>=startIdx;i--)   if(significant_coeff_flag[i]){   coeff_abs_level_minusl[i] ae(v) coeff_sign_flag[i] ae(v) coeffLevel[i]=(coeffabs_level_minusl[i]+1)*   (1-2*coeff_sign_flag[i])   }   }   }  

上表提供了用于对包含sig[i,j]、last[i,j]和级别信息的比特流进行熵 解码的伪码。标识符“ae(v)”指示对来自比特流的比特进行熵解码以获得 在表中的该行中指示的值。

应该注意,在该语法中sig[i,j]和last[i,j]的比特被交织。例如, “if(coded_block_flag)”循环包含对来自sig[i,j]序列的比特的解码(称为 significant_coeff_flag[i]),其后跟着在significant_coeff_flag[i]比特 为非零时对来自last[i,j]序列的比特的解码(称为 last_significant_coeff_flag[i])。

还应该理解,该语法依赖于用以发信号通知在针对该块的zig-zag 扫描顺序中的末位有效系数的一维位置的序列。

根据本申请的一个方面,该语法被修改为发信号通知该块内的末位 有效系数的二维坐标。例如,在4×4块中,末位有效系数的位置具有x 坐标和y坐标,其中x和y的范围是在0和3之间。在该语法中可以传 送该坐标对,以替代last[i,j]序列。

产生的问题在于:如何有效且高效地编码末位有效系数的二维坐标。 另一问题在于:是否应该为了对该参数进行编码而对上下文模型进行改 动。

根据本申请的一个方面,依次对二维坐标进行编码,其中第一坐标 的值被部分用于确定对第二坐标进行编码的上下文。该概念是基于:如 已经根据经验观察到的,在坐标对的两个坐标的值之间存在某种程度的 相关性。X坐标的值趋向于对对应的y坐标的值的概率具有重要影响。 可以利用该关系来提高编码效率。

在根据本申请的一个方面的一个实施例中,使用固定长度编码来对 x坐标和y坐标进行二进制化。在其他实施例中,可以使用其他二进制 化方案。

根据本申请的另一方面,用于编码残差块的语法被进一步修改以包 括用于发信号通知末位有效系数是[0,0]处的DC系数的标记。这在实际 实现中并不是罕见事件,以及当在比特中发信号通知了该情况时,比特 流可以在那些情况下放弃包括末位有效系数的x坐标和y坐标,由此提 高压缩效率。

在此处的描述中,术语“位置”有时可被用于指代x坐标或y坐标, 根据具体情况而定。

尽管下文描述的示例实施例规定了用于对y位置的比特进行编码的 上下文是部分基于x位置的值的,但是该顺序是任意的。在另一实施例 中,用于对x位置进行编码的上下文可以部分基于y位置的值。

在下表中阐述了根据本申请的一个方面的用于对残差块进行编码 的语法的一个示例实施例:

表2

根据上述伪码,应该注意,解码器初始化x位置(last_pos_x=0)和y 位置(last_pos_y=0)的值,然后读取发信号通知末位有效系数是DC系数 的标记(last_0_flag)。如果该last_0_flag没有指示末位有效系数是在[0,0] 处,则仅执行紧跟其后的循环。在该情形下,解码器然后从该比特流中 读取last_pos_x和last_pos_y的值。

还应该注意,在该实施例中,如果last_pos_x值为0,则y位置被 编码为其值减1,因为由于该标记设置,已知该情况下二维位置不可能 是[0,0],所以y位置必须是1或者更大。由于该编码语法,如果last_pos_x 被设为0,则last_pos_y的值加1,以将其恢复到其实际值。在该特定情 形下出于编码目的而使last_pos_y减1是为了提高熵编码的效率的目的。

在已经读取二维坐标之后,解码器继续从比特流中读取 significant_coeff_flag[i]序列。使用用于将索引映射到坐标位置的zigzag 表,索引[i]设置当前的pos_x和pos_y值。当pos_x和pos_y的值分 别与last_pos_x和last_pos_y的值匹配时,last_significent_coeff_flag被 设置为使得停止对sig[i,j]序列的读取,该sig[i,j]序列被逐比特读取为 significant_coeff_flag[i]。

现在参考图7,其通过图解说明了根据本申请的一个方面创建的比 特流200的结构。图7说明的比特流200的部分示出了与残差块有关的 数据。所示的比特流200的部分是在熵编码之前或者在熵解码之后的比 特流。该熵编码可以包括CABAC、CAVLC或者其他基于上下文的熵编 码方案。

首位标记是coded_block_flag。该标记后跟着用于发信号通知末位 有效系数坐标[0,0]的last_0_flag。然后,假定没有设置last_0_flag,则比 特流200包括last_pos_x和last_pos_y的值。在那之后是sig[i,j]序列, 即有效系数序列。最后,比特流200的该部分包括级别信息。应该理解, 在设置了last_0_flag的情况下,last_pos_x、last_pos_y和有效系数序列 被省略。

在一个实施例中,使用固定长度二进制化对last_pos_x和last_pos_y 的值进行二进制化。这些二进制值的长度取决于变换矩阵的大小,即量 化后的变换域系数的块的大小。

现在参考图8,其示出了用于在编码残差块时对末位有效系数进行 编码的示例方法300。该示例方法300包括操作302,确定末位有效系数 坐标。对于NxN的变换块大小,这些坐标可以是范围从0到N-1的x 坐标和y坐标。这些坐标可被称为x位置和y位置。

在操作304中,对这两个位置进行二进制化。如上文提到的,可以 使用固定长度二进制化来对所述位置进行二进制化。二进制化后的位置 的长度可以是Log2(N)。在其他实施例中可以使用其他二进制化方案。

对二进制化的位置的熵编码包括:确定二进制化的位置的每个二进 制数的上下文。相应地,在操作306中,确定所述位置中的一个位置的 每个二进制数的上下文。出于示例实施例的目的,可以将x位置视为要 编码的第一位置。二进制化的x位置的每个二进制数的上下文可以基于 众多因素。例如,在一个实施例中,x位置的每个二进制数的上下文可 以基于变换矩阵的大小。该x位置的先前的二进制数(如果存在的话) 也会影响该x位置的后续的二进制数的上下文。

在操作308中,然后确定所述位置中的另一个位置(本示例中是y 位置)的每个二进制数的上下文。在确定y位置的二进制数的上下文时, 该上下文部分基于x位置的值。y位置的二进制数的上下文也可以部分 取决于变换矩阵的大小和该y位置的先前的二进制数(如果存在的话)。

在操作310中,然后根据在步骤306和308中确定的位置所关联的 上下文来对二进制化的位置进行熵编码。该熵编码可以包括CABAC、 CAVLC或者任何其他合适的基于上下文的熵编码方案。

现在将参考图9,其示出了描述用于对编码数据的比特流进行解码 以重构量化后的变换域系数数据的方法400的流程图。图9中说明的示 例方法400包括使用与此处描述的语法类似的语法来处理编码数据的比 特流。在操作402中,对比特流的一部分进行熵解码,以恢复定义末位 有效系数的二维坐标的两个二进制化的位置。该操作包括:确定位置中 的第一位置(例如,在一个实施例中是x位置)的每个二进制数的上下 文。该上下文例如可以取决于变换矩阵的大小和先前解码出的该x位置 的二进制数(如果存在的话)。基于每个二进制数的上下文,以及因此基 于关联的估计概率,对比特流的熵解码确定能导致重构二进制化的x位 置的二进制数。

操作402还包括:确定另一个位置(在本示例中是y位置)的每个 二进制数的上下文。y位置的每个二进制数的上下文可以基于变换矩阵 的大小和该y位置的先前的二进制数(如果存在的话),但是其还基于该 x位置的值。根据所确定的每个二进制数的上下文及其因此估计的概率 对比特流进行熵编码导致对二进制化的y位置的重构。

在操作404中,使用x位置和y位置对来自比特流的有效系数序列 进行熵解码。在操作406中,使用熵解码,从比特流中恢复出级别信息。 在操作408中,将有效系数序列和级别信息一起用于重构量化后的变换 域系数数据。

在一个示例实现中,通过下式给出x位置(如果其是二维坐标中的 要首先编码的那个)的二进制数的上下文:

ctxIdxInc=binCtxOffset+binCtxInc

在该表达式中,ctxIdxInc是last_pos_x的给定二进制数的上下文索 引。变量binCtxOffset是基于变换大小的上下文偏移。在一个实施例中, 该偏移是根据下表确定的:

log2TrafoSize binCtxOffset 2 0 3 3 4 10 5 17

在该示例中,,log2TrafoSize是变换矩阵大小的以2为底的对数, 即log2(N)。

上述针对上下文索引的表达式中的另一变量是binCtxInc,其代表基 于last_pos_x中的之前的二进制数的值(如果存在的话)所施加的上下 文索引增量。例如,可以根据下表确定binCtxInc变量:

在该示例中,binIdx是last_pos_x中的二进制数的索引,以及b0和 b1分别是索引0和1处的last_pos_x二进制序列中的二进制数。

在一个示例实施例中,last_pos_y的二进制数的上下文可以根据下 面的表达式来确定:

ctxIdxInc=binCtxOffset0+3*binCtxOffset1+binCtxInc

在该情形下,last_pos_y的二进制数的上下文取决于变换矩阵的大 小、last_pos_y的先前的二进制数(如果存在的话),并且取决于last_pos_x 的值。特别地,变换矩阵通过变量binCtxOffset0影响上下文,在一些实 施例中变量binCtxOffset0可以根据下表来确定:

log2TrafoSize binCtxOffset0 2 0 3 9 4 21 5 35

解码出的last_pos_y的二进制数可以通过变量binCtxInc影响上下文, 在一些实施例中变量binCtxInc可以根据下表来确定:

在该示例中,应该注意,仅索引0处的第一个二进制数会影响 last_pos_y的任意其他二进制数的上下文。

最后,last_pos_x的值可以通过变量binCtxOffset1影响last_pos_y 的二进制数的上下文,该变量binCtxOffset1可以通过下述方式来确定:

If last_pos_x==0

binCtxOffset1=0

Otherwise

binCtxOffset1=Floor(Log2(last_pos_x))+1

应该明白,前述示例仅是一个示例实现,其中last_pos_y的二进制 数的上下文取决于last_pos_x的值。应该理解,可以利用根据经验设计 的适合特定应用的特定的表和上下文偏移来实现各种其他实现。

上下文索引的含义可以取决于量化参数(QP)的值。也即,利用不 同QP,可以使用不同上下文对相同语法进行编码。而且,这些上下文可 以共享相同的上下文索引。在一个示例实施例中,last_pos_x可以通过 Huffman编码来进行编码。对应的Huffman树可以取决于QP的值。用 于对last_pos_x的二进制数进行编码的上下文可以取决于Huffman树, 并且由此因不同的QP而不同。例如,如果针对每个QP使用一个上下 文,则这些上下文可以共享相同的索引0但具有不同的含义。

在备选实现中,不是对二维笛卡尔坐标x和y进行编码,而是由系 数所在的逆对角线和系数在该线上的相对位置来表示末位有效系数位置。 参考图11,图11通过图解说明了4×4的系数块600。在块600中示出了 逆对角线602。应该注意,存在7个逆对角线,其索引为0到6。线0和 6仅具有单个位置,其分别对应于x,y坐标[0,0]和[3,3]。其他逆对 角线602均具有2到4个位置。可以根据扫描顺序的约定来对位置编制 索引。也即,对逆对角线上的位置的编制索引可以交替地逐条线地按照 线的方向进行。因此,4×4的块中的每个坐标的表示可被表达为如下所 示的基于逆对角线的二维坐标[a,b]:

[0,0] [1,0] [2,2] [3,0]

[1,1] [2,1] [3,1] [4,2]

[2,0] [3,2] [4,1] [5,0]

[3,3] [4,0] [5,1] [6,0]

应该注意,末位位置[0,0]和[6,0]可以单独由其逆对角线号码来编码, 因为不需要指定用于该线上的位置的第二坐标。

[a,b]的值可以以与上文针对二维坐标x和y描述的方式类似的方 式来编码。针对逆对角线索引a的编码二进制数的总数是log2(2N-1)。 针对系数在线上的位置b的编码二进制数的数目取决于值a,并且对于a <N,a是1+log2(a),以及对于a≥N,是1+log2(2(N-1)-a)。用于对每个 二进制数进行编码/解码的上下文基于先前编码/解码出的二进制数的值。

在另一备选实现中,编码器对末位有效位置的关于系数扫描顺序的 一维坐标进行编码,而不是对末位有效系数位置的二维坐标进行编码。 系数扫描顺序可以是按照H.264中使用的zig-zag顺序,或者是按照在其 他变换域图像或视频编码方案中使用的任何自适应的或非自适应的扫描 顺序。在该实现中,替代last_pos_x和last_pos_y,编码器仅对last_pos 进行编码,last_pos的范围是从0到(N*N-1),其中N是变换域系数的 块的大小。如果在语法中使用了last_0_flag,则last_pos的范围不需要包 括0。在一些情形下,last_pos可以自动递减,使得解码器知道其必须给 last_pos的值加1以得到末位有效系数位置的实际的一维坐标。

last_pos的值可以以与上述针对二维坐标之一x所描述的方式类似 的方式进行编码。针对一维坐标last_pos的编码二进制数的总数是 2log2(N)。用于对每个二进制数进行编码/解码的上下文基于先前编码/解 码的二进制数的值。

应该注意,在示例实现中,针对二维(或一维)末位有效系数位置 的编码二进制数的数目在最差情况下的值是在log2(N)的量级,其远小于 N*N(即针对传统的last[i,j]序列的编码二进制数的数目在最差情况下的 值),由此降低了熵编码引擎实现的复杂度。

在本申请的又一方面,仅对于特定的块,使用上文描述的末位位置 编码过程可能是有利的。具体地,对于具有比预设的数目更多的系数的 块,该过程可能是有利的。具有较少的系数的块可能使用早先描述的传 统的交织型sig[i,j]和last[i,j]语法进行编码更加高效。相应地,在一个实 施例中,编码器确定块中的非零(NNZ)系数的数目,并且,如果NNZ 小于阈值,则使用传统语法对sig[i,j]和last[i,j]序列进行编码。该阈值可 以预设为2或3,或者任何其他合适的值。如果NNZ等于或大于该阈值, 则编码器使用上文描述的二维(或一维)末位有效系数位置编码过程。

该语法可被适配为包括用于向解码器发信号通知块的NNZ系数是 否小于阈值的标记。这也发信号通知编码器使用哪个有效图编码过程。 在一些实例中,可以消除last_0_flag,因为在传统的有效图编码过程中 对仅有DC的块的发信号通知是相当有效的。

现在参考图10,图10以简化流程图的形式示出了对有效图进行编 码的方法500。方法500是针对量化后的变换域系数的每个块执行的。 其包括:在操作502中确定块中的NNZ系数。在操作504中,将NNZ 系数与预设阈值进行比较。如果NNZ系数小于阈值,则如操作506中 所示,编码器使用传统的交织型有效图编码。如果NNZ系数等于或大 于阈值,则在操作508中编码器如上所述对末位位置坐标进行编码。

应该明白,前述示例方法是对诸如H.264中描述的那些之类的用于 编码和解码有效图的特定示例应用的说明。本申请不限于那些特定示例 应用。

现在参考图4,图4示出了编码器900的示例实施例的简化框图。 编码器900包括:处理器902、存储器904和编码应用906。编码应用 906可以包括存储在存储器904中并包含指令的计算机程序或应用,所 述指令用于将处理器902配置为执行诸如这里描述的之类的步骤或操作。 例如,编码应用906可以编码并输出根据这里描述的末位有效系数位置 编码过程所编码的比特流。编码应用906可以包括:熵编码器26,被配 置使用此处描述的一个或多个过程对输入序列进行熵编码并且输出比特 流。可以理解,编码应用906可以存储在计算机可读介质上,如致密光 盘、闪存设备、随机存取存储器、硬盘等等。

在一些实施例中,编码器900中的处理器902可以是单个处理单元, 配置为实现编码应用906的指令。还应该明白,在一些实例中,编码应 用906和一个或多个处理单元的一些或全部操作可以通过专用集成电路 (ASIC)等来实现。

现在还参照图5,图5示出了解码器1000的示例实施例的简化框图。 解码器1000包括:处理器1002、存储器1004和解码应用1006。解码应 用1006可以包括存储在存储器1004中并包含指令的计算机程序或应用, 所述指令用于将处理器1002配置为执行诸如这里描述的之类的步骤或 操作。解码应用1006可以包括:熵解码器1008,配置为接收根据此处 描述的末位有效系数位置编码过程编码的比特流,以及使用用于解码比 特流的末位有效系数位置上下文建模过程来重构量化后的变换域系数数 据。可以理解,解码应用1006可以存储在计算机可读介质上,如致密光 盘、闪存设备、随机存取存储器、硬盘等等。

在一些实施例中,解码器1000中的处理器1002可以是单个处理单 元,配置为实现解码应用1006的指令。在一些实施例中,处理器1002 可以包括能够并行地执行指令的不止一个处理单元。多个处理单元可以 是逻辑上或物理上分离的处理单元。还应该明白,在一些实例中,解码 应用1006和一个或多个处理单元的一些或全部操作可以通过专用集成 电路(ASIC)等来实现。

可以认识到,根据本申请的解码器和/或编码器可以在多个计算设备 中实现,包括但不限于服务器、合适编程的通用计算机、电视机顶盒、 电视广播设备和移动设备。可以通过包含指令的软件来实现解码器或编 码器,所述指令用于将处理器配置为执行这里描述的功能。软件指令可 以存储在任何合适的计算机可读存储器上,包括CD、RAM、ROM、闪 存等等。

可以理解,这里描述的编码器和解码器以及实现所描述的用于配置 编码器的方法/过程的模块、例程、进程、线程或其他软件组件可以使用 标准计算机编程技术和语言来实现。本申请不限于特定处理器、计算机 语言、计算机编程惯例、数据结构、其他这种实现细节。本领域技术人 员将认识到,可以将所描述的过程实现为存储在易失性或非易失性存储 器中的计算机可执行代码的一部分、专用集成芯片(ASIC)的一部分等。

可以对所描述的实施例进行特定适配和修改。因此,上述实施例被 认为是示意性而非限制性。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号