📄 macroblock.cpp
字号:
for (block_y=0; block_y < 4; block_y += 2) /* all modes */
{
for (block_x=0; block_x < 4; block_x += 2)
{
b8 = 2*(block_y/2) + block_x/2;
for (j=block_y; j < block_y+2; j++)
{
for (i=block_x; i < block_x+2; i++)
{
ii = block_x/2; jj = block_y/2;
b8 = 2*jj+ii;
if (cbp & (1<<b8)) /* are there any coeff in current block at all */
{
if (IS_NEWINTRA(currMB))
{
readCoeff4x4_CAVLC(img, LUMA_INTRA16x16AC, i, j,
levarr, runarr, &numcoeff);
start_scan = 1;
}
else
{
readCoeff4x4_CAVLC(img, LUMA, i, j,
levarr, runarr, &numcoeff);
start_scan = 0;
}
coef_ctr = start_scan-1;
for (k = 0; k < numcoeff; k++)
{
if (levarr[k] != 0)
{
coef_ctr += runarr[k]+1;
i0=SNGL_SCAN[coef_ctr][0];
j0=SNGL_SCAN[coef_ctr][1];
currMB->cbp_blk |= 1 << ((j<<2) + i) ;
img->cof[i][j][i0][j0]= levarr[k]*dequant_coef[qp_rem][i0][j0]<<qp_per;
}
}
}
else
{
img->nz_coeff[img->current_mb_nr][i][j] = 0;
}
}
}
}
}
/*img->cof和luma的初始化合并*/
m2 =img->mb_x*2;
jg2=img->mb_y*2;
// chroma 2x2 DC coeff
if(cbp>15)
{
for (ll=0;ll<3;ll+=2)
{
memset(img->cofu,0,4*sizeof(int));
readCoeff4x4_CAVLC(img, CHROMA_DC, 0, 0,
levarr, runarr, &numcoeff);
coef_ctr=-1;
level=1;
for(k = 0; k < numcoeff; k++)
{
if (levarr[k] != 0)
{
currMB->cbp_blk |= 0xf0000 << (ll<<1) ;
coef_ctr=coef_ctr+runarr[k]+1;
img->cofu[coef_ctr]=levarr[k];
}
}
// for (i=0;i<4;i++)
int dequant_cofu=dequant_coef[qp_rem_uv][0][0]<<qp_per_uv;
img->cofu[0]*=dequant_cofu;
img->cofu[1]*=dequant_cofu;
img->cofu[2]*=dequant_cofu;
img->cofu[3]*=dequant_cofu;
img->cof[0+ll][4][0][0]=(img->cofu[0]+img->cofu[1]+img->cofu[2]+img->cofu[3])>>1;
img->cof[1+ll][4][0][0]=(img->cofu[0]-img->cofu[1]+img->cofu[2]-img->cofu[3])>>1;
img->cof[0+ll][5][0][0]=(img->cofu[0]+img->cofu[1]-img->cofu[2]-img->cofu[3])>>1;
img->cof[1+ll][5][0][0]=(img->cofu[0]-img->cofu[1]-img->cofu[2]+img->cofu[3])>>1;
}
}
// chroma AC coeff, all zero fram start_scan
if (cbp<=31)
for (i=0; i < 4; i++)
for (j=4; j < 6; j++)
img->nz_coeff [img->current_mb_nr ][i][j]=0;
// chroma AC coeff, all zero fram start_scan
uv=-1;
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>>1;
j1=j-4;
for (i=block_x; i < block_x+2; i++)
{
ii=i>>1;
i1=i&0x0001;
readCoeff4x4_CAVLC(img, CHROMA_AC, i, j,
levarr, runarr, &numcoeff);
coef_ctr=0;
level=1;
uv++;
for(k = 0; k < numcoeff;k++)
{
if (levarr[k] != 0)
{
currMB->cbp_blk |= 1 << (16 + (j1<<1) + i1 + (block_x<<1) ) ;
coef_ctr=coef_ctr+runarr[k]+1;
i0=SNGL_SCAN[coef_ctr][0];
j0=SNGL_SCAN[coef_ctr][1];
img->cof[i][j][i0][j0]=levarr[k]*dequant_coef[qp_rem_uv][i0][j0]<<qp_per_uv;
}
}
}
}
}
}
}
/*!
************************************************************************
* \brief
* Copy IPCM coefficients to decoded picture buffer and set parameters for this MB
* (for IPCM CABAC and IPCM CAVLC 28/11/2003)
*
* \author
* Dong Wang <Dong.Wang@bristol.ac.uk>
************************************************************************
*/
void decode_ipcm_mb(struct img_par *img)
{
int i,j;
Macroblock *currMb = &img->mb_data[img->mb_y*img->PicWidthInMbs + img->mb_x] ;
int dy;
//Copy coefficents to decoded picture buffer
//IPCM coefficents are stored in img->cof which is set in function readIPCMcoeffsFromNAL()
dy=1;
for(i=0;i<16;i++)
for(j=0;j<16;j++)
dec_picture->imgY[img->pix_y+i*dy][img->pix_x+j]=img->cof[i/4][j/4][i&0x0003][j&0x0003];
for(i=0;i<8;i++)
for(j=0;j<8;j++)
dec_picture->imgUV[0][img->pix_c_y+i*dy][img->pix_c_x+j]=img->cof[i/4][j/4+4][i&0x0003][j&0x0003];
for(i=0;i<8;i++)
for(j=0;j<8;j++)
dec_picture->imgUV[1][img->pix_c_y+i*dy][img->pix_c_x+j]=img->cof[i/4+2][j/4+4][i&0x0003][j&0x0003];
//For Deblocking Filter 16/08/2003
if (currMb->mb_type==IPCM)
currMb->qp=0;
//For CAVLC
//Set the nz_coeff to 16.
//These parameters are to be used in CAVLC decoding of neighbour blocks
for(i=0;i<4;i++)
for (j=0;j<6;j++)
img->nz_coeff[img->current_mb_nr][i][j]=16;
}
/*!
************************************************************************
* \brief
* decode one macroblock
************************************************************************
*/
int decode_one_macroblock(struct img_par *img)
{
const byte decode_block_scan[16] = {0,1,4,5,2,3,6,7,8,9,12,13,10,11,14,15};
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
int i=0,j=0,k,ii=0,jj,j4=0,i4=0;
int block8x8; // needed for ABT
int uv;
int ioff,joff;
if(currMB->mb_type==IPCM)
{
//copy readed data into imgY and set parameters
decode_ipcm_mb(img);
return 0;
}
//I16
if (IS_NEWINTRA (currMB))
{
intrapred_luma_16x16(img, currMB->i16mode);
for (block8x8=0; block8x8<4; block8x8++)
{
for (k = block8x8*4; k < block8x8*4+4; k ++)
{
i = (decode_block_scan[k] & 3);
j = ((decode_block_scan[k] >> 2) & 3);
ioff=i<<2;
i4=(img->block_x+i)<<2;
joff=j<<2;
j4=(img->block_y+j)<<2;
itrans (img,ioff,joff,i,j); // use DCT transform and make 4x4 block m7 from prediction block mpr
for(ii=0;ii<4;ii++)
for(jj=0;jj<4;jj++)
dec_picture->imgY[j4+jj][i4+ii]=img->m7[ii][jj];
}
}
//chroma
for(uv=0;uv<2;uv++)
{
intrapred_chroma(img, uv);
for (j=4;j<6;j++)
{
joff=(j-4)<<2;
j4=img->pix_c_y+joff;
for(i=0;i<2;i++)
{
ioff=i<<2;
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++)
dec_picture->imgUV[uv][j4+jj][i4+ii]=img->m7[ii][jj];
}
}
}
return 0;
}
if(IS_OLDINTRA(currMB))
{
for (block8x8=0; block8x8<4; block8x8++)
{
for (k = block8x8*4; k < block8x8*4+4; k ++)
{
i = (decode_block_scan[k] & 3);
j = ((decode_block_scan[k] >> 2) & 3);
ioff=i<<2;
i4=img->block_x+i;
joff=j<<2;
j4=img->block_y+j;
if (intrapred(img,ioff,joff,i4,j4)==SEARCH_SYNC) /* make 4x4 prediction block mpr from given prediction img->mb_mode */
return SEARCH_SYNC;
itrans (img,ioff,joff,i,j); // use DCT transform and make 4x4 block m7 from prediction block mpr
i4=i4<<2;
j4=j4<<2;
for(ii=0;ii<4;ii++)
for(jj=0;jj<4;jj++)
dec_picture->imgY[j4+jj][i4+ii]=img->m7[ii][jj];
}
}
//chroma
for(uv=0;uv<2;uv++)
{
intrapred_chroma(img, uv);
for (j=4;j<6;j++)
{
joff=(j-4)<<2;
j4=img->pix_c_y+joff;
for(i=0;i<2;i++)
{
ioff=i<<2;
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++)
dec_picture->imgUV[uv][j4+jj][i4+ii]=img->m7[ii][jj];
}
}
}
return 0;
}
int tmp_block[4][4];
int i1=0,j1=0;
int vec1_x=0,vec1_y=0;
int pred;
int ii0,jj0,ii1,jj1,if1,jf1,if0,jf0;
int /*mv_mul,*/f1,f2,f3,f4;
int ref_idx, pred_dir;
int *** mv_array;
int max_y_cr;
StorablePicture **list;
int jf;
// find out the correct list offsets
max_y_cr = img->height_cr-1;
// mv_mul=4;
f1=8; f2=7; f3=64/*f1*f1*/; f4=f3/2;
// luma decoding **************************************************
// get prediction for INTRA_MB_16x16
for (block8x8=0; block8x8<4; block8x8++)
{
for (k = block8x8*4; k < block8x8*4+4; k ++)
{
i = (decode_block_scan[k] & 3);
j = ((decode_block_scan[k] >> 2) & 3);
ioff=i<<2;
i4=img->block_x+i;
joff=j<<2;
j4=img->block_y+j;
pred_dir = currMB->b8pdir[2*(j>>1)+(i>>1)];
assert (pred_dir<=2);
//===== FORWARD/BACKWARD PREDICTION =====
ref_idx = dec_picture->ref_idx[LIST_0 + pred_dir][i4][j4];
mv_array = dec_picture->mv[LIST_0 + pred_dir];
list = listX[0+ pred_dir];
vec1_x = (i4<<4) + mv_array[i4][j4][0];
vec1_y = (j4<<4) + mv_array[i4][j4][1];
get_block (ref_idx, list, vec1_x, vec1_y, img, tmp_block);
if (img->apply_weights)
{
for(ii=0;ii<4;ii++)
for(jj=0;jj<4;jj++)
img->mpr[ii+ioff][jj+joff] = Clip1(((img->wp_weight[pred_dir][ref_idx][0] * tmp_block[ii][jj]+ img->wp_round_luma) >>img->luma_log2_weight_denom) + img->wp_offset[pred_dir][ref_idx][0] );
}
else
{
for(ii=0;ii<4;ii++)
memcpy(img->mpr[ii+ioff]+joff,tmp_block[ii],4*sizeof(int));
}
itrans (img,ioff,joff,i,j); // use DCT transform and make 4x4 block m7 from prediction block mpr
j4<<=2;
i4<<=2;
for(ii=0;ii<4;ii++)
for(jj=0;jj<4;jj++)
dec_picture->imgY[j4+jj][i4+ii]=img->m7[ii][jj];
}
}
// chroma decoding *******************************************************
for(uv=0;uv<2;uv++)
{
for (j=4;j<6;j++)
{
joff=(j-4)<<2;
j4=img->pix_c_y+joff;
for(i=0;i<2;i++)
{
ioff=i*4;
i4=img->pix_c_x+ioff;
pred_dir = currMB->b8pdir[2*(j-4)+i];
assert (pred_dir<=2);
mv_array = dec_picture->mv[LIST_0 + pred_dir];
list = listX[0+pred_dir];
for(jj=0;jj<4;jj++)
{
jf=(j4+jj)>>1;
for(ii=0;ii<4;ii++)
{
if1=(i4+ii)>>1;
ref_idx = dec_picture->ref_idx[LIST_0+pred_dir][if1][jf];
i1=(img->pix_c_x+ii+ioff)*f1+mv_array[if1][jf][0];
j1=(img->pix_c_y+jj+joff)*f1+mv_array[if1][jf][1];
ii0=max (0, min (i1/f1, img->width_cr-1));
jj0=max (0, min (j1/f1, max_y_cr));
ii1=max (0, min ((i1+f2)/f1, img->width_cr-1));
jj1=max (0, min ((j1+f2)/f1, max_y_cr));
if1=(i1 & f2);
jf1=(j1 & f2);
if0=f1-if1;
jf0=f1-jf1;
if (img->apply_weights)
{
pred = (if0*jf0*list[ref_idx]->imgUV[uv][jj0][ii0]+
if1*jf0*list[ref_idx]->imgUV[uv][jj0][ii1]+
if0*jf1*list[ref_idx]->imgUV[uv][jj1][ii0]+
if1*jf1*list[ref_idx]->imgUV[uv][jj1][ii1]+f4)>>6;///f3;
img->mpr[ii+ioff][jj+joff] = Clip1(((img->wp_weight[pred_dir][ref_idx][uv+1] * pred + img->wp_round_chroma)>>img->chroma_log2_weight_denom) + img->wp_offset[pred_dir][ref_idx][uv+1]);
}
else
{
img->mpr[ii+ioff][jj+joff]=(if0*jf0*list[ref_idx]->imgUV[uv][jj0][ii0]+
if1*jf0*list[ref_idx]->imgUV[uv][jj0][ii1]+
if0*jf1*list[ref_idx]->imgUV[uv][jj1][ii0]+
if1*jf1*list[ref_idx]->imgUV[uv][jj1][ii1]+f4)>>6;///f3;
}
}
}
itrans(img,ioff,joff,2*uv+i,j);
for(ii=0;ii<4;ii++)
for(jj=0;jj<4;jj++)
dec_picture->imgUV[uv][j4+jj][i4+ii]=img->m7[ii][jj];
}
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -