Chinaunix首页 | 论坛 | 博客
  • 博客访问: 188568
  • 博文数量: 20
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 290
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-16 13:08
文章分类

全部博文(20)

文章存档

2010年(1)

2009年(10)

2008年(9)

我的朋友

分类:

2009-09-28 13:25:31


H264 Scalable Video Coding 学习报告


-- 由于H264 SVC项目被暂停,本人对SVC的了解也是非常有限,仅限这篇学习报告,谢谢!

 

文件:h264 SVC study.pdf
大小:1606KB
下载:下载

  

 

1. Scalable Video Coding – 可分级视频编码

 

- 为什么需要可分级视频编码技术(SVC

 

  实际应用中,存在不同的网络和不同的用户终端,各种情况下对视频质量的需求不一样。例如,在利用网络传输视频信息时,由于网络带宽限制了数据传输,因此要求当网络带宽较小的时候,只传输基本的视频信号,并根据实际网络的状况决定是否传输增强的视频信息,使视频的质量得到加强。

 

  在这样的背景下,利用可分级视频编码技术实现一次性编码产生具有不同帧率、分辨率的视频压缩码流,然后根据不同网络带宽、不同的显示屏幕和终端解码能力选择需要传输的视频信息量,以此实现视频质量的自适应调整。

 

 

- 可分级视频编码(SVC)是什么

 

  为了能够实现从单一码流中解码得到不同帧率(时间可分级)、分辨率(空间可分级)和图像质量(SNR可分级)的视频数据的编码技术。

  H.264 SVCH.264 AVC视频编解码器标准为基础,利用了AVC编解码器的各种高效算法工具,在编码产生的编码视频时间上(帧率)、空间上(分辨率)可扩展,并且是在视频质量方面可扩展的,可产生不同帧速率、分辨率或质量等级的解码视频。

 

2. H264 Scalable Video Coding Extension

 

H.264 SVCH.264可分级编码)作为H.264标准的一个扩展最初由JVT2004年开始制定,并于20077月获得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独有的层间预测编码工具。

 

ELEnhancement 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(层间预测)实现时间可分级,使每一层具有不同的图像分辨率。

 

由于低层是由高层通过下采样得到的,因此在相同的时域分辨率情况下,每一个高层帧都有与之相对应的低层帧,两者之间存在着显而易见的相关性,我们称之为层间冗余。显然,为了获得更高的压缩效率,有必要通过各种层间预测技术来消除层间冗余,这也是空域可伸缩性技术的关键所在。设计层间预测算法的目的是尽可能利用基本层的信息提高增强层的编码效率。

 

几个相关语法元素

  • base mode flag:指明一种宏块类型。1表示当前宏块(enhancement layer中)只编码残差信息,帧内编码模式或运动相关信息都有相应的参考层中块推导出来。EL中的宏块无论inter还是intra都可以base mode flag=1
  • motion prediction flag: 作用于宏块中每个partitionreference list,指明reference indexmotion vector prediction是否由reference layer中相应的块推导出来。
  • residual prediction flag:只要当前宏块是inter,无论base mode flag是否为1,都可以采用下述第三种inter-layer predictioninter-layer residual prediction

 

H264 SVC提供三种层间预测(inter-layer prediction):

-          inter-layer intra prediction

 

base mode flag1,且相应的reference layer中的8x8块是帧内编码,参考层中的4x4块(4个)被重构,经过去块滤波操作后上采样得到预测信号。亮度上采样采用的是4-tapFIR滤波器,色度上采样采用的是bilinear滤波器。而后,ehencement layer传送残差系数,经反变换后加到预测信号上。
upsampling之前,需要对reference layer的重构信息进行去块滤波(deblocking)。
为了保证sigle loop的解码,需要避免在reference layer进行motion compensation,即Constrained Inter-layer Intra-prediction

 

- inter-layer motion prediction

 

base mode flag1,且相应的参考层中的8x8块是帧间编码,Block partition信息、reference indexmotion vectorsreference layer中相应的8x8块推导出来。此时block partition信息由reference layer中相应的8x8块的partition信息上采样得到,同时得到与partition相应的reference indexmotion vectors(需要先被scale)。
base mode flag
0,还可以有一种对motioninterlayer prediction,开关为motion prediction flag
        - motion prediction flag
1,则与此reference list相关的reference indexmotion vector predicitonreference layer中相应的块推导出来。这里与base mode flag1时有点区别,这里只是MVPreference 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大小的畫面,如果要增加對畫面大小CIFQCIF的支援的話,在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的参考,即PB的参考, 而不是inter-layer prediction的参考。

1. 认识MGS结构

理解MGS结构,先要理解下面这个图(fig.8 in Overview of the Scalable Video Coding Extension of the H.264/AVC Standard),该图描述了在SNR分级时,inter prediction可能的几种选择:

(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 pictureSVC标准使用的方法,实际是一种a)(b)的折中方案。key picture就是temporal id0access 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 pictureA 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)

哪些picturereference base picture?很明显按照reference base picture的定义I0P0B0都是,I1P1B1不是(QId不为0),b也不是(不是参考帧)。也很容易理解,我们最后需要输出的图像是SNR BL + EL的最“清楚”图像,所以I0P0B0并不会被输出。但是它们有可能会被用作参考。什么时候用作参考?这时候就和MGS key picture有关系了。结合上面的图(d),可以看到解码P0的时候I0是要被当作参考帧的。这就是reference base picture的含义。

 

3. 语法元素store_ref_base_pic_flag

更进一步说,key picturereference 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=0NALU中。那么回到上面的例子,显然对于I0P0store_ref_base_pic_flag应该为1B0store_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相同的naluuse_ref_base_pic_flag都得是相同的。再拿一个例子来说明

QId = 1: I1 B1 P1 ...

QId = 0: I0 B0 P0 ... (example-2)

假设解码端现在BLEL都能收到。当解码P0时,P0有两个参考帧可以选用,1) I0,即reference base picture2) I0+I1,即decoded picture。如果我们使用的是MGS,那么P0显然是key picture,它必须使用I0做参考。因此此时P0use_ref_base_pic_flag就应该是1。遵循标准,P1use_ref_base_pic_flag也是1

现在来看解码B0,根据MGS的结构,B0应该采用I0+I1P0+P1decoded pictures来当作参考,因此B0use_ref_base_pic_flag应该是0。同样道理,B1use_ref_base_pic_flag也是0。下面来说明一下use_ref_base_pic_flag等于0,即decoded pictures来当作参考的具体含义。在上面的例子examp1e-2里我们假设了BLEL都在解码端收到了,那如果EL丢掉了呢?再看此时的B0解码,它会使用仅有的I0P0来当作参考帧来解码。这就是“decoded pictures”的含义。显然这样解码的B0B1会有错误,但是这里的drift效应不会扩散到P0之后

这里有个额外的话题,我们可以发现对于I picture,它们的use_ref_base_pic_flag是没有意义的,因为它们不需要任何参考帧。那为什么这个语法元素还要出现在I NALU中增加1 bit的冗余呢?原因我想可能是这样的:前面已经说过use_ref_base_pic_flagnal_unit_header_svc_extenstion的一个语法元素。在SVC码流在传输的过程中网络中会有一些adapting节点,用来做bitstream extracting。它们会parse每个naluheader,然后判断哪些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 LayerSpatial LayerSNR Layer。而當發生網路變化或者是在不同用戶播放裝置的環境中,Extractor則去抽取對應的Layer來因應各種可能的變化,例如,偵測到目前網路頻寬是256K,且用戶端播放裝置要CIF大小的畫面,且畫面更新率為15的時候,則Extractor只要讀取Bitstream中每個NAL Unit的標頭,然後挑出屬於CIF大小的畫面,且畫面更新率為15Layer出來,然後看是否仍然低於要求的頻寬要求,如果是則加入更多的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观察没有发现)。这篇笔记的目的就是总结对SVCaccess uni概念的理解。

System and Transport Interface of SVCYe-Kui Wang,这篇paper中有这样一段说明:In this paper seven logical entities are described that may consist of more than one NAL unit:

1.  layer representation:对于一幅图像,具有相同dependency_idquality_id的所有coded slices的组合。

2.  dependency representation:对于一幅图像,具有相同dependency_id的所有coded slices组合。

3.   access unit:对于一幅图像,所有的dependency representation再加上相关的non-VCL NAL units

4.  scalable layer:具有相同dependency_idquality_idtemporal_id的所有layer representation的组合。

5.   dependency layer:具有相同dependency_id scalable layer组合。

6.   base layerdependency_idquality_id都为0layer representation

7.   coded video sequence:不多说

首先需要理解,前三个概念(representationaccess unit)都是针对某一原始图像而言的;后三个概念都是多个图像集合(layer)的概念。因此对access unit可以有下图说明,这里表达的是一幅原始图像在SVC编码中的呈现关系:

这里再举一个例子,使用jsvm依照下图的方式编码:

一共有几个access unit呢?依照上面的理解,显然共有9个,褐色、绿色、蓝色代表的5个是由两个dependency representation构成的access unit,红色的4个则是由一个dependency representation构成的access unit。当然这里没有画出与之相关的一些non-VCL NAL unit,实际编码中是有的,比如第一帧时有SPSPPSSEI,后续每帧相应的PrefixSEI等。可以通过jsvm编码过程的信息来验证,如下图:

到这里,SVC中的access unit的概念已经基本弄清楚了。

 

 


阅读(19215) | 评论(4) | 转发(0) |
0

上一篇:最近状况

下一篇:H264 JM8.6 注释版代码

给主人留下些什么吧!~~

chinaunix网友2010-07-02 15:19:38

写的不错

shanewu2009-12-22 17:55:28

抱歉!没有对JSVM研究过,没法帮你解答!

chinaunix网友2009-12-22 16:31:12

您好! 目前正在学习H.264扩展的SVC 想请教下最新定稿的标准的软件实现是JSVM吗?是的话,是哪个版本? 希望得到您的解答,不胜感激!!!

chinaunix网友2009-12-22 16:31:06

您好! 目前正在学习H.264扩展的SVC 想请教下最新定稿的标准的软件实现是JSVM吗?是的话,是哪个版本? 希望得到您的解答,不胜感激!!!