📄 b_frame.c
字号:
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
}
// //////////////////////////////////
// Forward MC using img->fw_MV
// //////////////////////////////////
else if(img->imod==B_Forward)
{
vec1_x = i4*4*mv_mul + img->fw_mv[i4+BLOCK_SIZE][j4][0];
vec1_y = j4*4*mv_mul + img->fw_mv[i4+BLOCK_SIZE][j4][1];
get_block(ref_frame_fw,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];
}
// //////////////////////////////////
// Backward MC using img->bw_MV
// //////////////////////////////////
else if(img->imod==B_Backward)
{
vec1_x = i4*4*mv_mul + img->bw_mv[i4+BLOCK_SIZE][j4][0];
vec1_y = j4*4*mv_mul + img->bw_mv[i4+BLOCK_SIZE][j4][1];
get_block(ref_frame_bw,vec1_x,vec1_y,img,tmp_blockbw);
for(ii=0;ii<BLOCK_SIZE;ii++)
for(jj=0;jj<BLOCK_SIZE;jj++)
img->mpr[ii+ioff][jj+joff] = tmp_blockbw[ii][jj];
}
// //////////////////////////////////
// Bidirect MC using img->fw_MV, bw_MV
// //////////////////////////////////
else if(img->imod==B_Bidirect)
{
vec2_x=i4*4*mv_mul;
vec1_x=vec2_x+img->fw_mv[i4+BLOCK_SIZE][j4][0];
vec1_xx=vec2_x+img->bw_mv[i4+BLOCK_SIZE][j4][0];
vec2_y=j4*4*mv_mul;
vec1_y=vec2_y+img->fw_mv[i4+BLOCK_SIZE][j4][1];
vec1_yy=vec2_y+img->bw_mv[i4+BLOCK_SIZE][j4][1];
get_block(ref_frame_fw,vec1_x,vec1_y,img,tmp_block);
get_block(ref_frame_bw,vec1_xx,vec1_yy,img,tmp_blockbw);
for(ii=0;ii<BLOCK_SIZE;ii++)
for(jj=0;jj<BLOCK_SIZE;jj++)
img->mpr[ii+ioff][jj+joff] = (tmp_block[ii][jj]+tmp_blockbw[ii][jj]+1)/2;
}
// //////////////////////////////////
// Direct MC using img->mv
// //////////////////////////////////
else if(img->imod==B_Direct)
{
// next P is intra mode
if(refFrArr[j4][i4]==-1)
{
for(hv=0; hv<2; hv++)
{
img->dfMV[i4+BLOCK_SIZE][j4][hv]=img->dbMV[i4+BLOCK_SIZE][j4][hv]=0;
}
ref_frame = 1;
}
// next P is skip or inter mode
else
{
#ifdef _ADAPT_LAST_GROUP_
refP_tr = last_P_no[refFrArr[j4][i4]];
#else
refP_tr = nextP_tr-((refFrArr[j4][i4]+1)*P_interval);
#endif
TRb = img->tr-refP_tr;
TRp = nextP_tr-refP_tr;
img->dfMV[i4+BLOCK_SIZE][j4][0]=TRb*img->mv[i4+BLOCK_SIZE][j4][0]/TRp;
img->dfMV[i4+BLOCK_SIZE][j4][1]=TRb*img->mv[i4+BLOCK_SIZE][j4][1]/TRp;
img->dbMV[i4+BLOCK_SIZE][j4][0]=(TRb-TRp)*img->mv[i4+BLOCK_SIZE][j4][0]/TRp;
img->dbMV[i4+BLOCK_SIZE][j4][1]=(TRb-TRp)*img->mv[i4+BLOCK_SIZE][j4][1]/TRp;
ref_frame=1 + refFrArr[j4][i4];
}
vec2_x=i4*4*mv_mul;
vec1_x=vec2_x+img->dfMV[i4+BLOCK_SIZE][j4][0];
vec1_xx=vec2_x+img->dbMV[i4+BLOCK_SIZE][j4][0];
vec2_y=j4*4*mv_mul;
vec1_y=vec2_y+img->dfMV[i4+BLOCK_SIZE][j4][1];
vec1_yy=vec2_y+img->dbMV[i4+BLOCK_SIZE][j4][1];
get_block(ref_frame,vec1_x,vec1_y,img,tmp_block);
get_block(ref_frame_bw,vec1_xx,vec1_yy,img,tmp_blockbw);
for(ii=0;ii<BLOCK_SIZE;ii++)
for(jj=0;jj<BLOCK_SIZE;jj++)
img->mpr[ii+ioff][jj+joff] = (tmp_block[ii][jj]+tmp_blockbw[ii][jj]+1)/2;
}
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
}
}
}
}
#if POS
imgY[img->block_y*BLOCK_SIZE][img->block_x*BLOCK_SIZE]= color;
#endif
/**********************************
* chroma *
*********************************/
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(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];
}
}
// //////////////////////////////////
// Forward Reconstruction
// //////////////////////////////////
else if(img->imod==B_Forward)
{
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->fw_mv[if1+4][jf][0];
j1=(img->pix_c_y+jj+joff)*f1+img->fw_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_fw][uv][jj0][ii0]+
if1*jf0*mcef[ref_frame_fw][uv][jj0][ii1]+
if0*jf1*mcef[ref_frame_fw][uv][jj1][ii0]+
if1*jf1*mcef[ref_frame_fw][uv][jj1][ii1]+f4)/f3;
}
}
}
// //////////////////////////////////
// Backward Reconstruction
// //////////////////////////////////
else if(img->imod==B_Backward)
{
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->bw_mv[if1+4][jf][0];
j1=(img->pix_c_y+jj+joff)*f1+img->bw_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_bw][uv][jj0][ii0]+
if1*jf0*mcef[ref_frame_bw][uv][jj0][ii1]+
if0*jf1*mcef[ref_frame_bw][uv][jj1][ii0]+
if1*jf1*mcef[ref_frame_bw][uv][jj1][ii1]+f4)/f3;
}
}
}
// //////////////////////////////////
// Bidirect Reconstruction
// //////////////////////////////////
else if(img->imod==B_Bidirect)
{
for(jj=0;jj<4;jj++)
{
jf=(j4+jj)/2;
for(ii=0;ii<4;ii++)
{
ifx=(i4+ii)/2;
i1=(img->pix_c_x+ii+ioff)*f1+img->fw_mv[ifx+4][jf][0];
j1=(img->pix_c_y+jj+joff)*f1+img->fw_mv[ifx+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;
fw_pred=(if0*jf0*mcef[ref_frame_fw][uv][jj0][ii0]+
if1*jf0*mcef[ref_frame_fw][uv][jj0][ii1]+
if0*jf1*mcef[ref_frame_fw][uv][jj1][ii0]+
if1*jf1*mcef[ref_frame_fw][uv][jj1][ii1]+f4)/f3;
i1=(img->pix_c_x+ii+ioff)*f1+img->bw_mv[ifx+4][jf][0];
j1=(img->pix_c_y+jj+joff)*f1+img->bw_mv[ifx+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;
bw_pred=(if0*jf0*mcef[ref_frame_bw][uv][jj0][ii0]+
if1*jf0*mcef[ref_frame_bw][uv][jj0][ii1]+
if0*jf1*mcef[ref_frame_bw][uv][jj1][ii0]+
if1*jf1*mcef[ref_frame_bw][uv][jj1][ii1]+f4)/f3;
img->mpr[ii+ioff][jj+joff]=(int)((fw_pred+bw_pred)/2.+.5);
}
}
}
// //////////////////////////////////
// Direct Reconstruction
// //////////////////////////////////
else if(img->imod==B_Direct)
{
for(jj=0;jj<4;jj++)
{
jf=(j4+jj)/2;
for(ii=0;ii<4;ii++)
{
ifx=(i4+ii)/2;
i1=(img->pix_c_x+ii+ioff)*f1+img->dfMV[ifx+4][jf][0];
j1=(img->pix_c_y+jj+joff)*f1+img->dfMV[ifx+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;
if(refFrArr[jf][ifx]==-1)
ref_frame=1;
else
ref_frame=1 + refFrArr[jf][ifx];
fw_pred=(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;
i1=(img->pix_c_x+ii+ioff)*f1+img->dbMV[ifx+4][jf][0];
j1=(img->pix_c_y+jj+joff)*f1+img->dbMV[ifx+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;
bw_pred=(if0*jf0*mcef[ref_frame_bw][uv][jj0][ii0]+
if1*jf0*mcef[ref_frame_bw][uv][jj0][ii1]+
if0*jf1*mcef[ref_frame_bw][uv][jj1][ii0]+
if1*jf1*mcef[ref_frame_bw][uv][jj1][ii1]+f4)/f3;
// LG : direct residual coding
img->mpr[ii+ioff][jj+joff]=(int)((fw_pred+bw_pred)/2.+.5);
}
}
}
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];
}
} // for(i=0;i<2;i++)
} // for (j=4;j<6;j++)
} // for(uv=0;uv<2;uv++)
#if POS
imgUV[0][img->pix_c_y][img->pix_c_x]= color;
imgUV[1][img->pix_c_y][img->pix_c_x]= color;
#endif
return DECODING_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -