MPEG4标准中的Advanced Simple Profile(ASP)完整的说明-04-2章

来源:互联网 发布:legion软件下载 编辑:程序博客网 时间:2024/03/29 20:33
转载:

73 页共 99
Inverse
Quantisation
Arithmetic
Saturation
QF[v][u] F''[v][u] F'[v][u] F[v][u]
quant_scale_code
W[w][v][u]
Mismatch
Control
47 逆量化的过程
4.3.4.1 第一种反量化方法
第一种反量化方法,也就是MPEG 反量化方法,在quant_type 1时被使用。短头格式
不使用这种反量化方法。
A) 帧内DC 系数
在帧内块中,F’’[0][0]通过将QF[0][0]乘以一个常量得到,可以用以下公式表示:
F’’[0][0] = dc_scaler* QF[0][0]
dc_scaler 在表48中定义,亮度块和色度块是分开定义的。
B) 其他系数
除了帧内块DC 系数的所有其它系数的反量化在这一部分讲述。这里使用两个权矩阵:
一个对帧内宏块使用,另一个对非帧内宏块使用。每一个矩阵都有缺省值,它们可以由用
户定义的矩阵代替。缺省的帧内宏块矩阵见前面的语义部分,
我们用W[w][v][u]表示权矩阵,这里w 取值为0 或者1,指示使用何种矩阵。W[0][v][u]
对帧内宏块使用;而W[1][v][u]对非帧内宏块使用。亮度和色度的quantiser_scale
vop_quant,dquant,dbquantquant_scale决定。它们的关系可以总结如下:
对非短头格式, quant 值初始化为VOP头中给出的vop_quant。对I-VOP或者P-VOP
如果当前宏块存在dquant,则当前宏块的quantiser_scale 等于当前的quant 值加上
dquant 表示的差分值,然后将quant值更新为当前宏块的量化值。对B-VOP,同样quant
的初始值为vop_quant,如果当前宏块存在dbquant,则当前宏块的quantiser_scale
等于当前的quant值加上dbquant表示的差分值,然后quant值更新为当前宏块的量化值。
如果遇到resync_marker,则将video_packet_header 头中的quant_scale 值赋给quant
对短头格式,有类似的结论,不再赘述。
下面的算式给出了从QF[v][u]建立F’’[v][u]的算术方法:
F' ' [v][u]=
((2 ?QF[v][u] +k ) ?W[w][v][u] ?quantiser _ scale) / 16, if QF[v][u] ? 0
where :
k = 0 intra blocks
Sign(QF[v][u]) non - intra blocks
ìí?
0, if QF[v][u] = 0 ì
í
?
4.3.4.2 第二种反量化方法
这一部分讲述了第二种反量化方法,也就是263 反量化方法,它在Quant_type 0
PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
74 页共 99
使用。短头格式只能使用这种量化方法。
A) 帧内DC 系数反量化。短头格式时,dc_scaler 取固定值8;其它情况下,
dc_scaler 的定义见表48,亮度块和色度块的dc_scaler 时分别定义的。
F’’[0][0] = dc_scaler* QF[0][0]
B) 其他系数的反量化。量化参数quantiser_scale 是从1 31 的整数,量化步
长是quantiser_scale 的两倍。
?? =
=
? + ? ?
? + ? - ?
ì
í ?
? ?
F v u
QF v u
QF v u quantiser scale QF v u quantiser scale
QF v u quantiser scale QF v u quantiser scale
[ ][ ]
, [ ][ ] ,
( [ ][ ] ) _ , [ ][ ] , _
( [ ][ ] ) _ , [ ][ ] , _ .
0 0
2 1 0
2 1 1 0
if
if is odd,
if is even
F"[v][u]的符号由QF[v][u]决定,即
F"[v][u]: F"[v][u]= Sign(QF[v][u])?|F"[v][u]|
4.3.4.3 饱和
逆量化得到的系数要饱和到[-2048,2047]之间,即
??

ì
- < -
- ? ? -
- > -
=
+ +
+ +
+ +
bits_per_pixel 3 bits_per_pixel 3
bits_per_pixel 3 bits_per_pixel 3
bits_per_pixel 3 bits_per_pixel 3
2 ' '[ ][ ] 2
''[ ][ ] 2 ''[ ][ ] 2 1
2 1 ' '[ ][ ] 2 1
'[ ][ ]
F v u
F v u F v u
F v u
F v u
4.3.4.4 错误匹配控制
错误匹配控制只对第一种逆量化方法适用。错误匹配可以使用和下面等价的任意过程,
首先对块中饱和的重建系数F’[v][u]求和,然后考察这个值是奇数还是偶数。如果它是偶数,
那么系数F[7][7]将要被修正。
sum = F' [v][u]
u =0
u <8 ?
v=0
v <8?
F[v][u] = F' [v][u] for all u, v except u = v = 7
F[7][7] =
F' [7][7] if sum is odd
F' [7][7] -1 if F' [7][7] is odd
F' [7][7] +1 if F'[7][7] is even
ì 
í 

ü 


if sum is even
ì 
í 

??  
4.3.4.5 逆量化方法总结
总的来说,第一种逆量化方法可以用和下面的过程等价的任意方法:
PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
75 页共 99
for (v=0; v<8;v++) {
for (u=0; u<8;u++) {
if (QF[v][u] == 0)
F’’[v][u] = 0;
else if ( (u==0) && (v==0) && (macroblock_intra) ) {
F''[v][u] = dc_scaler * QF[v][u];
} else {
if ( macroblock_intra ) {
F''[v][u] = ( QF[v][u] * W[0][v][u] * quantiser_scale * 2 ) / 16;
} else {
F''[v][u] = ( ( ( QF[v][u] * 2 ) + Sign(QF[v][u]) ) * W[1][v][u]
* quantiser_scale ) / 16;
}
}
}
}
sum = 0;
for (v=0; v<8;v++) {
for (u=0; u<8;u++) {
if ( F’'[v][u] > 2 bits_per_pixel + 3 - 1 ) {
F’[v][u] = 2 bits_per_pixel + 3 - 1;
} else {
if ( F’'[v][u] < -2 bits_per_pixel + 3 ) {
F’[v][u] = -2 bits_per_pixel + 3 ;
} else {
F’[v][u] = F'‘[v][u];
}
}
sum = sum + F’[v][u];
F[v][u] = F’[v][u];
}
}
if ((sum & 1) == 0) {
if ((F[7][7] & 1) != 0) {
F[7][7] = F'[7][7] - 1;
} else {
F[7][7] = F'[7][7] + 1;
}
}
PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
76 页共 99
4.3.5 DCT变换
一旦DCT系数F[u][v]被恢复,那么就可以用逆DCT变换来获得逆变换值f[y][x],这些
只要被饱和到-256≤f[y][x]≤255
对短头格式,由于不存在隔行模式,因此全部用帧DCT变换,就是一般的情况。
非短头格式时,如果使用隔行模式,并且dct_type 等于1,此时使用场DCT 变换,场
DCT变换的算法同帧DCT变换完全一样,只是输出的时候需要将按场组织的宏块转换为按
帧组织的宏块。
下面简单介绍一下DCT变换和逆变换的过程。
矩阵大小为NxN的二维DCT变换为:
F(u, v) = 2
N
C(u)C(v)
x = 0
N -1 ? f (x,y)cos
(2x +1)up
y =0 2N
N-1 ? cos
(2y +1)vp
2N
u, v, x, y = 0, 1, 2, ?N-1
其中x, y 是原始域中的空间坐标
u, v 是变换域中的空间坐标
C(u), C(v) =
1
2
for u,v = 0
1 otherwise
ì 
í 

DCT变换定义为:
f (x, y) = 2
N u =0
N -1 ? C(u)C(v)F(u,v)cos
(2x +1)up
v = 0 2N
N -1 ? cos
(2y +1)vp
2N
如果每个像素为n 比特,则DCT 变换的输入为n+1 比特,逆DCT 变换的输出为n+1
比特。DCT变换后的DCT系数的长度为n+4 比特,动态范围为[-2n+3:+2n+3-1]。对我们来说
这里的n等于8
NxN 的逆DCT变换的实现必须符合IEEE 的关于8x8的逆DCT变换的实现的标准,即
IEEE Standard Specification for the Implementations of 8 by 8 Inverse Discrete Cosine Transform,
Std 1180-1990, December 6, 1990,不过有下列修改:
1) IEEE 规范中的3.2 小节的item(1)中最后一句话被替换为:<<Data sets of 1
000 000 (one million) blocks each should be generated for (L=256, H=255),
(L=H=5) and (L=384, H=383). >>
2) IEEE 规范中的3.3 小节的text被替换为:<<For any pixel location, the peak
error shall not exceed 2 in magnitude. There is no other accuracy requirement
for this test.>>
3) Let F be the set of 4096 blocks Bi[y][x] (i=0..4095) defined as follows :
a) Bi[0][0] = i - 2048
b) Bi[7][7] = 1 if Bi[0][0] is even, Bi[7][7] = 0 if Bi[0][0] is odd
c) All other coefficients Bi[y][x] other than Bi[0][0] and Bi[7][7] are
equal to 0
For each block Bi[y][x] that belongs to set F defined above, an IDCT that claims
to be compliant shall output a block f[y][x] that as a peak error of 1 or less
compared to the reference saturated mathematical integer-number IDCT fíí(x,y).
In other words, | f[y][x] - fíí(x,y)| shall be <= 1 for all x and y.
PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
77 页共 99
NOTE 1 lause 2.3 Std 1180-1990 “Considerations of Specifying IDCT Mismatch Errors”
requires the specification of periodic intra-picture coding in order to control the accumulation of
mismatch errors. Every macroblock is required to be refreshed before it is coded 132 times as
predictive macroblocks. Macroblocks in B-pictures (and skipped macroblocks in P-pictures)
are excluded from the counting because they do not lead to the accumulation of mismatch
errors. This requirement is the same as indicated in 1180-1990 for visual telephony according
to ITU-T Recommendation H.261.
NOTE 2 Whilst the IEEE IDCT standard mentioned above is a necessary condition for the
satisfactory implementation of the IDCT function it should be understood that this is not
sufficient. In particular attention is drawn to the following sentence from subclause 5.4: “Where
arithmetic precision is not specified, such as the calculation of the IDCT, the precision shall be
sufficient so that significant errors do not occur in the final integer values.”
DCT变换的过程这里不再详述,需要实现这个的可以去参考这个标准。
在实际应用中一般通过两次1-D IDCT变换来完成2-D IDCT变换,这种方法通常被称
为行-列法。
一般来说,后者在结构上的对称性更好,并且可以重复使用硬件资源,所以在我们的芯
片设计选用一种行-列法来进行IDCT单元的结构研究。
二维IDCT可以分解成二次一维IDCT运算,如以下公式。
在结构上,上两式所定义的运算使用了相同的运算”(如以下公式所示), 它们具有
相似性。因此利用三角函数的各种关系,可以得到的快速算法。
其中,
N
m
m 2
(2 1)p
q
+
=
为了便于理解,可将快速算法表示成蝶形图,如下图。
PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
78 页共 99
x 0
x 1
x 2
x 3
x 4
x 5
x 6
x 7
X(0)
X(7)
X(3)
X(4)
X(1)
X(6)
X(2)
X(5)
d 1 = 0 .5 d2i = 0.5(1+ di ) d2i+1 = 0.5(1- di )
2d
2d1
2d1
d1
2d2
d3
2d3
d2
d5
d4
d7
d6
-
-
第一组蝶形运算第二组蝶形运算第三组蝶形运算
将对模块进行一维IDCT变换的结果存储起来,转置输出,再进行一次IDCT变换,即
为相应的二维IDCT变换。
一维 IDCT
转置单元
1 2
3
5 4
6
7 8
48 折叠结构的二维IDCT 单元
一行数据( 一行有8 个像素数据) 在该单元中的处理流程是:1—>—>—>—>
—>—>—>8。
4.4. 运动补偿解码
运动补偿解码过程包括,根据从码流中解析到的运动矢量的数据得到当前宏块的运动矢
(可能不止一个),然后根据当前宏块的运动矢量,从参考帧中找出相应的参考宏块。如果
运动矢量不是整象数值,还需要通过内插来获得参考宏块。
4.4.1 非整象素运动矢量的像素内插过程
非整象素运动矢量下的像素内插过程用于逐行模式下16x16或者8x8的帧类型的块或者
场模式下16x8 的场类型的块。内插过程分别用在重建参考帧的亮度块和色度块中。
Quarter_sample 的值定义在vol 头结构中,rounding_control 的值根据vop 头结构中的
vop_rounding_type来的。对隔行图像,半像素或者四分之一像素值如果在垂直方向需要内插,
使用的是同一场中的连续的行。场预测运动矢量是用帧坐标给出来的,因此垂直方向运动矢
量的坐标间隔为2
4.4.1.1半像素内插
半像素内插过程只用在半像素运动估计模式下,即quarter_sample等于0 时。这时,半
像素值用定义在图49 中的双线性内插过程得到。其中,rounding_control值是根据vop
中的vop_rouding_type得到的。
PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
79 页共 99
+ +
+ +
+ Integer pixel position
Half pixel position
A B
C D
a b
c d
a = A,
b = (A + B + 1 - rounding_control) / 2
c = (A + C + 1 - rounding_control) / 2,
d = (A + B + C + D + 2 - rounding_control) / 4
49 –半像素搜索的内插方案
4.4.1.2四分之一像素内插
这一节中定义的半像素内插和四分之一像素内插的过程只用在四分之一像素模式下,即
quarter_sample 等于1 时。另外,这个过程只用在一个VOP 中的亮度部分;对VOP 中色度
部分的运动补偿,相应的运动矢量首先被舍入到半像素位置,见表413,然后使用上面的
4.4.1.1 节定义的双线性内插过程。
在四分之一像素模式下,由当前预测块的解码运动向量定义的位于参考帧中的大小为
MxN 的参考块,如果需要内插,即当前运动矢量不是整象素,则一个大小为(M+1)x(N+1)
的参考宏块会从参考帧取出来用于内插过程,这参考块的顶点由当前运动矢量决定,具体细
节后面再说。然后这个块需要以块边界为对称轴,往各个方向通过镜像扩展三个像素,如图
410 所示:
410– 块边界镜像扩展
接着,半像素值和1/4 像素值(如果需要的话)就从这个扩展的参考块中通过下面的两步
得到。
1. 半像素值的计算。
半像素值通过水平滤波(411ai)和接下来的垂直滤波(411bc)两步得到
(如图411)。两个方向的滤波都是用一个8 抽头的FIR 抽样滤波器,描述如下:
(CO1[4] ,CO1[3],CO1[2],CO1[1],CO1[1],CO1[2] ,CO1[3] ,CO1[4])/256
滤波器系数使用的是:CO1[1..4]= [160, -48, 24, -8]
block
boundary
PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
80 页共 99
X-4,-4 X-3,-4 X-2,-4 X-1,-4 o X+1,-4 X+2,-4 X+3,-4 X+4,-4
a-3
X-4,-3 X-3,-3 X-2,-3 X-1,-3 o X+1,-3 X+2,-3 X+3,-3 X+4,-3
a-2
X-4,-2 X-3,-2 X-2,-2 X-1,-2 o X+1,-2 X+2,-2 X+3,-2 X+4,-2
a-1
X-4,-1 X-3,-1 X-2,-1 X-1,-1 o X+1,-1 X+2,-1 X+3,-1 X+4,-1
bo co
X-4,+1 X-3,+1 X-2,+1 X-1,+1o X+1,+1 X+2,+1 X+3,+1 X+4,+1
a+1
X-4,+2 X-3,+2 X-2,+2 X-1,+2o X+1,+2 X+2,+2 X+3,+2 X+4,+2
a+2
X-4,+3 X-3,+3 X-2,+3 X-1,+3o X+1,+3 X+2,+3 X+3,+3 X+4,+3
a+3
X-4,+4 X-3,+4 X-2,+4 X-1,+4o X+1,+4 X+2,+4 X+3,+4 X+4,+4
x: integer sample position ; o: Half sample position
a CO j X X rounding control i j i j i
j
= × +
?
è ?
?
? ÷
+ -
?
è ??
?
? ÷÷
- +
= ?
1 128 256
1
4
[ ] ( ) _ / , ,
b CO j X X rounding control j j
j
= × +
?
è ?
?
? ÷
+ -
?
è ??
?
? ÷÷
- - - +
= ?
1 128 256 1 1
1
4
[ ] ( ) _ / , ,
c CO j a a rounding control j j
j
= × +
?
è ?
?
? ÷
+ -
?
è ??
?
? ÷÷
- +
= ?
1 128 256
1
4
[ ] ( ) _ /
411 –14像素模式下的半像素内插(FIR滤波)
通过水平和垂直滤波得到的值必须限制在范围[0, 255]之间。Rounding_control 的值是用
过定义在vop头中的vop_rounding_type得到的。
214 像素值的计算
如果需要得到14 像素的值,则需要在上面定义的滤波过程后面再加上一个半像素内
插的过程。这里的半像素内插使用的是4.4.1.1 中定义的双线性内插。
4.4.2 一般的运动向量解码过程
为了解码运动向量(MVxMVy),要通过变长码解码(VLD)从码流中抽取差分运动
向量(MVDxMVDy),然后把它加到运动向量的预测值(PxPy)上,得到最终的运动
向量。所以本质上来说,除了如何计算运动向量的预测值过程不一样,得到差分运动向量的
PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
81 页共 99
过程我们还是可以基本统一的。一般的运动向量的解码过程与下面的过程等价。下面的所有
计算都是以半像素为单位的。请注意,如果使用了14 像素模式运动估计
(quarter_sample==1),则最后的结果仍然以半像素为单位进行表示,此时,最后的绝对值将
没有必要一定是整数了(这点要特别注意)。这个过程被称为一般过程意味着它对隔行/逐行模
式下的PB-VOP都是适用的,只是预测向量的产生是不同的。对短头格式,fcode恒等于
1
r_size = vop_fcode - 1
f = 1 << r_size
high = ( 32 * f ) - 1;
low = ( (-32) * f );
range = ( 64 * f );
if ( (f == 1) || (horizontal_mv_data == 0) )
MVDx = horizontal_mv_data;
else {
MVDx = ( ( Abs(horizontal_mv_data) - 1 ) * f ) + horizontal_mv_residual + 1;
if (horizontal_mv_data < 0)
MVDx = - MVDx;
}
if ( (f == 1) || (vertical_mv_data == 0) )
MVDy = vertical_mv_data;
else {
MVDy = ( ( Abs(vertical_mv_data) - 1 ) * f ) + vertical_mv_residual + 1;
if (vertical_mv_data < 0)
MVDy = - MVDy;
}
if(quarter_sample==1) {
MVDx = MVDx / 2.0;
MVDy = MVDy / 2.0;
}
MVx = Px + MVDx;
if ( MVx < low )
MVx = MVx + range;
if (MVx > high)
MVx = MVx - range;
MVy = Py + MVDy;
if ( MVy < low )
MVy = MVy + range;
if (MVy > high)
MVy = MVy - range;
PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc

阅读全文
0 0
原创粉丝点击