📄 macroblock.c
字号:
for (jjj=0;jjj<4;jjj++)
img->cof[i][j][iii][jjj]=0;
}
img_block_y = img->block_y;
if (zeroMotionAbove || zeroMotionLeft)
{
for(i=0;i<2;i++)
for(j=0;j<2;j++)
{
img->mv[img->block_x+i+BLOCK_SIZE][img->block_y+j][0] = 0;
img->mv[img->block_x+i+BLOCK_SIZE][img->block_y+j][1] = 0;
}
}
else
{
SetMotionVectorPredictor (img, pmv, pmv+1, 0, refFrArr, img->mv, 0, 0, 16, 16, 0, 0);//Lou 1016
for(i=0;i<2;i++)
for(j=0;j<2;j++)
{
img->mv[img->block_x+i+BLOCK_SIZE][img_block_y+j][0] = pmv[0];
img->mv[img->block_x+i+BLOCK_SIZE][img_block_y+j][1] = pmv[1];
}
}
for (j=0; j<2;j++)
for (i=0; i<2;i++)
{
refFrArr_frm[img->block_y+j][img->block_x+i] = 0;
}
return DECODE_MB;
}
readReferenceIndex(img, inp);
readMotionVector (img, inp);
// !! start shenyanfei cjw
//if((!IS_INTRA(currMB)) && (img->slice_weighting_flag == 1) && (img->mb_weighting_flag == 0)){ //cjw 20051219
//if((!IS_INTRA(currMB)) && (img->slice_weighting_flag == 1) && (img->mb_weighting_flag == 1)&&(!IS_COPY(currMB))&&(!IS_DIRECT(currMB))){ //cjw20051230 for skip MB
if((!IS_INTRA(currMB)) && (img->slice_weighting_flag == 1) && (img->mb_weighting_flag == 1)&&(!IS_COPY(currMB))){ //cjw20060321 skip no WP, direct WP
img->weighting_prediction = u_v(1,"MB weighting_prediction"); //cjw 20051219
}
// !! end shenyanfei cjw
// read CBP if not new intra mode
if (!(IS_COPY (currMB) || (IS_DIRECT (currMB) && img->cod_counter >= 0)))
{
if (IS_OLDINTRA (currMB) || currMB->mb_type == SI4MB ) currSE.type = SE_CBP_INTRA;
else currSE.type = SE_CBP_INTER;
if (IS_OLDINTRA (currMB) || currMB->mb_type == SI4MB)
currSE.mapping = linfo_cbp_intra;
else
currSE.mapping = linfo_cbp_inter;
#if TRACE
snprintf(currSE.tracestring, TRACESTRING_SIZE, "CBP");
#endif
if(img->type==I_IMG||IS_INTER(currMB)) // qhg
{
currSE.golomb_maxlevels = 0;
readSyntaxElement_UVLC(&currSE,inp);
currMB->cbp = currSE.value1;
}
// Delta quant only if nonzero coeffs
if (!fixqp&&currMB->cbp !=0)
{
if (IS_INTER (currMB)) currSE.type = SE_DELTA_QUANT_INTER;
else currSE.type = SE_DELTA_QUANT_INTRA;
currSE.mapping = linfo_se;
#if TRACE
snprintf(currSE.tracestring, TRACESTRING_SIZE, "Delta quant ");
#endif
readSyntaxElement_UVLC(&currSE,inp);
currMB->delta_quant = currSE.value1;
img->qp= (img->qp-MIN_QP+currMB->delta_quant+(MAX_QP-MIN_QP+1))%(MAX_QP-MIN_QP+1)+MIN_QP; //discussed by cjw AVS Zhuhai 20070123
}
if (fixqp)
{
currMB->delta_quant = 0;
img->qp= (img->qp-MIN_QP+currMB->delta_quant+(MAX_QP-MIN_QP+1))%(MAX_QP-MIN_QP+1)+MIN_QP;
}
}
// read CBP and Coeffs ***************************************************************
readCBPandCoeffsFromNAL (img,inp);
return DECODE_MB;
}
void read_ipred_block_modes(struct img_par *img,struct inp_par *inp,int b8)
{
int bi,bj,dec;
SyntaxElement currSE;
Macroblock *currMB;
int j2;
int mostProbableIntraPredMode;
int upIntraPredMode;
int leftIntraPredMode;
int IntraChromaPredModeFlag;
int MBRowSize = img->width / MB_BLOCK_SIZE;
currMB=mb_data+img->current_mb_nr;//current_mb_nr;
IntraChromaPredModeFlag = IS_INTRA(currMB);
currSE.type = SE_INTRAPREDMODE;
#if TRACE
strncpy(currSE.tracestring, "Ipred Mode", TRACESTRING_SIZE);
#endif
if(b8<4)
{
if( currMB->b8mode[b8]==IBLOCK )
{
IntraChromaPredModeFlag = 1;
//get from stream
readSyntaxElement_Intra8x8PredictionMode(&currSE);
//get from array and decode
bi = img->block_x + (b8&1);
bj = img->block_y + (b8/2);
upIntraPredMode = img->ipredmode[bi+1][bj];
leftIntraPredMode = img->ipredmode[bi][bj+1];
mostProbableIntraPredMode = (upIntraPredMode < 0 || leftIntraPredMode < 0) ? DC_PRED : upIntraPredMode < leftIntraPredMode ? upIntraPredMode : leftIntraPredMode;
dec = (currSE.value1 == -1) ? mostProbableIntraPredMode : currSE.value1 + (currSE.value1 >= mostProbableIntraPredMode);
//set
img->ipredmode[1+bi][1+bj]=dec;
j2 = bj;
}
}
else if( b8==4&&currMB->b8mode[b8-3]==IBLOCK)
{
currSE.type = SE_INTRAPREDMODE;
#if TRACE
strncpy(currSE.tracestring, "Chroma intra pred mode", TRACESTRING_SIZE);
#endif
currSE.mapping = linfo_ue;
readSyntaxElement_UVLC(&currSE,inp);
currMB->c_ipred_mode = currSE.value1;
if (currSE.value1 < DC_PRED_8 || currSE.value1 > PLANE_8)
{
printf("%d\n", img->current_mb_nr);
error("illegal chroma intra pred mode!\n", 600);
}
}
}
/*
*************************************************************************
* Function:Set context for reference frames
* Input:
* Output:
* Return:
* Attention:
*************************************************************************
*/
int BType2CtxRef (int btype)
{
if (btype<4)
return 0;
else
return 1;
}
/*
*************************************************************************
* Function:
* Input:
* Output:
* Return:
* Attention:
*************************************************************************
*/
void readReferenceIndex(struct img_par *img, struct inp_par *inp)
{
int i,j,k;
// int mb_nr = img->current_mb_nr; //GB Falsch
Macroblock *currMB = &mb_data[img->current_mb_nr];
SyntaxElement currSE;
int bframe = (img->type==B_IMG);
int partmode = (IS_P8x8(currMB)?4:currMB->mb_type);
int step_h0 = BLOCK_STEP [partmode][0];
int step_v0 = BLOCK_STEP [partmode][1];
int i0, j0, refframe;
int **fwRefFrArr = img->fw_refFrArr;
int **bwRefFrArr = img->bw_refFrArr;
int ***fw_mv = img->fw_mv;
int ***bw_mv = img->bw_mv;
//int **moving_block_dir = moving_block;
int flag_mode;
// If multiple ref. frames, read reference frame for the MB *********************************
flag_mode = 0;
currSE.type = SE_REFFRAME;
currSE.mapping = linfo_ue;
if(currMB->mb_type!=I4MB)
{
step_h0 = (BLOCK_STEP[IS_P8x8(currMB) ? 4 : currMB->mb_type][0]);
step_v0 = (BLOCK_STEP[IS_P8x8(currMB) ? 4 : currMB->mb_type][1]);
}
// !! shenyanfei
for (j0=0; j0<2; )
{
if((currMB->mb_type==I4MB&&j0==0))
{ j0 += 1; continue;}
for (i0=0; i0<2; )
{
k=2*j0+i0;
if ((currMB->b8pdir[k]==0 || currMB->b8pdir[k]==2) && currMB->b8mode[k]!=0)
{
img->subblock_x = i0;
img->subblock_y = j0;
if ((!picture_reference_flag&&img->type==P_IMG && img->types!=I_IMG) || (/*modifyby xfwang 2004.7.29*/!picture_reference_flag&&!img->picture_structure && img->types!=I_IMG)) //&&!img->allrefzero)//del by xfwang 2004.7.29
{
#if TRACE
strncpy(currSE.tracestring, "Fwd ref frame no ", TRACESTRING_SIZE);
#endif
currSE.context = BType2CtxRef (currMB->b8mode[k]);
if(img->picture_structure || bframe)
currSE.len = 1;
else
currSE.len = 2;
readSyntaxElement_FLC(&currSE);
refframe = currSE.value1;
}
else
{
refframe = 0;
}
if (!bframe)
{
for (j=j0; j<j0+step_v0;j++)
for (i=i0; i<i0+step_h0;i++)
refFrArr[img->block_y+j][img->block_x+i] = refframe;
}
else // !! for B frame shenyanfei
{
for (j=j0; j<j0+step_v0;j++)
for (i=i0; i<i0+step_h0;i++)
img->fw_refFrArr[img->block_y+j][img->block_x+i] = refframe;
if (currMB->b8pdir[k]==2 && !img->picture_structure)
{
for (j=j0; j<j0+step_v0;j++)
for (i=i0; i<i0+step_h0;i++)
img->bw_refFrArr[img->block_y+j][img->block_x+i] = 1-refframe;
}
}
}
i0+=max(1,step_h0);
}
j0+=max(1,step_v0);
}
for (j0=0; j0<2; )
{
if((currMB->mb_type==I4MB&&j0==0))
{ j0 += 1; continue;}
for (i0=0; i0<2; )
{
k=2*j0+i0;
if ((currMB->b8pdir[k]==1) && currMB->b8mode[k]!=0)
{
img->subblock_x = i0;
img->subblock_y = j0;
if (img->type==B_IMG && !img->picture_structure&&/*modifyby xfwang 2004.7.29*/!picture_reference_flag) //&&!img->allrefzero)//del by xfwang 2004.7.29
{
#if TRACE
strncpy(currSE.tracestring, "Bwd ref frame no ", TRACESTRING_SIZE);
#endif
currSE.context = BType2CtxRef (currMB->b8mode[k]);
if(img->picture_structure || bframe)
currSE.len = 1;
else
currSE.len = 2;
readSyntaxElement_FLC(&currSE);
refframe = currSE.value1;
}
else
{
refframe = 0;
}
for (j=j0; j<j0+step_v0;j++)
for (i=i0; i<i0+step_h0;i++)
img->bw_refFrArr[img->block_y+j][img->block_x+i] = refframe;
}
i0+=max(1,step_h0);
}
j0+=max(1,step_v0);
}
}
/*
*************************************************************************
* Function:
* Input:
* Output:
* Return:
* Attention:
*************************************************************************
*/
void readMotionVector(struct img_par *img, struct inp_par *inp)
{
int i,j,k,l,m,n;
int step_h,step_v;
int curr_mvd;
// int mb_nr = img->current_mb_nr; //GB Falsch
Macroblock *currMB = &mb_data[img->current_mb_nr];
SyntaxElement currSE;
int bframe = (img->type==B_IMG);
int partmode = (IS_P8x8(currMB)?4:currMB->mb_type);
int step_h0 = BLOCK_STEP [partmode][0];
int step_v0 = BLOCK_STEP [partmode][1];
int mv_mode, i0, j0, refframe;
int pmv[2];
int j4, i4, ii,jj;
int vec;
int iTRb,iTRp,iTRd;
int mv_scale;
int frame_no_next_P, frame_no_B, delta_P;
int ref;
int img_block_y;
int use_scaled_mv;
int fw_refframe,current_tr;
int **fwRefFrArr = img->fw_refFrArr;
int **bwRefFrArr = img->bw_refFrArr;
int ***fw_mv = img->fw_mv;
int ***bw_mv = img->bw_mv;
int scale_refframe,iTRp1,bw_ref;
if (bframe && IS_P8x8 (currMB))
{
for (i=0;i<4;i++)
{
if (currMB->b8mode[i] == 0)
{
for(j=i/2;j<i/2+1;j++)
{
for(k=(i%2);k<(i%2)+1;k++)
{
//sw
img->fw_refFrArr[img->block_y + j][img->block_x + k] = 0;
img->bw_refFrArr[img->block_y + j][img->block_x + k] = 0;
}
}
}
}
}
//===== READ FORWARD MOTION VECTORS =====
currSE.type = SE_MVD;
currSE.mapping = linfo_se;
for (j0=0; j0<2; )
{
if(currMB->mb_type!=I4MB)
{
step_h0 = (BLOCK_STEP[(currMB->mb_type==P8x8)? 4 : currMB->mb_type][0]);
step_v0 = (BLOCK_STEP[(currMB->mb_type==P8x8)? 4 : currMB->mb_type][1]);
}
if((currMB->mb_type==I4MB&&j0==0)) // for by jhzheng [2004/08/02]
{ j0 += 1; continue;}
//{break;}
for (i0=0; i0<2; )
{
k=2*j0+i0;
if ((currMB->b8pdir[k]==0 || currMB->b8pdir[k]==2) && (currMB->b8mode[k] !=0))//has forward vector
{
mv_mode = currMB->b8mode[k];
step_h = BLOCK_STEP [mv_mode][0];
step_v = BLOCK_STEP [mv_mode][1];
if (!bframe) refframe = refFrArr [img->block_y+j0][img->block_x+i0];
else refframe = img->fw_refFrArr[img->block_y+j0][img->block_x+i0];
for (j=j0; j<j0+step_v0; j+=step_v)
for (i=i0; i<i0+step_h0; i+=step_h)
{
j4 = img->block_y+j;
i4 = img->block_x+i;
// first make mv-prediction
if (!bframe)
SetMotionVectorPredictor (img, pmv, pmv+1, refframe, refFrArr, img->mv, i, j, 8*step_h, 8*step_v, 0, 0);//Lou 1016
else
SetMotionVectorPredictor (img, pmv, pmv+1, refframe, img->fw_refFrArr, img->fw_mv, i, j, 8*step_h, 8*step_v, 0, 0);//Lou 1016
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -