📄 explicit_gop.c
字号:
coded_frame ++;
if (coded_frame >= params->jumpd )
{
snprintf(errortext, ET_SIZE, "Total number of frames in Enhancement GOP need to be fewer or equal to FrameSkip parameter.");
error (errortext, 400);
}
}
}
}
}
}
else
{
snprintf(errortext, ET_SIZE, "ExplicitHierarchyFormat is empty. Please check configuration file.");
error (errortext, 400);
}
params->successive_Bframe = coded_frame + 1;
}
/*!
************************************************************************
* \brief
* Encode Enhancement Layer.
************************************************************************
*/
void encode_enhancement_layer()
{
//int previous_ref_idc = 1;
if ((params->successive_Bframe != 0) && (IMG_NUMBER > 0) && (params->EnableIDRGOP == 0 || img->idr_gop_number)) // B-frame(s) to encode
{
set_slice_type( ( params->PReplaceBSlice ) ? P_SLICE : B_SLICE); // set slice type
img->layer = (params->NumFramesInELSubSeq == 0) ? 0 : 1;
img->nal_reference_idc = NALU_PRIORITY_DISPOSABLE;
if (params->HierarchicalCoding)
{
for(img->b_frame_to_code = 1; img->b_frame_to_code <= params->successive_Bframe; img->b_frame_to_code++)
{
img->nal_reference_idc = NALU_PRIORITY_DISPOSABLE;
set_slice_type( gop_structure[img->b_frame_to_code - 1].slice_type);
if (img->last_ref_idc == 1)
{
img->frame_num++; //increment frame_num for each stored B slice
img->frame_num %= max_frame_num;
}
img->nal_reference_idc = gop_structure[img->b_frame_to_code - 1].reference_idc;
img->b_interval = ((double) (params->jumpd + 1) / (params->successive_Bframe + 1.0) );
if (params->HierarchicalCoding == 3)
img->b_interval = 1.0;
if (IMG_NUMBER && (IMG_NUMBER <= params->intra_delay))
{
if(params->idr_period && ((!params->adaptive_idr_period && ( img->frm_number - img->lastIDRnumber ) % params->idr_period == 0)
|| (params->adaptive_idr_period == 1 && ( img->frm_number - imax(img->lastIntraNumber, img->lastIDRnumber) ) % params->idr_period == 0)) )
img->toppoc = (int)(img->b_interval * (double)(1 + gop_structure[img->b_frame_to_code - 1].display_no));
else
img->toppoc = 2*((-img->frm_number + img->lastIDRnumber)*(params->jumpd + 1)
+ (int)(img->b_interval * (double)(1 + gop_structure[img->b_frame_to_code -1].display_no)));
if (img->b_frame_to_code == 1)
img->delta_pic_order_cnt[0] = img->toppoc - 2*(start_tr_in_this_IGOP + (params->intra_delay - IMG_NUMBER)*((params->jumpd + 1)));
else
img->delta_pic_order_cnt[0] = img->toppoc - 2*(start_tr_in_this_IGOP + (params->intra_delay - IMG_NUMBER)*((params->jumpd + 1))
+ (int) (2.0 *img->b_interval * (double) (1 + gop_structure[img->b_frame_to_code - 2].display_no)));
}
else
{
if(params->idr_period && !params->adaptive_idr_period)
img->toppoc = 2*((( ( img->frm_number - img->lastIDRnumber - params->intra_delay) % params->idr_period ) - 1)*(params->jumpd + 1)
+ (int)(img->b_interval * (double)(1 + gop_structure[img->b_frame_to_code - 1].display_no)));
else if(params->idr_period && params->adaptive_idr_period == 1)
img->toppoc = 2*((( img->frm_number - img->lastIDRnumber - params->intra_delay ) - 1)*(params->jumpd + 1)
+ (int)(img->b_interval * (double)(1 + gop_structure[img->b_frame_to_code - 1].display_no)));
else
img->toppoc = 2*((img->frm_number - img->lastIDRnumber - 1 - params->intra_delay)*(params->jumpd + 1)
+ (int)(img->b_interval * (double)(1 + gop_structure[img->b_frame_to_code - 1].display_no)));
if (img->b_frame_to_code == 1)
img->delta_pic_order_cnt[0] = img->toppoc - 2*(start_tr_in_this_IGOP + (img->frm_number - img->lastIDRnumber)*((params->jumpd + 1)));
else
img->delta_pic_order_cnt[0] = img->toppoc - 2*(start_tr_in_this_IGOP + (img->frm_number - img->lastIDRnumber - 1)*((params->jumpd + 1))
+ (int) (2.0 *img->b_interval * (double) (1+ gop_structure[img->b_frame_to_code - 2].display_no)));
}
img->bottompoc = ((params->PicInterlace==FRAME_CODING)&&(params->MbInterlace==FRAME_CODING)) ? img->toppoc : img->toppoc + 1;
img->framepoc = imin (img->toppoc, img->bottompoc);
img->delta_pic_order_cnt[1]= 0;
FrameNumberInFile = CalculateFrameNumber();
encode_one_frame(); // encode one frame
img->last_ref_idc = img->nal_reference_idc ? 1 : 0;
if (params->ReportFrameStats)
report_frame_statistic();
}
img->b_frame_to_code = 0;
}
else
{
for(img->b_frame_to_code = 1; img->b_frame_to_code <= params->successive_Bframe; img->b_frame_to_code++)
{
img->nal_reference_idc = (params->BRefPictures == 1 ) ? NALU_PRIORITY_LOW : NALU_PRIORITY_DISPOSABLE;
if (img->last_ref_idc)
{
img->frame_num++; //increment frame_num once for B-frames
img->frame_num %= max_frame_num;
}
img->b_interval =
((double) (params->jumpd + 1) / (params->successive_Bframe + 1.0) );
if (params->HierarchicalCoding == 3)
img->b_interval = 1.0;
if (IMG_NUMBER && (IMG_NUMBER <= params->intra_delay))
{
if(params->idr_period && ((!params->adaptive_idr_period && ( img->frm_number - img->lastIDRnumber ) % params->idr_period == 0)
|| (params->adaptive_idr_period == 1 && ( img->frm_number - imax(img->lastIntraNumber, img->lastIDRnumber) ) % params->idr_period == 0)) )
img->toppoc = (int) (img->b_interval * (double)img->b_frame_to_code);
else
img->toppoc = 2*((-img->frm_number + img->lastIDRnumber)*(params->jumpd + 1)
+ (int) (img->b_interval * (double)img->b_frame_to_code));
}
else
{
if(params->idr_period && !params->adaptive_idr_period)
img->toppoc = 2*((( ( img->frm_number - img->lastIDRnumber - params->intra_delay) % params->idr_period )-1)*(params->jumpd+1) + (int) (img->b_interval * (double)img->b_frame_to_code));
else if(params->idr_period && params->adaptive_idr_period == 1)
img->toppoc = 2*((( img->frm_number - img->lastIDRnumber - params->intra_delay )-1)*(params->jumpd+1) + (int) (img->b_interval * (double)img->b_frame_to_code));
else
img->toppoc = 2*((img->frm_number - img->lastIDRnumber - 1 - params->intra_delay)*(params->jumpd+1) + (int) (img->b_interval * (double)img->b_frame_to_code));
}
if ((params->PicInterlace==FRAME_CODING)&&(params->MbInterlace==FRAME_CODING))
img->bottompoc = img->toppoc; //progressive
else
img->bottompoc = img->toppoc+1;
img->framepoc = imin (img->toppoc, img->bottompoc);
//the following is sent in the slice header
if (params->BRefPictures != 1)
{
img->delta_pic_order_cnt[0]= 2 * (img->b_frame_to_code - 1);
}
else
{
img->delta_pic_order_cnt[0]= -2;
}
img->delta_pic_order_cnt[1]= 0; // POC200301
FrameNumberInFile = CalculateFrameNumber();
encode_one_frame(); // encode one B-frame
img->last_ref_idc = img->nal_reference_idc ? 1 : 0;
if (params->ReportFrameStats)
report_frame_statistic();
}
}
}
img->b_frame_to_code = 0;
}
/*!
************************************************************************
* \brief
* POC-based reference management (FRAME)
************************************************************************
*/
void poc_based_ref_management_frame_pic(int current_pic_num)
{
unsigned i, pic_num = 0;
int min_poc=INT_MAX;
DecRefPicMarking_t *tmp_drpm,*tmp_drpm2;
if (img->dec_ref_pic_marking_buffer!=NULL)
return;
if ((dpb.ref_frames_in_buffer + dpb.ltref_frames_in_buffer)==0)
return;
for (i=0; i<dpb.used_size;i++)
{
if (dpb.fs[i]->is_reference && (!(dpb.fs[i]->is_long_term)) && dpb.fs[i]->poc < min_poc)
{
min_poc = dpb.fs[i]->frame->poc ;
pic_num = dpb.fs[i]->frame->pic_num;
}
}
if (NULL==(tmp_drpm=(DecRefPicMarking_t*)calloc (1,sizeof (DecRefPicMarking_t)))) no_mem_exit("poc_based_ref_management: tmp_drpm");
tmp_drpm->Next=NULL;
tmp_drpm->memory_management_control_operation = 0;
if (NULL==(tmp_drpm2=(DecRefPicMarking_t*)calloc (1,sizeof (DecRefPicMarking_t)))) no_mem_exit("poc_based_ref_management: tmp_drpm2");
tmp_drpm2->Next=tmp_drpm;
tmp_drpm2->memory_management_control_operation = 1;
tmp_drpm2->difference_of_pic_nums_minus1 = current_pic_num - pic_num - 1;
img->dec_ref_pic_marking_buffer = tmp_drpm2;
}
/*!
************************************************************************
* \brief
* POC-based reference management (FIELD)
************************************************************************
*/
void poc_based_ref_management_field_pic(int current_pic_num)
{
unsigned int i, pic_num1 = 0, pic_num2 = 0;
int min_poc=INT_MAX;
DecRefPicMarking_t *tmp_drpm,*tmp_drpm2, *tmp_drpm3;
if (img->dec_ref_pic_marking_buffer!=NULL)
return;
if ((dpb.ref_frames_in_buffer+dpb.ltref_frames_in_buffer)==0)
return;
if ( img->structure == TOP_FIELD )
{
for (i=0; i<dpb.used_size;i++)
{
if (dpb.fs[i]->is_reference && (!(dpb.fs[i]->is_long_term)) && dpb.fs[i]->poc < min_poc)
{
min_poc = dpb.fs[i]->poc;
pic_num1 = dpb.fs[i]->top_field->pic_num;
pic_num2 = dpb.fs[i]->bottom_field->pic_num;
}
}
}
if (NULL==(tmp_drpm=(DecRefPicMarking_t*)calloc (1,sizeof (DecRefPicMarking_t)))) no_mem_exit("poc_based_ref_management_field_pic: tmp_drpm");
tmp_drpm->Next=NULL;
tmp_drpm->memory_management_control_operation = 0;
if ( img->structure == BOTTOM_FIELD )
{
img->dec_ref_pic_marking_buffer = tmp_drpm;
return;
}
if (NULL==(tmp_drpm2=(DecRefPicMarking_t*)calloc (1,sizeof (DecRefPicMarking_t)))) no_mem_exit("poc_based_ref_management_field_pic: tmp_drpm2");
tmp_drpm2->Next=tmp_drpm;
tmp_drpm2->memory_management_control_operation = 1;
tmp_drpm2->difference_of_pic_nums_minus1 = current_pic_num - pic_num1 - 1;
if (NULL==(tmp_drpm3=(DecRefPicMarking_t*)calloc (1,sizeof (DecRefPicMarking_t)))) no_mem_exit("poc_based_ref_management_field_pic: tmp_drpm3");
tmp_drpm3->Next=tmp_drpm2;
tmp_drpm3->memory_management_control_operation = 1;
tmp_drpm3->difference_of_pic_nums_minus1 = current_pic_num - pic_num2 - 1;
img->dec_ref_pic_marking_buffer = tmp_drpm3;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -