📄 rdopt.c
字号:
if (*cnt_nonz)
{
rate += writeLumaCoeff8x8 (block, 0);
}
return (double)distortion + lambda * (double)rate;
}
/*!
*************************************************************************************
* \brief
* Gets mode offset for intra16x16 mode
*************************************************************************************
*/
int I16Offset (int cbp, int i16mode)
{
return (cbp&15?13:1) + i16mode + ((cbp&0x30)>>2);
}
/*!
*************************************************************************************
* \brief
* Sets modes and reference frames for an macroblock
*************************************************************************************
*/
void SetModesAndRefframeForBlocks (int mode)
{
int i,j,k,l;
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
// int bframe = (img->type==B_SLICE || img->type==BS_IMG);
int bframe = (img->type==B_SLICE);
int **abp_type_arr = abp_type_FrArr;
int **fwrefarr = fw_refFrArr;
int **bwrefarr = bw_refFrArr;
int **frefarr = refFrArr;
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 = refFrArr_top;
fwrefarr = fw_refFrArr_top;
bwrefarr = bw_refFrArr_top;
abp_type_arr = abp_type_FrArr_top;
}
else
{
frefarr = refFrArr_bot;
fwrefarr = fw_refFrArr_bot;
bwrefarr = bw_refFrArr_bot;
abp_type_arr = abp_type_FrArr_bot;
}
}
//--- macroblock type ---
currMB->mb_type = mode;
//--- block 8x8 mode and prediction direction ---
switch (mode)
{
case 0:
for(i=0;i<4;i++)
{
currMB->b8mode[i] = 0;
currMB->b8pdir[i] = (bframe?2:0);
if ((input->direct_type)&&(img->type!=P_SLICE))
{
if (fwdir_refFrArr[img->block_y+(i/2)*2][img->block_x+(i%1)*2] == -1) currMB->b8pdir[i] =1;
else if (bwdir_refFrArr[img->block_y+(i/2)*2][img->block_x+(i%1)*2] == -1) currMB->b8pdir[i] =0;
else currMB->b8pdir[i]=2;
}
}
break;
case 1:
case 2:
case 3:
for(i=0;i<4;i++)
{
currMB->b8mode[i] = mode;
currMB->b8pdir[i] = best8x8pdir[mode][i];
}
break;
case P8x8:
for(i=0;i<4;i++)
{
currMB->b8mode[i] = best8x8mode[i];
currMB->b8pdir[i] = best8x8pdir[mode][i];
}
break;
case I4MB:
for(i=0;i<4;i++)
{
currMB->b8mode[i] = IBLOCK;
currMB->b8pdir[i] = -1;
}
break;
case I16MB:
for(i=0;i<4;i++)
{
currMB->b8mode[i] = 0;
currMB->b8pdir[i] = -1;
}
break;
default:
printf ("Unsupported mode in SetModesAndRefframeForBlocks!\n");
exit (1);
}
#define IS_FW ((best8x8pdir[mode][k]==0 || best8x8pdir[mode][k]==2) && (mode!=P8x8 || best8x8mode[k]!=0 || !bframe))
#define IS_BW ((best8x8pdir[mode][k]==1 || best8x8pdir[mode][k]==2) && (mode!=P8x8 || best8x8mode[k]!=0))
//--- reference frame arrays ---
if (mode==0 || mode==I4MB || mode==I16MB)
{
if (bframe)
{
for (j=0;j<4;j++)
for (i=0;i<4;i++)
{
if(!mode)
{
//if (img->type==BS_IMG)
if(img->type==B_SLICE && img->nal_reference_idc>0)
{
fwrefarr[block_y+j][img->block_x+i] = fwdir_refFrArr[block_y+j][img->block_x+i];
bwrefarr[block_y+j][img->block_x+i] = bwdir_refFrArr[block_y+j][img->block_x+i];
frefarr [block_y+j][img->block_x+i] = fwdir_refFrArr[block_y+j][img->block_x+i];
abp_type_arr[block_y+j][img->block_x+i] = best8x8abp_type[mode][2*(j/2)+(i/2)];
enc_picture->ref_idx[LIST_0][img->block_x+i][img->block_y+j] = fwrefarr[block_y+j][img->block_x+i];
enc_picture->ref_idx[LIST_1][img->block_x+i][img->block_y+j] = bwrefarr[block_y+j][img->block_x+i];
}
else
{
if (input->direct_type)
{
fwrefarr[block_y+j][img->block_x+i] = fwdir_refFrArr[block_y+j][img->block_x+i];
bwrefarr[block_y+j][img->block_x+i] = bwdir_refFrArr[block_y+j][img->block_x+i];
enc_picture->ref_idx[LIST_0][img->block_x+i][img->block_y+j] = fwrefarr[block_y+j][img->block_x+i];
enc_picture->ref_idx[LIST_1][img->block_x+i][img->block_y+j] = bwrefarr[block_y+j][img->block_x+i];
}
else
{
fwrefarr[block_y+j][img->block_x+i] = frefarr[block_y+j][img->block_x+i];
bwrefarr[block_y+j][img->block_x+i] = min(frefarr[block_y+j][img->block_x+i],0);
enc_picture->ref_idx[LIST_0][img->block_x+i][img->block_y+j] = fwrefarr[block_y+j][img->block_x+i];
enc_picture->ref_idx[LIST_1][img->block_x+i][img->block_y+j] = bwrefarr[block_y+j][img->block_x+i];
}
}
}
else
{
fwrefarr[block_y+j][img->block_x+i] = -1;
bwrefarr[block_y+j][img->block_x+i] = -1;
enc_picture->ref_idx[LIST_0][img->block_x+i][img->block_y+j] = fwrefarr[block_y+j][img->block_x+i];
enc_picture->ref_idx[LIST_1][img->block_x+i][img->block_y+j] = bwrefarr[block_y+j][img->block_x+i];
//if (img->type==BS_IMG)
if(img->type==B_SLICE && img->nal_reference_idc>0)
{
frefarr [block_y+j][img->block_x+i] = -1;
abp_type_arr[block_y+j][img->block_x+i] = best8x8abp_type[mode][2*(j/2)+(i/2)];
}
}
enc_picture->ref_pic_id [LIST_0][img->block_x+i][img->block_y+j] = enc_picture->ref_pic_num[LIST_0][enc_picture->ref_idx[LIST_0][img->block_x+i][img->block_y+j]];
enc_picture->ref_pic_id [LIST_1][img->block_x+i][img->block_y+j] = enc_picture->ref_pic_num[LIST_1][enc_picture->ref_idx[LIST_1][img->block_x+i][img->block_y+j]];
}
}
else
{
for (j=0;j<4;j++)
for (i=0;i<4;i++)
{
frefarr [block_y+j][img->block_x+i] = (mode==0?0:-1);
enc_picture->ref_idx[LIST_0][img->block_x+i][img->block_y+j] = (mode==0?0:-1);
enc_picture->ref_pic_id [LIST_0][img->block_x+i][img->block_y+j] = enc_picture->ref_pic_num[LIST_0][enc_picture->ref_idx[LIST_0][img->block_x+i][img->block_y+j]];
}
}
}
else
{
if (bframe)
{
for (j=0;j<4;j++)
for (i=0;i<4;i++)
{
k = 2*(j/2)+(i/2);
l = 2*(j%2)+(i%2);
//if (img->type==BS_IMG)
if(img->type==B_SLICE && img->nal_reference_idc>0)
{
if(mode == P8x8 && best8x8mode[k]==0)
{
fwrefarr[block_y+j][img->block_x+i] = fwdir_refFrArr[block_y+j][img->block_x+i];
bwrefarr[block_y+j][img->block_x+i] = bwdir_refFrArr[block_y+j][img->block_x+i];
enc_picture->ref_idx[LIST_0][img->block_x+i][img->block_y+j] = fwrefarr[block_y+j][img->block_x+i];
enc_picture->ref_idx[LIST_1][img->block_x+i][img->block_y+j] = bwrefarr[block_y+j][img->block_x+i];
}
else
{
fwrefarr[block_y+j][img->block_x+i] = (IS_FW ? best8x8ref[mode][k] : -1);
bwrefarr[block_y+j][img->block_x+i] = (IS_BW ? best8x8bwref[mode][k] : -1);
enc_picture->ref_idx[LIST_0][img->block_x+i][img->block_y+j] = fwrefarr[block_y+j][img->block_x+i];
enc_picture->ref_idx[LIST_1][img->block_x+i][img->block_y+j] = bwrefarr[block_y+j][img->block_x+i];
}
frefarr [block_y+j][img->block_x+i] = fwrefarr[block_y+j][img->block_x+i];
abp_type_arr[block_y+j][img->block_x+i] = (IS_BW ? best8x8abp_type[mode][k] : 0);
}
else
{
if(mode == P8x8 && best8x8mode[k]==0)
{
if (input->direct_type)
{
fwrefarr[block_y+j][img->block_x+i] = fwdir_refFrArr[block_y+j][img->block_x+i];
bwrefarr[block_y+j][img->block_x+i] = bwdir_refFrArr[block_y+j][img->block_x+i];
enc_picture->ref_idx[LIST_0][img->block_x+i][img->block_y+j] = fwrefarr[block_y+j][img->block_x+i];
enc_picture->ref_idx[LIST_1][img->block_x+i][img->block_y+j] = bwrefarr[block_y+j][img->block_x+i];
}
else
{
fwrefarr[block_y+j][img->block_x+i] = frefarr[block_y+j][img->block_x+i];
bwrefarr[block_y+j][img->block_x+i] = min(frefarr[block_y+j][img->block_x+i],0);
enc_picture->ref_idx[LIST_0][img->block_x+i][img->block_y+j] = fwrefarr[block_y+j][img->block_x+i];
enc_picture->ref_idx[LIST_1][img->block_x+i][img->block_y+j] = bwrefarr[block_y+j][img->block_x+i];
}
}
else
{
fwrefarr[block_y+j][img->block_x+i] = (IS_FW ? best8x8ref[mode][k] : -1);
bwrefarr[block_y+j][img->block_x+i] = (IS_BW ? 0 : -1);
enc_picture->ref_idx[LIST_0][img->block_x+i][img->block_y+j] = fwrefarr[block_y+j][img->block_x+i];
enc_picture->ref_idx[LIST_1][img->block_x+i][img->block_y+j] = bwrefarr[block_y+j][img->block_x+i];
}
}
enc_picture->ref_pic_id [LIST_0][img->block_x+i][img->block_y+j] = enc_picture->ref_pic_num[LIST_0][enc_picture->ref_idx[LIST_0][img->block_x+i][img->block_y+j]];
enc_picture->ref_pic_id [LIST_1][img->block_x+i][img->block_y+j] = enc_picture->ref_pic_num[LIST_1][enc_picture->ref_idx[LIST_1][img->block_x+i][img->block_y+j]];
}
}
else
{
for (j=0;j<4;j++)
for (i=0;i<4;i++)
{
k = 2*(j/2)+(i/2);
l = 2*(j%2)+(i%2);
frefarr [block_y+j][img->block_x+i] = (IS_FW ? best8x8ref[mode][k] : -1);
enc_picture->ref_idx[LIST_0][img->block_x+i][img->block_y+j] = frefarr [block_y+j][img->block_x+i];
enc_picture->ref_pic_id [LIST_0][img->block_x+i][img->block_y+j] = enc_picture->ref_pic_num[LIST_0][enc_picture->ref_idx[LIST_0][img->block_x+i][img->block_y+j]];
}
}
}
#undef IS_FW
#undef IS_BW
}
/*!
*************************************************************************************
* \brief
* Intra 16x16 mode decision
*************************************************************************************
*/
void
Intra16x16_Mode_Decision (Macroblock* currMB, int* i16mode)
{
intrapred_luma_16x16 (); /* make intra pred for all 4 new modes */
find_sad_16x16 (i16mode); /* get best new intra mode */
currMB->cbp = dct_luma_16x16 (*i16mode);
}
/*!
*************************************************************************************
* \brief
* Sets Coefficients and reconstruction for an 8x8 block
*************************************************************************************
*/
void SetCoeffAndReconstruction8x8 (Macroblock* currMB)
{
int block, k, j, i;
int block_y = img->block_y;
int **ipredmodes = img->ipredmode;
if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive && img->field_mode)
{
block_y = img->field_block_y;
}
//--- restore coefficients ---
for (block=0; block<6; block++)
for (k=0; k<4; k++)
for (j=0; j<2; j++)
for (i=0; i<65; i++)
img->cofAC[block][k][j][i] = cofAC8x8[block][k][j][i];
if (cnt_nonz_8x8<=5 && img->type!=SP_SLICE)
{
currMB->cbp = 0;
currMB->cbp_blk = 0;
for (j=0; j<16; j++)
for (i=0; i<16; i++) enc_picture->imgY[img->pix_y+j][img->pix_x+i] = mpr8x8[j][i];
}
else
{
currMB->cbp = cbp8x8;
currMB->cbp_blk = cbp_blk8x8;
for (j=0; j<16; j++)
for (i=0; i<16; i++) enc_picture->imgY[img->pix_y+j][img->pix_x+i] = rec_mbY8x8[j][i];
}
//===== restore intra prediction modes for 8x8+ macroblock mode =====
for (k=0, j=block_y; j<block_y+4; j++)
for ( i=img->block_x; i<img->block_x+4; i++, k++)
{
ipredmodes [i][j] = b8_ipredmode [k];
currMB->intra_pred_modes[k] = b8_intra_pred_modes[k];
}
}
/*!
*************************************************************************************
* \brief
* Sets motion vectors for an macroblock
*************************************************************************************
*/
void SetMotionVectorsMB (Macroblock* currMB, int bframe)
{
int i, j, k, l, mode8, pdir8, ref, by, bx, bxr, dref;
int ***mv = tmp_mv;
int *****all_mv = img->all_mv;
int *****all_bmv = img->all_bmv;
int ***fwMV = tmp_fwMV;
int ***bwMV = tmp_bwMV;
int *****imgmv = img->mv;
int *****p_fwMV = img->p_fwMV;
int *****p_bwMV = img->p_bwMV;
int **refar = refFrArr;
int **frefar = fw_refFrArr;
int block_y = img->block_y;
int **brefar = bw_refFrArr;
int bw_ref;
if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive && img->field_mode)
{
if(img->top_field)
{
mv=tmp_mv_top;
all_mv = img->all_mv_top;
all_bmv = img->all_bmv_top;
fwMV = tmp_fwMV_top;
bwMV = tmp_bwMV_top;
imgmv = img->mv_top;
p_fwMV = img->p_fwMV_top;
p_bwMV = img->p_bwMV_top;
block_y = img->block_y/2;
refar = refFrArr_top;
frefar = fw_refFrArr_top;
brefar = bw_refFrArr_top;
}
else
{
mv=tmp_mv_bot;
all_mv = img->all_mv_bot;
all_bmv = img->all_bmv_bot;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -