一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

避免子码流提取中的SPS错误的制作方法

2022-06-01 20:44:57 来源:中国专利 TAG:

避免子码流提取中的sps错误
1.相关申请交叉引用
2.本专利申请要求王业奎于2019年10月7日提交的申请号为62/911,808、发明名称为“视频译码中的可适性(scalability in video coding)”的美国临时专利申请的权益,其内容通过引用结合在本技术中。
技术领域
3.本发明一般涉及视频译码,具体涉及在对多层码流进行子码流提取时防止出错的机制。


背景技术:

4.即使视频相对较短,也需要大量的视频数据来描述,当数据要在带宽容量有限的通信网络中流式传输或以其它方式传输时,这样可能会造成困难。因此,视频数据通常要先压缩,然后通过现代电信网络进行传输。由于内存资源可能有限,当在存储设备上存储视频时,该视频的大小也可能是一个问题。视频压缩设备通常在信源侧使用软件和/或硬件对视频数据进行编码,然后传输或存储视频数据,从而减少表示数字视频图像所需的数据量。然后,对视频数据进行解码的视频解压缩设备在目的地侧接收压缩数据。在网络资源有限以及对更高视频质量的需求不断增长的情况下,需要改进压缩和解压缩技术,这些改进的技术能够在几乎不影响图像质量的情况下提高压缩比。


技术实现要素:

5.一个实施例中,本发明包括一种由解码器实现的方法。所述方法包括:所述解码器接收码流,其中,所述码流包括层的编码层视频序列(coded layer video sequence,clvs)和由所述clvs参考的序列参数集(sequence parameter set,sps),当所述层不使用层间预测时,所述sps的网络抽象层(network abstraction layer,nal)单元头层标识符(nuh_layer_id)值等于所述clvs的nuh_layer_id值;所述解码器根据所述sps将所述clvs中的经编码图像进行解码,以产生经解码图像。
6.一些视频译码系统将视频序列编码为包括图像的层。不同层中的图像具有不同的特征。因此,编码器可以根据解码端约束条件将不同层发送给解码器。为了执行这种功能,编码器可以将所有层编码到单个码流中。根据请求,编码器可以执行子码流提取过程,以从码流中移除无关信息。这样得到提取后的码流,其只包括由解码器请求的一层或多层中的数据。各层如何关联的描述可以包括在视频参数集(video parameter set,vps)中。同播层(simulcast layer)是不参考其它层而显示的层。当同播层发送给解码器时,子码流提取过程可以移除vps,因为对同播层进行解码不需要层关系。但是,其它参数集中的某些变量可以参考vps。因此,在发送同播层时移除vps可以提高译码效率,但也可能会产生错误。此外,无法正确标识sps可能会导致错误地移除sps和vps。这样存在问题,因为如果sps丢失,解码器可能无法正确对层进行解码。本示例包括在子码流提取过程中移除vps时避免错误的机
制。具体地,子码流提取过程根据nuh_layer_id移除nal单元。当clvs包括在不使用层间预测的层中时,sps的nuh_layer_id被约束为等于参考sps的clvs的nuh_layer_id。不使用层间预测的层是同播层。因此,当vps被移除时,sps与该层具有相同的nuh_layer_id。这样,sps就不会通过子码流提取过程错误地移除。是否使用层间预测由vps独立层标志(vps_independent_layer_flag)指示(signal)。但是,当vps被移除时,vps_independent_layer_flag也被移除。相应地,当sps不参考vps时,当前层的vps_independent_layer_flag(即vps_independent_layer_flag[generallayeridx[nuh_layer_id]])被推断为1。当sps vps标识符(sps_video_parameter_set_id)被设置为0时,sps不参考vps。此外,当vps_independent_layer_flag[generallayeridx[nuh_layer_id]]等于1时(例如,当vps不存在时),解码器和/或假设参考解码(hypothetical reference decoder,hrd)可以推断当前层/clvs不使用层间预测。通过这一系列推断,sps可以被约束为包括合适的nuh_layer_id,以避免通过子码流提供过程进行提取,即使vps和对应参数从码流中移除。因此,编码器和解码器的功能增加。此外,通过成功从只包括同播层的码流中移除不需要的vps,提高了译码效率,这样降低了编码器和解码器侧的处理器资源、内存资源和/或网络信令资源的利用率。
[0007]
可选地,根据任一上述方面,在所述方面的另一种实现方式中,generallayeridx[nuh_layer_id]等于当前层索引。
[0008]
可选地,根据任一上述方面,在所述方面的另一种实现方式中,vps_independent_layer_flag表示对应层是否使用层间预测。
[0009]
可选地,根据任一上述方面,在所述方面的另一种实现方式中,当vps_independent_layer_flag[generallayeridx[nuh_layer_id]]等于1时,所述层不使用层间预测。
[0010]
可选地,根据任一上述方面,在所述方面的另一种实现方式中,所述sps包括sps_video_parameter_set_id,所述sps_video_parameter_set_id表示由所述sps参考的vps的标识符(identifier,id)值,当sps_video_parameter_set_id等于0时,所述vps_independent_layer_flag[generallayeridx[nuh_layer_id]]被推断为1。
[0011]
可选地,根据任一上述方面,在所述方面的另一种实现方式中,当所述sps_video_parameter_set_id等于0时,所述sps不参考vps。
[0012]
可选地,根据任一上述方面,在所述方面的另一种实现方式中,所述clvs是具有相同nuh_layer_id值的经编码图像的序列。
[0013]
在一个实施例中,本发明包括一种由编码器实现的方法。所述方法包括:所述编码器将层的clvs编码到码流中;所述编码器将由所述clvs参考的sps编码到所述码流中,其中,当所述层不使用层间预测时,所述sps的nuh_layer_id值被约束为等于所述clvs的nuh_layer_id值;所述编码器存储所述码流,以将所述码流发送给解码器。
[0014]
一些视频译码系统将视频序列编码为包括图像的层。不同层中的图像具有不同的特征。因此,编码器可以根据解码端约束条件将不同层发送给解码器。为了执行这种功能,编码器可以将所有层编码到单个码流中。根据请求,编码器可以执行子码流提取过程,以从码流中移除无关信息。这样得到提取后的码流,其只包括由解码器请求的一层或多层中的数据。各层如何关联的描述可以包括在视频参数集(video parameter set,vps)中。同播层
(simulcast layer)是不参考其它层而显示的层。当同播层发送给解码器时,子码流提取过程可以移除vps,因为对同播层进行解码不需要层关系。但是,其它参数集中的某些变量可以参考vps。因此,在发送同播层时移除vps可以提高译码效率,但也可能会产生错误。此外,无法正确标识sps可能会导致错误地移除sps和vps。这样存在问题,因为如果sps丢失,解码器可能无法正确对层进行解码。本示例包括在子码流提取过程中移除vps时避免错误的机制。具体地,子码流提取过程根据nuh_layer_id移除nal单元。当clvs包括在不使用层间预测的层中时,sps的nuh_layer_id被约束为等于参考sps的clvs的nuh_layer_id。不使用层间预测的层是同播层。因此,当vps被移除时,sps与该层具有相同的nuh_layer_id。这样,sps就不会通过子码流提取过程错误地移除。是否使用层间预测由vps_independent_layer_flag指示。但是,当vps被移除时,vps_independent_layer_flag也被移除。相应地,当sps不参考vps时,当前层的vps_independent_layer_flag(表示为vps_independent_layer_flag[generallayeridx[nuh_layer_id]])被推断为1。当sps_video_parameter_set_id被设置为0时,sps不参考vps。此外,当vps_independent_layer_flag[generallayeridx[nuh_layer_id]]等于1时(例如,当vps不存在时),解码器和/或hrd可以推断当前层/clvs不使用层间预测。通过这一系列推断,sps可以被约束为包括合适的nuh_layer_id,以避免通过子码流提供过程进行提取,即使vps和对应参数从码流中移除。因此,编码器和解码器的功能增加。此外,通过成功从只包括同播层的码流中移除不需要的vps,提高了译码效率,这样降低了编码器和解码器侧的处理器资源、内存资源和/或网络信令资源的利用率。
[0015]
可选地,根据任一上述方面,在所述方面的另一种实现方式中,generallayeridx[nuh_layer_id]等于当前层索引。
[0016]
可选地,根据任一上述方面,在所述方面的另一种实现方式中,vps_independent_layer_flag表示对应层是否使用层间预测。
[0017]
可选地,根据任一上述方面,在所述方面的另一种实现方式中,当vps_independent_layer_flag[generallayeridx[nuh_layer_id]]等于1时,所述层不使用层间预测。
[0018]
可选地,根据任一上述方面,在所述方面的另一种实现方式中,所述sps包括sps_video_parameter_set_id,所述sps_video_parameter_set_id表示由所述sps参考的vps的id值,当所述sps_video_parameter_set_id等于0时,所述vps_independent_layer_flag[generallayeridx[nuh_layer_id]]被推断为1。
[0019]
可选地,根据任一上述方面,在所述方面的另一种实现方式中,当所述sps_video_parameter_set_id等于0时,所述sps不参考vps。
[0020]
可选地,根据任一上述方面,在所述方面的另一种实现方式中,所述clvs是具有相同nuh_layer_id值的经编码图像的序列。
[0021]
在一个实施例中,本发明包括一种视频译码设备。所述视频译码设备包括:处理器、与所述处理器耦合的接收器、与所述处理器耦合的存储器和与所述处理器耦合的发送器,其中,所述处理器、接收器、存储器和发送器用于执行根据任一上述方面所述的方法。
[0022]
在一个实施例中,本发明包括一种非瞬时性计算机可读介质。所述非瞬时性计算机可读介质包括供视频译码设备使用的计算机程序产品,所述计算机程序产品包括存储在
所述非瞬时性计算机可读介质中的计算机可执行指令,当处理器执行所述计算机可执行指令时,使得所述视频译码设备执行根据任一上述方面所述的方法。
[0023]
在一个实施例中,本发明包括一种解码器。所述解码器包括:接收模块,用于接收码流,其中,所述码流包括层的clvs和由所述clvs参考的sps,当所述层不使用层间预测时,所述sps的nuh_layer_id值等于所述clvs的nuh_layer_id值;解码模块,用于根据所述sps对所述clvs中的经编码图像进行解码,以产生经解码图像;转发模块,用于转发所述经解码图像,以将所述经解码图像显示为解码视频序列的一部分。
[0024]
一些视频译码系统将视频序列编码为包括图像的层。不同层中的图像具有不同的特征。因此,编码器可以根据解码端约束条件将不同层发送给解码器。为了执行这种功能,编码器可以将所有层编码到单个码流中。根据请求,编码器可以执行子码流提取过程,以从码流中移除无关信息。这样得到提取后的码流,其只包括由解码器请求的一层或多层中的数据。各层如何关联的描述可以包括在视频参数集(video parameter set,vps)中。同播层(simulcast layer)是不参考其它层而显示的层。当同播层发送给解码器时,子码流提取过程可以移除vps,因为对同播层进行解码不需要层关系。但是,其它参数集中的某些变量可以参考vps。因此,在发送同播层时移除vps可以提高译码效率,但也可能会产生错误。此外,无法正确标识sps可能会导致错误地移除sps和vps。这样存在问题,因为如果sps丢失,解码器可能无法正确对层进行解码。本示例包括在子码流提取过程中移除vps时避免错误的机制。具体地,子码流提取过程根据nuh_layer_id移除nal单元。当clvs包括在不使用层间预测的层中时,sps的nuh_layer_id被约束为等于参考sps的clvs的nuh_layer_id。不使用层间预测的层是同播层。因此,当vps被移除时,sps与该层具有相同的nuh_layer_id。这样,sps就不会通过子码流提取过程错误地移除。是否使用层间预测由vps_independent_layer_flag指示。但是,当vps被移除时,vps_independent_layer_flag也被移除。相应地,当sps不参考vps时,当前层的vps_independent_layer_flag(表示为vps_independent_layer_flag[generallayeridx[nuh_layer_id]])被推断为1。当sps_video_parameter_set_id被设置为0时,sps不参考vps。此外,当vps_independent_layer_flag[generallayeridx[nuh_layer_id]]等于1时(例如,当vps不存在时),解码器和/或hrd可以推断当前层/clvs不使用层间预测。通过这一系列推断,sps可以被约束为包括合适的nuh_layer_id,以避免通过子码流提供过程进行提取,即使vps和对应参数从码流中移除。因此,编码器和解码器的功能增加。此外,通过成功从只包括同播层的码流中移除不需要的vps,提高了译码效率,这样降低了编码器和解码器侧的处理器资源、内存资源和/或网络信令资源的利用率。
[0025]
可选地,根据任一上述方面,在所述方面的另一种实现方式中,所述解码器还用于执行根据任一上述方面所述的方法。
[0026]
在一个实施例中,本发明包括一种编码器。所述编码器包括:编码模块,用于:将层的clvs编码到码流中;将由所述clvs参考的sps编码到所述码流中,其中,当所述层不使用层间预测时,所述sps的nuh_layer_id值被约束为等于所述clvs的nuh_layer_id值;存储模块,用于存储所述码流,以将所述码流发送给解码器。
[0027]
一些视频译码系统将视频序列编码为包括图像的层。不同层中的图像具有不同的特征。因此,编码器可以根据解码端约束条件将不同层发送给解码器。为了执行这种功能,
编码器可以将所有层编码到单个码流中。根据请求,编码器可以执行子码流提取过程,以从码流中移除无关信息。这样得到提取后的码流,其只包括由解码器请求的一层或多层中的数据。各层如何关联的描述可以包括在视频参数集(video parameter set,vps)中。同播层(simulcast layer)是不参考其它层而显示的层。当同播层发送给解码器时,子码流提取过程可以移除vps,因为对同播层进行解码不需要层关系。但是,其它参数集中的某些变量可以参考vps。因此,在发送同播层时移除vps可以提高译码效率,但也可能会产生错误。此外,无法正确标识sps可能会导致错误地移除sps和vps。这样存在问题,因为如果sps丢失,解码器可能无法正确对层进行解码。本示例包括在子码流提取过程中移除vps时避免错误的机制。具体地,子码流提取过程根据nuh_layer_id移除nal单元。当clvs包括在不使用层间预测的层中时,sps的nuh_layer_id被约束为等于参考sps的clvs的nuh_layer_id。不使用层间预测的层是同播层。因此,当vps被移除时,sps与该层具有相同的nuh_layer_id。这样,sps就不会通过子码流提取过程错误地移除。是否使用层间预测由vps_independent_layer_flag指示。但是,当vps被移除时,vps_independent_layer_flag也被移除。相应地,当sps不参考vps时,当前层的vps_independent_layer_flag(表示为vps_independent_layer_flag[generallayeridx[nuh_layer_id]])被推断为1。当sps_video_parameter_set_id被设置为0时,sps不参考vps。此外,当vps_independent_layer_flag[generallayeridx[nuh_layer_id]]等于1时(例如,当vps不存在时),解码器和/或hrd可以推断当前层/clvs不使用层间预测。通过这一系列推断,sps可以被约束为包括合适的nuh_layer_id,以避免通过子码流提供过程进行提取,即使vps和对应参数从码流中移除。因此,编码器和解码器的功能增加。此外,通过成功从只包括同播层的码流中移除不需要的vps,提高了译码效率,这样降低了编码器和解码器侧的处理器资源、内存资源和/或网络信令资源的利用率。
[0028]
可选地,根据任一上述方面,在所述方面的另一种实现方式中,所述编码器还用于执行根据任一上述方面所述的方法。
[0029]
为了清楚起见,任一上述实施例可以与上述其它任何一个或多个实施例组合以创建在本发明范围内的新实施例。
[0030]
根据以下结合附图和权利要求书的详细描述,将会更清楚地理解这些和其它特征。
附图说明
[0031]
为了更全面地理解本发明,现在参考以下结合附图和具体实施方式进行的简要描述,其中,相似的附图标记表示相似的部件。
[0032]
图1为对视频信号进行译码的示例性方法的流程图。
[0033]
图2为用于视频译码的示例性编码和解码(编解码)系统的示意图。
[0034]
图3为示例性视频编码器的示意图。
[0035]
图4为示例性视频解码器的示意图。
[0036]
图5为示例性假设参考解码(hypothetical reference decoder,hrd)的示意图。
[0037]
图6为用于层间预测的示例性多层视频序列的示意图。
[0038]
图7为示例性码流的示意图。
[0039]
图8为示例性视频译码设备的示意图。
[0040]
图9为将多层视频序列编码到码流中以支持为了同播层在子码流提取过程中保留序列参数集(sequence parameter set,sps)的示例性方法的流程图。
[0041]
图10为从码流中解码出视频序列的示例性方法的流程图,其中,所述码流包括从多层码流中提取出的同播层,sps在子码流提取过程中保留。
[0042]
图11为将多层视频序列译码到码流中以支持为了同播层在子码流提取过程中保留sps的示例性系统的流程图。
具体实施方式
[0043]
首先应当理解,尽管下文提供一个或多个实施例的说明性实现方式,但所公开的系统和/或方法可以使用任意数量的技术来实施,无论这些技术是当前已知的还是现有的。本发明决不应限于下文所说明的说明性实现方式、附图和技术,包括本文所说明并描述的示例性设计和实现方式,而是可以在所附权利要求书的范围以及其等效物的完整范围内修改。
[0044]
以下术语的定义如下所述,除非在本文相反的上下文中使用。具体地,以下定义旨在更加清晰地描述本发明。但是,术语在不同的上下文中可能会有不同的描述。因此,以下定义应当视为补充信息,而不应当视为对此处为这些术语提供的描述的任何其它定义进行限制。
[0045]
码流是包括视频数据的一系列比特,这些视频数据会进行压缩以在编码器和解码器之间传输。编码器是一种用于通过编码过程将视频数据压缩到码流中的设备。解码器是一种用于通过解码过程从码流中重建视频数据以进行显示的设备。图像是创建帧或其场的亮度样本和/或色度样本组成的阵列。为了清楚论述,正被编码或解码的图像可以称为当前图像。经编码图像(coded picture)是图像的经编码表示,包括接入单元(access unit,au)内的具有特定网络抽象层(network abstraction layer,nal)单元头层标识符(nuh_layer_id)值的视频编码层(video coding layer,vcl)nal单元并包括该图像中的所有编码树单元(coding tree unit,ctu)。经解码图像(decoded picture)是通过将解码过程应用于经编码图像而产生的图像。nal单元是一种包括原始字节序列载荷(raw byte sequence payload,rbsp)形式的数据、指示数据类型并根据需要穿插预防混淆字节的语法结构。vcl nal单元是编码后包括视频数据的nal单元,例如图像中的经编码条带(coded slice)。非vcl nal单元是包括非视频数据的nal单元,例如支持对视频数据进行解码、一致性检查的性能或其它操作的语法和/或参数。层是一组vcl nal单元和关联的非vcl nal单元,其中,这些vcl nal单元共用由层标识符(identifier,id)表示的指定特征(例如,公共分辨率、帧率、图像大小等)。nal单元头层标识符(nuh_layer_id)是一个表示包括nal单元的层的标识符的语法元素。
[0046]
假设参考解码(hypothetical reference decoder,hrd)是在编码器上操作的解码器模型,检查编码过程产生的码流的可变性,以验证是否与指定的约束条件一致。码流一致性测试(bitstream conformance test)是一种确定经编码码流是否符合通用视频编码(versatile video coding,vvc)等标准的测试。视频参数集(video parameter set,vps)是一种包括与整个视频相关的参数的语法结构。序列参数集(sequence parameter set,
sps)是一种包括应用于0个或0个以上整个编码层视频序列(coded layer video sequence,clvs)的语法元素的语法结构。clvs是具有相同nuh_layer_id值的经编码图像的序列。sps视频参数集标识符(sps_video_parameter_set_id)是一个表示由sps参考的vps的标识符(identifier,id)的语法元素。通用层索引(generallayeridx[i])是一个表示对应层i的索引的派生变量。因此,层id为nuh_layer_id的当前层具有由generallayeridx[nuh_layer_id]表示的索引。当前层索引是与正被编码或解码的层对应的层索引。vps独立层标志(vps_independent_layer_flag[i])是一个表示对应层i是否使用层间预测的语法元素。因此,vps_independent_layer_flag[generallayeridx[nuh_layer_id]]表示当前层是否使用层间预测。层间预测是一种根据与当前层不同的层(例如,在同一接入单元中)中的一个或多个参考图像对当前层中的当前图像的样本值组成的块进行译码的机制。接入单元(access unit,au)是不同层中的一组都与相同输出时间关联的经编码图像。vps参数集标识符(vps_video_parameter_set_id)是一个提供vps的id以供其它语法元素/结构参考的语法元素。编码视频序列(coded video sequence)是一组一个或多个经编码图像。解码视频序列(decoded video sequence)是一组一个或多个经解码图像。
[0047]
本文中使用以下缩略语:接入单元(access unit,au)、编码树块(coding tree block,ctb)、编码树单元(coding tree unit,ctu)、编码单元(coding unit,cu)、编码层视频序列(coded layer video sequence,clvs)、编码层视频序列起始(coded layer video sequence start,clvss)、编码视频序列(coded video sequence,cvs)、编码视频序列起始(coded video sequence start,cvss)、联合视频专家组(joint video experts team,jvet)、假设参考解码(hypothetical reference decoder,hrd)、运动约束分块集(motion constrained tile set,mcts)、最大传输单元(maximum transfer unit,mtu)、网络抽象层(network abstraction layer,nal)、输出层集(output layer set,ols)、操作点(operation point,op)、图像顺序编号(picture order count,poc)、随机接入点(random access point,rap)、原始字节序列载荷(raw byte sequence payload,rbsp)、序列参数集(sequence parameter set,sps)、视频参数集(video parameter set,vps)和通用视频编码(versatile video coding,vvc)。
[0048]
许多视频压缩技术可以用来减小视频文件的大小,同时最大限度地减少数据丢失。例如,视频压缩技术可以包括执行空间(例如帧内)预测和/或时间(例如帧间)预测来减少或去除视频序列中的数据冗余。对于基于块的视频译码,视频条带(例如,视频图像或视频图像的一部分)可以被分割成视频块,这些视频块还可以称为树块(treeblock)、编码树块(coding tree block,ctb)、编码树单元(coding tree unit,ctu)、编码单元(coding unit,cu)和/或编码节点(coding node)。图像中的经帧内译码(i)条带中的视频块是相对于同一图像中的相邻块中的参考样本使用空间预测进行译码的。图像中的经帧间译码单向预测(p)或双向预测(b)条带中的视频块可以是相对于同一图像中的相邻块中的参考样本使用空间预测进行译码的,也可以是相对于其它参考图像中的参考样本使用时间预测进行译码的。图像(picture/image)可以称为帧(flame),参考图像可以称为参考帧。空间预测或时间预测会产生表示图像块的预测块。残差数据表示原始图像块和预测块之间的像素差。因此,经帧间编码块是根据运动矢量和残差数据进行编码的,其中,运动矢量指向形成预测块的参考样本的块,残差数据表示经编码块和预测块之间的差值。经帧内编码块是根据帧
内编码模式和残差数据进行编码的。为了进一步压缩,残差数据可以从像素域变换到变换域。这些产生了可以量化的残差变换系数。量化变换系数最初可以排列为二维阵列。可以扫描量化变换系数,以产生变换系数的一维矢量。可以应用熵编码以实现进一步压缩。下文更详细地论述了这些视频压缩技术。
[0049]
为了确保经编码视频能够正确解码,视频根据对应的视频编码标准进行编码和解码。视频编码标准包括国际电信联盟(international telecommunication union,itu)标准化部门(itu standardization sector,itu-t)h.261、国际标准化组织/国际电工委员会(international organization for standardization/international electrotechnical commission,iso/iec)运动图像专家组(motion picture experts group,mpeg)-1第2部分、itu-th.262或iso/iec mpeg-2第2部分、itu-t h.263、iso/iec mpeg-4第2部分、高级视频编码(advanced video coding,avc)(还称为itu-t h.264或iso/iec mpeg-4第10部分)以及高效视频编码(high efficiency video coding,hevc)(还称为itu-t h.265或mpeg-h第2部分)。avc包括可适性视频编码(scalable video coding,svc)、多视图视频编码(multiview video coding,mvc)和多视图视频编码加深度(multiview video coding plus depth,mvc d)以及三维(three dimensional,3d)avc(3d-avc)等扩展版本。hevc包括可适性hevc(scalable hevc,shvc)、多视图hevc(multiview hevc,mv-hevc)、3d hevc(3d-hevc)等扩展版本。itu-t和iso/iec的联合视频专家组(joint video experts team,jvet)已着手开发一种称为通用视频编码(versatile video coding,vvc)的视频编码标准。vvc涵盖在工作草案(working draft,wd)中,该wd包括jvet-o2001-v14。
[0050]
一些视频译码系统将视频序列编码为包括图像的层。不同层中的图像具有不同的特征。因此,编码器可以根据解码端约束条件将不同层发送给解码器。为了执行这种功能,编码器可以将所有层编码到单个码流中。根据请求,编码器可以执行子码流提取过程,以从码流中移除无关信息。这样得到提取后的码流,其只包括由解码器请求的一层或多层中的数据。各层如何关联的描述可以包括在视频参数集(video parameter set,vps)中。同播层(simulcast layer)是不参考其它层而显示的层。当同播层发送给解码器时,子码流提取过程可以移除vps,因为对同播层进行解码不需要层关系。但是,其它参数集中的某些变量可以参考vps。因此,在发送同播层时移除vps可以提高译码效率,但也可能会产生错误。此外,无法正确标识序列参数集(sequence parameter set,sps)可能会导致错误地移除sps和vps。这样存在问题,因为如果sps丢失,解码器可能无法正确对层进行解码。
[0051]
本文公开了在子码流提取过程中移除vps时避免错误的机制。具体地,子码流提取过程根据网络抽象层(network abstraction layer,nal)单元层标识符(nuh_layer_id)移除nal单元。当编码层视频序列(coded layer video sequence,clvs)包括在不使用层间预测的层中时,sps的nuh_layer_id被约束为等于参考sps的clvs的nuh_layer_id。不使用层间预测的层是同播层。因此,当vps被移除时,sps与该层具有相同的nuh_layer_id。这样,sps就不会通过子码流提取过程错误地移除。是否使用层间预测由vps独立层标志(vps_independent_layer_flag)指示(signal)。但是,当vps被移除时,vps_independent_layer_flag也被移除。相应地,当sps不参考vps时,当前层的vps_independent_layer_flag(即vps_independent_layer_flag[generallayeridx[nuh_layer_id]])被推断为1。当sps vps标识符(sps_video_parameter_set_id)被设置为0时,sps不参考vps。此外,当vps_
independent_layer_flag[generallayeridx[nuh_layer_id]]等于1时(例如,当vps不存在时),解码器和/或假设参考解码(hypothetical reference decoder,hrd)可以推断当前层/clvs不使用层间预测。通过这一系列推断,sps可以被约束为包括合适的nuh_layer_id,以避免通过子码流提供过程进行提取,即使vps和对应参数从码流中移除。因此,编码器和解码器的功能增加。此外,通过成功从只包括同播层的码流中移除不需要的vps,提高了译码效率,这样降低了编码器和解码器侧的处理器资源、内存资源和/或网络信令资源的利用率。
[0052]
图1为对视频信号进行译码的示例性操作方法100的流程图。具体地,在编码器侧对视频信号进行编码。编码过程通过使用各种机制来压缩视频信号,以减小视频文件大小。文件较小使得压缩视频文件可以发送给用户,同时降低相关的带宽开销。然后,解码器对压缩视频文件进行解码,以重建原始视频信号向终端用户进行显示。解码过程通常是编码过程的逆过程,以使解码器重建的视频信号可以与编码器侧的视频信号保持一致。
[0053]
在步骤101中,将视频信号输入到编码器中。例如,视频信号可以是存储在存储器中的未压缩视频文件。又如,视频文件可以由摄像机等视频捕获设备捕获,并且进行编码以支持视频的直播流传输。视频文件可以同时包括音频分量和视频分量。视频分量包括一系列图像帧。这些图像帧按顺序观看时,给人以运动的视觉效果。这些帧包括以光表示的像素,在本文中称为亮度分量(或亮度样本),还包括以颜色表示的像素,称为色度分量(或颜色样本)。在一些示例中,这些帧还可以包括深度值,以支持三维观看。
[0054]
在步骤103中,将视频分割成块。分割包括将每帧中的像素细分成正方形块和/或矩形块进行压缩。例如,在高效视频编码(high efficiency video coding,hevc)(还称为h.265和mpeg-h第2部分)中,首先将帧分成编码树单元(coding tree unit,ctu),即预定义大小(例如64个像素
×
64个像素)的块。这些ctu包括亮度样本和色度样本。编码树可以用于将ctu分成块,然后重复细分这些块,直到获得支持进一步编码的配置。例如,帧的亮度分量可以细分到各个块包括相对均匀的亮度值。此外,帧的色度分量可以细分到各个块包括相对均匀的色值因此,分割机制因视频帧的内容而异。
[0055]
在步骤105中,使用各种压缩机制对在步骤103中分割得到的图像块进行压缩。例如,可以使用帧间预测和/或帧内预测。帧间预测的设计利用了公共场景中的对象往往出现在连续帧中这一事实。这样一来,描述参考帧中的对象的块不需要在相邻帧中重复描述。具体地,一个对象(例如一张桌子)可能在多个帧中保持在固定位置上。因此,该桌子被描述一次,而且相邻帧可以重新参考所述参考帧。模式匹配机制可以用于在多个帧上匹配对象。此外,由于对象移动或相机移动等原因,移动对象可以跨多个帧表示。在一个具体示例中,视频可以在多个帧上显示跨屏幕移动的汽车。运动矢量可以用来描述这种移动。运动矢量是一个二维矢量,提供对象在一个帧中的坐标到该对象在参考帧中的坐标的偏移。因此,帧间预测可以将当前帧中的图像块编码为运动矢量集,这些运动矢量表示当前帧中的图像块与参考帧中的对应块的偏移。
[0056]
帧内预测对公共帧中的块进行编码。帧内预测利用亮度分量和色度分量往往聚集在一个帧中这一事实。例如,一棵树某个部分的一片绿色往往与类似的几片绿色相邻。帧内预测使用多种方向性预测模式(例如,hevc中有33种)、平面模式和直流(direct current,dc)模式。这些方向性模式表示当前块中的样本与对应方向上的相邻块中的样本相似/相
同。平面模式表示一行/列(例如平面)中的一系列块可以根据该行的边缘上的相邻块进行插值。平面模式实际上通过使用变化值的相对恒定的斜率表示光/颜色跨行/列的平稳过渡。dc模式用于边界平滑,并表示块与所有相邻块中的样本的平均值相似/相同,这些相邻块与方向性预测模式的角度方向关联。相应地,帧内预测块可以将图像块表示为各种关系预测模式值而不是表示为实际值。此外,帧间预测块可以将图像块表示为运动矢量值而不是表示为实际值。在任一种情况下,预测块在一些情况下可能都无法准确表示图像块。任何差值都存储在残差块中。变换可以应用于这些残差块以进一步压缩文件。
[0057]
在步骤107中,可以使用各种滤波技术。在hevc中,滤波器是根据环内滤波方案使用的。上文描述的基于块的预测可能会在解码器侧产生块状图像。此外,基于块的预测方案可以对块进行编码,然后重建经编码块,以便后续用作参考块。环内滤波方案迭代地将噪声抑制滤波器、去块效应滤波器、自适应环路滤波器和样本自适应偏移(sample adaptive offset,sao)滤波器应用于块/帧。这些滤波器减少了块伪影,这样可以准确地重建经编码文件。此外,这些滤波器减少了重建参考块中的伪影,这样伪影不太可能在根据重建参考块编码的后续块中产生其它伪影。
[0058]
一旦视频信号完成分割、压缩和滤波,则在步骤109中,将所得数据编码到码流中。码流包括上文描述的数据以及支持在解码器侧进行适当的视频信号重建所需要的任何指示数据。例如,这些数据可以包括分割数据、预测数据、残差块和提供译码指令给解码器的各种标志。码流可以存储在存储器中,以便根据请求向解码器发送。码流还可以广播和/或组播到多个解码器。码流的创建是一个迭代过程。相应地,步骤101、步骤103、步骤105、步骤107和步骤109可以在多个帧和块中连续和/或同时执行。图1所示的顺序是为了清楚和便于论述的目的,并非旨在将视频译码过程限制于特定顺序。
[0059]
在步骤111中,解码器接收码流并开始解码过程。具体地,解码器使用熵解码方案将码流转换为对应的语法数据和视频数据。在步骤111中,解码器使用码流中的语法数据来确定帧的分割部分。分割应该与步骤103中的块分割的结果匹配。下面描述在步骤111中使用的熵编码/解码。编码器在压缩过程中做出许多选择,例如,根据一个或多个输入图像中的值的空间放置从若干个可能选择中选择块分割方案。指示确切的选择可能会使用大量的位元(bin)。本文所使用的“位元”是一个作为变量的二进制值(例如可以因内容而异的比特值)。熵编码使得编码器丢弃任何明显不适合特定情况的选项,从而留下一组可用选项。然后,为每个可用选项分配一个码字。码字的长度取决于可用选项的数量(例如,1个位元对应2个选项,2个位元对应3到4个选项,以此类推)。然后,编码器对所选选项的码字进行编码。这种方案减小了码字的大小,这是因为码字与预期的一样大,从而唯一地指示从可用选项的小子集中进行选择,而不是唯一地指示从所有可能选项的可能大集合中进行选择。然后,解码器通过以与编码器类似的方式确定这组可用选项对这一选择进行解码。通过确定这组可用选项,解码器可以读取码字并确定编码器做出的选择。
[0060]
在步骤113中,解码器执行块解码。具体地,解码器使用逆变换,以产生残差块。然后,解码器使用残差块和对应的预测块,以根据分割来重建图像块。预测块可以包括编码器在步骤105中生成的帧内预测块和帧间预测块。接着,根据在步骤111中确定的分割数据将重建图像块放置在重建视频信号的帧中。还可以通过上述熵编码在码流中指示用于步骤113的语法。
[0061]
在步骤115中,以类似于编码器侧的步骤107的方式对重建视频信号的帧执行滤波。例如,噪声抑制滤波器、去块效应滤波器、自适应环路滤波器和sao滤波器可以应用于帧,以去除块伪影。一旦对帧进行了滤波,则在步骤117中,可以将视频信号输出到显示器,以供终端用户观看。
[0062]
图2为用于视频译码的示例性编码和解码(编解码)系统200的示意图。具体地,编解码系统200提供功能来支持操作方法100的实现。编解码系统200广义地用于描述编码器和解码器中都使用的组件。编解码系统200接收视频信号并对视频信号进行分割,如参照操作方法100中的步骤101和步骤103所述,得到分割后的视频信号201。然后,编解码系统200在充当编码器时将分割后的视频信号201压缩到经编码码流中,如参照方法100中的步骤105、步骤107和步骤109所述。编解码系统200在充当解码器时从码流中生成输出视频信号,如参照操作方法100中的步骤111、步骤113、步骤115和步骤117所述。编解码系统200包括通用译码器控制组件211、变换缩放和量化组件213、帧内估计组件215、帧内预测组件217、运动补偿组件219、运动估计组件221、缩放和逆变换组件229、滤波器控制分析组件227、环内滤波器组件225、解码图像缓冲区组件223以及标头格式和上下文自适应二进制算术编码(context adaptive binary arithmetic coding,cabac)组件231。这些组件如图所示相耦合。在图2中,黑线表示待编码/解码数据的移动,而虚线表示控制其它组件操作的控制数据的移动。编解码系统200中的组件都可以存在于编码器中。解码器可以包括编解码系统200中的组件的子集。例如,解码器可以包括帧内预测组件217、运动补偿组件219、缩放和逆变换组件229、环内滤波器组件225和解码图像缓冲区组件223。下面对这些组件进行描述。
[0063]
分割后的视频信号201是捕获到的已经通过编码树分割成像素块的视频序列。编码树使用各种划分模式将像素块细分成较小的像素块。然后,这些块可以进一步细分成较小的块。这些块可以称为编码树上的节点。较大的父节点划分成较小的子节点。节点进行细分的次数称为节点/编码树的深度。在一些情况下,划分得到的块可以包括在编码单元(coding unit,cu)中。例如,cu可以是ctu的子部分,包括亮度块、一个或多个红色差色度(cr)块和一个或多个蓝色差色度(cb)块以及cu对应的语法指令。划分模式可以包括二叉树(binary tree,bt)、三叉树(triple tree,tt)和四叉树(quad tree,qt),它们用于根据所使用的划分模式将节点分别分割成不同形状的2个、3个或4个子节点。将分割后的视频信号201转发给通用译码器控制组件211、变换缩放和量化组件213、帧内估计组件215、滤波器控制分析组件227和运动估计组件221进行压缩。
[0064]
通用译码器控制组件211用于根据应用约束条件做出与将视频序列中的图像译码到码流中相关的决策。例如,通用译码器控制组件211管理码率/码流大小相对于重建质量的优化。这些决策可以根据存储空间/带宽可用性和图像分辨率请求做出。通用译码器控制组件211还根据传输速度来管理缓冲区利用率,以缓解缓存欠载和超载问题。为了解决这些问题,通用译码器控制组件211管理由其它组件进行的分割、预测和滤波。例如,通用译码器控制组件211可以动态增加压缩复杂度以提高分辨率和带宽利用率,或者降低压缩复杂度以降低分辨率和带宽利用率。因此,通用译码器控制组件211控制编解码系统200中的其它组件来平衡视频信号重建质量与码率。通用译码器控制组件211生成控制数据,这些控制数据用于控制其它组件的操作。还将控制数据转发给标头格式和cabac组件231,以编码到码流中,从而指示解码器进行解码所使用的参数。
[0065]
还将分割后的视频信号201发送给运动估计组件221和运动补偿组件219进行帧间预测。分割后的视频信号201的帧或条带可以被分成多个视频块。运动估计组件221和运动补偿组件219相对于一个或多个参考帧中的一个或多个块对所接收到的视频块执行帧间预测译码,以提供时间预测。编解码系统200可以执行多个译码过程,以便为每个视频数据块选择合适的译码模式,等等。
[0066]
运动估计组件221和运动补偿组件219可以高度集成,但是出于概念目的,单独说明。由运动估计组件221执行的运动估计是生成运动矢量的过程,其中,这些运动矢量用于估计视频块的运动。例如,运动矢量可以表示经编码对象相对于预测块的位移。预测块是在像素差方面发现与待编码块高度匹配的块。预测块还可以称为参考块。这种像素差可以通过绝对差异和(sum of absolute difference,sad)、平方差异和(sum of square difference,ssd)或其它差异度量来确定。hevc使用几个经编码对象,包括ctu、编码树块(coding tree block,ctb)和cu。例如,ctu可以被分成ctb,ctb然后被分成cb,cb包含在cu中。cu可以被编码为包括预测数据的预测单元(prediction unit,pu)和/或包括cu的变换残差数据的变换单元(transform unit,tu)。运动估计组件221使用率失真分析作为率失真优化过程一部分来生成运动矢量、pu和tu。例如,运动估计组件221可以确定当前块/帧的多个参考块、多个运动矢量等,并且可以选择具有最佳率失真特性的参考块、运动矢量等。最佳率失真特性平衡了视频重建的质量(例如,压缩造成的数据丢失量)和译码效率(例如,最终编码的大小)。
[0067]
在一些示例中,编解码系统200可以计算存储在解码图像缓冲区组件223中的参考图像的子整数像素位置的值。例如,视频编解码系统200可以对参考图像的四分之一像素位置、八分之一像素位置或其它分数像素位置的值进行插值。因此,运动估计组件221可以相对于整像素位置和分数像素位置执行运动搜索,并输出具有分数像素精度的运动矢量。运动估计组件221通过将pu的位置与参考图像的预测块的位置进行比较,计算经帧间译码条带中的视频块的pu的运动矢量。运动估计组件221将计算得到的运动矢量作为运动数据输出到标头格式和cabac组件231进行编码,并作为运动数据输出到运动补偿组件219。
[0068]
运动补偿组件219执行的运动补偿可以涉及根据运动估计组件221所确定的运动矢量获取或生成预测块。在一些示例中,运动估计组件221和运动补偿组件219可以在功能上集成。在接收到当前视频块的pu的运动矢量之后,运动补偿组件219可以定位运动矢量指向的预测块。然后,从被译码的当前视频块的像素值中减去预测块的像素值,得到像素差,如此形成残差视频块。一般而言,运动估计组件221相对于亮度分量执行运动估计,运动补偿组件219将根据亮度分量计算到的运动矢量用于色度分量和亮度分量。将预测块和残差块转发到变换缩放和量化组件213。
[0069]
还将分割后的视频信号201发送给帧内估计组件215和帧内预测组件217。与运动估计组件221和运动补偿组件219一样,帧内估计组件215和帧内预测组件217可以高度集成,但是出于概念目的,单独说明。帧内估计组件215和帧内预测组件217相对于当前帧中的各块对当前块进行帧内预测,以替代如上所述的由运动估计组件221和运动补偿组件219在各帧之间执行的帧间预测。具体地,帧内估计组件215确定帧内预测模式以对当前块进行编码。在一些示例中,帧内估计组件215从多个测试的帧内预测模式中选择合适的帧内预测模式来对当前块进行编码。然后,将选定的帧内预测模式转发给标头格式和cabac组件231进
行编码。
[0070]
例如,帧内估计组件215对各种测试的帧内预测模式进行率失真分析来计算率失真值,并在测试的模式中选择具有最佳率失真特性的帧内预测模式。率失真分析通常确定经编码块与经编码以产生经编码块的原始未编码块之间的失真(或误差)量,以及确定用于产生经编码块的码率(例如比特数)。帧内估计组件215根据各种经编码块的失真和速率计算比率,以确定表现出块的最佳率失真值的帧内预测模式。另外,帧内估计组件215可以用于根据率失真优化(rate-distortion optimization,rdo),使用深度建模模式(depth modeling mode,dmm)对深度图像中的深度块进行译码。
[0071]
帧内预测组件217在编码器上实现时可以根据由帧内估计组件215确定的选定帧内预测模式从预测块中生成残差块,或者在解码器上实现时可以从码流中读取残差块。残差块包括预测块与原始块之间的差值,表示为矩阵。然后,将残差块转发给变换缩放和量化组件213。帧内估计组件215和帧内预测组件217可以对亮度分量和色度分量都进行操作。
[0072]
变换缩放和量化组件213用于进一步压缩残差块。变换缩放和量化组件213将离散余弦变换(discrete cosine transform,dct)、离散正弦变换(discrete sine transform,dst)等变换或者概念上类似的变换应用于残差块,从而产生包括残差变换系数值的视频块。还可以使用小波变换、整数变换、子带变换或其它类型的变换。变换可以将残差信息从像素值域转换到变换域,例如频域。变换缩放和量化组件213还用于根据频率等对变换残差信息进行比例缩放。这种比例缩放涉及将比例缩放因子应用于残差信息,使得在不同的粒度下量化不同的频率信息,这可能会影响重建视频的最终视觉质量。变换缩放和量化组件213还用于量化变换系数以进一步降低码率。量化过程可以减小与部分或全部系数相关的位深度。量化程度可以通过调整量化参数来修改。在一些示例中,变换缩放和量化组件213随后可以对包括量化变换系数的矩阵执行扫描。将量化变换系数转发给标头格式和cabac组件231,以将量化变换系数编码到码流中。
[0073]
缩放和逆变换组件229应用与变换缩放和量化组件213相反的操作以支持运动估计。缩放和逆变换组件229应用逆缩放、逆变换和/或反量化以重建像素域中的残差块。例如,残差块后续用作参考块。该参考块可以成为另一当前块的预测块。运动估计组件221和/或运动补偿组件219可以通过将残差块添加回对应的预测块来计算参考块,以用于后续块/帧的运动估计中。将滤波器应用于重建参考块,以减少在缩放、量化和变换过程中产生的伪影。当预测后续块时,这些伪影可能会使预测不准确(并产生额外的伪影)。
[0074]
滤波器控制分析组件227和环内滤波器组件225将滤波器应用于残差块和/或重建图像块。例如,可以将来自缩放和逆变换组件229的变换残差块与来自帧内预测组件217和/或运动补偿组件219的对应预测块组合以重建原始图像块。然后,可以将滤波器应用于重建图像块。在一些示例中,滤波器还可以应用于残差块。与图2中的其它组件一样,滤波器控制分析组件227和环内滤波器组件225高度集成,可以一起实现,但出于概念目的分开示出。将应用于重建参考块的滤波器应用于特定空间区域,这些滤波器包括多个参数以调整使用这些滤波器的方式。滤波器控制分析组件227对重建参考块进行分析,以确定需要使用这些滤波器的位置并设置对应的参数。将这些数据作为滤波器控制数据转发给标头格式和cabac组件231进行编码。环内滤波器组件225根据滤波器控制数据使用这些滤波器。这些滤波器可以包括去块效应滤波器、噪声抑制滤波器、sao滤波器和自适应环路滤波器。这些滤波器
可以根据示例应用于空域/像素域(例如重建像素块)或频域中。
[0075]
当作为编码器操作时,解码图像缓冲区组件223存储经滤波的重建图像块、残差块和/或预测块,以供后续用于运动估计中,如上所述。当作为解码器操作时,解码图像缓冲区组件223存储经滤波的重建块并将其转发给显示器,这些重建块是输出视频信号的一部分。解码图像缓冲区组件223可以是任何能够存储预测块、残差块和/或重建图像块的存储设备。
[0076]
标头格式和cabac组件231从编解码系统200中的各种组件接收数据,并将这些数据编码到经编码码流中,以发送给解码器。具体地,标头格式和cabac组件231生成各种标头以对控制数据(例如通用控制数据和滤波器控制数据)进行编码。此外,将预测数据(包括帧内预测数据和运动数据)以及以量化变换系数数据为形式的残差数据都编码到码流中。最终的码流包括解码器重建原始分割后的视频信号201所需要的所有信息。这些信息还可以包括帧内预测模式索引表(还称为码字映射表)、各种块的编码上下文的定义、最可能帧内预测模式的指示、分割信息的指示等。这些数据可以通过熵编码来编码。例如,这些信息可以通过上下文自适应可变长度编码(context adaptive variable length coding,cavlc)、cabac、基于语法的上下文自适应二进制算术编码(syntax-based context-adaptive binary arithmetic coding,sbac)、概率区间分割熵(probability interval partitioning entropy,pipe)编码或其它熵编码技术来编码。在熵编码之后,可以将经编码码流发送给另一设备(例如视频解码器)或存档以供后续发送或检索。
[0077]
图3为示例性视频编码器300的框图。视频编码器300可以用于实现编解码系统200的编码功能和/或执行操作方法100中的步骤101、步骤103、步骤105、步骤107和/或步骤109。编码器300对输入视频信号进行分割,得到分割后的视频信号301,其基本上类似于分割后的视频信号201。然后,编码器300中的组件压缩分割后的视频信号301并将其编码到码流中。
[0078]
具体地,将分割后的视频信号301转发给帧内预测组件317进行帧内预测。帧内预测组件317可以基本上类似于帧内估计组件215和帧内预测组件217。还将分割后的视频信号301转发给运动补偿组件321,以根据解码图像缓冲区组件323中的参考块进行帧间预测。运动补偿组件321可以基本上类似于运动估计组件221和运动补偿组件219。将来自帧内预测组件317和运动补偿组件321的预测块和残差块转发给变换和量化组件313进行残差块的变换和量化。变换和量化组件313可以基本上类似于变换缩放和量化组件213。将变换量化残差块和对应的预测块(与相关的控制数据一起)转发给熵编码组件331,以译码到码流中。熵编码组件331可以基本上类似于标头格式和cabac组件231。
[0079]
还将变换量化残差块和/或对应的预测块从变换和量化组件313转发给逆变换和反量化组件329,以重建为参考块供运动补偿组件321使用。逆变换和反量化组件329可以基本上类似于缩放和逆变换组件229。还将环内滤波器组件325中的环内滤波器应用于残差块和/或重建参考块,具体取决于示例。环内滤波器组件325可以基本上类似于滤波器控制分析组件227和环内滤波器组件225。环内滤波器组件325可以包括多个滤波器,如参照环内滤波器组件225所述。然后,将经滤波的块存储在解码图像缓冲区组件323中,以作为参考块供运动补偿组件321使用。解码图像缓冲区组件323可以基本上类似于解码图像缓冲区组件223。
[0080]
图4为示例性视频解码器400的框图。视频解码器400可以用于实现编解码系统200的解码功能和/或执行操作方法100中的步骤111、步骤113、步骤115和/或步骤117。解码器400从编码器300等接收码流,并根据所述码流生成重建输出视频信号,以向终端用户显示。
[0081]
码流由熵解码组件433接收。熵解码组件433用于执行熵解码方案,例如,cavlc、cabac、sbac、pipe编码或其它熵编码技术。例如,熵解码组件433可以使用标头信息来提供上下文以解析在码流中编码为码字的附加数据。经解码信息包括对视频信号进行解码所需的任何信息,例如,通用控制数据、滤波器控制数据、分割信息、运动数据、预测数据和残差块中的量化变换系数。将量化变换系数转发给逆变换和反量化组件429,以重建成残差块。逆变换和反量化组件429可以类似于逆变换和反量化组件329。
[0082]
将重建残差块和/或预测块转发给帧内预测组件417,以根据帧内预测操作重建为图像块。帧内预测组件417可以类似于帧内估计组件215和帧内预测组件217。具体地,帧内预测组件417使用预测模式来定位帧中的参考块,并将残差块应用于上述结果以重建帧内预测图像块。将重建帧内预测图像块和/或残差块以及对应的帧间预测数据通过环内滤波器组件425转发给解码图像缓冲区组件423。解码图像缓冲区组件423和环内滤波器组件425可以基本上分别类似于解码图像缓冲区组件223和环内滤波器组件225。环内滤波器组件425对重建图像块、残差块和/或预测块进行滤波。这些信息存储在解码图像缓冲区组件423中。将来自解码图像缓冲区组件423的重建图像块转发给运动补偿组件421进行帧间预测。运动补偿组件421可以基本上类似于运动估计组件221和/或运动补偿组件219。具体地,运动补偿组件421使用参考块的运动矢量来生成预测块,并将残差块应用于上述结果以重建图像块。还可以将所得到的重建块转发通过环内滤波器组件425转发给解码图像缓冲区组件423。解码图像缓冲区组件423继续存储其它重建图像块。这些重建图像块可以通过分割信息重建为帧。这些帧还可以放置在一个序列中。该序列作为重建输出视频信号输出到显示器。
[0083]
图5为示例性hrd 500的示意图。hrd 500可以在编码器(例如编解码器系统200和/或编码器300)中使用。hrd 500可以检查在方法100的步骤109中产生的码流,然后,将码流转发给解码器,例如解码器400。在一些示例中,当码流进行编码时,码流可以不断地通过hrd 500转发。如果码流的一部分与相关约束条件不一致,则hrd 500会向编码器指示这种不一致情况,以使得编码器使用不同的机制对码流的对应部分进行重新编码。
[0084]
hrd 500包括假设流调度方法(hypothetical stream scheduler,hss)541。hss 541是用于执行假设传输机制(hypothetical delivery mechanism)的组件。假设传输机制用于检查码流或解码器关于输入到hrd 500中的码流551的时间和数据流的一致性。例如,hss 541可以接收从编码器输出的码流551,并管理对码流551进行的一致性测试过程。在一个特定的示例中,hss 541可以控制经编码图像在hrd 500中移动的速率,并验证码流551不包括不一致数据。
[0085]
hss 541可以按照预定义的速率将码流551转发给cpb 543。hrd 500可以管理解码单元(decoding unit,du)553中的数据。du 553是接入单元(access unit,au)或au和关联的非视频编码层(video coding layer,vcl)网络抽象层(network abstraction layer,nal)单元的子集。具体地,au包括与输出时间关联的一个或多个图像。例如,au可以包括单层码流中的单个图像,并且可以包括多层码流中的每层中的图像。au中的每个图像可以被
分成条带,这些条带分别包括在对应的vcl nal单元中。因此,du 553可以包括一个或多个图像、图像中的一个或多个条带或其组合。此外,用于对au/du、图像和/或条带进行解码的参数可以包括在非vcl nal单元中。因此,du 553包括非vcl nal单元,这些非vcl nal单元包括支持对du 553中的vcl nal单元进行解码所需的数据。cpb 543是hrd 500中的先入先出缓冲区。cpb 543包括du 553,du 553包括解码顺序中的视频数据。cpb 543存储这些视频数据以在码流一致性验证过程中使用。
[0086]
cpb 543将du 553转发给解码过程组件545。解码过程组件545是与vvc标准一致的组件。例如,解码过程组件545可以模拟终端用户使用的解码器400。解码过程组件545以示例性终端用户解码器可以实现的速率对du 553进行解码。如果解码过程组件545不能足够快地对du 553进行解码以防止cpb 543溢出(或防止缓冲区欠载),则码流551与标准不一致且需要重新编码。
[0087]
解码过程组件545对du 553进行解码,产生了经解码du 555。经解码du 555包括经解码图像。将经解码du 555转发给dpb 547。dpb 547可以基本上类似于解码图像缓冲区组件223、323和/或423。为了支持帧间预测,将从经解码du 555中获取的标识为用作参考图像556的图像返回给解码过程组件545,以支持进一步解码。dpb 547将解码视频序列输出为一系列图像557。图像557是经重建图像,通常是由编码器编码到码流551中的图像的镜像。
[0088]
将图像557转发给输出裁剪组件549。输出裁剪组件549用于将一致性裁剪窗口(conformance cropping window)应用于图像557。这样得到裁剪后的输出图像559。裁剪后的输出图像559是完全重建的图像。因此,裁剪后的输出图像559模仿终端用户在对码流551进行解码时看到的内容。这样一来,编码器可以查看裁剪后的输出图像559,以确保编码令人满意。
[0089]
根据码流551中的hrd参数初始化hrd 500。例如,hrd 500可以从vps、sps和/或sei消息中读取hrd参数。然后,hrd 500可以根据这些hrd参数中的信息对码流551执行一致性测试操作。在一个具体的示例中,hrd 500可以根据hrd参数确定一个或多个cpb传输时间表(delivery schedule)。传输时间表指定视频数据在cpb和/或dpb等存储位置之间传输的时间。因此,cpb传输时间表指定在cpb 543之间传输au、du 553和/或图像的时间。需要说明的是,hrd 500可以对dpb 547使用类似于cpb传输时间表的dpb传输时间表。
[0090]
视频可以被译码到不同的层和/或ols中,以供不同硬件能力级别的解码器使用以及用于改变网络条件。选择cpb传输时间表以反映这些问题。相应地,为最佳硬件和网络条件指定高层子码流,因此高层可以接收一个或多个cpb传输时间表,这些传输时间表使用cpb 543中的大量内存和向dpb 547发送du 553的短时延。同理,为有限的解码器硬件能力和/或恶劣的网络条件指定低层子码流,因此低层可以接收一个或多个cpb传输时间表,这些传输时间表使用cpb 543中的少量内存和向dpb 547发送du 553的较长时延。然后,可以根据对应的传输时间表测试ols、层、子层或其组合,以确保在子码流预期的条件下可以正确解码得到的子码流。相应地,码流551中的hrd参数可以表示cpb传输时间表,并且包括足够的数据以使得hrd 500可以确定cpb传输时间表并将cpb传输时间表与对应的ols、层和/或子层关联起来。
[0091]
图6为用于层间预测621的示例性多层视频序列600的示意图。根据方法100等,多层视频序列600可以由编码器(例如,编解码系统200和/或编码器300)编码,并由解码器(例
如,编解码系统200和/或解码器400)解码。此外,多层视频序列600可以通过hrd(例如hrd 500)检查标准一致性。将多层视频序列600包括在内是为了描述编码视频序列中的各层的示例性应用。多层视频序列600是使用多层(例如,层n 631和层n 1 632)的任何视频序列。
[0092]
在一个示例中,多层视频序列600可以使用层间预测621。层间预测621应用于不同层中的图像611、612、613和614与图像615、616、617和618之间。在所示的示例中,图像611、612、613和614是层n 1 632的一部分,而图像615、616、617和618是层n 631的一部分。层n 631和/或层n 1 632等是一组图像,这些图像都与类似的大小、质量、分辨率、信噪比、能力等类似的特征值关联。层可以正式被定义为一组vcl nal单元和关联的非vcl nal单元。vcl nal单元是编码后包括视频数据的nal单元,例如图像中的经编码条带(coded slice)。非vcl nal单元是包括非视频数据的nal单元,例如支持对视频数据进行解码、一致性检查的性能或其它操作的语法和/或参数。
[0093]
在所示的示例中,与层n 631相比,层n 1 632与更大的图像大小关联。相应地,在本示例中,层n 1 632中的图像611、612、613和614比层n 631中的图像615、616、617和618大(例如,高度和宽度更大,因此样本更多)。但是,这些图像可以根据其它特征分布在层n 1 632和层n 631之间。虽然只示出了层n 1 632和层n 631两层,但一组图像可以根据关联特征分布在任意数量的层中。层n 1 632和层n 631还可以通过层id表示。层id是与图像关联的数据项,表示图像是指示层的一部分。因此,图像611至618中的每个图像可以与对应的层id关联,以表示层n 1 632或层n 631中的哪一层包括对应的图像。例如,层id可以包括nal单元头层标识符(nuh_layer_id),即一个表示包括nal单元(例如,包括层中的各个图像中的条带和/或参数)的层的标识符的语法元素。与较低质量/较小码流大小关联的层(例如层n 631)通常分配有低层id,称为低层。此外,与较高质量/较大码流大小关联的层(例如层n 1 632)通常分配有高层id,称为高层。
[0094]
不同层631和632中的图像611至618被配置为交替显示。在一个具体的示例中,如果需要较小的图像,则解码器可以对图像615进行解码并在当前显示时间显示;如果需要较大的图像,则解码器可以对图像611进行解码并在当前显示时间显示。因此,高层n 1 632中的图像611至614与低层n 631中的对应图像615至618包括基本上相同的图像数据(虽然图像大小不同)。具体地,图像611与图像615包括基本上相同的图像数据,图像612与图像616包括基本上相同的图像数据,以此类推。
[0095]
图像611至618可以通过参考同一层n 631或n 1 632中的其它图像611至618进行译码。参考同一层中的一个图像对另一个图像进行译码即为帧间预测623。帧间预测623由实线箭头表示。例如,图像613可以使用将层n 1 632中的图像611、612和/或614中的一个或两个图像作为参考的帧间预测623进行译码,其中,单向帧间预测使用一个图像作为参考和/或双向帧间预测使用两个图像作为参考。此外,图像617可以使用将层n 631中的图像615、616和/或618中的一个或两个图像作为参考的帧间预测623进行译码,其中,单向帧间预测使用一个图像作为参考和/或双向帧间预测使用两个图像作为参考。当在执行帧间预测623时将一个图像作为同一层中的另一个图像的参考时,该图像可以称为参考图像。例如,图像612可以是用于根据帧间预测623对图像613进行译码的参考图像。帧间预测623还可以称为多层上下文中的层内预测。因此,帧间预测623是一种通过参考与当前图像不同的一个参考图像中的指示样本对当前图像中的样本进行译码的机制,其中,参考图像和当前
图像在同一层中。
[0096]
图像611至618还可以通过参考不同层中的其它图像611至618进行译码。这个过程称为层间预测621,由虚线箭头表示。层间预测621是一种通过参考一个参考图像中的指示样本对当前图像中的样本进行译码的机制,其中,当前图像和参考图像在不同的层中,因此具有不同的层id。例如,低层n 631中的图像可以用作对高层n 1 632中的对应图像进行译码的参考图像。在一个具体的示例中,图像611可以根据层间预测621通过参考图像615进行译码。在这种情况下,图像615用作层间参考图像。层间参考图像是层间预测621使用的参考图像。在大多数情况下,层间预测621被约束为使得当前图像(例如图像611)只能使用同一au中包括的且在低层中的一个或多个层间参考图像,例如图像615。当多层(例如,两层以上)可用时,层间预测621可以根据级别比当前图像低的多个层间参考图像对当前图像进行编码/解码。
[0097]
视频编码器可以使用多层视频序列600通过帧间预测623和层间预测621的许多不同组合和/或排列对图像611至618进行编码。例如,图像615可以根据帧内预测进行译码。然后,通过将图像615用作参考图像,图像616至618可以根据帧间预测623进行译码。此外,通过将图像615用作层间参考图像,图像611可以根据层间预测621进行译码。然后,通过将图像611用作参考图像,图像612至614可以根据帧间预测623进行译码。因此,参考图像可以用作不同译码机制的单层参考图像和层间参考图像。通过根据低层n 631图像对高层n 1 632图像进行译码,高层n 1 632可以避免使用帧内预测,帧内预测的译码效率比帧间预测623和层间预测621的译码效率低得多。因此,译码效率低的帧内预测可以只限于最小/最低质量的图像,因此只限于对最少量的视频数据进行译码。用作参考图像和/或层间参考图像的图像可以在参考图像列表结构中包括的一个或多个参考图像列表的条目中指示。
[0098]
需要说明的是,层n 1 632和层n 631等可以包括在输出层集(output layer set,ols)中。ols是一组一层或多层,其中,至少一层是输出层。例如,层n 631可以包括在第一ols中,而层n 631和层n 1 632都可以包括在第二ols中。这样使得不同的ols被发送给不同的解码器,具体取决于解码端条件。例如,码流提取过程可以从多层视频序列600中移除与目标ols无关的数据,然后将目标ols发送给解码器。因此,多层视频序列600的经编码副本可以存储在编码器(或对应的内容服务器)中,而各种ols可以根据请求进行提取并发送给不同的解码器。
[0099]
同播层是不使用层间预测621的层。例如,层n 1 632根据层间预测621通过参考层n631进行译码,而层631不通过参考另一层进行译码。因此,层631是同播层。多层视频序列600等可适性视频序列通常使用基本层和一个或多个增强层,这些增强层增强基本层的某种属性。在图6中,层n 631是基本层。基本层通常译码为同播层。还需要说明的是,图6是示例性的和非限制性的,因为包括多层的视频序列可以使用许多不同组合/排列的依赖关系。码流可以包括任意数量的层,这些任意数量的层可以是同播层。例如,层间预测621可以完全省略,在这种情况下,所有层都是同播层。又如,多视图应用显示两个或两个以上输出层。因此,多视图应用通常包括两个或两个以上基本层(都是同播层),并且可以包括对应于每个基本层的增强层。
[0100]
同播层可以与使用层间预测621的层进行不同处理。例如,当对使用层间预测621的层进行译码时,编码器应该指示层的数量以及各层之间的依赖关系,以便支持解码。但
是,对于同播层,这些信息可以省略。例如,层n 1 632和层n 631的配置可以在vps中指示,下文提供更详细的论述。然而,层n 631可以在没有这些信息的情况下进行解码。因此,当只有层n 631发送给解码器时,vps可以从对应的码流中移除。但是,如果码流中剩余的参数参考vps,这样可能会产生错误。此外,每层可以通过sps描述。用于同播层的sps应该被编码到多层码流中,这样就不会错误地移除sps和vps。下文更详细地论述了这些和其它问题。
[0101]
图7为示例性码流的示意图700。例如,码流700可以由编解码系统200和/或编码器300生成,以由编解码系统200和/或解码器400根据方法100进行解码。此外,码流700可以包括多层视频序列600。另外,码流700可以包括各种参数以控制hrd(例如hrd 500)的操作。根据这些参数,hrd 500可以检查码流700是否与标准一致,然后将码流发送给解码器进行解码。
[0102]
码流700包括vps 711、一个或多个sps 713、多个图像参数集(picture parameter set,pps)715、多个条带头717和图像数据720。vps 711包括与整个码流700相关的数据。例如,vps 711可以包括码流700中使用的数据相关的ols、层和/或子层。sps 713包括码流700中包括的编码视频序列中所有图像共用的序列数据。例如,每层可以包括一个或多个编码视频序列,每个编码视频序列可以参考sps 713以获取对应的参数。sps 713中的参数可以包括图像大小、位深度、编码工具参数、码率限制等。需要说明的是,虽然每个序列都参考sps 713,但在一些示例中,单个sps 713可以包括多个序列的数据。pps 715包括适用于整个图像的参数。因此,视频序列中的每个图像都可以参考pps 715。需要说明的是,虽然每个图像都参考pps 715,但是在一些示例中,单个pps 715可以包括多个图像的数据。例如,多个类似的图像可以根据类似的参数进行译码。在这种情况下,单个pps 715可以包括这些类似图像的数据。pps 715可以表示量化参数、偏移和可用于对应图像中的条带的编码工具,等等。
[0103]
条带头717包括图像中的每个条带特有的参数。因此,视频序列中的每个条带可以存在一个条带头717。条带头717可以包括条带类型信息、图像顺序编号(picture order count,poc)、参考图像列表、预测权重、分块入口点、去块效应滤波参数,等等。需要说明的是,在一些示例中,码流700还可以包括图像头,图像头是一种包括适用于单个图像中所有条带的参数的语法结构。为此,图像头和条带头717可以在一些上下文中互换使用。例如,一些参数可以在条带头717和图像头之间挪动,取决于这些参数是否是图像中的所有条带共用的。
[0104]
图像数据720包括根据帧间预测、层间预测和/或帧内预测进行编码的视频数据以及对应的变换量化残差数据。例如,图像数据720可以包括层723和724、图像725和726和/或条带727和728。层723和724是一组vcl nal单元741和关联的非vcl nal单元742,其中,vcl nal单元741共用由层id(例如nuh_layer_id 732)表示的指定特征(例如,公共分辨率、帧率、图像大小等)。例如,层723可以包括一组具有相同nuh_layer_id 732的图像725。同理,层724可以包括一组具有相同nuh_layer_id 732的图像726。层723和724可以基本上相似,但可以包括不同的内容。例如,层723和724可以分别包括图6中的层n631和层n 1 632。因此,经编码码流700可以包括多层723和724。虽然为了清楚论述,只示出了两层723和724,但码流700中可以包括任意数量的层723和724。
[0105]
nuh_layer_id 732是一个表示包括至少一个nal单元的层723和/724的标识符的
语法元素。例如,称为基本层的最低质量层可以包括nuh_layer_id 732的最小值,nuh_layer_id 732的值越大,层的质量越高。因此,低层是nuh_layer_id 732的值较小的层723或724,高层是nuh_layer_id 732的值较大的层723或724。层723和724的数据根据nuh_layer_id 732进行关联。例如,参数集和视频数据可以与对应于包括这些参数集/视频数据的最低层723或724的nuh_layer_id 732的值关联。因此,当一组vcl nal单元741都具有特定的nuh_layer_id 732的值时,这组vcl nal单元741是层723和/或724的一部分。
[0106]
一组图像725和726中的图像是创建帧或其场的亮度样本和/或色度样本组成的阵列。例如,一组图像725和726中的图像是经编码图像,其可以输出进行显示或用于支持对其它一个或多个图像进行译码以便输出。一组图像725和726中的图像基本上相似,但是一组图像725包括层723中,而一组图像726包括在层724中。一组图像725和726中的图像包括一个或多个条带727和728。条带727/728可以被定义为图像中的整数个完整分块或(例如一个分块内的)整数个连续完整的编码树单元(coding tree unit,ctu)行,这些分块或ctu行只包括在单个nal单元(例如vcl nal单元741)中。条带727和条带728基本上相似,不同点在于条带727包括在图像725和层723中,而条带728包括在图像726和层724中。条带727/728进一步分成ctu和/或编码树块(coding tree block,ctb)。ctu是一组预定义大小的样本,可以通过编码树(coding tree)分割。ctb是ctu的子集,包括ctu的亮度分量或色度分量。ctu/ctb根据编码树进一步分成编码块(coding block)。然后,编码块可以根据预测机制进行编码/解码。
[0107]
编码层视频序列(coded layer video sequence,clvs)743和clvs 744是具有相同nuh_layer_id 732的值的经编码图像725和图像725的序列。例如,clvs 743和/或744可以是分别包括在单层723和/或724中的图像725和/或726的序列。相应地,clvs 743包括层723中的所有图像725,clvs 744包括层724中的所有图像726。clvs 743和744分别参考对应的sps 713。根据不同的示例,clvs 743和743可以参考相同的sps 713,clvs 743和743也可以分别参考不同的sps 713。
[0108]
码流700可以译码为nal单元的序列。nal单元是视频数据和/或支持语法的容器。nal单元可以是vcl nal单元741,也可以是非vcl nal单元742。vcl nal单元741是编码后包括视频数据的nal单元,例如图像数据720和关联的条带头717。在一个具体的示例中,每个条带727和728以及关联的条带头717可以编码到单个vcl nal单元741中。非vcl nal单元742是包括非视频数据的nal单元,例如支持对视频数据进行解码、一致性检查的性能或其它操作的语法和/或参数。例如,非vcl nal单元742可以包括vps711、sps 713、pps 715、图像头或其它支持语法。因此,码流700是一系列vcl nal单元741和非vcl nal单元742。每个nal单元包括nuh_layer_id 732,这使得编码器或解码器可以确定哪一层723或724包括对应的nal单元。
[0109]
在解码器请求之前,可以一直编码和存储包括多层723和724的码流700。例如,解码器可以请求层723、层724和/或包括多层723和724的ols。在一个特定的示例中,层723是基本层,而层724是增强层。码流700中还可以使用其它层。编码器和/或内容服务器应该向解码器只发送对请求的一个或多个输出层进行解码所需的层723和/或724。例如,当层用于不同的图像大小时,请求最大图像大小的解码器可以接收包括层723和724的整个码流700。请求最小图像大小的解码器可以只接收层723。请求中等图像大小的解码器可以接收层723
和其它一个或多个中间层,但不接收最高层724,因此不接收整个码流。同样的方法也可以用于其它层特征,例如,帧率、图像分辨率等。
[0110]
子码流提取过程729用于从比特流700中提取出子码流701以支持上文描述的功能。子码流701是码流700中的nal单元(例如,非vcl nal单元742和vcl nal单元741)的子集。具体地,子码流701可以包括与一层或多层相关的数据,但不包括与其它层相关的数据。在所示的示例中,子码流701包括与层723相关的数据,但不包括与层724相关的数据。因此,子码流701包括sps 713、pps 715、条带头717和图像数据720,图像数据720包括层723、clvs 743、图像725和条带727。子码流提取过程729根据nuh_layer_id 732移除nal单元。例如,只与高层724关联的vcl nal单元741和非vcl nal单元742包括nuh_layer_id 732的较大值,因此移除nuh_layer_id 732的较大值的所有nal单元提取出低层723和关联参数。每个nal单元的nuh_layer_id 732的值小于或等于最低层的nuh_layer_id 732,该最低层包括该nal单元来支持子码流提取过程729。需要说明的是,码流700和子码流701通常都可以称为码流。
[0111]
在所示的示例中,子码流701包括同播层(例如基本层)。如上所述,同播层是不使用层间预测的任一层。vps 711包括描述层723和724的配置的数据。但是,对层723等同播层进行解码不需要这些数据。因此,子码流提取过程729移除vps 711,以在提取同播层时提高译码效率。这样可能会在一些视频译码系统中产生问题。具体地,sps 713中的某些参数可以参考vps 711。当vps 711被移除时,解码器和/或hrd可能无法解析这些参数,因为这些参数参考的数据不复存在。当在hrd侧对同播层执行一致性测试时可能会产生错误。可选地,当发送同播层以在解码器侧显示时,解码器侧可能会产生不可预测的错误。此外,无法正确标识每个sps 713可能会在通过子码流提取过程729为了同播层移除vps 711时导致错误地移除sps 713。
[0112]
本发明避免了这些错误。具体地,当包括clvs 743的层723不使用层间预测(是同播层)时,sps 713被约束为与参考sps 713的clvs 743包括相同的nuh_layer_id732。此外,当包括clvs 744的层724使用层间预测(不是同播层)时,sps 713的nuh_layer_id 732可以小于或等于clvs 744的nuh_layer_id732。这样,clvs 743和743744都可以可选地参考相同的sps 713。此外,由于sps 713与clvs 743/层723包括相同的nuh_layer_id 732,因此sps 713不会通过同播层(例如层723)的子码流提取过程729移除。
[0113]
此外,sps 713包括sps_video_parameter_set_id 731。sps_video_parameter_set_id 731是一个表示由sps 713参考的vps 711的id的语法元素。具体地,vps 711包括vps_video_parameter_set_id 735,这是一个提供vps 711的id以供其它语法元素/结构参考的语法元素。当vps 711存在时,sps_video_parameter_set_id 731被设置为vps_video_parameter_set_id 735的值。但是,当sps 713用于同播层时,sps_video_parameter_set_id 731被设置为0。换句话说,sps_video_parameter_set_id 731在大于0时表示由sps 713参考的vps 711的vps_video_parameter_set_id 735的值。当sps_video_parameter_set_id 731等于0时,sps 713不参考vps 711且在对参考sps 713的任何编码层视频序列进行解码时不参考vps 711。这可以通过对不同层使用不同的sps 713(例如,一个sps用于同播层,另一个sps用于一个或多个非同播层)或在子码流提取过程729中改变sps_video_parameter_set_id 731的值来实现。这样,sps_video_parameter_set_id731不会错误地参
考在子码流提取过程729中移除vps 711时不可用的id。
[0114]
此外,由hrd和/或解码器推导出的各种变量也参考vps 711中的参数。相应地,当sps_video_parameter_set_id 731被设置为0时,这些变量被设置为默认值。这样确保当为了同播层提取vps 711时,这些变量可以正确解析为可操作值,同时仍然可以适用于多层码流。例如,解码器和/或hrd可以根据码流700和/或子码流701推导generallayeridx[i]。generallayeridx[i]是一个表示对应层i的索引的派生变量。因此,generallayeridx[i]可以用于通过将当前层的nuh_layer_id732作为层i包括在generallayeridx[i]中来确定当前层的层索引。这可以表示为对应于nuh_layer_id(generallayeridx[nuh_layer_id])的通用层索引。因此,generallayeridx[nuh_layer_id]表示对应层的当前层索引。这个过程适用于层724等非同播层,但对于同播层723可能产生错误。相应地,当sps_video_parameter_set_id 731为0(表示同播层)时,generallayeridx[nuh_layer_id]被设置和/或推断为0。
[0115]
又如,vps 711可以包括vps独立层标志(vps_independent_layer_flag)733。vps_independent_layer_flag 733表示层723和/或724等对应层是否使用层间预测。相应地,vps_independent_layer_flag[generallayeridx[nuh_layer_id]]表示索引为generallayeridx[nuh_layer_id]的当前层是否使用层间预测。但是,当发送给解码器的层723是同播层时,包括vps_independent_layer_flag 733的vps 711不发送给解码器。因此,参考可能会产生错误。但是,同播层不使用层间预测。因此,用于同播层的vps_independent_layer_flag 733可以被推断为1,这表示对应层723不使用层间预测。因此,vps_independent_layer_flag[generallayeridx[nuh_layer_id]]被设置/推断为1,以表示当sps_video_parameter_set_id被设置为0时,当前层不使用层间预测。这样,当在发送层723等同播层之前从码流中移除vps时避免了错误。因此,编码器和解码器的功能增加。此外,通过成功从只包括同播层的码流中移除不需要的vps,提高了译码效率,这样降低了编码器和解码器侧的处理器资源、内存资源和/或网络信令资源的利用率。
[0116]
下面更详细地描述上述信息。分层视频编码(layered video coding)还称为可适性视频编码或具有可适性的视频译码。视频译码中的可适性可以使用多层译码技术来支持。多层码流包括基本层(base layer,bl)和一个或多个增强层(enhancement layer,el)。可适性的示例包括空间可适性、质量/信噪比(signal to noise ratio,snr)可适性、多视图可适性、帧率可适性,等等。当使用的是多层译码技术时,图像或其一部分可以不使用参考图像(帧内预测)进行译码,可以通过参考同一层中的参考图像(帧间预测)进行译码,和/或可以通过参考其它一层或多层中的参考图像(层间预测)进行译码。当前图像的层间预测使用的参考图像称为层间参考图像(inter-layer reference picture,ilrp)。图6示出了用于空间可适性的多层译码的示例,其中,不同层中的图像具有不同的分辨率。
[0117]
一些视频编码系列支持从单层编码的一个或多个档次(profile)中分离出一个或多个档次构成可适性。可适性视频编码(scalable video coding,svc)是高级视频编码(advanced video coding,avc)的可适性扩展版本,支持空间可适性、时间可适性和质量可适性。对于svc,标志(flag)在el图像中的每个宏块(macroblock,mb)中指示,以表示el mb是否使用低层中的并置块进行预测。基于并置块的预测可以包括纹理、运动矢量和/或译码模式。svc的实现方式可能无法在其设计中直接重用未经修改的avc实现方式。svc el宏块
语法和解码过程与avc语法和解码过程不同。
[0118]
可适性hevc(scalable hevc,shvc)是hevc的扩展版本,支持空间可适性和质量可适性。多视图hevc(multiview hevc,mv-hevc)是hevc的扩展版本,支持多视图可适性。3d hevc(3d-hevc)是hevc的扩展版本,支持比mv-hevc更先进、更高效的3d视频译码。时间可适性可以是单层hevc编解码器的组成部分。在hevc的多层扩展版本中,层间预测使用的经解码图像仅来自同一au,并作为长期参考图像(long-term reference picture,ltrp)。这些图像分配有一个或多个参考图像列表中的参考索引和当前层中的其它时间参考图像。层间预测(inter-layer prediction,ilp)是通过将参考索引的值设置为参考一个或多个参考图像列表中的一个或多个层间参考图像在预测单元(prediction unit,pu)级实现的。当ilrp的空间分辨率与正被编码或解码的当前图像的空间分辨率不同时,空间可适性对参考图像或其部分进行重采样。参考图像重采样可以在图像级或编码块(coding block)级实现。
[0119]
vvc还可以支持分层视频编码。vvc码流可以包括多层。这些层可以相互独立。例如,每层都可以不使用层间预测进行译码。在这种情况下,这些层还称为同播层(simulcast layer)。在一些情况下,一些层使用ilp进行译码。vps中的标志可以表示这些层是否是同播层或者一些层是否使用ilp。当一些层使用ilp时,各层之间的层依赖关系也会在vps中指示。与shvc和mv-hevc不同,vvc可能没有指定ols。ols包括一组指定层,其中,这组层中的一层或多层被指定为输出层。输出层是被输出的ols中的一层。在vvc的一些实现方式中,当层是同播层时,只能选择一层进行解码和输出。在vvc的一些实现方式中,当任何层都使用ilp时,指定对包括所有层在内的整个码流进行解码。此外,指定层中的某些层为输出层。可以指示输出层为最高层、所有层或最高层加上一组指示的低层。
[0120]
上述方面存某些可适性相关的问题。这些系统中的可适性设计包括层特有的档次、层次和级别(profile,tier,and level,ptl)以及层特有的编码图像缓冲区(coded picture buffer,cpb)操作。ptl指示效率需要提高。子层的序列级hrd参数的指示效率需要提高。dpb参数指示需要改进。一些设计使得单层码流参考vps。这些设计中的num_ref_entries[][]的取值范围不正确,导致解码器出现意外错误。这些设计中的解码过程涉及子码流提取,这增加了解码器的实现难度。这些设计的通用解码过程可能不适用于包括使用层间预测的多层的可适性码流。这些设计中的变量nooutputofpriorpicsflag的值可以根据图像进行推导,而不是根据au进行推导。当nesting_ols_flag等于1时,这些设计中的可伸缩嵌套式sei消息应该简化为直接适用于ols,而不是适用于ols中的各层。当payloadtype等于0(缓冲周期)、1(图像时间)或130(解码单元信息)时,不可伸缩嵌套的sei消息可以指定为只适用于第0个ols。
[0121]
一般而言,本发明描述了用于视频译码中的可适性的各种方法。各种技术的描述以vvc为基础。然而,这些技术还根据其它视频编解码规范适用于分层视频编码。上述一个或多个问题可以解决如下。具体地,本发明包括用于改进视频译码中的可适性支持的方法。
[0122]
以下是各种示例性定义。op可以是ols的时间子集,由ols索引和temporalid的最大值标识。输出层可以是被输出的ols中的一层。ols可以是一组层,这组层中的一层或多层被指定为输出层。ols层索引是ols中的一层在ols中各层的列表中的索引。子码流提取过程是一个指定过程,通过该指定过程,码流中不属于目标集合的由目标ols索引和目标最大
temporalid确定的nal单元从码流中移除,其中,输出子码流包括码流中属于目标集合的nal单元。
[0123]
示例性视频参数集rbsp语法如下。
[0124]
[0125]
[0126][0127]
示例性序列参数集rbsp语法如下。
[0128]
[0129]
[0130][0131]
示例性dpb参数语法如下。
[0132][0133]
示例性通用hrd参数语法如下。
[0134]
[0135][0136]
示例性ols hrd参数语法如下。
[0137]
[0138][0139]
示例性子层hrd参数语法如下。
[0140][0141]
示例性视频参数集rbsp语义如下。vps_max_layers_minus1 1表示参考vps的每个cvs中的各层的最大允许数量。vps_max_sub_layers_minus1 1表示参考vps的每个cvs中可以存在的时间子层的最大数量。vps_max_sub_layers_minus1的取值范围为0至6(包括端值)。vps_all_layers_same_num_sub_layers_flag等于1表示参考vps的每个cvs中的所有层具有一样多的时间子层。vps_all_layers_same_num_sub_layers_flag等于0表示参考vps的每个cvs中的所有层可以或可以不具有一样多的时间子层。当vps_all_layers_same_num_sub_layers_flag不存在时,vps_all_layers_same_num_sub_layers_flag的值可以被推断为1。vps_all_independent_layers_flag等于1表示cvs中的所有层不使用层间预测而进行独立译码。vps_all_independent_layers_flag等于0表示cvs中的一层或多层可以使用层间预测。当vps_all_independent_layers_flag不存在时,vps_all_independent_
layers_flag的值可以被推断为1。当vps_all_independent_layers_flag等于1时,vps_independent_layer_flag[i]的值被推断为1。当vps_all_independent_layers_flag等于0时,vps_independent_layer_flag[0]的值被推断为1。
[0142]
vps_direct_dependency_flag[i][j]等于0表示索引为j的层不是索引为i的层的直接参考层。vps_direct_dependency_flag[i][j]等于1表示索引为j的层是索引为i的层的直接参考层。当vps_direct_dependency_flag[i][j](i和j的范围为0至vps_max_layers_minus1,包括端值)不存在时,该标志被推断为0。变量directdependentlayeridx[i][j]表示第i层的第j个直接依赖层,变量layerusedasreflayerflag[j]表示层索引为j的层是否用作任何其它层的参考层,这两个变量可以推导如下:
[0143][0144]
变量generallayeridx[i]表示nuh_layer_id等于vps_layer_id[i]的层的层索引,该变量可以推导如下:
[0145]
for(i=0;i<=vps_max_layers_minus1;i )
[0146]
generallayeridx[vps_layer_id[i]]=i
[0147]
each_layer_is_an_ols_flag等于1表示每个输出层集只包括一层且码流中的每层本身是一个输出层集,其中,输出层集中包括的单层是唯一的输出层。each_layer_is_an_ols_flag等于0表示输出层集可以包括多层。如果vps_max_layers_minus1等于0,则each_layer_is_an_ols_flag的值被推断为1。否则,当vps_all_independent_layers_flag等于0时,each_layer_is_an_ols_flag的值被推断为0。
[0148]
ols_mode_idc等于0表示由vps指定的ols的总数量等于vps_max_layers_minus1 1,第i个ols包括层索引从0到i(包括端值)的层,并且对于每个ols,只输出ols中的最高层。ols_mode_idc等于1表示由vps指定的ols的总数量等于vps_max_layers_minus1 1,第i个ols包括层索引从0到i(包括端值)的层,并且对于每个ols,输出ols中的所有层。ols_mode_idc等于2表示由vps指定的ols的总数量是显式指示的,并且对于每个ols,输出ols中的最高层和显式指示的一组低层。ols_mode_idc的取值范围可以为0至2(包括端值)。当vps_all_independent_layers_flag等于1且each_layer_is_an_ols_flag等于0时,ols_mode_idc的值被推断为2。当ols_mode_idc等于2时,num_output_layer_sets_minus1 1表示由vps指定的ols的总数量。
[0149]
变量totalnumolss表示由vps指定的ols的总数量,该变量可以推导如下:
[0150][0151]
当ols_mode_idc等于2时,layer_included_flag[i][j]表示第j层(例如,nuh_layer_id等于vps_layer_id[j]的层)是否包括在第i个ols中。layer_included_flag[i][j]等于1表示第j层包括在第i个ols中。layer_included_flag[i][j]等于0表示第j层不包括在第i个ols中。变量numlayersinols[i]表示第i个ols中的层的数量,变量layeridinols[i][j]表示第i个ols中的第j层的nuh_layer_id值,这两个变量可以推导如下:
[0152][0153]
变量olslayeidx[i][j]表示nuh_layer_id等于layeridinols[i][j]的层的ols层索引,该变量可以推导如下:
[0154]
for(i=0,i<totalnumolss;i )
[0155]
for j=0;j<numlayersinols[i];j )
[0156]
olslayeidx[i][layeridinols[i][j]]=j
[0157]
每个ols中的最低层应为独立层。换句话说,对于范围为0至totalnumolss-1(包括端值)的每个i,vps_independent_layer_flag[generallayeridx[layeridinols[i][0]]]的值应等于1。每层应该包括在由vps指定的至少一个ols中。换句话说,对于特定nuh_layer_id值(nuhlayerid)等于vps_layer_id[k](k的范围为0至vps_max_layers_minus1,包括端值)之一的每层,应存在至少一对i和j的值,其中,i的范围为0至totalnumolss-1(包
括端值),j的范围为0至numlayersinols[i]-1(包括端值),使得layeridinols[i][j]的值等于nuhlayerid。ols中的任一层应是ols中的输出层或ols中的输出层的(直接或间接)参考层。
[0158]
当ols_mode_idc等于2时,vps_output_layer_flag[i][j]表示是否输出第i个ols中的第j层。vps_output_layer_flag[i]等于1表示输出第i个ols中的第j层。vps_output_layer_flag[i]等于0表示不输出第i个ols中的第j层。当vps_all_independent_layers_flag等于1且each_layer_is_an_ols_flag等于0时,vps_output_layer_flag[i]的值被推断为1。变量outputlayerflag[i][j]的值等于1表示输出第i个ols中的第j层,等于0表示不输出第i个ols中的第j层,该变量可以推导如下:
[0159][0160]
需要说明的是,第0个ols只包括最低层(例如,nuh_layer_id等于vps_layer_id[0]的层),并且对于第0个ols,输出其中包括的唯一层。vps_num_ptls表示vps中的语法结构profile_tier_level()的数量。pt_present_flag[i]等于1表示vps中的第i个语法结构profile_tier_level()中存在档次、层次和通用约束条件信息。pt_present_flag[i]等于0表示vps中的第i个语法结构profile_tier_level()中不存在档次、层次和通用约束条件信息。pt_present_flag[0]的值被推断为0。当pt_present_flag[i]等于0时,vps中的第i个语法结构profile_tier_level()中的档次、层次和通用约束条件信息被推断为与vps中的第(i-1)个语法结构profile_tier_level()中的档次、层次和通用约束条件信息相同。
[0161]
ptl_max_temporal_id[i]表示最高子层表示的temporalid,vps中的第i个语法结构profile_tier_level()中存在该最高子层表示的级别信息。ptl_max_temporal_id[i]的取值范围应为0至vps_max_sub_layers_minus1(包括端值)。当vps_max_sub_layers_minusl等于0时,ptl_max_temporal_id[i]的值被推断为0。当vps_max_sub_layers_minus1大于0且vps_all_layers_same_num_sub_layers_flag等于1时,ptl_max_temporal_id[i]的值被推断为vps_max_sub_layers_minus1。vps_ptl_byte_alignment_zero_bit应该等于0。
[0162]
ols_ptl_idx[i]表示适用于第i个ols的语法结构profile_tier_level()在vps中的语法结构profile_tier_level()列表中的索引。当ols_ptl_idx[i]存在时,ols_ptl_idx[i]的取值范围应该为0至vps_num_ptls-1(包括端值)。当numlayersinols[i]等于1时,适用于第i个ols的语法结构profile_tier_level()存在于由第i个ols中的层参考的sps中。vps_num_dpb_params表示vps中的语法结构dpb_parameters()的数量。dpb_
parameters()的取值范围应为0至16(包括端值)。当vps_num_dpb_params不存在时,vps_num_dpb_params的值可以被推断为0。same_dpb_size_output_or_nonoutput_flag等于1表示vps中不存在语法元素layer_nonoutput_dpb_params_idx[i]。same_dpb_size_output_or_nonoutput_flag等于0表示vps中可以或可以不存在语法元素layer_nonoutput_dpb_params_idx[i]。vps_sub_layer_dpb_params_present_flag用于控制vps中的语法结构dpb_parameters()中是否存在语法元素max_dec_pic_buffering_minus1[]、max_num_reorder_pics[]和max_latency_increase_plus1[]。当vps_sub_dpb_params_info_present_flag不存在时,vps_sub_dpb_params_info_present_flag被推断为0。
[0163]
dpb_size_only_flag[i]等于1表示vps中的第i个语法结构dpb_parameters()中不存在语法元素max_num_reorder_pics[]和max_latency_increase_plus1[]。dpb_size_only_flag[i]等于0表示vps中的第i个语法结构dpb_parameters()中可以存在语法元素max_num_reorder_pics[]和max_latency_increase_plus1[]。dpb_max_temporal_id[i]表示最高子层表示的temporalid,vps中的第i个语法结构dpb_parameters()中可以存在该最高子层表示的dpb参数。dpb_max_temporal_id[i]的取值范围应为0至vps_max_sub_layers_minus1(包括端值)。当vps_max_sub_layers_minus1等于0时,dpb_max_temporal_id[i]的值可以被推断为0。当vps_max_sub_layers_minus1大于0且vps_all_layers_same_num_sub_layers_flag等于1时,dpb_max_temporal_id[i]的值被推断为vps_max_sub_layers_minus1。layer_output_dpb_params_idx[i]表示适用于第i层(当第i层是ols中的输出层时)的语法结构dpb_parameters()在vps中的语法结构dpb_parameters()列表中的索引。当layer_output_dpb_params_idx[i]存在时,layer_output_dpb_params_idx[i]的取值范围应为0至vps_num_dpb_params-1(包括端值)。
[0164]
如果vps_independent_layer_flag[i]等于1,则适用于第i层(当第i层是输出层时)的语法结构dpb_parameters()是存在于由该层参考的sps中的语法结构dpb_parameters()。否则(vps_independent_layer_flag[i]等于1),以下内容适用:当vps_num_dpb_params等于1时,layer_output_dpb_params_idx[i]的值被推断为0。码流一致性的要求可以是:layer_output_dpb_params_idx[i]的值需要使得dpb_size_only_flag[layer_output_dpb_params_idx[i]]等于0。
[0165]
layer_nonoutput_dpb_params_idx[i]表示适用于第i层(当第i层是ols中的非输出层时)的语法结构dpb_parameters()在vps中的语法结构dpb_parameters()列表中的索引。当layer_nonoutput_dpb_params_idx[i]存在时,layer_nonoutput_dpb_params_idx[i]的取值范围应该为0至vps_num_dpb_params-1(包括端值)。如果same_dpb_size_output_or_nonoutput_flag等于1,则以下内容适用:如果vps_independent_layer_flag[i]等于1,则适用于第i层(当第i层是非输出层时)的语法结构dpb_parameters()是存在于由该层参考的sps中的语法结构dpb_parameters()。否则(vps_independent_layer_flag[i]等于1),layer_nonoutput_dpb_params_idx[i]的值被推断为layer_output_dpb_params_idx[i]。否则(same_dpb_size_output_or_nonoutput_flag等于0),当vps_num_dpb_params等于1时,layer_output_dpb_params_idx[i]的值被推断为0。
[0166]
general_hrd_params_present_flag等于1表示sps rbsp语法结构中存在语法元素num_units_in_tick和time_scale以及语法结构general_hrd_parameters()。general_
hrd_params_present_flag等于0表示sps rbsp语法结构中不存在语法元素num_units_in_tick和time_scale以及语法结构general_hrd_parameters()。num_units_in_tick是以time_scale赫兹(hertz,hz)频率运行的时钟的时间单位的数量,该频率对应于时钟计时周期计数器(clock tick counter)的一个增量(称为时钟计时周期)。num_units_in_tick应大于0。时钟计时周期(以秒为单位)等于num_units_in_tick除以time_scale的商。例如,当视频信号的图像速率为25hz时,time_scale可以等于27,000,000,num_units_in_tick可以等于1,080,000,因此时钟计时周期可以等于0.04秒。time_scale是一秒内的时间单位的数量。例如,使用27mhz时钟测量时间的时间坐标系的time_scale为27,000,000。time_scale的值应大于0。
[0167]
vps_extension_flag等于0表示vps rbsp语法结构中不存在语法元素vps_extension_data_flag。vps_extension_flag等于1表示vps rbsp语法结构中存在语法元素vps_extension_data_flag。vps_extension_data_flag可以取任意值。vps_extension_data_flag的存在和取值可能不会影响解码器与档次的一致性。一致性解码器可以忽略所有语法元素vps_extension_data_flag。
[0168]
示例性序列参数集rbsp语义如下。sps rbsp在被参考之前应该可用于解码过程,应该包括在temporalid等于0的至少一个接入单元中,或者应该通过外部模块提供,而包括sps rbsp的sps nal单元的nuh_layer_id应等于参考sps nal单元的pps nal单元的最小nuh_layer_id值。cvs中具有特定sps_seq_parameter_set_id值的所有sps nal单元应该具有相同的内容。sps_decoding_parameter_set_id在大于0时表示由sps参考的dps的dps_decoding_parameter_set_id值。当sps_decoding_parameter_set_id等于0时,sps不参考dps且在对参考sps的每个clvs进行解码时不参考dps。在由码流中的经编码图像参考的所有sps中,sps_decoding_parameter_set_id的值应该相同。
[0169]
sps_video_parameter_set_id在大于0时表示由sps参考的vps的vps_video_parameter_set_id值。当sps_video_parameter_set_id等于0时,sps可以不参考vps且在对参考sps的每个clvs进行解码时不参考vps;generallayeridx[nuh_layer_id]的值应该被推断为0;vps_independent_layer_flag[generallayeridx[nuh_layer_id]]的值可以被推断为1。当vps_independent_layer_flag[generallayeridx[nuh_layer_id]]等于1时,由具有特定nuh_layer_id值(nuhlayerid)的clvs参考的sps的nuh_layer_id应等于nuhlayerid。
[0170]
sps_max_sub_layers_minus1 1表示参考sps的每个clvs中可以存在的时间子层的最大数量。sps_max_sub_layers_minus1的取值范围应该为0至vps_max_sub_layers_minusl(包括端值)。在一致性码流中,sps_reserved_zero_4bits应该等于0。sps_reserved_zero_4bits的其它值可以保留。
[0171]
sps_ptl_dpb_present_flag等于1表示sps中存在语法结构profile_tier_level()和语法结构dpb_parameters()。sps_ptl_dpb_present_flag等于0表示sps中不存在语法结构profile_tier_level()和语法结构dpb_parameters()。sps_ptl_dpb_present_flag的值应该等于vps_independent_layer_flag[nuh_layer_id]。如果vps_independent_layer_flag[generallayeridx[nuh_layer_id]]等于1,则变量maxdecpicbuffminus1被设置为sps中的语法结构dpb_parameters()中的max_dec_pic_buffering_minus1[sps_max_
sub_layers_minus1]。否则,maxdecpicbuffminus1被设置为vps中的第layer_nonoutput_dpb_params_idx[generallayeridx[nuh_layer_id]]个语法结构dpb_parameters()中的max_dec_pic_buffering_minus1[sps_max_sub_layers_minus1]。gdr_enabled_flag等于1表示参考sps的clvs中可以存在gdr图像。gdr_enabled_flag等于0表示参考sps的clvs中不存在gdr图像。
[0172]
sps_sub_layer_dpb_params_flag用于控制sps中的语法结构dpb_parameters()中是否存在语法元素max_dec_pic_buffering_minus1[i]、max_num_reorder_pics[i]和max_latency_increase_plus1[i]。当sps_sub_dpb_params_info_present_flag不存在时,sps_sub_dpb_params_info_present_flag被推断为0。long_term_ref_pics_flag等于0表示clvs中的任何经编码图像的帧间预测不使用ltrp。long_term_ref_pics_flag等于1表示clvs中的一个或多个经编码图像的帧间预测可以使用ltrp。
[0173]
示例性通用档次、层次和级别语义如下。语法结构profile_tier_level()提供级别信息,可选地提供档次、层次、子档次和通用约束条件信息(表示为pt信息)。当语法结构profile_tier_level()包括在dps中时,olsinscope是包括参考dps的整个码流中的所有层的ols。当语法结构profile_tier_level()包括在vps中时,olsinscope是由vps指定的一个或多个ols。当语法结构profile_tier_level()包括在sps中时,olsinscope是只包括参考sps的所有层中的最低层的ols,其中,该最低层应该为独立层。
[0174]
general_profile_idc表示与olsinscope一致的档次。general_tier_flag表示用于解释general_level_idc的层次上下文。num_sub_profiles表示语法元素general_sub_profile_idc[i]的数量。general_sub_profile_idc[i]表示注册的第i个互操作元数据。general_level_idc表示与olsinscope一致的级别。需要说明的是,general_level_idc的值越大表示级别越高。在dps中为olsinscope指示的最大级别可能高于在sps中为olsinscope内包括的cvs指示的级别。还需要说明的是,当olsinscope与多个档次一致时,general_profile_idc应该表示提供优选解码结果或优选码流标识的档次,由编码器确定。还需要说明的是,当语法结构profile_tier_level()包括在dps中且olsinscope的cvs与不同的档次一致时,general_profile_idc和level_idc应该表示能够解码olsinscope的解码器的档次和级别。
[0175]
sub_layer_level_present_flag[i]等于1表示temporalid等于i的子层表示的语法结构profile_tier_level()中存在级别信息。sub_layer_level_present_flag[i]等于0表示temporalid等于i的子层表示的语法结构profile_tier_level()中不存在级别信息。ptl_alignment_zero_bits应该等于0。除了规定不存在值的推断之外,语法元素sub_layer_level_idc[i]的语义也与语法元素general_level_idc相同,但适用于temporalid等于i的子层表示。
[0176]
示例性dpb参数语义如下。语法结构dpb_parameters(maxsublayersminus1,sublayerinfoflag)为cvs中的每个clvs提供dpb大小、最大图像重排序次数和最大延迟的信息。当vps中包括语法结构dpb_parameters()时,语法结构dpb_parameters()适用于的ols由vps指定。当语法结构dpb_parameters()包括在sps中时,语法结构dpb_parameters()适用于只包括参考sps的所有层中的最低层的ols,其中,该最低层是独立层。
[0177]
max_dec_pic_buffering_minus1[i] 1表示cvs中的每个clvs在htid等于i时的解
码图像缓冲区的以图像存储缓冲区为单位的最大所需大小。max_dec_pic_buffering_minus1[i]的取值范围应该为0至maxdpbsize-1(包括端值)。当i大于0时,max_dec_pic_buffering_minus1[i]应该大于或等于max_dec_pic_buffering_minus1[i-1]。当max_dec_pic_buffering_minus1[i](其中,i的范围为0至maxsublayersminus1-1,包括端值)不存在时,由于sublayerinfoflag等于0,因此max_dec_pic_buffering_minus1[i]被推断为max_dec_pic_buffering_minus1[maxsublayersminus1]。
[0178]
max_num_reorder_pics[i]表示cvs中的每个clvs在htid等于i时的其中图像的最大允许数量,这些图像可以在解码顺序中位于clvs中的任一图像之前且在输出顺序中位于该图像之后。max_num_reorder_pics[i]的取值范围应该为0至max_dec_pic_buffering_minus1[i](包括端值)。当i大于0时,max_num_reorder_pics[i]应该大于或等于max_num_reorder_pics[i-1]。当max_num_reorder_pics[i](其中,i的范围为0至maxsublayersminus1-1,包括端值)不存在时,由于sublayerinfoflag等于0,因此max_num_reorder_pics[i]被推断为max_num_reorder_pics[maxsublayersminus1]。
[0179]
max_latency_increase_plus1[i]不等于0用于计算maxlatencypictures[i]的值,maxlatencypictures[i]表示cvs中的每个clvs在htid等于i时的其中图像的最大数量,这些图像可以在输出顺序中位于clvs中的任一图像之前且在解码顺序中位于该图像之后。当max_latency_increase_plus1[i]不等于0时,maxlatencypictures[i]的值规定如下:
[0180]
maxlatencypictures[i]=max_num_reorder_pics[i] max_latency_increase_plus1[i]-1。
[0181]
当max_latency_increase_plus1[i]等于0时,不存在对应的限制。
[0182]
max_latency_increase_plus1[i]的取值范围应该为0至232-2(包括端值)。当max_latency_increase_plus1[i](其中,i的范围为0至maxsublayersminus1-1,包括端值)不存在时,由于sublayerinfoflag等于0,因此max_latency_increase_plus1[i]被推断为max_latency_increase_plus1[maxsublayersminus1]。
[0183]
示例性通用hrd参数语义如下。语法结构general_hrd_parameters()提供hrd操作中使用的hrd参数。num_ols_hrd_params_minus1 1表示语法结构general_hrd_parameters()中存在的语法结构ols_hrd_parameters()的数量。num_ols_hrd_params_minusl的取值范围应该为0至63(包括端值)。当totalnumolss大于1时,num_ols_hrd_params_minus1的值被推断为0。hrd_cpb_cnt_minus1 1表示cvs的码流中的备选cpb规格的数量。hrd_cpb_cnt_minusl的取值范围应该为0至31(包括端值)。hrd_max_temporal_id[i]表示最高子层表示的temporalid,该最高子层表示的hrd参数包括在第i个语法结构layer_level_hrd_parameters()中。hrd_max_temporal_id[i]的取值范围应该为0至vps_max_sub_layers_minus1(包括端值)。当vps_max_sub_layers_minusl等于0时,hrd_max_temporal_id[i]的值被推断为0。ols_hrd_idx[i]表示适用于第i个ols的语法结构ols_hrd_parameters()的索引。ols_hrd_idx[[i]的取值范围应该为0至num_ols_hrd_params_minus1(包括端值)。当ols_hrd_idx[[i]不存在时,ols_hrd_idx[[i]的值被推断为0。
[0184]
示例性参考图像列表结构语义如下。语法结构ref_pic_list_struct(listidx,rplsidx)可以存在于sps中,也可以存在于条带头中。根据语法结构是包括在条带头中还是包括在sps中,以下内容适用。如果语法结构ref_pic_list_struct(listidx,rplsidx)存在
于条带头中,则该语法结构表示当前图像(包括条带的图像)的参考图像列表listidx。否则(语法结构ref_pic_list_struct(listidx,rplsidx)存在于sps中),该语法结构表示参考图像列表listidx的候选。本节其余内容规定的语义中的术语“当前图像”是指:包括一个或多个条带的每个图像,其中,一个或多个条带包括的ref_pic_list_idx[listidx]等于sps中包括的语法结构ref_pic_list_struct(listidx,rplsidx)列表中的索引;参考sps的cvs中的每个图像。num_ref_entries[listidx][rplsidx]表示语法结构ref_pic_list_struct(listidx,rplsidx)中的条目数量。num_ref_entries[listidx][rplsidx]的取取值范围应该为0至maxdecpicbuffminus1 14(包括端值)。
[0185]
示例性通用解码过程如下。该过程的输入是码流bitstreamtodecode。该过程的输出是经解码图像列表。解码过程的规定使得与指定档次和级别一致的所有解码器在为与该档次和级别一致的码流调用与该档次关联的解码过程时,产生数字上相同的裁剪后的经解码输出图像。与本文描述的过程产生相同的裁剪后的经解码输出图像(根据规定具有正确的输出顺序或输出时间)的任何解码过程都符合解码过程要求。
[0186]
对于码流中的每个irap au,以下内容适用。如果au是码流中在解码顺序中的第一个au,每个图像都是即时解码刷新(instantaneous decoding refresh,idr)图像,或者每个图像都是层中在解码顺序中位于序列结束nal单元之后的第一个图像,则变量noincorrectpicoutputflag被设置为1。否则,如果变量handlecraascvsstartflag被设置为au的一个值,则handlecraascvsstartflag被设置为通过外部机制提供的一个值,而且noincorrectpicoutputflag被设置为handlecraascvsstartflag。否则,handlecraascvsstartflag和noincorrectpicoutputflag都被设置为0。
[0187]
对于码流中的每个逐步解码刷新(gradual decoding refresh,gdr)au,以下内容适用。如果au是码流中在解码顺序中的第一个au或者每个图像都是层中在解码顺序中位于序列结束nal单元之后的第一个图像,则变量noincorrectpicoutputflag被设置为1。否则,如果某一外部机制可用于将变量handlegdrascvsstartflag设置为au的一个值,则handlegdrascvsstartflag被设置为通过该外部机制提供的值,而且noincorrectpicoutputflag被设置为handlegdrascvsstartflag。否则,handlegdrascvsstartflag和noincorrectpicoutputflagflag都被设置为0。上述针对irap图像和gdr图像的操作用于标识码流中的cvs。为bitstreamtodecode中在解码顺序中的每个经编码图像重复调用解码。
[0188]
用于参考图像列表构建的示例性解码过程如下。该过程在开始非idr图像中的每个条带的解码过程时调用。参考图像通过参考索引进行寻址。参考索引是参考图像列表中的索引。在对i条带进行解码时,条带数据的解码不使用参考图像列表。在对p条带进行解码时,条带数据的解码只使用参考图像列表0(例如refpiclist[0])。在对b条带进行解码时,条带数据的解码既使用参考图像列表0,又使用参考图像列表1(例如refpiclist[1])。
[0189]
以下约束条件适用于码流一致性。当每个i等于0或1时,num_ref_entries[i][rplsidx[i]]应该不小于numrefidxactive[i]。由refpiclist[0]或refpiclist[1]中的每个激活条目参考的图像应该存在于dpb中,该图像的temporalid应该小于或等于当前图像的temporalid。由refpiclist[0]或refpiclist[1]中的每个条目参考的图像应该不是当前图像,该图像的non_reference_picture_flag应该等于0。图像中的条带的refpiclist[0]
或refpiclist[1]中的短期参考图像(short term reference picture,strp)条目和同一图像中的同一条带或不同条带的refpiclist[0]或refpiclist[1]中的长期参考图像(long term reference picture,ltrp)条目应该不参考同一图像。refpiclist[0]或refpiclist[1]中不存在ltrp条目,当前图像的picordercntval与由该条目参考的图像的picordercntval之间的差值大于或等于224。
[0190]
假设setofrefpics是由refpiclist[0]中的与当前图像具有相同nuh_layer_id的所有条目和refpiclist[1]中的与当前图像具有相同nuh_layer_id的所有条目参考的唯一图像集。setofrefpics中的图像数量应该小于或等于maxdecpicbuffminusl,而且一个图像中的所有条带的setofrefpics应该是相同的。在当前图像是步进式时间子层接入(step-wise temporal sublayer access,stsa)图像时,refpiclist[0]或refpiclist[1]中应该不存在与当前图像具有相同temporalid的激活条目。在当前图像是解码顺序在与当前图像具有相同temporalid的stsa图像之后的图像时,应不存在与当前图像具有相同temporalid的图像,当前图像作为refpiclist[0]或refpiclist[1]中的解码顺序在stsa图像之前的激活条目。
[0191]
由当前图像中的条带的refpiclist[0]或refpiclist[1]中的每个层间参考图像(interlayer reference picture,ilrp)条目参考的图像应与当前图像在同一接入单元中。由当前图像中的条带的refpiclist[0]或refpiclist[1]中的每个ilrp条目参考的图像应存在于dpb中,而且该图像的nuh_layer_id应小于当前图像的nuh_layer_id。条带的refpiclist[0]或refpiclist[1]中的每个ilrp条目都应该是激活条目。
[0192]
示例性hrd规范如下。hrd用于检查码流和解码器一致性。一组码流一致性测试用于检查码流的一致性,该码流称为整个码流,表示为entirebitstream。这组码流一致性测试用于测试由vps指定的每个ols的每个op的一致性。
[0193]
对于每个测试,以下按顺序执行的步骤按照列出的顺序适用,然后是本节中这些步骤之后描述的过程。测试操作点(表示为targetop)是通过选择具有ols索引opolsidx和最大temporalid值optid的目标ols进行选择的。opolsidx的取值范围为0至totalnumolss-1(包括端值)。optid的取值范围为0至vps_max_sub_layers_minus1(包括端值)。选择的每对opolsidx和optid值应使得,通过调用以entirebitstream、opolsidx和optid为输入的子码流提取过程而输出的子码流满足以下条件。bitstreamtodecode中存在nuh_layer_id等于layeridinols[opolsidx]中的每个nuh_layer_id值的至少一个vcl nal单元。bitstreamtodecode中存在temporalid等于optid的至少一个vcl nal单元。
[0194]
如果targetop中的层包括entirebitstream中的所有层且optid等于或大于entirebitstream中的所有nal单元之中的最大temporalid值,则bitstreamtodecode被设置为与entirebitstream相同。否则,bitstreamtodecode被设置为调用以entirebitstream、opolsidx和optid为输入的子码流提取过程的输出。targetolsidx和htid的值分别被设置为targetop的opolsidx和optid。选择scidx的值。选择的scidx的范围应为0至hrd_cpb_cnt_minus1(包括端值)。bitstreamtodecode中与适用于targetolsidx的缓冲周期sei消息(存在于targetlayerbitstream中或通过外部机制获取)关联的接入单元被选择作为hrd初始化点,并称为目标ols中的每层的接入单元0。
[0195]
后续步骤适用于目标ols中具有ols层索引targetolslayeridx的每层。适用于
bitstreamtodecode的语法结构ols_hrd_parameters()和语法结构sub_layer_hrd_parameters()选择如下。选择vps中(或通过外部机制提供)的第ols_hrd_idx[targetolsidx]个语法结构ols_hrd_parameters()。在选择的语法结构ols_hrd_parameters()中,如果bitstreamtodecode是i类码流,则选择条件if(general_vcl_hrd_params_present_flag)紧跟着的语法结构sub_layer_hrd_parameters(htid),而且变量nalhrdmodeflag被设置为0。否则(bitstreamtodecode是ii类码流),选择条件if(general_vcl_hrd_params_present_flag)(在这种情况下,变量nalhrdmodeflag被设置为0)或条件if(general_nal_hrd_params_present_flag)(在这种情况下,变量nalhrdmodeflag被设置为1)紧跟着的语法结构sub_layer_hrd_parameters(htid)。当bitstreamtodecode是ii类码流且nalhrdmodeflag等于0时,除填充数据nal单元外的所有非vcl nal单元以及根据nal单元流形成字节流的所有语法元素leading_zero_8bits、zero_byte、start_code_prefix_one_3bytes和trailing_zero_8bits(如果存在)从bitstreamtodecode中移除,而剩余的码流被分配给bitstreamtodecode。
[0196]
当decoding_unit_hrd_params_present_flag等于1时,调度cpb在接入单元级(在这种情况下,变量decodingunithrdflag被设置为0)或解码单元级(在这种情况下,变量decodingunithrdflag被设置为1)进行操作。否则,decodingunithrdflag被设置为0,而且调度cpb在接入单元级进行操作。
[0197]
对于从接入单元0开始的bitstreamtodecode中的每个接入单元,选择与该接入单元关联并适用于targetolsidx的缓冲周期sei消息(存在于bitstreamtodecode中或通过外部机制获取),选择与该接入单元关联并适用于targetolsidx的图像时间sei消息(存在于bitstreamtodecode中或通过外部机制获取),当decodingunithrdflag等于1且decoding_unit_cpb_params_in_pic_timing_sei_flag等于0时,选择与该接入单元中的解码单元关联并适用于targetolsidx的解码单元信息sei消息(存在于bitstreamtodecode中或通过外部机制获取)。
[0198]
每个一致性测试包括上述每个步骤中的一个选项的组合。当一个步骤存在多个选项时,任何特定的一致性测试只选择一个选项。所有步骤的所有可能组合构成一整套一致性测试。对于每个测试操作点,待执行的码流一致性测试的次数等于n0*n1*n2*n3,其中,n0、n1、n2和n3的值指定如下:n1等于hrd_cpb_cnt_minus1 1,n1是bitstreamtodecode中与缓冲周期sei消息关联的接入单元的数量,n2推导如下。如果bitstreamtodecode是i类码流,则n0等于1。否则(bitstreamtodecode是ii类码流),n0等于2。n3推导如下。如果decoding_unit_hrd_params_present_flag等于0,则n3等于1。否则,n3等于2。
[0199]
hrd包括码流提取器(可选存在)、编码图像缓冲区(coded picture buffer,cpb)、即时解码过程、概念上包括每层的子解码图像缓冲区(decoded picture buffer,dpb)的dpb以及输出裁剪。对于每个码流一致性测试,cpb大小(比特数)为cpbsize[htid][scidx],每层的dpb参数max_dec_pic_buffering_minus1[htid]、max_num_reorder_pics[htid]和maxlatencypictures[htid]存在于适用于该层的语法结构dpb_parameters()中或者根据该语法结构推导,取决于该层是否是独立层以及该层是否是目标ols中的输出层。
[0200]
hrd可以操作如下。hrd在解码单元0处初始化,cpb和dpb的每个子dpb都被设置为空(每个子dpb的子dpb满度被设置为0)。在初始化之后,hrd可能不会通过后续缓冲周期sei
消息再次初始化。与根据指定的到达时间表(arrival schedule)进入每个cpb的解码单元关联的数据通过假设流调度方法(hypothetical stream scheduler,hss)发送。与每个解码单元关联的数据在解码单元的cpb移除时间通过即时解码过程即时移除和解码。每个经解码图像都放置在dpb中。当一个经解码图像不再需要用于帧间预测参考,也不再需要用于输出时,从dpb中移除该经解码图像。
[0201]
解码图像缓冲区的示例性操作如下。这些规范可以独立适用于选择的每个解码图像缓冲区(decoded picture buffer,dpb)参数集。解码图像缓冲区在概念上包括子dpb,每个子dpb包括用于存储一层经解码图像的图像存储缓冲区。每个图像存储缓冲区可以包括标识为用于参考或保存用于后续输出的经解码图像。本文描述的过程依次应用,并从ols中的最低层开始,按照ols中各层的nuh_layer_id值的递增顺序独立应用于每层。当这些过程应用于特定层时,只影响该特定层的子dpb。在这些过程的描述中,dpb是指特定层的子dpb,而该特定层称为当前层。
[0202]
在输出时间dpb的操作中,同一接入单元中的picoutputflag等于1的经解码图像按照经解码图像的nuh_layer_id值的递增顺序连续输出。假设图像n和当前图像是接入单元n中具有特定nuh_layer_id值的经编码图像或经解码图像,其中,n为非负整数。在对当前图像进行解码之前从dpb中移除图像如下描述。在对当前图像进行解码之前(但在解析当前图像中的第一条带的条带头之后)从dpb中移除图像可以基本上即时发生在接入单元n(包括当前图像)的第一解码单元的cpb移除时间并执行如下。
[0203]
调用用于参考图像列表构建的解码过程和用于参考图像标识的解码过程。在当前au为不是au 0的编码视频序列起始(coded video sequence start,cvss)图像时,可以使用以下按顺序执行的步骤。为测试解码器推导变量nooutputofpriorpicsflag,如下所示:如果为当前au中的任何图像推导出的pic_width_max_in_luma_samples、pic_height_max_in_luma_samples、chroma_format_idc、separate_colour_plane_flag、bit_depth_luma_minus8、bit_depth_chroma_minus8或max_dec_pic_buffering_minus1[htid]的值不同于为同一clvs中的前一图像推导出的pic_width_in_luma_samples、pic_height_in_luma_samples、chroma_format_idc、separate_colour_plane_flag、bit_depth_luma_minus8、bit_depth_chroma_minus8或max_dec_pic_buffering_minus1[htid]的值,则nooutputofpriorpicsflag可以被测试解码器设置为1,不考虑no_output_of_prior_pics_flag的值。虽然在这些条件下,可以优选将nooutputofpriorpicsflag设置为no_output_of_prior_pics_flag,但是在这种情况下,允许测试解码器将nooutputofpriorpicsflag设置为1。否则,nooutputofpriorpicsflag被设置为no_output_of_prior_pics_flag。
[0204]
为测试解码器推导出的nooutputofpriorpicsflag的值应用于hrd,使得当nooutputofpriorpicsflag的值等于1时,dpb中的所有图像存储缓冲区都被清空,而不输出这些图像存储缓冲区包括的图像,并且dpb满度被设置为0。当以下两个条件对于dpb中的任何图像k都为真时,dpb中的所有这些图像k都从dpb中移除。图像k可以标识为不用于参考,或者图像k的pictureoutputflag可以等于0或dpb输出时间小于或等于当前图像n中的第一解码单元(表示为解码单元m)的cpb移除时间,其中,dpboutputtime[k]小于或等于ducpbremovaltime[m]。对于从dpb中移除的每个图像,dpb满度减1。
[0205]
输出顺序dpb的操作可以如下所示。这些过程可以独立应用于选择的每个解码图
像缓冲区(decoded picture buffer,dpb)参数集。解码图像缓冲区在概念上包括子dpb,每个子dpb包括用于存储一层经解码图像的图像存储缓冲区。每个图像存储缓冲区包括标识为用于参考或保存用于后续输出的经解码图像。在对当前图像进行解码之前调用从dpb中输出和移除图像的过程,然后调用用于当前解码图像标识和存储的过程,最后调用用于额外缓冲(bumping)的过程。这些过程从ols中的最低层开始,按照ols中各层的nuh_layer_id值的递增顺序独立应用于每层。当这些过程应用于特定层时,只影响该特定层的子dpb。
[0206]
在输出顺序dpb的操作中,与在输出时间dpb的操作中一样,同一接入单元中的picoutputflag等于1的经解码图像按照经解码图像的nuh_layer_id值的递增顺序连续输出。假设图像n和当前图像是接入单元n中具有特定nuh_layer_id值的经编码图像或经解码图像,其中,n为非负整数。从dpb中输出和移除图像如下所述。
[0207]
在对当前图像进行解码之前(但在解析当前图像中的第一条带的条带头之后)从dpb中输出和移除图像基本上即时发生在包括当前图像的接入单元中的第一解码单元从cpb中移除的时候并执行如下。调用用于参考图像列表构建的解码过程和用于参考图像标识的解码过程。如果当前au为不是au 0的cvss au时,可以使用以下按顺序执行的步骤。为测试解码器推导变量nooutputofpriorpicsflag,如下所示:如果为当前au中的任何图像推导出的pic_height_max_in_luma_samples、chroma_format_idc、separate_colour_plane_flag、bit_depth_luma_minus8、bit_depth_chroma_minus8或max_dec_pic_buffering_minus1[htid]的值不同于为同一clvs中的前一图像推导出的pic_width_in_luma_samples、pic_height_in_luma_samples、chroma_format_idc、separate_colour_plane_flag、bit_depth_luma_minus8、bit_depth_chroma_minus8或max_dec_pic_buffering_minus1[htid]的值,则nooutputofpriorpicsflag可以被测试解码器设置为1,不考虑no_output_of_prior_pics_flag的值。
[0208]
虽然在这些条件下,可以优选将nooutputofpriorpicsflag设置为no_output_of_prior_pics_flag,但是在这种情况下,允许测试解码器将nooutputofpriorpicsflag设置为1。否则,nooutputofpriorpicsflag被设置为no_output_of_prior_pics_flag。为测试解码器推导出的nooutputofpriorpicsflag的值应用于hrd,如下所示:如果nooutputofpriorpicsflag等于1,则dpb中的所有图像存储缓冲区都被清空,而不输出这些图像存储缓冲区包括的图像,并且dpb满度被设置为0。否则(nooutputofpriorpicsflag等于0),包括标识为不需要输出且不用于参考的图像的所有图像存储缓冲区被清空(不输出),而dpb中的所有非空图像存储缓冲区通过反复调用缓冲来清空,并且dpb满度被设置为0。
[0209]
否则(当前图像不是clvss图像),包括标识为不需要输出且不用于参考的图像的所有图像存储缓冲区都被清空(不输出)。对于每个被清空的图像存储缓冲区,dpb满度减1。当以下一个或多个条件为真时,重复调用缓冲过程,同时对于每个被清空的其它图像存储缓冲区,进一步将dpb满度减1,直到以下条件都不为真。dpb中标识为需要输出的图像的数量大于max_num_reorder_pics[htid]。max_latency_increase_plus1[htid]不等于0且dpb中存在至少一个图像标识为需要输出,该图像的关联变量piclatencycount大于或等于maxlatencypictures[htid]。dpb中的图像的数量大于或等于max_dec_pic_buffering_minus1[htid] 1。
[0210]
在一个示例中,额外缓冲的发生可以如下所述。详述的过程可以基本上即时发生在包括当前图像的接入单元n中的最后一个解码单元从cpb中移除的时候。在当前图像的pictureoutputflag等于1时,对于dpb中标识为需要输出且输出顺序在当前图像之后的每个图像,关联变量piclatencycount被设置为piclatencycount 1。以下内容也适用。如果当前经解码图像的pictureoutputflag等于1,则当前经解码图像被标识为需要输出且关联变量piclatencycount被设置为0。否则(当前经解码图像的pictureoutputflag等于0),当前经解码图像被标识为不需要输出。
[0211]
当以下一个或多个条件为真时,重复调用缓冲过程,直到以下条件都不为真。dpb中标识为需要输出的图像的数量大于max_num_reorder_pics[htid]。max_latency_increase_plus1[htid]不等于0且dpb中存在至少一个图像标识为需要输出,该图像的关联变量piclatencycount大于或等于maxlatencypictures[htid]。
[0212]
缓冲过程包括以下按顺序执行的步骤。选择首先输出的图像作为dpb中标识为需要输出的所有图像中具有最小picordercntval值的图像。这些图像中的每个图像按照nuh_layer_id的递增顺序使用该图像的一致性裁剪窗口进行裁剪,输出裁剪后的图像,将该图像标识为不需要输出。包括标识为不用于参考且是裁剪后的输出图像之一的图像的每个图像存储缓冲区被清空,并且关联子dpb的满度减1。对于属于同一cvs并通过缓冲过程输出的任意两个图像pica和picb,当pica比picb先输出时,pica的picordercntval的值小于picb的picordercntval的值。
[0213]
示例性子码流提取过程如下。该过程的输入包括码流inbitstream、目标ols索引targetolsidx和目标最大temporalid值tidtarget。该过程的输出是子码流outbitstream。码流码流一致性的要求可以是:对于任何输入码流,从以码流、等于由vps指定的ols列表中的索引的targetolsidx和等于0至6(包括端值)范围内任一值的tidtarget为输入的过程输出且满足以下条件的输出子码流应是一致性码流。输出子码流包括nuh_layer_id等于layeridinols[targetolsidx]中的每个nuh_layer_id值的至少一个vcl nal单元。输出子码流包括temporalid等于tidtarget的至少一个vcl nal单元。一致性码流包括temporalid等于0的一个或多个经编码条带nal单元,但不必包括nuh_layer_id等于0的经编码条带nal单元。
[0214]
输出子码流outbitstream推导如下。码流outbitstream被设置为与码流inbitstream相同。temporalid大于tidtarget的所有nal单元都从outbitstream中移除。nuh_layer_id不包括在列表layeridinols[targetolsidx]中的所有nal单元都从outbitstream中移除。包括nesting_ols_flag等于1的可伸缩嵌套式sei消息的所有sei nal单元都从outbitstream中移除,i的取值范围不是0至nesting_num_olss_minus1(包括端值),使得nestingolsidx[i]等于targetolsidx。当targetolsidx大于0时,包括payloadtype等于0(缓冲周期)、1(图像时间)或130(解码单元信息)的不可伸缩嵌套的sei消息的所有sei nal单元都从outbitstream中移除。
[0215]
示例性可伸缩嵌套式sei消息语法如下。
[0216][0217][0218]
示例性通用sei载荷语义如下。以下内容适用于不可伸缩嵌套的sei消息的适用层或ols。对于不可伸缩嵌套的sei消息,当payloadtype等于0(缓冲周期)、1(图像时间)或130(解码单元信息)时,不可伸缩嵌套的sei消息只适用于第0个ols。对于不可伸缩嵌套的sei消息,当payloadtype等于vclassociatedseilist中的任一值时,不可伸缩嵌套的sei消息只适用于vcl nal单元的nuh_layer_id等于包括sei消息的sei nal单元的nuh_layer_id的层。
[0219]
码流一致性的要求可以是:以下限制条件适用于sei nal单元的nuh_layer_id值。当不可伸缩嵌套的sei消息的payloadtype等于0(缓冲周期)、1(图像时间)或130(解码单元信息)时,包括不可伸缩嵌套的sei消息的sei nal单元的nuh_layer_id应该等于vps_layer_id[0]。当不可伸缩嵌套的sei消息的payloadtype等于vclassociatedseilist中的任一值时,包括不可伸缩嵌套的sei消息的sei nal单元的nuh_layer_id应该等于与sei nal单元关联的vcl nal单元的nuh_layer_id值。包括可伸缩嵌套式sei消息的sei nal单元的nuh_layer_id应该等于可伸缩嵌套的sei消息适用于的所有层的最小nuh_layer_id值
(当可伸缩嵌套式sei消息的nesting_ols_flag等于0时)或等于可伸缩嵌套的sei消息适用于的ols中的所有层的最小nuh_layer_id值(当可伸缩嵌套式sei消息的nesting_ols_flag等于1时)。
[0220]
示例性可伸缩嵌套式sei消息语义如下。可伸缩嵌套式sei消息提供一种将sei消息与特定ols或特定层关联的机制。可伸缩嵌套式sei消息包括一个或多个sei消息。可伸缩嵌套式sei消息中包括的sei消息还称为可伸缩嵌套的sei消息。码流一致性的要求可以是:以下限制条件应用于将sei消息包括在可伸缩嵌套式sei消息中。
[0221]
payloadtype等于132(经解码图像哈希(hash))或133(可伸缩嵌套式)的sei消息可以不包括在可伸缩嵌套式sei消息中。当可伸缩嵌套式sei消息包括缓冲周期、图像时间或解码单元信息sei消息时,可伸缩嵌套式sei消息应该不包括pavloadtype不等于0(缓冲周期)、1(图像时间)或130(解码单元信息)的任何其它sei消息。
[0222]
码流一致性的要求可以是:以下限制条件应用于包括可伸缩嵌套式sei消息的sei nal单元的nal_unit_type值。当可伸缩嵌套式sei消息包括payloadtype等于0(缓冲周期)、1(图像时间)、130(解码单元信息)、145(依赖rap指示)或168(帧字段信息)的sei消息时,包括可伸缩嵌套式sei消息的sei nal单元的nal_unit_type应该等于prefix_sei_nut。
[0223]
nesting_ols_flag等于1表示可伸缩嵌套的sei消息适用于特定ols。nesting_ols_flag等于0表示可伸缩嵌套的sei消息适用于特定层。码流一致性的要求可以是:以下限制条件适用于nesting_ols_flag值。当可伸缩嵌套式sei消息包括payloadtype等于0(缓冲周期)、1(图像时间)或130(解码单元信息)的sei消息时,nesting_ols_flag值应该等于1。当可伸缩嵌套式sei消息包括payloadtype等于vclassociatedseilist中的值的sei消息时,nesting_ols_flag值应该等于0。nesting_num_olss_minus1 1表示可伸缩嵌套的sei消息适用于的ols的数量。nesting_num_olss_minus1的取值范围应该为0至totalnumolss-1(包括端值)。
[0224]
nesting_ols_idx_deltaminus1[i]用于推导变量nestingolsidx[i],该变量表示可伸缩嵌套的sei消息在nesting_ols_flag等于1时适用于的第i个ols的ols索引。nesting_ols_idx_delta_minus1[i]的取值范围应该为0至totalnumolss-2(包括端值)。变量nestingolsidx[i]可以推导如下:
[0225][0226]
nesting_all_layers_flag等于1表示可伸缩嵌套的sei消息适用于nuh_layer_id大于或等于当前sei nal单元的nuh_layer_id的所有层。nesting_all_layers_flag等于0表示可伸缩嵌套的sei消息可以或可以不适用于nuh_layer_id大于或等于当前sei nal单元的nuh_layer_id的所有层。nesting_num_layers_minus1 1表示可伸缩嵌套的sei消息适用于的层的数量。nesting_num_layers_minus1的取值范围应该为0至vps_max_layers_minus1-generallayeridx[nuh_layer_id](包括端值),其中,nuh_layer_id是当前sei nal单元的nuh_layer_id。nesting_layer_id[i]表示可伸缩嵌套的sei消息在nesting_all_layers_flag等于0时适用于的第i层的nuh_layer_id值。nesting_layer_id[i]的值应该大
于nuh_layer_id,其中,nuh_layer_id是当前sei nal单元的nuh_layer_id。
[0227]
当nesting_ols_flag等于0时,变量nestingnumlayers和列表nestinglayerid[i](i的范围为0至nestingnumlayers-1,包括端值)可以推导如下,其中,变量nestingnumlayers表示可伸缩嵌套的sei消息适用于的层的数量,列表nestinglayerid[i]表示可伸缩嵌套的sei消息适用于的各层的nuh_layer_id值的列表,nuh_layer_id是当前sei nal单元的nuh_layer_id。
[0228][0229]
nesting_num_seis_minus1 1表示可伸缩嵌套的sei消息的数量。nesting_num_seis_minus1的取值范围应该为0到63(包括端值)。nesting_zero_bit应该等于0。
[0230]
图8为示例性视频译码设备800的示意图。视频译码设备800适合于实现本文描述的公开示例/实施例。视频译码设备800包括下行端口820、上行端口850和/或收发单元(tx/rx)810。收发单元810包括用于通过网络在上行和/或下行进行数据通信的发送器和/或接收器。视频译码设备800还包括处理器830和存储器832。处理器830包括逻辑单元和/或中央处理单元(central processing unit,cpu)来处理数据。存储器832用于存储数据。视频译码设备800还可以包括与上行端口850和/或下行端口820耦合的电组件、光电(optical-to-electrical,oe)组件、电光(electrical-to-optical,eo)组件和/或无线通信组件,用于通过电通信网络、光通信网络或无线通信网络进行数据通信。视频译码设备800还可以包括用于与用户进行数据通信的输入和/或输出(input/output,i/o)设备860。i/o设备860可以包括输出设备,例如,用于显示视频数据的显示器、用于输出音频数据的扬声器等。i/o设备860还可以包括键盘、鼠标、轨迹球等输入设备和/或用于与这些输出设备交互的对应接口。
[0231]
处理器830通过硬件和软件来实现。处理器830可以实现为一个或多个cpu芯片、一个或多个核(例如多核处理器)、一个或多个现场可编程门阵列(field-programmable gate array,fpga)、一个或多个专用集成电路(application specific integrated circuit,asic)和一个或多个数字信号处理器(digital signal processor,dsp)。处理器830与下行端口820、tx/rx 810、上行端口850和存储器832通信。处理器830包括译码模块814。译码模块814实现本文描述的公开实施例,例如方法100、900和1000,它们可以使用多层视频序列600、码流700和/或子码流701。译码模块814还可以实现本文描述的任何其它方法/机制。此外,译码模块814可以实现编解码系统200、编码器300、解码器400和/或hrd 500。例如,译码模块814可以用于对包括同播层和不包括vps的码流进行编码、提取和/或解码。此外,译码模块814可用于设置和/或推断各种语法元素和/或变量,以通过参考提取的作为子码流提取一部分的vps来避免错误。另外,译码模块814可以用于:当包括clvs的层是同播层以避免
错误地提取sps时,约束nuh_layer_id与clvs的nuh_layer_id相同。相应地,译码模块814可以用于执行解决上述一个或多个问题的机制。因此,译码模块814使得视频译码设备800在对视频数据进行译码时提供其它功能和/或提高译码效率。因此,译码模块814改进了视频译码设备800的功能,并解决了视频译码领域特有的问题。此外,译码模块814影响了视频译码设备800到不同状态的转换。可选地,以存储在存储器832中并由处理器830执行的指令(例如,存在在非瞬时性介质中的计算机程序产品)来实现译码模块814。
[0232]
存储器832包括一种或多种存储器类型,例如磁盘、磁带机、固态硬盘、只读存储器(read only memory,rom)、随机存取存储器(random access memory,ram)、闪存、三态内容寻址存储器(ternary content-addressable memory,tcam)、静态随机存取存储器(static random-access memory,sram)等。存储器832可以用作溢出数据存储设备,以在选择程序来执行时存储这些程序以及存储在执行程序过程中读取的指令和数据。
[0233]
图9为将多层视频序列编码到码流(例如码流700)中以支持为了同播层在子码流提取过程729中保留sps 713的示例性方法900的流程图。方法900可以由编码器(例如编解码系统200、编码器300和/或视频译码设备800)在执行方法100时使用。此外,方法900可以在hrd 500上操作,因此可以对多层视频序列600和/或其提取层执行一致性测试。
[0234]
方法900可以开始于:编码器接收视频序列,并根据用户输入等确定将所述视频序列编码到多层码流中。在步骤901中,所述编码器将包括经编码图像的clvs编码到码流中的层中。所述经编码图像包括在一组vcl nal单元中。例如,所述编码器可以将所述视频序列中的图像编码到一层或多层中作为一个或多个clvs,并将所述层/clvs编码到多层码流中。因此,所述码流包括一层或多层和一个或多个clvs。层可以包括一组具有相同层id的vcl nal单元和关联的非vcl nal单元。此外,clvs是具有相同nuh_layer_id值的经编码图像的序列。在一个具体的示例中,所述vcl nal单元可以与由nuh_layer_id标识的层关联。具体地,当一组vclnal单元都具有特定的nuh_layer_id值时,这组vclnal单元是层的一部分。层可以包括一组vcl nal单元以及任何参数集,这些vcl nal单元包括经编码图像的视频数据,这些参数集用于对这些图像进行译码。这些参数可以包括在vps、sps、pps、图像头、条带头或其它参数集或语法结构中。一层或多层可以是输出层,因此可以输出各层中包括的一个或多个clvs。不是输出层的层作为参考层被参考并进行编码以支持重建一个或多个输出层,但是这种支持层/clvs在解码器侧不输出。这样,所述编码器可以对各种组合的层/clv进行编码,以便根据请求将结果发送给解码器。所述层/clvs可以根据需要发送,以使得所述解码器可以根据网络条件、硬件能力和/或用户设置获取不同表示的视频序列。在本示例中,至少一层是不使用层间预测的同播层。因此,至少一个clvs包括在同播层中。
[0235]
在步骤903中,所述编码器可以将sps编码到所述码流中。所述sps由一个或多个clvs参考。具体地,当包括所述clvs的所述层不使用层间预测时,所述sps的nuh_layer_id值等于所述clvs的nuh_layer_id值。此外,当包括所述clvs的所述层使用层间预测时,所述sps的nuh_layer_id值小于或等于所述clvs的nuh_layer_id值。这样,所述sps与参考所述clvs的任何同播层具有相同的nuh_layer_id。此外,所述sps的nuh_layer_id小于或等于参考所述sps的任何非同播层的nuh_layer_id。这样,所述sps可以由多个clvs/层参考。但是,当子码流提取应用于作为同播层的clvs/层时,所述sps不会通过子码流提取移除。
[0236]
所述sps可以编码为包括sps_video_parameter_set_id,所述sps_video_
parameter_set_id表示由所述sps参考的vps的id值,例如vps_independent_layer_flag。因此,当所述sps_video_parameter_set_id大于0时,所述sps_video_parameter_set_id表示由所述sps参考的vps的vps_video_parameter_set_id值。此外,当所述sps_video_parameter_set_id等于0时,所述sps不参考vps且在对参考所述sps的任何编码层视频序列进行解码时不参考vps。相应地,当所述sps_video_parameter_set_id从由包括在同播层中的编码层视频序列参考的sps中获取时,所述sps_video_parameter_set_id被设置和/或推断为0。
[0237]
hrd可以用于执行一致性测试,因此可以用于检查码流与vvc等标准是否一致。当所述sps_video_parameter_set_id等于0时,所述hrd可以将generallayeridx[nuh_layer_id]设置和/或推断为0。所述generallayeridx[nuh_layer_id]等于并因此表示对应层的当前层索引。因此,同播层的当前层索引被设置/推断为0。此外,所述hrd可以推断,当所述sps_video_parameter_set_id等于0时,vps_independent_layer_flag[generallayeridx[nuh_layer_id]]的值等于1。具体地,所述vps_independent_layer_flag表示对应层是否使用层间预测。vps_independent_layer_flag[i]包括在vps中并可以被设置为0来表示第i层使用层间预测或者被设置为1来表示第i层不使用层间预测。因此,所述vps_independent_layer_flag[generallayeridx[nuh_layer_id]]表示索引为generallayeridx[nuh_layer_id]的当前层是否使用层间预测。因此,当所述vps_independent_layer_flag[generallayeridx[nuh_layer_id]]等于1时,所述层不使用层间预测。当所述当前层是同播层时,省略所述vps且不使用层间预测。相应地,在所述sps_video_parameter_set_id等于0时推断值为1确保同播层在hrd侧和解码期间正常工作,同时避免参考为了同播层在码流提取过程中提取出的vps。因此,这种推断避免了在为了同播层移除vps时产生的子码流提取错误。然后,所述hrd可以根据所述sps、所述sps_video_parameter_set_id、所述generallayeridx[nuh_layer_id]和/或所述vps_independent_layer_flag[generallayeridx[nuh_layer_id]]从所述同播层/clvs中的vcl nal单元中解码出经编码图像,以产生经解码图像。因此,所述hrd可以验证所述多层码流的所述同播层是否与码流一致,而不会由于为了同播层的省略vps而产生意外错误。
[0238]
在步骤905中,所述编码器可以存储所述码流,以根据请求将所述码流发送给解码器。所述编码器还可以执行子码流提取以获取同播层,并根据需要将所述码流/子码流发送给所述解码器。
[0239]
图10为从码流(例如子码流701)中解码出视频序列的示例性方法1000的流程图,其中,所述码流包括从多层码流(例如码流700)中提取出的同播层,sps 713在子码流提取过程729中保留。方法1000可以由解码器(例如,编解码系统200、解码器400和/或视频译码设备800)在执行方法100时适用。此外,方法1000可以应用于已经通过hrd(例如hrd 500)检查一致性的多层视频序列600或其提取层。
[0240]
方法1000可以开始于:解码器开始接收码流(例如方法900的结果),其中,所述码流包括从多层码流中提取出的同播层中的编码视频序列。在步骤1001中,所述解码器接收包括层中的clvs的码流。所述层可以是由编码器或其它中间内容服务器从多层码流中提取出的同播层。所述同播层包括clvs,所述clvs包括一组经编码图像。例如,所述码流包括经编码图像,其中,每个经编码图像包括在一组与由nuh_layer_id标识的所述同播层关联的
一个或多个vcl nal单元中。层可以包括一组具有相同层id的vcl nal单元和关联的非vcl nal单元。例如,层可以包括一组vcl nal单元和任何参数集,这些vcl nal单元包括经编码图像的视频数据,所述参数集用于对这些图像进行译码。因此,当这组vcl nal单元都具有特定的nuh_layer_id值时,这组vcl nal单元是层的一部分。此外,clvs是具有相同nuh_layer_id值的经编码图像的序列。所述同播层还是不使用层间预测的输出层。因此,所述clvs也不使用层间预测。
[0241]
所述码流还包括由所述clvs参考的sps。当包括所述clvs的所述层不使用层间预测时,所述sps的nuh_layer_id值等于所述clvs的nuh_layer_id值。此外,当包括所述clvs的所述层使用层间预测时,所述sps的nuh_layer_id值小于或等于所述clvs的nuh_layer_id值。这样,所述sps与参考所述clvs的任何同播层具有相同的nuh_layer_id。此外,所述sps的nuh_layer_id小于或等于参考所述sps的任何非同播层的nuh_layer_id。这样,所述sps可以由多个clvs/层参考。但是,当子码流提取应用于作为同播层的clvs/层时,所述sps不会通过所述编码器/内容服务器侧的子码流提取移除。
[0242]
所述sps包括sps_video_parameter_set_id,所述sps_video_parameter_set_id表示由所述sps参考的vps的id值,例如vps_independent_layer_flag。因此,当所述sps_video_parameter_set_id大于0时,所述sps_video_parameter_set_id表示由所述sps参考的vps的vps_video_parameter_set_id值。此外,当所述sps_video_parameter_set_id等于0时,所述sps不参考vps且在对参考所述sps的任何编码层视频序列进行解码时不参考vps。相应地,当所述sps_video_parameter_set_id从由包括在同播层中的编码层视频序列参考的sps中获取时,所述sps_video_parameter_set_id被设置和/或推断为0。此外,当所述码流只包括具有不使用层间预测的clvs的同播层时,所述码流不包括vps。
[0243]
在步骤1003中,所述解码器可以根据所述sps从所述clvs中解码出图像,以产生经解码图像。例如,当所述sps_video_parameter_set_id等于0时,所述解码器可以将generallayeridx[nuh_layer_id]设置和/或推断为0。所述generallayeridx[nuh_layer_id]等于并因此表示对应层的当前层索引。因此,同播层的当前层索引被设置/推断为0。此外,所述解码器可以推断,当所述sps_video_parameter_set_id等于0时,vps_independent_layer_flag[generallayeridx[nuh_layer_id]]的值等于1。具体地,vps_independent_layer_flag表示对应层是否使用层间预测。vps_independent_layer_flag[i]包括在vps中并可以被设置为0来表示第i层使用层间预测或者被设置为1来表示第i层不使用层间预测。因此,所述vps_independent_layer_flag[generallayeridx[nuh_layer_id]]表示索引为generallayeridx[nuh_layer_id]的当前层是否使用层间预测。因此,当所述vps_independent_layer_flag[generallayeridx[nuh_layer_id]]等于1时,所述层不使用层间预测。当所述当前层是同播层时,所述vps不包括在所述接收到的码流中且不使用层间预测。相应地,在所述sps_video_parameter_set_id等于0时推断值为1确保同播层在解码期间正常工作,同时避免参考为了同播层在码流提取过程中提取出的vps。因此,这种推断避免了为了同播层移除vps时产生的子码流提取错误。然后,所述解码器可以根据所述sps、所述sps_video_parameter_set_id、所述generallayeridx[nuh_layer_id]和/或所述vps_independent_layer_flag[generallayeridx[nuh_layer_id]]从所述同播层/clvs中的vcl nal单元中解码出经编码图像,以产生经解码图像。然后,在步骤1005中,所述解码器
可以转发所述经解码图像,以将所述经解码图像显示为解码视频序列中的一部分。
[0244]
图11为将多层视频序列译码到码流700中以支持为了同播层在子码流提取过程729中保留sps 713的示例性系统1100的流程图。系统1100可以由编码器和解码器(例如,编解码系统200、编码器300、解码器400和/或视频译码设备800)实现。此外,系统1100可以使用hrd 500对多层视频序列600、码流700和/或子码流701执行一致性测试。另外,系统1100可以在实现方法100、方法900和/或方法1000时使用。
[0245]
系统1100包括视频编码器1102。视频编码器1102包括编码模块1105,用于将clvs编码到码流中的层中。编码模块1105还用于将由所述clvs参考的sps编码到所述码流中,其中,当所述层不使用层间预测时,所述sps的nuh_layer_id值被约束为等于所述clvs的nuh_layer_id值。视频编码器1102还包括存储模块1106,用于存储所述码流,以将所述码流发送给解码器。视频编码器1102还包括发送模块1107,用于将所述码流发送给视频解码器1110。视频编码器1102还可以用于执行方法900的任一步骤。
[0246]
系统1100还包括视频解码器1110。视频解码器1110包括接收模块1111,用于接收码流,其中,所述码流包括层中的clvs和由所述clvs参考的sps,当所述层不使用层间预测时,所述sps的nuh_layer_id等于所述clvs的nuh_layer_id。视频解码器1110还包括解码模块1113,用于根据所述sps从所述clvs中解码出经编码图像,以产生经解码图像。视频解码器1110还包括转发模块1115,用于转发所述经解码图像,以将所述经解码图像显示为解码视频序列的一部分。视频解码器1110还可以用于执行方法1000的任一步骤。
[0247]
当第一组件与第二组件之间除了线、迹线或其它介质之外不存在中间组件时,第一组件与第二组件直接耦合。当第一组件与第二组件之间除了线、迹线或其它介质之外还存在中间组件时,第一组件与第二组件间接耦合。术语“耦合”及其变体包括直接耦合和间接耦合。除非另有说明,否则使用术语“约”是指包括随后数字
±
10%的范围。
[0248]
还应当理解,本文中阐述的示例性方法的步骤不一定需要按照所描述的顺序执行,并且这些方法的步骤的顺序应当理解为仅仅是示例性的。同理,在与本发明各种实施例相一致的方法中,这些方法可以包括其它步骤,并且某些步骤可以省略或组合。
[0249]
虽然本发明提供了若干个实施例,但应理解,在不脱离本发明的精神或范围的情况下,所公开的系统和方法可以通过其它多种具体形式体现。本发明示例应被视为说明性而非限制性的,且本发明并不限于本文所给出的详细内容。例如,各种元件或组件可以组合或集成在另一系统中,或者某些特征可以省略或不实现。
[0250]
另外,在不脱离本发明范围的情况下,各种实施例中描述和说明为离散或单独的技术、系统、子系统和方法可以与其它系统、组件、技术或方法组合或集成。其它变更、替换、更改示例可以由本领域技术人员在不脱离本文所公开的精神和范围的情况下确定。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献