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