视频编码中的参数集和图片报头
技术领域
本发明一般地涉及视频编码,更具体地,涉及视频比特流结构。
背景技术
已经制定的视频编码标准包括ITU-T H.261,ISO/IEC MPEG-1Visual,ITU-T H.262(即ISO/IEC MPEG-2 Visual),ITU-T H.263,ISO/IEC MPEG-4 Visual和ITU-T H.264(即ISO/IEC MPEG-4 AVC)。H.264/AVC是ITU-T视频编码专家组(VCEG)和ISO/IEC MPEG的联合视频工作组的(JVT)工作成果。
另外,人们正在努力完成新的视频编码标准。一个成就是开发MPEG中的可伸缩视频编码(SVC)标准。第二个成就是开发由中国音频视频编码标准工作组(AVS)组织的中国视频编码标准。在2004年2月,AVS确定了其第一个视频编码规范,用于SDTV和HDTV应用的AVS 1.0。其后,工作重心转到移动视频业务。并且分别于2004年12月和2006年4月公布了最后得到的两个标准AVS-M分级1和AVS-M分级2。
H.264/AVC之前的视频编码标准规定了用于基础比特流的结构,亦即,解码器可以进行语法分析的自包含比特流。该比特流由若干层组成,通常包括以下各层中的几层:序列层、图片层、片层、宏块层和块层。用于各层的比特流通常由报头和相关联的数据组成。片层或更高层的每个报头以用于再同步和标识的起始码开始。包括多个例程和子例程的这种结构称为基于起始码的比特流结构。
如下所述,可以用许多表来描述基于起始码的比特流结构(为简单起见,没有包括序列级和图片级的用户数据和扩展数据):
video_bitstream(){ |
next_start_code() |
do{ |
sequence_header() |
do{ |
picture_header() |
do{ |
slice_header() |
slice_data() |
next_start_code() |
}while(后面是片起始码) |
}while(后面是图片起始码) |
}while(后面不是比特流结束码) |
} |
sequence_header(){ |
sequence_start_code |
sequence_header_parameter#1 |
sequence_header_parameter#2 |
... |
next_start_code() |
} |
picture_header(){ |
picture_start_code |
picture_header_parameter#1 |
picture_header_parameter#2 |
... |
next_start_code() |
} |
slice_header(){ |
slice_start_code |
slice_header_parameter#1 |
slice_header_parameter#2 |
... |
} |
正如在上面的表中看到的那样,video_bitstream()例程包含多个子例程,如next_start_code(),sequence_header()。用于这些子例程的每一个子例程的表包含多个例如起始码的代码和多个参数。
video_bitstream()例程中的next_start_code()子例程使比特流指针前进直至下一个起始码。序列结束码(未示出)也是一种类型的起始码。slice_data()子例程(没有用表的方式表示)包含除片报头之外的片的编码视频数据。
用于H.264/AVC的句法由网络抽象层(NAL)单元组成。编码的视频数据被组织成NAL单元。每个NAL单元实际上是一个分组,该分组包含整数个字节。每个NAL单元的第一个字节是一个报头字节,该报头字节包含该NAL单元内的数据类型的指示,剩余字节包含该报头所指示的类型的有效载荷数据。NAL单元结构定义规定面向分组的和面向比特流的传送系统中使用的一般格式。编码器生成的一系列NAL单元称为NAL单元流。NAL单元流不能形成基础比特流,这是因为NAL单元中没有起始码。相反地,当需要基础比特流结构时,必须利用根据H.264/AVC规范的附录B的起始码构造NAL单元,以形成基础比特流。
在片层和下面的层上,H.264/AVC包含报头,但它不包括图片和序列报头。而是用一个或多个参数集取代报头。利用参数集设计来提供报头信息的鲁棒且有效的运送。因为报头信息(如序列报头或图片报头信息)的几个关键比特的丢失可能会对解码过程造成非常严重的不利影响,通过使用参数集设计可以隔离这类关键信息,以便用更灵活、更专业的方式进行处理。
假设的是参数集将包含被认为很少变化的信息,并提供对很多片的解码。有两种类型的参数集:
1)序列参数集,应用于称为编码视频序列的一系列连续编码的视频图片;以及
2)图片参数集,应用于编码视频序列内的一个或多个分割图片的解码。
序列和图片参数集机制把很少变化的信息的传送和视频图片中的采样的值的编码表示的传送分离开来。每个片包含有指向有关图片参数集的内容的标识符,并且每个图片参数集包含有指向相关序列参数集的内容的标识符。如此,可以利用少量数据(标识符)来指向大量信息(参数集),而无需在每个片内重复该信息。可以在应用这些序列和图片参数集的其它NAL单元之前发送它们,并且可以重复这些序列和参数集以提供预防数据丢失的鲁棒性。在某些应用中,可以在运送其它NAL单元的信道内发送参数集(称为“带内”传送)。在其它应用中,通过使用比视频信道本身更可靠的传送机制采用“带外”方式来运送参数集是有利的。
H.264/AVC的比特流结构称为NAL单元加参数集比特流结构。请注意,如果使用H.264/AVC附录B,则可以把比特流结构视为起始码加参数集比特流结构,这是因为可以把H.264/AVC附录B的起始码前缀和NAL单元的第一个字节的拼接定义为一个起始码。
NAL单元加参数集比特流结构是包含序列参数集NAL单元、图片参数集NAL单元和片NAL单元在内的许多NAL单元的拼接,如下所述:
sequence_parameter_set_NAL_unit(){ |
nal_unit_header |
sequence_parameter_set_id |
sequence_parameter#1 |
sequence_parameter#2 |
... |
} |
picture_parameter_set_NAL_unit(){ |
nal_unit_header |
picture_parameter_set_id |
sequence_parameter_set_id |
picture_parameter#1 |
picture_parameter#2 |
... |
slice_NAL_unit(){ |
nal_unit_header |
slice_header() |
slice_data() |
} |
slice_header(){ |
picture_parameter_set_id |
slice_header_parameter#1 |
slice_header_parameter#2 |
... |
} |
在上面的表中,除了别的以外,其中的nal_unit_header代码还指示NAL单元的类型。
可以用以下方式描述起始码加参数集比特流结构:
video_bitstream(){ |
next_start_code() |
do{ |
if(后面是序列参数集起始码){ |
sequence_parameter_set() |
} |
if(后面是图片参数集起始码){ |
picture_parameter_set() |
} |
if(后面是片起始码){ |
slice_header() |
slice_data() |
next_start_code() |
} |
sequence_parameter_set(){ |
sequence_parameter_set_start_code |
sequence_parameter_set_id |
sequence_parameter#1 |
sequence_parameter#2 |
... |
next_start_code() |
} |
picture_parameter_set(){ |
picture_parameter_set_start_code |
picture_parameter_set_id |
sequence_parameter_set_id |
picture_parameter#1 |
picture_parameter#2 |
... |
next_start_code() |
) |
slice_header(){ |
slice_start_code |
picture_parameter_set_id |
slice_header_parameter#1 |
slice_header_parameter#2 |
... |
} |
在上面的表中,sequence_parameter_set_id代码标识来自任一其它序列参数集的序列参数集。picture_parameter_set_id代码标识来自任一其它图片参数集的图片参数集。
与基于起始码的结构相比,序列报头和图片报头子例程在起始码加参数集结构中是无用的。鉴于此,没有把序列报头和图片报头子例程包括在起始码加参数集结构内。AVS Video 1.0采用了基于起始码的比特流结构。迄今为止,尚不清楚基于起始码的比特流结构或具有NAL单元加参数集的结构是否用于AVS-M和MPEG-21 SVC编码标准。
在基于起始码的比特流结构中,例如在H.264/AVC之前的编码标准中的比特流结构中,没有使用参数集技术。因此,对于序列报头中的每个序列或图片报头中的每个图片,必须重复用信号通知保持不变的很少发生变化的信息。从压缩效率的观点看,这是浪费。另外,在不使用参数集技术的情况下,难以把很少发生变化的信息的传送和其它信息的传送分离开来。这使得编码数据很容易受到传输误差的影响,因为序列报头或图片报头中很少发生变化的信息的几个关键比特的丢失可能会对解码过程造成非常严重的不利影响。
在NAL单元加参数集比特流结构和起始码加参数集比特流结构中,没有图片报头。必须在每个片报头中重复用于某一图片的保持不变的某些信息。从压缩效率的观点看,这也是浪费。特别地,对于H.264/AVC,正如在下面看到的那样,保守估计此类信息将占用全部比特速率的2%。
图1表示层分层结构(不论是加NAL单元还是加起始码)中的常规的基于参数集的结构。
H.264/AVC片报头中的参数包括可以在整个图片的每一片中变化的参数以及在整个图片中保持不变的参数。图2表示在整个图片中不变的片报头中的参数连同每个参数使用多少比特的估计。该估计给出的结果是每片16比特。对于CIF(通用媒体格式)图片,当使用每片一个宏块行的分片方法时,每帧有18行。得出18×16=288比特/帧。在每秒30帧时,变成8640比特/秒,这是384kbps总比特速率的2.3%。对于移动视频通话,一个合理的假设是,QCIF(四分之一CIF)图片具有每片100字节,以便以64kbps的速率传送。这等效于80片/秒。对于每片16比特,传输速率为80×16=1280比特/秒,即,384kbps总比特速率的2.0%。
发明内容
为了提高视频编码中的压缩效率,本发明在片之前的图片层中提供一个图片报头。作为选择,图片报头参数可选择地包含在片报头内,不管该图片层内是否提供图片报头。此外,图片报头参数可以包含在一个或多个片内。
在现有技术中,图片报头参数包含在片报头内。相反地,根据本发明:图片报头参数包含在
图片报头内;或者
图片报头内,并且可选择地包含在由某一标志指示的片报头的每个片报头内;或者
至少一个片报头内,并且可选择地包含在由某一标志指示的其它片报头的每个片报头内。
附图说明
图1表示视频比特流中的常规的基于参数集的结构;
图2是现有技术的H.264/AVC片报头中的参数的列表;
图3表示根据本发明的视频比特流中的基于参数集的结构;
图4是一个框图,表示根据本发明的视频编码系统;
图5是一个框图,表示根据本发明的视频编码器;
图6是一个框图,表示根据本发明的视频解码器;
图7是一个框图,表示根据本发明的具有视频编码系统的电子设备;
图8a表示根据本发明另一实施例的视频比特流中的基于参数集的结构;以及
图8b表示根据本发明又一实施例的视频比特流中的基于参数集的结构。
具体实施方式
可以在两个实施例内实现本发明。第一实施例与基于起始码的比特流结构有关,而第二实施例与NAL单元加参数集比特流有关。
第一实施例
本发明的第一实施例在基于起始码的比特流结构中同时使用参数集和图片报头子例程。
为了支持两种类型的参数集子例程:序列参数集子例程和图片参数集子例程,使用两个独特的起始码:序列参数集起始码和图片参数集起始码。这些起始码中的每个起始码必须与任何其它起始码不同,它们包括比特流结束码。
以下描述本发明的第一实施例:
video_bitstream(){ |
next_start_code() |
do{ |
if(后面是序列参数集起始码){ |
sequence_parameter_set() |
} |
if(后面是图片参数集起始码){ |
picture_parameter_set() |
} |
if(后面是图片起始码){ |
picture_header() |
do{ |
slice_header() |
slice_data() |
next_start_code() |
}while(后面是片起始码) |
} |
}while(后面不是比特流结束码) |
} |
sequence_parameter_set(){ |
sequence_parameter_set_start_code |
sequence_parameter_set_id |
sequence_parameter#1 |
sequence_parameter#2 |
... |
next_start_code() |
} |
picture_parameter_set(){ |
picture_parameter_set_start_code |
picture_parameter_set_id |
sequence_parameter_set_id |
picture_parameter#1 |
picture_parameter#2 |
... |
next_start_code() |
} |
picture_header(){ |
picture_start_code |
picture_parameter_set_id |
picture_header_parameter#1 |
picture_header_parameter#2 |
... |
next_start_code() |
} |
slice_header(){ |
slice_start_code |
picture_parameter_set_id |
slice_header_parameter#1 |
slice_header_parameter#2 |
... |
next_start_code() |
} |
根据第一实施例:
1)在上面的表中,也允许在片报头之前存在至少一个序列参数集或图片参数集。
2)图片报头(picture_header_parameter#1,#2,...)内的信息没有变化,用于整个图片的解码,并且与图片参数集(picture_parameter#1,#2,...)内的信息相比,其变化比较频繁(例如,针对每个图片变化)。
3)picture_parameter_set_id代码包含在图片报头和片报头两者内。然而,如果图片报头参数的语法分析不需要该图片参数集内的信息,则也可以从该图片报头中排除picture_parameter_set_id代码。如果图片内的所有片必须使用同一图片参数集,则还可以从该片报头中排除picture_parameter_set_id代码。
4)序列报头不存在,这是因为应该在该序列报头内的所有信息已经包含在该序列参数集内。然而,也允许序列报头的存在,以包含变化相对频繁的某些序列级参数(例如,针对每个序列变化)。如果序列报头存在,则序列起始码是必需的,作为序列报头内的第一个参数。在这种情况下,也允许在图片报头之前存在至少一个序列参数集或图片参数集。
第二实施例
本发明的第二实施例在NAL单元加参数集比特流结构中同时使用参数集子例程和图片报头子例程。根据本发明的第二实施例,通过使用H.264/AVC附录B或类似编码器,可以实现在起始码加参数集比特流结构中同时使用参数集子例程和图片报头子例程。
为了实现本发明的第二实施例,需要用于图片报头的新的NAL单元类型。如下所示,把新的图片报头表放在片报头表之前:
sequence_parameter_set_NAL_unit(){ |
nal_unit_header |
sequence_parameter_set_id |
sequence_parameter#1 |
sequence_parameter#2 |
... |
} |
picture_parameter_set_NAL_unit(){ |
nal_unit_header |
picture_parameter_set_id |
sequence_parameter_set_id |
picture_parameter#1 |
picture_parameter#2 |
... |
} |
picture_header_NAL_unit(){ |
nal_unit_header |
picture_
parameter_
set_
id |
picture_header_parameter#1 |
picture_header_parameter#2 |
... |
} |
slice_NAL_unit(){ |
nal_unit_header |
slice_header() |
slice_data() |
} |
slice_header(){ |
picture_parameter_set_id |
slice_header_parameter#1 |
slice_header_parameter#2 |
根据本发明的第二实施例:
1)图片报头NAL单元在属于同一图片的所有片NAL单元之前。
2)在对整个图片进行解码的期间内,图片报头信息(picture_header_pararcieter#1,#2,...)没有变化,与图片参数集(picture_parameter#1,#2,...)内的信息相比,其变化比较频繁(例如,针对每个图片变化)。
3)如果图片NAL单元容易受到传输误差,则也可以在片中选择包含图片报头信息,以提高误差恢复力。
4)picture_paramet er_set_id代码包含在图片报头和片报头两者内。然而,如果图片报头参数的语法分析不需要该图片参数集内的信息,则也可以从该图片报头中排除picture_parameter_set_id代码。如果图片内的所有片必需使用同一图片参数集,则也可以从该片报头中排除picture_parameter_set_id代码。
5)序列报头不存在,这是因为应该在序列报头内的所有信息已经包含在该序列参数集内。然而,也可以允许存在包含有被认为是变化比较频繁的(例如,针对每个序列变化的)某些序列级参数的序列报头。如果该序列报头存在,则用于该序列报头的另一个NAL单元类型是必需的。
根据本发明的第二实施例,在每个片报头中可以选择性地包含图片报头信息(picture_header_parameter#1,#2,...)来代替图片报头NAL单元。
总之,在该视频编码方法中,根据本发明,与比特流结构中的图片报头子例程一起同时使用一个或多个参数集子例程。该比特流结构可以是基于起始码的比特流结构或NAL单元加参数集比特流结构。如果该比特流是基于起始码的比特流结构,则使用一个或多个参数集起始码来支持相应的参数集例程。如果比特流是NAL单元加参数集比特流结构,则用于该图片报头的新的NAL单元是必需的和/或该图片报头参数可以选择性地包含在片报头内。连同其它NAL单元一起使用新的图片报头,但是在同一图片内的所有片NAL单元之前。图3依据视频比特流中的层分层结构表示基于参数集的结构,不论该基于参数集的结构是基于起始码还是基于NAL单元。和图1所示的常规的基于参数集的结构形成对照,根据本发明的图片报头出现在图片层中。在图1和图3中,MB代表宏块。
可以在图4所示的视频编码系统中实现根据本发明的视频编码方法。正如图4所示,视频编码系统1包括发射设备20,后者具有可操作地与发射机40相连接的编码器30。编码器30接收来自诸如照相机、摄象机之类的视频信号源10的需要在视频流中被编码的图片。可以把视频流的图片(画面)分成更小的部分,如片。还可以把片分成宏块(MB)或块。编码器30选择供编码处理使用的合适的参数集,并且通过信道50和接收机70,经由发射机40向解码器80提供选择的参数集。正如图4所示,解码器80是接收机系统的一部分,接收机系统还包括一个显示设备90。发送到解码器的视频数据是比特流形式的,该比特流具有多个结构层,该多个结构层包括层分层结构中的序列层、图片层和片层。该比特流具有基于参数集的结构,包括选择的参数集。基于参数集的结构还包括代表结构层的多个子结构,其中一个结构层代表图片层中的图片。根据本发明,代表该图片层中的图片的结构层包括片层中的多个片,以及多个片前面的图片层中的图片报头。在对比特流中的视频数据进行解码后,可以在显示设备90上显示经过解码的视频数据。
正如图5所示,编码器30有一个编码缓冲器330,用于临时存储需要进行编码的某些图片。编码器30还包括存储器310和处理器320,用于接收需要进行编码的原始视频序列302。存储器310包括具有可执行代码组成的软件程序312,该可执行代码用于生成包含在该图片层内的参数集和图片报头。处理器320根据本发明执行编码任务。存储器310和处理器320可以是与发射设备30共存的,或是可操作地与发射设备30相连接的。从处理器320执行的编码处理起,将经过编码的图片移动到编码图片缓冲器340,如必要的话。从编码器30向解码器80发射经过编码的图片342。
正如图6所示,在接收端,对在处理器810中接收的经过编码的图片802进行解码,以形成尽量与经过编码的图片相对应的解压缩图片。可以在RAM 830中的解码缓冲器832中缓冲经过解码的图片,RAM 830是存储设备820的一部分。解码器80还包括内嵌在ROM840中的一个软件程序842,以便在处理器810执行的解码处理中使用该参数集和该图片层内的图片报头。
根据本发明,编码器30和解码器80可以用在诸如移动终端的电子设备中。正如图7所示,电子设备100具有用于数据和信号处理的CPU 120。CPU 120包括可操作地与RF前端相连接的编码器30和解码器80,用于接收来自通信网络中的一个或多个网络部件的视频数据,以及用于向该通信网络中的一个或多个网络部件传送视频数据。电子设备100可以包括用于提供需要进行编码的图片的照相机130,以及用于显示解码的图片的显示器160。正如图7所示,存储设备110可以用于图片缓冲和编码缓冲。软件112可以包括编码器软件程序312(见图5)和解码器软件程序842(见图6)。电子设备还包括可通过音频处理器150与CPU 120可操作地相连接的音频输出设备152和音频输入设备154。例如,可以把软件112内嵌在芯片集内的存储介质内。
请注意,可以把本发明扩展到任意的基于起始码的比特流结构中,其方法是在保持图片报头的同时,在其结构中引入一个或多个参数集。根据本发明,使用两个参数集:序列参数集和图片参数集。然而,参数集的数目未必是2。通常,参数集的数目为N,其中N是正整数。例如,也可以使用诸如片参数集的附加参数集。
关于图3所示的视频比特流中的基于参数集的结构,可以在图片的一个或多个片报头中选择包含图片报头参数,如图8a所示。此外,也可以在至少一个片报头中或者可选地在某一标志指示的其它片报头中包含该图片报头参数,如图8b所示。
因此,尽管相对于其一个或多个实施例描述了本发明,但是本领域的熟练技术人员懂得,可以对其形式和细节做出前述和各种其它变更、删节和异化,而并不背离本发明的范围。