📄 image.c
字号:
************************************************************************
*/
void decode_one_slice(struct img_par *img,struct inp_par *inp)
{
Boolean end_of_slice = FALSE;
int read_flag;
img->cod_counter=-1;
//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));
}
//reset_ec_flags();
}
void decode_frame_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();
}
// init new frame
if (current_header == SOP)
init_frame(img, inp);
if ( (img->weighted_bipred_idc > 0 && (img->type == B_SLICE)) || (img->weighted_pred_flag && img->type !=I_SLICE))
fill_wp_params(img);
/*
if (current_header == SOP)
{
if (img->number == 0)
ercInit(img->width, img->height, 1);
// reset all variables of the error concealmnet instance before decoding of every frame.
// here the third parameter should, if perfectly, be equal to the number of slices per frame.
// using little value is ok, the code will alloc more memory if the slice number is larger
ercReset(erc_errorVar, img->PicSizeInMbs, img->PicSizeInMbs, img->width);
erc_mvperMB = 0;
}
*/
// 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;
//! This code doesn't work with FMO or a slice-lossy environment!
//! StW NEEDS FIXING
/*if(img->current_mb_nr != img->PicSizeInMbs)
currSlice->next_header = SOS; */
}
void decode_field_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();
}
// init new frame
if (current_header == SOP)
{
if (img->structure == TOP_FIELD)
init_top(img, inp); // set up field buffer in this function
else
{
init_bottom(img, inp);
}
}
if ( (img->weighted_bipred_idc > 0 && (img->type == B_SLICE)) || (img->weighted_pred_flag && img->type !=I_SLICE))
fill_wp_params(img);
/*
if (current_header == SOP)
{
if (img->number == 0)
ercInit(img->width, 2*img->height, 1);
// reset all variables of the error concealmnet instance before decoding of every frame.
// here the third parameter should, if perfectly, be equal to the number of slices per frame.
// using little value is ok, the code will alloc more memory if the slice number is larger
ercReset(erc_errorVar, img->PicSizeInMbs, img->PicSizeInMbs, img->width);
erc_mvperMB = 0;
}
*/
// 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;
//! This code doesn't work with FMO or a slice lossy environment or out-of-order slices
/*if(img->current_mb_nr != img->PicSizeInMbs)
currSlice->next_header = SOS; */
}
/*!
************************************************************************
* \brief
* Initializes the parameters for a new field
************************************************************************
*/
void init_top(struct img_par *img, struct inp_par *inp)
{
int i;
if (dec_picture)
{
// this may only happen on slice loss
store_picture_in_dpb(dec_picture);
}
dec_picture = alloc_storable_picture (TOP_FIELD, img->width, img->height, img->width_cr, img->height_cr);
dec_picture->poc=img->toppoc;
dec_picture->top_poc=img->toppoc;
dec_picture->bottom_poc=img->bottompoc;
dec_picture->pic_num = img->frame_num;
dec_picture->coded_frame = (img->structure==FRAME);
dec_picture->mb_adaptive_frame_field_flag = img->MbaffFrameFlag;
for (i=0;i<listXsize[LIST_0];i++)
{
dec_picture->ref_pic_num[LIST_0][i]=listX[LIST_0][i]->poc;
}
for (i=0;i<listXsize[LIST_1];i++)
{
dec_picture->ref_pic_num[LIST_1][i]=listX[LIST_1][i]->poc;
}
img->number *= 2;
img->current_slice_nr=0;
img->mb_y = img->mb_x = 0;
img->block_y = img->pix_y = img->pix_c_y = 0; // define vertical positions
img->block_x = img->pix_x = img->pix_c_x = 0; // define horizontal positions
if (img->type > SI_SLICE)
{
set_ec_flag(SE_PTYPE);
img->type = P_SLICE; // concealed element
}
// allocate memory for frame buffers
if (img->number == 0)
{
init_global_buffers(inp, img);
}
if(img->constrained_intra_pred_flag)
{
for (i=0; i<(int)img->PicSizeInMbs; i++)
{
img->intra_block[i] = 1;
}
}
// WYK: Oct. 8, 2001. Set the slice_nr member of each MB to -1, to ensure correct when packet loss occurs
for(i=0; i<(int)img->PicSizeInMbs; i++)
img->mb_data[i].slice_nr = -1;
}
/*!
************************************************************************
* \brief
* Initializes the parameters for a new field
************************************************************************
*/
void init_bottom(struct img_par *img, struct inp_par *inp)
{
int i;
if (dec_picture)
{
// this may only happen on slice loss
store_picture_in_dpb(dec_picture);
}
dec_picture = alloc_storable_picture (BOTTOM_FIELD, img->width, img->height, img->width_cr, img->height_cr);
dec_picture->poc=img->bottompoc;
dec_picture->top_poc=img->toppoc;
dec_picture->bottom_poc=img->bottompoc;
dec_picture->pic_num = img->frame_num + 1;
dec_picture->coded_frame = (img->structure==FRAME);
dec_picture->mb_adaptive_frame_field_flag = img->MbaffFrameFlag;
for (i=0;i<listXsize[LIST_0];i++)
{
dec_picture->ref_pic_num[LIST_0][i]=listX[LIST_0][i]->poc;
}
for (i=0;i<listXsize[LIST_1];i++)
{
dec_picture->ref_pic_num[LIST_1][i]=listX[LIST_1][i]->poc;
}
img->number++;
img->current_slice_nr=0;
img->mb_y = img->mb_x = 0;
img->block_y = img->pix_y = img->pix_c_y = 0; // define vertical positions
img->block_x = img->pix_x = img->pix_c_x = 0; // define horizontal positions
if (img->type > SI_SLICE)
{
set_ec_flag(SE_PTYPE);
img->type = P_SLICE; // concealed element
}
if(img->constrained_intra_pred_flag)
{
for (i=0; i<(int)img->PicSizeInMbs; i++)
{
img->intra_block[i] = 1;
}
}
// WYK: Oct. 8, 2001. Set the slice_nr member of each MB to -1, to ensure correct when packet loss occurs
for(i=0; i<(int)img->PicSizeInMbs; i++)
img->mb_data[i].slice_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->height *= 2;
img->height_cr *= 2;
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;
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 (img->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;
}
}
}
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 (img->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 (img->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[1][i][j][comp] = 32;
img->wbp_weight[0][i][j][comp] = 32;
}
}
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -