📄 me_epzs.c
字号:
loffset = 1;
}
else
{
fsx = fs_top;
loffset = 0;
}
if (fsx->motion.ref_id [LIST_0][j][i] != -1)
{
for (iref = 0; iref < imin(2*img->num_ref_idx_l0_active,listXsize[LIST_0 + 2]); iref++)
{
if (enc_picture->ref_pic_num[LIST_0 + 2][iref]==fsx->motion.ref_id [LIST_0][j][i])
{
tempmv_scale[LIST_0] = epzs_scale[loffset][LIST_0 + 2][iref];
tempmv_scale[LIST_1] = epzs_scale[loffset][LIST_1 + 2][iref];
break;
}
}
p->top[LIST_0][j][i].mv_x = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_0] * fsx->motion.mv[LIST_0][j][i][0]), invmv_precision));
p->top[LIST_0][j][i].mv_y = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_0] * fsx->motion.mv[LIST_0][j][i][1]), invmv_precision));
p->top[LIST_1][j][i].mv_x = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_1] * fsx->motion.mv[LIST_0][j][i][0]), invmv_precision));
p->top[LIST_1][j][i].mv_y = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_1] * fsx->motion.mv[LIST_0][j][i][1]), invmv_precision));
}
else
{
p->top[LIST_0][j][i].mv_x = 0;
p->top[LIST_0][j][i].mv_y = 0;
p->top[LIST_1][j][i].mv_x = 0;
p->top[LIST_1][j][i].mv_y = 0;
}
if (!fs->motion.field_frame[2 * j][i])
{
p->top[LIST_0][j][i].mv_y = (p->top[LIST_0][j][i].mv_y + 1) >> 1;
p->top[LIST_1][j][i].mv_y = (p->top[LIST_1][j][i].mv_y + 1) >> 1;
}
}
}
}
}
}
//if (!active_sps->frame_mbs_only_flag || active_sps->direct_8x8_inference_flag)
if (!active_sps->frame_mbs_only_flag )
{
//! Use inference flag to remap mvs/references
//! Frame with field co-located
if (!img->structure)
{
for (j = 0; j < fs->size_y >> 2; j++)
{
jj = j>>1;
jdiv = (j>>1) + ((j>>3) << 2);
for (i = 0; i < fs->size_x >> 2; i++)
{
if (fs->motion.field_frame[j][i])
{
tempmv_scale[LIST_0] = 256;
tempmv_scale[LIST_1] = 0;
if (fs->motion.ref_id [LIST_0][jdiv][i] < 0 && listXsize[LIST_0] > 1)
{
fsx = fs1;
loffset = 1;
}
else
{
fsx = fs;
loffset = 0;
}
if (fsx->motion.ref_id [LIST_0][jdiv][i] != -1)
{
for (iref = 0; iref < imin(img->num_ref_idx_l0_active,listXsize[LIST_0]); iref++)
{
if (enc_picture->ref_pic_num[LIST_0][iref]==fsx->motion.ref_id [LIST_0][jdiv][i])
{
tempmv_scale[LIST_0] = epzs_scale[loffset][LIST_0][iref];
tempmv_scale[LIST_1] = epzs_scale[loffset][LIST_1][iref];
break;
}
}
if (iabs (enc_picture->poc - fsx->bottom_field->poc) > iabs (enc_picture->poc - fsx->top_field->poc))
{
p->frame[LIST_0][j][i].mv_x = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_0] * fsx->top_field->motion.mv[LIST_0][jj][i][0]), invmv_precision));
p->frame[LIST_0][j][i].mv_y = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_0] * fsx->top_field->motion.mv[LIST_0][jj][i][1]), invmv_precision));
p->frame[LIST_1][j][i].mv_x = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_1] * fsx->top_field->motion.mv[LIST_0][jj][i][0]), invmv_precision));
p->frame[LIST_1][j][i].mv_y = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_1] * fsx->top_field->motion.mv[LIST_0][jj][i][1]), invmv_precision));
}
else
{
p->frame[LIST_0][j][i].mv_x = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_0] * fsx->bottom_field->motion.mv[LIST_0][jj][i][0]), invmv_precision));
p->frame[LIST_0][j][i].mv_y = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_0] * fsx->bottom_field->motion.mv[LIST_0][jj][i][1]), invmv_precision));
p->frame[LIST_1][j][i].mv_x = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_1] * fsx->bottom_field->motion.mv[LIST_0][jj][i][0]), invmv_precision));
p->frame[LIST_1][j][i].mv_y = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_1] * fsx->bottom_field->motion.mv[LIST_0][jj][i][1]), invmv_precision));
}
}
else
{
p->frame[LIST_0][j][i].mv_x = 0;
p->frame[LIST_0][j][i].mv_y = 0;
p->frame[LIST_1][j][i].mv_x = 0;
p->frame[LIST_1][j][i].mv_y = 0;
}
}
}
}
}
}
if (active_sps->frame_mbs_only_flag)
{
for (j = 0; j < fs->size_y >> 2; j++)
{
for (i = 0; i < fs->size_x >> 2; i++)
{
tempmv_scale[LIST_0] = 256;
tempmv_scale[LIST_1] = 0;
if (fs->motion.ref_id [LIST_0][j][i] < 0 && listXsize[LIST_0] > 1)
{
fsx = fs1;
loffset = 1;
}
else
{
fsx = fs;
loffset = 0;
}
if (fsx->motion.ref_id [LIST_0][j][i] != -1)
{
for (iref = 0; iref < imin(img->num_ref_idx_l0_active,listXsize[LIST_0]); iref++)
{
if (enc_picture->ref_pic_num[LIST_0][iref]==fsx->motion.ref_id [LIST_0][j][i])
{
tempmv_scale[LIST_0] = epzs_scale[loffset][LIST_0][iref];
tempmv_scale[LIST_1] = epzs_scale[loffset][LIST_1][iref];
break;
}
}
p->frame[LIST_0][j][i].mv_x = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_0] * fsx->motion.mv[LIST_0][j][i][0]), invmv_precision));
p->frame[LIST_0][j][i].mv_y = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_0] * fsx->motion.mv[LIST_0][j][i][1]), invmv_precision));
p->frame[LIST_1][j][i].mv_x = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_1] * fsx->motion.mv[LIST_0][j][i][0]), invmv_precision));
p->frame[LIST_1][j][i].mv_y = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_1] * fsx->motion.mv[LIST_0][j][i][1]), invmv_precision));
}
else
{
p->frame[LIST_0][j][i].mv_x = 0;
p->frame[LIST_0][j][i].mv_y = 0;
p->frame[LIST_1][j][i].mv_x = 0;
p->frame[LIST_1][j][i].mv_y = 0;
}
}
}
}
if (!active_sps->frame_mbs_only_flag)
{
for (j = 0; j < fs->size_y >> 2; j++)
{
for (i = 0; i < fs->size_x >> 2; i++)
{
if ((!img->MbaffFrameFlag && !img->structure && fs->motion.field_frame[j][i]) || (img->MbaffFrameFlag && fs->motion.field_frame[j][i]))
{
p->frame[LIST_0][j][i].mv_y *= 2;
p->frame[LIST_1][j][i].mv_y *= 2;
}
else if (img->structure && !fs->motion.field_frame[j][i])
{
p->frame[LIST_0][j][i].mv_y = rshift_rnd_sf(p->frame[LIST_0][j][i].mv_y, 1);
p->frame[LIST_1][j][i].mv_y = rshift_rnd_sf(p->frame[LIST_1][j][i].mv_y, 1);
}
}
}
}
}
}
/*!
***********************************************************************
* \brief
* Spatial Predictors
* AMT/HYC
***********************************************************************
*/
static short EPZSSpatialPredictors (PixelPos block_a,
PixelPos block_b,
PixelPos block_c,
PixelPos block_d,
int list,
int list_offset,
short ref,
char **refPic,
short ***tmp_mv,
EPZSStructure * predictor)
{
int refA, refB, refC, refD;
int *mot_scale = mv_scale[list + list_offset][ref];
short sp_shift_mv = 8 + mv_rescale;
int fixed_mv = (12 >> mv_rescale);
// zero predictor
predictor->point[0].motion.mv_x = 0;
predictor->point[0].motion.mv_y = 0;
// Non MB-AFF mode
if (!img->MbaffFrameFlag)
{
refA = block_a.available ? (int) refPic[block_a.pos_y][block_a.pos_x] : -1;
refB = block_b.available ? (int) refPic[block_b.pos_y][block_b.pos_x] : -1;
refC = block_c.available ? (int) refPic[block_c.pos_y][block_c.pos_x] : -1;
refD = block_d.available ? (int) refPic[block_d.pos_y][block_d.pos_x] : -1;
// Left Predictor
if (block_a.available)
{
predictor->point[1].motion.mv_x = rshift_rnd_sf((mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][0]), sp_shift_mv);
predictor->point[1].motion.mv_y = rshift_rnd_sf((mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][1]), sp_shift_mv);
}
else
{
predictor->point[1].motion.mv_x = fixed_mv;
predictor->point[1].motion.mv_y = 0;
}
// Up predictor
if (block_b.available)
{
predictor->point[2].motion.mv_x = rshift_rnd_sf((mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][0]), sp_shift_mv);
predictor->point[2].motion.mv_y = rshift_rnd_sf((mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][1]), sp_shift_mv);
}
else
{
predictor->point[2].motion.mv_x = 0;
predictor->point[2].motion.mv_y = fixed_mv;
}
// Up-Right predictor
if (block_c.available)
{
predictor->point[3].motion.mv_x = rshift_rnd_sf((mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][0]), sp_shift_mv);
predictor->point[3].motion.mv_y = rshift_rnd_sf((mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][1]), sp_shift_mv);
}
else
{
predictor->point[3].motion.mv_x = -fixed_mv;
predictor->point[3].motion.mv_y = 0;
}
//Up-Left predictor
if (block_d.available)
{
predictor->point[4].motion.mv_x = rshift_rnd_sf((mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][0]), sp_shift_mv);
predictor->point[4].motion.mv_y = rshift_rnd_sf((mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][1]), sp_shift_mv);
}
else
{
predictor->point[4].motion.mv_x = 0;
predictor->point[4].motion.mv_y = -fixed_mv;
}
}
else // MB-AFF mode
{
// Field Macroblock
if (list_offset)
{
refA = block_a.available
? img->mb_data[block_a.mb_addr].mb_field
? (int) refPic[block_a.pos_y][block_a.pos_x]
: (int) refPic[block_a.pos_y][block_a.pos_x] * 2 : -1;
refB =block_b.available
? img->mb_data[block_b.mb_addr].mb_field
? (int) refPic[block_b.pos_y][block_b.pos_x]
: (int) refPic[block_b.pos_y][block_b.pos_x] * 2 : -1;
refC = block_c.available
? img->mb_data[block_c.mb_addr].mb_field
? (int) refPic[block_c.pos_y][block_c.pos_x]
: (int) refPic[block_c.pos_y][block_c.pos_x] * 2 : -1;
refD = block_d.available
? img->mb_data[block_d.mb_addr].mb_field
? (int) refPic[block_d.pos_y][block_d.pos_x]
: (int) refPic[block_d.pos_y][block_d.pos_x] * 2 : -1;
// Left Predictor
predictor->point[1].motion.mv_x = (block_a.available)
? rshift_rnd_sf((mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][0]), sp_shift_mv) : fixed_mv;
predictor->point[1].motion.mv_y = (block_a.available)
? img->mb_data[block_a.mb_addr].mb_field
? rshift_rnd_sf((mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][1]), sp_shift_mv)
: rshift_rnd_sf((mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][1]), sp_shift_mv + 1) : 0;
// Up predictor
predictor->point[2].motion.mv_x = (block_b.available)
? rshift_rnd_sf((mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][0]), sp_shift_mv) : 0;
predictor->point[2].motion.mv_y = (block_b.available)
? img->mb_data[block_b.mb_addr].mb_field
? rshift_rnd_sf((mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][1]), sp_shift_mv)
: rshift_rnd_sf((mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][1]), sp_shift_mv + 1) : fixed_mv;
// Up-Right predictor
predictor->point[3].motion.mv_x = (block_c.available)
? rshift_rnd_sf((mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][0]), sp_shift_mv) : -fixed_mv;
predictor->point[3].motion.mv_y = (block_c.available)
? img->mb_data[block_c.mb_addr].mb_field
? rshift_rnd_sf((mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][1]), sp_shift_mv)
: rshift_rnd_sf((mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][1]), sp_shift_mv + 1) : 0;
//Up-Left predictor
predictor->point[4].motion.mv_x = (block_d.available)
? rshift_rnd_sf((mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][0]), sp_shift_mv) : 0;
predictor->point[4].motion.mv_y = (block_d.available)
? img->mb_data[block_d.mb_addr].mb_field
? rshift_rnd_sf((mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][1]), sp_shift_mv)
: rshift_rnd_sf((mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][1]), sp_shift_mv + 1) : -fixed_mv;
}
else // Frame macroblock
{
refA = block_a.available
? img->mb_data[block_a.mb_addr].mb_field
? (int) refPic[block_a.pos_y][block_a.pos_x] >> 1
: (int) refPic[block_a.pos_y][block_a.pos_x] : -1;
refB = block_b.available
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -