📄 b_frame.c
字号:
code_num=5; else // 4x4 : blocktype 7 code_num=6; *bid_sad += QP2QUANT[img->qp]*img->blk_bituse[code_num]; // consider bits of mvdfw step_h=img->fw_blc_size_h/BLOCK_SIZE; // horizontal stepsize step_v=img->fw_blc_size_v/BLOCK_SIZE; // vertical stepsize for (j=0; j < BLOCK_SIZE; j += step_v) { for (i=0;i < BLOCK_SIZE; i += step_h) { if(img->fw_blc_size_h==16 && img->fw_blc_size_v==16) { // 16x16 : blocktype 1 mvd_x=tmp_fwMV[0][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][1][0]; mvd_y=tmp_fwMV[1][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][1][1]; } else if(img->fw_blc_size_h==16 && img->fw_blc_size_v==8) { // 16x8 : blocktype 2 mvd_x=tmp_fwMV[0][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][2][0]; mvd_y=tmp_fwMV[1][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][2][1]; } else if(img->fw_blc_size_h==8 && img->fw_blc_size_v==16) { // 8x16 : blocktype 3 mvd_x=tmp_fwMV[0][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][3][0]; mvd_y=tmp_fwMV[1][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][3][1]; } else if(img->fw_blc_size_h==8 && img->fw_blc_size_v==8) { // 8x8 : blocktype 4 mvd_x=tmp_fwMV[0][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][4][0]; mvd_y=tmp_fwMV[1][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][4][1]; } else if(img->fw_blc_size_h==8 && img->fw_blc_size_v==4) { // 8x4 : blocktype 5 mvd_x=tmp_fwMV[0][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][5][0]; mvd_y=tmp_fwMV[1][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][5][1]; } else if(img->fw_blc_size_h==4 && img->fw_blc_size_v==8) { // 4x8 : blocktype 6 mvd_x=tmp_fwMV[0][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][6][0]; mvd_y=tmp_fwMV[1][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][6][1]; } else { // 4x4 : blocktype 7 mvd_x=tmp_fwMV[0][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][7][0]; mvd_y=tmp_fwMV[1][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][7][1]; } *bid_sad += QP2QUANT[img->qp]*(img->mv_bituse[absm(mvd_x)]+img->mv_bituse[absm(mvd_y)]); } } // consider bits of mvdbw step_h=img->bw_blc_size_h/BLOCK_SIZE; // horizontal stepsize step_v=img->bw_blc_size_v/BLOCK_SIZE; // vertical stepsize for (j=0; j < BLOCK_SIZE; j += step_v) { for (i=0;i < BLOCK_SIZE; i += step_h) { if(img->bw_blc_size_h==16 && img->bw_blc_size_v==16) { // 16x16 : blocktype 1 mvd_x=tmp_bwMV[0][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][1][0]; mvd_y=tmp_bwMV[1][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][1][1]; } else if(img->bw_blc_size_h==16 && img->bw_blc_size_v==8) { // 16x8 : blocktype 2 mvd_x=tmp_bwMV[0][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][2][0]; mvd_y=tmp_bwMV[1][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][2][1]; } else if(img->bw_blc_size_h==8 && img->bw_blc_size_v==16) { // 8x16 : blocktype 3 mvd_x=tmp_bwMV[0][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][3][0]; mvd_y=tmp_bwMV[1][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][3][1]; } else if(img->bw_blc_size_h==8 && img->bw_blc_size_v==8) { // 8x8 : blocktype 4 mvd_x=tmp_bwMV[0][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][4][0]; mvd_y=tmp_bwMV[1][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][4][1]; } else if(img->bw_blc_size_h==8 && img->bw_blc_size_v==4) { // 8x4 : blocktype 5 mvd_x=tmp_bwMV[0][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][5][0]; mvd_y=tmp_bwMV[1][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][5][1]; } else if(img->bw_blc_size_h==4 && img->bw_blc_size_v==8) { // 4x8 : blocktype 6 mvd_x=tmp_bwMV[0][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][6][0]; mvd_y=tmp_bwMV[1][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][6][1]; } else { // 4x4 : blocktype 7 mvd_x=tmp_bwMV[0][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][7][0]; mvd_y=tmp_bwMV[1][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][7][1]; } *bid_sad += QP2QUANT[img->qp]*(img->mv_bituse[absm(mvd_x)]+img->mv_bituse[absm(mvd_y)]); } } 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) { 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; 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; fw_pred = UMVPelY_18 (mref[img->fw_multframe_no],jj4+j2,ii4+i2); bw_pred = UMVPelY_18 (mref_P, jjj4+j2, iii4+i2); bid_pred[i][j]=(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); bw_pred=UMVPelY_14 (mref_P, jjj4+j2, iii4+i2); bid_pred[i][j]=(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]-bid_pred[i][j]; } } *bid_sad += find_sad(input->hadamard, img->m7); } } } }}void get_dir(int *dir_sad){ int mb_y,mb_x, block_y, block_x, pic_pix_y, pic_pix_x, pic_block_y, pic_block_x; int i, j, ii4, jj4, iii4, jjj4, i2, j2, hv; int ref_inx, df_pred, db_pred, dir_pred[4][4]; int refP_tr, TRb, TRp; // initialize with bias value *dir_sad=-QP2QUANT[img->qp] * 16; // create dfMV, dbMV 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) { 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; // next P is intra mode if(refFrArr[pic_block_y][pic_block_x]==-1) { for(hv=0; hv<2; hv++) { dfMV[hv][pic_block_y][pic_block_x+4]=dbMV[hv][pic_block_y][pic_block_x+4]=0; } } // next P is skip or inter mode else {#ifdef _ADAPT_LAST_GROUP_ refP_tr=last_P_no [refFrArr[pic_block_y][pic_block_x]];#else refP_tr=nextP_tr - ((refFrArr[pic_block_y][pic_block_x]+1)*img->p_interval);#endif TRb=img->tr-refP_tr; TRp=nextP_tr-refP_tr; for(hv=0; hv<2; hv++) { dfMV[hv][pic_block_y][pic_block_x+4]=TRb*tmp_mv[hv][pic_block_y][pic_block_x+4]/TRp; dbMV[hv][pic_block_y][pic_block_x+4]=(TRb-TRp)*tmp_mv[hv][pic_block_y][pic_block_x+4]/TRp; } } } } } } // prediction 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) { 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; 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); dir_pred[i][j]=(int)((df_pred+db_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]-dir_pred[i][j]; } } *dir_sad += find_sad(input->hadamard, img->m7); } } 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); dir_pred[i][j]=(int)((df_pred+db_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]-dir_pred[i][j]; } } *dir_sad += find_sad(input->hadamard, img->m7); } // else } // else } // block_x } // block_y } // mb_x } // mb_y}void compare_sad(int tot_intra_sad, int fw_sad, int bw_sad, int bid_sad, int dir_sad){ int hv, i, j; int InterIntraSave ; InterIntraSave = img->mb_data[img->current_mb_nr].intraOrInter ; img->mb_data[img->current_mb_nr].intraOrInter = INTER_MB ; // LG : dfMV, dbMV reset if( (dir_sad<=tot_intra_sad) && (dir_sad<=fw_sad) && (dir_sad<=bw_sad) && (dir_sad<=bid_sad) ) { img->imod = B_Direct; img->mb_mode = 0; for(hv=0; hv<2; hv++) for(i=0; i<4; i++) for(j=0; j<4; j++) tmp_fwMV[hv][img->block_y+j][img->block_x+i+4]= tmp_bwMV[hv][img->block_y+j][img->block_x+i+4]=0; } else if( (bw_sad<=tot_intra_sad) && (bw_sad<=fw_sad) && (bw_sad<=bid_sad) && (bw_sad<=dir_sad) ) { img->imod = B_Backward; img->mb_mode = img->bw_mb_mode; for(hv=0; hv<2; hv++) for(i=0; i<4; i++) for(j=0; j<4; j++) tmp_fwMV[hv][img->block_y+j][img->block_x+i+4]= dfMV[hv][img->block_y+j][img->block_x+i+4]= dbMV[hv][img->block_y+j][img->block_x+i+4]=0; } else if( (fw_sad<=tot_intra_sad) && (fw_sad<=bw_sad) && (fw_sad<=bid_sad) && (fw_sad<=dir_sad) ) { img->imod = B_Forward; img->mb_mode = img->fw_mb_mode; for(hv=0; hv<2; hv++) for(i=0; i<4; i++) for(j=0; j<4; j++) tmp_bwMV[hv][img->block_y+j][img->block_x+i+4]= dfMV[hv][img->block_y+j][img->block_x+i+4]= dbMV[hv][img->block_y+j][img->block_x+i+4]=0; } else if( (bid_sad<=tot_intra_sad) && (bid_sad<=fw_sad) && (bid_sad<=bw_sad) && (bid_sad<=dir_sad) ) { img->imod = B_Bidirect; img->mb_mode = 3; for(hv=0; hv<2; hv++) for(i=0; i<4; i++) for(j=0; j<4; j++) dfMV[hv][img->block_y+j][img->block_x+i+4]= dbMV[hv][img->block_y+j][img->block_x+i+4]=0; } else if( (tot_intra_sad<=dir_sad) && (tot_intra_sad<=bw_sad) && (tot_intra_sad<=fw_sad) && (tot_intra_sad<=bid_sad) ) { img->mb_mode=img->imod+8*img->type; // img->type=2 img->mb_data[img->current_mb_nr].intraOrInter = InterIntraSave; for(hv=0; hv<2; hv++) for(i=0; i<4; i++) for(j=0; j<4; j++) tmp_fwMV[hv][img->block_y+j][img->block_x+i+4]= tmp_bwMV[hv][img->block_y+j][img->block_x+i+4]= dfMV[hv][img->block_y+j][img->block_x+i+4]= dbMV[hv][img->block_y+j][img->block_x+i+4]=0; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -