加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SVC入门知识和JSVM基础实验

(2013-05-18 13:19:25)
分类: 视频安全
文章转载自:罗索实验室 [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 0         # chroma phase x 0 or -1, default = -1
ESSChromaPhaseY 0         # chroma phase y -1 to +1, default = 0
ESSBaseChromaPhaseX 0     # base chroma phase x 0 or -1, default = -1
ESSBaseChromaPhaseY 0     # 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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有