1 2 /*! 3 ************************************************************************************** 4 * \file 5 * parsetcommon.h 6 * \brief 7 * Picture and Sequence Parameter Sets, structures common to encoder and decoder 8 * 9 * \date 25 November 2002 10 * \author 11 * Main contributors (see contributors.h for copyright, address and affiliation details) 12 * - Stephan Wenger <stewe@cs.tu-berlin.de> 13 *************************************************************************************** 14 */ 15 16 17 18 // In the MPEG-4 AVC/H.264 syntax, frequently flags are used that indicate the presence of 19 // certain pieces of information in the NALU. Here, these flags are also 20 // present. In the encoder, those bits indicate that the values signaled to 21 // be present are meaningful and that this part of the syntax should be 22 // written to the NALU. In the decoder, the flag indicates that information 23 // was received from the decoded NALU and should be used henceforth. 24 // The structure names were chosen as indicated in the MPEG-4 AVC/H.264 syntax 25 26 #ifndef _PARSETCOMMON_H_ 27 #define _PARSETCOMMON_H_ 28 29 #include "defines.h" 30 31 #define MAXIMUMPARSETRBSPSIZE 1500 32 #define MAXIMUMPARSETNALUSIZE 1500 33 34 #define MAXSPS 32 35 #define MAXPPS 256 36 37 #define MAXIMUMVALUEOFcpb_cnt 32 38 typedef struct 39 { 40 unsigned int cpb_cnt_minus1; // ue(v) 41 unsigned int bit_rate_scale; // u(4) 42 unsigned int cpb_size_scale; // u(4) 43 unsigned int bit_rate_value_minus1 [MAXIMUMVALUEOFcpb_cnt]; // ue(v) 44 unsigned int cpb_size_value_minus1 [MAXIMUMVALUEOFcpb_cnt]; // ue(v) 45 unsigned int cbr_flag [MAXIMUMVALUEOFcpb_cnt]; // u(1) 46 unsigned int initial_cpb_removal_delay_length_minus1; // u(5) 47 unsigned int cpb_removal_delay_length_minus1; // u(5) 48 unsigned int dpb_output_delay_length_minus1; // u(5) 49 unsigned int time_offset_length; // u(5) 50 } hrd_parameters_t; 51 52 53 typedef struct 54 { 55 Boolean aspect_ratio_info_present_flag; // u(1) 56 unsigned int aspect_ratio_idc; // u(8) 57 unsigned short sar_width; // u(16) 58 unsigned short sar_height; // u(16) 59 Boolean overscan_info_present_flag; // u(1) 60 Boolean overscan_appropriate_flag; // u(1) 61 Boolean video_signal_type_present_flag; // u(1) 62 unsigned int video_format; // u(3) 63 Boolean video_full_range_flag; // u(1) 64 Boolean colour_description_present_flag; // u(1) 65 unsigned int colour_primaries; // u(8) 66 unsigned int transfer_characteristics; // u(8) 67 unsigned int matrix_coefficients; // u(8) 68 Boolean chroma_location_info_present_flag; // u(1) 69 unsigned int chroma_sample_loc_type_top_field; // ue(v) 70 unsigned int chroma_sample_loc_type_bottom_field; // ue(v) 71 Boolean timing_info_present_flag; // u(1) 72 unsigned int num_units_in_tick; // u(32) 73 unsigned int time_scale; // u(32) 74 Boolean fixed_frame_rate_flag; // u(1) 75 Boolean nal_hrd_parameters_present_flag; // u(1) 76 hrd_parameters_t nal_hrd_parameters; // hrd_paramters_t 77 Boolean vcl_hrd_parameters_present_flag; // u(1) 78 hrd_parameters_t vcl_hrd_parameters; // hrd_paramters_t 79 // if ((nal_hrd_parameters_present_flag || (vcl_hrd_parameters_present_flag)) 80 Boolean low_delay_hrd_flag; // u(1) 81 Boolean pic_struct_present_flag; // u(1) 82 Boolean bitstream_restriction_flag; // u(1) 83 Boolean motion_vectors_over_pic_boundaries_flag; // u(1) 84 unsigned int max_bytes_per_pic_denom; // ue(v) 85 unsigned int max_bits_per_mb_denom; // ue(v) 86 unsigned int log2_max_mv_length_vertical; // ue(v) 87 unsigned int log2_max_mv_length_horizontal; // ue(v) 88 unsigned int num_reorder_frames; // ue(v) 89 unsigned int max_dec_frame_buffering; // ue(v) 90 } vui_seq_parameters_t; 91 92 93 #define MAXnum_slice_groups_minus1 8 94 typedef struct 95 { 96 Boolean Valid; // indicates the parameter set is valid 97 unsigned int pic_parameter_set_id; // ue(v) 98 unsigned int seq_parameter_set_id; // ue(v) 99 Boolean entropy_coding_mode_flag; // u(1) 100 Boolean transform_8x8_mode_flag; // u(1) 101 102 Boolean pic_scaling_matrix_present_flag; // u(1) 103 int pic_scaling_list_present_flag[12]; // u(1) 104 int ScalingList4x4[6][16]; // se(v) 105 int ScalingList8x8[6][64]; // se(v) 106 Boolean UseDefaultScalingMatrix4x4Flag[6]; 107 Boolean UseDefaultScalingMatrix8x8Flag[6]; 108 109 // if( pic_order_cnt_type < 2 ) in the sequence parameter set 110 Boolean bottom_field_pic_order_in_frame_present_flag; // u(1) 111 unsigned int num_slice_groups_minus1; // ue(v) 112 unsigned int slice_group_map_type; // ue(v) 113 // if( slice_group_map_type = = 0 ) 114 unsigned int run_length_minus1[MAXnum_slice_groups_minus1]; // ue(v) 115 // else if( slice_group_map_type = = 2 ) 116 unsigned int top_left[MAXnum_slice_groups_minus1]; // ue(v) 117 unsigned int bottom_right[MAXnum_slice_groups_minus1]; // ue(v) 118 // else if( slice_group_map_type = = 3 || 4 || 5 119 Boolean slice_group_change_direction_flag; // u(1) 120 unsigned int slice_group_change_rate_minus1; // ue(v) 121 // else if( slice_group_map_type = = 6 ) 122 unsigned int pic_size_in_map_units_minus1; // ue(v) 123 byte *slice_group_id; // complete MBAmap u(v) 124 125 int num_ref_idx_l0_default_active_minus1; // ue(v) 126 int num_ref_idx_l1_default_active_minus1; // ue(v) 127 Boolean weighted_pred_flag; // u(1) 128 unsigned int weighted_bipred_idc; // u(2) 129 int pic_init_qp_minus26; // se(v) 130 int pic_init_qs_minus26; // se(v) 131 int chroma_qp_index_offset; // se(v) 132 133 int cb_qp_index_offset; // se(v) 134 int cr_qp_index_offset; // se(v) 135 int second_chroma_qp_index_offset; // se(v) 136 137 Boolean deblocking_filter_control_present_flag; // u(1) 138 Boolean constrained_intra_pred_flag; // u(1) 139 Boolean redundant_pic_cnt_present_flag; // u(1) 140 Boolean vui_pic_parameters_flag; // u(1) 141 } pic_parameter_set_rbsp_t; 142 143 144 #define MAXnum_ref_frames_in_pic_order_cnt_cycle 256 145 typedef struct 146 { 147 Boolean Valid; // indicates the parameter set is valid 148 149 unsigned int profile_idc; // u(8) 150 Boolean constrained_set0_flag; // u(1) 151 Boolean constrained_set1_flag; // u(1) 152 Boolean constrained_set2_flag; // u(1) 153 Boolean constrained_set3_flag; // u(1) 154 #if (MVC_EXTENSION_ENABLE) 155 Boolean constrained_set4_flag; // u(1) 156 Boolean constrained_set5_flag; // u(2) 157 #endif 158 unsigned int level_idc; // u(8) 159 unsigned int seq_parameter_set_id; // ue(v) 160 unsigned int chroma_format_idc; // ue(v) 161 162 Boolean seq_scaling_matrix_present_flag; // u(1) 163 int seq_scaling_list_present_flag[12]; // u(1) 164 int ScalingList4x4[6][16]; // se(v) 165 int ScalingList8x8[6][64]; // se(v) 166 Boolean UseDefaultScalingMatrix4x4Flag[6]; 167 Boolean UseDefaultScalingMatrix8x8Flag[6]; 168 169 unsigned int bit_depth_luma_minus8; // ue(v) 170 unsigned int bit_depth_chroma_minus8; // ue(v) 171 unsigned int log2_max_frame_num_minus4; // ue(v) 172 unsigned int pic_order_cnt_type; 173 // if( pic_order_cnt_type == 0 ) 174 unsigned int log2_max_pic_order_cnt_lsb_minus4; // ue(v) 175 // else if( pic_order_cnt_type == 1 ) 176 Boolean delta_pic_order_always_zero_flag; // u(1) 177 int offset_for_non_ref_pic; // se(v) 178 int offset_for_top_to_bottom_field; // se(v) 179 unsigned int num_ref_frames_in_pic_order_cnt_cycle; // ue(v) 180 // for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ ) 181 int offset_for_ref_frame[MAXnum_ref_frames_in_pic_order_cnt_cycle]; // se(v) 182 unsigned int num_ref_frames; // ue(v) 183 Boolean gaps_in_frame_num_value_allowed_flag; // u(1) 184 unsigned int pic_width_in_mbs_minus1; // ue(v) 185 unsigned int pic_height_in_map_units_minus1; // ue(v) 186 Boolean frame_mbs_only_flag; // u(1) 187 // if( !frame_mbs_only_flag ) 188 Boolean mb_adaptive_frame_field_flag; // u(1) 189 Boolean direct_8x8_inference_flag; // u(1) 190 Boolean frame_cropping_flag; // u(1) 191 unsigned int frame_crop_left_offset; // ue(v) 192 unsigned int frame_crop_right_offset; // ue(v) 193 unsigned int frame_crop_top_offset; // ue(v) 194 unsigned int frame_crop_bottom_offset; // ue(v) 195 Boolean vui_parameters_present_flag; // u(1) 196 vui_seq_parameters_t vui_seq_parameters; // vui_seq_parameters_t 197 unsigned separate_colour_plane_flag; // u(1) 198 #if (MVC_EXTENSION_ENABLE) 199 int max_dec_frame_buffering; 200 #endif 201 int lossless_qpprime_flag; 202 } seq_parameter_set_rbsp_t; 203 204 #if (MVC_EXTENSION_ENABLE) 205 typedef struct mvcvui_tag 206 { 207 int num_ops_minus1; 208 char *temporal_id; 209 int *num_target_output_views_minus1; 210 int **view_id; 211 char *timing_info_present_flag; 212 int *num_units_in_tick; 213 int *time_scale; 214 char *fixed_frame_rate_flag; 215 char *nal_hrd_parameters_present_flag; 216 char *vcl_hrd_parameters_present_flag; 217 char *low_delay_hrd_flag; 218 char *pic_struct_present_flag; 219 220 //hrd parameters; 221 char cpb_cnt_minus1; 222 char bit_rate_scale; 223 char cpb_size_scale; 224 int bit_rate_value_minus1[32]; 225 int cpb_size_value_minus1[32]; 226 char cbr_flag[32]; 227 char initial_cpb_removal_delay_length_minus1; 228 char cpb_removal_delay_length_minus1; 229 char dpb_output_delay_length_minus1; 230 char time_offset_length; 231 }MVCVUI_t; 232 233 typedef struct 234 { 235 seq_parameter_set_rbsp_t sps; 236 237 unsigned int bit_equal_to_one; 238 int num_views_minus1; 239 int *view_id; 240 int *num_anchor_refs_l0; 241 int **anchor_ref_l0; 242 int *num_anchor_refs_l1; 243 int **anchor_ref_l1; 244 245 int *num_non_anchor_refs_l0; 246 int **non_anchor_ref_l0; 247 int *num_non_anchor_refs_l1; 248 int **non_anchor_ref_l1; 249 250 int num_level_values_signalled_minus1; 251 int *level_idc; 252 int *num_applicable_ops_minus1; 253 int **applicable_op_temporal_id; 254 int **applicable_op_num_target_views_minus1; 255 int ***applicable_op_target_view_id; 256 int **applicable_op_num_views_minus1; 257 258 unsigned int mvc_vui_parameters_present_flag; 259 Boolean Valid; // indicates the parameter set is valid 260 MVCVUI_t MVCVUIParams; 261 } subset_seq_parameter_set_rbsp_t; 262 263 #endif 264 265 pic_parameter_set_rbsp_t *AllocPPS (void); 266 seq_parameter_set_rbsp_t *AllocSPS (void); 267 268 void FreePPS (pic_parameter_set_rbsp_t *pps); 269 void FreeSPS (seq_parameter_set_rbsp_t *sps); 270 271 int sps_is_equal(seq_parameter_set_rbsp_t *sps1, seq_parameter_set_rbsp_t *sps2); 272 int pps_is_equal(pic_parameter_set_rbsp_t *pps1, pic_parameter_set_rbsp_t *pps2); 273 274 #endif 275