📄 block.c
字号:
break;
case HOR_PRED_8:
if (!block_available_left)
error("unexpected HOR_PRED_8 chroma intra prediction mode",-1);
for (y=0;y<CBS;y++)
{
vlineU[y] = imgUV[0][img_cy+y][img_cx-1];
vlineV[y] = imgUV[1][img_cy+y][img_cx-1];
}
for (y=0;y<CBS;y++)
{
for (x=0;x<CBS;x++)
{
pgcurrMB->pred_sample[4][b4][x][y] = vlineU[y];
pgcurrMB->pred_sample[5][b4][x][y] = vlineV[y];
}
}
break;
case VERT_PRED_8:
if (!block_available_up)
error("unexpected VERT_PRED_8 chroma intra prediction mode",-1);
for (x=0;x<CBS;x++)
{
hlineU[x] = imgUV[0][img_cy-1][img_cx+x];
hlineV[x] = imgUV[1][img_cy-1][img_cx+x];
}
for (y=0;y<CBS;y++)
{
for (x=0;x<CBS;x++)
{
pgcurrMB->pred_sample[4][b4][x][y] = hlineU[x];
pgcurrMB->pred_sample[5][b4][x][y] = hlineV[x];
}
}
break;
default:
error("intrapred_chroma_4x4:illegal chroma intra prediction mode", 600);
break;
}
#if TRACE
for(y=0;y<CBS;y++)
for(x=0;x<CBS;x++)
{
MB_intrapred_UV[0][((b4>>1)<<2)+y][((b4 &1)<<2)+x] = pgcurrMB->pred_sample[4][b4][x][y];
MB_intrapred_UV[1][((b4>>1)<<2)+y][((b4 &1)<<2)+x] = pgcurrMB->pred_sample[5][b4][x][y];
}
#endif
}
/*!
************************************************************************
* \brief
* Set motion vector predictor
************************************************************************
*/
void SetMotionVectorPredictor(int *pmv_x,
int *pmv_y,
int ref_frame,
int block_x,
int block_y,
int blockshape_x,
int blockshape_y,
int ref)
{
int mb_x = 4*block_x;
int mb_y = 4*block_y;
int pic_block_x = pgImage->block4_x + block_x;
int pic_block_y = pgImage->block4_y + block_y;
int mb_width = pgImage->width/16;
//WJP FOR SLICE
int mb_available_up = (pgImage->mb_y == 0) ? 0 : (pgcurrMB->slice_nr == mb_data[pgImage->current_mb_nr-mb_width].slice_nr);
int mb_available_left = (pgImage->mb_x == 0) ? 0 : (pgcurrMB->slice_nr == mb_data[pgImage->current_mb_nr-1].slice_nr);
int mb_available_upleft = (pgImage->mb_x == 0 || pgImage->mb_y == 0) ? 0 :
(pgcurrMB->slice_nr == mb_data[pgImage->current_mb_nr-mb_width-1].slice_nr);
int mb_available_upright = (pgImage->mb_x >= mb_width-1 || pgImage->mb_y == 0) ? 0 :
(pgcurrMB->slice_nr == mb_data[pgImage->current_mb_nr-mb_width+1].slice_nr);
//WJP END
int block_available_up, block_available_left, block_available_upright, block_available_upleft;
int mv_a, mv_b, mv_c, mv_d, pred_vec[2];
int mvPredType, rFrameL, rFrameU, rFrameUR;
int hv;
int ***tmp_mv = pgImage->mv;
int a_c, b_c, a_b;//qhg
int ABC;//qhg
int a[2],b[2],c[2];//qhg
/* D B C */
/* A X */
/* 1 A, B, D are set to 0 if unavailable */
/* 2 If C is not available it is replaced by D */
block_available_up = mb_available_up || (mb_y > 0);
block_available_left = mb_available_left || (mb_x > 0);
if (mb_y > 0)
{
if (mb_x < 8) // first column of 8x8 blocks
{
if (mb_y==8)
{
if (blockshape_x == 16) block_available_upright = 0;
else block_available_upright = 1;
}
else
{
if (mb_x+blockshape_x != 8) block_available_upright = 1;
else block_available_upright = 0;
}
}
else
{
if (mb_x+blockshape_x != 16) block_available_upright = 1;
else block_available_upright = 0;
}
}
else if (mb_x+blockshape_x != MB_BLOCK_SIZE)
{
block_available_upright = block_available_up;
}
else
{
block_available_upright = mb_available_upright;
}
if (mb_x > 0)
{
block_available_upleft = (mb_y > 0 ? 1 : mb_available_up);
}
else if (mb_y > 0)
{
block_available_upleft = mb_available_left;
}
else
{
block_available_upleft = mb_available_upleft;
}
mvPredType = MVPRED_MEDIAN;
// rFrameL = block_available_left ? refFrArr[pic_block_y] [pic_block_x-1 ] : -1;
rFrameL = block_available_left ? refFrArr[pic_block_y+blockshape_y/4 -1] [pic_block_x-1] : -1; //JX 05-4-1
rFrameU = block_available_up ? refFrArr[pic_block_y-1][pic_block_x] : -1;
//added by MZ
if(block_available_upright)
block_available_upright = block_available_upright && (refFrArr[pic_block_y-1][pic_block_x+blockshape_x/4]!=-1);
if(block_available_upleft)
block_available_upleft = block_available_upleft && (refFrArr[pic_block_y-1][pic_block_x-1 ]!=-1);
rFrameUR = block_available_upright ? refFrArr[pic_block_y-1][pic_block_x+blockshape_x/4] :
block_available_upleft ? refFrArr[pic_block_y-1][pic_block_x-1] : -1;
/* Prediction if only one of the neighbors uses the reference frame
* we are checking
*/
if(rFrameL == ref_frame && rFrameU != ref_frame && rFrameUR != ref_frame) mvPredType = MVPRED_L;
else if(rFrameL != ref_frame && rFrameU == ref_frame && rFrameUR != ref_frame) mvPredType = MVPRED_U;
else if(rFrameL != ref_frame && rFrameU != ref_frame && rFrameUR == ref_frame) mvPredType = MVPRED_UR;
// Directional predictions
else if(blockshape_x == 8 && blockshape_y == 16)
{
if(mb_x == 0)
{
if(rFrameL == ref_frame)
mvPredType = MVPRED_L;
}
else
{
if(rFrameUR == ref_frame)
mvPredType = MVPRED_UR;
}
}
else if(blockshape_x == 16 && blockshape_y == 8)
{
if(mb_y == 0)
{
if(rFrameU == ref_frame)
mvPredType = MVPRED_U;
}
else
{
if(rFrameL == ref_frame)
mvPredType = MVPRED_L;
}
}
//#define MIN(a,b,c) (a<b?a<c?a:c:b<c?b:c)//qhg
#define MAX(a,b,c) (a>b?a>c?a:c:b>c?b:c)//WJP FOR MV prediction 050320
a_b=a_c=b_c=0;
//printf("%d \n" , pgImage->current_mb_nr);
for (hv=0; hv < 2; hv++)
{
//mv_a = block_available_left ? tmp_mv[4+pic_block_x-1 ][pic_block_y ][hv] : 0;
mv_a = block_available_left ? tmp_mv[4+pic_block_x-1][pic_block_y + (blockshape_y/4) -1 ][hv]: 0;
mv_b = block_available_up ? tmp_mv[4+pic_block_x ][pic_block_y-1][hv] : 0;
mv_d = block_available_upleft ? tmp_mv[4+pic_block_x-1 ][pic_block_y-1][hv] : 0;
mv_c = block_available_upright ? tmp_mv[4+pic_block_x+blockshape_x/4][pic_block_y-1][hv] : mv_d;
//qhg
a[hv] = mv_a;
b[hv] = mv_b;
c[hv] = mv_c;
a_b+= abs(mv_a-mv_b);
a_c+= abs(mv_a-mv_c);
b_c+= abs(mv_b-mv_c);
switch (mvPredType)
{
case MVPRED_MEDIAN:
if(hv == 1)
{
ABC = MAX(a_b,a_c,b_c);
if(ABC == a_b)
{
pred_vec[0] = c[0];
pred_vec[1] = c[1];
}
else if(ABC == b_c)
{
pred_vec[0] = a[0];
pred_vec[1] = a[1];
}
else
{
pred_vec[0] = b[0];
pred_vec[1] = b[1];
}
}
//WJP END
break;
case MVPRED_L:
pred_vec[hv] = mv_a;
break;
case MVPRED_U:
pred_vec[hv] = mv_b;
break;
case MVPRED_UR:
pred_vec[hv] = mv_c;
break;
default:
break;
}
}
/* MV predictor */
*pmv_x = pred_vec[0];
*pmv_y = pred_vec[1];
}
/*!
***********************************************************************
* \brief
* Find Skip Motion Vector for SKIP_MB
***********************************************************************
*/
void FindSkipMVandRef()
{
int i, j, iii, jjj, pmv[2];
int ***tmp_mv = pgImage->mv;
int mb_available_up = (pgImage->mb_y == 0) ? 0 : (pgcurrMB->slice_nr == mb_data[pgImage->current_mb_nr-pgImage->width/16].slice_nr);
int mb_available_left = (pgImage->mb_x == 0) ? 0 : (pgcurrMB->slice_nr == mb_data[pgImage->current_mb_nr-1].slice_nr);
int zeroMotionAbove = !mb_available_up ? 1 : refFrArr[pgImage->block4_y-1][pgImage->block4_x] == 0 && tmp_mv[4+pgImage->block4_x ][pgImage->block4_y-1][0] == 0 && tmp_mv[4+pgImage->block4_x ][pgImage->block4_y-1][1] == 0 ? 1 : 0;
//int zeroMotionLeft = !mb_available_left? 1 : refFrArr[pgImage->block4_y][pgImage->block4_x-1] == 0 && tmp_mv[4+pgImage->block4_x-1][pgImage->block4_y][0] == 0 && tmp_mv[4+pgImage->block4_x-1][pgImage->block4_y][1] == 0 ? 1 : 0;
//MZ 050403
int zeroMotionLeft = !mb_available_left? 1 : refFrArr[pgImage->block4_y+4-1][pgImage->block4_x-1] == 0 && tmp_mv[4+pgImage->block4_x-1][pgImage->block4_y+4-1][0] == 0 && tmp_mv[4+pgImage->block4_x-1][pgImage->block4_y+4-1][1] == 0 ? 1 : 0;
int img_block_y;
pgcurrMB->cbp = 0;
for (i=0;i<BLOCK_SIZE;i++)
{ // reset luma coeffs
for (j=0;j<BLOCK_SIZE;j++)
for(iii=0;iii<BLOCK_SIZE;iii++)
for(jjj=0;jjj<BLOCK_SIZE;jjj++)
pgImage->cof[i][j][iii][jjj]=0;
}
for (j=4;j<6;j++)
{ // reset chroma coeffs
for (i=0;i<4;i++)
for (iii=0;iii<4;iii++)
for (jjj=0;jjj<4;jjj++)
pgImage->cof[i][j][iii][jjj]=0;
}
img_block_y = pgImage->block4_y;
if (zeroMotionAbove || zeroMotionLeft)
{
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
pgImage->mv[pgImage->block4_x+i+BLOCK_SIZE][pgImage->block4_y+j][0] = 0;
pgImage->mv[pgImage->block4_x+i+BLOCK_SIZE][pgImage->block4_y+j][1] = 0;
}
}
else
{
SetMotionVectorPredictor (pmv, pmv+1, 0, 0, 0, 16, 16, 0);//Lou 1016
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
pgImage->mv[pgImage->block4_x+i+BLOCK_SIZE][img_block_y+j][0] = pmv[0];
pgImage->mv[pgImage->block4_x+i+BLOCK_SIZE][img_block_y+j][1] = pmv[1];
}
}
for (j=0; j<4;j++)
for (i=0; i<4;i++)
{
refFrArr[pgImage->block4_y+j][pgImage->block4_x+i] = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -