具体实施方式
虽然在此描述的实施例可以采纳使用熵编码/解码的任何视频编码器/解码器(编解码器),但是仅用于说明目的,关于H.264/AVC编码器和H.264/AVC解码器描述示范性实施例。很多视频编码技术以基于块的混合视频编码方法为基础,其中,源编码技术是图片间(还被称作帧间)预测、图片内(还被称作帧内)预测以及预测剩余的变换编码的混合。帧间预测可以采用时间冗余,并且帧内和预测剩余的变换编码可以使用空间冗余。
图1示出示范性H.264/AVC视频编码器2的框图。可以呈现输入图片4(还被称作帧)以用于编码。可以产生预测信号6和剩余信号8,其中,预测信号6可以基于帧间预测10或帧内预测12。可以由运动补偿部14使用一个或多个所存储的参考图片16(还被称作参考帧)和在输入帧4和参考帧16之间处理的运动估计部18确定的运动信息19来确定帧间预测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_minus1>=0)then
tile_cabac_init_idc_present_flag
num_column_minus1>=0确定瓦片中的列数是否不为0,并且num_rows_minus1>=0确定瓦片中的行数是否不为0,两者均有效地确定在编码和解码中是否使用瓦片。如果使用瓦片,则tile_cabax_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_min1>=0&&num_rows_minusl>=0)时,启动瓦片。在另一个实施例中,当tile_enable_flag等于1时,启动瓦片。
对于这样识别的宏块,可以设置cabac_init_idc_present_flag。
然后,如果存在tile_cabac_init_idc_flag并且如果num_column_minusl>=0&& num_rows_minusl>=0),则***可以仅用信号发送tile_cabac_init_idc_present_flag。从而,如果使用瓦片并且标记指示发送熵信息(即,cabac_init_idc flag),则***仅发送熵信息。
编码语法可以是如下:
通常,与瓦片的第一宏块(例如,编码单元)相关联而不与片的第一宏块相关联的的一个或多个标记可以定义熵初始化指示符值。标记可以指示熵初始化指示符值是先前提供的信息、默认值、还是另外将提供的熵初始化指示符值。
再次参考图7,由于直到宏块15被熵解码为止,熵编码都不知晓描述宏块16的位在比特流中的位置,但是解码器知晓图片帧中的宏块16的位置。解码和识别下一个宏块的该方式保持低位开销,这是所期望的。然而,不便于瓦片被并行解码。为了提高识别用于帧中的特定瓦片的比特流中的特定位置的能力,使得在解码器中可以同时并行解码不同瓦片,而不等待熵解码的完成,可以在比特流中包括识别比特流中的瓦片的位置的信号。参考图11,优选地在片的头中提供比特流中的瓦片的位置的信号发送。如果标记指示在片内发送比特流中的瓦片的位置,则除了片内的每个瓦片的第一宏块内的位置之外,还优选地包括帧内的这样的瓦片的数量。而且,如果期望,可以包括仅用于瓦片的所选集合的位置信息。
编码语法可以如下:
如果在比特流中发送瓦片位置,则用信号发送tile_locations_flag。可以使用绝对位置值或者微分粒度值(瓦片尺寸关于先前编码瓦片的改变)或者任何合适技术,用信号发送tile_offset[i]。
虽然该技术具有低开销,但是编码器通常不能发送比特流,直到所有瓦片被编码为止。
在一些实施例中,期望包括与连续瓦片的最大绝对位置值或最大微分粒度值(还被称作最大值)相关联的数据。通过这样的信息,编码器可以仅发送支持所识别的最大值所必须的位数;解码器可以仅接收支持所识别的最大值所必须的位数。例如,由于相对小的最大值,仅小位深度必须用于瓦片位置信息。例如,由于相对大的最大值,大位深度必须用于瓦片位置信息。
作为提高识别不同瓦片的能力,使得可以在解码器中并行处理不同瓦片,而不等待熵解码的另一种技术,可以在与每个瓦片的开始相关联的比特流内使用标记符。这些瓦片标记符以可以在不对比特流的特定部分熵解码的情况下被识别的方式,包括在比特流内。在一个实施例中该标记符可以以0x000001开始,在另一实施例中该标记符可以以0x000002开始,在另一实施例中该标记符可以以0x000004或者任何其他适当的位序列开始。而且,标记符可以包括与瓦片和/或瓦片的第一宏块相关联的附加头。以此方式,在不等待直到所有瓦片均被编码的情况下被编码之后,编码器可以将每个瓦片写入到比特流中,虽然作为结果,位速率增加。另外,特别是当结合缓冲使用时,解码器可以解析比特流,以更有效的方式识别不同瓦片。
瓦片头可以类似于片头,但是通常包括较少信息。所要求的主要信息是下一个块的宏块数量、熵初始化数据以及片索引(指示瓦片中的开始CU属于哪个片)。这样的瓦片头的编码语法可以如图12A中所示。可替换地,主要信息还可以包括初始量化参数。这样的瓦片头的编码语法可以如图12B中所示。不在片头中并且不在瓦片头中发送的值可以被重置为在片头中发送的值。
在一些实施例中,标记符包括在比特流中并且与瓦片的开始相关联。然而,标记符可以不包括在比特流中用于每个瓦片。这便于编码器和解码器操作不同等级的并行度。例如,编码器可以使用64个瓦片,但是仅在比特流中包括四个标记符。这使能与64个处理的并行编码以及与4个处理的并行解码。在一些实施例中,以编码器和解码器均已知的方式指定比特流中的标记符的数量。例如,标记符的数量可以在比特流中用信号发送或者通过简档或层级来定义。
在一些实施例中,位置数据包括在比特流中并且与瓦片的开始相关联。然而,在比特流中不必包括针对每个瓦片的位置数据。这便于编码器和解码器操作不同等级并行度。例如,编码器可以使用64个瓦片,但是仅在比特流中包括4个位置。这使能与64个处理的并行编码以及与4个处理的并行解码。在一些实施例中,以编码器和解码器均已知的方式指定比特流中的位置的数量。例如,标记符的数量可以在比特流中用信号发送或者通过简档或层级来定义。
参考图13,示出用于显式标识瓦片的开始的一个示例性技术。瓦片索引的值被初始化(TileIdx=0),先前瓦片位置的值被初始化(PreviousLocation=0),先前瓦片大小的值被初始化(PreviousTileSize=0),并且多个瓦片的值被初始化(TileCount=(num_columns_minus1+1)*(1+num_rows_minus1+1)300。瓦片数据被写入到瓦片310的第一最大编码单元(LCU)的比特流,在图片的初始情况下其典型地是左上角的LCU。瓦片数据是重构瓦片之内的像素值所必需的数据。如果存在要写入的另一瓦片320,那么可以修改值的集合。可以更新当前瓦片大小330,其指示瓦片中的最大编码单元的数目(CurrentTileSize=CurrentLocation-PreviousLocation),其中CurrentLocation是当前瓦片在比特流中的开始位置。在替代实施例中,可以更新当前瓦片大小以指示瓦片中的编码单元的数目。可以更新瓦片差量偏移340,其指示当前瓦片大小与先前瓦片大小之间的偏移。可以将先前位置设置为当前位置(PreviousLocation=CurrentLocation),可以将先前瓦片大小设置为当前瓦片大小(PreviousTileSize=CurrentTileSize),并且可以使瓦片索引加1(TileIdx=TileIdx+1)350。下一瓦片的第一LCU可以被以数据写入310。重复递归处理,直到片之内不存在要写的附加瓦片355。
如果瓦片计数大于一(TileCount>1)360,那么可以设置存在瓦片位置信息标记(TileLocationInformationPresentFlag=.T.)370。此外,可以写入值的集合380,例如包括TileLocationInformationPresentFlag、TileDifferentialOffset[0]、TileDifferentialOffset[1],…,TileDifferentialOffset[NumberOftileMinus1-1],其中NumberOftileMinus1等于TileCount-1。在一些实施例中将值的集合380写入到片头。在仅存在一个瓦片的情况下360,则跳过对与该瓦片有关的附加数据的存储385。在一些实施例中,TileDifferentialOffset指示当前片之内的瓦片大小。
参考图14,示出用于隐式地标识瓦片的开始的一个示例性技术。瓦片索引的值被初始化(TileIdx=0),先前瓦片位置被初始化(PreviousLocation=0),先前瓦片大小被初始化(PreviousTileSize=0)400。瓦片数据被写入到瓦片的第一最大编码单元(LCU)的比特流410,在图片的初始情况下去典型地是左上角的LCU。如果存在要写入的另一瓦片420,那么将值的集合写入到瓦片的编码单元425。写入425的值可以包括标记符和/或瓦片头信息,其中瓦片头是具有lightweight_slice_flag或等效物的片头。瓦片头信息可以包括例如最大编码单元地址、片索引、以及量化参数信息。下一瓦片的第一LCU可以被以数据写入410。重复该递归处理,直到不存在要写的附加瓦片430。应理解的是,对瓦片开始位置的隐式和/或显式信令可以被包含在比特流之内。
参考图15,除了LCU地址、片索引、和/或量化参数信息之外,瓦片头可以包括一个或多个瓦片索引值。在一些情况下,LCU地址被瓦片索引值TileIdx所替代。在一些情况下,片索引被用于指示先前在比特流之内传送的片参数集的片参数集索引所替代。片参数集可以包含但不局限于用于量化参数、熵编码器初始化参数、参考列表参数、或者环路滤波器参数的值。瓦片索引值可以是任何适当的值,诸如例如,瓦片索引减1。以这种方式,以第一瓦片具有0编号,来以连续方式对瓦片编号。通过包含瓦片索引值,瓦片的解码不太计算复杂。在本发明的一些实施例中,瓦片索引值仅在不与比特流中或片的第一瓦片相对应的瓦片头中。
另外,对于特定片,下述标记可以被包含在瓦片头中,所述标记指示使用片头中的当前信息还是片头中的先前传送的信息。这进一步降低了***的计算复杂性并且还降低了比特流的比特率。
在本发明的一个实施例中,可以用slice_parameter_set_present_flag在比特流中指示标记的存在。slice_parameter_set_present_flag的语法可以如下:
Pic_parameter_set_rbsp(){ |
Descriptor |
pic_parameter_set_id |
ue(v) |
… |
|
slice_parameter_set_present_flag |
u(1) |
rbsp trailing bits() |
|
} |
|
slice_parameter_set_present_flag用信号通知在比特流中是否传送片参数集。一个示例性语法用于图片参数集。仅在slice_parameter_set_present标记指示在比特流中传送片参数集的情况下,在比特流中传送片参数集索引。如果存在“slice_parameter_set_present_flag”并且将其设置为TRUE(真)值,那么用信号通知slice_parameter_set_flag。如果存在“slice_parameter_set_present_flag”并且将其设置为FALSE(伪)值,那么不用信号通知slice_parameter_set_flag。在一些实施例中,当将“slice_parameter_set_present_flag”设置为FALSE值时,则使用来自先前传送的片头的信息。在一些实施例中,TRUE值可以等于1。在一些实施例中,FALSE值可以等于0。对于一些瓦片头,如下所示,由于通过标记slice_parameter_set_flag来用信号通知,可以跳过该处理。对于本发明的一些实施例,标记slice_parameter_set_flag被推断为真值。
参考图16,瓦片头还可以包括片参数集索引值。片参数集索引值可以指片参数集的一个或多个集合,其是片头中的先前传送的信息。片参数集的每个可以包括例如量化参数(QP)、基于上下文的自适应二进制运算编码信息(cabac_init_idc)、参考图片列表修改、或者环路滤波器信息。环路滤波器信息典型地例如包括自适应环路滤波器信息、样本自适应偏移信息、或者去块滤波器信息。
瓦片头的示例性语法如下:
tile_header(){ |
Descriptor |
tile_idx-1 |
u(v) |
If(slice_parameter_set_present_flag) |
|
{ |
|
slice_parameter_set_flag |
u(1) |
if(slice_parameter_set_flag) |
|
slice_parameter_set_id |
ue(v) |
} |
|
… |
|
slice_parameter_set_id:表示片参数集索引值并且指先前在比特流内传送的特定片参数集。图16示出不同瓦片头如何可以包含两个不同slice_parameter_set_id并且指先前在比特流内传送的两个不同片参数集。
tile_idx-1可以指定瓦片索引减1。tile_idx-1可以是无符号数。tile_idx-1可以使用v位,其中v是根据图片中的瓦片的最大数目而确定的。例如,v可以被如下计算:RoundAbove(LOG2(TileCount-1)),其中RoundAbove(x)表示凑整到等于或大于x的第一个整数值。
如先前所述,slice_parameter_set_flag指定是否在比特流中传送slice_parameter_set_id。如果slice_parameter_set_flag是第一个值,那么不在比特流中传送slice_parameter_set_id并且现有的活动片参数集被用于该瓦片。在一个实施例中,活动片参数集是先前瓦片所使用的片参数集。在第二实施例中,活动片参数集是先前瓦片中的最后编码单元所使用的片参数集。如果slice_parameter_set_flag是第二个值,那么在比特流中传送slice_parameter_set_id。在一个实施例中,第一个和第二个值分别是0和1。
slice_parameter_set_id通过瓦片指定所涉及到的片参数集id。
参考图17,在瓦片的结束可以包括用于指示其结束的标记。以这种方式,可使确定瓦片结束的计算复杂度简单化。
在一些情况下,本描述已示出用于利用用于片和/或瓦片的适当数据来创建比特流的技术。通过以适当方式使该信息包含在比特流之内,解码器可类似地接收该数据并且使用它以对比特流更有效地解码。
如先前就图7和图8所描述的,瓦片的使用有利于更高的压缩效率并且进一步有利于对图片的并行编码和解码。瓦片可以或者可以不彼此无关。为了更有效地确定特定瓦片的长度,一起以降低比特流中的信令开销的方式,期望的是在用于图片的片头(或任何其他适当位置)包括用于指示不同瓦片之间何时达到字节对齐的数据。通过提供字节对齐指示,该***可以以每次一字节的向前查找方式来确定瓦片的结束。在达到字节对齐之后所写的任何数据开始于关于比特流中的参考点的字节边界处。在一个实施例中,可以关于片头的结束测量字节对齐。在第二实施例中,可以关于网络抽象单元层的开始测量字节对齐,所述网络抽象单元层可以包含片头、片数据、和/或网络抽象层开始码。另外,该***可以包括比特流中的不同瓦片之间的不同长度的位补零以便于字节对齐。在一些情况下,在一些瓦片之间不必补零。
参考图18,每个瓦片可以在比特流中被显式地用信号通知。如所示出,每个瓦片可以在比特流中以连续方式被提供。可以在用于图片、片、或者例如与第一最大编码单元相关的其他方面的头提供字节对齐的瓦片位置数据的集合,其标识关于比特流中的参考位置对于每个瓦片的字节对齐。例如,存储在第一片头中的瓦片位置信息可以包括用于片之内的所有剩余瓦片(或其子集)的信息,但是不必包括用于第一瓦片的信息,因为它紧接着位于片头之后。在每个瓦片的结束,该***可以结束对于相应瓦片的相应熵解码处理,并且可以包括一系列补零以直到下面的瓦片字节对齐。典型地,补零数据不被熵解码。同样地对最后瓦片补零以直到达到字节对齐。熵解码可以使用CABAC或CAVLC处理。如果需要的话,可以为每个瓦片重置熵解码器。
参考图19,每个瓦片可以在比特流中被隐式地用信号通知。如所示出,每个瓦片可以在比特流中以连续的方式被提供。可以在比特流中为每个相应瓦片(或其子集)提供对于瓦片的字节对齐的瓦片标记符的开始。瓦片标记符的开始可以是十六进制的0x000002。该***不必包括用于第一瓦片的瓦片标记符的开始,因为它紧接着位于片头之后。在每个瓦片的结束,该***可以结束对于相应瓦片的相应熵解码处理,并且可以包括一系列补零以直到下面的瓦片字节对齐。典型地,补零数据不被熵解码。同样地对最后瓦片补零以直到达到字节对齐。熵解码可以使用CABAC或CAVLC处理,其中CABAC表示上下文自适应二进制运算编码方法并且CAVLC表示上下文自适应可变长度编码方法。如果需要的话,可以为每个瓦片重置熵解码器。
在另一实施例中,降低搜索瓦片的开始的开销的一个技术要求每个瓦片字节对齐。因而,每个瓦片将开始于关于比特流中的参考位置的字节边界。此外,瓦片可以包括补零以直到达到字节对齐。片的最后瓦片同样可以包括补零以直到达到字节对齐。补零可以有助于瓦片的字节对齐,并且两个补零可以是不同的位数。
在此使用在以上说明书中采用的术语和表达作为说明书的术语并且不限于此,在使用这样的术语和表达时,不旨在排除所示出和描述的特征或其部分的等价物,将认识到,本发明的范围仅由以下权利要求来定义和限制。
这样描述本发明,但是明显地,相同方式可以以多种方式改变。这样的改变不被认为脱离本发明的精神和范围,并且对于本领域技术人员来说明显的所有这样的修改旨在包括在以下权利要求的范围内。