视频厂商POLYCOM,VIDYO和RADVISION等都推出H.264 SVC技术。针对H.264 SVC技术作个介绍。html
CISCO和POLYCOM都提供了免版税的H.264 SVC的版本。 其中open264如今最亮眼。服务器
H.264SVC (Scalable Video Coding)是以H.264为基础,在语法和工具集上进行了扩展,支持具备分级特性的码流,H.264SVC是H.264标准的附录G,同时做为H.264新的profile。H.264SVC在2007年10月成为正式标准。网络
编码器产生的码流包含一个或多个能够单独解码的子码流,子码流能够具备不一样的码率,帧率和空间分辨率。ide
分级的类型:工具
时域可分级(Temporal scalability):能够从码流中提出具备不一样帧频的码流。优化
空间可分级(Spatial scalability):能够从码流中提出具备不一样图像尺寸的码流。网站
质量可分级(Quality scalability):能够从码流中提出具备不一样图像质量的码流。编码
图 1 分级类型示意图scala
1. 监控领域:监控视频流通常产生2路,1路质量好的用于存储,1路用于预览。用SVC编码器能够产生2层的分级码流,1个基本层用于预览,1个加强层保证存储的图像质量是较高的。使用手机远程监控预览的状况下,能够产生一个低码率的基本层。视频
2. 视频会议领域:视频会议终端利用SVC编出多分辨率,分层质量,会议的中心点替代传统MCU二次编解码方法改成视频路由分解转发。也可在网络丢包环境下利用时域可分级,抛弃部分时域级实现网络适应性。在云视讯领域SVC也有想像空间。
3. 流媒体IPTV应用:服务器能够根据不一样的网络状况丢弃质量层,保证视频的流畅。
4. 兼容不一样网络环境和终端的应用。
图 2 针对不一样网络和终端的应用
优势:分级码流优势是应用很是灵活,能够根据须要产生不一样的码流或者提取出不一样的码流。使用SVC实现一次分层编码比用AVC编屡次更高效。分层编码有技术优点,新的编码器H.265也使用了分层思想,能够实现灵活的应用,也可提升网络适应性。
缺点:分级码流的解码复杂度增长。基本层是AVC兼容码流,编码效率没有影响。在一样的条件下,分级码流比单层码流的压缩效率要低10%左右,分级层数越多,效率降低越多,如今的JSVM编码器最多支持3个空域分级层。在一样的条件下,分级码流比单层码流的解码计算复杂度高。SVC是2007年10月才作为正式标准,兼容性和对通性远没有AVC好,因此SVC实际应用不是普遍。
图 3 分级编码和单层编码效率对比
注:该图引用自德国HHI网站。
(1)对于时域分级,AVC已经实现,时域分级对编码效率没有影响。
(2)质量分级如图 3(a)所示,质量可分级码流对编码效率影响大约在10%。
(3)空域分级如图 3(b)所示,SVC空域分级编码,不仅是影响总体编码效率,对于基本层(AVC层)的编码效率也有10%的下降,基本层编码效率下降的缘由是基本层帧内预测受限。
语法扩展:
(1) 对NAL(Network Adaptive Layer)头进行了扩展,用于描述码流的分级信息。为了便于描述AVC兼容码流的分级特性,定一个NAL类型为14的前缀NAL,该类型的NAL出如今AVC兼容码流的NAL前面,用于描述AVC基本层码流的分级信息。见图 四、 图 5。
(2) 使用保留的NAL类型1四、20编码加强层码流。
图 4 NAL头扩展
图 5 扩展NAL头内容
技术扩展,分层编码为了提升编码效率,就须要最大程度的利用层间相关性。SVC增长了层间预测的工具集,主要以下:
1. 层间帧内预测(Inter-layer intra prediction)。
2. 层间宏块模式和运动参数预测(Inter-layer macroblock mode and motion prediction)。
3. 层间残差预测(Inter-layer residual prediction)
下面会经过图介绍新增长的层间预测技术。
图 6 时域分级示意图
注:能够经过依次丢弃棕色、绿色、蓝色获得不一样帧频的码流。
图 7 空域分级示意图
图 8 层间预测技术示意图(左)层间帧内预测(中)层间类型预测(右) 层间残差预测
层间帧内预测(Inter-layer intra prediction):图像纹理复杂而且帧间搜索匹配很差的宏块,若是基本层采用的是帧内预测,加强层能够采用层间帧内预测模式提升编码效率。具体作法是把基本层的I块重建上采样获得加强层的预测,加强层只须要传原始图像和层间帧内预测的残差。
层间宏块模式和运动参数预测(Inter-layer macroblock mode and motion prediction):如图 7所示,加强层的宏块类型能够经过基本层预测获取。加强层的运动参数也能够经过基本层运动参数上采样获取。这一点是h.264SVC和其余分级编码技术的区别之一。其它分级编码技术通常经过像素域的上采样进行预测,而对于h.264SVC,认为时域相关性大的区域,利用层间的运动参数预测,在加强层作运动补偿效率更高。对于层间运动参数的预测,语法支持的颗粒大小能够是一个宏块,最小是一个8x8块。
层间残差预测(Inter-layer residual prediction):如图 7所示,对于帧间编码的宏块,加强层的图像残差和基本层的图像残差具备相关性,能够利用基本层的残差进行上采样减小加强层编码的图像残差。对于空间分辨率发生变化的层间残差预测,发生在残差像素域,计算量较大;对于空间分辨率不发生变化的层间残差预测(质量分级),发生在变换系数或变换电平域,计算量较小。
经过技术上来保证只须要一次运动补偿。由于层间预测没有利用帧间块的重建,因此参考层(或者称为基本层)不须要解码重建,层间预测使用的是运动矢量预测,对于解码重建只须要最后作一次运动补偿便可。
这样作的好处:(1)节省计算量,下降解码复杂度;(2)减小对解码器对内存的需求。
Dependency_id:D层标记,也是咱们常说的空域分级层标记,从0到7,最多有8个D层。基本层的值为0。CGS质量分级是特殊的空域分级。
Quality_id:MGS质量分级层标记。从0到15。
Temporal_id:时域分级标记,从0到7,最多有8个时域分级。
use_ref_base_pic_flag:MGS使用的语法。一般,都是使用当前层的重建图像做为参考图像,对于关键帧,则使用参考层的重建图像做为参考图像。注意区别,不是使用当前图像的参考层重建做为参考。
discardable_flag:当前图像没有被做为层间参考层,则该标记置1。在码流提取的时候,若是该层不是目标层,则会被丢弃。
NAL头:no_inter_layer_pred_flag;整个slice是否启用层间预测的开关
Sliceheader:每一个宏块自适应层间预测模式仍是使用默认层间预测模式
adaptive_base_mode_flag
default_base_mode_flag
adaptive_motion_prediction_flag
default_motion_prediction_flag
adaptive_residual_prediction_flag
default_residual_prediction_flag
宏块的层间预测模式标记:
base_mode_flag :宏块是否使用层间类型和运动参数预测,直接使用层间预测的运动参数,码流中再也不传。
motion_prediction_flag_l0[mb_partSize]:宏块分割是否启用运动矢量层间预测,这种模式还会传层间预测运动矢量和实际运动矢量的残差。
residual_prediction_flag:宏块是否启用残差预测。
若是base_mode_flag == 1,就须要进行层间类型预测。若是16个块对应的参考层块都是I块,则当前宏块类型是IBL;不然就是INTER_BL,运动矢量和参考索引都是从参考层预测获得,宏块类型咱们如今默认是标记为P8x8,子块分割类型能够根据6.9节的计算获得。
对于base_mode_flag等于1的宏块或者运动矢量使用层间预测的宏块,在层间分辨率发生变换的状况下,存在运动矢量上采样。下面按计算过程的步骤说明原理。
第一步:计算当前层的每一个4x4块在参考层对应位置,若是在参考层的对应位置是I块(包含IBL),则返回-1,不然返回参考层对应4x4块的坐标。
第二步:若是当前层宏块的16个4x4块在参考层对应位置都是I块,则当前宏块是IBL类型,不进行后续计算,不然,针对4x4块和8x8块出现参考是I块的状况,用邻近4x4块的参考层对应块取代,这样就能够防止计算参考索引上采样出现-1的状况。
第三步:按照当前层8x8块为最小处理单元获取运动矢量上采样。获取每一个4x4块的运动矢量和参考索引以后,从4个参考索引中取最小非负数为该8x8块的参考索引。同时根据4个运动矢量的相近状况,对4个运动矢量进行后处理。
(1) 若是4个运动矢量的差的绝对值小于等于1,则对4个运动矢量取均值,获得最终的运动矢量。
(2) 若是在4x4块排列的水平方向上,两组2个4x4块的运动矢量差的绝对值小于等于1,则分别对2个4x4块的运动矢量取均值,8x8块的分割模式为8x4。
(3) 若是在4x4块排列的垂直方向,两组2个4x4块的运动矢量差的绝对值小于等于1,则分别对2个4x4块的运动矢量取均值,8x8块的分割模式为4x8。
注意:如图 4所示,在空间分辨率变化为1:2的状况下,参考层的1个4x4块对应当前层的一个8x8块,所以运动矢量的后处理不存在。只有在限制空间分辨率为0的状况下(好比空间分辨率为1:1.5),当前层的每一个8x8块覆盖参考层的多个4x4块,才存在运动矢量后处理。
图 9 运动信息层间预测示意图
在层间分辨率发生变化的状况下,同时当前块类型是帧间块,而且residual_prediction_flag==1。这些状况都知足的状况下存在残差预测。
图 10 层间残差预测计算原理
(1)当前层的像素位置假设为(x,y),根据6.5节像素层间映射计算公式,获得参考层对应的像素位置(xRef,yRef)。
(2)若是(xRef,yRef)点和(xRef+1,yRef)点属于同一个变换块,根据双线性获得一个中间结果,如上图中黑点。同理,(xRef,yRef+1)和(xRef+1,yRef+1)点也计算获得一个中间结果。
(3)若是点(xRef,yRef)和点(xRef,yRef+1)属于同一个变换块,则对中间结果采起双线性计算获得层间像素预测的最终结果,不然,y相位判断取哪个中间结果做为最终值。
使用条件:当前层宏块类型为IBL类型,即当前层宏块的16个4x4块在参考层中对应位置都是I块,而且当前宏base_mode_flag==1。
图 11 像素上采样示意图(亮度)
(1)首先对参考层中的I宏块和IBL宏块重建,在周围P块中作8像素扩展。
(2)计算当前宏块(0,0)位置的点在参考层中像素对应位置,如图中红色点(xRef,yRef)。
(3)首先计算一组垂直4抽头滤波的中间点。计算公式以下。
(4)在步骤(3)的基础上,进行水平4抽头滤波,得到最终的上采样结果,计算公式以下。
注:计算过程注意优化,同时要注意代码的稳定性及字长。
举例说明,两层编码,基本层为AVC编码,加强层采用层间预测自适应编码。
(1) 基本层采用AVC的编码方式,限制条件就是帧内块预测受限。
(2) 加强层的编码能够利用基本层的运动矢量上采样预测,残差上采样预测,I块的像素上采样预测,宏块类型预测。同时加强层的宏块也能够不采用层间预测,编码方式相似AVC。
以2层的CGS(coarse-grain scalability)为例说明质量分级编码的原理,不启用SVC-->AVC重现选项。基本层采用AVC的编码方式,限制条件就是帧内块预测受限。由于分辨率不变,能够更好的利用层间预测信息。IBL类型宏块:层间I块,利用基本层的I块重建做为预测,对原始图像减去层间预测的残差进行编码。利用运动矢量预测的P块:便可以直接利用基本层的运动矢量做为当前层的运动矢量,也能够利用基本层的运动矢量做为预测运动矢量,在码流中传运动矢量的偏移。利用变换系数域预测的P块:加强层的残差进行变换以后获得变换系数,减去基本层的变换系数反量化以后的值,对获得的变化系数残差进行量化,而后进行熵编码传输。
使用提案“V-035”中的PPT中的图说明原理。
时域分级经过层次B帧或者层次P帧来实现,实际中通常使用层次B帧。经过语法元素中的Temporal_id标记不一样的时域层,能够很方便的提取。
.
1. https://en.wikipedia.org/wiki/Scalable_Video_Coding
2. http://ip.hhi.de/imagecom_G1/assets/pdfs/Overview_SVC_IEEE07.pdf
3. JVT提案“V-035” http://wftp3.itu.int/av-arch/jvt-site/2007_01_Marrakech/JVT-V035
4. http://www.polycom.com/company/news/press-releases/2012/20121004.html