📄 b_frame.c
字号:
}
}
else
{
iii4=(img->pix_x+block_x)*4+tmp_bwMV[0][pic_block_y][pic_block_x+4];
jjj4=(img->pix_y+block_y)*4+tmp_bwMV[1][pic_block_y][pic_block_x+4];
for (j=0;j<4;j++) {
j2=j*4;
for (i=0;i<4;i++) {
i2=i*4;
#ifdef UMV
img->mpr[i+block_x][j+block_y]=UMVPelY_14 (mref_P, jjj4+j2, iii4+i2); // refbuf
#else
img->mpr[i+block_x][j+block_y]=FastPelY_14 (mref_P, jjj4+j2, iii4+i2); // refbuf
#endif
}
}
}
for (j=0; j < BLOCK_SIZE; j++)
{
for (i=0; i < BLOCK_SIZE; i++)
{
img->m7[i][j]=
imgY_org[img->pix_y+block_y+j][img->pix_x+block_x+i]-img->mpr[i+block_x][j+block_y];
}
}
nonzero=dct_luma(block_x,block_y,&coeff_cost);
if (nonzero)
{
currMB->cbp |= cbp_mask;
}
} // block_x
} // block_y
if (coeff_cost > 3) {
sum_cnt_nonz += coeff_cost;
}
else /*discard */
{
currMB->cbp &= (63-cbp_mask);
for (i=mb_x; i < mb_x+BLOCK_SIZE*2; i++)
{
for (j=mb_y; j < mb_y+BLOCK_SIZE*2; j++)
{
imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
}
}
}
} // mb_x
} // mb_y
if (sum_cnt_nonz <= 5 )
{
currMB->cbp &= 48; /* mask bit 4 and 5 */
for (i=0; i < MB_BLOCK_SIZE; i++)
{
for (j=0; j < MB_BLOCK_SIZE; j++)
{
imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
}
}
}
break;
case B_Bidirect :
currMB->cbp=0;
sum_cnt_nonz=0;
for (mb_y=0; mb_y < MB_BLOCK_SIZE; mb_y += BLOCK_SIZE*2)
{
for (mb_x=0; mb_x < MB_BLOCK_SIZE; mb_x += BLOCK_SIZE*2)
{
cbp_mask=(int)pow(2,(mb_x/8+mb_y/4));
coeff_cost=0;
for (block_y=mb_y; block_y < mb_y+BLOCK_SIZE*2; block_y += BLOCK_SIZE)
{
pic_pix_y=img->pix_y+block_y;
pic_block_y=pic_pix_y/BLOCK_SIZE;
for (block_x=mb_x; block_x < mb_x+BLOCK_SIZE*2; block_x += BLOCK_SIZE)
{
pic_pix_x=img->pix_x+block_x;
pic_block_x=pic_pix_x/BLOCK_SIZE;
img->ipredmode[pic_block_x+1][pic_block_y+1]=0;
if(input->mv_res)
{
ii4=(img->pix_x+block_x)*8+tmp_fwMV[0][pic_block_y][pic_block_x+4];
jj4=(img->pix_y+block_y)*8+tmp_fwMV[1][pic_block_y][pic_block_x+4];
iii4=(img->pix_x+block_x)*8+tmp_bwMV[0][pic_block_y][pic_block_x+4];
jjj4=(img->pix_y+block_y)*8+tmp_bwMV[1][pic_block_y][pic_block_x+4];
for (j=0;j<4;j++) {
j2=j*8;
for (i=0;i<4;i++) {
i2=i*8;
#ifdef UMV
fw_pred=UMVPelY_18 (mref[img->fw_multframe_no], jj4+j2, ii4+i2); // refbuf
bw_pred=UMVPelY_18 (mref_P, jjj4+j2, iii4+i2); //refbuf
#else
fw_pred=FastPelY_18 (mref[img->fw_multframe_no], jj4+j2, ii4+i2); // refbuf
bw_pred=FastPelY_18 (mref_P, jjj4+j2, iii4+i2); //refbuf
#endif
//fw_pred=get_eigthpix_pel(ii4+i2,jj4+j2,img->fw_multframe_no);
//bw_pred=get_eigthpix_pel_P(iii4+i2,jjj4+j2);
img->mpr[i+block_x][j+block_y]=(int)((fw_pred+bw_pred)/2.0+0.5);
}
}
}
else
{
ii4=(img->pix_x+block_x)*4+tmp_fwMV[0][pic_block_y][pic_block_x+4];
jj4=(img->pix_y+block_y)*4+tmp_fwMV[1][pic_block_y][pic_block_x+4];
iii4=(img->pix_x+block_x)*4+tmp_bwMV[0][pic_block_y][pic_block_x+4];
jjj4=(img->pix_y+block_y)*4+tmp_bwMV[1][pic_block_y][pic_block_x+4];
for (j=0;j<4;j++) {
j2=j*4;
for (i=0;i<4;i++) {
i2=i*4;
#ifdef UMV
fw_pred=UMVPelY_14 (mref[img->fw_multframe_no], jj4+j2, ii4+i2); // refbuf
bw_pred=UMVPelY_14 (mref_P, jjj4+j2, iii4+i2); //refbuf
#else
fw_pred=FastPelY_14 (mref[img->fw_multframe_no], jj4+j2, ii4+i2); // refbuf
bw_pred=FastPelY_14 (mref_P, jjj4+j2, iii4+i2); //refbuf
#endif
img->mpr[i+block_x][j+block_y]=(int)((fw_pred+bw_pred)/2.0+0.5);
}
}
}
for (j=0; j < BLOCK_SIZE; j++)
{
for (i=0; i < BLOCK_SIZE; i++)
{
img->m7[i][j]=
imgY_org[img->pix_y+block_y+j][img->pix_x+block_x+i]-img->mpr[i+block_x][j+block_y];
}
}
nonzero=dct_luma(block_x,block_y,&coeff_cost);
if (nonzero)
{
currMB->cbp |= cbp_mask;
}
} // block_x
} // block_y
if (coeff_cost > 3) {
sum_cnt_nonz += coeff_cost;
}
else /*discard */
{
currMB->cbp &= (63-cbp_mask);
for (i=mb_x; i < mb_x+BLOCK_SIZE*2; i++)
{
for (j=mb_y; j < mb_y+BLOCK_SIZE*2; j++)
{
imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
}
}
}
} // mb_x
} // mb_y
if (sum_cnt_nonz <= 5 )
{
currMB->cbp &= 48; /* mask bit 4 and 5 */
for (i=0; i < MB_BLOCK_SIZE; i++)
{
for (j=0; j < MB_BLOCK_SIZE; j++)
{
imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
}
}
}
break;
case B_Direct :
currMB->cbp=0;
sum_cnt_nonz=0;
for (mb_y=0; mb_y < MB_BLOCK_SIZE; mb_y += BLOCK_SIZE*2)
{
for (mb_x=0; mb_x < MB_BLOCK_SIZE; mb_x += BLOCK_SIZE*2)
{
cbp_mask=(int)pow(2,(mb_x/8+mb_y/4));
coeff_cost=0;
for (block_y=mb_y; block_y < mb_y+BLOCK_SIZE*2; block_y += BLOCK_SIZE)
{
pic_pix_y=img->pix_y+block_y;
pic_block_y=pic_pix_y/BLOCK_SIZE;
for (block_x=mb_x; block_x < mb_x+BLOCK_SIZE*2; block_x += BLOCK_SIZE)
{
pic_pix_x=img->pix_x+block_x;
pic_block_x=pic_pix_x/BLOCK_SIZE;
img->ipredmode[pic_block_x+1][pic_block_y+1]=0;
if(input->mv_res)
{
ii4 =(img->pix_x+block_x)*8+dfMV[0][pic_block_y][pic_block_x+4];
jj4 =(img->pix_y+block_y)*8+dfMV[1][pic_block_y][pic_block_x+4];
iii4=(img->pix_x+block_x)*8+dbMV[0][pic_block_y][pic_block_x+4];
jjj4=(img->pix_y+block_y)*8+dbMV[1][pic_block_y][pic_block_x+4];
// next P is intra mode
if(refFrArr[pic_block_y][pic_block_x]==-1)
ref_inx=(img->number-1)%img->buf_cycle;
// next P is skip or inter mode
else
ref_inx=(img->number-refFrArr[pic_block_y][pic_block_x]-1)%img->buf_cycle;
for (j=0;j<4;j++) {
j2=j*8;
for (i=0;i<4;i++) {
i2=i*8;
#ifdef UMV
df_pred=UMVPelY_18 (mref[ref_inx], jj4+j2, ii4+i2);
db_pred=UMVPelY_18 (mref_P, jjj4+j2, iii4+i2);
#else
df_pred=FastPelY_18 (mref[ref_inx], jj4+j2, ii4+i2);
db_pred=FastPelY_18 (mref_P, jjj4+j2, iii4+i2);
#endif
//df_pred=get_eigthpix_pel(ii4+i2,jj4+j2,ref_inx);
//db_pred=get_eigthpix_pel_P(iii4+i2,jjj4+j2);
// df_pred=mref[ref_inx][jj4+j2][ii4+i2];
// db_pred=mref_P[jjj4+j2][iii4+i2];
img->mpr[i+block_x][j+block_y]=(int)((df_pred+db_pred)/2.0+0.5);
}
}
}
else
{
ii4 =(img->pix_x+block_x)*4+dfMV[0][pic_block_y][pic_block_x+4];
jj4 =(img->pix_y+block_y)*4+dfMV[1][pic_block_y][pic_block_x+4];
iii4=(img->pix_x+block_x)*4+dbMV[0][pic_block_y][pic_block_x+4];
jjj4=(img->pix_y+block_y)*4+dbMV[1][pic_block_y][pic_block_x+4];
// next P is intra mode
if(refFrArr[pic_block_y][pic_block_x]==-1)
ref_inx=(img->number-1)%img->buf_cycle;
// next P is skip or inter mode
else
ref_inx=(img->number-refFrArr[pic_block_y][pic_block_x]-1)%img->buf_cycle;
for (j=0;j<4;j++) {
j2=j*4;
for (i=0;i<4;i++) {
i2=i*4;
#ifdef UMV
df_pred=UMVPelY_14 (mref[ref_inx], jj4+j2, ii4+i2);
db_pred=UMVPelY_14 (mref_P, jjj4+j2, iii4+i2);
#else
df_pred=FastPelY_14 (mref[ref_inx], jj4+j2, ii4+i2);
db_pred=FastPelY_14 (mref_P, jjj4+j2, iii4+i2);
#endif
img->mpr[i+block_x][j+block_y]=(int)((df_pred+db_pred)/2.0+0.5);
}
}
}
// LG : direct residual coding
for (j=0; j < BLOCK_SIZE; j++)
{
for (i=0; i < BLOCK_SIZE; i++)
{
img->m7[i][j]=
imgY_org[img->pix_y+block_y+j][img->pix_x+block_x+i]-img->mpr[i+block_x][j+block_y];
}
}
nonzero=dct_luma(block_x,block_y,&coeff_cost);
if (nonzero)
{
currMB->cbp |= cbp_mask;
}
} // block_x
} // block_y
// LG : direct residual coding
if (coeff_cost > 3) {
sum_cnt_nonz += coeff_cost;
}
else /*discard */
{
currMB->cbp &= (63-cbp_mask);
for (i=mb_x; i < mb_x+BLOCK_SIZE*2; i++)
{
for (j=mb_y; j < mb_y+BLOCK_SIZE*2; j++)
{
imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
}
}
}
} // mb_x
} // mb_y
// LG : direct residual coding
if (sum_cnt_nonz <= 5 )
{
currMB->cbp &= 48; /* mask bit 4 and 5 */
for (i=0; i < MB_BLOCK_SIZE; i++)
{
for (j=0; j < MB_BLOCK_SIZE; j++)
{
imgY[img->pix_y+j][img->pix_x+i]=img->mpr[i][j];
}
}
}
break;
default:
break;
} // switch()
}
/************************************************************************
*
* Name : ChromaCoding_B()
*
* Description: Performs DCT, quantization, run/level pre-coding and IDCT
* for the chrominance of a B-frame macroblock;
* current cbp and cr_cbp are affected
*
************************************************************************/
void ChromaCoding_B(int *cr_cbp)
{
int i, j;
int uv, ii,jj,ii0,jj0,ii1,jj1,if1,jf1,if0,jf0,f1,f2,f3,f4;
int pic_block_y, pic_block_x, ref_inx, fw_pred, bw_pred;
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
if(input->mv_res)
{
f1=16;
f2=15;
}
else
{
f1=8;
f2=7;
}
f3=f1*f1;
f4=f3/2;
*cr_cbp=0;
for (uv=0; uv < 2; uv++)
{
if (img->imod == INTRA_MB_OLD || img->imod == INTRA_MB_NEW)
{
intrapred_chroma(img->pix_c_x,img->pix_c_y,uv);
}
else if(img->imod == B_Forward)
{
for (j=0; j < MB_BLOCK_SIZE/2; j++)
{
pic_block_y=(img->pix_c_y+j)/2;
for (i=0; i < MB_BLOCK_SIZE/2; i++)
{
pic_block_x=(img->pix_c_x+i)/2;
ii=(img->pix_c_x+i)*f1+tmp_fwMV[0][pic_block_y][pic_block_x+4];
jj=(img->pix_c_y+j)*f1+tmp_fwMV[1][pic_block_y][pic_block_x+4];
#ifndef UMV
ii0=ii/f1;
jj0=jj/f1;
ii1=(ii+f2)/f1;
jj1=(jj+f2)/f1;
#endif
#ifdef UMV
ii0= max (0, min (img->width_cr-1, ii/f1));
jj0= max (0, min (img->height_cr-1, jj/f1));
ii1= max (0, min (img->width_cr-1, (ii+f2)/f1));
jj1= max (0, min (img->height_cr-1, (jj+f2)/f1));
#endif
if1=(ii & f2);
jf1=(jj & f2);
if0=f1-if1;
jf0=f1-jf1;
img->mpr[i][j]=(if0*jf0*mcef[img->fw_multframe_no][uv][jj0][ii0]+
if1*jf0*mcef[img->fw_multframe_no][uv][jj0][ii1]+
if0*jf1*mcef[img->fw_multframe_no][uv][jj1][ii0]+
if1*jf1*mcef[img->fw_multframe_no][uv][jj1][ii1]+f4)/f3;
img->m7[i][j]=imgUV_org[uv][img->pix_c_y+j][img->pix_c_x+i]-img->mpr[i][j];
}
}
}
else if(img->imod == B_Backward)
{
for (j=0; j < MB_BLOCK_SIZE/2; j++)
{
pic_block_y=(img->pix_c_y+j)/2;
for (i=0; i < MB_BLOCK_SIZE/2; i++)
{
pic_block_x=(img->pix_c_x+i)/2;
ii=(img->pix_c_x+i)*f1+tmp_bwMV[0][pic_block_y][pic_block_x+4];
jj=(img->pix_c_y+j)*f1+tmp_bwMV[1][pic_block_y][pic_block_x+4];
#ifndef UMV
ii0=ii/f1;
jj0=jj/f1;
ii1=(ii+f2)/f1;
jj1=(jj+f2)/f1;
#endif
#ifdef UMV
ii0= max (0, min (img->width_cr-1, ii/f1));
jj0= max (0, min (img->height_cr-1, jj/f1));
ii1= max (0, min (img->width_cr-1, (ii+f2)/f1));
jj1= max (0, min (img->height_cr-1, (jj+f2)/f1));
#endif
if1=(ii & f2);
jf1=(jj & f2);
if0=f1-if1;
jf0=f1-jf1;
img->mpr[i][j]=(if0*jf0*mcef_P[uv][jj0][ii0]+if1*jf0*mcef_P[uv][jj0][ii1]+
if0*jf1*mcef_P[uv][jj1][ii0]+if1*jf1*mcef_P[uv][jj1][ii1]+f4)/f3;
img->m7[i][j]=imgUV_org[uv][img->pix_c_y+j][img->pix_c_x+i]-img->mpr[i][j];
}
}
}
else if(img->imod == B_Bidirect)
{
for (j=0; j < MB_BLOCK_SIZE/2; j++)
{
pic_block_y=(img->pix_c_y+j)/2;
for (i=0; i < MB_BLOCK_SIZE/2; i++)
{
pic_block_x=(img->pix_c_x+i)/2;
ii=(img->pix_c_x+i)*f1+tmp_fwMV[0][pic_block_y][pic_block_x+4];
jj=(img->pix_c_y+j)*f1+tmp_fwMV[1][pic_block_y][pic_block_x+4];
#ifndef UMV
ii0=ii/f1;
jj0=jj/f1;
ii1=(ii+f2)/f1;
jj1=(jj+f2)/f1;
#endif
#ifdef UMV
ii0= max (0, min (img->width_cr-1, ii/f1));
jj0= max (0, min (img->height_cr-1, jj/f1));
ii1= max (0, min (img->width_cr-1, (ii+f2)/f1));
jj1= max (0, min (img->height_cr-1, (jj+f2)/f1));
#endif
if1=(ii & f2);
jf1=(jj & f2);
if0=f1-if1;
jf0=f1-jf1;
fw_pred=(if0*jf0*mcef[img->fw_multframe_no][uv][jj0][ii0]+
if1*jf0*mcef[img->fw_multframe_no][uv][jj0][ii1]+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -