1 /* Gstreamer
2  * Copyright (C) <2011> Intel Corporation
3  * Copyright (C) <2011> Collabora Ltd.
4  * Copyright (C) <2011> Thibault Saunier <thibault.saunier@collabora.com>
5  *
6  * Some bits C-c,C-v'ed and s/4/3 from h264parse and videoparsers/h264parse.c:
7  *    Copyright (C) <2010> Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
8  *    Copyright (C) <2010> Collabora Multimedia
9  *    Copyright (C) <2010> Nokia Corporation
10  *
11  *    (C) 2005 Michal Benes <michal.benes@itonis.tv>
12  *    (C) 2008 Wim Taymans <wim.taymans@gmail.com>
13  *
14  * This library is free software; you can redistribute it and/or
15  * modify it under the terms of the GNU Library General Public
16  * License as published by the Free Software Foundation; either
17  * version 2 of the License, or (at your option) any later version.
18  *
19  * This library is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22  * Library General Public License for more details.
23  *
24  * You should have received a copy of the GNU Library General Public
25  * License along with this library; if not, write to the
26  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
27  * Boston, MA 02110-1301, USA.
28  */
29 
30 #ifndef __GST_H264_PARSER_H__
31 #define __GST_H264_PARSER_H__
32 
33 #ifndef GST_USE_UNSTABLE_API
34 #warning "The H.264 parsing library is unstable API and may change in future."
35 #warning "You can define GST_USE_UNSTABLE_API to avoid this warning."
36 #endif
37 
38 #include <gst/gst.h>
39 #include <gst/codecparsers/codecparsers-prelude.h>
40 
41 G_BEGIN_DECLS
42 
43 #define GST_H264_MAX_SPS_COUNT   32
44 #define GST_H264_MAX_PPS_COUNT   256
45 #define GST_H264_MAX_VIEW_COUNT  1024
46 #define GST_H264_MAX_VIEW_ID     (GST_H264_MAX_VIEW_COUNT - 1)
47 
48 #define GST_H264_IS_P_SLICE(slice)  (((slice)->type % 5) == GST_H264_P_SLICE)
49 #define GST_H264_IS_B_SLICE(slice)  (((slice)->type % 5) == GST_H264_B_SLICE)
50 #define GST_H264_IS_I_SLICE(slice)  (((slice)->type % 5) == GST_H264_I_SLICE)
51 #define GST_H264_IS_SP_SLICE(slice) (((slice)->type % 5) == GST_H264_SP_SLICE)
52 #define GST_H264_IS_SI_SLICE(slice) (((slice)->type % 5) == GST_H264_SI_SLICE)
53 
54 /**
55  * GST_H264_IS_SVC_NALU:
56  * @nalu: a #GstH264NalUnit
57  *
58  * Check if @nalu is a scalable extension NAL unit.
59  *
60  * Since: 1.6
61  */
62 #define GST_H264_IS_SVC_NALU(nalu) \
63   ((nalu)->extension_type == GST_H264_NAL_EXTENSION_SVC)
64 
65 /**
66  * GST_H264_IS_MVC_NALU:
67  * @nalu: a #GstH264NalUnit
68  *
69  * Check if @nalu is a multiview extension NAL unit.
70  *
71  * Since: 1.6
72  */
73 #define GST_H264_IS_MVC_NALU(nalu) \
74   ((nalu)->extension_type == GST_H264_NAL_EXTENSION_MVC)
75 
76 /**
77  * GstH264Profile:
78  * @GST_H264_PROFILE_BASELINE: Baseline profile (A.2.1)
79  * @GST_H264_PROFILE_MAIN: Main profile (A.2.2)
80  * @GST_H264_PROFILE_EXTENDED: Extended profile (A.2.3)
81  * @GST_H264_PROFILE_HIGH: High profile (A.2.4),
82  * or Progressive High profile (A.2.4.1), or Constrained High profile (A.2.4.2)
83  * depending on constraint_set4_flag and constraint_set5_flag
84  * @GST_H264_PROFILE_HIGH10: High 10 profile (A.2.5) or High 10 Intra
85  *   profile (A.2.8), or Progressive High 10 profile (A.2.5.1) depending on
86  *   constraint_set3_flag and constraint_set4_flag
87  * @GST_H264_PROFILE_HIGH_422: High 4:2:2 profile (A.2.6) or High
88  *   4:2:2 Intra profile (A.2.9), depending on constraint_set3_flag
89  * @GST_H264_PROFILE_HIGH_444: High 4:4:4 Predictive profile (A.2.7)
90  *   or High 4:4:4 Intra profile (A.2.10), depending on the value of
91  *   constraint_set3_flag
92  * @GST_H264_PROFILE_MULTIVIEW_HIGH: Multiview High profile (H.10.1.1)
93  * @GST_H264_PROFILE_STEREO_HIGH: Stereo High profile (H.10.1.2)
94  * @GST_H264_PROFILE_SCALABLE_BASELINE: Scalable Baseline profile (G.10.1.1)
95  * @GST_H264_PROFILE_SCALABLE_HIGH: Scalable High profile (G.10.1.2)
96  *   or Scalable High Intra profile (G.10.1.3), depending on the value
97  *   of constraint_set3_flag
98  *
99  * H.264 Profiles.
100  *
101  * Since: 1.2
102  */
103 typedef enum {
104   GST_H264_PROFILE_BASELINE             = 66,
105   GST_H264_PROFILE_MAIN                 = 77,
106   GST_H264_PROFILE_EXTENDED             = 88,
107   GST_H264_PROFILE_HIGH                 = 100,
108   GST_H264_PROFILE_HIGH10               = 110,
109   GST_H264_PROFILE_HIGH_422             = 122,
110   GST_H264_PROFILE_HIGH_444             = 244,
111   GST_H264_PROFILE_MULTIVIEW_HIGH       = 118,
112   GST_H264_PROFILE_STEREO_HIGH          = 128,
113   GST_H264_PROFILE_SCALABLE_BASELINE    = 83,
114   GST_H264_PROFILE_SCALABLE_HIGH        = 86
115 } GstH264Profile;
116 
117 /**
118  * GstH264NalUnitType:
119  * @GST_H264_NAL_UNKNOWN: Unknown nal type
120  * @GST_H264_NAL_SLICE: Slice nal
121  * @GST_H264_NAL_SLICE_DPA: DPA slice nal
122  * @GST_H264_NAL_SLICE_DPB: DPB slice nal
123  * @GST_H264_NAL_SLICE_DPC: DPC slice nal
124  * @GST_H264_NAL_SLICE_IDR: DPR slice nal
125  * @GST_H264_NAL_SEI: Supplemental enhancement information (SEI) nal unit
126  * @GST_H264_NAL_SPS: Sequence parameter set (SPS) nal unit
127  * @GST_H264_NAL_PPS: Picture parameter set (PPS) nal unit
128  * @GST_H264_NAL_AU_DELIMITER: Access unit (AU) delimiter nal unit
129  * @GST_H264_NAL_SEQ_END: End of sequence nal unit
130  * @GST_H264_NAL_STREAM_END: End of stream nal unit
131  * @GST_H264_NAL_FILLER_DATA: Filler data nal lunit
132  * @GST_H264_NAL_SPS_EXT: Sequence parameter set (SPS) extension NAL unit
133  * @GST_H264_NAL_PREFIX_UNIT: Prefix NAL unit
134  * @GST_H264_NAL_SUBSET_SPS: Subset sequence parameter set (SSPS) NAL unit
135  * @GST_H264_NAL_DEPTH_SPS: Depth parameter set (DPS) NAL unit
136  * @GST_H264_NAL_SLICE_AUX: Auxiliary coded picture without partitioning NAL unit
137  * @GST_H264_NAL_SLICE_EXT: Coded slice extension NAL unit
138  * @GST_H264_NAL_SLICE_DEPTH: Coded slice extension for depth or 3D-AVC texture view
139  *
140  * Indicates the type of H264 Nal Units
141  */
142 typedef enum
143 {
144   GST_H264_NAL_UNKNOWN      = 0,
145   GST_H264_NAL_SLICE        = 1,
146   GST_H264_NAL_SLICE_DPA    = 2,
147   GST_H264_NAL_SLICE_DPB    = 3,
148   GST_H264_NAL_SLICE_DPC    = 4,
149   GST_H264_NAL_SLICE_IDR    = 5,
150   GST_H264_NAL_SEI          = 6,
151   GST_H264_NAL_SPS          = 7,
152   GST_H264_NAL_PPS          = 8,
153   GST_H264_NAL_AU_DELIMITER = 9,
154   GST_H264_NAL_SEQ_END      = 10,
155   GST_H264_NAL_STREAM_END   = 11,
156   GST_H264_NAL_FILLER_DATA  = 12,
157   GST_H264_NAL_SPS_EXT      = 13,
158   GST_H264_NAL_PREFIX_UNIT  = 14,
159   GST_H264_NAL_SUBSET_SPS   = 15,
160   GST_H264_NAL_DEPTH_SPS    = 16,
161   GST_H264_NAL_SLICE_AUX    = 19,
162   GST_H264_NAL_SLICE_EXT    = 20,
163   GST_H264_NAL_SLICE_DEPTH  = 21
164 } GstH264NalUnitType;
165 
166 /**
167  * GstH264NalUnitExtensionType:
168  * @GST_H264_NAL_EXTENSION_NONE: No NAL unit header extension is available
169  * @GST_H264_NAL_EXTENSION_SVC: NAL unit header extension for SVC (Annex G)
170  * @GST_H264_NAL_EXTENSION_MVC: NAL unit header extension for MVC (Annex H)
171  *
172  * Indicates the type of H.264 NAL unit extension.
173  *
174  * Since: 1.6
175  */
176 typedef enum
177 {
178   GST_H264_NAL_EXTENSION_NONE = 0,
179   GST_H264_NAL_EXTENSION_SVC,
180   GST_H264_NAL_EXTENSION_MVC,
181 } GstH264NalUnitExtensionType;
182 
183 /**
184  * GstH264ParserResult:
185  * @GST_H264_PARSER_OK: The parsing succeeded
186  * @GST_H264_PARSER_BROKEN_DATA: The data to parse is broken
187  * @GST_H264_PARSER_BROKEN_LINK: The link to structure needed for the parsing couldn't be found
188  * @GST_H264_PARSER_ERROR: An error occurred when parsing
189  * @GST_H264_PARSER_NO_NAL: No NAL unit found during the parsing
190  * @GST_H264_PARSER_NO_NAL_END: Start of the NAL unit found, but not the end.
191  *     This will be returned if no start/sync marker for the next NAL unit was
192  *     found. In this case the parser will assume that the end of the data is
193  *     also the end of the NAL unit. Whether this assumption is correct or not
194  *     depends on the context, which only the caller can know, which is why a
195  *     special result value is returned in this case. If the data is NAL-aligned
196  *     then #GST_H264_PARSER_NO_NAL_END can be treated just like
197  *     #GST_H264_PARSER_OK. If the data is not guaranteed to be NAL-aligned,
198  *     then the caller probably wants to collect more data until there's another
199  *     sync marker or the end of the stream has been reached.
200  *
201  * The result of parsing H264 data.
202  */
203 typedef enum
204 {
205   GST_H264_PARSER_OK,
206   GST_H264_PARSER_BROKEN_DATA,
207   GST_H264_PARSER_BROKEN_LINK,
208   GST_H264_PARSER_ERROR,
209   GST_H264_PARSER_NO_NAL,
210   GST_H264_PARSER_NO_NAL_END
211 } GstH264ParserResult;
212 
213 /**
214  * GstH264FramePackingType:
215  * @GST_H264_FRAME_PACKING_NONE: A complete 2D frame without any frame packing
216  * @GST_H264_FRAME_PACKING_CHECKERBOARD_INTERLEAVING: Checkerboard
217  *   based interleaving
218  * @GST_H264_FRAME_PACKING_COLUMN_INTERLEAVING: Column based interleaving
219  * @GST_H264_FRAME_PACKING_ROW_INTERLEAVING: Row based interleaving
220  * @GST_H264_FRAME_PACKING_SIDE_BY_SIDE: Side-by-side packing
221  * @GST_H264_FRMAE_PACKING_TOP_BOTTOM: Top-Bottom packing
222  * @GST_H264_FRAME_PACKING_TEMPORAL_INTERLEAVING: Temporal interleaving
223  *
224  * Frame packing arrangement types.
225  *
226  * Since: 1.6
227  */
228 typedef enum
229 {
230   GST_H264_FRAME_PACKING_NONE                           = 6,
231   GST_H264_FRAME_PACKING_CHECKERBOARD_INTERLEAVING      = 0,
232   GST_H264_FRAME_PACKING_COLUMN_INTERLEAVING            = 1,
233   GST_H264_FRAME_PACKING_ROW_INTERLEAVING               = 2,
234   GST_H264_FRAME_PACKING_SIDE_BY_SIDE                   = 3,
235   GST_H264_FRMAE_PACKING_TOP_BOTTOM                     = 4,
236   GST_H264_FRAME_PACKING_TEMPORAL_INTERLEAVING          = 5
237 } GstH264FramePackingType;
238 
239 /**
240  * GstH264SEIPayloadType:
241  * @GST_H264_SEI_BUF_PERIOD: Buffering Period SEI Message
242  * @GST_H264_SEI_PIC_TIMING: Picture Timing SEI Message
243  * @GST_H264_SEI_REGISTERED_USER_DATA: Registered user data (D.2.5)
244  * @GST_H264_SEI_RECOVERY_POINT: Recovery Point SEI Message (D.2.7)
245  * @GST_H264_SEI_STEREO_VIDEO_INFO: stereo video info SEI message (Since: 1.6)
246  * @GST_H264_SEI_FRAME_PACKING: Frame Packing Arrangement (FPA) message that
247  *     contains the 3D arrangement for stereoscopic 3D video (Since: 1.6)
248  * ...
249  *
250  * The type of SEI message.
251  */
252 typedef enum
253 {
254   GST_H264_SEI_BUF_PERIOD = 0,
255   GST_H264_SEI_PIC_TIMING = 1,
256   GST_H264_SEI_REGISTERED_USER_DATA = 4,
257   GST_H264_SEI_RECOVERY_POINT = 6,
258   GST_H264_SEI_STEREO_VIDEO_INFO = 21,
259   GST_H264_SEI_FRAME_PACKING = 45
260       /* and more...  */
261 } GstH264SEIPayloadType;
262 
263 /**
264  * GstH264SEIPicStructType:
265  * @GST_H264_SEI_PIC_STRUCT_FRAME: Picture is a frame
266  * @GST_H264_SEI_PIC_STRUCT_TOP_FIELD: Top field of frame
267  * @GST_H264_SEI_PIC_STRUCT_BOTTOM_FIELD: Bottom field of frame
268  * @GST_H264_SEI_PIC_STRUCT_TOP_BOTTOM: Top bottom field of frame
269  * @GST_H264_SEI_PIC_STRUCT_BOTTOM_TOP: bottom top field of frame
270  * @GST_H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP: top bottom top field of frame
271  * @GST_H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: bottom top bottom field of frame
272  * @GST_H264_SEI_PIC_STRUCT_FRAME_DOUBLING: indicates that the frame should
273  *  be displayed two times consecutively
274  * @GST_H264_SEI_PIC_STRUCT_FRAME_TRIPLING: indicates that the frame should be
275  *  displayed three times consecutively
276  *
277  * SEI pic_struct type
278  */
279 typedef enum
280 {
281   GST_H264_SEI_PIC_STRUCT_FRAME             = 0,
282   GST_H264_SEI_PIC_STRUCT_TOP_FIELD         = 1,
283   GST_H264_SEI_PIC_STRUCT_BOTTOM_FIELD      = 2,
284   GST_H264_SEI_PIC_STRUCT_TOP_BOTTOM        = 3,
285   GST_H264_SEI_PIC_STRUCT_BOTTOM_TOP        = 4,
286   GST_H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP    = 5,
287   GST_H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM = 6,
288   GST_H264_SEI_PIC_STRUCT_FRAME_DOUBLING    = 7,
289   GST_H264_SEI_PIC_STRUCT_FRAME_TRIPLING    = 8
290 } GstH264SEIPicStructType;
291 
292 /**
293  * GstH264SliceType:
294  *
295  * Type of Picture slice
296  */
297 
298 typedef enum
299 {
300   GST_H264_P_SLICE    = 0,
301   GST_H264_B_SLICE    = 1,
302   GST_H264_I_SLICE    = 2,
303   GST_H264_SP_SLICE   = 3,
304   GST_H264_SI_SLICE   = 4,
305   GST_H264_S_P_SLICE  = 5,
306   GST_H264_S_B_SLICE  = 6,
307   GST_H264_S_I_SLICE  = 7,
308   GST_H264_S_SP_SLICE = 8,
309   GST_H264_S_SI_SLICE = 9
310 } GstH264SliceType;
311 
312 /**
313  * GstH264CtType
314  *
315  * Mapping of ct_type to source picture scan
316  *
317  * Since: 1.16
318  */
319 
320 typedef enum
321 {
322   GST_H264_CT_TYPE_PROGRESSIVE = 0,
323   GST_H264_CT_TYPE_INTERLACED = 1,
324   GST_H264_CT_TYPE_UNKNOWN = 2,
325 } GstCtType;
326 
327 typedef struct _GstH264NalParser              GstH264NalParser;
328 
329 typedef struct _GstH264NalUnit                GstH264NalUnit;
330 typedef struct _GstH264NalUnitExtensionMVC    GstH264NalUnitExtensionMVC;
331 
332 typedef struct _GstH264SPSExtMVCView          GstH264SPSExtMVCView;
333 typedef struct _GstH264SPSExtMVCLevelValue    GstH264SPSExtMVCLevelValue;
334 typedef struct _GstH264SPSExtMVCLevelValueOp  GstH264SPSExtMVCLevelValueOp;
335 typedef struct _GstH264SPSExtMVC              GstH264SPSExtMVC;
336 
337 typedef struct _GstH264SPS                    GstH264SPS;
338 typedef struct _GstH264PPS                    GstH264PPS;
339 typedef struct _GstH264HRDParams              GstH264HRDParams;
340 typedef struct _GstH264VUIParams              GstH264VUIParams;
341 
342 typedef struct _GstH264RefPicListModification GstH264RefPicListModification;
343 typedef struct _GstH264DecRefPicMarking       GstH264DecRefPicMarking;
344 typedef struct _GstH264RefPicMarking          GstH264RefPicMarking;
345 typedef struct _GstH264PredWeightTable        GstH264PredWeightTable;
346 typedef struct _GstH264SliceHdr               GstH264SliceHdr;
347 
348 typedef struct _GstH264ClockTimestamp         GstH264ClockTimestamp;
349 typedef struct _GstH264PicTiming              GstH264PicTiming;
350 typedef struct _GstH264RegisteredUserData     GstH264RegisteredUserData;
351 typedef struct _GstH264BufferingPeriod        GstH264BufferingPeriod;
352 typedef struct _GstH264RecoveryPoint          GstH264RecoveryPoint;
353 typedef struct _GstH264StereoVideoInfo        GstH264StereoVideoInfo;
354 typedef struct _GstH264FramePacking           GstH264FramePacking;
355 typedef struct _GstH264SEIMessage             GstH264SEIMessage;
356 
357 /**
358  * GstH264NalUnitExtensionMVC:
359  * @non_idr_flag: If equal to 0, it specifies that the current access
360  *   unit is an IDR access unit
361  * @priority_id: The priority identifier for the NAL unit
362  * @view_id: The view identifier for the NAL unit
363  * @temporal_id: The temporal identifier for the NAL unit
364  * @anchor_pic_flag: If equal to 1, it specifies that the current
365  *   access unit is an anchor access unit
366  * @inter_view_flag: If equal to 0, it specifies that the current view
367  *   component is not used for inter-view prediction by any other view
368  *   component in the current access unit
369  *
370  * Since: 1.6
371  */
372 struct _GstH264NalUnitExtensionMVC
373 {
374   guint8 non_idr_flag;
375   guint8 priority_id;
376   guint16 view_id;
377   guint8 temporal_id;
378   guint8 anchor_pic_flag;
379   guint8 inter_view_flag;
380 };
381 
382 /**
383  * GstH264NalUnit:
384  * @ref_idc: not equal to 0 specifies that the content of the NAL unit
385  *  contains a sequence parameter set, a sequence parameter set
386  *  extension, a subset sequence parameter set, a picture parameter
387  *  set, a slice of a reference picture, a slice data partition of a
388  *  reference picture, or a prefix NAL unit preceding a slice of a
389  *  reference picture.
390  * @type: A #GstH264NalUnitType
391  * @idr_pic_flag: calculated idr_pic_flag
392  * @size: The size of the NAL unit starting from @offset, thus
393  *  including the header bytes. e.g. @type (nal_unit_type)
394  * @offset: The offset of the actual start of the NAL unit, thus
395  *  including the header bytes
396  * @sc_offset: The offset of the start code of the NAL unit
397  * @valid: If the NAL unit is valid, which means it has
398  * already been parsed
399  * @data: The data from which the NAL unit has been parsed
400  * @header_bytes: The size of the NALU header in bytes (Since: 1.6)
401  * @extension_type: the extension type (Since: 1.6)
402  *
403  * Structure defining the NAL unit headers
404  */
405 struct _GstH264NalUnit
406 {
407   guint16 ref_idc;
408   guint16 type;
409 
410   /* calculated values */
411   guint8 idr_pic_flag;
412   guint size;
413   guint offset;
414   guint sc_offset;
415   gboolean valid;
416 
417   guint8 *data;
418 
419   guint8 header_bytes;
420   guint8 extension_type;
421   union {
422     GstH264NalUnitExtensionMVC mvc;
423   } extension;
424 };
425 
426 /**
427  * GstH264HRDParams:
428  * @cpb_cnt_minus1: plus 1 specifies the number of alternative
429  *    CPB specifications in the bitstream
430  * @bit_rate_scale: specifies the maximum input bit rate of the
431  * SchedSelIdx-th CPB
432  * @cpb_size_scale: specifies the CPB size of the SchedSelIdx-th CPB
433  * @guint32 bit_rate_value_minus1: specifies the maximum input bit rate for the
434  * SchedSelIdx-th CPB
435  * @cpb_size_value_minus1: is used together with cpb_size_scale to specify the
436  * SchedSelIdx-th CPB size
437  * @cbr_flag: Specifies if running in constant or intermittent bit rate mode
438  * @initial_cpb_removal_delay_length_minus1: specifies the length in bits of
439  * the cpb_removal_delay syntax element
440  * @cpb_removal_delay_length_minus1: specifies the length in bits of the
441  * dpb_output_delay syntax element
442  * @dpb_output_delay_length_minus1: >0 specifies the length in bits of the time_offset syntax element.
443  * =0 specifies that the time_offset syntax element is not present
444  * @time_offset_length: Length of the time offset
445  *
446  * Defines the HRD parameters
447  */
448 struct _GstH264HRDParams
449 {
450   guint8 cpb_cnt_minus1;
451   guint8 bit_rate_scale;
452   guint8 cpb_size_scale;
453 
454   guint32 bit_rate_value_minus1[32];
455   guint32 cpb_size_value_minus1[32];
456   guint8 cbr_flag[32];
457 
458   guint8 initial_cpb_removal_delay_length_minus1;
459   guint8 cpb_removal_delay_length_minus1;
460   guint8 dpb_output_delay_length_minus1;
461   guint8 time_offset_length;
462 };
463 
464 /**
465  * GstH264VUIParams:
466  * @aspect_ratio_info_present_flag: %TRUE specifies that aspect_ratio_idc is present.
467  *  %FALSE specifies that aspect_ratio_idc is not present
468  * @aspect_ratio_idc specifies the value of the sample aspect ratio of the luma samples
469  * @sar_width indicates the horizontal size of the sample aspect ratio
470  * @sar_height indicates the vertical size of the sample aspect ratio
471  * @overscan_info_present_flag: %TRUE overscan_appropriate_flag is present %FALSE otherwise
472  * @overscan_appropriate_flag: %TRUE indicates that the cropped decoded pictures
473  *  output are suitable for display using overscan. %FALSE the cropped decoded pictures
474  *  output contain visually important information
475  * @video_signal_type_present_flag: %TRUE specifies that video_format, video_full_range_flag and
476  *  colour_description_present_flag are present.
477  * @video_format: indicates the representation of the picture
478  * @video_full_range_flag: indicates the black level and range of the luma and chroma signals
479  * @colour_description_present_flag: %TRUE specifies that colour_primaries,
480  *  transfer_characteristics and matrix_coefficients are present
481  * @colour_primaries: indicates the chromaticity coordinates of the source primaries
482  * @transfer_characteristics: indicates the opto-electronic transfer characteristic
483  * @matrix_coefficients: describes the matrix coefficients used in deriving luma and chroma signals
484  * @chroma_loc_info_present_flag: %TRUE specifies that chroma_sample_loc_type_top_field and
485  *  chroma_sample_loc_type_bottom_field are present, %FALSE otherwise
486  * @chroma_sample_loc_type_top_field: specify the location of chroma for top field
487  * @chroma_sample_loc_type_bottom_field specify the location of chroma for bottom field
488  * @timing_info_present_flag: %TRUE specifies that num_units_in_tick,
489  *  time_scale and fixed_frame_rate_flag are present in the bitstream
490  * @num_units_in_tick: is the number of time units of a clock operating at the frequency time_scale Hz
491  * time_scale: is the number of time units that pass in one second
492  * @fixed_frame_rate_flag: %TRUE indicates that the temporal distance between the HRD output times
493  *  of any two consecutive pictures in output order is constrained as specified in the spec, %FALSE
494  *  otherwise.
495  * @nal_hrd_parameters_present_flag: %TRUE if NAL HRD parameters exist in the bitstream
496  * @vcl_hrd_parameters_present_flag: %TRUE if VCL HRD parameters exist in the bitstream
497  * @low_delay_hrd_flag: specifies the HRD operational mode
498  * @pic_struct_present_flag: %TRUE specifies that picture timing SEI messages are present or not
499  * @bitstream_restriction_flag: %TRUE specifies that the following coded video sequence bitstream restriction
500  * parameters are present
501  * @motion_vectors_over_pic_boundaries_flag: %FALSE indicates that no sample outside the
502  *  picture boundaries and no sample at a fractional sample position, %TRUE indicates that one or more
503  *  samples outside picture boundaries may be used in inter prediction
504  * @max_bytes_per_pic_denom: indicates a number of bytes not exceeded by the sum of the sizes of
505  *  the VCL NAL units associated with any coded picture in the coded video sequence.
506  * @max_bits_per_mb_denom: indicates the maximum number of coded bits of macroblock_layer
507  * @log2_max_mv_length_horizontal: indicate the maximum absolute value of a decoded horizontal
508  * motion vector component
509  * @log2_max_mv_length_vertical: indicate the maximum absolute value of a decoded vertical
510  *  motion vector component
511  * @num_reorder_frames: indicates the maximum number of frames, complementary field pairs,
512  *  or non-paired fields that precede any frame,
513  * @max_dec_frame_buffering: specifies the required size of the HRD decoded picture buffer in
514  *  units of frame buffers.
515  *
516  * The structure representing the VUI parameters.
517  */
518 struct _GstH264VUIParams
519 {
520   guint8 aspect_ratio_info_present_flag;
521   guint8 aspect_ratio_idc;
522   /* if aspect_ratio_idc == 255 */
523   guint16 sar_width;
524   guint16 sar_height;
525 
526   guint8 overscan_info_present_flag;
527   /* if overscan_info_present_flag */
528   guint8 overscan_appropriate_flag;
529 
530   guint8 video_signal_type_present_flag;
531   guint8 video_format;
532   guint8 video_full_range_flag;
533   guint8 colour_description_present_flag;
534   guint8 colour_primaries;
535   guint8 transfer_characteristics;
536   guint8 matrix_coefficients;
537 
538   guint8 chroma_loc_info_present_flag;
539   guint8 chroma_sample_loc_type_top_field;
540   guint8 chroma_sample_loc_type_bottom_field;
541 
542   guint8 timing_info_present_flag;
543   /* if timing_info_present_flag */
544   guint32 num_units_in_tick;
545   guint32 time_scale;
546   guint8 fixed_frame_rate_flag;
547 
548   guint8 nal_hrd_parameters_present_flag;
549   /* if nal_hrd_parameters_present_flag */
550   GstH264HRDParams nal_hrd_parameters;
551 
552   guint8 vcl_hrd_parameters_present_flag;
553   /* if vcl_hrd_parameters_present_flag */
554   GstH264HRDParams vcl_hrd_parameters;
555 
556   guint8 low_delay_hrd_flag;
557   guint8 pic_struct_present_flag;
558 
559   guint8 bitstream_restriction_flag;
560   /*  if bitstream_restriction_flag */
561   guint8 motion_vectors_over_pic_boundaries_flag;
562   guint32 max_bytes_per_pic_denom;
563   guint32 max_bits_per_mb_denom;
564   guint32 log2_max_mv_length_horizontal;
565   guint32 log2_max_mv_length_vertical;
566   guint32 num_reorder_frames;
567   guint32 max_dec_frame_buffering;
568 
569   /* calculated values */
570   guint par_n;
571   guint par_d;
572 };
573 
574 /**
575  * GstH264SPSExtMVCView:
576  * @num_anchor_refs_l0: specifies the number of view components for
577  *   inter-view prediction in the initialized RefPicList0 in decoding
578  *   anchor view components.
579  * @anchor_ref_l0: specifies the view_id for inter-view prediction in
580  *   the initialized RefPicList0 in decoding anchor view components.
581  * @num_anchor_refs_l1: specifies the number of view components for
582  *   inter-view prediction in the initialized RefPicList1 in decoding
583  *   anchor view components.
584  * @anchor_ref_l1: specifies the view_id for inter-view prediction in
585  *   the initialized RefPicList1 in decoding anchor view components.
586  * @num_non_anchor_refs_l0: specifies the number of view components
587  *   for inter-view prediction in the initialized RefPicList0 in
588  *   decoding non-anchor view components.
589  * @non_anchor_ref_l0: specifies the view_id for inter-view prediction
590  *   in the initialized RefPicList0 in decoding non-anchor view
591  *   components.
592  * @num_non_anchor_refs_l1: specifies the number of view components
593  *   for inter-view prediction in the initialized RefPicList1 in
594  *   decoding non-anchor view components.
595  * @non_anchor_ref_l1: specifies the view_id for inter-view prediction
596  *   in the initialized RefPicList1 in decoding non-anchor view
597  *   components.
598  *
599  * Represents inter-view dependency relationships for the coded video
600  * sequence.
601  *
602  * Since: 1.6
603  */
604 struct _GstH264SPSExtMVCView
605 {
606   guint16 view_id;
607   guint8 num_anchor_refs_l0;
608   guint16 anchor_ref_l0[15];
609   guint8 num_anchor_refs_l1;
610   guint16 anchor_ref_l1[15];
611   guint8 num_non_anchor_refs_l0;
612   guint16 non_anchor_ref_l0[15];
613   guint8 num_non_anchor_refs_l1;
614   guint16 non_anchor_ref_l1[15];
615 };
616 
617 /**
618  * GstH264SPSExtMVCLevelValueOp:
619  *
620  * Represents an operation point for the coded video sequence.
621  *
622  * Since: 1.6
623  */
624 struct _GstH264SPSExtMVCLevelValueOp
625 {
626   guint8 temporal_id;
627   guint16 num_target_views_minus1;
628   guint16 *target_view_id;
629   guint16 num_views_minus1;
630 };
631 
632 /**
633  * GstH264SPSExtMVCLevelValue:
634  * @level_idc: specifies the level value signalled for the coded video
635  *   sequence
636  * @num_applicable_ops_minus1: plus 1 specifies the number of
637  *   operation points to which the level indicated by level_idc applies
638  * @applicable_op: specifies the applicable operation point
639  *
640  * Represents level values for a subset of the operation points for
641  * the coded video sequence.
642  *
643  * Since: 1.6
644  */
645 struct _GstH264SPSExtMVCLevelValue
646 {
647   guint8 level_idc;
648   guint16 num_applicable_ops_minus1;
649   GstH264SPSExtMVCLevelValueOp *applicable_op;
650 };
651 
652 /**
653  * GstH264SPSExtMVC:
654  * @num_views_minus1: plus 1 specifies the maximum number of coded
655  *   views in the coded video sequence
656  * @view: array of #GstH264SPSExtMVCView
657  * @num_level_values_signalled_minus1: plus 1 specifies the number of
658  *   level values signalled for the coded video sequence.
659  * @level_value: array of #GstH264SPSExtMVCLevelValue
660  *
661  * Represents the parsed seq_parameter_set_mvc_extension().
662  *
663  * Since: 1.6
664 	 */
665 struct _GstH264SPSExtMVC
666 {
667   guint16 num_views_minus1;
668   GstH264SPSExtMVCView *view;
669   guint8 num_level_values_signalled_minus1;
670   GstH264SPSExtMVCLevelValue *level_value;
671 };
672 
673 /**
674  * GstH264SPS:
675  * @id: The ID of the sequence parameter set
676  * @profile_idc: indicate the profile to which the coded video sequence conforms
677  *
678  * H264 Sequence Parameter Set (SPS)
679  */
680 struct _GstH264SPS
681 {
682   gint id;
683 
684   guint8 profile_idc;
685   guint8 constraint_set0_flag;
686   guint8 constraint_set1_flag;
687   guint8 constraint_set2_flag;
688   guint8 constraint_set3_flag;
689   guint8 constraint_set4_flag;
690   guint8 constraint_set5_flag;
691   guint8 level_idc;
692 
693   guint8 chroma_format_idc;
694   guint8 separate_colour_plane_flag;
695   guint8 bit_depth_luma_minus8;
696   guint8 bit_depth_chroma_minus8;
697   guint8 qpprime_y_zero_transform_bypass_flag;
698 
699   guint8 scaling_matrix_present_flag;
700   guint8 scaling_lists_4x4[6][16];
701   guint8 scaling_lists_8x8[6][64];
702 
703   guint8 log2_max_frame_num_minus4;
704   guint8 pic_order_cnt_type;
705 
706   /* if pic_order_cnt_type == 0 */
707   guint8 log2_max_pic_order_cnt_lsb_minus4;
708 
709   /* else if pic_order_cnt_type == 1 */
710   guint8 delta_pic_order_always_zero_flag;
711   gint32 offset_for_non_ref_pic;
712   gint32 offset_for_top_to_bottom_field;
713   guint8 num_ref_frames_in_pic_order_cnt_cycle;
714   gint32 offset_for_ref_frame[255];
715 
716   guint32 num_ref_frames;
717   guint8 gaps_in_frame_num_value_allowed_flag;
718   guint32 pic_width_in_mbs_minus1;
719   guint32 pic_height_in_map_units_minus1;
720   guint8 frame_mbs_only_flag;
721 
722   guint8 mb_adaptive_frame_field_flag;
723 
724   guint8 direct_8x8_inference_flag;
725 
726   guint8 frame_cropping_flag;
727 
728   /* if frame_cropping_flag */
729   guint32 frame_crop_left_offset;
730   guint32 frame_crop_right_offset;
731   guint32 frame_crop_top_offset;
732   guint32 frame_crop_bottom_offset;
733 
734   guint8 vui_parameters_present_flag;
735   /* if vui_parameters_present_flag */
736   GstH264VUIParams vui_parameters;
737 
738   /* calculated values */
739   guint8 chroma_array_type;
740   guint32 max_frame_num;
741   gint width, height;
742   gint crop_rect_width, crop_rect_height;
743   gint crop_rect_x, crop_rect_y;
744   gint fps_num_removed, fps_den_removed; /* FIXME: remove */
745   gboolean valid;
746 
747   /* Subset SPS extensions */
748   guint8 extension_type;
749   union {
750     GstH264SPSExtMVC mvc;
751   } extension;
752 };
753 
754 /**
755  * GstH264PPS:
756  *
757  * H264 Picture Parameter Set
758  */
759 struct _GstH264PPS
760 {
761   gint id;
762 
763   GstH264SPS *sequence;
764 
765   guint8 entropy_coding_mode_flag;
766   guint8 pic_order_present_flag;
767 
768   guint32 num_slice_groups_minus1;
769 
770   /* if num_slice_groups_minus1 > 0 */
771   guint8 slice_group_map_type;
772   /* and if slice_group_map_type == 0 */
773   guint32 run_length_minus1[8];
774   /* or if slice_group_map_type == 2 */
775   guint32 top_left[8];
776   guint32 bottom_right[8];
777   /* or if slice_group_map_type == (3, 4, 5) */
778   guint8 slice_group_change_direction_flag;
779   guint32 slice_group_change_rate_minus1;
780   /* or if slice_group_map_type == 6 */
781   guint32 pic_size_in_map_units_minus1;
782   guint8 *slice_group_id;
783 
784   guint8 num_ref_idx_l0_active_minus1;
785   guint8 num_ref_idx_l1_active_minus1;
786   guint8 weighted_pred_flag;
787   guint8 weighted_bipred_idc;
788   gint8 pic_init_qp_minus26;
789   gint8 pic_init_qs_minus26;
790   gint8 chroma_qp_index_offset;
791   guint8 deblocking_filter_control_present_flag;
792   guint8 constrained_intra_pred_flag;
793   guint8 redundant_pic_cnt_present_flag;
794 
795   guint8 transform_8x8_mode_flag;
796 
797   guint8 scaling_lists_4x4[6][16];
798   guint8 scaling_lists_8x8[6][64];
799 
800   guint8 second_chroma_qp_index_offset;
801 
802   gboolean valid;
803 };
804 
805 struct _GstH264RefPicListModification
806 {
807   guint8 modification_of_pic_nums_idc;
808   union
809   {
810     /* if modification_of_pic_nums_idc == 0 || 1 */
811     guint32 abs_diff_pic_num_minus1;
812     /* if modification_of_pic_nums_idc == 2 */
813     guint32 long_term_pic_num;
814     /* if modification_of_pic_nums_idc == 4 || 5 */
815     guint32 abs_diff_view_idx_minus1;
816   } value;
817 };
818 
819 struct _GstH264PredWeightTable
820 {
821   guint8 luma_log2_weight_denom;
822   guint8 chroma_log2_weight_denom;
823 
824   gint16 luma_weight_l0[32];
825   gint8 luma_offset_l0[32];
826 
827   /* if seq->ChromaArrayType != 0 */
828   gint16 chroma_weight_l0[32][2];
829   gint8 chroma_offset_l0[32][2];
830 
831   /* if slice->slice_type % 5 == 1 */
832   gint16 luma_weight_l1[32];
833   gint8 luma_offset_l1[32];
834 
835   /* and if seq->ChromaArrayType != 0 */
836   gint16 chroma_weight_l1[32][2];
837   gint8 chroma_offset_l1[32][2];
838 };
839 
840 struct _GstH264RefPicMarking
841 {
842   guint8 memory_management_control_operation;
843 
844   guint32 difference_of_pic_nums_minus1;
845   guint32 long_term_pic_num;
846   guint32 long_term_frame_idx;
847   guint32 max_long_term_frame_idx_plus1;
848 };
849 
850 struct _GstH264DecRefPicMarking
851 {
852   /* if slice->nal_unit.IdrPicFlag */
853   guint8 no_output_of_prior_pics_flag;
854   guint8 long_term_reference_flag;
855 
856   guint8 adaptive_ref_pic_marking_mode_flag;
857   GstH264RefPicMarking ref_pic_marking[10];
858   guint8 n_ref_pic_marking;
859 };
860 
861 
862 struct _GstH264SliceHdr
863 {
864   guint32 first_mb_in_slice;
865   guint32 type;
866   GstH264PPS *pps;
867 
868   /* if seq->separate_colour_plane_flag */
869   guint8 colour_plane_id;
870 
871   guint16 frame_num;
872 
873   guint8 field_pic_flag;
874   guint8 bottom_field_flag;
875 
876   /* if nal_unit.type == 5 */
877   guint16 idr_pic_id;
878 
879   /* if seq->pic_order_cnt_type == 0 */
880   guint16 pic_order_cnt_lsb;
881   /* if seq->pic_order_present_flag && !field_pic_flag */
882   gint32 delta_pic_order_cnt_bottom;
883 
884   gint32 delta_pic_order_cnt[2];
885   guint8 redundant_pic_cnt;
886 
887   /* if slice_type == B_SLICE */
888   guint8 direct_spatial_mv_pred_flag;
889 
890   guint8 num_ref_idx_l0_active_minus1;
891   guint8 num_ref_idx_l1_active_minus1;
892 
893   guint8 ref_pic_list_modification_flag_l0;
894   guint8 n_ref_pic_list_modification_l0;
895   GstH264RefPicListModification ref_pic_list_modification_l0[32];
896   guint8 ref_pic_list_modification_flag_l1;
897   guint8 n_ref_pic_list_modification_l1;
898   GstH264RefPicListModification ref_pic_list_modification_l1[32];
899 
900   GstH264PredWeightTable pred_weight_table;
901   /* if nal_unit.ref_idc != 0 */
902   GstH264DecRefPicMarking dec_ref_pic_marking;
903 
904   guint8 cabac_init_idc;
905   gint8 slice_qp_delta;
906   gint8 slice_qs_delta;
907 
908   guint8 disable_deblocking_filter_idc;
909   gint8 slice_alpha_c0_offset_div2;
910   gint8 slice_beta_offset_div2;
911 
912   guint16 slice_group_change_cycle;
913 
914   /* calculated values */
915   guint32 max_pic_num;
916   gboolean valid;
917 
918   /* Size of the slice_header() in bits */
919   guint header_size;
920 
921   /* Number of emulation prevention bytes (EPB) in this slice_header() */
922   guint n_emulation_prevention_bytes;
923 };
924 
925 
926 struct _GstH264ClockTimestamp
927 {
928   guint8 ct_type;
929   guint8 nuit_field_based_flag;
930   guint8 counting_type;
931   guint8 discontinuity_flag;
932   guint8 cnt_dropped_flag;
933   guint8 n_frames;
934 
935   guint8 seconds_flag;
936   guint8 seconds_value;
937 
938   guint8 minutes_flag;
939   guint8 minutes_value;
940 
941   guint8 hours_flag;
942   guint8 hours_value;
943 
944   guint32 time_offset;
945 };
946 
947 /**
948  * GstH264FramePacking:
949  *
950  * Since: 1.6
951  */
952 struct _GstH264FramePacking
953 {
954   guint32 frame_packing_id;
955   guint8 frame_packing_cancel_flag;
956   guint8 frame_packing_type; /* GstH264FramePackingType */
957   guint8 quincunx_sampling_flag;
958   guint8 content_interpretation_type;
959   guint8 spatial_flipping_flag;
960   guint8 frame0_flipped_flag;
961   guint8 field_views_flag;
962   guint8 current_frame_is_frame0_flag;
963   guint8 frame0_self_contained_flag;
964   guint8 frame1_self_contained_flag;
965   guint8 frame0_grid_position_x;
966   guint8 frame0_grid_position_y;
967   guint8 frame1_grid_position_x;
968   guint8 frame1_grid_position_y;
969   guint16 frame_packing_repetition_period;
970 };
971 
972 /**
973  * GstH264StereoVideoInfo:
974  *
975  * Since: 1.6
976  */
977 struct _GstH264StereoVideoInfo
978 {
979   guint8 field_views_flag;
980   guint8 top_field_is_left_view_flag;
981   guint8 current_frame_is_left_view_flag;
982   guint8 next_frame_is_second_view_flag;
983   guint8 left_view_self_contained_flag;
984   guint8 right_view_self_contained_flag;
985 };
986 
987 struct _GstH264PicTiming
988 {
989   guint32 cpb_removal_delay;
990   guint32 dpb_output_delay;
991 
992   guint8 pic_struct_present_flag;
993   /* if pic_struct_present_flag */
994   guint8 pic_struct;
995 
996   guint8 clock_timestamp_flag[3];
997   GstH264ClockTimestamp clock_timestamp[3];
998 };
999 
1000 struct _GstH264RegisteredUserData
1001 {
1002   guint8 country_code;
1003   guint8 country_code_extension;
1004   const guint8 *data;
1005   guint size;
1006 };
1007 
1008 struct _GstH264BufferingPeriod
1009 {
1010   GstH264SPS *sps;
1011 
1012   /* seq->vui_parameters->nal_hrd_parameters_present_flag */
1013   guint32 nal_initial_cpb_removal_delay[32];
1014   guint32 nal_initial_cpb_removal_delay_offset[32];
1015 
1016   /* seq->vui_parameters->vcl_hrd_parameters_present_flag */
1017   guint32 vcl_initial_cpb_removal_delay[32];
1018   guint32 vcl_initial_cpb_removal_delay_offset[32];
1019 };
1020 
1021 struct _GstH264RecoveryPoint
1022 {
1023   guint32 recovery_frame_cnt;
1024   guint8 exact_match_flag;
1025   guint8 broken_link_flag;
1026   guint8 changing_slice_group_idc;
1027 };
1028 
1029 struct _GstH264SEIMessage
1030 {
1031   GstH264SEIPayloadType payloadType;
1032 
1033   union {
1034     GstH264BufferingPeriod buffering_period;
1035     GstH264PicTiming pic_timing;
1036     GstH264RegisteredUserData registered_user_data;
1037     GstH264RecoveryPoint recovery_point;
1038     GstH264StereoVideoInfo stereo_video_info;
1039     GstH264FramePacking frame_packing;
1040     /* ... could implement more */
1041   } payload;
1042 };
1043 
1044 /**
1045  * GstH264NalParser:
1046  *
1047  * H264 NAL Parser (opaque structure).
1048  */
1049 struct _GstH264NalParser
1050 {
1051   /*< private >*/
1052   GstH264SPS sps[GST_H264_MAX_SPS_COUNT];
1053   GstH264PPS pps[GST_H264_MAX_PPS_COUNT];
1054   GstH264SPS *last_sps;
1055   GstH264PPS *last_pps;
1056 };
1057 
1058 GST_CODEC_PARSERS_API
1059 GstH264NalParser *gst_h264_nal_parser_new             (void);
1060 
1061 GST_CODEC_PARSERS_API
1062 GstH264ParserResult gst_h264_parser_identify_nalu     (GstH264NalParser *nalparser,
1063                                                        const guint8 *data, guint offset,
1064                                                        gsize size, GstH264NalUnit *nalu);
1065 
1066 GST_CODEC_PARSERS_API
1067 GstH264ParserResult gst_h264_parser_identify_nalu_unchecked (GstH264NalParser *nalparser,
1068                                                        const guint8 *data, guint offset,
1069                                                        gsize size, GstH264NalUnit *nalu);
1070 
1071 GST_CODEC_PARSERS_API
1072 GstH264ParserResult gst_h264_parser_identify_nalu_avc (GstH264NalParser *nalparser, const guint8 *data,
1073                                                        guint offset, gsize size, guint8 nal_length_size,
1074                                                        GstH264NalUnit *nalu);
1075 
1076 GST_CODEC_PARSERS_API
1077 GstH264ParserResult gst_h264_parser_parse_nal         (GstH264NalParser *nalparser,
1078                                                        GstH264NalUnit *nalu);
1079 
1080 GST_CODEC_PARSERS_API
1081 GstH264ParserResult gst_h264_parser_parse_slice_hdr   (GstH264NalParser *nalparser, GstH264NalUnit *nalu,
1082                                                        GstH264SliceHdr *slice, gboolean parse_pred_weight_table,
1083                                                        gboolean parse_dec_ref_pic_marking);
1084 
1085 GST_CODEC_PARSERS_API
1086 GstH264ParserResult gst_h264_parser_parse_subset_sps  (GstH264NalParser *nalparser, GstH264NalUnit *nalu,
1087                                                        GstH264SPS *sps, gboolean parse_vui_params);
1088 
1089 GST_CODEC_PARSERS_API
1090 GstH264ParserResult gst_h264_parser_parse_sps         (GstH264NalParser *nalparser, GstH264NalUnit *nalu,
1091                                                        GstH264SPS *sps, gboolean parse_vui_params);
1092 
1093 GST_CODEC_PARSERS_API
1094 GstH264ParserResult gst_h264_parser_parse_pps         (GstH264NalParser *nalparser,
1095                                                        GstH264NalUnit *nalu, GstH264PPS *pps);
1096 
1097 GST_CODEC_PARSERS_API
1098 GstH264ParserResult gst_h264_parser_parse_sei         (GstH264NalParser *nalparser,
1099                                                        GstH264NalUnit *nalu, GArray ** messages);
1100 
1101 GST_CODEC_PARSERS_API
1102 void gst_h264_nal_parser_free                         (GstH264NalParser *nalparser);
1103 
1104 GST_CODEC_PARSERS_API
1105 GstH264ParserResult gst_h264_parse_subset_sps         (GstH264NalUnit *nalu,
1106                                                        GstH264SPS *sps, gboolean parse_vui_params);
1107 
1108 GST_CODEC_PARSERS_API
1109 GstH264ParserResult gst_h264_parse_sps                (GstH264NalUnit *nalu,
1110                                                        GstH264SPS *sps, gboolean parse_vui_params);
1111 
1112 GST_CODEC_PARSERS_API
1113 GstH264ParserResult gst_h264_parse_pps                (GstH264NalParser *nalparser,
1114                                                        GstH264NalUnit *nalu, GstH264PPS *pps);
1115 
1116 GST_CODEC_PARSERS_API
1117 void                gst_h264_sps_clear                (GstH264SPS *sps);
1118 
1119 GST_CODEC_PARSERS_API
1120 void                gst_h264_pps_clear                (GstH264PPS *pps);
1121 
1122 GST_CODEC_PARSERS_API
1123 void    gst_h264_quant_matrix_8x8_get_zigzag_from_raster (guint8 out_quant[64],
1124                                                           const guint8 quant[64]);
1125 
1126 GST_CODEC_PARSERS_API
1127 void    gst_h264_quant_matrix_8x8_get_raster_from_zigzag (guint8 out_quant[64],
1128                                                           const guint8 quant[64]);
1129 
1130 GST_CODEC_PARSERS_API
1131 void    gst_h264_quant_matrix_4x4_get_zigzag_from_raster (guint8 out_quant[16],
1132                                                           const guint8 quant[16]);
1133 
1134 GST_CODEC_PARSERS_API
1135 void    gst_h264_quant_matrix_4x4_get_raster_from_zigzag (guint8 out_quant[16],
1136                                                           const guint8 quant[16]);
1137 
1138 GST_CODEC_PARSERS_API
1139 void gst_h264_video_calculate_framerate (const GstH264SPS * sps, guint field_pic_flag,
1140     guint pic_struct, gint * fps_num, gint * fps_den);
1141 
1142 G_END_DECLS
1143 
1144 #endif
1145