📄 image.cpp
字号:
+list[ref_frame]->imgY[Clip3(0,maxold_y,y_pos+j+2)][pres_x]*COEF[4]
+list[ref_frame]->imgY[Clip3(0,maxold_y,y_pos+j+3)][pres_x]*COEF[5];
block[i][j] = (block[i][j] + Clip1((result+16)>>5) +1 ) / 2;
}
}
return;
}
}
static void reorder_lists(int currSliceType, Slice * currSlice)
{
if (currSliceType != I_SLICE)
{
if (currSlice->ref_pic_list_reordering_flag_l0)
{
reorder_ref_pic_list(listX[0], &listXsize[0],
img->num_ref_idx_l0_active - 1,
currSlice->remapping_of_pic_nums_idc_l0,
currSlice->abs_diff_pic_num_minus1_l0,
currSlice->long_term_pic_idx_l0);
}
if (NULL == listX[0][img->num_ref_idx_l0_active-1])
{
error("number of entries in list 0 smaller than num_ref_idx_l0_active_minus1",500);
}
// that's a definition
listXsize[0] = img->num_ref_idx_l0_active;
}
free_ref_pic_list_reordering_buffer(currSlice);
}
/*!
************************************************************************
* \brief
* Reads new slice from bit_stream
************************************************************************
*/
int read_new_slice()
{
NALU_t *nalu = AllocNALU(MAX_CODED_FRAME_SIZE);
int current_header;
int ret;
int BitsUsedByHeader;
Slice *currSlice = img->currentSlice;
Bitstream *currStream;
int newframe;
int slice_id_a, slice_id_b, slice_id_c;
int redundant_pic_cnt_b, redundant_pic_cnt_c;
long ftell_position;
while (1)
{
ftell_position = ftell(bits);
if (FileFormat == PAR_OF_ANNEXB)
ret=GetAnnexbNALU (nalu);
else
ret=GetRTPNALU (nalu);
//NALUtoRBSP(nalu);
assert (nalu != NULL);
//EBSPtoRBSP (nalu->buf, nalu->len) ;
if (ret < 0)
exit (-1);
else if (ret == 0)
{
return EOS;
}
switch (nalu->nal_unit_type)
{
case NALU_TYPE_SLICE:
case NALU_TYPE_IDR:
img->idr_flag = (nalu->nal_unit_type == NALU_TYPE_IDR);
img->nal_reference_idc = nalu->nal_reference_idc;
img->disposable_flag = (nalu->nal_reference_idc == NALU_PRIORITY_DISPOSABLE);
currSlice->dp_mode = PAR_DP_1;
currSlice->max_part_nr = 1;
currSlice->ei_flag = 0;
currStream = currSlice->partArr[0].bitstream;
currStream->ei_flag = 0;
currStream->frame_bitoffset = 0;
memcpy (currStream->streamBuffer, &nalu->buf[1], nalu->len-1);
currStream->bitstream_length = RBSPtoSODB(currStream->streamBuffer, nalu->len-1);
// Some syntax of the Slice Header depends on the parameter set, which depends on
// the parameter set ID of the SLice header. Hence, read the pic_parameter_set_id
// of the slice header first, then setup the active parameter sets, and then read
// the rest of the slice header
BitsUsedByHeader = FirstPartOfSliceHeader();
UseParameterSet (currSlice->pic_parameter_set_id);
BitsUsedByHeader+= RestOfSliceHeader ();
FmoInit (active_pps, active_sps);
init_lists(img->type);
reorder_lists (img->type, img->currentSlice);
// From here on, active_sps, active_pps and the slice header are valid
img->current_mb_nr = currSlice->start_mb_nr;
if (img->tr_old != img->ThisPOC)
{
newframe=1;
img->tr_old = img->ThisPOC;
current_header = SOP;
}
else
{
newframe = 0;
current_header = SOS;
}
g_new_frame=0;
FreeNALU(nalu);
return current_header;
break;
case NALU_TYPE_DPA:
//! The state machine here should follow the same ideas as the old readSliceRTP()
//! basically:
//! work on DPA (as above)
//! read and process all following SEI/SPS/PPS/PD/Filler NALUs
//! if next video NALU is dpB,
//! then read and check whether it belongs to DPA, if yes, use it
//! else
//! ; // nothing
//! read and process all following SEI/SPS/PPS/PD/Filler NALUs
//! if next video NALU is dpC
//! then read and check whether it belongs to DPA (and DPB, if present), if yes, use it, done
//! else
//! use the DPA (and the DPB if present)
/*
LC: inserting the code related to DP processing, mainly copying some of the parts
related to NALU_TYPE_SLICE, NALU_TYPE_IDR.
*/
img->idr_flag = (nalu->nal_unit_type == NALU_TYPE_IDR);
img->nal_reference_idc = nalu->nal_reference_idc;
img->disposable_flag = (nalu->nal_reference_idc == NALU_PRIORITY_DISPOSABLE);
currSlice->dp_mode = PAR_DP_3;
currSlice->max_part_nr = 3;
currSlice->ei_flag = 0;
currStream = currSlice->partArr[0].bitstream;
currStream->ei_flag = 0;
currStream->frame_bitoffset = 0;
memcpy (currStream->streamBuffer, &nalu->buf[1], nalu->len-1);
currStream->bitstream_length = RBSPtoSODB(currStream->streamBuffer, nalu->len-1);
BitsUsedByHeader = FirstPartOfSliceHeader();
UseParameterSet (currSlice->pic_parameter_set_id);
BitsUsedByHeader += RestOfSliceHeader ();
FmoInit (active_pps, active_sps);
init_lists(img->type);
reorder_lists (img->type, img->currentSlice);
// From here on, active_sps, active_pps and the slice header are valid
img->current_mb_nr = currSlice->start_mb_nr;
if (img->tr_old != img->ThisPOC)
{
newframe=1;
img->tr_old = img->ThisPOC;
current_header = SOP;
}
else
{
newframe = 0;
current_header = SOS;
}
g_new_frame=0;
/*
LC:
Now I need to read the slice ID, which depends on the value of
redundant_pic_cnt_present_flag (pag.49).
*/
slice_id_a = ue_v("NALU:SLICE_A slice_idr", currStream);
break;
case NALU_TYPE_DPB:
/* LC: inserting the code related to DP processing */
currStream = currSlice->partArr[1].bitstream;
currStream->ei_flag = 0;
currStream->frame_bitoffset = 0;
memcpy (currStream->streamBuffer, &nalu->buf[1], nalu->len-1);
currStream->bitstream_length = RBSPtoSODB(currStream->streamBuffer, nalu->len-1);
slice_id_b = ue_v("NALU:SLICE_B slice_idr", currStream);
if (active_pps->redundant_pic_cnt_present_flag)
redundant_pic_cnt_b = ue_v("NALU:SLICE_B redudand_pic_cnt", currStream);
else
redundant_pic_cnt_b = 0;
/* LC: resilience code to be inserted */
/* FreeNALU(nalu); */
/* return current_header; */
break;
case NALU_TYPE_DPC:
/* LC: inserting the code related to DP processing */
currStream = currSlice->partArr[2].bitstream;
currStream->ei_flag = 0;
currStream->frame_bitoffset = 0;
memcpy (currStream->streamBuffer, &nalu->buf[1], nalu->len-1);
currStream->bitstream_length = RBSPtoSODB(currStream->streamBuffer, nalu->len-1);
slice_id_c = ue_v("NALU:SLICE_C slice_idr", currStream);
if (active_pps->redundant_pic_cnt_present_flag)
redundant_pic_cnt_c = ue_v("NALU:SLICE_C redudand_pic_cnt", currStream);
else
redundant_pic_cnt_c = 0;
/* LC: resilience code to be inserted */
FreeNALU(nalu);
return current_header;
break;
case NALU_TYPE_SEI:
// printf ("read_new_slice: Found NALU_TYPE_SEI, len %d\n", nalu->len);
InterpretSEIMessage(nalu->buf,nalu->len,img);
break;
case NALU_TYPE_PPS:
ProcessPPS(nalu);
break;
case NALU_TYPE_SPS:
ProcessSPS(nalu);
break;
case NALU_TYPE_PD:
// printf ("read_new_slice: Found 'Access Unit Delimiter' NAL unit, len %d, ignored\n", nalu->len);
break;
case NALU_TYPE_EOSEQ:
// printf ("read_new_slice: Found 'End of Sequence' NAL unit, len %d, ignored\n", nalu->len);
break;
case NALU_TYPE_EOSTREAM:
// printf ("read_new_slice: Found 'End of Stream' NAL unit, len %d, ignored\n", nalu->len);
break;
case NALU_TYPE_FILL:
// printf ("read_new_slice: Found NALU_TYPE_FILL, len %d\n", nalu->len);
// printf ("Skipping these filling bits, proceeding w/ next NALU\n");
break;
default:
printf ("Found NALU type %d, len %d undefined, ignore NALU, moving on\n", nalu->nal_unit_type, nalu->len);
}
}
FreeNALU(nalu);
return current_header;
}
/*!
************************************************************************
* \brief
* Initializes the parameters for a new frame
************************************************************************
*/
void init_frame(struct img_par *img)
{
int i,k;
if (dec_picture)
{
// this may only happen on slice loss
store_picture_in_dpb(dec_picture);
}
dec_picture = alloc_storable_picture (img->width, img->height, img->width_cr, img->height_cr);
dec_picture->poc=img->framepoc;
dec_picture->top_poc=img->toppoc;
dec_picture->bottom_poc=img->bottompoc;
dec_picture->pic_num = img->frame_num;
for (i=0;i<listXsize[LIST_0];i++)
{
dec_picture->ref_pic_num[LIST_0][i]=listX[LIST_0][i]->poc * 2 ;
}
img->current_slice_nr=0;
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(img);
}
// CAVLC init
for (i=0;i < (int)img->PicSizeInMbs; i++){
for (k=0;k<4;k++)
memset( img->nz_coeff[i][k],-1,6*sizeof(int)); // CAVLC
}
if(img->constrained_intra_pred_flag)
{
memset(img->intra_block,1,(int)img->PicSizeInMbs*sizeof(int));
}
// WYK: Oct. 8, 2001. Set the slice_nr member of each MB to -1, to ensure correct when packet loss occurs
// TO set Macroblock Map (mark all MBs as 'have to be concealed')
for(i=0; i<(int)img->PicSizeInMbs; i++)
{
img->mb_data[i].slice_nr = -1;
img->mb_data[i].ei_flag = 1;
}
}
void reset_wp_params(struct img_par *img)
{
int i;
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;
}*/
log_weight_denom =img->luma_log2_weight_denom;
img->wp_weight[0][i][0] = 1<<log_weight_denom;
img->wp_weight[1][i][0] = 1<<log_weight_denom;
log_weight_denom = img->chroma_log2_weight_denom;
img->wp_weight[0][i][1] = img->wp_weight[0][i][2] = 1<<log_weight_denom;
img->wp_weight[1][i][1] = img->wp_weight[1][i][2] = 1<<log_weight_denom;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -