close

文章转载自:罗索实验室 [http://www.rosoo.net/a/201001/8436.html]









 


对SVC的学习已近开展了一段时间,一直没有进行系统记录,而且探索SVC解码的开源项目也需要有更多的知识积累。所以,从现在开始陆续开展有记录的SVC探索,这次行动不再以周为学习单位,而要求更为灵活高效的安排擦略,基本要考察JSVM和SVC各重要方向的实验和论文,为SVC解码开源项目的后续发展做准备。



1. SVC基础知识

 


关于SVC的基本意义,可以参看【1】【2】【3】中的论述。SVC(scalable video coding)的可分级视频编码概念,简而言之,就是把视频序列分成不同的部分并赋予不同的等级,这样的思想已经渊源流传,并非H.264/SVC所独创。2007年由ITU推出的H.264/SVC标准,继承了H.264的高效压缩性,随着网络应用的普及,SVC的灵活码流适应性和对不同终端产品的匹配性,显得尤为重要。





 


SVC对分级的策略是从时间,空间和质量上,对视频序列进行分级编码(如下图)




下面,将详细描述一下SVC怎么在这些方向进行分级的:

(1)时间分级(Temporal
Scalability)


时间分级就是给序列的视频帧分配不同的重要等级,以便于在实际应用中按重要程度显示帧(或在恶劣网络条件下主动放弃低等级的帧)。其实现方式是采用如下图所示的hierarchical
B结构。可以按照具体应用来设计分等级的B帧结构,然后组织起一个个GOP,再架构成整个编码序列。由于H.264/AVC中允许进行参考帧管理,使得时间分级可以直接利用这一特性得以实现。



(2)空间分级(Spatial
Scalability)




空间分级的用于形成不同的图像(帧)分辨率,在实际应用中可以给不同显示屏幕的终端设备提供适配的画面,以达到提高带宽使用率的目的。具体的变现如上面的图,是在不同的分辨率序列层中进行预测,利用去相关性节省码流。在SVC中,除了提供传统的层间intra预测(Inter-layer
intra prediction),还提供层间宏块模式与运动预测(Inter-layer macroblock mode and
motion prediction)和层间残差预测(Inter-layer residual
prediction),这三种模式可以充分利用图像的时间和空间相关性进行分级编码,

  i.
层间intra预测(Inter-layer intra prediction)
 
这种预测方式的宏块信息完全由层间参考帧(一般是低分辨率的重建帧)通过上采样预测得到,在H.262/MPEG-2 Video,
H.263, 
MPEG-4等编码模式中也经常被用到,但是这种方式缺乏消除时间相关性所得到的码率削减。

  ii.
层间宏块模式与运动预测(Inter-layer macroblock mode and motion
prediction)


  宏块使用类似AVC的帧间预测进行编码,其宏块模式采用层间参考帧相应块的模式,其对应的运动矢量也利用层间参考帧相应块的运动信息进行预测编码。这就是所谓的层间运动预测(inter-layer
motion prediction)。

  iii.
层间残差预测(Inter-layer residual prediction)

 
利用残差的层间相关性,可以对于帧间预测的图像继续进行层间预测,以进一步削减码流。


  三种层间预测的概要图示如下:


  


在【1】中提到一个SVC设计的重要特性,每个空间增强层可以在单一的运动补偿环中解码。在对一个目标帧的解码中,其空间参考帧需要重建自己层间预测相关的intra-coded宏块和残差块,并对自己的运动矢量进行解码,运动补偿和对帧间预测的去方块滤波仅在目标帧中进行。

(3)质量分级(Quality
Scalability)


质量分级往往可以被认为是一种特殊(解析度相同)的空间分级编码,因此传统的coarse-grain quality scalable
coding (CGS,粗粒度质量分级编码)很容易被想到,而在实际应用中,还发展了medium-grain quality
scalability (MGS,中等粒度质量分级编码),下面将分别描述他们:

i. CGS

CGS有类似空间分级中层间预测,但是无需有上采样的过程,为了更好的视频质量需要呈现更多的图像纹理,因此,在质量分层的层间预测中,对纹理的提纯通常通过采用更小量化步长的重新量化。为了减少计算复杂性,用于层间intra预测的参考帧deblocking被忽略,而且层间intra预测和层间残差预测将在DCT系数阶段被直接处理。


ii. MGS


由于CGS对码率控制不能灵活处理,一种叫MGS的衍生方式被提出采用,MGS可以灵活的权衡漂移(draft,运动补偿预测循环中的编解码不同步)和层次预测的编码效率。下面的图,蓝色的表示用于基础质量序列,红色表示较好质量的序列,可以根据策略灵活组合他们之间的参考关系。




其中上图(c)(d)就是MGS的灵活方式。以(d)来说,就是对有黑色标注的Key
picture,用基础质量图像做参考
,而对非Key picture使用较好质量的图像做参考,一旦增强层丢包,则可能造成drift,drift被控制在两个Key
picture之间

对于质量分级,SVC还支持两个特性,Partitioning
of transform coefficients和SVC-to-AVC
rewriting,前者提供用slice来分散增强层变换系数的方法,以便于同一增强层数据被分散到几个包中,后者提供了SVC-》AVC的转码便利。



 


至此,SVC的基础入门概念就描述完了,下面将要开始看看怎么使用JSVM来做分层编解码实验。

 

2.
JSVM基础实验
 

 

(1)编码实验


 jsvm的实验可以从编码开始,编译完JSVM代码后,可以运行H264AVCEncoderLibTestStaticd.exe来进行SVC编码,在这里的基础实现中首先关注spatial
scalability的编码,通常可以结合temporary scalability一起进行。用以下命令运行编码:


 H264AVCEncoderLibTestStaticd -pf
encoder.cfg


 这里仅仅使用最简单的参数:


 文件encoder.cfg


******************************************************************

# Scalable H.264/AVC Extension Configuration File

OutputFile             
D:\workspace\264\svctest.264      
# Bitstream file

FrameRate              
25              
# Maximum frame rate [Hz]

FramesToBeEncoded      
32               
# Number of frames (at input frame rate)

GOPSize                
                
# GOP Size (at maximum frame rate)

BaseLayerMode          
                
# Base layer mode (0: AVC w larger DPB,

                                          
  1:AVC compatible, 2:AVC w
subseq SEI)

SearchMode             
                
# Search mode (0:BlockSearch, 4:FastSearch)

SearchRange            
32                
# Search range (Full Pel)

#=================== LAYER
DEFINITION ==================

NumLayers              
                    
# Number of layers

LayerCfg               
layer0.cfg            
# Layer configuration file

LayerCfg               
layer1.cfg            
# Layer configuration file



******************************************************************

 


文件 layer0.cfg


******************************************************************

# Layer Configuration File


#================= INPUT / OUTPUT ====================

SourceWidth    
176                    
# Input  frame width

SourceHeight   
144                    
# Input  frame height

FrameRateIn    
25                     
# Input  frame rate [Hz]

FrameRateOut   
25                     
# Output frame rate [Hz]

InputFile      
D:\workspace\264\mobile_qcif.yuv      
# Input  file

ReconFile      
rec_layer0.yuv         
# Reconstructed file

SymbolMode     
                     
# 0=CAVLC, 1=CABAC


******************************************************************

文件 layer1.cfg

******************************************************************

# Layer Configuration
File


#============================== INPUT / OUTPUT
===============

SourceWidth 
   
352                    
# Input  frame width

SourceHeight   
288                    
# Input  frame height

FrameRateIn    
25                     
# Input  frame rate [Hz]

FrameRateOut   
25                     
# Output frame rate [Hz]

InputFile      
D:\workspace\264\mobile_cif.yuv      
# Input  file

ReconFile      
rec_layer1.yuv         
# Reconstructed file

SymbolMode     
                     
# 0=CAVLC, 1=CABAC

 


InterLayerPred 
                     
# Inter-layer Prediction (0: no, 1: yes, 2:adaptive)


UseESS         
       
# ESS

ESSCropWidth   
352      
# cropping width

ESSCropHeight  
288      
# cropping height

ESSOriginX     
       
# cropping origin X

ESSOriginY     
       
# cropping origin Y

ESSChromaPhaseX
       
# chroma phase x 0 or -1, default = -1

ESSChromaPhaseY
       
# chroma phase y -1 to +1, default = 0

ESSBaseChromaPhaseX
   
# base chroma phase x 0 or -1, default = -1

ESSBaseChromaPhaseY
   
# base chroma phase y -1 to +1, default = 0 0


******************************************************************

本实验将编码双层的SVC文件,分别包含352x288和176x144两个分辨率,需要注意的是这里需要输入的是两个分辨率对应的YUV文件,在开发实际应用中,将是对输入的高分辨率视频按需求进行下采样得到相应低分辨率的输入码流。理解上面的配置文件可以阅读JSVM的“SoftwareManual.doc”。
以下是实验结果


*****************************初始实验结果********************

JSVM 9.15 Encoder

 

profile & level
info:

=====================

DQ=  0:  Main @ Level
1.1

DQ= 16:  Scalable High @ Level 2.1



AU    
0: I    T0 L0
Q0   QP
28   Y 35.0921 
U 36.6779  V
36.4204    
66768 bit

      
0: I    T0 L1
Q0   QP
28   Y 35.4271 
U 37.4696  V
37.2485   
206872 bit

AU    
8: P    T0 L0
Q0   QP
28   Y 34.7829 
U 37.1181  V
36.7810    
26280 bit

      
8: P    T0 L1
Q0   QP
28   Y 35.4518 
U 37.6578  V
37.4747   
101464 bit

AU    
4: B    T1 L0
Q0   QP
31   Y 32.5973 
U 36.1283  V
35.5269     
4264 bit

      
4: B    T1 L1
Q0   QP
31   Y 32.8378 
U 36.9262  V
36.4150    
21624 bit

AU    
2: B    T2 L0
Q0   QP
33   Y 31.7760 
U 35.9120  V
35.3318     
2272 bit

      
2: B    T2 L1
Q0   QP
33   Y 32.1271 
U 36.4808  V
35.9225    
11352 bit

AU    
1: B    T3 L0
Q0   QP
34   Y 31.9559 
U 36.2816  V
35.7872     
1136 bit

      
1: B    T3 L1
Q0   QP
34   Y 31.4860 
U 36.5493  V
36.0923     
5672 bit

AU    
3: B    T3 L0
Q0   QP
34   Y 31.1236 
U 35.5697  V
34.9500     
1136 bit

      
3: B    T3 L1
Q0   QP
34   Y 31.2954 
U 36.0335  V
35.5473     
6056 bit

AU    
6: B    T2 L0
Q0   QP
33   Y 31.6214 
U 35.7877  V
35.3442     
2368 bit

      
6: B    T2 L1
Q0   QP
33   Y 32.0268 
U 36.4989  V
36.0755    
11080 bit

AU    
5: B    T3 L0
Q0   QP
34   Y 31.2529 
U 35.3809  V
34.8735     
1296 bit

      
5: B    T3 L1
Q0   QP
34   Y 31.4222 
U 36.0127  V
35.4764     
6200 bit

AU    
7: B    T3 L0
Q0   QP
34   Y 31.8522 
U 35.9385  V
35.6081     
1064 bit

      
7: B    T3 L1
Q0   QP
34   Y 31.7233 
U 36.4942  V
36.0999     
6768 bit

.

.

.

SUMMARY:

                       
bitrate   
Min-bitr  
Y-PSNR  
U-PSNR   V-PSNR

                      
--------- ---------- -------- -------- --------

   176x144 @ 
3.1250  
115.5750  
115.5750  34.9069 
37.0066  36.5668

   176x144 @ 
6.2500  
132.4000  
132.4000  33.6463 
36.5663  35.8824

   176x144 @
12.5000  
149.7562  
149.7562  32.6071 
36.1343  35.3446

   176x144 @
25.0000  
164.7937  
164.7937  31.9890 
35.8764  35.0516

   352x288 @ 
3.1250  
514.3438  
514.3438  35.4914 
37.5844  37.4000

   352x288 @ 
6.2500  
606.0562  
606.0562  34.0656 
37.1580  36.8032

   352x288 @
12.5000  
706.5750  
706.5750  33.0123 
36.7826  36.3039

   352x288 @
25.0000  
809.1812  
809.1812  32.2313 
36.4422  35.9078


******************************************************************

从实验结果可以看到,以8帧为一个GOP,实验就像上面hierarchical
B结构图(a)那样分了4个时间层次,并且分别列出两种分辨率。从最后的统计结果可以看到,作为GOP的关键帧,无论是空间基础层还是增强层都占可主要的码流量。

(2)解码实验


解码实验将采用H264AVCDecoderLibTestStatic,解码输出自能得到最好的流,也就是基础层结合增强层得到的最高层次的流,本实验中是352x288的25帧序列。解码过程显示如下:


D:\workspace\project\jsvm\bin>H264AVCDecoderLibTestStaticd
D:\workspace\264\svct

est.264 D:\workspace\264\rec_svc

JSVM 9.15 Decoder



---------- new ACCESS UNIT ----------

  NON-VCL: SEI NAL UNIT

  NON-VCL: SEQUENCE PARAMETER SET (ID=0)

  NON-VCL: SUBSET SEQUENCE PARAMETER SET
(ID=0)

  NON-VCL: PICTURE PARAMETER SET (ID=0)

  NON-VCL: PICTURE PARAMETER SET (ID=1)

  NON-VCL: PICTURE PARAMETER SET (ID=2)

  NON-VCL: SEI NAL UNIT

 
Frame    0 ( LId
0, TL 0, QL 0, AVC-I, BId-1, AP 0, QP 28 )

 
Frame    0 ( LId
1, TL 0, QL 0, SVC-I, BId 0, AP 1, QP 28 )

---------- new ACCESS UNIT ----------

  NON-VCL: SEI NAL UNIT

 
Frame    8 ( LId
0, TL 0, QL 0, AVC-P, BId-1, AP 0, QP 28 )

 
Frame    8 ( LId
1, TL 0, QL 0, SVC-P, BId 0, AP 1, QP 28 )

---------- new ACCESS UNIT ----------

  NON-VCL: SEI NAL UNIT

 
Frame    4 ( LId
0, TL 1, QL 0, AVC-B, BId-1, AP 0, QP 31 )

 
Frame    4 ( LId
1, TL 1, QL 0, SVC-B, BId 0, AP 1, QP 31 )

---------- new ACCESS UNIT ----------

  NON-VCL: SEI NAL UNIT

 
Frame    2 ( LId
0, TL 2, QL 0, AVC-B, BId-1, AP 0, QP 33 )

 
Frame    2 ( LId
1, TL 2, QL 0, SVC-B, BId 0, AP 1, QP 33 )

---------- new ACCESS UNIT ----------

  NON-VCL: SEI NAL UNIT

 
Frame    1 ( LId
0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 )

 
Frame    1 ( LId
1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 )

---------- new ACCESS UNIT ----------

  NON-VCL: SEI NAL UNIT

 
Frame    3 ( LId
0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 )

 
Frame    3 ( LId
1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 )

---------- new ACCESS UNIT ----------

  NON-VCL: SEI NAL UNIT

 
Frame    6 ( LId
0, TL 2, QL 0, AVC-B, BId-1, AP 0, QP 33 )

 
Frame    6 ( LId
1, TL 2, QL 0, SVC-B, BId 0, AP 1, QP 33 )

---------- new ACCESS UNIT ----------

  NON-VCL: SEI NAL UNIT

 
Frame    5 ( LId
0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 )

 
Frame    5 ( LId
1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 )

---------- new ACCESS UNIT ----------

  NON-VCL: SEI NAL UNIT

 
Frame    7 ( LId
0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 )

 
Frame    7 ( LId
1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 )

 


从上面的过程中可以看到所有的基础层和增强层原始都被使用到了,那么要想仅仅解码基础层的序列该如何操作呢?就要用到下面介绍的流提取工具BitStreamExtractorStatic

(3)流提取实验


用BitStreamExtractorStatic提取svc文件里的相应子流,在输入的参数不足时,会列出svc文件中可以提取的各层:


D:\workspace\project\jsvm\bin>BitStreamExtractorStaticd
D:\workspace\264\svctest

.264

JSVM 9.15 BitStream Extractor

Contained Layers:

====================


      
Layer  
Resolution  
Framerate   Bitrate
MinBitrate     
DTQ

        
   
176x144      
3.1250    
115.60     
115.60   (0,0,0)

        
   
176x144      
6.2500    
132.40     
132.40   (0,1,0)

        
   
176x144     
12.5000    
149.80     
149.80   (0,2,0)

        
   
176x144     
25.0000    
164.80     
164.80   (0,3,0)

        
   
352x288      
3.1250    
514.30     
514.30   (1,0,0)

        
   
352x288      
6.2500    
606.10     
606.10   (1,1,0)

        
   
352x288     
12.5000    
706.60     
706.60   (1,2,0)

        
   
352x288     
25.0000    
809.20     
809.20   (1,3,0)


       


下面是一个成取176x144的25帧率序列的实验:


D:\workspace\project\jsvm\bin>BitStreamExtractorStaticd
D:\workspace\264\svctest

.264 D:\workspace\264\ext_svc.264 -e 176x144@25:164.8

JSVM 9.15 BitStream Extractor



Contained Layers:

====================


      
Layer  
Resolution  
Framerate   Bitrate
MinBitrate     
DTQ

        
   
176x144      
3.1250    
115.60     
115.60   (0,0,0)

        
   
176x144      
6.2500    
132.40     
132.40   (0,1,0)

        
   
176x144     
12.5000    
149.80     
149.80   (0,2,0)

        
   
176x144     
25.0000    
164.80     
164.80   (0,3,0)

        
   
352x288      
3.1250    
514.30     
514.30   (1,0,0)

        
   
352x288      
6.2500    
606.10     
606.10   (1,1,0)

        
   
352x288     
12.5000    
706.60     
706.60   (1,2,0)

        
   
352x288     
25.0000    
809.20     
809.20   (1,3,0)

WARNING: Bit-rate underflow
for extraction/inclusion point



============Extraction Information======

Extracted spatail layer  : 176x144

Extracted temporal rate  : 25f/s

quality_id statistics for
dependency_id 0

===========================================

quality_id 0 -
total:    16
retained:   
16

Number of input
packets:    
134

Number of output
packets:   
99


可以对输出的ext_svc.264文件用H264AVCDecoderLibTestStatic解码,得到176x144的yuv。


 


至此,本文作为入门介绍已经完成,JSVM还有许多辅助工具可以参照JSVM Software
Manual
,本章的实验结果可以体会到,使用JSVM编码的好速度很慢,还没具体统计,大约每分钟两三帧,而解码在当前一般配置的双核PC系统基本可以达到实时。下一篇文章将进入JSVM的代码分析。


 

【参考文献】

1. HHI,“The Scalable
Video Coding Amendment of the H.264/AVC
Standard


2. Heiko Schwarz, Detlev Marpe,, and Thomas Wiegand, "Overview of
the Scalable Video Coding Extension of the H.264/AVC
Standard"

3. 不屈号的航海长,“video in
future






arrow
arrow
    全站熱搜
    創作者介紹
    創作者 lsx121924 的頭像
    lsx121924

    lsx121924的部落格

    lsx121924 發表在 痞客邦 留言(0) 人氣()