?? macroblock.c
字號(hào):
if (level != 0) /* leave if len=1 */
{
coef_ctr=coef_ctr+run+1;
i0=DBL_SCAN[coef_ctr][0][scan_loop_ctr];
j0=DBL_SCAN[coef_ctr][1][scan_loop_ctr];
img->cof[i][j][i0][j0]=level*JQ1[img->qp];
if (level!=0)
{
loopb[img->block_x+i+1][img->block_y+j+1]=max(loopb[img->block_x+i+1][img->block_y+j+1],2);
loopb[img->block_x+i ][img->block_y+j+1]=max(loopb[img->block_x+i ][img->block_y+j+1],1);
loopb[img->block_x+i+1][img->block_y+j ]=max(loopb[img->block_x+i+1][img->block_y+j ],1);
loopb[img->block_x+i+2][img->block_y+j+1]=max(loopb[img->block_x+i+2][img->block_y+j+1],1);
loopb[img->block_x+i+1][img->block_y+j+2]=max(loopb[img->block_x+i+1][img->block_y+j+2],1);
}
}
}
}
}
}
}
}
}
}
for (j=4;j<6;j++) /* reset all chroma coeffs before read */
for (i=0;i<4;i++)
for (iii=0;iii<4;iii++)
for (jjj=0;jjj<4;jjj++)
img->cof[i][j][iii][jjj]=0;
m2=img->mb_x*2;
jg2=img->mb_y*2;
/* chroma 2x2 DC coeff */
if(cbp>15)
{
for (ll=0;ll<3;ll+=2)
{
for (i=0;i<4;i++)
img->cofu[i]=0;
coef_ctr=-1;
//len=0;
level=1;
//for(k=0;(k<5)&&(len!=1);k++)
for(k=0;(k<5)&&(level!=0);k++)
{
if (inp->symbol_mode == UVLC)
currSE.mapping = linfo_levrun_c2x2;
else
currSE.reading = readRunLevelFromBuffer_CABAC;
if ( img->imod == INTRA_MB_OLD || img->imod == INTRA_MB_NEW)
{
currSE.context = 6; // for choosing context model
currSE.type = SE_CHR_DC_INTRA;
}
else
{
currSE.context = 5; // for choosing context model
currSE.type = SE_CHR_DC_INTER;
}
#if TRACE
sprintf(currSE.tracestring, " 2x2 DC Chroma ");
#endif
dP = &(currSlice->partArr[partMap[currSE.type]]);
dP->readSyntaxElement(&currSE,img,inp,dP);
level = currSE.value1;
run = currSE.value2;
len = currSE.len;
//if (len != 1)
// printf ("2x2 Chroma DC Coeff, mb %d, blkx, y %d %d level %d run %d len %d\n", img->current_mb_nr, block_x, block_y, level, run, len);
if (level != 0)
{
coef_ctr=coef_ctr+run+1;
// Bug: img->cofu has only 4 entries, hence coef_ctr MUST be <4 (which is
// caught by the assert(). If it is bigger than 4, it starts patching the
// img->predmode pointer, which leads to bugs later on.
assert (coef_ctr < 4);
img->cofu[coef_ctr]=level*JQ1[QP_SCALE_CR[img->qp]];
if (level != 0 );
{
for (j=0;j<2;j++)
{
for (i=0;i<2;i++)
{
loopc[m2+i+1][jg2+j+1]=max(loopc[m2+i+1][jg2+j+1],2);
}
}
for (i=0;i<2;i++)
{
loopc[m2+i+1][jg2 ]=max(loopc[m2+i+1][jg2 ],1);
loopc[m2+i+1][jg2+3 ]=max(loopc[m2+i+1][jg2+3 ],1);
loopc[m2 ][jg2+i+1]=max(loopc[m2 ][jg2+i+1],1);
loopc[m2+3 ][jg2+i+1]=max(loopc[m2+3 ][jg2+i+1],1);
}
}
}
}
img->cof[0+ll][4][0][0]=(img->cofu[0]+img->cofu[1]+img->cofu[2]+img->cofu[3])/2;
img->cof[1+ll][4][0][0]=(img->cofu[0]-img->cofu[1]+img->cofu[2]-img->cofu[3])/2;
img->cof[0+ll][5][0][0]=(img->cofu[0]+img->cofu[1]-img->cofu[2]-img->cofu[3])/2;
img->cof[1+ll][5][0][0]=(img->cofu[0]-img->cofu[1]-img->cofu[2]+img->cofu[3])/2;
}
}
/* 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;
//len=0;
level=1;
//for(k=0;(k<16)&&(len!=1);k++)
for(k=0;(k<16)&&(level!=0);k++)
{
if (inp->symbol_mode == UVLC)
currSE.mapping = linfo_levrun_inter;
else
currSE.reading = readRunLevelFromBuffer_CABAC;
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
sprintf(currSE.tracestring, " AC Chroma ");
#endif
dP = &(currSlice->partArr[partMap[currSE.type]]);
dP->readSyntaxElement(&currSE,img,inp,dP);
level = currSE.value1;
run = currSE.value2;
len = currSE.len;
// printf ("2x2 Chroma AC Coeff, mb %d, blkx, y %d %d level %d run %d len %d\n", img->current_mb_nr, block_x, block_y, level, run, len);
//if (len != 1)
if (level != 0)
{
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]];
if (level!=0)
{
loopc[m2+i1+1][jg2+j1+1]=max(loopc[m2+i1+1][jg2+j1+1],2);
loopc[m2+i1 ][jg2+j1+1]=max(loopc[m2+i1 ][jg2+j1+1],1);
loopc[m2+i1+1][jg2+j1 ]=max(loopc[m2+i1+1][jg2+j1 ],1);
loopc[m2+i1+2][jg2+j1+1]=max(loopc[m2+i1+2][jg2+j1+1],1);
loopc[m2+i1+1][jg2+j1+2]=max(loopc[m2+i1+1][jg2+j1+2],1);
}
}
}
}
}
}
}
}
}
/************************************************************************
*
* Name : decode_one_CopyMB()
*
* Description: copy current MB from last MB
*
************************************************************************/
void decode_one_CopyMB(struct img_par *img,struct inp_par *inp)
{
int i, j, ii, jj, uv, i3, j3;
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++)
{
jj=img->pix_y+j;
for(i=0;i<MB_BLOCK_SIZE;i++)
{
ii=img->pix_x+i;
imgY[jj][ii]=get_pixel(ref_frame,ii*mv_mul,jj*mv_mul,img);
// imgY[jj][ii]=mref[ref_frame][jj*4][ii*4];
}
}
/* 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];
}
}
}
/* set loop filter ************************************************/
for (i=0;i<4;i++)
{
ii=img->block_x+i;
i3=ii/2;
for (j=0;j<4;j++)
{
jj=img->block_y+j;
j3=jj/2;
if (((img->mv[ii-1+4][jj][0]/4)!=0||(img->mv[ii-1+4][jj][1]/4!=0)) && ii > 0)
{
loopb[ii ][jj+1]=max(loopb[ii ][jj+1],1);
loopb[ii+1][jj+1]=max(loopb[ii+1][jj+1],1);
loopc[i3 ][j3+1]=max(loopc[i3 ][j3+1],1);
loopc[i3+1][j3+1]=max(loopc[i3+1][j3+1],1);
}
if (jj > 0 &&((img->mv[ii+4][jj-1][0]/4!=0)||(img->mv[ii+4][jj-1][1]/4!=0)))
{
loopb[ii+1][jj ]=max(loopb[ii+1][jj ],1);
loopb[ii+1][jj+1]=max(loopb[ii+1][jj+1],1);
loopc[i3+1][j3 ]=max(loopc[i3+1][j3 ],1);
loopc[i3+1][j3+1]=max(loopc[i3+1][j3+1],1);
}
}
}
}
/************************************************************************
*
* Name : decode_one_macroblock()
*
* Description: decode one macroblock
*
************************************************************************/
int decode_one_macroblock(struct img_par *img,struct inp_par *inp)
{
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;
//const int ICBPTAB[6] = {0,16,32,15,31,47};
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)
{
for(ii=0;ii<BLOCK_SIZE;ii++)
{
vec2_x=(i4*4+ii)*mv_mul;
vec1_x=vec2_x+img->mv[i4+BLOCK_SIZE][j4][0];
for(jj=0;jj<MB_BLOCK_SIZE/BLOCK_SIZE;jj++)
{
vec2_y=(j4*4+jj)*mv_mul;
vec1_y=vec2_y+img->mv[i4+4][j4][1];
img->mpr[ii+ioff][jj+joff]=get_pixel(ref_frame,vec1_x,vec1_y,img);
// img->mpr[ii+ioff][jj+joff]=mref[ref_frame][vec1_y][vec1_x];
}
}
}
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 */
{
js0=0;
js1=0;
js2=0;
js3=0;
for(i=0;i<4;i++)
{
if(currMB->mb_available[0][1]) //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(currMB->mb_available[1][0]) //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(currMB->mb_available[0][1] && currMB->mb_available[1][0]) //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(currMB->mb_available[0][1] && !currMB->mb_available[1][0]) //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(!currMB->mb_available[0][1] && currMB->mb_available[1][0]) //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(!currMB->mb_available[0][1] && !currMB->mb_available[1][0]) //!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];
#ifndef UMV
ii0=i1/f1;
jj0=j1/f1;
ii1=(i1+f2)/f1;
jj1=(j1+f2)/f1;
#endif
#ifdef UMV
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));
#endif
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;
}
}
}
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];
}
}
}
}
SetLoopfilterStrength_P(img);
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -