MPEG4 ASP标准语法语义和解码流程详解

  ### Date: 2017/4/2

  ### Author: SoaringLee

  ###Content: MPEG4 ASP标准语法语义和解码流程详解

      MPEG4标准包含三个部分,分别为系统层,视频层和音频层。MPEG4的系统流将描述交互式的视听场景通信系统。MPEG4视频流中包含以下几种数据:视频数据、静态纹理数据、2-D网格数据和人脸活动参数数据等。这些结构化的数据称为对象,对象和它们的属性按分层形式组织。这里所讲的MPEG4视频层指的是MPEG-4的Part 2,现在应用比较广泛是的MPEG-4 Part 10 AVC/H.264编码标准和HEVC/H.265编码标准。

 一、MPEG4 ASP的重要语法语义

    视频流的语法包括乐分层码流结构中的视觉对象序列(VOS)、视觉对象(Visual Object)、视频对象(VO)、视频对象层(VOL)和视频对象平面(VOP)对应的语法。

/*这一层给出 profile&level信息 */
VisualObjectSequence() {
………..
VisualObject()
………..
}
/*
给出视频对象的版本和优先级*/
VisualObject() {
………….
VideoObjectLayer()
………….
}

/* 当前视频流的一些特性*/
VideoObjectLayer() {
………..
do{
if (next_bits() == group_of_vop_start_code)
Group_of_VideoObjectPlane()
VideoObjectPlane()
}while ((next_bits() == group_of_vop_start_code) || (next_bits() == vop_start_code))
………..
/*
如果使用短头格式(可以通过起始码字来判断) */
{
short_video_header = 1
do{
video_plane_with_short_header()
}while(next_bits() == short_video_start_marker)
}
   }
/*
视频图像组头信息,包含时间基准信息,第一个B 帧能不能正确显示等 */
Group_of_VideoObjectPlane() {
………….
}
/*
当前帧的头信息 */
VideoObjectPlane()
{
…………
Motion_shape_texture()
While (nextbits_bytealighed() == resync_marker) {
Video_packet_header()
Motion_shape_texture()
}
…………
}
/*
视频包头信息 */
Video_packet_header()
{
……….
}
Motion_shape_texture()
{

if (data_partitioned) //如果使用数据分割的话,即很多宏块运动信息和纹理数据分开
data_partitioned_motion_shape_texture()
else
combined_motion_shape_texture()
  }
/*
运动信息和纹理数据联合编码,放在一个宏块层中*/
combined_motion_shape_texture()
{
do{
Macroblock()
} while (nextbits_bytealigned() != resync_marker
&& nextbits_bytealigned() != ‘000 0000 0000 0000 0000 0000’)
}
/*
宏块数据,包括运动矢量和纹理数据*/
Macroblock()
{
……..
motion_vector()
for (I=0; I<6; I++)
if (!transparent_block(I))
block()
}


   详细的语法和语义可以参见MPEG4标准。

二、MPEG4视频流解码过程

      视频解码包括几个过程,例如形状-运动-纹理解码、静态纹理解码、网格解码和人脸解码等。解码后,将这些对象发送给合成器,由它集成各种视频对象。

    简化的视频解码过程如下图所示:


       解码器主要由三部分组成:形状解码器、运动解码器和纹理解码器。重建的VOP通过合并解码的形状、运动和纹理信息得到。

1、VOP重建

     VOP的亮度和色度值通过解码的纹理和运动信息作如下恢复:

  • 对帧内宏块,由解码的纹理数据得到的亮度和色度值f[y][x]形成重建VOP的亮度和色度值:d[y][x]=f[y[x]。
  • 对帧间宏块,首先利用解码的运动矢量信息和参考VOP的纹理信息计算出预测值,然后将解码的纹理数据与预测值相加,得到实际的亮度和色度值:d[y][x]=p[y][x]+f[y][x]。
  • 最后,将计算的亮度和色度值限制在一定范围之内。

2、纹理解码过程


  纹理解码过程主要包括可变长解码(VLD)、反扫描、帧内宏块的DC/AC预测、反量化和反变换过程。

  • VLD包括了帧内快的DC系数解码和其他系数的解码 。
  • 反扫描是将VLD之后的一维数据转换为二维数据的过程。该过程有三种扫描方法。

    1. 帧内块ac_pred_flag=0,宏块中的所有块使用锯齿形扫描;
    2. 帧内块ac_pred_flag=1并且DC预测参考水平相邻块,使用垂直交替扫描;
    3. 帧内块ac_pred_flag=1并且DC预测参考垂直相邻块,使用水平交替扫描;
    4. 帧间块和其他形式的块,变换系数的8*8块采用锯齿形扫描。
  • DC/AC预测过程是为了利用相邻块之间的空域相关性,进一步降低熵值。

  • 反量化

系数的二维矩阵QF[v][u]通过反量化产生重建DCT系数,这个过程本质上是乘以量化步长。


MPEG4中有两种反量化方法:

(1)第一种反量化方法:即MPEG反量化方法,在quant_type为1时使用。

帧内DC系数:  F''[0][0] = dc_scaler * QF[0][0]

其他系数:使用两个权矩阵,一个对帧内宏块使用,一个对非帧内宏块使用。


(2)第二种反量化方法:即H.263反量化方法,在quant_type为1时使用。

帧内DC系数:同第一种反量化方法中的帧内DC系数一样。

其他系数:量化参数quantiser_scale是从1到2^quant_precision-1的整数,量化步长是quantiser_scale的两倍。

公式为:

  • 反DCT变换

   一旦DCT系数F[u][v]被恢复,那么逆DCT变换将被用来获得逆变换值f[y][x],这些值要被饱和到一定范围之内。


3、形状解码

    二值形状编码是建立在基于块的表示的基础上的。 主要的编码方法是基于块、基于上下文的二值算术编码和基于块的运动补偿。主要的数据结构是二值alpha块(bab)。bab是表示透明或不透明的二值像素组成的正方形块,它指示了了16*16的区域的形状。事实上,每一个bab和一个纹理宏块是在同一位置。


4、运动补偿解码

运动矢量解码:为了解码运动矢量,要通过变长码解码从码流中抽取差分运动向量,然后加到运动向量预测值上,得到最终的运动向量。

5、P-VOP的向量解码和运动补偿

       一个帧间编码宏块包括一个描述整个宏块的运动向量或者对每一个不透明的8*8块有一个运动向量。

为了解码运动向量,运动向量预测值的水平和垂直分量分别使用从已解码的相邻宏块或块得到候选运动向量(MV1,MV2,MV3)通过中值滤波计算出来。

注意:Mpeg4 ASP 目前不支持形状编码和B-VOP解码。在码流中存在B-VOP时,解码器可以通过拷贝前一帧作为当前B-VOP的重建帧进行处理。

猜你喜欢

转载自blog.csdn.net/soaringlee_fighting/article/details/68922390