📄 image.c
字号:
int idx = (dec_picture->ref_idx[0][ii][jj]<0)?1:0;
// int idx = (currMB->b8mode[i]==0 && currMB->b8pdir[i]==2 ? LIST_0 : currMB->b8pdir[i]==1 ? LIST_1 : LIST_0);
// int idx = currMB->b8pdir[i]==0 ? LIST_0 : LIST_1;
mv = dec_picture->mv[idx];
pRegion->mv[0] = (mv[ii][jj][0] + mv[ii+1][jj][0] + mv[ii][jj+1][0] + mv[ii+1][jj+1][0] + 2)/4;
pRegion->mv[1] = (mv[ii][jj][1] + mv[ii+1][jj][1] + mv[ii][jj+1][1] + mv[ii+1][jj+1][1] + 2)/4;
erc_mvperMB += mabs(pRegion->mv[0]) + mabs(pRegion->mv[1]);
pRegion->mv[2] = (dec_picture->ref_idx[idx][ii][jj]);
/*
if (currMB->b8pdir[i]==0 || (currMB->b8pdir[i]==2 && currMB->b8mode[i]!=0)) // forward or bidirect
{
pRegion->mv[2] = (dec_picture->ref_idx[LIST_0][ii][jj]);
///???? is it right, not only "img->fw_refFrArr[jj][ii-4]"
}
else
{
pRegion->mv[2] = (dec_picture->ref_idx[LIST_1][ii][jj]);
// pRegion->mv[2] = 0;
}
*/
}
}
}
}
/*!
************************************************************************
* \brief
* set defaults for old_slice
* NAL unit of a picture"
************************************************************************
*/
void init_old_slice()
{
old_slice.field_pic_flag = 0;
old_slice.pps_id = INT_MAX;
old_slice.frame_num = INT_MAX;
old_slice.nal_ref_idc = INT_MAX;
old_slice.idr_flag = 0;
old_slice.pic_oder_cnt_lsb = UINT_MAX;
old_slice.delta_pic_oder_cnt_bottom = INT_MAX;
old_slice.delta_pic_order_cnt[0] = INT_MAX;
old_slice.delta_pic_order_cnt[1] = INT_MAX;
}
/*!
************************************************************************
* \brief
* save slice parameters that are needed for checking of "first VCL
* NAL unit of a picture"
************************************************************************
*/
void exit_slice()
{
old_slice.pps_id = img->currentSlice->pic_parameter_set_id;
old_slice.frame_num = img->frame_num;
old_slice.field_pic_flag = img->field_pic_flag;
if(img->field_pic_flag)
{
old_slice.bottom_field_flag = img->bottom_field_flag;
}
old_slice.nal_ref_idc = img->nal_reference_idc;
old_slice.idr_flag = img->idr_flag;
if (img->idr_flag)
{
old_slice.idr_pic_id = img->idr_pic_id;
}
if (active_sps->pic_order_cnt_type == 0)
{
old_slice.pic_oder_cnt_lsb = img->pic_order_cnt_lsb;
old_slice.delta_pic_oder_cnt_bottom = img->delta_pic_order_cnt_bottom;
}
if (active_sps->pic_order_cnt_type == 1)
{
old_slice.delta_pic_order_cnt[0] = img->delta_pic_order_cnt[0];
old_slice.delta_pic_order_cnt[1] = img->delta_pic_order_cnt[1];
}
}
/*!
************************************************************************
* \brief
* detect if current slice is "first VCL NAL unit of a picture"
************************************************************************
*/
int is_new_picture()
{
int result=0;
result |= (old_slice.pps_id != img->currentSlice->pic_parameter_set_id);
result |= (old_slice.frame_num != img->frame_num);
result |= (old_slice.field_pic_flag != img->field_pic_flag);
if(img->field_pic_flag && old_slice.field_pic_flag)
{
result |= (old_slice.bottom_field_flag != img->bottom_field_flag);
}
result |= (old_slice.nal_ref_idc != img->nal_reference_idc);
result |= ( old_slice.idr_flag != img->idr_flag);
if (img->idr_flag && old_slice.idr_flag)
{
result |= (old_slice.idr_pic_id != img->idr_pic_id);
}
if (active_sps->pic_order_cnt_type == 0)
{
result |= (old_slice.pic_oder_cnt_lsb != img->pic_order_cnt_lsb);
result |= (old_slice.delta_pic_oder_cnt_bottom != img->delta_pic_order_cnt_bottom);
}
if (active_sps->pic_order_cnt_type == 1)
{
result |= (old_slice.delta_pic_order_cnt[0] != img->delta_pic_order_cnt[0]);
result |= (old_slice.delta_pic_order_cnt[1] != img->delta_pic_order_cnt[1]);
}
return result;
}
/*!
************************************************************************
* \brief
* decodes one slice
************************************************************************
*/
void decode_one_slice(struct img_par *img,struct inp_par *inp)
{
Boolean end_of_slice = FALSE;
int read_flag;
img->cod_counter=-1;
set_ref_pic_num();
if (img->type == B_SLICE)
compute_collocated(Co_located, listX);
//reset_ec_flags();
while (end_of_slice == FALSE) // loop over macroblocks
{
#if TRACE
fprintf(p_trace,"\n*********** POC: %i (I/P) MB: %i Slice: %i Type %d **********\n", img->ThisPOC, img->current_mb_nr, img->current_slice_nr, img->type);
#endif
// Initializes the current macroblock
start_macroblock(img,inp, img->current_mb_nr);
// Get the syntax elements from the NAL
read_flag = read_one_macroblock(img,inp);
decode_one_macroblock(img,inp);
if(img->MbaffFrameFlag && dec_picture->mb_field[img->current_mb_nr])
{
img->num_ref_idx_l0_active >>= 1;
img->num_ref_idx_l1_active >>= 1;
}
ercWriteMBMODEandMV(img,inp);
end_of_slice=exit_macroblock(img,inp,(!img->MbaffFrameFlag||img->current_mb_nr%2));
}
exit_slice();
//reset_ec_flags();
}
void decode_slice(struct img_par *img,struct inp_par *inp, int current_header)
{
Slice *currSlice = img->currentSlice;
if (active_pps->entropy_coding_mode_flag)
{
init_contexts (img);
cabac_new_slice();
}
if ( (active_pps->weighted_bipred_idc > 0 && (img->type == B_SLICE)) || (active_pps->weighted_pred_flag && img->type !=I_SLICE))
fill_wp_params(img);
//printf("frame picture %d %d %d\n",img->structure,img->ThisPOC,img->direct_type);
// decode main slice information
if ((current_header == SOP || current_header == SOS) && currSlice->ei_flag == 0)
decode_one_slice(img,inp);
// setMB-Nr in case this slice was lost
// if(currSlice->ei_flag)
// img->current_mb_nr = currSlice->last_mb_nr + 1;
}
/*!
************************************************************************
* \brief
* Prepare field and frame buffer after frame decoding
************************************************************************
*/
void frame_postprocessing(struct img_par *img, struct inp_par *inp)
{
}
/*!
************************************************************************
* \brief
* Prepare field and frame buffer after field decoding
************************************************************************
*/
void field_postprocessing(struct img_par *img, struct inp_par *inp)
{
img->number /= 2;
}
void reset_wp_params(struct img_par *img)
{
int i,comp;
int log_weight_denom;
for (i=0; i<MAX_REFERENCE_PICTURES; i++)
{
for (comp=0; comp<3; comp++)
{
log_weight_denom = (comp == 0) ? img->luma_log2_weight_denom : img->chroma_log2_weight_denom;
img->wp_weight[0][i][comp] = 1<<log_weight_denom;
img->wp_weight[1][i][comp] = 1<<log_weight_denom;
}
}
}
void fill_wp_params(struct img_par *img)
{
int i, j, k;
int comp;
int log_weight_denom;
int p0, pt;
int bframe = (img->type==B_SLICE);
int max_bwd_ref, max_fwd_ref;
int x,z;
max_fwd_ref = img->num_ref_idx_l0_active;
max_bwd_ref = img->num_ref_idx_l1_active;
if (active_pps->weighted_bipred_idc == 2 && bframe)
{
img->luma_log2_weight_denom = 5;
img->chroma_log2_weight_denom = 5;
img->wp_round_luma = 16;
img->wp_round_chroma = 16;
for (i=0; i<MAX_REFERENCE_PICTURES; i++)
{
for (comp=0; comp<3; comp++)
{
log_weight_denom = (comp == 0) ? img->luma_log2_weight_denom : img->chroma_log2_weight_denom;
img->wp_weight[0][i][comp] = 1<<log_weight_denom;
img->wp_weight[1][i][comp] = 1<<log_weight_denom;
img->wp_offset[0][i][comp] = 0;
img->wp_offset[1][i][comp] = 0;
}
}
}
if (bframe)
{
for (i=0; i<max_fwd_ref; i++)
{
for (j=0; j<max_bwd_ref; j++)
{
for (comp = 0; comp<3; comp++)
{
log_weight_denom = (comp == 0) ? img->luma_log2_weight_denom : img->chroma_log2_weight_denom;
if (active_pps->weighted_bipred_idc == 1)
{
img->wbp_weight[0][i][j][comp] = img->wp_weight[0][i][comp];
img->wbp_weight[1][i][j][comp] = img->wp_weight[1][j][comp];
}
else if (active_pps->weighted_bipred_idc == 2)
{
pt = listX[LIST_1][j]->poc - listX[LIST_0][i]->poc;
if (pt == 0 || listX[LIST_1][j]->is_long_term || listX[LIST_0][i]->is_long_term)
{
img->wbp_weight[0][i][j][comp] = 32;
img->wbp_weight[1][i][j][comp] = 32;
}
else
{
p0 = img->ThisPOC - listX[LIST_0][i]->poc;
x = (16384 + (pt>>1))/pt;
z = Clip3(-1024, 1023, (x*p0 + 32 )>>6);
img->wbp_weight[1][i][j][comp] = z >> 2;
img->wbp_weight[0][i][j][comp] = 64 - img->wbp_weight[1][i][j][comp];
if (img->wbp_weight[1][i][j][comp] < -64 || img->wbp_weight[1][i][j][comp] > 128)
{
img->wbp_weight[0][i][j][comp] = 32;
img->wbp_weight[1][i][j][comp] = 32;
img->wp_offset[0][i][comp] = 0;
img->wp_offset[1][i][comp] = 0;
}
}
}
}
}
}
}
if (bframe && img->MbaffFrameFlag)
{
for (i=0; i<2*max_fwd_ref; i++)
{
for (j=0; j<2*max_bwd_ref; j++)
{
for (comp = 0; comp<3; comp++)
{
for (k=2; k<6; k+=2)
{
img->wp_offset[k+0][i][comp] = img->wp_offset[0][i/2][comp];
img->wp_offset[k+1][i][comp] = img->wp_offset[1][i/2][comp];
log_weight_denom = (comp == 0) ? img->luma_log2_weight_denom : img->chroma_log2_weight_denom;
if (active_pps->weighted_bipred_idc == 1)
{
img->wbp_weight[k+0][i][j][comp] = img->wp_weight[0][i/2][comp];
img->wbp_weight[k+1][i][j][comp] = img->wp_weight[1][j/2][comp];
}
else if (active_pps->weighted_bipred_idc == 2)
{
pt = listX[k+LIST_1][j]->poc - listX[k+LIST_0][i]->poc;
if (pt == 0 || listX[k+LIST_1][j]->is_long_term || listX[k+LIST_0][i]->is_long_term)
{
img->wbp_weight[k+0][i][j][comp] = 32;
img->wbp_weight[k+1][i][j][comp] = 32;
}
else
{
p0 = ((k==2)?img->toppoc:img->bottompoc) - listX[k+LIST_0][i]->poc;
x = (16384 + (pt>>1))/pt;
z = Clip3(-1024, 1023, (x*p0 + 32 )>>6);
img->wbp_weight[k+1][i][j][comp] = z >> 2;
img->wbp_weight[k+0][i][j][comp] = 64 - img->wbp_weight[k+1][i][j][comp];
if (img->wbp_weight[k+1][i][j][comp] < -64 || img->wbp_weight[k+1][i][j][comp] > 128)
{
img->wbp_weight[k+1][i][j][comp] = 32;
img->wbp_weight[k+0][i][j][comp] = 32;
img->wp_offset[k+0][i][comp] = 0;
img->wp_offset[k+1][i][comp] = 0;
}
}
}
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -