📄 parset.c
字号:
if(i<6)
sps->seq_scaling_list_present_flag[i] = (input->ScalingListPresentFlag[i]&1);
else
{
if(pps->transform_8x8_mode_flag)
sps->seq_scaling_list_present_flag[i] = (input->ScalingListPresentFlag[i]&1);
else
sps->seq_scaling_list_present_flag[i] = 0;
}
}
pps->pic_scaling_matrix_present_flag = (input->ScalingMatrixPresentFlag&2)>>1;
for(i=0; i<8; i++)
{
if(i<6)
pps->pic_scaling_list_present_flag[i] = (input->ScalingListPresentFlag[i]&2)>>1;
else
{
if(pps->transform_8x8_mode_flag)
pps->pic_scaling_list_present_flag[i] = (input->ScalingListPresentFlag[i]&2)>>1;
else
pps->pic_scaling_list_present_flag[i] = 0;
}
}
}
else
{
sps->seq_scaling_matrix_present_flag = 0;
for(i=0; i<8; i++)
sps->seq_scaling_list_present_flag[i] = 0;
pps->pic_scaling_matrix_present_flag = 0;
for(i=0; i<8; i++)
pps->pic_scaling_list_present_flag[i] = 0;
pps->transform_8x8_mode_flag = input->AllowTransform8x8 = 0;
}
// JVT-Fxxx (by Stephan Wenger, make this flag unconditional
pps->pic_order_present_flag = img->pic_order_present_flag;
// Begin FMO stuff
pps->num_slice_groups_minus1 = input->num_slice_groups_minus1;
//! Following set the parameter for different slice group types
if (pps->num_slice_groups_minus1 > 0)
switch (input->slice_group_map_type)
{
case 0:
pps->slice_group_map_type = 0;
for(i=0; i<=pps->num_slice_groups_minus1; i++)
{
pps->run_length_minus1[i]=input->run_length_minus1[i];
}
break;
case 1:
pps->slice_group_map_type = 1;
break;
case 2:
// i loops from 0 to num_slice_groups_minus1-1, because no info for background needed
pps->slice_group_map_type = 2;
for(i=0; i<pps->num_slice_groups_minus1; i++)
{
pps->top_left[i] = input->top_left[i];
pps->bottom_right[i] = input->bottom_right[i];
}
break;
case 3:
case 4:
case 5:
pps->slice_group_map_type = input->slice_group_map_type;
pps->slice_group_change_direction_flag = input->slice_group_change_direction_flag;
pps->slice_group_change_rate_minus1 = input->slice_group_change_rate_minus1;
break;
case 6:
pps->slice_group_map_type = 6;
pps->pic_size_in_map_units_minus1 =
((input->img_height/MB_BLOCK_SIZE)/(2-sps->frame_mbs_only_flag))
*(input->img_width/MB_BLOCK_SIZE) -1;
for (i=0;i<=pps->pic_size_in_map_units_minus1; i++)
pps->slice_group_id[i] = input->slice_group_id[i];
break;
default:
printf ("Parset.c: slice_group_map_type invalid, default\n");
assert (0==1);
}
// End FMO stuff
pps->num_ref_idx_l0_active_minus1 = sps->frame_mbs_only_flag ? (sps->num_ref_frames-1) : (2 * sps->num_ref_frames - 1) ; // set defaults
pps->num_ref_idx_l1_active_minus1 = sps->frame_mbs_only_flag ? (sps->num_ref_frames-1) : (2 * sps->num_ref_frames - 1) ; // set defaults
//pps->num_ref_idx_l1_active_minus1 = sps->frame_mbs_only_flag ? 0 : 1 ; // set defaults
pps->weighted_pred_flag = input->WeightedPrediction;
pps->weighted_bipred_idc = input->WeightedBiprediction;
pps->pic_init_qp_minus26 = 0; // hard coded to zero, QP lives in the slice header
pps->pic_init_qs_minus26 = 0;
pps->chroma_qp_index_offset = input->chroma_qp_index_offset; // double check: is this chroma fidelity thing already implemented???
if (frext_profile)
{
pps->cb_qp_index_offset = input->cb_qp_index_offset;
pps->cr_qp_index_offset = input->cr_qp_index_offset;
}
else
pps->cb_qp_index_offset = pps->cr_qp_index_offset = pps->chroma_qp_index_offset;
pps->deblocking_filter_control_present_flag = input->LFSendParameters;
pps->constrained_intra_pred_flag = input->UseConstrainedIntraPred;
pps->redundant_pic_cnt_present_flag = 0;
// the picture vui consists currently of the cropping rectangle, which cannot
// used by the current decoder and hence is never sent.
sps->frame_cropping_flag = FALSE;
};
/*!
*************************************************************************************
* \brief
* syntax for scaling list matrix values
*
* \param scalingListinput
* input scaling list
* \param scalingList
* scaling list to be used
* \param sizeOfScalingList
* size of the scaling list
* \param UseDefaultScalingMatrix
* usage of default Scaling Matrix
* \param partition
* partition info for writing syntax
*
* \return
* size of the RBSP in bytes
*
*************************************************************************************
*/
int Scaling_List(short *scalingListinput, short *scalingList, int sizeOfScalingList, short *UseDefaultScalingMatrix, DataPartition *partition)
{
int j, scanj;
int len=0;
int delta_scale, lastScale, nextScale;
lastScale = 8;
nextScale = 8;
for(j=0; j<sizeOfScalingList; j++)
{
scanj = (sizeOfScalingList==16) ? ZZ_SCAN[j]:ZZ_SCAN8[j];
if(nextScale!=0)
{
delta_scale = scalingListinput[scanj]-lastScale; // Calculate delta from the scalingList data from the input file
if(delta_scale>127)
delta_scale=delta_scale-256;
else if(delta_scale<-128)
delta_scale=delta_scale+256;
len+=se_v (" : delta_sl ", delta_scale, partition);
nextScale = scalingListinput[scanj];
*UseDefaultScalingMatrix|=(scanj==0 && nextScale==0); // Check first matrix value for zero
}
scalingList[scanj] = (nextScale==0) ? lastScale:nextScale; // Update the actual scalingList matrix with the correct values
lastScale = scalingList[scanj];
}
return len;
}
/*!
*************************************************************************************
* \brief
* int GenerateSeq_parameter_set_rbsp (seq_parameter_set_rbsp_t *sps, char *rbsp);
*
* \param sps
* sequence parameter structure
* \param rbsp
* buffer to be filled with the rbsp, size should be at least MAXIMUMPARSETRBSPSIZE
*
* \return
* size of the RBSP in bytes
*
* \note
* Sequence Parameter VUI function is called, but the function implements
* an exit (-1)
*************************************************************************************
*/
int GenerateSeq_parameter_set_rbsp (seq_parameter_set_rbsp_t *sps, char *rbsp)
{
DataPartition *partition;
int len = 0, LenInBytes;
unsigned i;
assert (rbsp != NULL);
// In order to use the entropy coding functions from golomb.c we need
// to allocate a partition structure. It will be freed later in this
// function
if ((partition=calloc(1,sizeof(DataPartition)))==NULL) no_mem_exit("SeqParameterSet:partition");
if ((partition->bitstream=calloc(1, sizeof(Bitstream)))==NULL) no_mem_exit("SeqParameterSet:bitstream");
// .. and use the rbsp provided (or allocated above) for the data
partition->bitstream->streamBuffer = rbsp;
partition->bitstream->bits_to_go = 8;
len+=u_v (8, "SPS: profile_idc", sps->profile_idc, partition);
len+=u_1 ("SPS: constrained_set0_flag", sps->constrained_set0_flag, partition);
len+=u_1 ("SPS: constrained_set1_flag", sps->constrained_set1_flag, partition);
len+=u_1 ("SPS: constrained_set2_flag", sps->constrained_set2_flag, partition);
len+=u_1 ("SPS: constrained_set3_flag", sps->constrained_set3_flag, partition);
len+=u_v (4, "SPS: reserved_zero_4bits", 0, partition);
len+=u_v (8, "SPS: level_idc", sps->level_idc, partition);
len+=ue_v ("SPS: seq_parameter_set_id", sps->seq_parameter_set_id, partition);
// Fidelity Range Extensions stuff
if((sps->profile_idc==FREXT_HP) ||
(sps->profile_idc==FREXT_Hi10P) ||
(sps->profile_idc==FREXT_Hi422) ||
(sps->profile_idc==FREXT_Hi444))
{
len+=ue_v ("SPS: chroma_format_idc", img->yuv_format, partition);
if(img->yuv_format == 3)
len+=u_1 ("SPS: residue_transform_flag", img->residue_transform_flag, partition);
len+=ue_v ("SPS: bit_depth_luma_minus8", sps->bit_depth_luma_minus8, partition);
len+=ue_v ("SPS: bit_depth_chroma_minus8", sps->bit_depth_chroma_minus8, partition);
len+=u_1 ("SPS: lossless_qpprime_y_zero_flag", img->lossless_qpprime_flag, partition);
//other chroma info to be added in the future
len+=u_1 ("SPS: seq_scaling_matrix_present_flag", sps->seq_scaling_matrix_present_flag, partition);
if(sps->seq_scaling_matrix_present_flag)
{
for(i=0; i<8; i++)
{
len+=u_1 ("SPS: seq_scaling_list_present_flag", sps->seq_scaling_list_present_flag[i], partition);
if(sps->seq_scaling_list_present_flag[i])
{
if(i<6)
len+=Scaling_List(ScalingList4x4input[i], ScalingList4x4[i], 16, &UseDefaultScalingMatrix4x4Flag[i], partition);
else
len+=Scaling_List(ScalingList8x8input[i-6], ScalingList8x8[i-6], 64, &UseDefaultScalingMatrix8x8Flag[i-6], partition);
}
}
}
}
len+=ue_v ("SPS: log2_max_frame_num_minus4", sps->log2_max_frame_num_minus4, partition);
len+=ue_v ("SPS: pic_order_cnt_type", sps->pic_order_cnt_type, partition);
if (sps->pic_order_cnt_type == 0)
len+=ue_v ("SPS: log2_max_pic_order_cnt_lsb_minus4", sps->log2_max_pic_order_cnt_lsb_minus4, partition);
else if (sps->pic_order_cnt_type == 1)
{
len+=u_1 ("SPS: delta_pic_order_always_zero_flag", sps->delta_pic_order_always_zero_flag, partition);
len+=se_v ("SPS: offset_for_non_ref_pic", sps->offset_for_non_ref_pic, partition);
len+=se_v ("SPS: offset_for_top_to_bottom_field", sps->offset_for_top_to_bottom_field, partition);
len+=ue_v ("SPS: num_ref_frames_in_pic_order_cnt_cycle", sps->num_ref_frames_in_pic_order_cnt_cycle, partition);
for (i=0; i<sps->num_ref_frames_in_pic_order_cnt_cycle; i++)
len+=se_v ("SPS: offset_for_ref_frame", sps->offset_for_ref_frame[i], partition);
}
len+=ue_v ("SPS: num_ref_frames", sps->num_ref_frames, partition);
len+=u_1 ("SPS: gaps_in_frame_num_value_allowed_flag", sps->gaps_in_frame_num_value_allowed_flag, partition);
len+=ue_v ("SPS: pic_width_in_mbs_minus1", sps->pic_width_in_mbs_minus1, partition);
len+=ue_v ("SPS: pic_height_in_map_units_minus1", sps->pic_height_in_map_units_minus1, partition);
len+=u_1 ("SPS: frame_mbs_only_flag", sps->frame_mbs_only_flag, partition);
if (!sps->frame_mbs_only_flag)
{
len+=u_1 ("SPS: mb_adaptive_frame_field_flag", sps->mb_adaptive_frame_field_flag, partition);
}
len+=u_1 ("SPS: direct_8x8_inference_flag", sps->direct_8x8_inference_flag, partition);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -