具体实施方式
虽然在此描述的实施例可以采纳使用熵编码/解码的任何视频编码器/解码器(编解码器),但是仅用于说明目的,关于H.264/AVC编码器和H.264/AVC解码器描述示范性实施例。很多视频编码技术以基于块的混合视频编码方法为基础,其中,源编码技术是图片间(还被称作帧间)预测、图片内(还被称作帧内)预测以及预测剩余的变换编码的混合。帧间预测可以采用时间冗余,并且帧内和预测剩余的变换编码可以使用空间冗余。
图1示出示范性H.264/AVC视频编码器2的框图。可以呈现输入图片4(还被称作帧)以用于编码。可以产生预测信号6和剩余信号8,其中,预测信号6可以基于帧间预测10或帧内预测12。可以使用通过在输入帧4和参考帧16之间的运动估计部18处理确定的运动信息19,由运动补偿部14、一个或多个所存储的参考图片16(还被称作参考帧)确定帧间预测10。可以使用解码信号22,由帧内预测部20确定帧内预测12。可以通过从预测信号6减去输入帧4,确定剩余信号8。通过变换/缩放/量化部24变换、缩放和量化剩余信号8,由此产生量化后的变换系数26。可以通过将预测信号6添加到由逆(变换/缩放/量化)部30使用量化后的变换系数26生成的信号28,生成解码信号22。运动信息19和量化后的变换系数26可以通过熵编码部32被熵编码并且写入到压缩视频比特流34。可以使用重构的预滤波信号22,通过去块滤波器36在编码器2处生成输出图像区域38,例如参考帧的一部分。该输出帧可以被用作用于对随后输入图片编码的参考帧。
图2示出示范性H.264/AVC视频解码器50的框图。可以呈现输入信号52(还被称作比特流)以用于解码。可以通过熵解码部54熵解码所接收的符号,由此产生运动信息56、帧内预测信息57、以及量化缩放后的变化系数58。运动信息56可以通过运动补偿部60与可能驻留在帧存储器64中的一个或多个参考帧84的一部分相结合,并且可以生成帧间预测68。可以通过逆(变换/缩放/量化)部62逆量化、缩放和逆变换量化缩放后的变换系数58,由此产生解码后的剩余信号70。可以将剩余信号添加到预测信号78:帧间预测信号68或者帧内预测信号76。可以根据当前帧72中的先前解码的信息由帧内预测部74预测帧内预测信号76。可以通过去块滤波器80滤波组合信号72,并且可以将滤波后的信号82写入到帧存储器64。
在H.264/AVC中,输入图片可以被划分为固定尺寸的宏块,其中,每个宏块覆盖亮度分量的16×16采样以及两个色度分量中的每个的8×8采样的矩形图片区域。H.264/AVC标准的解码处理被指定用于作为宏块的处理单元。熵解码器54解析压缩视频比特流52的语法元素,并且对它们解多路复用。H.264/AVC指定熵解码的两种可选方法:基于利用基于上下文的自适应变长编码的低复杂性技术,称为CAVLC,以及基于上下文的自适应二进制算术编码的计算要求更高的技术,称为CABAC。在这样的两种熵解码技术中,当前符号的解码可能依赖先前正确解码的符号和自适应更新的上下文模型。另外,可以将例如预测数据信息、剩余数据信息和不同色彩平面的不同数据信息多路复用在一起。解多路复用可以等待,直到元素被熵解码为止。
在熵解码之后,可以通过获得以下来重构宏块:经过逆量化和逆变换的剩余信号、以及为帧内预测信号或帧间预测信号的预测信号。可以通过将去块滤波器应用至解码后的宏块,来减少块失真。通常,在输入信号被熵解码之后,开始这样的随后处理,由此导致熵解码成为解码中的潜在瓶颈。类似地,在使用可选预测机制的编解码器中,例如,H.264/AVC中的层间预测或者其他可缩放编解码器中的层间预测,在解码器处,在处理之前,熵解码可能是必须的,由此使得熵解码是潜在瓶颈。
包括多个宏块的输入图片可以被划分为一个或多个片。假设在编码器和解码器处使用的参考图片相同并且去块滤波不使用跨过片边界的信息,在不使用来自其他片的数据的情况下,可以适当地解码片表示的图片的区域中的采样的值。从而,用于片的熵解码和宏块重构不取决于其他片。特别是,熵编码状态可以在每个片的开始被重置。当定义邻域可用性时,对于熵解码和重构,其他片中的数据可以被标记为不可用。可以并行地熵解码和重构片。优选地,不允许帧内预测和运动矢量预测跨过片的边界。相反地,去块滤波可以使用跨过片边界的信息。
图3示出在水平方向上包括十一个宏块和并且在垂直方向上包括九个宏块(标记为91-99的九个示范性宏块)的示范性视频图片90。图3示出三个示范性片:表示为“片#0”100的第一片、表示为“片#1”101的第二片、以及表示为“片#2”102的第三片。H.264/AVC解码器可以并行地解码和重构三个片100、101、102。每个片可以以顺序的方式按照扫描线顺序被发送。在开始用于每片的解码/重构处理时,上下文模型被初始化或者重置,并且对于熵解码和宏块重构,其他片中的宏块被标记为不可用。从而,对于在“片#1”中的宏块,例如,被标记为93的宏块,在“片#0”中的宏块(例如,被标记为91和92的宏块)可能不被用于上下文模型选择或重构。然而,对于“片#1”中的宏块,例如被标记为95的宏块,“片#1”中的其他宏块(例如,标记为93和94的宏块)将被用于上下文模型选择或重构。从而,在一个片内连续地进行熵解码和宏块重构。除了使用灵活宏块排序(FMO)定义片之外,按照光栅扫描的顺序处理片内的宏块。
灵活宏块排序定义了片组,以修改图片如何被划分为片。通过图片参数集的内容和片头部中的附加信息而用信号发送的宏块到片组映射来定义片组中的宏块。宏块到片组映射由用于图片中的每个宏块的片组标识号构成。片组标识号指定相关联宏块属于哪个片组。每个片组可以被划分为一个或多个片,其中,片是在特定片组的宏块集合内按照光栅扫描的顺序处理的相同片组内的一系列宏块。在片组内连续地进行熵解码和宏块重构。
图4示出分为三个片组的示范性宏块分配:表示为“片组#0”103的第一片组、表示为“片组#1”104的第二片组、以及表示为“片组#2”105的第三片组。这些片组103、104、105可以分别与图片90中的两个前景区域和一个背景区域相关联。
可以将图片划分为一个或多个重构片,其中在如下方面重构片可以是自包含的:假设所使用的参考图片在编码器和解码器处相同,在可以在不使用来自其他重构片的数据的情况下,可以正确地重构在重构片表示的图片的区域中的采样的值。在重构片内的所有重构宏块在用于重构的邻域定义中可用。
重构片可以被划分为多于一个熵片,其中,在不使用来自其他熵片的数据的情况下,可以正确地熵解码在熵片表示的图片的区域中的符号值方面,熵片可以是自包含的。熵编码状态可以在每个熵片的解码开始时被重置。其他熵片中的数据可以在定义邻域可用性时对于熵解码被标记为不可用。在当前块的上下文模型选择中,可能不使用其他熵片中的宏块。可以仅在熵片内更新上下文模型。从而,与熵片相关联的每个熵解码器可以保持其自己的上下文模型的集合。
编码器可以确定是否将重构片划分为熵片,并且编码器可以在比特流中用信号发送决定。信号可以包括熵片标记,其可以表示为“entropy_slice_flag”。参考图5,可以检验130熵片标记,并且如果熵片标记指示不存在132与图片相关联的熵片或者重构片,则头部可以作为常规片头部被解析134。熵解码器状态可以被重置136,并且可以定义138用于熵解码和重构的邻域信息。然后,熵解码140片数据,并且可以重构142片。如果熵片标记指示存在146与图片相关联的熵片或者重构片,然后头部可以作为熵片头部被解析148。熵解码器状态可以被重置150,可以定义152用于熵解码的邻域信息,并且可以熵解码154熵片数据。然后,可以定义156用于重构的邻域信息,并且可以重构142片。在片重构142之后,可以检验158下一个片或图片。
参考图6,例如,考虑包括并行解码N个熵片的能力的解码器,解码器能够并行解码并且可以定义其自己的并行度。解码器可以识别170N个熵片。如果在当前图片或重构片中少于N个熵片可用,如果随后图片或重构片可用,则解码器可以从随后图片或重构片解码熵片。可替换地,在对随后图片或重构片的多个部分解码之前,解码器可以等待,直到当前图片或重构片完全被处理为止。在识别170多达N个熵片之后,可以独立地熵解码每个所识别的熵片。可以对第一熵片解码172-176。第一熵片的解码172-176可以包括重置解码器状态172。如果使用CABAC熵解码,则可以重置CABAC状态。可以定义174用于第一熵片的熵解码的邻域信息,并且对第一熵片数据解码176。对于多达N个熵片中的每个,可以执行这些步骤(用于第N个熵片的178-182)。当对所有或一部分熵片熵解码时,解码器可以重构184熵片。
当存在多于N个熵片时,在完成熵片的熵解码时,解码线程可以开始对下一个熵片熵解码。从而,当线程结束对低复杂性熵片熵解码时,线程可以在不等待其他线程结束它们的解码的情况下,开始对附加熵片解码。
如图3中所示的片的布置可以限于以图像扫描顺序(还被称为光栅扫描或光栅扫描顺序)定义在一对宏块之间的每个片。该扫描顺序片的布置在计算上是有效的,但是不倾向于适于高效并行编码和解码。而且,该片扫描顺序定义也不倾向于将很可能具有非常适用于编码效率的共有特征的图像的较小局部化区域分组到一起。如图4中所示的片的布置在其布置上非常灵活,但是不倾向于使其本身适于高效率并行编码或解码。而且,在解码器中实现该片的非常灵活定义在计算上是复杂的。
参考图7,瓦片技术将图像划分为一组矩形(包括正方形)区域。以光栅扫描顺序对每个瓦片内的宏块(例如,最大编码单元)编码和解码。同样以光栅扫描顺序对瓦片的布置编码和解码。从而,可以存在任何合适数量的列边界(例如,0或更大),并且可以存在任何合适数量的行边界(例如,0或更大)。从而,帧可以定义一个或多个片,诸如,图7中所示的一个片。在一些实施例中,位于不同瓦片中的宏块对于帧间预测、运动补偿、熵编码上下文选择或依赖邻近宏块信息的其他处理不可用。
参考图8,示出将图像划分为一组三个矩形列的瓦片技术。以光栅扫描顺序对每个瓦片内的宏块(例如,最大编码单元)编码和解码。同样以光栅扫描顺序对瓦片编码和解码。可以按照瓦片的扫描顺序定义一个或多个片。每个片独立可解码。例如,片1可以被定义为包括宏块1-9,片2可以被定义为包括宏块10-28,并且片3可以被定义为包括跨越三个瓦片的宏块29-126。瓦片的使用通过在帧的更局部化区域中处理数据而促进了编码效率。
在一个实施例中,在每个瓦片的开始处初始化熵编码和解码处理。在编码器处,该初始化可以包括将熵编码器中的剩余信息写入比特流的处理,被称为冲洗(flushing)的处理,用附加数据填充比特流以达到比特流位置预定义组中的一个,以及将熵编码器设置为预定义或者编码器和解码器已知的已知状态。经常地,已知状态为值的矩阵的形式。另外,预定义比特流位置可以是与多个位对准的位置,例如,字节对准。在解码器处,该初始化处理可以包括将熵解码器设置为编码器和解码器均已知的已知状态,并且忽略比特流中的位,直到从比特流位置预定义组读取为止的处理。
在一些实施例中,多个已知状态对于编码器和解码器可用,并且可以用于初始化熵编码和/或解码处理。传统上,将被用于初始化的已知状态被在片头部中通过熵初始化指示符值用信号发送。通过图7和图8中所示的瓦片技术,瓦片和片相互不对准。从而,由于瓦片和片不对准,传统上不存在被发送用于瓦片的熵初始化指示符值,该值不包含与片中的第一宏块定位在同一地点的为光栅扫描顺序的第一宏块。例如参考图7,使用在片头部中发送的熵初始化指示符值初始化宏块1,但是不存在用于下一个瓦片的宏块16的类似熵初始化指示符值。对于用于单个片(具有用于宏块1的片头部)的相应瓦片的宏块34、43、63、87、99、109和121,通常不给出类似熵初始化指示符信息。
参考图8,以用于三个片的类似方式,熵初始化指示符值被提供在用于片1的宏块1的片头部中、用于片2的宏块10的片头部中以及在用于片3的宏块29的片头部中。然而,以类似于图7的方式,缺少用于中心瓦片(从宏块37开始)和右手瓦片(从宏块100开始)的熵初始化指示符值。在没有用于中间和右手瓦片的熵初始化指示符值的情况下,以并行方式并且通过高编码效率,有效地编码和解码瓦片的宏块是有问题的。
对于使用帧中的一个或多个瓦片和一个或多个片的***,优选地与瓦片的第一宏块(例如,最大编码单元)一起提供熵初始化指示符值。例如,与图7的宏块16一起,提供熵初始化指示符值,以明确地选择熵初始化信息。明确确定可以使用任何合适技术,诸如例如,指示应该使用诸如在先前片头部中的先前熵初始化指示符值,或者另外发送与各个宏块/瓦片相关联的熵初始化指示符值。以此方式,虽然片可以包括包括熵索引值的头部,但是瓦片中的第一宏块可以同样包括熵初始化指示符值。
参考图9A,该附加信息的编码可以是如下:
If(num_column_minus1>0&&num_rows_minusl>O)then
tile_cabac_init_idc_present_flag
num_column_minus1>0确定瓦片中的列数是否为0,并且num_rows_minus1>0确定瓦片中的行数是否为0,两者均有效地确定在编码和解码中是否使用瓦片。如果使用瓦片,则tile_cabac_init_idc_present_flag是指示如何将熵初始化指示符值从编码器传送至解码器的标记。例如,如果将标记设置为第一值,则可以选择第一选项,诸如使用先前传送的熵初始化指示符值。作为特定实例,该先前传送的熵初始化指示符值可以等于在对应于包含瓦片的第一宏块的片的片头部中发送的熵初始化指示符值。例如,如果将标记设置为第二值,则可以选择第二选项,诸如在用于相应瓦片的比特流中提供熵初始化指示符值。作为特定实例,在对应于瓦片的第一宏块的数据中提供熵初始化指示符值。
用于用信号发送指示如何将熵初始化指示符值从编码器发送至解码器的标记的语法可以是如下:
参考图9B,可以使用其他技术来确定是否使用瓦片,诸如,在序列参数集(例如,关于一系列帧的信息)和/或图片参数集(例如,关于特定帧的信息)中包括标记。
语法可以如下:
tile_enable_flag确定在当前图片中是否使用瓦片。
参考图10A和图10B,提供用于瓦片的合适熵初始化指示符值信息的技术可以如下。
首先,核查宏块(例如,编码单元)是否是瓦片中的第一宏块。从而,该技术确定可以包括熵初始化指示符值的瓦片的第一宏块。参考图7,这是指宏块1、16、34、43、63、87、99、109和121。参考图8,这是指宏块1、37和100。
第二,核查瓦片的第一宏块(例如,编码单元)是否不是片的第一宏块(例如,编码单元)。从而,该技术识别片内的附加瓦片。参考图7,这是指宏块16、34、43、63、87、99、109和121。参考图8,这是指宏块37和100。
第三,核查tile_cabac_init_idc_flag是否等于第一值并且是否启动瓦片。在一个特定实施例中,该值等于0。在第二实施例中,该值等于1。在附加实施例中,当(num_column_minus1>0&&num_rows_minus1>0)时,启动瓦片。在另一个实施例中,当tile_enable_flag等于1时,启动瓦片。
对于这样识别的宏块,可以设置cabac_init_idc_present_flag。
然后,如果存在tile_cabac_init_idc_flag并且如果(num_column_minus1>0&&num_rows_minus1>0),则***可以仅用信号发送cabac_init_idc_flag。从而,如果使用瓦片并且标记指示发送熵信息(即,cabac_init_idc flag),则***仅发送熵信息。
编码语法可以是如下:
通常,与瓦片的第一宏块(例如,编码单元)相关联而不与片的第一宏块相关联的的一个或多个标记可以定义熵初始化指示符值。标记可以指示熵初始化指示符值是先前提供的信息、默认值、还是另外将提供的熵初始化指示符值。
再次参考图7,由于直到宏块15被熵解码为止,熵编码都不知晓描述宏块16在比特流中的位的位置,但是解码器知晓图片帧中的宏块16的位置。解码和识别下一个宏块的该方式保持低位开销,这是所期望的。然而,不便于瓦片被并行解码。为了提高识别用于帧中的特定瓦片的比特流中的特定位置的能力,使得在解码器中可以同时并行解码不同瓦片,而不等待熵解码的完成,可以在比特流中包括识别比特流中的瓦片的位置的信号。参考图11,优选地在片的头部中提供比特流中的瓦片的位置的信号发送。如果标记指示在片内发送比特流中的瓦片的位置,则除了片内的每个瓦片的第一宏块内的位置之外,还优选地包括帧内的这样的瓦片的数量。而且,如果期望,可以包括仅用于瓦片的所选集合的位置信息。
编码语法可以如下:
如果在比特流中发送瓦片位置,则用信号发送tile_locations_flag。可以使用绝对位置值或者微分粒度值(瓦片尺寸关于先前编码瓦片的改变)或者任何合适技术,用信号发送tile_offset[i](瓦片距离信息)。
虽然该技术具有低开销,但是编码器通常不能发送比特流,直到所有瓦片被编码为止。
在一些实施例中,期望包括与连续瓦片的最大绝对位置值(瓦片距离信息)或最大微分粒度值(瓦片距离信息)(还被称作最大值)相关联的数据。通过这样的信息,编码器可以仅发送支持所识别的最大值所必须的位数;解码器可以仅接收支持所识别的最大值所必须的位数。例如,由于相对小的最大值,仅小位深度必须用于瓦片位置信息。例如,由于相对大的最大值,大位深度必须用于瓦片位置信息。
作为提高识别不同瓦片的能力,使得可以在解码器中并行处理不同瓦片,而不等待熵解码的另一种技术,可以在与每个瓦片的开始相关联的比特流内使用标记符。这些瓦片标记符以可以在不对比特流的特定部分熵解码的情况下被识别的方式,包括在比特流内。例如,标记符可以开始于开始码,开始码是仅作为标记符数据存在于比特流中的一系列位。而且,标记符可以包括与瓦片和/或瓦片的第一宏块相关联的附加头部。以此方式,在不等待直到所有瓦片均被编码的情况下被编码之后,编码器可以将每个瓦片写入到比特流中,虽然作为结果,位速率增加。另外,特别是当结合缓冲使用时,解码器可以解析比特流,以更有效的方式识别不同瓦片。
瓦片头部可以类似于片头部,但是通常包括较少信息。所要求的主要信息是下一个块的宏块数量、熵初始化数据以及片索引(指示瓦片中的开始CU属于哪个片)。这样的瓦片头部的编码语法可以如图12A中所示。可替换地,主要信息还可以包括初始量化参数。这样的瓦片头部的编码语法可以如图12B中所示。不在片头部中并且不在瓦片头部中发送的值可以被重置为在片头部中发送的值。
在一些实施例中,标记符包括在比特流中并且与瓦片的开始相关联。然而,标记符可以不包括在比特流中用于每个瓦片。这便于编码器和解码器操作不同等级的并行度。例如,编码器可以使用64个瓦片,但是仅在比特流中包括四个标记符。这使能与64个处理的并行编码以及与4个处理的并行解码。在一些实施例中,以编码器和解码器均已知的方式指定比特流中的标记符的数量。例如,标记符的数量可以在比特流中用信号发送或者通过简档或层级来定义。
在一些实施例中,位置数据包括在比特流中并且与瓦片的开始相关联。然而,在比特流中不必包括针对每个瓦片的位置数据。这便于编码器和解码器操作不同等级并行度。例如,编码器可以使用64个瓦片,但是仅在比特流中包括4个位置。这使能与64个处理的并行编码以及与4个处理的并行解码。在一些实施例中,以编码器和解码器均已知的方式指定比特流中的位置的数量。例如,标记符的数量可以在比特流中用信号发送或者通过简档或层级来定义。
在此使用在以上说明书中采用的术语和表达作为说明书的术语并且不限于此,在使用这样的术语和表达时,不旨在排除所示出和描述的特征或其部分的等价物,将认识到,本发明的范围仅由以下权利要求来定义和限制。
这样描述本发明,但是明显地,相同方式可以以多种方式改变。这样的改变不被认为脱离本发明的精神和范围,并且对于本领域技术人员来说明显的所有这样的修改旨在包括在以下权利要求的范围内。