📄 header.c
字号:
/*!
*************************************************************************************
* \file header.c
*
* \brief
* H.26L Slice and Sequence headers
*
* \author
* Main contributors (see contributors.h for copyright, address and affiliation details)
* - Stephan Wenger <stewe@cs.tu-berlin.de>
*************************************************************************************
*/
#include <math.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include "elements.h"
#include "header.h"
#include "rtp.h"
#include "mbuffer.h"
#include "defines.h"
#include "vlc.h"
#include "parset.h"
// A little trick to avoid those horrible #if TRACE all over the source code
#if TRACE
#define SYMTRACESTRING(s) strncpy(sym->tracestring,s,TRACESTRING_SIZE)
#else
#define SYMTRACESTRING(s) // do nothing
#endif
static int ref_pic_list_reordering();
static int dec_ref_pic_marking();
static int pred_weight_table();
/*!
********************************************************************************************
* \brief
* Write a slice header
********************************************************************************************
*/
int SliceHeader()
{
int dP_nr = assignSE2partition[input->partition_mode][SE_HEADER];
DataPartition *partition = &((img->currentSlice)->partArr[dP_nr]);
int len = 0;
unsigned int field_pic_flag = 0, bottom_field_flag = 0; // POC200301
len = ue_v("SH: first_mb_in_slice", img->current_mb_nr, partition);
len += ue_v("SH: slice_type", get_picture_type (), partition);
// Note: Encoder supports only one pic/seq parameter set, hence value is
// hard coded to zero
len += ue_v("SH: pic_parameter_set_id" , 0 ,partition);
// frame_num
assert (img->frame_num < 1<<(LOG2_MAX_FRAME_NUM_MINUS4+4)); // check that it fits
len += u_v (LOG2_MAX_FRAME_NUM_MINUS4 + 4,"SH: frame_num", img->frame_num, partition);
if (input->InterlaceCodingOption != FRAME_CODING) // same condition as for sps->frame_mbs_only_flag!
{
// field_pic_flag u(1)
field_pic_flag = (img->structure ==TOP_FIELD || img->structure ==BOTTOM_FIELD)?1:0;
assert( field_pic_flag == img->fld_flag );
len += u_1("SH: field_pic_flag", field_pic_flag, partition);
if (field_pic_flag)
{
//bottom_field_flag u(1)
bottom_field_flag = (img->structure == BOTTOM_FIELD)?1:0;
len += u_1("SH: bottom_field_flag" , bottom_field_flag ,partition);
}
}
if (img->currentPicture->idr_flag)
{
// idr_pic_id
// hard coded to zero because we don't have proper IDR handling at the moment
len += ue_v ("SH: idr_pic_id", 0, partition);
}
// POC200301
if (img->pic_order_cnt_type == 0)
{
if (input->InterlaceCodingOption == FRAME_CODING) // same condition as for sps->frame_mbs_only_flag!
{
img->pic_order_cnt_lsb = (img->toppoc & ~((((unsigned int)(-1)) << (LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4+4))) );
}
else
{
if (!field_pic_flag || img->structure == TOP_FIELD)
img->pic_order_cnt_lsb = (img->toppoc & ~((((unsigned int)(-1)) << (LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4+4))) );
else if ( img->structure == BOTTOM_FIELD )
img->pic_order_cnt_lsb = (img->bottompoc & ~((((unsigned int)(-1)) << (LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4+4))) );
}
len += u_v (LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4+4, "SH: pic_order_cnt_lsb", img->pic_order_cnt_lsb, partition);
if (img->pic_order_present_flag && !field_pic_flag) // img->fld_flag
{
len += se_v ("SH: delta_pic_order_cnt_bottom", img->delta_pic_order_cnt_bottom, partition);
}
}
if (img->pic_order_cnt_type == 1 && !img->delta_pic_order_always_zero_flag)
{
len += se_v ("SH: delta_pic_order_cnt[0]", img->delta_pic_order_cnt[0], partition);
if (img->pic_order_present_flag && !field_pic_flag) // img->fld_flag
{
len += se_v ("SH: delta_pic_order_cnt[1]", img->delta_pic_order_cnt[1], partition);
}
}
// ist there any sense in the following assignments ???
toprefpoc[0]=toprefpoc[0];
bottomrefpoc[0]=bottomrefpoc[0];
// redundant slice info redundant_pic_cnt is missing here
if (input->redundant_slice_flag)
{
len += se_v ("SH: redundant_pic_cnt", img->redundant_pic_cnt, partition);
}
// Direct Mode Type selection for B pictures
if (img->type==B_SLICE)
{
len += u_1 ("SH: direct_spatial_mv_pred_flag", input->direct_type, partition);
}
// if ((img->type == P_SLICE) || (img->type == B_SLICE) || (img->type == BS_IMG) || (img->type==SP_SLICE))
if ((img->type == P_SLICE) || (img->type == B_SLICE) || (img->type==SP_SLICE))
{
// num_ref_idx_active_override_flag here always 1
len += u_1 ("SH: num_ref_idx_active_override_flag", 1, partition);
if (1) // if (num_ref_idx_active_override_flag)
{
len += ue_v ("SH: num_ref_idx_l0_active_minus1", img->num_ref_idx_l0_active-1, partition);
if (img->type==B_SLICE)
{
len += ue_v ("SH: num_ref_idx_l1_active_minus1", img->num_ref_idx_l1_active-1, partition);
}
}
}
len += ref_pic_list_reordering();
if (((img->type == P_SLICE || img->type == SP_SLICE) && input->WeightedPrediction) ||
((img->type == B_SLICE) && input->WeightedBiprediction == 1))
{
len += pred_weight_table();
}
if (img->nal_reference_idc)
len += dec_ref_pic_marking();
if(input->symbol_mode==CABAC && img->type!=I_SLICE /*&& img->type!=SI_IMG*/)
{
len += ue_v("SH: cabac_init_idc", img->model_number, partition);
}
// we transmit zero in the pps, so here the real QP
len += se_v("SH: slice_qp_delta", (img->qp - 26), partition);
if (img->type==SP_SLICE /*|| img->type==SI_SLICE*/)
{
if (img->type==SP_SLICE) // Switch Flag only for SP pictures
{
len += u_1 ("SH: sp_for_switch_flag", 0, partition); // 1 for switching SP, 0 for normal SP
}
len += se_v ("SH: slice_qs_delta", (img->qpsp - 26), partition );
}
if (input->LFSendParameters)
{
len += ue_v("SH: disable_deblocking_filter_idc",input->LFDisableIdc, partition); // Turn loop filter on/off on slice basis
if (input->LFDisableIdc!=1)
{
len += se_v ("SH: slice_alpha_c0_offset_div2", input->LFAlphaC0Offset / 2, partition);
len += se_v ("SH: slice_beta_offset_div2", input->LFBetaOffset / 2, partition);
}
}
// !KS: all fmo map types are currently mapped to type 6 so
// no slice_group_change_cycle is transmitted
return len;
}
/*!
********************************************************************************************
* \brief
* writes the ref_pic_list_reordering syntax
* based on content of according fields in img structure
*
* \return
* number of bits used
********************************************************************************************
*/
static int ref_pic_list_reordering()
{
int dP_nr = assignSE2partition[input->partition_mode][SE_HEADER];
DataPartition *partition = &((img->currentSlice)->partArr[dP_nr]);
Slice *currSlice = img->currentSlice;
int i, len=0;
if ((img->type!=I_SLICE) /*&&(img->type!=SI_IMG)*/ )
{
len += u_1 ("SH: ref_pic_list_reordering_flag_l0", currSlice->ref_pic_list_reordering_flag_l0, partition);
if (currSlice->ref_pic_list_reordering_flag_l0)
{
i=0;
do
{
len += ue_v ("SH: remapping_of_pic_num_idc", currSlice->remapping_of_pic_nums_idc_l0[i], partition);
if (currSlice->remapping_of_pic_nums_idc_l0[i]==0 ||
currSlice->remapping_of_pic_nums_idc_l0[i]==1)
{
len += ue_v ("SH: abs_diff_pic_num_minus1_l0", currSlice->abs_diff_pic_num_minus1_l0[i], partition);
}
else
{
if (currSlice->remapping_of_pic_nums_idc_l0[i]==2)
{
len += ue_v ("SH: long_term_pic_idx_l0", currSlice->long_term_pic_idx_l0[i], partition);
}
}
i++;
} while (currSlice->remapping_of_pic_nums_idc_l0[i] != 3);
}
}
if (img->type==B_SLICE)
{
len += u_1 ("SH: ref_pic_list_reordering_flag_l1", currSlice->ref_pic_list_reordering_flag_l1, partition);
if (currSlice->ref_pic_list_reordering_flag_l1)
{
i=0;
do
{
len += ue_v ("SH: remapping_of_pic_num_idc", currSlice->remapping_of_pic_nums_idc_l1[i], partition);
if (currSlice->remapping_of_pic_nums_idc_l1[i]==0 ||
currSlice->remapping_of_pic_nums_idc_l1[i]==1)
{
len += ue_v ("SH: abs_diff_pic_num_minus1_l1", currSlice->abs_diff_pic_num_minus1_l1[i], partition);
}
else
{
if (currSlice->remapping_of_pic_nums_idc_l1[i]==2)
{
len += ue_v ("SH: long_term_pic_idx_l1", currSlice->long_term_pic_idx_l1[i], partition);
}
}
i++;
} while (currSlice->remapping_of_pic_nums_idc_l1[i] != 3);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -