本文主要是介绍[转贴]JM阐述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原文转自:http://www.360doc.com/content/09/1109/10/230402_8657319.shtml#
由于DPB中间的参考帧的MV都是以4X4块为单位,现在以8X8块作Direct mode模式,所以必须对子块的MV作合并,
JM采用的东西是如下图的方式:
x o | o x
o o | o o
- - - - -
o o | o o
x o | o x
每8X8块取外角上的4X4块的MV.
算法如下:
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
b8Mode是帧间预测中对8X8块的再次细分,称为亚宏块级模式,划分定在表格b8_mode_table中
const int
其中0是8X8 Direct模式,只对B帧,4,8X8,5,8X4,6,4X8,7,4X4,以上5中模式在宏块级中统称为P8X8模式,这个可以在码流TRACE文件中可以应证。
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
264标准中可以对宏块级语法元素按照重要的等级进行分区,可以分为分区A,B,C,
这个数据分区可以根据数组映射获得264时如何处理分区得.涉及到3个数组.
typedef enum
{
} SE_type;
以上定义了264宏块级编码要用到的语法元素,当然不是所有的宏块编码都有以上元素,根据帧内,帧间,实际编码过程中,等有所不同。
关于以上的元素具体含义,参考JM或标准可以获得,不过有些元素似乎在JM中并没有利用到,比如SE_EOS,不知道最新版如何?
int assignSE2partition_NoDP[SE_MAX_ELEMENTS] =
int assignSE2partition_DP[SE_MAX_ELEMENTS] =
上面元素0,代表DPA,1代表DPB,2代表DPC,可以看出来假如没有定义数据分区得话:所有的语法元素都是DPA,
定义了数据分区,那么帧内系数是分区B,帧间系数是分区C,其他的元素都是分区A.可以看得出来,遭遇信道丢包时,
光有DPB或DPC,没有DPA是无法解出码流的,假如没有DPB,DPC的话,还可以根据DPA的元素获得近似值。
那么JM是如何实现宏块级数据分区管理的呢,这个由Slice里面的datapartition数组管理,第一个成员为DPA,
第二个为DPB,第三个为DPC,可以根据语法元素切换输出到A,B,C中.
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
把编码方式切换到CAVLC,其实在foreman测试序列,个人觉得CABAC,CAVLC编码压缩效率差别不大
SNR更是差不多,但是CAVLC要简单很多。
经过一个晚上的艰苦战斗,初步得出结论,SKIP模式对B,P帧而言,DIRECT模式只对B而言,
个人觉得DIRECT模式,SKIP模式,这种说法有些让人困惑。
下面讲B帧的DIRECT,SKIP模式:
DIRECT,SKIP,模式相同的是,他们的宏块类型都是0,运动向量残差都为0,因为MVD可以通过临块预测方式得到
但是SKIP模式的cbp为0,也就是没有残差传输,它是双向预测,参考帧在LIST0,LIST1中的
序号也是根据临块的参考帧情况获得(注意不一定序号非的是0),所以连参考帧都不用传输.,
SKIP模式有更严格的要求,CBP为0,也就是没有残差系数,达到最大的压缩效率。
再讲P帧的SKIP模式,但前象预测,参考帧为LIST0中序号为0帧,无参考帧编码,CBP为0,无残差系数编码.
她们的分块模式为0,都是16X16.
但是在CAVLC中,SKIP模式,对SKIP宏块没有任何实际编码码流,解码器是如何识别这个宏块存在的,
大家打开TRACE文件,可以看到为一个SKIP或者连续几个SKIP宏块结束后,接着下一个非SKIP宏块,
一开始就有一个语法元素,mb_skip_run有一个值,这个元素采用Exp-Golomb编码,这个值的意思就是前面有多少个SKIP块,这就是264码流
巧妙的解决方案,当遇到这个元素非0的时候,就自动往前面做SKIP宏块填充,.
@34679 mb_skip_run
@34680 mb_type (P_SLICE) ( 4, 1) =
@34683 mvd_l0 (0) =
@34690 mvd_l0 (1) =
@34691 mvd_l0 (0) = -11
@34700 mvd_l0 (1) =
@34707 CBP ( 4, 1) =