全部博文(20)
分类:
2009-09-28 13:25:31
H264 Scalable Video Coding 学习报告
|
1.
Scalable Video Coding – 可分级视频编码
-
为什么需要可分级视频编码技术(SVC)
实际应用中,存在不同的网络和不同的用户终端,各种情况下对视频质量的需求不一样。例如,在利用网络传输视频信息时,由于网络带宽限制了数据传输,因此要求当网络带宽较小的时候,只传输基本的视频信号,并根据实际网络的状况决定是否传输增强的视频信息,使视频的质量得到加强。
在这样的背景下,利用可分级视频编码技术实现一次性编码产生具有不同帧率、分辨率的视频压缩码流,然后根据不同网络带宽、不同的显示屏幕和终端解码能力选择需要传输的视频信息量,以此实现视频质量的自适应调整。
-
可分级视频编码(SVC)是什么
为了能够实现从单
H.264 SVC以H.264 AVC视频编解码器标准为基础,利用了AVC编解码器的各种高效算法工具,在编码产生的编码视频时间上(帧率)、空间上(分辨率)可扩展,并且是在视频质量方面可扩展的,可产生不同帧速率、分辨率或质量等级的解码视频。
2.
H264 Scalable Video Coding Extension
H.264 SVC(H.264可分级编码)作为H.264标准的一个扩展最初由JVT在2004年开始制定,并于2007年7月获得ITU批准。
H264可分级视频编码是H264/AVC标准的扩展 (Annex G , 2007),它是以H264/AVC标准为基础,通过各种编码工具,形成分层编码(multi-layer coding)方式,以提供时间(Temporal)上,空间(Spatial)上和图像质量(Quality)上的可调整特性,可产生不同帧率、图像分辨率或图像质量等级的解码视频。
-
H264 SVC结构
H264可分级视频编码采用分层编码方式实现,由一个基本层(Base Layer)和多个增强层(Enhancement Layer)组成,增强层依赖基本层的数据来解码。其中,基本层(base layer)编码了基本的视频信息,实现了最低图像分辨率、帧率,并且基本层的编码是兼容H264/AVC编码标准的,能够采用H264/AVC解码器进行解码。
H264 SVC以不同分辨率的图像为基础形成分层结构(inter-layer prediction),并在此基础上每一层用Hierarchical B-picture来实现Temporal
Scalablity,用MGS编码来实现Quility Scalability (SNR Scalability)
每一层内的编码都使用了H264/AVC中帧内和帧间预测编码工具,而相邻层之间使用了SVC独有的层间预测编码工具。
EL(Enhancement Layer)的参考,可以是来源于同一层的其他帧,也可以是低层上采样的帧。但是不可以是更高层的帧,那样的话丢弃高层的nalu会导致低层无法解码。
-
Temporal Scalablity – 时间可分级编码工具
利用Hierarchical B-picture(层次化B帧)实现时间可分级,使每一层具有不同的帧率。
(note: MTCF由于复杂性最终没有被SVC标准采用)
在原始的JSVM設計中,採用了MCTF來達到Temporal Scalability與產生更高解析度的加強層,但是在標準的制訂過程中,是否要使用MCTF這種Lifting的架構一直飽受爭議,雖然要達到解碼端的畫面完美重建勢必無法關閉Lifting架構中的Updating Stage,但是如果不關閉Updating Stage在低位元率的時候,反而會因為量化誤差而使兩兩畫面間的畫質差異過大,且Lifting架構屬於Open Loop的編碼架構,會發生飄移誤差的問題,再加上使用MCTF的編碼架構會使得編碼複雜度大大的提高。在諸多考量下,後來放棄了納入MCTF的編碼架構,僅只保留Hierarchical B pictures的編碼方式來達成Temporal Scalability,但嚴格來說Hierarchical B pictures的編碼方式也是一個模仿MCTF的編碼架構。
Hierarchical B-picture的概念来自于传统的B picture编码方式,但与之不同的是,在Hierarchical B-picture中产生的B picture可以被其他B picture参考
分层预测结构
Picture
0/9 – Key Frame, coded by I/P frame
Qulity Scalability(MGS)也使用了Key Frame
-
Spatial Scalability – 空间可分级编码工具
利用down/up sampling filter(上/下采用滤波)、inter-layer prediction(层间预测)实现时间可分级,使每一层具有不同的图像分辨率。
由于低层是由高层通过下采样得到的,因此在相同的时域分辨率情况下,每一个高层帧都有与之相对应的低层帧,两者之间存在着显而易见的相关性,我们称之为层间冗余。显然,为了获得更高的压缩效率,有必要通过各种层间预测技术来消除层间冗余,这也是空域可伸缩性技术的关键所在。设计层间预测算法的目的是尽可能利用基本层的信息提高增强层的编码效率。
几个相关语法元素
H264 SVC提供三种层间预测(inter-layer prediction):
-
inter-layer intra prediction
base mode flag为1,且相应的reference layer中的8x8块是帧内编码,参考层中的4x4块(4个)被重构,经过去块滤波操作后上采样得到预测信号。亮度上采样采用的是4-tap的FIR滤波器,色度上采样采用的是bilinear滤波器。而后,ehencement layer传送残差系数,经反变换后加到预测信号上。
在upsampling之前,需要对reference layer的重构信息进行去块滤波(deblocking)。
为了保证sigle loop的解码,需要避免在reference layer进行motion compensation,即Constrained Inter-layer
Intra-prediction。
- inter-layer motion
prediction
base mode flag为1,且相应的参考层中的8x8块是帧间编码,Block
partition信息、reference
index、motion
vectors由reference
layer中相应的8x8块推导出来。此时block partition信息由reference layer中相应的8x8块的partition信息上采样得到,同时得到与partition相应的reference index、motion vectors(需要先被scale)。
base mode flag为0时,还可以有一种对motion的interlayer
prediction,开关为motion
prediction flag:
- motion
prediction flag为1,则与此reference list相关的reference index、motion vector prediciton由reference layer中相应的块推导出来。这里与base mode flag为1时有点区别,这里只是MVP由reference
layer推导出来,所以EL还要传送MVD。别忘了motion vectors需要被scale。
-
motion prediction flag为0,传统的帧间宏块:运动矢量的预测与h.264标准相同。
- inter-layer residual
prediction
在enhencement layer中的inter-coded宏块,无论是采用base mode flag还是传统的帧间宏块,都可以采用这一方式。
residual prediction flag为1,则reference layer中相应的8x8块的残差经过bilinear上采样,作为enhencement layer宏块的残差预测,enhencement layer中传送“残差的残差”。需要注意的是这里的上采样不要跨越reference layer的变换块边界,否则会降低视觉效果,具体的处理办法是对边界进行重复外拓。
目前的JSVM是一個多次執行的程式,為了要達到Spatial Scalability的目的,在每次開始執行編碼器之前,需要一個額外的程式將原始的視訊內容調整到所要的解析度大小。例如,原始的視訊畫面大小為4CIF大小的畫面,如果要增加對畫面大小CIF與QCIF的支援的話,在JSVM裡面提供了一個名為DownConvert的程式讓我們可以將原始畫面轉換到任意的畫面解析度大小。事實上,DownConvert只不過是一個傳統的Spatial domain的轉碼器,這個程序被稱為Spatial Decimation。當完成畫面轉換之後,每個解析度大小的畫面將各自被送進獨自的編碼程序中。
-
Quility Scalability (SNR Scalability) – 图像质量可分级
一般是通过越来越小的量化步长来进行量化而进行的
MGS (SVC中采用)
MGS需要考虑的是压缩效率和drift效应的折中,H264 SVC中是通过引入key picture达到较好的效果。 Key picture即时域最基本层的图像。这些key picture的重构是通过base quality layer实现的。因此higher quality layer的丢弃造成的drift仅仅只能作用在当前key picture到下一个key picture之间,实现了对drift效应限制。与此不同,时域扩展层的图像则是通过参考层的最高可用quality运动补偿得到的,从而提升了压缩效率。要实现压缩效率和drift效应的最佳折中,可以通过调整GOP size或者hierarchy的阶数。
在文中出现的“参考帧”这个名词时,都是特指inter-frame prediction的参考,即P,B的参考, 而不是inter-layer
prediction的参考。
1. 认识MGS结构
理解MGS结构,先要理解下面这个图(fig
(a)Base layer only,非常简单,所有的inter
prediction全都是在SNR BL层完成。这样做的缺点就是编码的效率会不好。因为所有的参考帧都是SNR BL,也就是最不“清楚”的图像。参考帧品质差,那么残差就会大,进而编出的bit会多。
(b)Enhancement layer only,克服了(a)的缺点,所有参考帧都用最“清楚”的图像,那么编码效率最好。这种结构仍然有问题,一旦解码端只收到了SNR BL,而SNR EL都丢失了。那么很显然会造成解码出问题,并且这种问题会一直传播下去直到下一个IDR,即drift效应。
(c)Two-loop,很自然可以想到用这种结构来克服(a)和(b)的问题。但很明显这样的结构仍然会有drift效应。
(d)Key picture,SVC标准使用的方法,实际是一种a)和(b)的折中方案。key picture就是temporal id为0的access unit(图中用条纹标明)。对key picture而言,它们只能采用SNR BL层来实现inter prediction,这和图(a)是完全一致的;而non key picture,则一概使用最“清楚”的图像作为参考帧,这个图(b)是完全一样的。
简单分析一下,编码效率角度来看由于大部分图像都是使用最“清楚”的图像作参考,因此编码效率较好;drift控制角度来看任何由于SNR EL的丢弃造成的错误都不可能转播到下一个key picture之后,因此也不错。
2. 概念reference base picture
出发点明确了以后,再看SVC标准是如何实现这样的MGS结构的。首先看标准上的一个概念reference base picture:
G.3.46 reference base picture:A
reference picture that is obtained by decoding a base quality layer
representation with the nal_ref_idc syntax element not equal to 0 and the
store_ref_base_pic_flag syntax element equal to 1 of an access unit and all
layer presentations of the access unit that are referred to by inter-layer
prediction of the base quality layer representation. A reference base picture
is not an output of the decoding process, but the samples of a reference base
picture may be used for inter prediction in the decoding process of subsequent
pictures in decoding order. Reference base picture is a collective term for a
reference base field or a reference base frame.
简单说,就是QId等于0的参考图像。它可能并不是最终的输出图像(因为最终的输出图像可能是SNR BL +
SNR EL),但它在整个解码的过程中,会在某些场合下作为参考帧。结合下面的一个例子来理解
QId = 1: I1 b B1 b P1 ...
QId = 0: I0 b B0 b P0 ... (example-1)
哪些picture是reference base picture?很明显按照reference base
picture的定义I0、P0、B0都是,I1、P1、B1不是(QId不为0),b也不是(不是参考帧)。也很容易理解,我们最后需要输出的图像是SNR BL + EL的最“清楚”图像,所以I0,P0,B0并不会被输出。但是它们有可能会被用作参考。什么时候用作参考?这时候就和MGS key picture有关系了。结合上面的图(d),可以看到解码P0的时候I0是要被当作参考帧的。这就是reference
base picture的含义。
3. 语法元素store_ref_base_pic_flag
更进一步说,key picture中reference base picture会充当参考帧的角色,尽管不会最终输出,它们仍需要被存入DPB中;而non key picture(例如B0)的reference base picture,它在整个解码的过程中并不会充当参考,因此不应该被放入DPB中占用多余资源。那么这里引入标准中的一个语法元素store_ref_base_pic_flag:
store_ref_base_pic_flag equal to 1 specifies
that, when the value of dependency_id as specified in the NAL unit header is
equal to the maximum value of dependency_id for the VCL NAL units of the
current access unit, an additional representation of the coded picture that may
or may not be identical to the decoded picture is marked as "used for
reference". This additional representation is also referred to as
reference base picture and may be used for inter prediction of following
pictures in decoding order, but it is not output.
简单说,这个语法元素就是指定当前nalu包含的reference base picture是不是要被存入DPB中用作将来的参考。再观察可以发现,store_ref_base_pic_flag这个语法元素一般情况下只会在Qid=0的NALU中。那么回到上面的例子,显然对于I0和P0,store_ref_base_pic_flag应该为1;B0的store_ref_base_pic_flag应该为0。
4. 语法元素use_ref_base_pic_flag
接下来我们再看另一个语法元素use_ref_base_pic_flag:
use_ref_base_pic_flag equal to 1 specifies
that reference base pictures are used as reference pictures for the inter
prediction process. use_ref_base_pic_flag equal to 0 specifies that decoded
pictures are used as reference pictures during the inter prediction process.
该语法元素属于nal_unit_header_svc_extenstion,它的作用就是表明当前的nalu使用什么作为参考。需要注意的是对于Dependency ID相同的nalu,use_ref_base_pic_flag都得是相同的。再拿一个例子来说明
QId = 1: I1 B1 P1 ...
QId = 0: I0 B0 P0 ... (example-2)
假设解码端现在BL和EL都能收到。当解码P0时,P0有两个参考帧可以选用,1) I0,即reference base picture;2) I0+I1,即decoded picture。如果我们使用的是MGS,那么P0显然是key
picture,它必须使用I0做参考。因此此时P0的use_ref_base_pic_flag就应该是1。遵循标准,P1的use_ref_base_pic_flag也是1。
现在来看解码B0,根据MGS的结构,B0应该采用I0+I1和P0+P1,即decoded pictures来当作参考,因此B0的use_ref_base_pic_flag应该是0。同样道理,B1的use_ref_base_pic_flag也是0。下面来说明一下use_ref_base_pic_flag等于0,即decoded pictures来当作参考的具体含义。在上面的例子examp1e-2里我们假设了BL和EL都在解码端收到了,那如果EL丢掉了呢?再看此时的B0解码,它会使用仅有的I0,P0来当作参考帧来解码。这就是“decoded pictures”的含义。显然这样解码的B0、B1会有错误,但是这里的drift效应不会扩散到P0之后。
这里有个额外的话题,我们可以发现对于I picture,它们的use_ref_base_pic_flag是没有意义的,因为它们不需要任何参考帧。那为什么这个语法元素还要出现在I NALU中增加1 bit的冗余呢?原因我想可能是这样的:前面已经说过use_ref_base_pic_flag是nal_unit_header_svc_extenstion的一个语法元素。在SVC码流在传输的过程中网络中会有一些adapting节点,用来做bitstream extracting。它们会parse每个nalu的header,然后判断哪些NALU要被丢掉。这样的节点通常要处理大量的数据包,因此我们希望adapting的实现最简单经济。因此显然一致的nalu header结构是最适合的。如果对I nalu去掉这个语法元素,那么adapting节点还要多一个额外的判断。
5. 实例
到这里基本上MGS的结构和标准的实现方法已经介绍完了。下面给出一个例子:
以下是从编码trace文件中取出的结果:
Structure:
Q2: I2 b B2 b P2
Q1: I1 b B1 b P1
Q0: I0 b B0 b P0
Picture |
DTQ |
use_ref_base_pic_flag |
store_ref_base_pic_flag |
I0 |
000 |
1(无意义) |
1 |
I1 |
001 |
1(无意义) |
无 |
I2 |
002 |
1(无意义) |
无 |
P0 |
000 |
1 |
1 |
P1 |
001 |
1 |
无 |
P2 |
002 |
1 |
无 |
B0 |
010 |
0 |
0 |
B1 |
011 |
0 |
无 |
B2 |
012 |
0 |
无 |
- Bitstream结构与Extractor
在傳統的可調適性視訊編碼中,例如MPEG-4 FGS,編碼器會分別產生一個基礎層與加強層的Bitstream。如果我們可以得知目前的網路頻寬變化,只要切割加強層的資訊到目前可用的頻寬大小就可以達到位元率的調適,可是這樣的調適只在於SNR Scalability,如果要改變畫面大小或畫面更新率時就會遇到不少問題要處理,但是在目前的Scalable Extension
of H.264/AVC中引入了「Layer」的概念,Bitstream是由許多的Layer所組成,每個Layer有可能是Temporal
Layer、Spatial Layer或SNR Layer。而當發生網路變化或者是在不同用戶播放裝置的環境中,Extractor則去抽取對應的Layer來因應各種可能的變化,例如,偵測到目前網路頻寬是256K,且用戶端播放裝置要CIF大小的畫面,且畫面更新率為15的時候,則Extractor只要讀取Bitstream中每個NAL Unit的標頭,然後挑出屬於CIF大小的畫面,且畫面更新率為15的Layer出來,然後看是否仍然低於要求的頻寬要求,如果是則加入更多的SNR Layer來滿足頻寬大小。
SVC是为了在比特流级别上实现可伸缩性,为了这个目的,SVC增加了nal_unit_header_svc_extension,其中包含了D( Spatial层次号 ), Q( quality层次号 )以及T( Temporal 层次号 )及其他有用信息,用于方便Bit-stream的提取。
In order to attach SVC related information to non-SVC NAL units, prefix_nal_unit_rbsp are introduced.
- Access
Unit of H264 SVC
在H.264/AVC中,Access
Unit是一个很好理解的概念,就是若干NAL unit的组合(包括VCL NALU和相关的non-VCL NAL unit)能解出一副完整图像,就认为是一个access unit,标准中给出的定义为:
: A set of NAL units always containing exactly one
primary coded picture. In addition to the primary coded picture,
an access unit may also contain one or more redundant coded pictures,
one auxiliary coded picture, or other NAL units not containing slices
or slice data partitions of a coded picture. The decoding of an
access unit always results in a decoded picture.
然而当进入H.264/SVC时代,由于多个不同layer的存在使得nalu的组合更为复杂,这个概念变得不好理解起来。而标准对此却没有相应的说明(至少目前对JVT-x201观察没有发现)。这篇笔记的目的就是总结对SVC中access uni概念的理解。
在“System and Transport
Interface of SVC,Ye-Kui Wang,”这篇paper中有这样一段说明:In this paper seven logical entities are described that may consist of
more than one NAL unit:
1. layer
representation:对于一幅图像,具有相同dependency_id和quality_id的所有coded
slices的组合。
2. dependency
representation:对于一幅图像,具有相同dependency_id的所有coded slices组合。
3. access unit:对于一幅图像,所有的dependency representation再加上相关的non-VCL NAL units。
4. scalable layer:具有相同dependency_id、quality_id和temporal_id的所有layer
representation的组合。
5. dependency
layer:具有相同dependency_id 的scalable layer组合。
6. base layer:dependency_id、quality_id都为0的layer
representation。
7. coded video
sequence:不多说
首先需要理解,前三个概念(representation和access
unit)都是针对某一原始图像而言的;后三个概念都是多个图像集合(layer)的概念。因此对access unit可以有下图说明,这里表达的是一幅原始图像在SVC编码中的呈现关系:
这里再举一个例子,使用jsvm依照下图的方式编码:
一共有几个access unit呢?依照上面的理解,显然共有9个,褐色、绿色、蓝色代表的5个是由两个dependency representation构成的access
unit,红色的4个则是由一个dependency representation构成的access
unit。当然这里没有画出与之相关的一些non-VCL NAL unit,实际编码中是有的,比如第一帧时有SPS、PPS、SEI,后续每帧相应的Prefix、SEI等。可以通过jsvm编码过程的信息来验证,如下图:
到这里,SVC中的access unit的概念已经基本弄清楚了。
chinaunix网友2009-12-22 16:31:12
您好! 目前正在学习H.264扩展的SVC 想请教下最新定稿的标准的软件实现是JSVM吗?是的话,是哪个版本? 希望得到您的解答,不胜感激!!!
chinaunix网友2009-12-22 16:31:06
您好! 目前正在学习H.264扩展的SVC 想请教下最新定稿的标准的软件实现是JSVM吗?是的话,是哪个版本? 希望得到您的解答,不胜感激!!!