SVC入门知识和JSVM基础实验

文章转载自:罗索实验室 [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入门知识和JSVM基础实验_第1张图片

 
SVC对分级的策略是从时间,空间和质量上,对视频序列进行分级编码(如下图)
SVC入门知识和JSVM基础实验_第2张图片
下面,将详细描述一下SVC怎么在这些方向进行分级的:
(1)时间分级(Temporal Scalability)
时间分级就是给序列的视频帧分配不同的重要等级,以便于在实际应用中按重要程度显示帧(或在恶劣网络条件下主动放弃低等级的帧)。其实现方式是采用如下图所示的hierarchical B结构。可以按照具体应用来设计分等级的B帧结构,然后组织起一个个GOP,再架构成整个编码序列。由于H.264/AVC中允许进行参考帧管理,使得时间分级可以直接利用这一特性得以实现。
SVC入门知识和JSVM基础实验_第3张图片
(2)空间分级(Spatial Scalability)
SVC入门知识和JSVM基础实验_第4张图片
空间分级的用于形成不同的图像(帧)分辨率,在实际应用中可以给不同显示屏幕的终端设备提供适配的画面,以达到提高带宽使用率的目的。具体的变现如上面的图,是在不同的分辨率序列层中进行预测,利用去相关性节省码流。在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)
   利用残差的层间相关性,可以对于帧间预测的图像继续进行层间预测,以进一步削减码流。
    三种层间预测的概要图示如下:
    SVC入门知识和JSVM基础实验_第5张图片
在【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,运动补偿预测循环中的编解码不同步)和层次预测的编码效率。下面的图,蓝色的表示用于基础质量序列,红色表示较好质量的序列,可以根据策略灵活组合他们之间的参考关系。
SVC入门知识和JSVM基础实验_第6张图片
其中上图(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代码后,可以运行H264AVCEncoderLibTestSta ticd.exe来进行SVC编码,在这里的基础实现中首先关注spatial scalability的编码,通常可以结合temporary scalability一起进行。用以下命令运行编码:
  H264AVCEncoderLibTestSta ticd -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                                 8                                   # GOP Size (at maximum frame rate)
BaseLayerMode                     2                                   # Base layer mode (0: AVC w larger DPB,
                                                                                     #     1:AVC compatible, 2:AVC w subseq SEI)
SearchMode                           4                                   # Search mode (0:BlockSearch, 4:FastSearch)
SearchRange                         32                                 # Search range (Full Pel)
#=================== LAYER DEFINITION ==================
NumLayers                             2                                           # 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                                             # 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                                             # 0=CAVLC, 1=CABAC
 
InterLayerPred   2                                             # Inter-layer Prediction (0: no, 1: yes, 2:adaptive)
UseESS                   1                 # ESS
ESSCropWidth       352             # cropping width
ESSCropHeight     288             # cropping height
ESSOriginX           0                 # cropping origin X
ESSOriginY           0                 # 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)解码实验
解码实验将采用H264AVCDecoderLibTestSta tic,解码输出自能得到最好的流,也就是基础层结合增强层得到的最高层次的流,本实验中是352x288的25帧序列。解码过程显示如下:
D:\workspace\project\jsvm\bin>H264AVCDecoderLibTestSta ticd 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>BitStreamExtractorStatic d D:\workspace\264\svctest
.264
JSVM 9.15 BitStream Extractor
Contained Layers:
====================
             Layer     Resolution     Framerate     Bitrate MinBitrate           DTQ
                 0         176x144             3.1250         115.60           115.60     (0,0,0)
                 1         176x144             6.2500         132.40           132.40     (0,1,0)
                 2         176x144           12.5000         149.80           149.80     (0,2,0)
                 3         176x144           25.0000         164.80           164.80     (0,3,0)
                 4         352x288             3.1250         514.30           514.30     (1,0,0)
                 5         352x288             6.2500         606.10           606.10     (1,1,0)
                 6         352x288           12.5000         706.60           706.60     (1,2,0)
                 7         352x288           25.0000         809.20           809.20     (1,3,0)
             
下面是一个成取176x144的25帧率序列的实验:
D:\workspace\project\jsvm\bin>BitStreamExtractorStatic d 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
                 0         176x144             3.1250         115.60           115.60     (0,0,0)
                 1         176x144             6.2500         132.40           132.40     (0,1,0)
                 2         176x144           12.5000         149.80           149.80     (0,2,0)
                 3         176x144           25.0000         164.80           164.80     (0,3,0)
                 4         352x288             3.1250         514.30           514.30     (1,0,0)
                 5         352x288             6.2500         606.10           606.10     (1,1,0)
                 6         352x288           12.5000         706.60           706.60     (1,2,0)
                 7         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文件用H264AVCDecoderLibTestSta tic解码,得到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

你可能感兴趣的:(SVC入门知识和JSVM基础实验)