本文主要是介绍H264的句法和语义(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.2 句法元素的分层结构
1.2.1 句法元素与变量
编码器将数据编码为句法元素然后依次发送。在解码器端,通常要将句法元素作求值计算,得出一些中间数据,这些中间数据就是H.264定义的变量。
图1 从句法元素解出变量
pic_width_in_mbs_minus1 是解码器直接从码流中提取的句法元素,这个句法元素表征图像的宽度以宏块为单位。我们看到,为了提高编码效率,H.264将图像实际的宽度减去1后在传送。
PicWidthInMbs = pic_width_in_mbs_minus1 + 1 PicWidthInSamplesL = PicWidthInMbs * 16 PicWidthInSamplesC = PicWidthInMbs * 8 |
以上变量PicWidthInMbs 表示图像以宏块为单位的宽,变量PicWidthInSamplesL 、PicWidthInSamplesC 分别表示图像的亮度、色度分量以像素为单位的宽。H264定义这些变量是因为在后续句法元素的提取算法或图像的重建需要用到他们的值。在H264中,句法元素的名称有小写字母和一系列的下划线组成,而变量名称有大小写字母组成,中间没有下划线。
1.2.2 语法
句法是句法元素的组织结构,二对于一个结构的描述必然少不了对应的语法,语法提供判断、循环等必要的描述方法。 H.264采用一种类C语法。
(1) 判断:
if(条件) { .... } else { ... } |
(2) 循环:
a)
do { ... }while(条件) |
while(条件) { } |
c)
for(初始;条件;求值) { ... } |
1.2.2 描述子
描述子是从比特流提取句法元素的方法,即句法元素的解码算法,每个句法元素都有相对应的描述子。由于H.264编码的最后一步是熵编码,所有这里的描述子大多是熵编码的解码算法。H264定义了如下几种描述子:
ae(v) | 基于上下文自适应的二进制算术熵编码; |
b(8) | 读进连续的8个比特; |
ce(v) | 基于上下文自适应的可变长熵编码; |
f(n) | 读进连续的n个比特; |
i(n)/i(v) | 读进连续的若干比特,并把他们解释为有符号整数; |
me(v) | 映射指数Golomb熵编码; |
se(v) | 有符号指数Golomb熵编码; |
te(v) | 截断指数Golomb熵编码; |
u(n)/u(v) | 读进连续的若干比特,并将它们解释为无符号整数; |
ue(v) | 无符号指数Golomb熵编码。 |
我们看到,描述子都在括号中带有一个参数,这个参数表示需要提取的比特数。
当参数是n时,表明调用这个描述子的时候回指明n的值,也即该句法元素是定长编码。
当参数是v时,对应的句法元素是变成编码,这时有两种情况:
i(v)和u(v)两个描述子的v由以前的句法元素指定,也就是说在前面会有句法元素指定当前句法元素的比特长度;陈列这两个描述子外,其他描述子都是熵编码,他们的解码算术本身能够确定当前句法元素的比特长度。
这篇关于H264的句法和语义(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!