本申请要求于2009年1月6日提交的美国临时申请No.61/142648的权益,以及于2008年12月30日提交的挪威专利申请No.20085407的优先权,这二者的全部主题通过引用结合于此。
背景技术
运动画面的实时传输在多种应用中得以采用,诸如但不限于视频会议、网络会议、电视(TV)广播和视频电话。表示运动画面需要大量的信息,因为通常通过用8个比特(bit)即一个字节表示画面中每个像素来描述数字视频。这种未压缩的视频数据导致大的比特量,并且由于有限的带宽而无法在常规通信网络和传输线路上传输。
因此,使得能够实时视频传输需要进行大程度的数据压缩。然而,数据压缩会影响画面质量。因此,已经投入巨大努力来研发压缩技术,使得可通过带宽有限的数据连接进行高质量视频的实时传输。在视频压缩***中,主要的目标在于利用尽可能小的容量表示视频信息。容量用比特来定义,或为恒定值或是比特/时间单位。在两种情况下,目标是减少比特的数目。
在运动图像专家组(MPEG)和H.26标准中描述了传统的视频编码方法。视频数据在传输之前经历四种主要处理(即,预测处理、变换处理、量化处理和熵编码)。
预测处理减少待传输的视频序列中每幅画面所需的比特数量。该处理利用了序列的某些部分与该序列的其他部分的相似性。由于预测器部分对于编码器和解码器都是已知的,所以仅需传输差异。这种差异通常需要少很多的容量用于其表示。预测主要是基于表示运动的矢量。传统上,对方块尺寸(例如,16×16像素)执行预测处理。注意,在一些情况下,像素的预测是基于使用相同画面中的相邻像素而不是先前画面的像素。这被称作帧内预测(不要与帧间预测相混淆)。
表示为数据块(例如,4×4像素)的残差(residual)仍然包含内部相关性。传统方法利用了这一点并且执行二维块变换。在H.263中,使用8×8的离散余弦变换(DCT),而在H.264中,则使用4×4的整数型变换。这将4×4像素变换为较之像素表示通常可由更少的比特来表示的4×4的变换系数。具有内部相关性的4×4像素阵列的变换可以产生较之原始4×4像素块具有更少非零值的4×4变换系数块。
变换系数的直接表示对于许多应用而言成本过高。为了进一步减小数据表示,执行量化处理。因此,变换系数要经历量化。一种量化方式是参数值除以一个数,产生可以由较少比特表示的较小数字。这种量化处理导致与未压缩序列稍有不同的重构视频序列。这种现象被称作“有损编码”。来自量化部分的结果被称作量化变换系数。
熵编码是一种特殊形式的无损数据压缩。熵编码包括利用将相似频率聚集成组的游程长度编码(RLE)算法以“之字形”顺序布置图像成分,***编码0的长度,并且接着对剩下的部分使用Huffman编码。
在H.264编码中,对块的DCT系数进行重新排序以把阵列中的非零系数聚集在一起,使得能够有效表示其余的零值系数。图1示出之字形的重新排序路径100(即,扫描顺序)。之字形扫描100的顺序图案根据每个位置的非零系数的概率来构造。由于先前DCT的特性,块中非零系数的概率沿着DCT块的向右下的对角方向降低。如图1所示,当以之字形图案100对系数重新排序时,非零系数通常趋于集中在阵列的开头的各位置。
重新排序处理的输出包括一维阵列,其包含开头附近的一个或多个非零系数聚簇,随后为零系数串。由于大量的零值,所以该阵列被进一步表示为一系列(游程,幅度)对,其中“游程(run)”指示一个非零系数前面的零的数目,而“幅度(level)”则指示该非零系数的量值。例如,输入阵列16、0、0、-3、5、6、0、0、0、0、-7将具有以下相应的游程-幅度值:(0,16),(2,-3),(0,5),(0,6),(4,-7)。当把所述之字形阵列变换为游程-幅度值时,对所有系数做循环并检查它们是否非零,这在计算上是高成本的。
具体实施方式
图2是示出在传统实施方式中如何计算根据运动图像专家组(MPEG-4)和H.264的run-level代码的流程图。在对块中的变换系数进行量化之后(Quant C)201,将Run变量和位置标号(I)设置为零203。接着,根据图1所示的前面所提到的之字形图案100,将量化系数重新排序205为一维阵列。该处理接着进入循环来解析所述阵列以确定run-level值。首先,检查是否超出阵列中位置的数目(即,I>16)207。如果否,则接着检查阵列中的当前位置是否包含零209。如果是,则在步骤217和219处递增Run变量和位置标号(I),并且该处理进行至循环的开始处。如果当前位置包含非零值,则在步骤211和213,将当前的Run变量和当前位置的值存储为Run-Level值。接着在步骤217和219递增Run变量和位置标号(I)之前,对Run变量清零215,并且该处理进行至循环的开始。该处理在位置标号(I)超出阵列的最大尺寸时结束,所述阵列的最大尺寸在图2所示的示例中为16。
如能够从图2所示的传统实施方式所看到的,所述处理总是必须进行阵列中的位置数那么多次(即,图2的示例中的16次)的run-level编码循环。这由于C中的大多数系数为零而变得非常低效,并且在所有系数上进行循环以及检查它们是否为零在计算上是昂贵的。
图3是图示根据本公开的实施例的流程图。根据该实施例,使用比特掩蔽和比特扫描指令,使得可以有效跳过所有零值系数。首先,在步骤301处对块中的变换系数进行量化。在图3的示例中,如图4的401所示,在矢量C中存储十六个(16)系数。
所述处理接着进行至步骤303,其中对所有量化系数进行紧缩。在该示例中,通过C++指令PACKUSWB实现紧缩303,如图4的403所示,其将十六个(16)有符号字变换为无符号整数并且做饱和。换句话说,如果系数大于和小于无符号字节的范围,则分别将该系数设置为所述范围的Max或Min值,在该示例中为255和0。因此,用于存储每个系数的存储器大小从通常用于存储每个系数所需存储器数量的两个(2)字节减少为一个(1)字节。
当使用非常低的量化参数时,这是一种近似并且会导致不同的结果。然而,针对各种视频会议情形的这种近似的广泛监视已经表明这种近似在任何情况下不会劣化人眼所看到的视频质量。
紧缩步骤303使得能够用一个函数执行系数的重新排序305,而不必解析循环十六次(16)。这可以通过使用C++函数PSHUFB实现。该函数有效地以任意顺序精确重排十六个(16)字节。使用PSHUFB指令对C进行重新排序的示例在图4的405中示出。在图3的示例中,输入是十六个(16)系数以及如图1所示的之字形顺序100。
下一个步骤是对经量化、紧缩和重新排序的系数进行掩蔽307。掩蔽通过应用C++函数PCMPGTB和PMOVMSKB来实现。如图4的409所示,PCMPGTB函数在所有非零值的位置中填入整字节的一(1),而零值的位置则保持为零(0)不变。注意,一个字节等于8比特,因此八个(8)二进制的一(1)是一个字节的最大容量。在图4的409中,十六进制数“ff”表示八个(8)二进制的一(1)(即,如以上所提到的一个整字节)。如图4的411所示,PMOVMSKB函数根据十六个(16)字节的最高有效比特产生16比特掩码(即,C的掩码)。当这两个函数施加在经量化、紧缩和重新排序的系数(C)时,产生的结果是16比特阵列(M),其中一(1)指示C的非零值的相应位置。
从C导出M,计算run-level值的步骤变得计算量更低并且不需要针对零值做循环。如以上所提到的,在掩码M中,对C的每个非零值设置一个比特。因此,在步骤309,当16比特的阵列(M)为零时,则所有系数为零并且针对该阵列完成run-level编码。
如果阵列M是非零的,则可以在步骤311使用C++函数BSF来计算C的第一个非零值的标号。BSF或比特前向扫描(Bit Scan Forward)扫描等于一(1)的第一个比特并且将该第一设置比特的标号存储在寄存器中。BSF返回整数的最低有效比特的比特标号(即,在M的情况下,从右侧开始的一(1)的第一个位置)。
因此,当BSF对M应用时,BSF在步骤311所返回的标号等于“游程(run)”,并且被直接用作C阵列中的查找号以确定“幅度(level)”。由于已经使用PSHUFB指令重排C,所以这是可能的。
接着在步骤315存储如BSF函数所指示的Run值,并且在查找之后位于C阵列中该位置的值在步骤313被存储为Level值。
在步骤317,M最终被向右移位“Run+1”次,以从M中清除标号比特并且为循环的下一次迭代准备M。因此,从M中去除了对应于已计算run-level值的M的内容,并且可以按相同的方式应用循环来计算其余的run-level值(即,通过在步骤311再次使用BSF函数扫描M,其寻找M的下一个非零值)。
由于通过有效使用BSF指令跳过了所有的零(0),所以仅需要非零系数游程来计算所有的“level”和“run”值。由于在量化系数的块中许多零(0)出现的概率高,因此可以减少实施熵编码时所要解析的循环数目。
本公开避免了间接的表查找(即,指针追踪)来确定“幅度(level)”,并且使用单个系数BSF指令来计算“游程(run)”。
此外,本公开提供了利用非零系数游程的run-level编码。例如,如果C中的五个(5)值是非零的,则仅需要五个(5)经由run-level编码的游程。因此,避免了检查C的零值,否则这会导致高计算成本的分支误预测。
图5图示了视频处理装置1201,在该装置1201可实施根据本发明的用于计算run-level表示的方法。计算***1201还包括耦合到总线1202的盘控制器1206,以控制一个或多个用于存储信息和指令的存储设备,诸如磁性硬盘1207和可拔插介质驱动器1208(例如,软盘驱动器、只读紧致盘驱动器、读写紧致盘驱动器、紧致盘自动唱机、磁带驱动器和可拔插磁-光驱动器)。存储设备可以使用适当的设备接口(例如,小型计算机***接口(SCSI)、集成电子驱动器(IDE)、增强型IDE(E-IDE)、直接存储器存取(DMA)或高速-DMA)添加到计算机***1201。
计算机***1201还可以包括专用逻辑设备(例如,专用集成电路(ASIC))或可配置逻辑设备(例如,简单可编程逻辑设备(SPLD)、复杂可编程逻辑设备(CPLD)和现场可编程门阵列(FPGA))。
计算机***1201还可以包括耦合到总线1202的显示控制器1209以控制诸如触摸面板显示器或液晶显示器(LCD)的显示器1210,用于向计算机用户显示信息。例如,可以在显示器210上显示GUI 308。所述计算机***包括输入设备,诸如键盘1211和指针设备1212,用于与计算机用户进行交互并且向处理器1203提供信息。例如,指针设备1212可以是鼠标、轨迹球、用于触摸屏传感器的手指或者是用于向处理器1203传达方向信息和命令选择并且控制光标在显示器1210上移动的指示棒。此外,打印机可以提供计算机***1201所存储和/或生成的数据的打印列表。
计算机***1201响应于处理器1203执行本公开的部分或全部处理步骤,所述处理器1203执行诸如主存储器1204的存储器中所包含的一个和多个指令的序列。这样的指令可以被从诸如硬盘1207和可移动介质驱动器1208的另一计算机可读介质读入主存储器1204。
也可以采用多处理配置中的一个或多个处理器来执行主存储器1204中所包含的指令序列。在可替选的实施例中,可以使用硬布线电路来替代软件指令或者与之相结合。因此,实施例并不局限于硬布线电路和软件的任意特定组合。
如以上所提到的,计算机***1201包括至少一个计算机可读介质或者存储器,用于保存根据本公开教导所编程的指令以及用于包含这里所描述的数据结构、表、记录或其他数据。计算机可读介质的示例为紧致盘、硬盘、软盘、磁带、磁-光盘、PROM(EPROM、EEPROM、快闪EPROM)、DRAM、SRAM、SDRAM或者任意其他磁介质、紧致盘(例如,CD-ROM)或者任意其他光介质、打孔卡、纸带,或者具有孔洞图案的其他物理介质。其他实施例可以包括使用载波(以下进行描述),或者计算机能够对其进行读取的其他介质。其他实施例可以在信号或载波中包括根据本公开教导的指令。
本公开包括存储在任意一个计算机可读介质上或计算机可读介质的组合上的软件,所述软件用于控制计算机***1201,用于驱动实施本发明的一个或多个设备,并且用于使得计算机***1201能够与人类用户(例如,印刷制作人员)进行交互。这样的软件可以包括设备驱动程序、操作***、开发工具和应用软件,但是并不局限于此。这样的计算机可读介质进一步包括本公开的用于执行实施本发明时所执行处理的全部或一部分(如果处理是分布式的)的计算机程序产品。
本实施例的计算机代码设备可以是任意可解释或可执行的代码机制,包括但不限于脚本、可解释程序、动态链接库(DLL)、Java类和完整的可执行程序。此外,本实施例的部分处理可了更好的性能、可靠性和/或成本而可以是分布式的。
这里所使用的术语“计算机可读介质”是指参与向处理器1203提供指令以供其执行的任意介质。计算机可读介质可以采取多种形式,包括但不限于非易失性介质或易失性介质。例如,非易失性介质包括例如光、磁盘和磁-光盘,诸如硬盘1207或可拔插介质驱动器1208。易失性介质包括动态存储器,诸如主存储器1204。传输介质包括同轴线缆、铜线和光纤,其包括构成总线1202的线。传输介质还可以采用声波或光波的形式,诸如在无线电波和红外数据通信期间所生成的那些。
各种形式的计算机可读介质可以涉及携带一个或多个指令的一个或多个序列给处理器1203以供其执行。例如,最初所述指令可以被携带在远程计算机的磁盘上。所述远程计算机可以将用于实施本公开的全部或一部分的该指令远程地加载到动态存储器并且使用调制解调器通过电话线路发送所述指令。对于计算机***1201而言是本地的调制解调器可以在电话线路上接收数据并且使用红外传送器将所述数据转换为红外信号。耦合到总线1202的红外解码器可以接收所述红外信号中所携带的数据并且将所述数据置于总线1202上。总线1202将所述数据携带到主存储器1204,处理器1203从那里取得并执行所述指令。主存储器1204所接收的指令可以在由处理器1203执行之前或之后存储在存储设备1207或1028上。
计算机***1201还包括耦合到总线1202的通信接口1213。通信接口1213提供耦合到网络链接1214的双向数据通信,所述网络链接1214例如被连接到局域网(LAN)1215或者被连接到诸如互联网的其他通信网络1216。例如,通信接口1213可以是附着到任意分组交换LAN的网络接口卡。如另一个示例,通信接口1213可以是向相应类型的通信线路提供数据通信连接的非对称数字订户线路(ADSL)卡、综合业务数字网(ISDN)卡或者调制解调器。还可以实现无线链接。在任意这样的实施方式中,通信接口1213发送并接收携带表示各种类型信息的数字数据流的电、电磁或光信号。
网络链接1214通常通过一个或多个网络向其他数据装置提供数据通信。例如,网络链接1214可以通过本地网络1215(例如,LAN)或通过服务提供商所操作的设备向另一计算机提供连接,所述服务提供商通过通信网络1216提供通信服务。本地网络1214和通信网络1216例如使用携带数字数据流的电、电磁或光信号以及相关联的物理层(例如,CAT 5线缆、同轴线缆、光纤等)。携带往来于计算机***1201的数字数据的通过各种网络的信号以及处于网络链接1214并且通过通信接口1213的信号可以被实现为基带信号或者基于载波的信号。基带信号传输作为未调制电脉冲的数字数据,其表示数字数据比特流,其中术语“比特”要被宽泛理解为表示符号,其中每个符号传输至少一个或多个信息比特。还可以使用数字数据来对具有诸如在传导介质传播上的振幅、相位和/或频率移动键控信号,或者作为电磁波通过传播介质传送的载波进行调制。因此,数字数据可以作为未调制的基带数据通过“有线”通信信道进行发送,和/或通过对载波进行调制而在预定的不同于基带的频带内进行发送。计算机***1201可以通过(多个)网络1215和1216、网络链接1214和通信接口1213传送和接收包括程序代码的数据。此外,网络链接1214可以通过LAN 1215向诸如个人数字助理(PDA)、膝上电脑或移动电话的移动设备1217提供连接。
此外,应当理解,本发明并不局限于以上所示出和描述的示例性实施例。虽然已经结合以上概述的示例性实施例对本发明进行了描述,但是无论是已知的还是当前可能无法预见到的,各种替换、修改、变化和/或改进会变得显而易见。因此,如以上所给出的本发明的示例性实施例意在作为说明而非限制。可以进行各种变化而不背离本发明的精神和范围。因此,本公开意在包含所有现在已知或随后开发的替换、修改、变化和/或改进。