void GeneratePictureParameterSet( pic_parameter_set_rbsp_t *pps, seq_parameter_set_rbsp_t *sps, int PPS_id, int WeightedPrediction, int WeightedBiprediction, int cb_qp_index_offset, int cr_qp_index_offset) { unsigned i; int frext_profile = ((IdentifyProfile()==FREXT_HP) || (IdentifyProfile()==FREXT_Hi10P) || (IdentifyProfile()==FREXT_Hi422) || (IdentifyProfile()==FREXT_Hi444)); // ************************************************************************* // Picture Parameter Set // ************************************************************************* pps->seq_parameter_set_id = sps->seq_parameter_set_id; pps->pic_parameter_set_id = PPS_id; pps->entropy_coding_mode_flag = (input->symbol_mode==UVLC?0:1); // Fidelity Range Extensions stuff if(frext_profile) { pps->transform_8x8_mode_flag = input->AllowTransform8x8 ? 1: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; } }
void GenerateSequenceParameterSet(seq_parameter_set_rbsp_t *sps, int SPS_id) { unsigned i; int SubWidthC [4]= { 1, 2, 2, 1}; int SubHeightC [4]= { 1, 2, 1, 1}; int frext_profile = ((IdentifyProfile()==FREXT_HP) || (IdentifyProfile()==FREXT_Hi10P) || (IdentifyProfile()==FREXT_Hi422) || (IdentifyProfile()==FREXT_Hi444)); // ************************************************************************* // Sequence Parameter Set // ************************************************************************* assert (sps != NULL); // Profile and Level should be calculated using the info from the config // file. Calculation is hidden in IndetifyProfile() and IdentifyLevel() sps->profile_idc = IdentifyProfile(); sps->level_idc = IdentifyLevel(); // needs to be set according to profile sps->constrained_set0_flag = 0; sps->constrained_set1_flag = 0; sps->constrained_set2_flag = 0; sps->constrained_set3_flag = 0; // Parameter Set ID hard coded to zero sps->seq_parameter_set_id = 0; // Fidelity Range Extensions stuff sps->bit_depth_luma_minus8 = input->BitDepthLuma - 8; sps->bit_depth_chroma_minus8 = input->BitDepthChroma - 8; img->lossless_qpprime_flag = input->lossless_qpprime_y_zero_flag & (sps->profile_idc==FREXT_Hi444); img->residue_transform_flag = input->residue_transform_flag; //! POC stuff: //! The following values are hard-coded in init_poc(). Apparently, //! the poc implementation covers only a subset of the poc functionality. //! Here, the same subset is implemented. Changes in the POC stuff have //! also to be reflected here sps->log2_max_frame_num_minus4 = log2_max_frame_num_minus4; sps->log2_max_pic_order_cnt_lsb_minus4 = log2_max_pic_order_cnt_lsb_minus4; sps->pic_order_cnt_type = input->pic_order_cnt_type; sps->num_ref_frames_in_pic_order_cnt_cycle = img->num_ref_frames_in_pic_order_cnt_cycle; sps->delta_pic_order_always_zero_flag = img->delta_pic_order_always_zero_flag; sps->offset_for_non_ref_pic = img->offset_for_non_ref_pic; sps->offset_for_top_to_bottom_field = img->offset_for_top_to_bottom_field; for (i=0; i<img->num_ref_frames_in_pic_order_cnt_cycle; i++) { sps->offset_for_ref_frame[i] = img->offset_for_ref_frame[i]; } // End of POC stuff // Number of Reference Frames sps->num_ref_frames = input->num_ref_frames; //required_frame_num_update_behaviour_flag hardcoded to zero sps->gaps_in_frame_num_value_allowed_flag = FALSE; // double check sps->frame_mbs_only_flag = !(input->PicInterlace || input->MbInterlace); // Picture size, finally a simple one :-) sps->pic_width_in_mbs_minus1 = ((input->img_width+img->auto_crop_right)/16) -1; sps->pic_height_in_map_units_minus1 = (((input->img_height+img->auto_crop_bottom)/16)/ (2 - sps->frame_mbs_only_flag)) - 1; // a couple of flags, simple sps->mb_adaptive_frame_field_flag = (FRAME_CODING != input->MbInterlace); sps->direct_8x8_inference_flag = input->directInferenceFlag; // Sequence VUI not implemented, signalled as not present sps->vui_parameters_present_flag = (input->rgb_input_flag && input->yuv_format==3); sps->chroma_format_idc = input->yuv_format; // This should be moved somewhere else. { int PicWidthInMbs, PicHeightInMapUnits, FrameHeightInMbs; int width, height; PicWidthInMbs = (sps->pic_width_in_mbs_minus1 +1); PicHeightInMapUnits = (sps->pic_height_in_map_units_minus1 +1); FrameHeightInMbs = ( 2 - sps->frame_mbs_only_flag ) * PicHeightInMapUnits; width = PicWidthInMbs * MB_BLOCK_SIZE; height = FrameHeightInMbs * MB_BLOCK_SIZE; Co_located = alloc_colocated (width, height,sps->mb_adaptive_frame_field_flag); } // Fidelity Range Extensions stuff if(frext_profile) { sps->seq_scaling_matrix_present_flag = (input->ScalingMatrixPresentFlag&1); for(i=0; i<8; i++) { if(i<6) sps->seq_scaling_list_present_flag[i] = (input->ScalingListPresentFlag[i]&1); else { if(input->AllowTransform8x8) sps->seq_scaling_list_present_flag[i] = (input->ScalingListPresentFlag[i]&1); else sps->seq_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; } if (img->auto_crop_right || img->auto_crop_bottom) { sps->frame_cropping_flag = TRUE; sps->frame_cropping_rect_left_offset=0; sps->frame_cropping_rect_top_offset=0; sps->frame_cropping_rect_right_offset= (img->auto_crop_right / SubWidthC[sps->chroma_format_idc]); sps->frame_cropping_rect_bottom_offset= (img->auto_crop_bottom / (SubHeightC[sps->chroma_format_idc] * (2 - sps->frame_mbs_only_flag))); if (img->auto_crop_right % SubWidthC[sps->chroma_format_idc]) { error("automatic frame cropping (width) not possible",500); } if (img->auto_crop_bottom % (SubHeightC[sps->chroma_format_idc] * (2 - sps->frame_mbs_only_flag))) { error("automatic frame cropping (height) not possible",500); } } else { sps->frame_cropping_flag = FALSE; } };
void FillParameterSetStructures (seq_parameter_set_rbsp_t *sps, pic_parameter_set_rbsp_t *pps) { unsigned i; // ************************************************************************* // Sequence Parameter Set // ************************************************************************* assert (sps != NULL); assert (pps != NULL); // Profile and Level should be calculated using the info from the config // file. Calculation is hidden in IndetifyProfile() and IdentifyLevel() sps->profile_idc = IdentifyProfile(); sps->level_idc = IdentifyLevel(); // needs to be set according to profile sps->constrained_set0_flag = 0; sps->constrained_set1_flag = 0; sps->constrained_set2_flag = 0; // Parameter Set ID hardcoded to zero sps->seq_parameter_set_id = 0; //! POC stuff: //! The following values are hard-coded in init_poc(). Apparently, //! the poc implementation covers only a subset of the poc functionality. //! Here, the same subset is implemented. Changes in the POC stuff have //! also to be reflected here sps->log2_max_frame_num_minus4 = log2_max_frame_num_minus4; sps->log2_max_pic_order_cnt_lsb_minus4 = log2_max_pic_order_cnt_lsb_minus4; sps->pic_order_cnt_type = input->pic_order_cnt_type; sps->num_ref_frames_in_pic_order_cnt_cycle = img->num_ref_frames_in_pic_order_cnt_cycle; sps->delta_pic_order_always_zero_flag = img->delta_pic_order_always_zero_flag; sps->offset_for_non_ref_pic = img->offset_for_non_ref_pic; sps->offset_for_top_to_bottom_field = img->offset_for_top_to_bottom_field; for (i=0; i<img->num_ref_frames_in_pic_order_cnt_cycle; i++) { sps->offset_for_ref_frame[i] = img->offset_for_ref_frame[i]; } // End of POC stuff // Number of Reference Frames sps->num_ref_frames = IdentifyNumRefFrames(); //required_frame_num_update_behaviour_flag hardcoded to zero sps->gaps_in_frame_num_value_allowed_flag = FALSE; // double check sps->frame_mbs_only_flag = !(input->PicInterlace || input->MbInterlace); // Picture size, finally a simple one :-) sps->pic_width_in_mbs_minus1 = (input->img_width/16) -1; sps->pic_height_in_map_units_minus1 = ((input->img_height/16)/ (2 - sps->frame_mbs_only_flag)) - 1; // a couple of flags, simple sps->mb_adaptive_frame_field_flag = (FRAME_CODING != input->MbInterlace); sps->direct_8x8_inference_flag = input->directInferenceFlag; // Sequence VUI not implemented, signalled as not present sps->vui_parameters_present_flag = FALSE; { int PicWidthInMbs, PicHeightInMapUnits, FrameHeightInMbs; int width, height; PicWidthInMbs = (sps->pic_width_in_mbs_minus1 +1); PicHeightInMapUnits = (sps->pic_height_in_map_units_minus1 +1); FrameHeightInMbs = ( 2 - sps->frame_mbs_only_flag ) * PicHeightInMapUnits; width = PicWidthInMbs * MB_BLOCK_SIZE; height = FrameHeightInMbs * MB_BLOCK_SIZE; Co_located = alloc_colocated (width, height,sps->mb_adaptive_frame_field_flag); } // ************************************************************************* // Picture Parameter Set // ************************************************************************* pps->seq_parameter_set_id = 0; pps->pic_parameter_set_id = 0; pps->entropy_coding_mode_flag = (input->symbol_mode==UVLC?0:1); // 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??? 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; };