📄 slice.c
字号:
enc_picture->ref_pic_num [LIST_0][i] = this_ref->poc * 2 + ((this_ref->structure==BOTTOM_FIELD)?1:0) ;
enc_picture->frm_ref_pic_num [LIST_0][i] = this_ref->frame_poc * 2;
enc_picture->top_ref_pic_num [LIST_0][i] = this_ref->top_poc * 2;
enc_picture->bottom_ref_pic_num [LIST_0][i] = this_ref->bottom_poc * 2 + 1;
}
for (i=0;i<listXsize[LIST_1];i++)
{
this_ref = listX[LIST_1][i];
enc_picture->ref_pic_num [LIST_1][i] = this_ref->poc *2 + ((this_ref->structure==BOTTOM_FIELD)?1:0);
enc_picture->frm_ref_pic_num [LIST_1][i] = this_ref->frame_poc * 2;
enc_picture->top_ref_pic_num [LIST_1][i] = this_ref->top_poc * 2;
enc_picture->bottom_ref_pic_num [LIST_1][i] = this_ref->bottom_poc * 2 + 1;
}
if (!active_sps->frame_mbs_only_flag && img->structure==FRAME)
{
for (j=2;j<6;j++)
for (i=0;i<listXsize[j];i++)
{
this_ref = listX[j][i];
enc_picture->ref_pic_num[j][i] = this_ref->poc * 2 + ((this_ref->structure==BOTTOM_FIELD)?1:0);
enc_picture->frm_ref_pic_num[j][i] = this_ref->frame_poc * 2 ;
enc_picture->top_ref_pic_num[j][i] = this_ref->top_poc * 2 ;
enc_picture->bottom_ref_pic_num[j][i] = this_ref->bottom_poc * 2 + 1;
}
}
}
/*!
************************************************************************
* \brief
* decide reference picture reordering, Frame only
************************************************************************
*/
void poc_ref_pic_reorder(StorablePicture **list, unsigned num_ref_idx_lX_active, int *reordering_of_pic_nums_idc, int *abs_diff_pic_num_minus1, int *long_term_pic_idx, int list_no)
{
unsigned i,j,k;
int currPicNum, picNumLXPred;
int default_order[32];
int re_order[32];
int tmp_reorder[32];
int list_sign[32];
int reorder_stop, no_reorder;
int poc_diff[32];
int tmp_value, diff;
int abs_poc_dist;
int maxPicNum;
if (img->structure==FRAME)
{
maxPicNum = max_frame_num;
currPicNum = img->frame_num;
}
else
{
maxPicNum = 2 * max_frame_num;
currPicNum = 2 * img->frame_num + 1;
}
picNumLXPred = currPicNum;
// First assign default list order.
for (i=0; i<num_ref_idx_lX_active; i++)
{
default_order[i] = list[i]->pic_num;
}
// Now access all references in buffer and assign them
// to a pottential reordering list. For each one of these
// references compute the poc distance compared to current
// frame.
for (i=0; i<dpb.ref_frames_in_buffer; i++)
{
re_order[i] = dpb.fs_ref[i]->frame->pic_num;
if (dpb.fs_ref[i]->is_used==3 && (dpb.fs_ref[i]->frame->used_for_reference)&&(!dpb.fs_ref[i]->frame->is_long_term))
{
abs_poc_dist = iabs(dpb.fs_ref[i]->frame->poc - enc_picture->poc) ;
poc_diff[i] = abs_poc_dist;
if (list_no == LIST_0)
{
list_sign[i] = (enc_picture->poc < dpb.fs_ref[i]->frame->poc) ? +1 : -1;
}
else
{
list_sign[i] = (enc_picture->poc > dpb.fs_ref[i]->frame->poc) ? +1 : -1;
}
}
}
// now sort these references based on poc (temporal) distance
for (i=0; i< dpb.ref_frames_in_buffer-1; i++)
{
for (j=i+1; j< dpb.ref_frames_in_buffer; j++)
{
if (poc_diff[i]>poc_diff[j] || (poc_diff[i] == poc_diff[j] && list_sign[j] > list_sign[i]))
{
tmp_value = poc_diff[i];
poc_diff[i] = poc_diff[j];
poc_diff[j] = tmp_value;
tmp_value = re_order[i];
re_order[i] = re_order[j];
re_order[j] = tmp_value ;
tmp_value = list_sign[i];
list_sign[i] = list_sign[j];
list_sign[j] = tmp_value ;
}
}
}
// Check versus default list to see if any
// change has happened
no_reorder = 1;
for (i=0; i<num_ref_idx_lX_active; i++)
{
if (default_order[i] != re_order[i])
{
no_reorder = 0;
}
}
// If different, then signal reordering
if (no_reorder==0)
{
for (i=0; i<num_ref_idx_lX_active; i++)
{
diff = re_order[i]-picNumLXPred;
if (diff <= 0)
{
reordering_of_pic_nums_idc[i] = 0;
abs_diff_pic_num_minus1[i] = iabs(diff)-1;
if (abs_diff_pic_num_minus1[i] < 0)
abs_diff_pic_num_minus1[i] = maxPicNum -1;
}
else
{
reordering_of_pic_nums_idc[i] = 1;
abs_diff_pic_num_minus1[i] = iabs(diff)-1;
}
picNumLXPred = re_order[i];
tmp_reorder[i] = re_order[i];
k = i;
for (j=i; j<num_ref_idx_lX_active; j++)
{
if (default_order[j] != re_order[i])
{
++k;
tmp_reorder[k] = default_order[j];
}
}
reorder_stop = 1;
for(j=i+1; j<num_ref_idx_lX_active; j++)
{
if (tmp_reorder[j] != re_order[j])
{
reorder_stop = 0;
break;
}
}
if (reorder_stop==1)
{
++i;
break;
}
for(j=0; j<num_ref_idx_lX_active; j++)
{
default_order[j] = tmp_reorder[j];
}
}
reordering_of_pic_nums_idc[i] = 3;
for(j=0; j<num_ref_idx_lX_active; j++)
{
default_order[j] = tmp_reorder[j];
}
if (list_no==0)
{
img->currentSlice->ref_pic_list_reordering_flag_l0=1;
}
else
{
img->currentSlice->ref_pic_list_reordering_flag_l1=1;
}
}
}
extern int QP2QUANT[40];
void SetLagrangianMultipliers()
{
int qp, j, k;
double qp_temp;
double lambda_scale = 1.0 - dClip3(0.0,0.5,0.05 * (double) input->jumpd);;
if (input->rdopt) // RDOPT on computation of Lagrangian multipliers
{
for (j = 0; j < 5; j++)
{
for (qp = -img->bitdepth_luma_qp_scale; qp < 52; qp++)
{
qp_temp = (double)qp + img->bitdepth_luma_qp_scale - SHIFT_QP;
if (input->UseExplicitLambdaParams == 1) // consideration of explicit lambda weights.
{
img->lambda_md[j][qp] = input->LambdaWeight[j] * pow (2, qp_temp/3.0);
// Scale lambda due to hadamard qpel only consideration
img->lambda_md[j][qp] = ( (input->MEErrorMetric[H_PEL] == ERROR_SATD && input->MEErrorMetric[Q_PEL] == ERROR_SATD) ? 1.00 : 0.95) * img->lambda_md[j][qp];
for (k = F_PEL; k <= Q_PEL; k++)
{
img->lambda_me[j][qp][k] = input->MEErrorMetric[k] == ERROR_SSE ? img->lambda_md[j][qp] : sqrt(img->lambda_md[j][qp]);
img->lambda_mf[j][qp][k] = LAMBDA_FACTOR (img->lambda_me[j][qp][k]);
}
if (j == B_SLICE)
{
img->lambda_md[5][qp] = input->LambdaWeight[5] * pow (2, qp_temp/3.0);
img->lambda_md[5][qp] = ((input->MEErrorMetric[H_PEL] == ERROR_SATD && input->MEErrorMetric[Q_PEL] == ERROR_SATD) ? 1.00 : 0.95) * img->lambda_md[5][qp];
for (k = F_PEL; k <= Q_PEL; k++)
{
img->lambda_me[5][qp][k] = input->MEErrorMetric[k] == ERROR_SSE ? img->lambda_md[5][qp] : sqrt(img->lambda_md[5][qp]);
img->lambda_mf[5][qp][k] = LAMBDA_FACTOR (img->lambda_me[5][qp][k]);
}
}
}
else if (input->UseExplicitLambdaParams == 2) // consideration of fixed lambda values.
{
img->lambda_md[j][qp] = input->FixedLambda[j];
// Scale lambda due to hadamard qpel only consideration
img->lambda_md[j][qp] = ( (input->MEErrorMetric[H_PEL] == ERROR_SATD && input->MEErrorMetric[Q_PEL] == ERROR_SATD) ? 1.00 : 0.95) * img->lambda_md[j][qp];
for (k = F_PEL; k <= Q_PEL; k++)
{
img->lambda_me[j][qp][k] = input->MEErrorMetric[k] == ERROR_SSE ? img->lambda_md[j][qp] : sqrt(img->lambda_md[j][qp]);
img->lambda_mf[j][qp][k] = LAMBDA_FACTOR (img->lambda_me[j][qp][k]);
}
if (j == B_SLICE)
{
img->lambda_md[5][qp] = input->FixedLambda[5];
img->lambda_md[5][qp] = ((input->MEErrorMetric[H_PEL] == ERROR_SATD && input->MEErrorMetric[Q_PEL] == ERROR_SATD) ? 1.00 : 0.95) * img->lambda_md[5][qp];
for (k = F_PEL; k <= Q_PEL; k++)
{
img->lambda_me[5][qp][k] = input->MEErrorMetric[k] == ERROR_SSE ? img->lambda_md[5][qp] : sqrt(img->lambda_md[5][qp]);
img->lambda_mf[5][qp][k] = LAMBDA_FACTOR (img->lambda_me[5][qp][k]);
}
}
}
else
{
if (input->successive_Bframe>0)
img->lambda_md[j][qp] = 0.68 * pow (2, qp_temp/3.0)
* (j == B_SLICE ? dClip3(2.00,4.00,(qp_temp / 6.0)) : (j == SP_SLICE) ? dClip3(1.4,3.0,(qp_temp / 12.0)) : 1.0);
else
img->lambda_md[j][qp] = 0.85 * pow (2, qp_temp/3.0)
* ( (j == B_SLICE) ? 4.0 : (j == SP_SLICE) ? dClip3(1.4,3.0,(qp_temp / 12.0)) : 1.0);
// Scale lambda due to hadamard qpel only consideration
img->lambda_md[j][qp] = ((input->MEErrorMetric[H_PEL] == ERROR_SATD && input->MEErrorMetric[Q_PEL] == ERROR_SATD) ? 1.00 : 0.95) * img->lambda_md[j][qp];
img->lambda_md[j][qp] = (j == B_SLICE && input->BRefPictures == 2 && img->b_frame_to_code == 0 ? 0.50 : 1.00) * img->lambda_md[j][qp];
if (j == B_SLICE)
{
img->lambda_md[5][qp] = img->lambda_md[j][qp];
if (input->HierarchicalCoding == 2)
img->lambda_md[5][qp] *= (1.0 - dmin(0.4,0.2 * (double) gop_structure[img->b_frame_to_code-1].hierarchy_layer)) ;
else
img->lambda_md[5][qp] *= 0.80;
img->lambda_md[5][qp] *= lambda_scale;
for (k = F_PEL; k <= Q_PEL; k++)
{
img->lambda_me[5][qp][k] = input->MEErrorMetric[k] == ERROR_SSE ? img->lambda_md[5][qp] : sqrt(img->lambda_md[5][qp]);
img->lambda_mf[5][qp][k] = LAMBDA_FACTOR (img->lambda_me[5][qp][k]);
}
}
else
img->lambda_md[j][qp] *= lambda_scale;
for (k = F_PEL; k <= Q_PEL; k++)
{
img->lambda_me[j][qp][k] = input->MEErrorMetric[k] == ERROR_SSE ? img->lambda_md[j][qp] : sqrt(img->lambda_md[j][qp]);
img->lambda_mf[j][qp][k] = LAMBDA_FACTOR (img->lambda_me[j][qp][k]);
}
if (input->CtxAdptLagrangeMult == 1)
{
int lambda_qp = (qp >= 32 && !input->RCEnable) ? imax(0, qp - 4) : imax(0, qp - 6);
img->lambda_mf_factor[j][qp] = log (img->lambda_me[j][lambda_qp][Q_PEL] + 1.0) / log (2.0);
}
}
}
}
}
else // RDOPT off computation of Lagrangian multipliers
{
for (j = 0; j < 6; j++)
{
for (qp = -img->bitdepth_luma_qp_scale; qp < 52; qp++)
{
qp_temp = (double)qp + img->bitdepth_luma_qp_scale - SHIFT_QP;
if (input->UseExplicitLambdaParams == 1) // consideration of explicit lambda weights.
{
img->lambda_md[j][qp] = sqrt(input->LambdaWeight[j] * pow (2, qp_temp/3.0));
}
else if (input->UseExplicitLambdaParams == 2) // consideration of explicit lambda
{
img->lambda_md[j][qp] = sqrt(input->FixedLambda[j]);
}
else
{
img->lambda_md[j][qp] = QP2QUANT[imax(0,qp - SHIFT_QP)];
}
for (k = F_PEL; k <= Q_PEL; k++)
{
img->lambda_me[j][qp][k] = img->lambda_md[j][qp];
img->lambda_me[j][qp][k] *= input->MEErrorMetric[k] == ERROR_SSE ? img->lambda_me[j][qp][k] : 1;
img->lambda_mf[j][qp][k] = LAMBDA_FACTOR (img->lambda_me[j][qp][k]);
}
if (input->CtxAdptLagrangeMult == 1)
{
int lambda_qp = (qp >= 32 && !input->RCEnable) ? imax(0, qp-4) : imax(0, qp-6);
img->lambda_mf_factor[j][qp] = log (img->lambda_me[j][lambda_qp][Q_PEL] + 1.0) / log (2.0);
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -