📄 macroblock.c
字号:
// chroma AC coeff, all zero fram start_scan
if (cbp>31)
{
block_y=4;
for (block_x=0; block_x < 4; block_x += 2)
{
for (j=block_y; j < block_y+2; j++)
{
jj=j/2;
j1=j-4;
for (i=block_x; i < block_x+2; i++)
{
ii=i/2;
i1=i%2;
{
coef_ctr=0;
level=1;
for(k=0;(k<16)&&(level!=0);k++)
{
if ( img->imod == INTRA_MB_OLD || img->imod == INTRA_MB_NEW)
{
currSE.context = 8; // for choosing context model
currSE.type = SE_CHR_AC_INTRA;
}
else
{
currSE.context = 7; // for choosing context model
currSE.type = SE_CHR_AC_INTER;
}
#if TRACE
snprintf(currSE.tracestring, TRACESTRING_SIZE, " AC Chroma ");
#endif
if(img->type == B_IMG_1 || img->type == B_IMG_MULT)
dP = &(currSlice->partArr[partMap[SE_BFRAME]]);
else
dP = &(currSlice->partArr[partMap[currSE.type]]);
if (inp->symbol_mode == UVLC || dP->bitstream->ei_flag)
currSE.mapping = linfo_levrun_inter;
else
currSE.reading = readRunLevelFromBuffer_CABAC;
dP->readSyntaxElement(&currSE,img,inp,dP);
level = currSE.value1;
run = currSE.value2;
len = currSE.len;
if (level != 0)
{
currMB->cbp_blk |= 1 << (16 + (j1<<1) + i1 + (block_x<<1) ) ;
coef_ctr=coef_ctr+run+1;
i0=SNGL_SCAN[coef_ctr][0];
j0=SNGL_SCAN[coef_ctr][1];
img->cof[i][j][i0][j0]=level*JQ1[QP_SCALE_CR[img->qp]];
}
}
}
}
}
}
}
}
/*!
************************************************************************
* \brief
* copy current MB from last MB
************************************************************************
*/
void decode_one_CopyMB(struct img_par *img,struct inp_par *inp)
{
int tmp_block[BLOCK_SIZE][BLOCK_SIZE];
int i, j, ii, jj, uv;
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
int ref_frame = currMB->ref_frame;
int mv_mul;
if(img->mv_res)
mv_mul=8;
else
mv_mul=4;
// get luma pixel *************************************************
for(j=0;j<MB_BLOCK_SIZE;j+=BLOCK_SIZE)
{
for(i=0;i<MB_BLOCK_SIZE;i+=BLOCK_SIZE)
{
get_block(ref_frame,(img->pix_x+i)*mv_mul,(img->pix_y+j)*mv_mul,img,tmp_block);
for(ii=0;ii<BLOCK_SIZE;ii++)
for(jj=0;jj<BLOCK_SIZE;jj++)
imgY[img->pix_y+j+jj][img->pix_x+i+ii]=tmp_block[ii][jj];
}
}
if (img->type==SP_IMG_1 || img->type==SP_IMG_MULT)
{
for(j=0;j<MB_BLOCK_SIZE;j++)
{
jj=img->pix_y+j;
for(i=0;i<MB_BLOCK_SIZE;i++)
{
ii=img->pix_x+i;
img->mpr[i][j]=imgY[jj][ii];
}
}
for (i=0; i < MB_BLOCK_SIZE; i+=BLOCK_SIZE)
for (j=0; j < MB_BLOCK_SIZE; j+=BLOCK_SIZE)
copyblock_sp(img,i,j);
}
// get chroma pixel **********************************************
for(uv=0;uv<2;uv++)
{
for(j=0;j<MB_BLOCK_SIZE/2;j++)
{
jj=img->pix_c_y+j;
for(i=0;i<MB_BLOCK_SIZE/2;i++)
{
ii=img->pix_c_x+i;
imgUV[uv][jj][ii]=mcef[ref_frame][uv][jj][ii];
}
}
if(img->type==SP_IMG_1 || img->type==SP_IMG_MULT)
{
for(j=0;j<MB_BLOCK_SIZE/2;j++)
{
jj=img->pix_c_y+j;
for(i=0;i<MB_BLOCK_SIZE/2;i++)
{
ii=img->pix_c_x+i;
img->mpr[i][j]=imgUV[uv][jj][ii];
}
}
for (j=4;j<6;j++)
for(i=0;i<4;i++)
for(ii=0;ii<4;ii++)
for(jj=0;jj<4;jj++)
img->cof[i][j][ii][jj]=0;
itrans_sp_chroma(img,2*uv);
for (j=4;j<6;j++)
{
for(i=0;i<2;i++)
{
itrans(img,i*4,(j-4)*4,2*uv+i,j);
for(ii=0;ii<4;ii++)
for(jj=0;jj<4;jj++)
{
imgUV[uv][img->pix_c_y+(j-4)*4+jj][img->pix_c_x+i*4+ii]=img->m7[ii][jj];
}
}
}
}
}
}
/*!
************************************************************************
* \brief
* decode one macroblock
************************************************************************
*/
int decode_one_macroblock(struct img_par *img,struct inp_par *inp)
{
int tmp_block[BLOCK_SIZE][BLOCK_SIZE];
int js[2][2];
int i=0,j=0,ii=0,jj=0,i1=0,j1=0,j4=0,i4=0;
int js0=0,js1=0,js2=0,js3=0,jf=0;
int uv;
int vec1_x=0,vec1_y=0,vec2_x=0,vec2_y=0;
int ioff,joff;
int ii0,jj0,ii1,jj1,if1,jf1,if0,jf0;
int mv_mul,f1,f2,f3,f4;
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
int ref_frame = currMB->ref_frame;
// set variables depending on mv_res
if(img->mv_res)
{
mv_mul=8;
f1=16;
f2=15;
}
else
{
mv_mul=4;
f1=8;
f2=7;
}
f3=f1*f1;
f4=f3/2;
// luma decoding **************************************************
// get prediction for INTRA_MB_16x16
if (currMB->mb_imode == INTRA_MB_NEW)
intrapred_luma_2(img,currMB->intra_pred_modes[0]);
for(j=0;j<MB_BLOCK_SIZE/BLOCK_SIZE;j++)
{
joff=j*4;
j4=img->block_y+j;
for(i=0;i<MB_BLOCK_SIZE/BLOCK_SIZE;i++)
{
ioff=i*4;
i4=img->block_x+i;
// get prediction for INTRA_MB_4x4
if(currMB->mb_imode == INTRA_MB_OLD)
{
if (intrapred(img,ioff,joff,i4,j4)==SEARCH_SYNC) // make 4x4 prediction block mpr from given prediction img->mb_mode
return SEARCH_SYNC; // bit error
}
// get motion prediction for INTER_MB
else if(currMB->mb_imode == INTRA_MB_INTER)
{
vec1_x = i4*4*mv_mul + img->mv[i4+BLOCK_SIZE][j4][0];
vec1_y = j4*4*mv_mul + img->mv[i4+4][j4][1];
get_block(ref_frame,vec1_x,vec1_y,img,tmp_block);
for(ii=0;ii<BLOCK_SIZE;ii++)
for(jj=0;jj<BLOCK_SIZE;jj++)
img->mpr[ii+ioff][jj+joff] = tmp_block[ii][jj];
}
if ((img->type==SP_IMG_1 || img->type==SP_IMG_MULT) && (currMB->mb_imode == INTRA_MB_INTER))
itrans_sp(img,ioff,joff,i,j);
else itrans(img,ioff,joff,i,j); // use DCT transform and make 4x4 block m7 from prediction block mpr
for(ii=0;ii<BLOCK_SIZE;ii++)
{
for(jj=0;jj<BLOCK_SIZE;jj++)
{
imgY[j4*BLOCK_SIZE+jj][i4*BLOCK_SIZE+ii]=img->m7[ii][jj]; // contruct picture from 4x4 blocks
}
}
}
}
// chroma decoding *******************************************************
for(uv=0;uv<2;uv++)
{
if (img->imod==INTRA_MB_OLD || img->imod==INTRA_MB_NEW)// intra mode
{
int mb_available_up = (currMB->mb_available[0][1] != NULL);
int mb_available_left = (currMB->mb_available[1][0] != NULL);
if(img->UseConstrainedIntraPred)
{
const int mb_nr = img->current_mb_nr;
const int mb_width = img->width/MB_BLOCK_SIZE;
if (mb_available_up && (img->intra_mb[mb_nr-mb_width] ==0))
mb_available_up = 0;
if (mb_available_left && (img->intra_mb[mb_nr-1] ==0))
mb_available_left = 0;
}
js0=0;
js1=0;
js2=0;
js3=0;
for(i=0;i<4;i++)
{
if(mb_available_up)
{
js0=js0+imgUV[uv][img->pix_c_y-1][img->pix_c_x+i];
js1=js1+imgUV[uv][img->pix_c_y-1][img->pix_c_x+i+4];
}
if(mb_available_left)
{
js2=js2+imgUV[uv][img->pix_c_y+i][img->pix_c_x-1];
js3=js3+imgUV[uv][img->pix_c_y+i+4][img->pix_c_x-1];
}
}
if(mb_available_up && mb_available_left)
{
js[0][0]=(js0+js2+4)/8;
js[1][0]=(js1+2)/4;
js[0][1]=(js3+2)/4;
js[1][1]=(js1+js3+4)/8;
}
if(mb_available_up && !mb_available_left)
{
js[0][0]=(js0+2)/4;
js[1][0]=(js1+2)/4;
js[0][1]=(js0+2)/4;
js[1][1]=(js1+2)/4;
}
if(mb_available_left && !mb_available_up)
{
js[0][0]=(js2+2)/4;
js[1][0]=(js2+2)/4;
js[0][1]=(js3+2)/4;
js[1][1]=(js3+2)/4;
}
if(!mb_available_up && !mb_available_left)
{
js[0][0]=128;
js[1][0]=128;
js[0][1]=128;
js[1][1]=128;
}
}
for (j=4;j<6;j++)
{
joff=(j-4)*4;
j4=img->pix_c_y+joff;
for(i=0;i<2;i++)
{
ioff=i*4;
i4=img->pix_c_x+ioff;
// make pred
if(img->imod==INTRA_MB_OLD|| img->imod==INTRA_MB_NEW)// intra
{
for(ii=0;ii<4;ii++)
for(jj=0;jj<4;jj++)
{
img->mpr[ii+ioff][jj+joff]=js[i][j-4];
}
}
else
{
for(jj=0;jj<4;jj++)
{
jf=(j4+jj)/2;
for(ii=0;ii<4;ii++)
{
if1=(i4+ii)/2;
i1=(img->pix_c_x+ii+ioff)*f1+img->mv[if1+4][jf][0];
j1=(img->pix_c_y+jj+joff)*f1+img->mv[if1+4][jf][1];
ii0=max (0, min (i1/f1, img->width_cr-1));
jj0=max (0, min (j1/f1, img->height_cr-1));
ii1=max (0, min ((i1+f2)/f1, img->width_cr-1));
jj1=max (0, min ((j1+f2)/f1, img->height_cr-1));
if1=(i1 & f2);
jf1=(j1 & f2);
if0=f1-if1;
jf0=f1-jf1;
img->mpr[ii+ioff][jj+joff]=(if0*jf0*mcef[ref_frame][uv][jj0][ii0]+
if1*jf0*mcef[ref_frame][uv][jj0][ii1]+
if0*jf1*mcef[ref_frame][uv][jj1][ii0]+
if1*jf1*mcef[ref_frame][uv][jj1][ii1]+f4)/f3;
}
}
}
if ((img->type!=SP_IMG_1 && img->type!=SP_IMG_MULT) || (currMB->mb_imode != INTRA_MB_INTER))
{
itrans(img,ioff,joff,2*uv+i,j);
for(ii=0;ii<4;ii++)
for(jj=0;jj<4;jj++)
{
imgUV[uv][j4+jj][i4+ii]=img->m7[ii][jj];
}
}
}
}
if((img->type==SP_IMG_1 || img->type==SP_IMG_MULT) && (currMB->mb_imode == INTRA_MB_INTER))
{
itrans_sp_chroma(img,2*uv);
for (j=4;j<6;j++)
{
joff=(j-4)*4;
j4=img->pix_c_y+joff;
for(i=0;i<2;i++)
{
ioff=i*4;
i4=img->pix_c_x+ioff;
itrans(img,ioff,joff,2*uv+i,j);
for(ii=0;ii<4;ii++)
for(jj=0;jj<4;jj++)
{
imgUV[uv][j4+jj][i4+ii]=img->m7[ii][jj];
}
}
}
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -