?? b_frame.c
字號:
for (j=0;j<4;j++) { j2=j*8; for (i=0;i<4;i++) { i2=i*8; 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 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; 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 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_blk |= 1 << cbp_blk_mask ; // one bit for every 4x4 block currMB->cbp |= cbp_mask; } } // block_x } // block_y if (coeff_cost > 3) { sum_cnt_nonz += coeff_cost; } else //discard { currMB->cbp &= (63-cbp_mask); currMB->cbp_blk &= ~(51 << (mb_y + (mb_x>>2) )) ; 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 &= 0xfffff0 ; currMB->cbp_blk &= 0xff0000 ; 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; currMB->cbp_blk=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) { cbp_blk_mask = (block_x>>2)+ block_y ; 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; df_pred=UMVPelY_18 (mref[ref_inx], jj4+j2, ii4+i2); db_pred=UMVPelY_18 (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; df_pred=UMVPelY_14 (mref[ref_inx], jj4+j2, ii4+i2); db_pred=UMVPelY_14 (mref_P, jjj4+j2, iii4+i2); 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_blk |= 1 << cbp_blk_mask ; // one bit for every 4x4 block 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); currMB->cbp_blk &= ~(51 << (mb_y + (mb_x>>2) )) ; 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 &= 0xfffff0 ; currMB->cbp_blk &= 0xff0000 ; 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()}/*! ************************************************************************ * \brief * 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]; 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)); 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]; 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)); 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]; 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)); 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]+ if0*jf1*mcef[img->fw_multframe_no][uv][jj1][ii0]+ if1*jf1*mcef[img->fw_multframe_no][uv][jj1][ii1]+f4)/f3; 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]; 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)); if1=(ii & f2); jf1=(jj & f2); if0=f1-if1; jf0=f1-jf1; bw_pred=(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->mpr[i][j]=(int)((fw_pred+bw_pred)/2.0+0.5); img->m7[i][j]=imgUV_org[uv][img->pix_c_y+j][img->pix_c_x+i]-img->mpr[i][j]; } } } else // img->imod == B_Direct { 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+dfMV[0][pic_block_y][pic_block_x+4]; jj=(img->pix_c_y+j)*f1+dfMV[1][pic_block_y][pic_block_x+4]; 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)); if1=(ii & f2); jf1=(jj & f2); if0=f1-if1; jf0=f1-jf1; // 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; fw_pred=(if0*jf0*mcef[ref_inx][uv][jj0][ii0]+ if1*jf0*mcef[ref_inx][uv][jj0][ii1]+ if0*jf1*mcef[ref_inx][uv][jj1][ii0]+ if1*jf1*mcef[ref_inx][uv][jj1][ii1]+f4)/f3; ii=(img->pix_c_x+i)*f1+dbMV[0][pic_block_y][pic_block_x+4];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -