📄 b_frame.c
字号:
int fw_pred, bw_pred, bid_pred[4][4];
int code_num, step_h, step_v, mvd_x, mvd_y;
// consider code number of fw_predframe_no
*bid_sad = QP2QUANT[img->qp]*min(fw_predframe_no,1)*2;
// consider bits of fw_blk_size
if(img->fw_blc_size_h==16 && img->fw_blc_size_v==16) // 16x16 : blocktype 1
code_num=0;
else if(img->fw_blc_size_h==16 && img->fw_blc_size_v==8) // 16x8 : blocktype 2
code_num=1;
else if(img->fw_blc_size_h==8 && img->fw_blc_size_v==16) // 8x16 : blocktype 3
code_num=2;
else if(img->fw_blc_size_h==8 && img->fw_blc_size_v==8) // 8x8 : blocktype 4
code_num=3;
else if(img->fw_blc_size_h==8 && img->fw_blc_size_v==4) // 8x4 : blocktype 5
code_num=4;
else if(img->fw_blc_size_h==4 && img->fw_blc_size_v==8) // 4x8 : blocktype 6
code_num=5;
else // 4x4 : blocktype 7
code_num=6;
*bid_sad += QP2QUANT[img->qp]*img->blk_bituse[code_num];
// consider bits of bw_blk_size
if(img->bw_blc_size_h==16 && img->bw_blc_size_v==16) // 16x16 : blocktype 1
code_num=0;
else if(img->bw_blc_size_h==16 && img->bw_blc_size_v==8) // 16x8 : blocktype 2
code_num=1;
else if(img->bw_blc_size_h==8 && img->bw_blc_size_v==16) // 8x16 : blocktype 3
code_num=2;
else if(img->bw_blc_size_h==8 && img->bw_blc_size_v==8) // 8x8 : blocktype 4
code_num=3;
else if(img->bw_blc_size_h==8 && img->bw_blc_size_v==4) // 8x4 : blocktype 5
code_num=4;
else if(img->bw_blc_size_h==4 && img->bw_blc_size_v==8) // 4x8 : blocktype 6
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];
#ifndef UMV // DM : To prevent mv outside the frame
if((jj4>=img->height*8-24)||(jj4<0)||(ii4>=img->width*8-24)||(ii4<0)
||(jjj4>=img->height*8-24)||(jjj4<0)||(iii4>=img->width*8-24)||(iii4<0))
{
*bid_sad= MAX_DIR_SAD;
return;
}
#endif
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);
bw_pred = UMVPelY_18 (mref_P, jjj4+j2, iii4+i2);
#else
fw_pred = FastPelY_18 (mref[img->fw_multframe_no],jj4+j2,ii4+i2);
bw_pred = FastPelY_18 (mref_P, jjj4+j2, iii4+i2);
#endif
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];
#ifndef UMV
// DM : To prevent mv outside the frame
if((jj4>=img->height*4-12)||(jj4<0)||(ii4>=img->width*4-12)||(ii4<0)
||(jjj4>=img->height*4-12)||(jjj4<0)||(iii4>=img->width*4-12)||(iii4<0))
{
*bid_sad= MAX_DIR_SAD;
return;
}
#endif
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);
bw_pred=UMVPelY_14 (mref_P, jjj4+j2, iii4+i2);
#else
fw_pred=FastPelY_14 (mref[img->fw_multframe_no], jj4+j2, ii4+i2);
bw_pred=FastPelY_14 (mref_P, jjj4+j2, iii4+i2);
#endif
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];
#ifndef UMV
// LG : To prevent mv outside the frame
/* -> corrected by HS
if( (jj4 >= (img->height*8- 24) )||(jj4<0)||
(ii4 >= (img->width*8 - 24) )||(ii4<0) ||
(jjj4>= (img->height*8- 24) )||(jjj4<0)||
(iii4>= (img->width*8 - 24) )||(iii4<0) )
*/
if( (jj4 >= 8*(img->height-1) - 24) || (jj4 < 0 ) ||
(ii4 >= 8*(img->width -1) - 24) || (ii4 < 0 ) ||
(jjj4 >= 8*(img->height-1) - 24) || (jjj4 < 0 ) ||
(iii4 >= 8*(img->width -1) - 24) || (iii4 < 0 ) )
{
*dir_sad= MAX_DIR_SAD;
return;
}
else
#endif
{
// 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
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];
#ifndef UMV
// LG : To prevent mv outside the frame
/* -> corrected by HS
if( (jj4 >= (img->height*4- 12) )||(jj4<0)||
(ii4 >= (img->width*4 - 12) )||(ii4<0) ||
(jjj4>= (img->height*4- 12) )||(jjj4<0)||
(iii4>= (img->width*4 - 12) )||(iii4<0) )
*/
if( (jj4 >= 4*(img->height-1) - 12) || (jj4 < 0 ) ||
(ii4 >= 4*(img->width -1) - 12) || (ii4 < 0 ) ||
(jjj4 >= 4*(img->height-1) - 12) || (jjj4 < 0 ) ||
(iii4 >= 4*(img->width -1) - 12) || (iii4 < 0 ) )
{
*dir_sad= MAX_DIR_SAD;
return;
}
else
#endif
{
// 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
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;
// 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
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 + -