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

93 页共 99
luma_ref, cb_ref, cr_ref, /* Reference VOP pel arrays */
mv_top_x, mv_top_y, /* top field motion vector */
mv_bot_x, mv_bot_y, /* bottom field motion vector */
top_field_ref, /* top field reference */
bottom_field_ref, /* bottom field reference */
x, y, /* current luma macroblock coords */
rounding_type) /* rounding type */
{
//亮度块的顶场部分的计算
mc(luma_pred, luma_ref, x, y, 16, 16, mv_top_x, mv_top_y,
rounding_type, 0, top_field_ref, 2);
//亮度块的底场部分的计算
mc(luma_pred, luma_ref, x, y, 16, 16, mv_bot_x, mv_bot_y,
rounding_type, 1, bottom_field_ref, 2);
//色度块1顶场部分的计算
mc(cb_pred, cb_ref, x/2, y/2, 8, 8,
Div2Round(mv_top_x), Div2Round(mv_top_y),
rounding_type, 0, top_field_ref, 2);
//色度块2顶场部分的计算
mc(cr_pred, cr_ref, x/2, y/2, 8, 8,
Div2Round(mv_top_x), Div2Round(mv_top_y),
rounding_type, 0, top_field_ref, 2);
//色度块1底场部分的计算
mc(cb_pred, cb_ref, x/2, y/2, 8, 8,
Div2Round(mv_bot_x), Div2Round(mv_bot_y),
rounding_type, 1, bottom_field_ref, 2);
//色度块2底场部分的计算
mc(cr_pred, cr_ref, x/2, y/2, 8, 8,
Div2Round(mv_bot_x), Div2Round(mv_bot_y),
rounding_type, 1, bottom_field_ref, 2);
}
场模式下,色度块也是分顶场和底场分别计算的,每个色度块用到了两个运动矢量。
4.4.8 隔行模式下B-VOP的向量解码和运动补偿
对于隔行模式下的B-VOP,一个宏块可以存在下列编码方式:(1)直接编码(direct coding)
216×16的运动补偿(包括前向,后向,双向模式)(3)场运动补偿(包括前向,后向
和双向)。当前正在编码的16×16 的宏块使用的运动向量精确到半象素或者1/4 象素精度。
色差向量由换算亮度向量来产生,对亮度分量除以2,然后查表413 对小数部分进行取舍。
(实际上也就是对亮度向量进行Div2Round 函数,14 像素模式下应该先对亮度分量除以
2(截断除法/)再使用上面的过程)。除了直接编码,其它编码模式都可以改变当前使用的
量化值,即码流中允许存在dbquant。直接模式下,不允许改变当前使用的量化值,即码流
中不能存在dbquant,使用的是前一个编码宏块的量化值。
PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
94 页共 99
隔行模式下运动向量预测,使用了四个预测器(PMVs),如表414 所示:
414 隔行模式B-VOP的预测运动向量
Function PMV
Top field forward 0
Bottom field forward 1
Top field backward 2
Bottom field backward 3
不同的宏块预测模式使用的预测器如表415 所示:
415 隔行模式下B-VOP解码使用的的预测运动向量
Macroblock mode PMVs used PMVs updated
Direct none none
Frame forward 0 0,1
Frame backward 2 2,3
Frame bidirectional 0,2 0,1,2,3
Field forward 0,1 0,1
Field backward 2,3 2,3
Field bidirectional 0,1,2,3 0,1,2,3
一个宏块使用了预测器PMVs 后,预测器的运动向量值被设置为当前宏块的运动向量值。当
一个帧预测的宏块被解码后,相应方向的两个场预测器PMVs(顶场和底场)被设置为同一个
帧运动矢量。此时,帧模式下不会出现四矢量模式。这些PMVs 的值在每一行宏块开始被清
0。遇到跳过宏块和直接模式的宏块,预测器不能被清0
基于帧的运动补偿的过程已经在4.4.6 中给出,这里不再讨论。场运动补偿模式下运动补偿
过程可以用“field_motion_compensate_one_reference”函数计算,这个函数在上面已经给出
来了。下面对场模式下各种模式分别讨论。
4.4.8.1 场前向模式
mb_type==”0001”field_prediction==”1”时,使用场前向预测模式。PMV的更新和运动补
偿预测块的计算见下面的代码。其中luma_fwd_ref_VOP[][]cb_fwd_ref_VOP[][]
cr_fwd_red_VOP[][]指的是前向参考的VOP。亮度块的顶点坐标由(x,y)给出,MVD[].x
MVD[].y按照它们在码流中出现的顺序给出了当前宏块的运动矢量的差分值。
PMV[0].x = PMV[0].x + MVD[0].x;
PMV[0].y = 2 * (PMV[0].y / 2 + MVD[0].y);
PMV[1].x = PMV[1].x + MVD[1].x;
PMV[1].y = 2 * (PMV[1].y / 2 + MVD[1].y);
field_motion_compensate_one_reference(
luma_pred, cb_pred, cr_pred,
luma_fwd_ref_vop, cb_fwd_ref_vop, cr_fwd_ref_vop,
PMV[0].x, PMV[0].y, PMV[1].x, PMV[1].y,
forward_top_field_reference,
forward_bottom_field_reference,
x, y, 0);
PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
95 页共 99
4.4.8.2 场后向模式
“mb_type ==001”“field_prediction ==1”时,使用场后向模式。PMV的更新和运动补
偿预测块的计算见下面的代码。其中luma_bac_ref_VOP[][]cb_bad_ref_VOP[][]
cr_bad_red_VOP[][]指的是后向参考的VOP。亮度块的顶点坐标由(x,y)给出,MVD[].x
MVD[].y按照它们在码流中出现的顺序给出了当前宏块的运动矢量的差分值。
PMV[2].x = PMV[2].x + MVD[0].x;
PMV[2].y = 2 * (PMV[2].y / 2 + MVD[0].y);
PMV[3].x = PMV[1].x + MVD[1].x;
PMV[3].y = 2 * (PMV[3].y / 2 + MVD[1].y);
field_motion_compensate_one_reference(
luma_pred, cb_pred, cr_pred,
luma_bak_ref_vop, cb_bak_ref_vop, cr_bak_ref_vop,
PMV[2].x, PMV[2].y, PMV[3].x, PMV[3].y,
backward_top_field_reference,
backward_bottom_field_reference,
x, y, 0);
4.4.8.3 场双向模式
“mb_type” ==“01”“field_prediction”==“1”时,使用场双向预测模式。预测
宏块(luma_pred[][],cb_pred[][]cr_pred[][])可以由下面的过程计算:
for (mv = 0; mv < 4; mv++) {
PMV[mv].x = PMV[mv].x + MVD[mv].x;
PMV[mv].y = 2 * (PMV[mv].y / 2 + MVD[mv].y);
}
//前向预测宏块的产生
field_motion_compensate_one_reference(
luma_pred_fwd, cb_pred_fwd, cr_pred_fwd,
luma_fwd_ref_vop, cb_fwd_ref_vop, cr_fwd_ref_vop,
PMV[0].x, PMV[0].y, PMV[1].x, PMV[1].y,
forward_top_field_reference,
forward_bottom_field_reference,
x, y, 0);
//后向预测宏块的产生
field_motion_compensate_one_reference(
luma_pred_bak, cb_pred_bak, cr_pred_bak,
luma_bak_ref_vop, cb_bak_ref_vop, cr_bak_ref_vop,
PMV[2].x, PMV[2].y, PMV[3].x, PMV[3].y,
backward_top_field_reference,
backward_bottom_field_reference,
x, y, 0);
//通过对前向和后向预测块求平均,得到当前宏块
for (iy = 0; iy < 16; iy++) {
PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
96 页共 99
for (ix = 0; ix < 16; ix++) {
luma_pred[ix][iy] = (luma_pred_fwd[ix][iy] +
luma_pred_bak[ix][iy] + 1) >> 1;
}
}
for (iy = 0; iy < 8; iy++) {
for (ix = 0; ix < 8; ix++) {
cb_pred[ix][iy] = (cb_pred_fwd[ix][iy] +
cb_pred_bak[ix][iy] + 1) >> 1;
cr_pred[ix][iy] = (cr_pred_fwd[ix][iy] +
cr_pred_bak[ix][iy] + 1) >> 1;
}
}
4.4.8.4 直接模式
mb_type==1 时,当前宏块是用直接模式预测。不过此时,直接模式预测即可以是逐
行的(见4.4.6.5),也可以是隔行的(在下面描述),需要进一步判断究竟是哪种模式。如果
后向参考VOP 中的相应位置的(co_located)宏块的field_prediction 标志为1,则当前宏块使
用隔行直接模式。注意,如果后向参考VOP 中的相应位置的宏块是跳过宏块(skiped)或
者是内部编码宏块,则使用逐行直接模式。其它情况下,使用隔行直接模式。
逐行直接模式是隔行直接模式的一个扩展。当前宏块的四个场运动矢量通过下列参数得来
的:后向参考VOP 中的前向场运动矢量,一个从码流中得到的运动矢量的差分值,当前
B-VOP中顶场或底场同前向和后向参考VOP中的顶场或底场的相对显示时间差。当前宏块
的四个场运动向量指的是:mvf[0](顶场前向运动向量)mvf[1](底场前向运动向量)
mvb[0](顶场后向运动向量)mvb[1](底场后向运动向量)MV[i]是后向参考VOP的顶
(i==0)和底场(i==1)运动矢量。两个场只使用一个delta 运动向量,MVD[0],这个
可以从码流中得到。MVD[0]解码时假定f_code等于0,不考虑此时vop头中的值。隔行
直接模式的预测块(luma_pred[][], cb_pred[][], cr_pred[][])通过下面的方法
得到:
* 获得当前宏块的运动矢量*/
for (i = 0; i < 2; i++) {
mvf[i].x = (TRB[i] * MV[i].x) / TRD[i] + MVD[0].x;
mvf[i].y = (TRB[i] * MV[i].y) / TRD[i] + MVD[0].y;
mvb[i].x = (MVD[0].x == 0) ? /*本来为MVD[i]*/
(((TRB[i] - TRD[i]) * MV[i].x) / TRD[i]) :
mvf[i].x - MV[i].x);
mvb[i].y = (MVD[0].y == 0) ? /*本来为MVD[i]*/
(((TRB[i] - TRD[i]) * MV[i].y) / TRD[i]) :
mvf[i].y - MV[i].y);
} /* 本来没有这个} */
/* 获得当前宏块的前向预测块*/
field_motion_compensate_one_reference(
PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
97 页共 99
luma_pred_fwd, cb_pred_fwd, cr_pred_fwd,
luma_fwd_ref_vop, cb_fwd_ref_vop, cr_fwd_ref_vop,
mvf[0].x, mvf[0].y, mvf[1].x, mvf[1].y,
colocated_future_mb_top_field_reference,
colocated_future_mb_bottom_field_reference,
x, y, 0);
/* 获得当前宏块的后向预测块*/
field_motion_compensate_one_reference(
luma_pred_bak, cb_pred_bak, cr_pred_bak,
luma_bak_ref_vop, cb_bak_ref_vop, cr_bak_ref_vop,
mvb[1].x, mvb[1].y, mvb[1].x, mvb[1].y,
0, 1, x, y, 0);
/* 对前向预测块和后向预测块求平均得到当前宏块的预测块*/
for (iy = 0; iy < 16; iy++) {
for (ix = 0; ix < 16; ix++) {
luma_pred[ix][iy] = (luma_pred_fwd[ix][iy] +
luma_pred_bak[ix][iy] + 1) >> 1;
}
}
for (iy = 0; iy < 8; iy++) {
for (ix = 0; ix < 8; ix++) {
cb_pred[ix][iy] = (cb_pred_fwd[ix][iy] +
cb_pred_bak[ix][iy] + 1) >> 1;
cr_pred[ix][iy] = (cr_pred_fwd[ix][iy] +
cr_pred_bak[ix][iy] + 1) >> 1;
}
}
时间参考(TRB[i]TRD[i]是用时间表示的场周期的距离,图417 给出了当i=0 时它们是
如何定义的(即B-VOP中的顶场情况)。底场时的定义是类似的。
PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
98 页共 99
417 隔行直接模式
TRD[i]TRB[i]的计算不仅依赖于当前场,参考场和帧之间的时间距离,还依赖于当前视频
是顶场在前还是底场在前。
TRD[i] = 2*(T(future)//Tframe - T(past)//Tframe) + d[i]
TRB[i] = 2*(T(current)//Tframe - T(past)//Tframe) + d[i]
其中,T(future), T(current)T(past)modulo_time_basevop_time_increment 计算得到的
将来VOP,当前VOP和过去VOP的累计VOP时间,这里指的是显示顺序。Tframe 是帧周
期,由下式得到:
Tframe = T(first_B_VOP) - T(past_anchor_of_first B_VOP)
这里first_B_VOP指的是Video Object Layer 语法层次后面第一个B-VOP。关于Tframe的一
件很重要的事情是组成一个帧的连续长之间的时间间隔定义为0.5*Tframe
d的值由表416 决定,它有下列参数决定:当前场的奇偶性(顶场还是底场),后向参
VOP中的相应位置的宏块的参考场,B-VOPVOP层中top_field_first参数的值。
416 -- d 参数的选择
后向参考VOP中相应位置宏
块的预测的参考场
top_field_first == 0 top_field_first == 1
Top field
reference
Bottom field
reference
Top field,
d[0]
Bottom field,
d[1]
Top field,
d[0]
Bottom field,
d[1]
0 0 0 -1 0 1
0 1 0 0 0 0
1 0 1 -1 -1 1
1 1 1 0 -1 0
第一列的参数指的是后向参考VOP的顶场预测使用的场的选择,0 表示用顶场预测,1 表示
用底场预测;第二列同第一列类似,指的是底场预测。第三列指的是当top_field_first等于0
时,即底场先于顶场被显示,计算顶场的时间参数时d[0]的取值;第四列同第三列类似,指
的是计算底场时时间参数d[1]的取值。第五列指的是当top_field_first等于1,即顶场先于底
TRD[i]
TRB[i]
MV[i]
mvf[i] mvb[i]
Past
Anchor
Current
VOP
Future
Anchor
PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
99 页共 99
场被显示时,计算顶场的时间参数时d[0]的取值;第六列同第五列类似,指的是计算底场时
时间参数d[1]的取值。当隔行直接模式被使用时,vop_time_increment_resolution必须是大于
或等于每秒中的帧数的最小整数。在每一个VOP中,vop_time_increment给出了一秒中的单
独帧数。
[参考文献]
1. ISO/IEC JTC 1/SC 29/WG 11 N4350
2. ISO/IEC JTC1/SC 29/WG 11 N3904
3. ISO/IEC JTC 1/SC 29/WG 11 N 3056
4. 钟玉琢等,基于对象的多媒体压缩编码国际标准-MPEG-4及其校验模型,科学出版

PDF 文件使用 "pdfFactory Pro" 试用版本创建www.fineprint.cn

你可能感兴趣的:(MPEG4标准中的Advanced Simple Profile(ASP)完整的说明-04-4章)