📄 rdopt.c
字号:
frefframe[1] = frefar[block_y ][img->block_x+2];
frefframe[2] = frefar[block_y+2][img->block_x ];
frefframe[3] = frefar[block_y+2][img->block_x+2];
if (bframe)
{
brefframe[0] = brefar[block_y ][img->block_x ];
brefframe[1] = brefar[block_y ][img->block_x+2];
brefframe[2] = brefar[block_y+2][img->block_x ];
brefframe[3] = brefar[block_y+2][img->block_x+2];
}
*/
}
/*!
*************************************************************************************
* \brief
* Set stored macroblock parameters
*************************************************************************************
*/
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 || img->type==BS_IMG);
int **frefar = ((img->type==B_IMG || img->type==BS_IMG)? fw_refFrArr : refFrArr);
int **abp_type_arr = abp_type_FrArr;
int **brefar = bw_refFrArr;
int **ipredmodes = img->ipredmode;
int block_y = img->block_y;
if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive && img->field_mode)
{
block_y = img->field_block_y;
if(img->top_field)
{
ipredmodes = img->ipredmode_top;
frefar = (img->type==B_IMG || img->type==BS_IMG) ? fw_refFrArr_top : refFrArr_top;
abp_type_arr = abp_type_FrArr_top;
brefar = bw_refFrArr_top;
}
else
{
ipredmodes = img->ipredmode_bot;
frefar = (img->type==B_IMG || img->type==BS_IMG) ? fw_refFrArr_bot : refFrArr_bot;
abp_type_arr = abp_type_FrArr_bot;
brefar = bw_refFrArr_bot;
}
}
//===== 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];
if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive)
rdopt->rec_mbY[j][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];
if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive)
{
rdopt->rec_mbU[j][i] = rec_mbU[j][i];
rdopt->rec_mbV[j][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;
if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive)
{
rdopt->mode = mode;
rdopt->i16offset = img->i16offset; // For MBINTLC -Rajeev
rdopt->cbp = cbp;
rdopt->cbp_blk = cbp_blk;
rdopt->mb_type = mode;
for(i=0;i<6;i++)
for(j=0;j<4;j++)
for(k=0;k<2;k++)
for(l=0;l<18;l++)
rdopt->cofAC[i][j][k][l] = img->cofAC[i][j][k][l];
for(i=0;i<3;i++)
for(k=0;k<2;k++)
for(l=0;l<18;l++)
rdopt->cofDC[i][k][l] = img->cofDC[i][k][l];
}
for (i=0; i<4; i++)
{
currMB->b8mode[i] = b8mode[i];
currMB->b8pdir[i] = b8pdir[i];
if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive)
{
rdopt->b8mode[i] = b8mode[i];
rdopt->b8pdir[i] = b8pdir[i];
}
}
if (input->rdopt==2 && img->type!=B_IMG)
{
//! save the MB Mode of every macroblock
decs->dec_mb_mode[img->mb_x][img->mb_y] = mode;
}
//==== reference frames =====
for (j=0; j<4; j++)
for (i=0; i<4; i++)
{
frefar[block_y+j][img->block_x+i] = frefframe[j][i];
// frefar[block_y+j][img->block_x+i] = frefframe[2*(j/2) + (i/2)];
if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive)
rdopt->frefar[j][i] = frefar[block_y+j][img->block_x+i];
}
if (bframe)
{
for (j=0; j<4; j++)
for (i=0; i<4; i++)
{
// brefar[block_y+j][img->block_x+i] = brefframe[2*(j/2) + (i/2)];
brefar[block_y+j][img->block_x+i] = brefframe[j][i];
if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive)
rdopt->brefar[j][i] = brefar[block_y+j][img->block_x+i];
if (img->type==BS_IMG)
{
refFrArr [block_y+j][img->block_x+i] = frefar[block_y+j][img->block_x+i];
abp_type_arr[block_y+j][img->block_x+i] = abp_typeframe[j][i];
}
}
}
//==== intra prediction modes ====
currMB->c_ipred_mode = best_c_imode;
img->i16offset = best_i16offset;
if (mode==P8x8)
{
for (k=0, j=block_y+1; j<block_y+5; j++)
for ( i=img->block_x+1; i<img->block_x+5; i++, k++)
{
ipredmodes [i][j] = b8_ipredmode [k];
currMB->intra_pred_modes[k] = b8_intra_pred_modes[k];
}
}
else if (mode!=I4MB)
{
for (k=0, j=block_y+1; j<block_y+5; j++)
for ( i=img->block_x+1; i<img->block_x+5; i++, k++)
{
ipredmodes [i][j] = DC_PRED;
currMB->intra_pred_modes[k] = DC_PRED;
}
}
if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive)
{
for (k=0, j=block_y+1; j<block_y+5; j++)
for ( i=img->block_x+1; i<img->block_x+5; i++, k++)
{
rdopt->ipredmode[i][j] = ipredmodes[i][j];
rdopt->intra_pred_modes[k] = currMB->intra_pred_modes[k];
}
rdopt->c_ipred_mode = currMB->c_ipred_mode;
rdopt->i16offset = img->i16offset; // DH
}
//==== motion vectors =====
SetMotionVectorsMB (currMB, bframe);
}
/*!
*************************************************************************************
* \brief
* Set reference frames and motion vectors
*************************************************************************************
*/
void SetRefAndMotionVectors (int block, int mode, int ref, int pdir, int abp_type)
{
int i, j;
int bframe = (img->type==B_IMG || img->type==BS_IMG);
int** abp_type_arr = abp_type_FrArr;
int pmode = (mode==1||mode==2||mode==3?mode:4);
int j0 = ((block/2)<<1);
int i0 = ((block%2)<<1);
int j1 = j0 + (input->blc_size[pmode][1]>>2);
int i1 = i0 + (input->blc_size[pmode][0]>>2);
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_y = img->block_y;
if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive && img->field_mode)
{
block_y = img->field_block_y;
if(img->top_field)
{
frefArr = (bframe ? fw_refFrArr_top : refFrArr_top);
brefArr = bw_refFrArr_top;
fmvArr = (bframe ? tmp_fwMV_top : tmp_mv_top);
bmvArr = tmp_bwMV_top;
all_mv_arr = img->all_mv_top;
all_bmv_arr= img->all_bmv_top;
abp_type_arr = abp_type_FrArr_top;
}
else
{
frefArr = (bframe ? fw_refFrArr_bot : refFrArr_bot);
brefArr = bw_refFrArr_bot;
fmvArr = (bframe ? tmp_fwMV_bot : tmp_mv_bot);
bmvArr = tmp_bwMV_bot;
all_mv_arr = img->all_mv_bot;
all_bmv_arr= img->all_bmv_bot;
abp_type_arr = abp_type_FrArr_bot;
}
}
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][img->block_x+i+4] = all_mv_arr[i][j][ref][mode][0];
fmvArr[1][block_y+j][img->block_x+i+4] = all_mv_arr[i][j][ref][mode][1];
frefArr [block_y+j][img->block_x+i ] = ref;
}
}
else
{
if(!mode&&bframe)
{
for (j=j0; j<j0+2; j++)
for (i=i0; i<i0+2; i++)
{
if (input->direct_type)
ref = fwdir_refFrArr[block_y+j][img->block_x+i];
else
{
ref = refFrArr[block_y+j][img->block_x+i];
if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive && img->field_mode)
ref = img->top_field ? refFrArr_top[block_y+j][img->block_x+i]:refFrArr_bot[block_y+j][img->block_x+i];
}
abp_type_arr[block_y+j][img->block_x+i] = abp_type;
if(ref==-1)
{
fmvArr[0][block_y+j][img->block_x+i+4] = 0;
fmvArr[1][block_y+j][img->block_x+i+4] = 0;
frefArr [block_y+j][img->block_x+i ] = -1;
}
else
{
fmvArr[0][block_y+j][img->block_x+i+4] = all_mv_arr[i][j][ref][mode][0];
fmvArr[1][block_y+j][img->block_x+i+4] = all_mv_arr[i][j][ref][mode][1];
frefArr [block_y+j][img->block_x+i ] = ref;
}
}
}
else
for (j=j0; j<j0+2; j++)
for (i=i0; i<i0+2; i++)
{
fmvArr[0][block_y+j][img->block_x+i+4] = 0;
fmvArr[1][block_y+j][img->block_x+i+4] = 0;
frefArr [block_y+j][img->block_x+i ] = -1;
abp_type_arr[block_y+j][img->block_x+i] = abp_type;
}
}
if ((pdir==1 || pdir==2) && (mode!=IBLOCK && mode!=0))
{
for (j=j0; j<j0+2; j++)
for (i=i0; i<i0+2; i++)
{
if (abp_type==1 && img->type==BS_IMG)
{
bmvArr[0][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][0][mode][0];
bmvArr[1][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][0][mode][1];
brefArr [block_y+j][img->block_x+i ] = 0;
abp_type_arr[block_y+j][img->block_x+i] = 1;
}
else if (abp_type==2 && img->type==BS_IMG)
{
bmvArr[0][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][1][mode][0];
bmvArr[1][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][1][mode][1];
brefArr [block_y+j][img->block_x+i ] = 1;
abp_type_arr[block_y+j][img->block_x+i] = 2;
}
else
{
bmvArr[0][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][0][mode][0];
bmvArr[1][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][0][mode][1];
brefArr [block_y+j][img->block_x+i ] = 0;
abp_type_arr[block_y+j][img->block_x+i] = 0;
}
}
}
else if (bframe)
{
if(!mode)
for (j=j0; j<j0+2; j++)
for (i=i0; i<i0+2; i++)
{
if(img->type==BS_IMG)
{
if (bwdir_refFrArr[block_y+j][img->block_x+i]==-1)
{
bmvArr[0][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][1][mode][0];
bmvArr[1][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][1][mode][1];
}
else
{
bmvArr[0][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][bwdir_refFrArr[block_y+j][img->block_x+i]][mode][0];
bmvArr[1][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][bwdir_refFrArr[block_y+j][img->block_x+i]][mode][1];
}
brefArr [block_y+j][img->block_x+i ] = bwdir_refFrArr[block_y+j][img->block_x+i];
}
else
{
bmvArr[0][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][0][mode][0];
bmvArr[1][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][0][mode][1];
if (input->direct_type)
brefArr [block_y+j][img->block_x+i ] = bwdir_refFrArr[block_y+j][img->block_x+i];
else
brefArr [block_y+j][img->block_x+i ] = min(ref,0);
}
abp_type_arr[block_y+j][img->block_x+i] = abp_type;
}
else
for (j=j0; j<j0+2; j++)
for (i=i0; i<i0+2; i++)
{
bmvArr[0][block_y+j][img->block_x+i+4] = 0;
bmvArr[1][block_y+j][img->block_x+i+4] = 0;
brefArr [block_y+j][img->block_x+i ] = -1;
abp_type_arr[block_y+j][img->block_x+i] = abp_type;
}
}
}
/*!
*************************************************************************************
* \brief
* Mode Decision for a macroblock
*************************************************************************************
*/
void encode_one_macroblock ()
{
static const int b8_mode_table[6] = {0, 4, 5, 6, 7}; // 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 rerun, 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, i16mode;
int intra1;
int intra = ((img->type==INTER_IMG && img->mb_y==img->mb_y_upd && img->mb_y_upd!=img->mb_y_intra) || img->type==INTRA_IMG);
int spframe = (img->type==INTER_IMG && img->types==SP_IMG);
int siframe = (img->type==INTRA_IMG && img->types==SP_IMG);
int bframe = (img->type==B_IMG || img->type==BS_IMG);
int write_ref = (input->no_multpred>1 || input->add_ref_frame>0);
int runs = (input->RestrictRef==1 && input->rdopt==2 && (img->type==INTER_IMG || img->type==BS_IMG) ? 2 : 1);
int max_ref = img->nb_references;
// Tian Dong. PLUS1. Add the following line:
int adjust_ref;
int checkref = (input->rdopt && input->RestrictRef && img->type==INTER_IMG);
Macroblock* currMB = &img->mb_data[img->current_mb_nr];
int **ipredmodes = img->ipredmode;
int block_y = img->block_y;
int best_bw_ref;
int best_abp_type;
int ***tmpmvs = tmp_mv;
int *****allmvs = img->all_mv;
int **refar = refFrArr;
#ifdef ABIPRED
int tmp_fw_ref, tmp_bw_ref;
#endif
intra |= RandomIntra (img->current_mb_nr); // Forced Pseudo-Random
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -