视频编码中的残差变换及逆向变换系统和方法与流程

文档序号:15286534发布日期:2018-08-29 00:08阅读:888来源:国知局

本申请是先前提交的第pct/cn2015/075599号pct申请的部分延续,该申请于2015年3月31日提交,并且发明名称为“视频编码中的残差变换及逆向变换系统和方法(residualtransformationandinversetransformationinvideocodingsystemsandmethods)”(代理人文件号:real-2015697),该申请的整体公开出于所有目的通过引用并入本文。



背景技术:

诸如数字图像、语音/音频、图形和视频的数字多媒体的出现已显著改善了各种应用,并开启了全新的应用,因为其对容易地实现了对内容的可靠的存储、通信、传输和搜索和访问。总的来说,数字多媒体的应用已经很多,其包括娱乐、信息、医药和安全等的广泛领域,并且以多种方式使社会受益。由诸如摄像机和麦克风的传感器捕获的多媒体通常是模拟的,并且以脉冲编码调制(pcm)形式的数字化过程将其呈现为数字化的。然而,就在数字化之后,所产生的数据量可为非常显著的,因为这对重建扬声器和/或电视显示器所需的模拟表示所必需的。因此,大量数字多媒体内容的有效通信、存储或传输需要从原始pcm形式压缩成经压缩的表示。因此,用于多媒体压缩的许多技术已被发明。多年来,视频压缩技术的发展非常复杂,以至于它们通常可实现10至100之间的高压缩比,同时保持了高心里视觉品质,这通常与未经压缩的数字视频相似。

尽管迄今为止在视频压缩的技术领域和科学方面(如由诸如mpeg-1、mpeg-2、h.263、mpeg-4第2部分、mpeg-4avc/h.264、mpeg-4svc和mvc以及诸如windows媒体视频、realvideo、on2vp等行业驱动的专有标准)已取得了巨大进步,但消费者对更高品质、更高清晰度、以及现在的3d(立体声)视频的需求日益增加,随时随地的访问都需要经由各种方式(如dvd/bd、无线广播、有线/卫星、有线和移动网络)输送到一系列客户端设备(诸如pc/笔记本电脑、电视机、机顶盒、游戏机、便携式媒体播放器/设备、智能手机和可穿戴计算设备),而这激发了对更高级的视频压缩的需求。在标准体驱动标准中,isompeg在高效视频编码(hevc)方面最近开展的工作就证明了这一点,而其有望将新技术贡献与来自由itu-t标准委员会在h.265视频压缩方面的多年探索性工作的技术结合起来。

所有上述的标准采用通用帧间预测编码框架,其涉及通过补偿视频帧之间的运动来减少时间冗余。基本概念是通过使用块匹配方法去除相邻图片之间的时间依赖性。在编码处理开始时,未编码视频序列的每个帧被分为三类:i型帧、p型帧和b型帧。i型帧是帧内编码的。也就是说,只有来自帧本身的信息被用于对图片进行编码,并且没有帧间运动补偿技术被使用(尽管帧内运动补偿技术可被应用)。

另外两种类型的帧(p型和b型)是使用帧间运动补偿技术和帧内预测技术这两者进行编码的。p图片与b图片之间的差异是用于运动补偿的基准图片的时间方向。p型图片(以显示顺序)利用来自先前图片的信息,而b型图片可以显示顺序利用来自先前图片和未来图片这两者的信息。

对于p型帧和b型帧而言,每个帧然后被划分成由每个像素的亮度和色度分量的系数表示的像素块;如果块并不是帧内编码的,则针对每个块获得一个或多个运动矢量(因为b型图片可利用来自未来经编码的帧和过去经编码的帧这两者的信息,所以针对每个块,两个运动矢量可被编码)。运动矢量(mv)表示从当前块的位置到另一先前经编码的帧(其可为显示顺序中的过去或未来帧)中的相似块的位置的空间位移,而它们分别被称为基准块和基准帧。基准块与当前块之间的差值(如果有的话)被确定,并且残差(也称为“残差信号”)被获得。因此,对于帧间编码的帧的每个块,只需要对残差和运动矢量进行编码,而不是块的全部内容。通过消除视频序列的帧之间的这种时间冗余,可压缩视频序列。

为了进一步压缩视频数据,在帧间或帧内预测技术已被应用之后,残差信号的系数通常从空间域变换到频域(例如,使用离散余弦变换(“dct”)或离散正弦变换(“dst”))。对于自然出现的图像(如通常构成人类可感知视频序列的图像类型)而言,低频能量总是比高频能量强。频域中的残差信号因此比空间域中的残差信号得到更好的能量压缩。在正向变换之后,系数和运动矢量可在被分组化或以其它方式处理之前被量化和熵编码,例如,以用于通过如因特网的网络传输。

熵编码是一种无损数据压缩方案,而其与介质的具体特性无关。熵编码的主要类型中的一种创建唯一无前缀代码,并将创建的唯一无前缀代码分配给在编码器的输入处出现的每个唯一符号。这些熵编码器然后通过用对应的长度可变的无前缀输出代码字替换每个固定长度的输入符号来对数据进行压缩。每个代码字的长度近似地与概率的负对数成正比。因此,最常用的符号使用最短的代码。霍夫曼编码是通常用于无损数据压缩的特定类型的最佳前缀代码。来自霍夫曼算法的输出可被看作是用于对源符号进行编码的长度可变的代码表。霍夫曼算法根据源符号的每个可能值发生的估计概率或频率(权重)来推导出该表。

在解码器侧,逆量化和逆向变换被应用以恢复空间残差信号。这些是许多视频压缩标准中的典型变换/量化处理。反向预测处理然后可被执行以生成原始的未编码视频序列的重建版本。

在过去的标准中,编码中使用的块一般为16×16像素(在许多视频编码标准中称为宏块)。然而,自这些标准的发展以来,帧尺寸已变得越来越大,并且许多设备已获得高于“高清晰度”(或“hd”)帧尺寸(如2048×1530像素)的显示能力。因此,可能期望具有较大的块来有效地对这些帧尺寸(例如,64×64像素)的运动矢量进行编码。由此可见,还期望增加从空间域变换到频域的残差信号的块的尺寸。



技术实现要素:

本发明的一个方面为一种对未编码视频帧进行编码以生成代表所述未编码视频帧的经编码比特流的视频编码器设备实现的方法,其中,所述经编码比特流至少包括代码块头部和视频数据负载,所述视频编码器设备实现的方法包括以下步骤:获得表示所述未编码视频帧的一部分的图像数据的代码块,其中,所述代码块包括多个系数块,所述多个系数块中的每个系数块包含多个系数;获得与所述多个系数块对应的系数块模式代码字;生成所述经编码比特流的所述代码块头部,其中,所述代码块头部包括所述系数块模式代码字;以及生成所述经编码比特流的所述视频数据负载,其中,如果所述多个系数块中的第一系数块的第一系数具有非零值,则所述视频数据负载包括与所述第一系数块对应的描述符代码字和与所述第一系数块对应的级别代码字。

本发明的另一个方面为一种对未编码视频帧进行编码以生成代表所述未编码视频帧的经编码比特流的视频编码器设备实现的方法,其中,所述经编码比特流至少包括代码块头部和视频数据负载,所述视频编码器设备实现的方法包括以下步骤:获得表示所述未编码视频帧的一部分的图像数据的代码块,其中,所述代码块包括多个系数块集合,每个系数块集合包括多个系数块,所述多个系数块中的每个包含多个系数;获得多个代码块模式代码字,其中,所述多个代码块模式代码字中的每个与所述多个系数块集中的一个对应;生成所述经编码比特流的所述代码块头部,其中,所述代码块头部包括所述多个代码块模式代码字;以及生成所述经编码比特流的所述视频数据负载,其中,如果所述多个系数块中的第一系数块集合的第一系数块的第一系数具有非零值,则所述视频数据负载至少包括与所述第一系数块对应的描述符代码字和与所述第一系数块对应的级别代码字。

附图说明

图1示出了根据一个实施方式的示例性视频编码/解码系统。

图2示出了根据一个实施方式的示例性编码设备的若干部件。

图3示出了根据一个实施方式的示例性解码设备的若干部件。

图4示出了根据至少一个实施方式的示例性视频编码器的框图。

图5a和图5b是示出根据至少一个实施方式的熵块尺寸与相关联的系数块尺寸之间的关系的框图。

图6示出了根据至少一个实施方式的示例性视频解码器的框图。

图7示出了根据至少一个实施方式的变换-块-处理例程。

图8示出了根据至少一个实施方式的变换-块-尺寸-选择子例程。

图9示出了根据至少一个实施方式的正向-整数-变换子例程。

图10示出了根据至少一个实施方式的代码块熵编码例程。

图11示出了根据至少一个实施方式的熵块尺寸选择子例程。

图12示出了根据至少一个实施方式的变换-块-恢复例程。

图13示出了根据至少一个实施方式的逆-整数-变换子例程。

具体实施方式

下面的详细描述主要以传统计算机组件的操作的处理和符号表示的方式呈现,其中,该传统计算机组件包括处理器、用于处理器的记忆存储设备、所连接的显示设备,以及输入设备。此外,这些处理和操作可利用异构分布式计算环境中的传统计算机组件,其中,其包括远程文件服务器、计算机服务器和记忆存储设备。这些传统分布式计算组件中的每个都可由处理器通过通信网络来访问。

短语“在一个实施方式中”、“在至少一个实施方式中”、“在各种实施方式中”、“在某些实施方式中”等可在本文中重复使用。这种短语不一定指示相同的实施方式。除非上下文另有规定,否则术语“包括”、“具有”和“包含”是同义的。在典型的“混合”视频编码方案的上下文中描述了各种实施方式,而如上面一般性描述的,典型的“混合”视频编码方案使用帧内/帧间-图片预测和变换编码。

下面具体参照如附图中所示的实施方式的描述。尽管结合附图和相关描述来描述了实施方式,但是本领域的普通技术人员将认识到,替代性实现和/或等同实现可替代所示出和描述的具体实施方式,无论是否明确示出和/或描述,在不脱离本公开的范围的情况下,其包括所有替代、修改和等同物。在各种替代性实施方式中,附加设备或所示设备的组合可被添加或组合,而不是使范围受限于本文中所公开的实施方式。

示例性视频编码/解码系统

图1示出了根据至少一个实施方式的示例性视频编码/解码系统100。编码设备200(在图2中示出并在下文中描述)和解码设备300(在图3中示出并在下文中描述)与网络104进行数据通信。解码设备200可通过如存储区域网络(“san”)的直接数据连接、高速串行总线和/或经由其它适当的通信技术或经由网络104(如图1中的虚线所指示)与未编码视频源108进行数据通信。相似地,编码设备300可通过如存储区域网络(“san”)的直接数据连接、高速串行总线和/或经由其它适当的通信技术或经由网络104(如图1中的虚线所指示)与可选编码视频源112进行数据通信。在某些实施方式中,编码设备200、解码设备300、编码视频源112和/或未编码视频源108可包括一个或多个复制式和/或分布式物理或逻辑设备。在许多实施方式中,可存在比图示更多的编码设备200、解码设备300、未编码视频源108和/或编码视频源112。

在各种实施方式中,编码设备200可以是联网计算设备,其通常能够通过网络104从解码设备300接受请求并且相应地提供响应。在各种实施方式中,解码设备300可以是具有如下外形因素的联网计算设备,诸如:移动电话、手表、抬头显示器或其它可穿戴计算设备、专用媒体播放器、计算平板电脑、机动车头部单元、音视频点播(avod)系统、专用媒体控制台、游戏设备、“机顶盒”、数字录像机、电视机或通用计算机。在各种实施方式中,网络104可包括因特网、一个或多个局域网(“lan”)、一个或多个广域网(“wan”)、蜂窝数据网络和/或其它数据网络。网络104可在各个点处是有线和/或无线网络。

示例性编码设备

参照图2,其示出了示例性编码设备200的若干组件。在某些实施方式中,编码设备可包括比图2中所示更多的组件。然而,不一定要示出所有这些通常的传统组件来公开示意性实施方式。如图2中所示,示例性编码设备200包括用于连接到网络(如网络104)的网络接口204。示例性编码设备200还包括处理单元208、存储器212、可选用户输入装置214(例如,字母数字键盘、小键盘、鼠标或其它指示装置、触摸屏和/或麦克风)以及可选显示器216,其中,上述所有均通过总线220与网络接口204相互连接。存储器212通常包括ram、rom以及诸如磁盘驱动器、闪存等永久性大容量存储设备。

示例性编码设备200的存储器212存储操作系统224以及用于多个软件服务的程序代码,如软件实现的帧间视频编码器400(在下文中参照图4描述),而其具有用于执行变换-块-处理例程600(在下文中参照图6描述)和/或代码块熵编码例程1100(在下文中参照图11描述)的指令。存储器212还可存储视频数据文件(未示出),其中,该视频数据文件可表示音频/视频媒体作品(举例来说,如电影和/或电视剧)的未编码的副本。这些软件部件和其它软件部件可使用与非暂时性计算机可读介质232(诸如软盘、磁带、dvd/cd-rom驱动器、usb驱动器、存储卡等)相关联的驱动机构(未示出)来加载到编码设备200的存储器212中。

在操作中,操作系统224对编码设备200的硬件和其它软件资源进行管理,并为软件应用(如软件实现的帧间视频编码器400)提供公共服务。对于诸如经由网络接口204的网络通信、经由输入装置214的数据接收、经由可选显示器216的数据输出、以及对于各种软件应用(如软件实现的帧间视频编码器400)的存储器212分配的硬件功能,操作系统224充当硬件与编码设备上所运行的软件之间的媒介。

在某些实施方式中,编码设备200还可包括用于与未编码视频源108进行通信的专用未编码视频接口236,如高速串行总线等。在某些实施方式中,编码设备200可经由网络接口204与未编码视频源108进行通信。在其它实施方式中,未编码视频源108可驻留在存储器212或计算机可读介质232中。

尽管已对一般符合传统通用计算设备的示例性编码设备200进行了描述,但是编码设备200可以是能够执行根据各种实施方式的用于对视频进行编码的指令的大量设备中的任一种(诸如,示例性软件实现的视频编码器400和变换-块-处理例程600),例如,视频记录设备、视频协同处理器和/或加速器、个人计算机、游戏控制台、机顶盒、手持或可穿戴计算设备、智能手机或任何其它适当的设备。

举例来说,编码设备200可以操作为促进点播媒体服务(未示出)。在至少一个示例性实施方式中,点播媒体服务可操作编码设备200来促进在线点播媒体商店,其中,在线点播媒体商店以作品和/或订阅为单位向用户提供媒体作品的数字副本(如视频内容)。点播媒体服务可从未编码视频源108获得这种媒体作品的数字副本。

示例性解码设备

参照图3,示出了示例性解码设备300的若干组件。在某些实施方式中,解码设备可包括比图3中所示更多的组件。然而,不一定要示出所有这些通常的传统组件来公开示意性实施方式。如图3所示,示例性解码设备300包括用于连接到网络(如网络104)的网络接口304。示例性解码设备300还包括处理单元308、存储器312、可选用户输入装置314(例如,字母数字键盘、小键盘、鼠标或其它指示装置、触摸屏和/或麦克风)、可选显示器316以及可选扬声器318,其中,上述所有均通过总线320与网络接口304相互连接。存储器312通常包括ram、rom以及诸如磁盘驱动器、闪存等永久性大容量存储设备。

示例性解码设备300的存储器312可存储操作系统324以及用于多个软件服务的程序代码,如软件实现的视频解码器500(在下文中参照图5描述),而其具有用于执行变换-块-恢复例程1000(在下文中参照图10描述)的指令。存储器312还可存储视频数据文件(未示出),其中,该视频数据文件可表示音频/视频媒体作品(举例来说,如电影和/或电视剧)的编码的副本。这些软件部件和其它软件部件可使用与非暂时性计算机可读介质332(诸如软盘、磁带、dvd/cd-rom驱动器、存储卡等)相关联的驱动机构(未示出)来加载到解码设备300的存储器312中。

在操作中,操作系统324对解码设备300的硬件和其它软件资源进行管理,并为软件应用(如软件实现的视频解码器500)提供公共服务。对于诸如经由网络接口304的网络通信、经由输入装置314的数据接收、经由显示器316和/或可选扬声器314的数据输出、以及存储器312的分配的硬件功能,操作系统324充当硬件与编码设备上所运行的软件之间的媒介。

在某些实施方式中,解码设备300可包括例如用于与编码视频源116进行通信的可选编码视频接口336,如高速串行总线等。在某些实施方式中,解码设备300可经由网络接口304与编码视频源(如编码视频源116)进行通信。在其它实施方式中,编码视频源116可驻留在存储器312或计算机可读介质332中。

尽管已对一般符合传统通用计算设备的示例性解码设备300进行了描述,但是解码设备300可以是能够执行根据各种实施方式的用于对视频进行解码的指令的大量设备中的任一种(诸如,示例性软件实现的视频解码器500和变换-块-恢复例程1000),例如,视频记录设备、视频协同处理器和/或加速器、个人计算机、游戏机、机顶盒、手持或可穿戴计算设备、智能手机或任何其它适当的设备。

举例来说,解码设备300可与点播媒体服务协同操作。在至少一个示例性实施方式中,点播媒体服务可以作品和/或订阅为单位向用户操作的解码设备300提供媒体作品的数字副本(如视频内容)。解码设备可通过网络104例如经由编码设备200从未编码视频源108获得这种媒体作品的数字副本。

软件实现的视频编码器

图4示出了根据至少一个实施方式的采用残差变换技术的软件实现的视频编码器400(以下称为“编码器400”)的通用功能框图。可将显示顺序中的视频序列的一个或多个未编码视频帧(vidfrms)提供至排序器404。

排序器404可将预测编码图片类型(例如i、p或b)分配给每个未编码视频帧,并且将帧的序列或帧的序列中的帧组重新排序成用于运动预测目的的编码顺序(例如,i型帧之后是p型帧,然后是b型帧)。然后,排序的未编码视频帧(seqfrms)可按照编码顺序输入到块索引器408。

对于排序的未编码视频帧(seqfrms)中的每个而言,块索引器408可确定当前帧(例如64×64像素)的最大代码块(“lcb”)尺寸,并将未编码帧划分成代码块(blks)的阵列。给定帧内的个别代码块的尺寸可以不同,例如,从4×4像素到当前帧的lcb尺寸。

每个代码块然后可一次一个地输入到差分器412,并且可与从先前编码的代码块生成的对应的预测信号块(pred)不同。为了生成预测块(pred),也可将代码块(cblks)提供至帧内预测器444和运动估计器416。在差分器412进行差分之后,产生的残差块(res)可通过变换器420(下面讨论)正向转换为频域表示,从而产生变换系数(tcof)的块。然后,变换系数(tcof)的块可被发送到量化器424,从而产生量化系数(qcf)的块,而量化系数(qcf)的块之后可被发送到熵编码器428和本地解码环路430两者。

对于帧内编码的代码块而言,帧内预测器444提供预测信号,该预测信号表示与当前代码块相同的帧的先前编码区域。对于帧间编码的代码块而言,运动补偿预测器442提供表示与当前代码块不同的帧的先前编码区域的预测信号。

在本地解码环路430的开始处,逆量化器432可对变换系数(tcof')的块进行去量化,并且将它们传递到逆变换器436以生成去量化的残差块(res')。在添加器440处,来自运动补偿预测器442的预测块(pred)可被添加到去量化残差块(res')以生成本地解码块(rec)。本地解码块(rec)然后可被发送到帧汇编器和去块过滤处理器,它们减少块效应并汇编恢复的帧(recd),而该恢复的帧(recd)可用作运动估计器416和运动补偿预测器442的基准帧。

熵编码器428对量化变换系数(qcf)、差分运动矢量(dmv)和其它数据进行编码,从而生成编码的视频比特流448。对于未编码视频序列中的每一帧,编码的视频比特流448可包含编码图片数据(例如,编码的量化变换系数(qcf)和差分运动矢量(dmv))以及编码帧头部(例如,如当前帧的lcb尺寸的语法信息)。

正向整数变换程序

参照变换器420的功能,变换器接收每个代码块的亮度和色度值的残差值的块,并将残差值的块划分为一个或多个亮度和色度变换块。

在至少一个实施方式中,代码块被划分成变换块,而该变换块根据当前代码块尺寸以及用于代码块的运动估计的预测块的尺寸来定尺寸。在下文中参照图8对用于选择变换块的尺寸的至少一个示例性技术进行描述。变换器420还可在当前帧的图片头部中设置最大-变换-块-尺寸标志。

在代码块被分成变换块之后,变换块中的残差值例如经由正向dct变换操作从空间域转换到频域。在至少一个实施方式中,为了提高编码效率,获得变换块的残差值的整数等效值并且可执行正向整数dct变换操作。为了进一步提高编码效率,可能有利的是,在视频编码处理中利用单指令多数据(simd)指令体系结构。然而,simd指令体系结构的大多数常见实现方式需要16位的比特宽度。因此,在至少一个实施方式中,在一些正向变换操作之后,可对残差值执行比特移位操作(并且在解码器侧,在一些逆向变换操作之后,针对变换系数),以使得残差值和变换系数可由16位整数表示。

在许多应用中,可存在由全零系数组成的相当数量的变换块(例如,对帧间代码块的运动预测越精确,代码块与预测块之间的残差值应越小)。在某些实施方式中,用于代码块头部中的每个变换块头部的1位变换块模式(tbp)标志可用于指示变换块的系数状态,即,全部为零或者不全为零。每个代码块头部中的tbp标志可例如遵循光栅扫描顺序。在一些实施方式中,tbp标志可针对图片中的所有变换块而被设置。在其它实施方式中,tbp标志可在更窄的条件下被设置。例如,在某些实施方式中,tbp标志仅在当前代码块的变换块等于最大可能变换块尺寸时被设置。

熵编码程序

参照熵编码器428的功能,针对每个代码块,熵编码器可获得表示代码块的亮度和色度值的多个量化变换系数(qcf)。在某些实施方式中,每个代码块中的量化变换系数可被分组为若干熵块(eb)。熵块尺寸可等于或小于最大可能变换块尺寸。例如,如在下文中参照图14描述的实施方式中,如果代码块尺寸为8×8,则熵块尺寸可被设置为8×8;如果代码块尺寸大于8×8,则熵块尺寸可被设置为16×16。

参照图5a和图5b,举例来说:

(a)对于8×8熵块501a,存在表示熵块的亮度值的四个4×4亮度系数块505a至505d和表示熵块的两个色度值的两个4×4色度系数块508a、508b;以及

(b)对于16×16熵块501b,存在二十四个系数块,其中,二十四个系数块包括表示代码块的亮度值的十六个4×4亮度系数块505j至505z和表示熵块的两个色度值的八个4×4色度系数块508e至508l。

可存在具有所有零值系数的不可忽视数量的系数块,并因此有利的是仅对包含一个或多个非零值的那些系数块进行编码和传送。根据至少一个实施方式,每个系数块(i)的系数块模式(cbp)标志(b)可用于指示每个系数块的状态,即,全部为零或者不全为零。代码块中的每个系数块的cbp标志(bi)可在熵块头部中被编码。然而,如果使用1比特对每个系数块的cbp标志发送信号,则可能需要相对大量的比特位来对整个帧上的cbp标志进行编码。因此,根据各种实施方式,可将内容自适应、长度可变的编码技术应用于每个熵块的cbp标志。

对于具有多个(n个)系数块的熵块,n个cbp标志(b0,1,…n-1)可被分组为一个或多个联合符号(s)。在至少一个实施方式中,联合符号(s)可被排序成使得与表示色度系数块的熵块相关联的cbp标志被放置在与表示亮度系数块的熵块相关联的cbp标志的前面。对于8×8熵块,n可等于6:四个4×4色度系数块和两个4×4亮度系数块。六个对应的cbp标志b0-5可首先被分组为具有用于色度系数块的cbp标志的单个6位联合符号(s),随后的是用于亮度系数块的cbp标志,正如图5a中排序的那样,其中:

s=b5,b4,b3,b2,b1,b0。

对于16×16熵块,n可等于24:十六个4×4亮度系数块和八个4×4色度系数块。二十四个相应的cbp标志b0-23可被分组成四个6位联合符号si,正如图5b中排序的那样,其中:

s0=b20,b16,b5,b4,b1,b0,

s1=b21,b17,b7,b6,b3,b2,

s2=b22,b18,b13,b12,b9,b8,

s3=b23,b19,b15,b14,b11,b10。

在编码处理期间,任何特定熵块模式发生的概率将根据预测模式(例如,帧内预测或帧间预测)和变换块尺寸(例如,4×4变换块或大于4×4的变换块)而变化。为了提高cbp联合符号编码的效率,对于每个联合符号s,内容编号(ctx)可基于变换块的尺寸、预测模式(即,帧间/帧内预测)和在16x16熵块的情况下联合符号的索引号(i)导出。对于8x8熵块,内容编号可根据以下来导出:

ctx=2*pred_mode+trans_size。

对于16x16熵块,内容编号可根据以下来导出:

ctx=4*(2*pred_mode+trans_size-1)+i。

其中,

对于帧内代码块,pred_mode=0,并且对于帧间代码块,pred_mode=1,以及

对于4×4变换块,trans_size=0,并且对于更大的变换块,trans_size=1。

因此,对于8×8熵块,内容编号可等于0至3,正如表3中所示,并且对于16×16帧内编码变换块,联合符号s0的内容编号可等于0至11,正如表4中所示。

联合符号值然后可被映射到基于当前代码块的量化范围和导出的内容编号来选择的霍夫曼编码长度表,其包含联合符号s的2n个可能值(例如,在当前示例性实施方式中为64),并且可获得当前联合符号的相应的霍夫曼编码长度(hcl)。霍夫曼编码根据hcl值导出,以表示联合符号。

在某些实施方式中,2k-位符号可被用于表示霍夫曼编码长度。例如,当k=2时,可存在霍夫曼代码长度(0-15)的16个可能的值。由于存在2n个可能的联合符号值并且每个联合符号值映射到霍夫曼代码长度,所以对于一个霍夫曼代码长度表可能需要2n+k位。在某些实现方式中,这些2n+k位可进一步通过由2m-位元素的阵列来表示。因此,阵列维度,例如霍夫曼代码长度表的元素的数量为2n+k-m

根据至少本实施方式,存在六十四(n=6)个可能的联合符号值,并且一个联合符号被映射到4(k=2)位霍夫曼代码长度,而对于一个霍夫曼代码长度表,可能需要256(26+2)位。在与c/c++实现方式一致的实施方式中,一个霍夫曼代码长度表可进一步由具有32位(m=5)元素的阵列(例如,无符号整数)来表示,并因此阵列中的元素数为8(2n+k-m=26+2-5)。在这种实施方式中,三维表格可被用于表示一个cbp联合符号的所有可能的霍夫曼代码长度表格,这三个维度为:

-qr:先前用于对代码块进行量化的七个量化范围中的一个;

-ctx:熵块的内容值,正如上文所述;以及

-s:64个可能的cbp联合符号值s中的一个。

在与c/c++实现方式一致的实施方式中,s可由无符号整数变量表示,并因此最后维度中的元素的数量可为8。

在已确定熵块的cbp联合符号代码字之后,熵编码器428可对包含一个或多个非零量化变换系数的任何系数块进行编码。对于每个非零值系数块,使用两个参数来描述经量化的变换系数,即,描述符和级别。描述符可以是系数块中的系数分布的表示,并且级别可表示系数幅度。系数块的描述符的霍夫曼编码长度表是根据五个准则来选择的,即:预测模式(帧内/帧间)、系数块尺寸(4×4或2×2)、量化范围(qr)、内容编号(ctx)和描述符值(d)。系数块的级别的霍夫曼编码长度表是根据三个标准来选择的,即:预测模式(帧内/帧间)、量化范围(qr)和级别值(l)。

在已确定非零系数块的描述符和级别代码字之后,熵编码器428可汇编比特流。比特流可以至少包括代码块头部,该代码块头部包含cbp标志代码字,描述符代码字和级别代码字。

软件实现的帧间解码器

图6示出了根据至少一个实施方式的相应的软件实现的帧间视频解码器600(以下称为“解码器600”)的逆残差变换技术的一般功能框图,并且适合与解码设备(如解码设备300)一同使用。解码器600可与编码器400处的本地解码环路455类似地操作。

具体地,待被解码的编码视频比特流604可被提供给熵解码器608,熵解码器608可对量化系数块(qcf)、差分运动矢量(dmv)、伴随消息数据分组(msg-data)和包括预测模式(帧内或帧间)的其它数据进行解码。量化系数块(qcf)然后可由逆向量化器612重组,从而产生恢复的变换系数块(tcof')。恢复的变换系数块(tcof')然后可通过逆向变换器616(在下文中描述)经逆向变换而脱离频域,从而产生经解码的残差块(res')。添加器620可对通过使用来自运动补偿预测器628的相应的运动矢量(dmv)而获得的运动补偿预测块(psb)进行添加。产生的解码视频(dv)可在帧汇编器和去块过滤处理器624中进行去块-过滤。帧汇编器和去块过滤处理器624的输出处的块(recd)形成视频序列的重建帧,该重建帧可从解码器600输出并且也可用作运动-补偿预测器628的基准帧以用于对随后的代码块进行解码。

变换-块-处理-例程

图7示出了适合与至少一个实施方式(如编码器400)一同使用的变换-块-处理例程700。如本领域普通技术人员将认识到的,图7中并为示出编码处理中的所有事件。相反,为了清楚起见,仅示出了与所示实施方式的描述合理相关的那些步骤。

在执行块704处,变换-块-处理例程700获得正被编码的当前帧的整数残差值的代码块。变换-块-处理例程700然后将当前代码块的尺寸和在运动估计中使用的相应的预测块的尺寸提供给变换-块-尺寸-选择子例程800(在下文中参照图8描述),其中,变换-块-尺寸-选择子例程800针对当前代码块尺寸和预测块尺寸的当前组合返回适当的色度和亮度变换块尺寸。

在执行块708处,变换-块-处理例程700然后根据由上述的变换-块-尺寸-选择子例程700返回的色度和亮度变换块尺寸将当前代码块分离成一个或多个16位整数残差值的变换块。

在起始环路块712处,当前代码块的每个变换块反过来被处理。

在判定块716处,如果当前变换块的残差值中的每个具有零值,则在执行块720处,变换-块-处理例程700在当前变换块的变换块头部中设置相应的变换-块-模式标志。

否则,在判定块716处,如果当前变换块的一个或多个残差值具有非零值,则变换-块-处理例程700调用正向-整数-变换子例程900(在下文中参照图9描述),该正向-整数-变换子例程900返回相应的16位整数变换系数的块。

在结束环路块724处,变换-块-处理例程700迭代返回至起始环路块712以对当前代码块的下一个变换块进行处理(如果有的话)。

变换-块-处理例程700在终止块799处结束当前代码块。

变换-块-尺寸-选择子例程

图8示出了适合与至少一个实施方式(如变换-块-处理例程700)一同使用的变换-块-尺寸-选择子例程800。

在执行块804处,变换-块-尺寸-确定子例程800获得用于当前代码块的运动估计处理的代码块尺寸和预测块尺寸。

在判定块812处,如果当前代码块的代码块尺寸为8×8像素,则变换-块-尺寸-确定子例程800进行至判定块816。

在判定块816处,如果当前代码块的预测块尺寸为8×8像素,则在执行块820处,变换-块-尺寸-确定子例程800将当前代码块的亮度变换块尺寸设置为8×8亮度变换系数,并且在执行块824处,变换-块-尺寸-确定子例程将当前代码块的色度变换块尺寸设置为4×4色度变换系数。变换-块-尺寸-确定子例程然后在返回块899处返回当前代码块的亮度变换块尺寸和色度变换块尺寸。

再次参照判定块816,如果当前代码块的预测块尺寸不是8×8像素,则在执行块828处,变换-块-尺寸-确定子例程800将当前代码块的亮度变换块尺寸设置为4×4亮度变换系数。变换-块-尺寸-确定子例程800然后进行至执行块824。如上所述,在执行块824处,变换-块-尺寸-确定子例程将当前代码块的色度变换块尺寸设置为4×4色度变换系数。变换-块-尺寸-确定子例程然后在返回块899处返回当前代码块的亮度变换块尺寸和色度变换块尺寸。

再次参照判定块812,如果当前代码块的代码块尺寸不是8×8像素,则变换-块-尺寸-确定子例程800进行至判定块836。

在判定块836处,如果当前代码块的代码块尺寸为16×16个像素,则变换-块-尺寸-确定子例程800进行至判定块840。

在判定块840处,如果当前代码块的预测块尺寸为16×16像素,则在执行块844处,变换-块-尺寸-确定子例程800将当前代码块的亮度变换块尺寸设置为16×16亮度变换系数,并且在执行块848处,变换-块-尺寸-确定子例程然后将当前代码块的色度变换块尺寸设置为8×8色度变换系数。变换-块-尺寸-确定子例程然后在返回块899处返回当前代码块的亮度变换块尺寸和色度变换块尺寸。

再次参照判定块840,如果当前代码块的预测块尺寸不是16×16像素,则变换-块-尺寸-确定子例程800进行至执行块828。如上所述,在执行块828处,变换-块-尺寸-确定子例程800将当前代码块的亮度变换块尺寸设置为4×4亮度变换系数。变换-块-尺寸-确定子例程800然后进行至执行块824。如上所述,在执行块824处,变换-块-尺寸-确定子例程将当前代码块的色度变换块尺寸设置为4×4色度变换系数。变换-块-尺寸-确定子例程然后在返回块899处返回当前代码块的亮度变换块尺寸和色度变换块尺寸。

再次参照判定块836,如果当前代码块的代码块尺寸不是16×16像素,则变换-块-尺寸-确定子例程800进行至执行块844。如上所述,在执行块844处,变换-块-尺寸-确定子例程800将当前代码块的亮度变换块尺寸设置为16×16亮度变换系数,并且在执行块848处,变换-块-尺寸-确定子例程800然后将当前代码块的色度变换块尺寸设置为8×8色度变换系数。变换-块-尺寸-确定子例程然后在返回块899处返回当前代码块的亮度变换块尺寸和色度变换块尺寸。

正向-整数-变换子例程

图9示出适合与至少一个实施方式(诸如变换-块-处理例程700或在下文中参照图10描述的双-变换子例程1000)一同使用的正向-整数-变换子例程900。

在执行块904处,正向-整数-变换子例程例如从变换-块-处理例程600获得变换块。

在判定块908处,如果当前变换块为4×4块的整数变换系数,则在执行块912处,正向-整数-变换子例程900执行4×4正向变换,例如上述的4×4正向整数变换操作。正向-整数-变换子例程900然后在返回块999处返回经由4×4整数变换获得的变换系数。

再次参照判定块908,如果当前变换块不是4×4块的整数变换系数(例如,8×8、16×16、32×32或64×64块的整数变换系数),则正向-整数-变换子例程900进行至判定块916。

在判定块916处,如果当前变换块为8×8块的整数变换系数,则在执行块920处,正向-整数-变换子例程900执行8×8正向变换,例如上述的8×8正向整数变换操作。在执行块924处,正向-整数-变换子例程900在执行块920处操纵经由8×8整数变换获得的变换系数,从而使变换系数向右进行两次比特移位以确保变换系数可以以不超过16位来表示。正向-整数-变换子例程900在返回块999处返回经比特移位的变换系数。

再次参照判定块916,如果当前变换块8×8块的整数变换系数(例如,16×16、32×32或64×64块的整数变换系数),则正向-整数-变换子例程900进行至判定块926。

在判定块926处,如果当前变换块为16×16块的整数变换系数,则在执行块928处,正向-整数-变换子例程900执行16×16正向变换,例如上述的16×16正向整数变换操作。正向-整数-变换子例程900然后进行至执行块924。如上所述,在执行块924处,正向-整数-变换子例程900在执行块920处操纵经由8×8整数变换获得的变换系数,从而使变换系数向右进行两次比特移位以确保变换系数可以以不超过16位来表示。正向-整数-变换子例程900在返回块999处返回经比特移位的变换系数。

再次参照判定块926,如果当前变换块大于16×16块的整数变换系数(例如,32×32或64×64块的整数变换系数),则在执行块932处,正向-整数-变换子例程900执行大变换程序。正向-整数-变换子例程900在返回块999处返回大整数变换程序的结果。

代码块熵编码例程

熵编码例程1000在执行块1003处获得代码块。至少在本实施方式中,代码块可以是8×8、16×16、32×32或64×64代码块。

熵编码例程1000在执行块1005处获得代码块的量化范围变量(qr)的值。例如,量化范围变量qr可有七个可能的值,0-6。

熵编码例程1000可将当前代码块的尺寸提供给在下文中参照图11描述的熵块尺寸选择子例程1100,该熵块尺寸选择子例程1100可返回熵块尺寸以供根据至少本实施方式来使用。如上所述,熵块尺寸可根据当前代码块尺寸来选择。至少在本实施方式中,如果当前代码块为8×8,则熵块尺寸可为8×8;如果当前代码块大于8×8(例如,16×16、32×32或64×64),则熵块尺寸可为16×16。一个熵块可包括n个系数块。至少在本实施方式中,当熵块尺寸如图5a和图5b所示分别为8×8和16×16时,n可以例如等于6或24。

在起始环路块1007处,熵编码例程1000反过来对代码块的每个熵块进行寻址。

熵编码例程1000在执行块1008处获得一个或多个联合符号s的值。例如,如果n等于6,则熵编码例程1000可针对联合符号值s获得6位值,并且如果n等于24,则熵编码例程1000可获得四个6位联合符号值s0-3。联合符号s中的每个位的值可表示相应的系数块的系数状态。例如,如果第i系数块的系数中的所有系数具有零值,则联合符号(s)中的第i位可等于零,并且如果给定系数块的系数中的任一系数具有非零值,则代码块的联合符号中的相应的位可等于1。

熵编码例程1000在执行块1010处获得当前熵块的内容编号(ctx)。例如,如果当前熵块为8×8熵块,则根据查找表(如上表3)可获得内容编号;如果当前熵块是16×16熵块,则可以根据查找表(如上表4)导出内容编号。

在起始环路块1013处,熵编码例程1000反过来对熵块的每个联合符号s进行寻址。

熵编码例程1000在执行块1015处获得用于联合符号s的cbp联合符号代码字。例如,分别对于8×8熵块或16×16的熵块,熵编码例程1000可基于在执行块1005处确定的代码块的范围变量(r)、在执行块1013处为熵块确定的内容编号(ctx)和cbp联合符号(s)而从三维霍夫曼代码长度中选择代码字长度,并且cbp联合符号代码字是从所选择的代码字长度导出的。

在结束环路块1018处,熵编码例程1000循环回到起始环路块1013,并对下一个联合符号s进行寻址(如果有的话)。

在起始环路块1020处,熵编码例程1000反过来对当前代码块的每个系数块进行寻址。例如,熵编码例程1000可首先以光栅扫描顺序对亮度系数块进行寻址,然后对色度系数块进行寻址。

在判定块1023处,如果当前系数块包含具有非零值的系数,则熵编码例程1000进行至执行块1023;否则,如果当前系数块包含全零值系数,则熵编码例程1000进行至结束环路块1030。

熵编码例程1000在执行块1025处获得与当前系数块对应的描述符代码字。例如,描述符代码字可根据代码块和系数块的特性而从所选择的霍夫曼编码长度表中选择,正如上文所述。

熵编码例程1000在执行块1025处获得与当前系数块对应的级别代码字。例如,级别代码字可根据代码块和系数块的特性而从所选择的霍夫曼编码长度表中选择。

在结束环路块1030处,熵编码例程1000循环回到起始环路块1020,以对下一个系数块进行寻址(如果有的话)。

熵编码例程1000在执行块1033处为当前代码块汇编比特流。例如,在执行块1033处,当前代码块的比特流可至少包括每个cbp联合符号代码字、每个量化变换系数描述符代码字和每个量化变换系数级别代码字。

熵编码例程1000终止于结束块1099处。

熵块尺寸选择子例程

图11示出了根据某些实施方式的熵块尺寸选择子例程1100。

熵块尺寸选择子例程1100可在执行块1103处例如从代码块熵例程1000获得代码块尺寸。

在判定块1105处,如果代码块尺寸为8×8,则熵块尺寸选择子例程1100进行至执行块1108;或者,如果代码块尺寸大于8×8,则熵块尺寸选择子例程1100进行至执行块1110。

熵块尺寸选择子例程1100可在执行块1108处将熵块尺寸设置为8×8。

熵块尺寸选择子例程1100可在执行块1110处将熵块尺寸设置为16×16。

熵块尺寸选择子例程1100可在返回块1199处返回熵块尺寸。

变换-块-恢复例程

图12示出了适合与至少一个实施方式(如解码器600)一同使用的变换-块-恢复例程1200。如本领域普通技术人员将认识到的,图12中并未示出解码处理中的所有事件。相反,为了清楚起见,仅示出与变换-块-恢复例程1200的描述合理地相关的那些步骤。

在执行块1204处,变换-块-恢复例程1200例如从逆向量化器612获得去量化变换系数的块。

在执行块1205处,变换-块-恢复例程1200确定当前代码块的尺寸。

在执行块1206处,变换-块-恢复例程1200确定用于当前代码块的运动预测的预测块的尺寸。

在执行块1207处,变换-块-恢复例程1200针对用于当前代码块的运动预测的预测块的尺寸和当前代码块尺寸的相应的组合查找预测块的尺寸。

在执行块1208处,变换-块-恢复例程1200然后根据在上述执行块1207处获得的变换块尺寸而将去量化变换系数汇编成16位整数变换系数的一个或多个变换块。

从起始环路块1236开始,变换-块-恢复例程1200反过来对16位整数变换系数的每个变换块进行处理。

在判定块1240处,如果用于相应的变换块的变换-块-模式标志被设置在变换块头部中,则在结束环路块1244处,变换-块-恢复例程1200迭代返回到起始环路块1236,以对当前代码块的16位整数变换系数的下一个块进行处理(如果有的话)。

如果在判定块1240处用于相应的变换块的变换-块-模式标志未设置在变换块头部中,则变换-块-恢复例程1200调用逆向-变换子例程1400(在下文中参照图14描述),其中,该逆向-变换子例程1400返回经恢复的残差值的块。

在结束环路块1244处,变换-块-恢复例程1200迭代返回到起始环路块1236以对当前代码块的下一个变换块进行处理(如果有的话)。

变换-块-恢复例程1200在终止块1299处结束。

逆向-整数-变换子例程

图13示出了适合与至少一个实施方式(如变换-块-恢复例程1000)一同使用的逆向-整数-变换子例程1300。

在执行块1304处,逆向-整数-变换子例程1300例如从变换-块-恢复例程1000获得变换块。

在判定块1308处,如果变换块为4×4变换块,则在执行块1310处,逆向-整数-变换子例程1300执行4×4逆向整数变换,例如上述的4×4逆向整数变换。在执行块1312处,逆向-整数-变换子例程1300将所得到的整数变换系数向右比特移位5位。逆向-整数-变换子例程1300在返回块1399处返回经比特移位的整数变换系数。

再次参照判定块1308,如果变换块不是4×4变换块,则逆向-整数-变换子例程1300进行至判定块1316。

在判定块1316处,如果变换块为8×8变换块,则在执行块1318处,逆向-整数-变换子例程1300执行8×8逆向整数变换,例如上述的8×8逆向整数变换。在执行块1320处,逆向-整数-变换子例程1300将所得到的整数变换系数向右比特移位7位。逆向-整数-变换子例程1300在返回块1399处返回经比特移位的整数变换系数。

再次参照判定块1316,如果变换块不是8×8变换块,则逆向-整数-变换子例程1300进行至判定块1326。

在判定块1326处,如果变换块为16×16变换块,则在执行块1327处,逆向-整数-变换子例程1300执行16×16逆向整数变换,例如上述的16×16逆向整数变换。在执行块1328处,逆向-整数-变换子例程1300将所得到的整数变换系数向右比特移位7位。逆向-整数-变换子例程1300在返回块1399处返回经比特移位的整数变换系数。

再次参照判定块1326,如果变换块大于16×16变换块(例如,32×32或64×64变换块),则在执行块1332处,逆向-整数-变换子例程1300执行大逆向变换程序。在返回块1399处,逆向-整数-变换子例程1300返回大整数变换程序的结果。

虽然这里已经示出并描述了具体实施方式,但是本领域普通技术人员将会理解,在不脱离本发明的范围的情况下,替代的和/或等效的实现可以代替所示且所描述的具体实施方式。本申请旨在涵盖本文讨论的实施方式的任何修改或变化。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1