📄 epzs.c
字号:
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] = (p->mv[LIST_0][j][i][1] + 1) >> 1;
p->mv[LIST_1][j][i][1] = (p->mv[LIST_1][j][i][1] + 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];
// zero predictor
predictor->point[0].x = 0;
predictor->point[0].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
predictor->point[1].x = (block_a.available)
? (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][0] + 512) >> 10 : 3;
predictor->point[1].y = (block_a.available)
? (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][1] + 512) >> 10 : 0;
// Up predictor
predictor->point[2].x = (block_b.available)
? (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][0] + 512) >> 10 : 0;
predictor->point[2].y = (block_b.available)
? (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][1] + 512) >> 10 : 3;
// Up-Right predictor
predictor->point[3].x = (block_c.available)
? (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][0] + 512) >> 10 : -3;
predictor->point[3].y = (block_c.available)
? (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][1] + 512) >> 10 : 0;
//Up-Left predictor
predictor->point[4].x = (block_d.available)
? (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][0] + 512) >> 10 : 0;
predictor->point[4].y = (block_d.available)
? (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][1] + 512) >> 10 : -3;
}
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].x = (block_a.available)
? (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][0] + 512 ) >> 10 : 3;
predictor->point[1].y = (block_a.available)
? img->mb_data[block_a.mb_addr].mb_field
? (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][1] + 512 ) >> 10
: (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][1] + 1024) >> 11 : 0;
// Up predictor
predictor->point[2].x = (block_b.available)
? (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][0] + 512 ) >> 10 : 0;
predictor->point[2].y = (block_b.available)
? img->mb_data[block_b.mb_addr].mb_field
? (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][1] + 512 ) >> 10
: (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][1] + 1024) >> 11 : 3;
// Up-Right predictor
predictor->point[3].x = (block_c.available)
? (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][0] + 512 ) >> 10 : -3;
predictor->point[3].y = (block_c.available)
? img->mb_data[block_c.mb_addr].mb_field
? (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][1] + 512 ) >> 10
: (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][1] + 1024) >> 11 : 0;
//Up-Left predictor
predictor->point[4].x = (block_d.available)
? (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][0] + 512 ) >> 10 : 0;
predictor->point[4].y = (block_d.available)
? img->mb_data[block_d.mb_addr].mb_field
? (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][1] + 512 ) >> 10
: (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][1] + 1024) >> 11 : -3;
}
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].x = (block_a.available)
? (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][0] + 512) >> 10 : 3;
predictor->point[1].y = (block_a.available)
? img->mb_data[block_a.mb_addr].mb_field
? (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][1] + 256) >> 9
: (mot_scale[refA] * tmp_mv[block_a.pos_y][block_a.pos_x][1] + 512) >> 10 : 0;
// Up predictor
predictor->point[2].x = (block_b.available)
? (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][0] + 512) >> 10 : 0;
predictor->point[2].y = (block_b.available)
? img->mb_data[block_b.mb_addr].mb_field
? (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][1] + 256) >> 9
: (mot_scale[refB] * tmp_mv[block_b.pos_y][block_b.pos_x][1] + 512) >> 10 : 3;
// Up-Right predictor
predictor->point[3].x = (block_c.available)
? (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][0] + 512) >> 10 : -3;
predictor->point[3].y = (block_c.available)
? img->mb_data[block_c.mb_addr].mb_field
? (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][1] + 256) >> 9
: (mot_scale[refC] * tmp_mv[block_c.pos_y][block_c.pos_x][1] + 512) >> 10 : 3;
//Up-Left predictor
predictor->point[4].x = (block_d.available)
? (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][0] + 512) >> 10 : 0;
predictor->point[4].y = (block_d.available)
? img->mb_data[block_d.mb_addr].mb_field
? (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][1] + 256) >> 9
: (mot_scale[refD] * tmp_mv[block_d.pos_y][block_d.pos_x][1] + 512) >> 10 : -3;
}
}
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];
// Left Predictor
predictor->point[*prednum].x = (pic_x > 0) ? mv[by][pic_x - bs_x][0] : 0;
predictor->point[*prednum].y = (pic_x > 0) ? mv[by][pic_x - bs_x][1] : 0;
*prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
// Up predictor
predictor->point[*prednum].x = (by > 0) ? mv[by - bs_y][pic_x][0] : mv[4 - bs_y][pic_x][0] ;
predictor->point[*prednum].y = (by > 0) ? mv[by - bs_y][pic_x][1] : mv[4 - bs_y][pic_x][1];
*prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
// Up-Right predictor
predictor->point[*prednum].x = (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;
predictor->point[*prednum].y = (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 += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
#else
int mot_scale = mv_scale[list][ref][0];
short **mv = EPZSMotion[list][blocktype];
// Left Predictor
predictor->point[*prednum].x = (pic_x > 0)
? (mot_scale * mv[by][pic_x - bs_x][0] + 128) >> 8
: 0;
predictor->point[*prednum].y = (pic_x > 0)
? (mot_scale * mv[by][pic_x - bs_x][1] + 128) >> 8
: 0;
*prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
// Up predictor
predictor->point[*prednum].x = (by > 0)
? (mot_scale * mv[by - bs_y][pic_x][0] + 128) >> 8
: (mot_scale * mv[4 - bs_y][pic_x][0] + 128) >> 8;
predictor->point[*prednum].y = (by > 0)
? (mot_scale * mv[by - bs_y][pic_x][1] + 128) >> 8
: (mot_scale * mv[4 - bs_y][pic_x][0] + 128) >> 8;
*prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
// Up-Right predictor
predictor->point[*prednum].x = (pic_x + bs_x < img_width)
? (by > 0)
? (mot_scale * mv[by - bs_y][pic_x + bs_x][0] + 128) >> 8
: (mot_scale * mv[4 - bs_y][pic_x + bs_x][0] + 128) >> 8
: 0;
predictor->point[*prednum].y = (pic_x + bs_x < img_width)
? (by > 0)
? (mot_scale * mv[by - bs_y][pic_x + bs_x][1] + 128) >> 8
: (mot_scale * mv[4 - bs_y][pic_x + bs_x][1] + 128) >> 8
: 0;
*prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 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,
int block_available_right,
int block_available_below,
int blockshape_x,
int blockshape_y,
int stopCriterion,
int min_mcost)
{
int mvScale = mv_scale[list + list_offset][ref][0];
short ***col_mv = (list_offset == 0) ? EPZSCo_located->mv[list]
: (list_offset == 2) ? EPZSCo_located->top_mv[list] : EPZSCo_located->bottom_mv[list];
predictor->point[*prednum].x = (mvScale * col_mv[o_block_y][o_block_x][0] + 2048) >> 12;
predictor->point[*prednum].y = (mvScale * col_mv[o_block_y][o_block_x][1] + 2048) >> 12;
*prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
if (min_mcost > stopCriterion && ref < 2)
{
if (block_available_left)
{
predictor->point[*prednum].x = (mvScale * col_mv[o_block_y][o_block_x - 1][0] + 2048) >> 12;
predictor->point[*prednum].y = (mvScale * col_mv[o_block_y][o_block_x - 1][1] + 2048) >> 12;
*prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
//Up_Left
if (block_available_up)
{
predictor->point[*prednum].x = (mvScale * col_mv[o_block_y - 1][o_block_x - 1][0] + 2048) >> 12;
predictor->point[*prednum].y = (mvScale * col_mv[o_block_y - 1][o_block_x - 1][1] + 2048) >> 12;
*prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));;
}
//Down_Left
if (block_available_below)
{
predictor->point[*prednum].x = (mvScale * col_mv[o_block_y + blockshape_y][o_block_x - 1][0] + 2048) >> 12;
predictor->point[*prednum].y = (mvScale * col_mv[o_block_y + blockshape_y][o_block_x - 1][1] + 2048) >> 12;
*prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
}
}
// Up
if (block_available_up)
{
predictor->point[*prednum].x = (mvScale * col_mv[o_block_y - 1][o_block_x][0] + 2048) >> 12;
predictor->point[*prednum].y = (mvScale * col_mv[o_block_y - 1][o_block_x][1] + 2048) >> 12;
*prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
}
// Up - Right
if (block_available_right)
{
predictor->point[*prednum].x = (mvScale * col_mv[o_block_y][o_block_x + blockshape_x][0] + 2048) >> 12;
predictor->point[*prednum].y = (mvScale * col_mv[o_block_y][o_block_x + blockshape_x][1] + 2048) >> 12;
*prednum += ((predictor->point[*prednum].x != 0) || (predictor->point[*prednum].y != 0));
if (block_available_up)
{
predictor->point[*prednum].x = (mvScale * col_mv[o_block_y - 1][o_block_x + blockshape_x][0] + 2048) >> 12;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -