📄 rdopt.c
字号:
{
best_mpr_tmp[i][j]=img->mpr[i][j];
}
}
//--- coeff, cbp, kac ---
if (mode || bframe)
{
i4p=cofAC; cofAC=img->cofAC; img->cofAC=i4p;
i3p=cofDC; cofDC=img->cofDC; img->cofDC=i3p;
cbp = currMB->cbp;
cbp_blk = currMB->cbp_blk;
if(1)//input->InterlaceCodingOption == SMB_CODING)
{
for(j=0;j<4;j++)
for(k=0;k<2;k++)
for(l=0;l<17;l++)
{
temp_chroma = chromacofAC4x4[0][j][k][l];
chromacofAC4x4[0][j][k][l] = img->chromacofAC[0][j][k][l];
img->chromacofAC[0][j][k][l] = temp_chroma;
temp_chroma = chromacofAC4x4[1][j][k][l];
chromacofAC4x4[1][j][k][l] = img->chromacofAC[1][j][k][l];
img->chromacofAC[1][j][k][l] = temp_chroma;
}
}
}
else
{
cbp = cbp_blk = 0;
}
for(j=stage_block8x8_pos/2/*lgp*/;j<2;j++)
for (i=0; i<2; i++)
{
frefframe[j][i] = frefar[(block_y>>1)+j ][(block_x>>1) +i ];
if (bframe)
{
brefframe[j][i] = brefar[(block_y>>1) +j ][(block_x>>1)+i ];
}
}
}
/*
*************************************************************************
* Function:Set stored macroblock parameters
* Input:
* Output:
* Return:
* Attention:
*************************************************************************
*/
void set_stored_macroblock_parameters ()
{
int i, j, k, ****i4p, ***i3p,l;
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
int mode = best_mode;
int bframe = (img->type==B_IMG);
int **frefar = ((img->type==B_IMG)? fw_refFrArr : refFrArr);
int **brefar = bw_refFrArr;
int **ipredmodes = img->ipredmode;
int block_x = img->block_x;
int block_y = img->block_y;
int cp_table[2][6] = {{1,1,1,1,1,1},{0,0,1,1,0,1}};/*lgp*/
int stage_block8x8_pos=0;/*lgp*/
int temp_chroma;
//===== reconstruction values =====
for (j=0; j<16; j++)
for (i=0; i<16; i++)
{
imgY[img->pix_y+j][img->pix_x+i] = rec_mbY[j][i];
}
for (j=0; j<8; j++)
for (i=0; i<8; i++)
{
imgUV[0][img->pix_c_y+j][img->pix_c_x+i] = rec_mbU[j][i];
imgUV[1][img->pix_c_y+j][img->pix_c_x+i] = rec_mbV[j][i];
}
//===== coefficients and cbp =====
i4p=cofAC; cofAC=img->cofAC; img->cofAC=i4p;
i3p=cofDC; cofDC=img->cofDC; img->cofDC=i3p;
currMB->cbp = cbp;
currMB->cbp_blk = cbp_blk;
//==== macroblock type ====
currMB->mb_type = mode;
// !! shenyanfei
img->weighting_prediction = best_weight_flag ;
for(j=0;j<4;j++)
for(k=0;k<2;k++)
for(l=0;l<17;l++)
{
temp_chroma = chromacofAC4x4[0][j][k][l];
chromacofAC4x4[0][j][k][l] = img->chromacofAC[0][j][k][l];
img->chromacofAC[0][j][k][l] = temp_chroma;
temp_chroma = chromacofAC4x4[1][j][k][l];
chromacofAC4x4[1][j][k][l] = img->chromacofAC[1][j][k][l];
img->chromacofAC[1][j][k][l] = temp_chroma;
}
for (i=stage_block8x8_pos; i<4; i++)
{
currMB->b8mode[i] = b8mode[i];
currMB->b8pdir[i] = b8pdir[i];
}
//==== reference frames =====
for (j=stage_block8x8_pos/2; j<2; j++)
for (i=0; i<2; i++)
{
frefar[(block_y>>1)+j][(block_x>>1)+i] = frefframe[j][i];
}
if (bframe)
{
for (j=stage_block8x8_pos/2; j<2; j++)
for (i=0; i<2; i++)
{
brefar[(block_y>>1)+j][(block_x>>1)+i] = brefframe[j][i];
}
}
if(currMB->mb_type == I4MB) //add by qwang
{
for(i=stage_block8x8_pos; i<4; i++)
currMB->intra_pred_modes[i]=best_intra_pred_modes_tmp[i];
for(j=stage_block8x8_pos/2;j<2;j++)
for(i=0;i<2;i++)
img->ipredmode[ 1 + (img->mb_x<<1) + i ][ 1 + (img->mb_y<<1) + j ]=best_ipredmode_tmp[i][j];
for(j=0;j<16;j++)
for(i=0;i<16;i++)
{
img->mpr[i][j]=best_mpr_tmp[i][j];
}
}
//==== intra prediction modes ====
currMB->c_ipred_mode = best_c_imode;
if (mode==P8x8)
{
for (j=img->block8_y+stage_block8x8_pos/2+1; j<img->block8_y+3; j++)
for ( i=img->block8_x+1; i<img->block8_x+3; i++)
{
k = 2*(j-img->block8_y-1)+i-img->block8_x-1;
ipredmodes[i][j] = b8_ipredmode[k];
currMB->intra_pred_modes[k] = b8_intra_pred_modes[k];
}
}
else if (mode!=I4MB)
{
for (j=img->block8_y+stage_block8x8_pos/2+1; j<img->block8_y+3; j++)
for ( i=img->block8_x+1; i<img->block8_x+3; i++)
{
k = 2*(j-img->block8_y-1)+i-img->block8_x-1;
// ipredmodes [i][j] = DC_PRED;
currMB->intra_pred_modes[k] = DC_PRED;
ipredmodes [i][j] = -1;
// currMB->intra_pred_modes[k] = -1;
}
}
//==== motion vectors =====
SetMotionVectorsMB (currMB, bframe);
storeMotionInfo(stage_block8x8_pos/2);
}
/*
*************************************************************************
* Function:Set reference frames and motion vectors
* Input:
* Output:
* Return:
* Attention:
*************************************************************************
*/
void SetRefAndMotionVectors (int block, int mode, int ref, int bw_ref,int pdir)/*lgp*13*/
{
int i, j;
int bframe = (img->type==B_IMG);
int pmode = (mode==1||mode==2||mode==3?mode:4);
int j0 = (block/2);
int i0 = (block%2);
int j1 = j0 + (input->blc_size[pmode][1]>>3);
int i1 = i0 + (input->blc_size[pmode][0]>>3);
int** frefArr = (bframe ? fw_refFrArr : refFrArr);
int** brefArr = bw_refFrArr;
//int*** fmvArr = (bframe ? tmp_fwMV : tmp_mv);
int*** bmvArr = tmp_bwMV;
//int***** all_mv_arr = img->all_mv;
int***** all_bmv_arr = img->all_bmv;
int block_x = img->block_x>>1;
int block_y = img->block_y>>1;
int*** fmvArr = (bframe ? tmp_fwMV : tmp_mv);
int***** all_mv_arr = (pdir==2 && mode != 0 /*&&mode ! =IBLOCK*/)?img->all_omv:img->all_mv; //mode != 0 added by xyji 7.11
if ((pdir==0 || pdir==2) && (mode!=IBLOCK && mode!=0))
{
for (j=j0; j<j1; j++)
for (i=i0; i<i1; i++)
{
fmvArr[0][block_y+j][block_x+i+4] = all_mv_arr[i][j][ref][mode][0];
fmvArr[1][block_y+j][block_x+i+4] = all_mv_arr[i][j][ref][mode][1];
frefArr [block_y+j][block_x+i ] = ref;
}
}
else
{
if(!mode&&bframe)
{
for (j=j0; j<j0+1; j++)
for (i=i0; i<i0+1; i++)
{
if(img->picture_structure)
ref = 0;
if(ref==-1)
{
fmvArr[0][block_y+j][block_x+i+4] = 0;
fmvArr[1][block_y+j][block_x+i+4] = 0;
frefArr [block_y+j][block_x+i ] = -1;
}
else
{
fmvArr[0][block_y+j][block_x+i+4] = all_mv_arr[i][j][ref][mode][0];
fmvArr[1][block_y+j][block_x+i+4] = all_mv_arr[i][j][ref][mode][1];
if(img->picture_structure)
ref = 0;
frefArr [block_y+j][block_x+i ] = ref;//???????for direct mode with ref;
}
}
}
else
for (j=j0; j<j0+1; j++)
for (i=i0; i<i0+1; i++)
{
fmvArr[0][block_y+j][block_x+i+4] = 0;
fmvArr[1][block_y+j][block_x+i+4] = 0;
frefArr [block_y+j][block_x+i ] = -1;
}
}
if ((pdir==1 || pdir==2) && (mode!=IBLOCK && mode!=0))
{
for (j=j0; j<j0+1; j++)
for (i=i0; i<i0+1; i++)
{
if(pdir == 2)
{
{
int delta_P,TRp,DistanceIndexFw,DistanceIndexBw,refframe,delta_PB;
refframe = ref;
delta_P = 2*(img->imgtr_next_P_frm - img->imgtr_last_P_frm);
if(img->picture_structure)
TRp = (refframe+1)*delta_P; //the lates backward reference
else
{
TRp = delta_P;//refframe == 0 ? delta_P-1 : delta_P+1;
}
delta_PB = 2*(picture_distance - img->imgtr_last_P_frm); // Tsinghua 200701
if(!img->picture_structure)
{
if(img->current_mb_nr_fld < img->total_number_mb) //top field
DistanceIndexFw = refframe == 0 ? delta_PB-1:delta_PB;
else
DistanceIndexFw = refframe == 0 ? delta_PB:delta_PB+1;
}
else
DistanceIndexFw = delta_PB;
//DistanceIndexBw = TRp - DistanceIndexFw;
DistanceIndexBw = (TRp - DistanceIndexFw+512)%512; // Added by Zhijie Yang, 20070419, Broadcom
bmvArr[0][block_y+j][block_x+i+4] = - ((all_mv_arr[i][j][ref][mode][0]*DistanceIndexBw*(512/DistanceIndexFw)+256)>>9);
bmvArr[1][block_y+j][block_x+i+4] = - ((all_mv_arr[i][j][ref][mode][1]*DistanceIndexBw*(512/DistanceIndexFw)+256)>>9);
}
}
else
{
bmvArr[0][block_y+j][block_x+i+4] = all_bmv_arr[i][j][bw_ref][mode][0];
bmvArr[1][block_y+j][block_x+i+4] = all_bmv_arr[i][j][bw_ref][mode][1];
}
brefArr [block_y+j][block_x+i ] = bw_ref;/*lgp*13*/
}
}
else if (bframe)
{
if(!mode)
{
for (j=j0; j<j0+1; j++)
for (i=i0; i<i0+1; i++)
{
{
if(!img->picture_structure)
{
if(refFrArr[block_y+j][block_x+i] >= 0)
{
bmvArr[0][block_y+j][block_x+i+4] = all_bmv_arr[i][j][bw_ref][mode][0];
bmvArr[1][block_y+j][block_x+i+4] = all_bmv_arr[i][j][bw_ref][mode][1];
}
else//intra prediction
{
bmvArr[0][block_y+j][block_x+i+4] = all_bmv_arr[i][j][1][mode][0];
bmvArr[1][block_y+j][block_x+i+4] = all_bmv_arr[i][j][1][mode][1];
}
if(img->current_mb_nr_fld < img->total_number_mb)
brefArr [block_y+j][block_x+i ] = 1;
else
brefArr [block_y+j][block_x+i ] = 0;
if(refFrArr[block_y+j][block_x+i] < 0)
brefArr [block_y+j][block_x+i ] = 1;
}
else
{
bmvArr[0][block_y+j][block_x+i+4] = all_bmv_arr[i][j][0][mode][0];
bmvArr[1][block_y+j][block_x+i+4] = all_bmv_arr[i][j][0][mode][1];
ref = refFrArr[block_y+j][block_x+i];
//sw 11.23
if(img->picture_structure)
brefArr [block_y+j][block_x+i ] = 0;// min(ref,0);
else
brefArr [block_y+j][block_x+i ] = 0;
}
}
}
}
else
{
for (j=j0; j<j0+1; j++)
for (i=i0; i<i0+1; i++)
{
bmvArr[0][block_y+j][block_x+i+4] = 0;
bmvArr[1][block_y+j][block_x+i+4] = 0;
brefArr [block_y+j][block_x+i ] = -1;
}
}
}
}
/*
*************************************************************************
* Function:Mode Decision for a macroblock
* Input:
* Output:
* Return:
* Attention:
*************************************************************************
*/
void encode_one_macroblock ()
{
static const int b8_mode_table[2] = {0, 4}; // DO NOT CHANGE ORDER !!!
static const int mb_mode_table[7] = {0, 1, 2, 3, P8x8, I16MB, I4MB}; // DO NOT CHANGE ORDER !!!
int valid[MAXMODE];
int block, index, mode, i0, i1, j0, j1, pdir, ref, i, j, k, ctr16x16, dummy;
double qp, lambda_mode, lambda_motion, min_rdcost, rdcost = 0, max_rdcost=1e30;
int lambda_motion_factor;
int fw_mcost, bw_mcost, bid_mcost, mcost, max_mcost=(1<<30);
int curr_cbp_blk, cnt_nonz = 0, best_cnt_nonz = 0, best_fw_ref = 0, best_pdir;
int cost, min_cost, cost8x8, cost_direct=0, have_direct=0;
int intra = img->type==INTRA_IMG;
int bframe = img->type==B_IMG;
int write_ref = input->no_multpred>1;
int max_ref = img->nb_references;
int adjust_ref;
Macroblock* currMB = &img->mb_data[img->current_mb_nr];
int **ipredmodes = img->ipredmode;
int block_x = img->block_x;/*lgp*/
int block_y = img->block_y;
int best_bw_ref;
int ***tmpmvs = tmp_mv;
int *****allmvs = img->all_mv;
int **refar = refFrArr;
int incr_y=1,off_y=0;/*lgp*/
int stage_block8x8_pos=0;/*lgp*/
int best_bid_ref = 0;
int bid_best_fw_ref = 0, bid_best_bw_ref = 0;
int scale_refframe;
int min_cost_8x8;
adjust_ref = (img->type==B_IMG? (mref==mref_fld)? 2 : 1 : 0);
adjust_ref = min(adjust_ref, max_ref-1);
if(!img->picture_structure)
{
max_ref = min (img->nb_references, img->buf_cycle);
adjust_ref = 0;
if (max_ref > 2 && img->type == B_IMG)
max_ref = 2;
if(img->old_type!=img->type)
max_ref = 1;
}else
{
max_ref = min (img->nb_references, img->buf_cycle);
adjust_ref = 0;
if (max_ref > 1 && img->type == B_IMG)
max_ref = 1;
}
//FAST MOTION ESTIMATION. ZHIBO CHEN 2003.3
//in case the neighboring block is intra block
#ifdef FastME
decide_intrabk_SAD();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -