📄 me_epzs.c
字号:
{
if (enc_picture->ref_pic_num[LIST_0][iref]==fsx->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->mv[LIST_0][j][i][0] = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_0] * fsx->mv[LIST_0][j][i][0]), invmv_precision));
p->mv[LIST_0][j][i][1] = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_0] * fsx->mv[LIST_0][j][i][1]), invmv_precision));
p->mv[LIST_1][j][i][0] = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_1] * fsx->mv[LIST_0][j][i][0]), invmv_precision));
p->mv[LIST_1][j][i][1] = iClip3 (-32768, 32767, rshift_rnd_sf((tempmv_scale[LIST_1] * fsx->mv[LIST_0][j][i][1]), invmv_precision));
}
else
{
p->mv[LIST_0][j][i][0] = 0;
p->mv[LIST_0][j][i][1] = 0;
p->mv[LIST_1][j][i][0] = 0;
p->mv[LIST_1][j][i][1] = 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->field_frame[j][i]) || (img->MbaffFrameFlag && fs->field_frame[j][i]))
{
p->mv[LIST_0][j][i][1] *= 2;
p->mv[LIST_1][j][i][1] *= 2;
}
else if (img->structure && !fs->field_frame[j][i])
{
p->mv[LIST_0][j][i][1] = rshift_rnd_sf((p->mv[LIST_0][j][i][1]), 1);
p->mv[LIST_1][j][i][1] = rshift_rnd_sf((p->mv[LIST_1][j][i][1]), 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;
// zero predictor
predictor->point[0].mv[0] = 0;
predictor->point[0].mv[1] = 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].mv[0] = rshift_rnd_sf((mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][0]), sp_shift_mv);
predictor->point[1].mv[1] = rshift_rnd_sf((mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][1]), sp_shift_mv);
}
else
{
predictor->point[1].mv[0] = (12 >> mv_rescale);
predictor->point[1].mv[1] = 0;
}
// Up predictor
if (block_b.available)
{
predictor->point[2].mv[0] = rshift_rnd_sf((mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][0]), sp_shift_mv);
predictor->point[2].mv[1] = rshift_rnd_sf((mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][1]), sp_shift_mv);
}
else
{
predictor->point[2].mv[0] = 0;
predictor->point[2].mv[1] = (12 >> mv_rescale);
}
// Up-Right predictor
if (block_c.available)
{
predictor->point[3].mv[0] = rshift_rnd_sf((mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][0]), sp_shift_mv);
predictor->point[3].mv[1] = rshift_rnd_sf((mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][1]), sp_shift_mv);
}
else
{
predictor->point[3].mv[0] = -(12 >> mv_rescale);
predictor->point[3].mv[1] = 0;
}
//Up-Left predictor
if (block_d.available)
{
predictor->point[4].mv[0] = rshift_rnd_sf((mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][0]), sp_shift_mv);
predictor->point[4].mv[1] = rshift_rnd_sf((mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][1]), sp_shift_mv);
}
else
{
predictor->point[4].mv[0] = 0;
predictor->point[4].mv[1] = -(12 >> mv_rescale);
}
}
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].mv[0] = (block_a.available)
? rshift_rnd_sf((mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][0]), sp_shift_mv) : (12 >> mv_rescale);
predictor->point[1].mv[1] = (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].mv[0] = (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].mv[1] = (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) : (12 >> mv_rescale);
// Up-Right predictor
predictor->point[3].mv[0] = (block_c.available)
? rshift_rnd_sf((mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][0]), sp_shift_mv) : -(12 >> mv_rescale);
predictor->point[3].mv[1] = (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].mv[0] = (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].mv[1] = (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) : -(12 >> mv_rescale);
}
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
? img->mb_data[block_b.mb_addr].mb_field
? (int) refPic[block_b.pos_y][block_b.pos_x] >> 1
: (int) refPic[block_b.pos_y][block_b.pos_x] : -1;
refC = block_c.available
? img->mb_data[block_c.mb_addr].mb_field
? (int) refPic[block_c.pos_y][block_c.pos_x] >> 1
: (int) refPic[block_c.pos_y][block_c.pos_x] : -1;
refD = block_d.available
? img->mb_data[block_d.mb_addr].mb_field
? (int) refPic[block_d.pos_y][block_d.pos_x] >> 1
: (int) refPic[block_d.pos_y][block_d.pos_x] : -1;
// Left Predictor
predictor->point[1].mv[0] = (block_a.available)
? rshift_rnd_sf((mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][0]), sp_shift_mv) : (12 >> mv_rescale);
predictor->point[1].mv[1] = (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 - 1)
: rshift_rnd_sf((mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][1]), sp_shift_mv) : 0;
// Up predictor
predictor->point[2].mv[0] = (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].mv[1] = (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 - 1)
: rshift_rnd_sf((mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][1]), sp_shift_mv) : (12 >> mv_rescale);
// Up-Right predictor
predictor->point[3].mv[0] = (block_c.available)
? rshift_rnd_sf((mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][0]), sp_shift_mv) : -(12 >> mv_rescale);
predictor->point[3].mv[1] = (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 - 1)
: rshift_rnd_sf((mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][1]), sp_shift_mv) : 0;
//Up-Left predictor
predictor->point[4].mv[0] = (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].mv[1] = (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 - 1)
: rshift_rnd_sf((mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][1]), sp_shift_mv) : -(12 >> mv_rescale);
}
}
return ((refA == -1) + (refB == -1) + (refC == -1 && refD == -1));
}
/*!
***********************************************************************
* \brief
* Spatial Predictors
* AMT/HYC
***********************************************************************
*/
static void EPZSSpatialMemPredictors (int list,
short ref,
int blocktype,
int pic_x,
int bs_x,
int bs_y,
int by,
int *prednum,
int img_width,
EPZSStructure * predictor)
{
#if EPZSREF
short ***mv = EPZSMotion[list][ref][blocktype];
int *cur_mv = predictor->point[*prednum].mv;
// Left Predictor
cur_mv[0] = (pic_x > 0) ? mv[by][pic_x - bs_x][0] : 0;
cur_mv[1] = (pic_x > 0) ? mv[by][pic_x - bs_x][1] : 0;
*prednum += (cur_mv[0] | cur_mv[1])!=0;
// Up predictor
cur_mv = predictor->point[*prednum].mv;
cur_mv[0] = (by > 0) ? mv[by - bs_y][pic_x][0] : mv[4 - bs_y][pic_x][0];
cur_mv[1] = (by > 0) ? mv[by - bs_y][pic_x][1] : mv[4 - bs_y][pic_x][1];
*prednum += (cur_mv[0] | cur_mv[1])!=0;
// Up-Right predictor
cur_mv = predictor->point[*prednum].mv;
cur_mv[0] = (pic_x + bs_x < img_width) ? (by > 0)
? mv[by - bs_y][pic_x + bs_x][0] : mv[4 - bs_y][pic_x + bs_x][0] : 0;
cur_mv[1] = (pic_x + bs_x < img_width) ? (by > 0)
? mv[by - bs_y][pic_x + bs_x][1] : mv[4 - bs_y][pic_x + bs_x][1] : 0;
*prednum += (cur_mv[0] | cur_mv[1])!=0;
#else
int mot_scale = mv_scale[list][ref][0];
short **mv = EPZSMotion[list][blocktype];
// Left Predictor
predictor->point[*prednum].mv[0] = (pic_x > 0)
? rshift_rnd_sf((mot_scale * mv[by][pic_x - bs_x][0]), 8)
: 0;
predictor->point[*prednum].mv[1] = (pic_x > 0)
? rshift_rnd_sf((mot_scale * mv[by][pic_x - bs_x][1]), 8)
: 0;
*prednum += ((predictor->point[*prednum].mv[0] != 0) || (predictor->point[*prednum].mv[1] != 0));
// Up predictor
predictor->point[*prednum].mv[0] = (by > 0)
? rshift_rnd_sf((mot_scale * mv[by - bs_y][pic_x][0]), 8)
: rshift_rnd_sf((mot_scale * mv[4 - bs_y][pic_x][0]), 8);
predictor->point[*prednum].mv[1] = (by > 0)
? rshift_rnd_sf((mot_scale * mv[by - bs_y][pic_x][1]), 8)
: rshift_rnd_sf((mot_scale * mv[4 - bs_y][pic_x][1]), 8);
*prednum += ((predictor->point[*prednum].mv[0] != 0) || (predictor->point[*prednum].mv[1] != 0));
// Up-Right predictor
predictor->point[*prednum].mv[0] = (pic_x + bs_x < img_width)
? (by > 0)
? rshift_rnd_sf((mot_scale * mv[by - bs_y][pic_x + bs_x][0]), 8)
: rshift_rnd_sf((mot_scale * mv[4 - bs_y][pic_x + bs_x][0]), 8)
: 0;
predictor->point[*prednum].mv[1] = (pic_x + bs_x < img_width)
? (by > 0)
? rshift_rnd_sf((mot_scale * mv[by - bs_y][pic_x + bs_x][1]), 8)
: rshift_rnd_sf((mot_scale * mv[4 - bs_y][pic_x + bs_x][1]), 8)
: 0;
*prednum += ((predictor->point[*prednum].mv[0] != 0) || (predictor->point[*prednum].mv[1] != 0));
#endif
}
/*!
***********************************************************************
* \brief
* Temporal Predictors
* AMT/HYC
***********************************************************************
*/
static void
EPZSTemporalPredictors (int list, // <-- current list
int list_offset, // <-- list offset for MBAFF
short ref, // <-- current reference frame
int o_block_x, // <-- absolute x-coordinate of regarded AxB block
int o_block_y, // <-- absolute y-coordinate of regarded AxB block
EPZSStructure * predictor,
int *prednum,
int block_available_left,
int block_available_up,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -