codecparsers: h264: fix typo in GstH264VUIParams description.
[vaapi:gstreamer-codecparsers.git] / gst-libs / gst / codecparsers / gsth264parser.h
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
40 G_BEGIN_DECLS
41
42 #define GST_H264_MAX_SPS_COUNT   32
43 #define GST_H264_MAX_PPS_COUNT   256
44
45 #define GST_H264_IS_P_SLICE(slice)  (((slice)->type % 5) == GST_H264_P_SLICE)
46 #define GST_H264_IS_B_SLICE(slice)  (((slice)->type % 5) == GST_H264_B_SLICE)
47 #define GST_H264_IS_I_SLICE(slice)  (((slice)->type % 5) == GST_H264_I_SLICE)
48 #define GST_H264_IS_SP_SLICE(slice) (((slice)->type % 5) == GST_H264_SP_SLICE)
49 #define GST_H264_IS_SI_SLICE(slice) (((slice)->type % 5) == GST_H264_SI_SLICE)
50
51 /**
52  * GstH264Profile:
53  * @GST_H264_PROFILE_BASELINE: Baseline profile (A.2.1)
54  * @GST_H264_PROFILE_MAIN: Main profile (A.2.2)
55  * @GST_H264_PROFILE_EXTENDED: Extended profile (A.2.3)
56  * @GST_H264_PROFILE_HIGH: High profile (A.2.4)
57  * @GST_H264_PROFILE_HIGH10: High 10 profile (A.2.5) or High 10 Intra
58  *   profile (A.2.8), depending on constraint_set3_flag
59  * @GST_H264_PROFILE_HIGH_422: High 4:2:2 profile (A.2.6) or High
60  *   4:2:2 Intra profile (A.2.9), depending on constraint_set3_flag
61  * @GST_H264_PROFILE_HIGH_444: High 4:4:4 Predictive profile (A.2.7)
62  *   or High 4:4:4 Intra profile (A.2.10), depending on the value of
63  *   constraint_set3_flag
64  * @GST_H264_PROFILE_MULTIVIEW_HIGH: Multiview High profile (H.10.1.1)
65  * @GST_H264_PROFILE_STEREO_HIGH: Stereo High profile (H.10.1.2)
66  * @GST_H264_PROFILE_SCALABLE_BASELINE: Scalable Baseline profile (G.10.1.1)
67  * @GST_H264_PROFILE_SCALABLE_HIGH: Scalable High profile (G.10.1.2)
68  *   or Scalable High Intra profile (G.10.1.3), depending on the value
69  *   of constraint_set3_flag
70  *
71  * H.264 Profiles.
72  *
73  * Since: 1.2
74  */
75 typedef enum {
76   GST_H264_PROFILE_BASELINE             = 66,
77   GST_H264_PROFILE_MAIN                 = 77,
78   GST_H264_PROFILE_EXTENDED             = 88,
79   GST_H264_PROFILE_HIGH                 = 100,
80   GST_H264_PROFILE_HIGH10               = 110,
81   GST_H264_PROFILE_HIGH_422             = 122,
82   GST_H264_PROFILE_HIGH_444             = 244,
83   GST_H264_PROFILE_MULTIVIEW_HIGH       = 118,
84   GST_H264_PROFILE_STEREO_HIGH          = 128,
85   GST_H264_PROFILE_SCALABLE_BASELINE    = 83,
86   GST_H264_PROFILE_SCALABLE_HIGH        = 86
87 } GstH264Profile;
88
89 /**
90  * GstH264NalUnitType:
91  * @GST_H264_NAL_UNKNOWN: Unknown nal type
92  * @GST_H264_NAL_SLICE: Slice nal
93  * @GST_H264_NAL_SLICE_DPA: DPA slice nal
94  * @GST_H264_NAL_SLICE_DPB: DPB slice nal
95  * @GST_H264_NAL_SLICE_DPC: DPC slice nal
96  * @GST_H264_NAL_SLICE_IDR: DPR slice nal
97  * @GST_H264_NAL_SEI: Supplemental enhancement information (SEI) nal unit
98  * @GST_H264_NAL_SPS: Sequence parameter set (SPS) nal unit
99  * @GST_H264_NAL_PPS: Picture parameter set (PPS) nal unit
100  * @GST_H264_NAL_AU_DELIMITER: Access unit (AU) delimiter nal unit
101  * @GST_H264_NAL_SEQ_END: End of sequence nal unit
102  * @GST_H264_NAL_STREAM_END: End of stream nal unit
103  * @GST_H264_NAL_FILLER_DATA: Filler data nal lunit
104  * @GST_H264_NAL_SPS_EXT: Sequence parameter set (SPS) extension NAL unit
105  * @GST_H264_NAL_PREFIX_UNIT: Prefix NAL unit
106  * @GST_H264_NAL_SUBSET_SPS: Subset sequence parameter set (SPS) NAL unit
107  * @GST_H264_NAL_SLICE_AUX: Auxiliary coded picture without partitioning NAL unit
108  * @GST_H264_NAL_SLICE_EXT: Coded slice extension NAL unit
109  *
110  * Indicates the type of H264 Nal Units
111  */
112 typedef enum
113 {
114   GST_H264_NAL_UNKNOWN      = 0,
115   GST_H264_NAL_SLICE        = 1,
116   GST_H264_NAL_SLICE_DPA    = 2,
117   GST_H264_NAL_SLICE_DPB    = 3,
118   GST_H264_NAL_SLICE_DPC    = 4,
119   GST_H264_NAL_SLICE_IDR    = 5,
120   GST_H264_NAL_SEI          = 6,
121   GST_H264_NAL_SPS          = 7,
122   GST_H264_NAL_PPS          = 8,
123   GST_H264_NAL_AU_DELIMITER = 9,
124   GST_H264_NAL_SEQ_END      = 10,
125   GST_H264_NAL_STREAM_END   = 11,
126   GST_H264_NAL_FILLER_DATA  = 12,
127   GST_H264_NAL_SPS_EXT      = 13,
128   GST_H264_NAL_PREFIX_UNIT  = 14,
129   GST_H264_NAL_SUBSET_SPS   = 15,
130   GST_H264_NAL_SLICE_AUX    = 19,
131   GST_H264_NAL_SLICE_EXT    = 20
132 } GstH264NalUnitType;
133
134 /**
135  * GstH264ParserResult:
136  * @GST_H264_PARSER_OK: The parsing succeded
137  * @GST_H264_PARSER_BROKEN_DATA: The data to parse is broken
138  * @GST_H264_PARSER_BROKEN_LINK: The link to structure needed for the parsing couldn't be found
139  * @GST_H264_PARSER_ERROR: An error accured when parsing
140  * @GST_H264_PARSER_NO_NAL: No nal found during the parsing
141  * @GST_H264_PARSER_NO_NAL_END: Start of the nal found, but not the end.
142  *
143  * The result of parsing H264 data.
144  */
145 typedef enum
146 {
147   GST_H264_PARSER_OK,
148   GST_H264_PARSER_BROKEN_DATA,
149   GST_H264_PARSER_BROKEN_LINK,
150   GST_H264_PARSER_ERROR,
151   GST_H264_PARSER_NO_NAL,
152   GST_H264_PARSER_NO_NAL_END
153 } GstH264ParserResult;
154
155 /**
156  * GstH264SEIPayloadType:
157  * @GST_H264_SEI_BUF_PERIOD: Buffering Period SEI Message
158  * @GST_H264_SEI_PIC_TIMING: Picture Timing SEI Message
159  * @GST_H264_SEI_RECOVERY_POINT: Recovery Point SEI Message (D.2.7)
160  * ...
161  *
162  * The type of SEI message.
163  */
164 typedef enum
165 {
166   GST_H264_SEI_BUF_PERIOD = 0,
167   GST_H264_SEI_PIC_TIMING = 1,
168   GST_H264_SEI_RECOVERY_POINT = 6,
169       /* and more...  */
170 } GstH264SEIPayloadType;
171
172 /**
173  * GstH264SEIPicStructType:
174  * @GST_H264_SEI_PIC_STRUCT_FRAME: Picture is a frame
175  * @GST_H264_SEI_PIC_STRUCT_TOP_FIELD: Top field of frame
176  * @GST_H264_SEI_PIC_STRUCT_BOTTOM_FIELD: Botom field of frame
177  * @GST_H264_SEI_PIC_STRUCT_TOP_BOTTOM: Top bottom field of frame
178  * @GST_H264_SEI_PIC_STRUCT_BOTTOM_TOP: bottom top field of frame
179  * @GST_H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP: top bottom top field of frame
180  * @GST_H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: bottom top bottom field of frame
181  * @GST_H264_SEI_PIC_STRUCT_FRAME_DOUBLING: indicates that the frame should
182  *  be displayed two times consecutively
183  * @GST_H264_SEI_PIC_STRUCT_FRAME_TRIPLING: indicates that the frame should be
184  *  displayed three times consecutively
185  *
186  * SEI pic_struct type
187  */
188 typedef enum
189 {
190   GST_H264_SEI_PIC_STRUCT_FRAME             = 0,
191   GST_H264_SEI_PIC_STRUCT_TOP_FIELD         = 1,
192   GST_H264_SEI_PIC_STRUCT_BOTTOM_FIELD      = 2,
193   GST_H264_SEI_PIC_STRUCT_TOP_BOTTOM        = 3,
194   GST_H264_SEI_PIC_STRUCT_BOTTOM_TOP        = 4,
195   GST_H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP    = 5,
196   GST_H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM = 6,
197   GST_H264_SEI_PIC_STRUCT_FRAME_DOUBLING    = 7,
198   GST_H264_SEI_PIC_STRUCT_FRAME_TRIPLING    = 8
199 } GstH264SEIPicStructType;
200
201 /**
202  * GstH264SliceType:
203  *
204  * Type of Picture slice
205  */
206
207 typedef enum
208 {
209   GST_H264_P_SLICE    = 0,
210   GST_H264_B_SLICE    = 1,
211   GST_H264_I_SLICE    = 2,
212   GST_H264_SP_SLICE   = 3,
213   GST_H264_SI_SLICE   = 4,
214   GST_H264_S_P_SLICE  = 5,
215   GST_H264_S_B_SLICE  = 6,
216   GST_H264_S_I_SLICE  = 7,
217   GST_H264_S_SP_SLICE = 8,
218   GST_H264_S_SI_SLICE = 9
219 } GstH264SliceType;
220
221 typedef struct _GstH264NalParser              GstH264NalParser;
222
223 typedef struct _GstH264NalUnit                GstH264NalUnit;
224
225 typedef struct _GstH264SPS                    GstH264SPS;
226 typedef struct _GstH264PPS                    GstH264PPS;
227 typedef struct _GstH264HRDParams              GstH264HRDParams;
228 typedef struct _GstH264VUIParams              GstH264VUIParams;
229
230 typedef struct _GstH264RefPicListModification GstH264RefPicListModification;
231 typedef struct _GstH264DecRefPicMarking       GstH264DecRefPicMarking;
232 typedef struct _GstH264RefPicMarking          GstH264RefPicMarking;
233 typedef struct _GstH264PredWeightTable        GstH264PredWeightTable;
234 typedef struct _GstH264SliceHdr               GstH264SliceHdr;
235
236 typedef struct _GstH264ClockTimestamp         GstH264ClockTimestamp;
237 typedef struct _GstH264PicTiming              GstH264PicTiming;
238 typedef struct _GstH264BufferingPeriod        GstH264BufferingPeriod;
239 typedef struct _GstH264RecoveryPoint          GstH264RecoveryPoint;
240 typedef struct _GstH264SEIMessage             GstH264SEIMessage;
241
242 /**
243  * GstH264NalUnit:
244  * @ref_idc: not equal to 0 specifies that the content of the NAL unit contains a sequence
245  *  parameter set, a sequence * parameter set extension, a subset sequence parameter set, a
246  *  picture parameter set, a slice of a reference picture, a slice data partition of a
247  *  reference picture, or a prefix NAL unit preceding a slice of a reference picture.
248  * @type: A #GstH264NalUnitType
249  * @idr_pic_flag: calculated idr_pic_flag
250  * @size: The size of the nal unit starting from @offset
251  * @offset: The offset of the actual start of the nal unit
252  * @sc_offset:The offset of the start code of the nal unit
253  * @valid: If the nal unit is valid, which mean it has
254  * already been parsed
255  * @data: The data from which the Nalu has been parsed
256  *
257  * Structure defining the Nal unit headers
258  */
259 struct _GstH264NalUnit
260 {
261   guint16 ref_idc;
262   guint16 type;
263
264   /* calculated values */
265   guint8 idr_pic_flag;
266   guint size;
267   guint offset;
268   guint sc_offset;
269   gboolean valid;
270
271   guint8 *data;
272 };
273
274 /**
275  * GstH264HRDParams:
276  * @cpb_cnt_minus1: plus 1 specifies the number of alternative
277  *    CPB specifications in the bitstream
278  * @bit_rate_scale: specifies the maximum input bit rate of the
279  * SchedSelIdx-th CPB
280  * @cpb_size_scale: specifies the CPB size of the SchedSelIdx-th CPB
281  * @guint32 bit_rate_value_minus1: specifies the maximum input bit rate for the
282  * SchedSelIdx-th CPB
283  * @cpb_size_value_minus1: is used together with cpb_size_scale to specify the
284  * SchedSelIdx-th CPB size
285  * @cbr_flag: Specifies if running in itermediate bitrate mode or constant
286  * @initial_cpb_removal_delay_length_minus1: specifies the length in bits of
287  * the cpb_removal_delay syntax element
288  * @cpb_removal_delay_length_minus1: specifies the length in bits of the
289  * dpb_output_delay syntax element
290  * @dpb_output_delay_length_minus1: >0 specifies the length in bits of the time_offset syntax element.
291  * =0 specifies that the time_offset syntax element is not present
292  * @time_offset_length: Length of the time offset
293  *
294  * Defines the HRD parameters
295  */
296 struct _GstH264HRDParams
297 {
298   guint8 cpb_cnt_minus1;
299   guint8 bit_rate_scale;
300   guint8 cpb_size_scale;
301
302   guint32 bit_rate_value_minus1[32];
303   guint32 cpb_size_value_minus1[32];
304   guint8 cbr_flag[32];
305
306   guint8 initial_cpb_removal_delay_length_minus1;
307   guint8 cpb_removal_delay_length_minus1;
308   guint8 dpb_output_delay_length_minus1;
309   guint8 time_offset_length;
310 };
311
312 /**
313  * GstH264VUIParams:
314  * @aspect_ratio_info_present_flag: %TRUE specifies that aspect_ratio_idc is present.
315  *  %FALSE specifies that aspect_ratio_idc is not present
316  * @aspect_ratio_idc specifies the value of the sample aspect ratio of the luma samples
317  * @sar_width indicates the horizontal size of the sample aspect ratio
318  * @sar_height indicates the vertical size of the sample aspect ratio
319  * @overscan_info_present_flag: %TRUE overscan_appropriate_flag is present %FALSE otherwize
320  * @overscan_appropriate_flag: %TRUE indicates that the cropped decoded pictures
321  *  output are suitable for display using overscan. %FALSE the cropped decoded pictures
322  *  output contain visually important information
323  * @video_signal_type_present_flag: %TRUE specifies that video_format, video_full_range_flag and
324  *  colour_description_present_flag are present.
325  * @video_format: indicates the representation of the picture
326  * @video_full_range_flag: indicates the black level and range of the luma and chroma signals
327  * @colour_description_present_flag: %TRUE specifies that colour_primaries,
328  *  transfer_characteristics and matrix_coefficients are present
329  * @colour_primaries: indicates the chromaticity coordinates of the source primaries
330  * @transfer_characteristics: indicates the opto-electronic transfer characteristic
331  * @matrix_coefficients: describes the matrix coefficients used in deriving luma and chroma signals
332  * @chroma_loc_info_present_flag: %TRUE specifies that chroma_sample_loc_type_top_field and
333  *  chroma_sample_loc_type_bottom_field are present, %FALSE otherwize
334  * @chroma_sample_loc_type_top_field: specify the location of chroma for top field
335  * @chroma_sample_loc_type_bottom_field specify the location of chroma for bottom field
336  * @timing_info_present_flag: %TRUE specifies that num_units_in_tick,
337  *  time_scale and fixed_frame_rate_flag are present in the bitstream
338  * @num_units_in_tick: is the number of time units of a clock operating at the frequency time_scale Hz
339  * time_scale: is the number of time units that pass in one second
340  * @fixed_frame_rate_flag: %TRUE indicates that the temporal distance between the HRD output times
341  *  of any two consecutive pictures in output order is constrained as specified in the spec, %FALSE
342  *  otherwize.
343  * @nal_hrd_parameters_present_flag: %TRUE if nal hrd parameters present in the bitstream
344  * @vcl_hrd_parameters_present_flag: %TRUE if nal vlc hrd parameters present in the bitstream
345  * @low_delay_hrd_flag: specifies the HRD operational mode
346  * @pic_struct_present_flag: %TRUE specifies that picture timing SEI messages are present or not
347  * @bitstream_restriction_flag: %TRUE specifies that the following coded video sequence bitstream restriction
348  * parameters are present
349  * @motion_vectors_over_pic_boundaries_flag: %FALSE indicates that no sample outside the
350  *  picture boundaries and no sample at a fractional sample position, %TRUE indicates that one or more
351  *  samples outside picture boundaries may be used in inter prediction
352  * @max_bytes_per_pic_denom: indicates a number of bytes not exceeded by the sum of the sizes of
353  *  the VCL NAL units associated with any coded picture in the coded video sequence.
354  * @max_bits_per_mb_denom: indicates the maximum number of coded bits of macroblock_layer
355  * @log2_max_mv_length_horizontal: indicate the maximum absolute value of a decoded horizontal
356  * motion vector component
357  * @log2_max_mv_length_vertical: indicate the maximum absolute value of a decoded vertical
358  *  motion vector component
359  * @num_reorder_frames: indicates the maximum number of frames, complementary field pairs,
360  *  or non-paired fields that precede any frame,
361  * @max_dec_frame_buffering: specifies the required size of the HRD decoded picture buffer in
362  *  units of frame buffers.
363  *
364  * The structure representing the VUI parameters.
365  */
366 struct _GstH264VUIParams
367 {
368   guint8 aspect_ratio_info_present_flag;
369   guint8 aspect_ratio_idc;
370   /* if aspect_ratio_idc == 255 */
371   guint16 sar_width;
372   guint16 sar_height;
373
374   guint8 overscan_info_present_flag;
375   /* if overscan_info_present_flag */
376   guint8 overscan_appropriate_flag;
377
378   guint8 video_signal_type_present_flag;
379   guint8 video_format;
380   guint8 video_full_range_flag;
381   guint8 colour_description_present_flag;
382   guint8 colour_primaries;
383   guint8 transfer_characteristics;
384   guint8 matrix_coefficients;
385
386   guint8 chroma_loc_info_present_flag;
387   guint8 chroma_sample_loc_type_top_field;
388   guint8 chroma_sample_loc_type_bottom_field;
389
390   guint8 timing_info_present_flag;
391   /* if timing_info_present_flag */
392   guint32 num_units_in_tick;
393   guint32 time_scale;
394   guint8 fixed_frame_rate_flag;
395
396   guint8 nal_hrd_parameters_present_flag;
397   /* if nal_hrd_parameters_present_flag */
398   GstH264HRDParams nal_hrd_parameters;
399
400   guint8 vcl_hrd_parameters_present_flag;
401   /* if vcl_hrd_parameters_present_flag */
402   GstH264HRDParams vcl_hrd_parameters;
403
404   guint8 low_delay_hrd_flag;
405   guint8 pic_struct_present_flag;
406
407   guint8 bitstream_restriction_flag;
408   /*  if bitstream_restriction_flag */
409   guint8 motion_vectors_over_pic_boundaries_flag;
410   guint32 max_bytes_per_pic_denom;
411   guint32 max_bits_per_mb_denom;
412   guint32 log2_max_mv_length_horizontal;
413   guint32 log2_max_mv_length_vertical;
414   guint32 num_reorder_frames;
415   guint32 max_dec_frame_buffering;
416
417   /* calculated values */
418   guint par_n;
419   guint par_d;
420 };
421
422 /**
423  * GstH264SPS:
424  * @id: The ID of the sequence parameter set
425  * @profile_idc: indicate the profile to which the coded video sequence conforms
426  *
427  * H264 Sequence Parameter Set (SPS)
428  */
429 struct _GstH264SPS
430 {
431   gint id;
432
433   guint8 profile_idc;
434   guint8 constraint_set0_flag;
435   guint8 constraint_set1_flag;
436   guint8 constraint_set2_flag;
437   guint8 constraint_set3_flag;
438   guint8 level_idc;
439
440   guint8 chroma_format_idc;
441   guint8 separate_colour_plane_flag;
442   guint8 bit_depth_luma_minus8;
443   guint8 bit_depth_chroma_minus8;
444   guint8 qpprime_y_zero_transform_bypass_flag;
445
446   guint8 scaling_matrix_present_flag;
447   guint8 scaling_lists_4x4[6][16];
448   guint8 scaling_lists_8x8[6][64];
449
450   guint8 log2_max_frame_num_minus4;
451   guint8 pic_order_cnt_type;
452
453   /* if pic_order_cnt_type == 0 */
454   guint8 log2_max_pic_order_cnt_lsb_minus4;
455
456   /* else if pic_order_cnt_type == 1 */
457   guint8 delta_pic_order_always_zero_flag;
458   gint32 offset_for_non_ref_pic;
459   gint32 offset_for_top_to_bottom_field;
460   guint8 num_ref_frames_in_pic_order_cnt_cycle;
461   gint32 offset_for_ref_frame[255];
462
463   guint32 num_ref_frames;
464   guint8 gaps_in_frame_num_value_allowed_flag;
465   guint32 pic_width_in_mbs_minus1;
466   guint32 pic_height_in_map_units_minus1;
467   guint8 frame_mbs_only_flag;
468
469   guint8 mb_adaptive_frame_field_flag;
470
471   guint8 direct_8x8_inference_flag;
472
473   guint8 frame_cropping_flag;
474
475   /* if frame_cropping_flag */
476   guint32 frame_crop_left_offset;
477   guint32 frame_crop_right_offset;
478   guint32 frame_crop_top_offset;
479   guint32 frame_crop_bottom_offset;
480
481   guint8 vui_parameters_present_flag;
482   /* if vui_parameters_present_flag */
483   GstH264VUIParams vui_parameters;
484
485   /* calculated values */
486   guint8 chroma_array_type;
487   guint32 max_frame_num;
488   gint width, height;
489   gint crop_rect_width, crop_rect_height;
490   gint crop_rect_x, crop_rect_y;
491   gint fps_num, fps_den;
492   gboolean valid;
493 };
494
495 /**
496  * GstH264PPS:
497  *
498  * H264 Picture Parameter Set
499  */
500 struct _GstH264PPS
501 {
502   gint id;
503
504   GstH264SPS *sequence;
505
506   guint8 entropy_coding_mode_flag;
507   guint8 pic_order_present_flag;
508
509   guint32 num_slice_groups_minus1;
510
511   /* if num_slice_groups_minus1 > 0 */
512   guint8 slice_group_map_type;
513   /* and if slice_group_map_type == 0 */
514   guint32 run_length_minus1[8];
515   /* or if slice_group_map_type == 2 */
516   guint32 top_left[8];
517   guint32 bottom_right[8];
518   /* or if slice_group_map_type == (3, 4, 5) */
519   guint8 slice_group_change_direction_flag;
520   guint32 slice_group_change_rate_minus1;
521   /* or if slice_group_map_type == 6 */
522   guint32 pic_size_in_map_units_minus1;
523   guint8 *slice_group_id;
524
525   guint8 num_ref_idx_l0_active_minus1;
526   guint8 num_ref_idx_l1_active_minus1;
527   guint8 weighted_pred_flag;
528   guint8 weighted_bipred_idc;
529   gint8 pic_init_qp_minus26;
530   gint8 pic_init_qs_minus26;
531   gint8 chroma_qp_index_offset;
532   guint8 deblocking_filter_control_present_flag;
533   guint8 constrained_intra_pred_flag;
534   guint8 redundant_pic_cnt_present_flag;
535
536   guint8 transform_8x8_mode_flag;
537
538   guint8 scaling_lists_4x4[6][16];
539   guint8 scaling_lists_8x8[6][64];
540
541   guint8 second_chroma_qp_index_offset;
542
543   gboolean valid;
544 };
545
546 struct _GstH264RefPicListModification
547 {
548   guint8 modification_of_pic_nums_idc;
549   union
550   {
551     /* if modification_of_pic_nums_idc == 0 || 1 */
552     guint32 abs_diff_pic_num_minus1;
553     /* if modification_of_pic_nums_idc == 2 */
554     guint32 long_term_pic_num;
555   } value;
556 };
557
558 struct _GstH264PredWeightTable
559 {
560   guint8 luma_log2_weight_denom;
561   guint8 chroma_log2_weight_denom;
562
563   gint16 luma_weight_l0[32];
564   gint8 luma_offset_l0[32];
565
566   /* if seq->ChromaArrayType != 0 */
567   gint16 chroma_weight_l0[32][2];
568   gint8 chroma_offset_l0[32][2];
569
570   /* if slice->slice_type % 5 == 1 */
571   gint16 luma_weight_l1[32];
572   gint8 luma_offset_l1[32];
573
574   /* and if seq->ChromaArrayType != 0 */
575   gint16 chroma_weight_l1[32][2];
576   gint8 chroma_offset_l1[32][2];
577 };
578
579 struct _GstH264RefPicMarking
580 {
581   guint8 memory_management_control_operation;
582
583   guint32 difference_of_pic_nums_minus1;
584   guint32 long_term_pic_num;
585   guint32 long_term_frame_idx;
586   guint32 max_long_term_frame_idx_plus1;
587 };
588
589 struct _GstH264DecRefPicMarking
590 {
591   /* if slice->nal_unit.IdrPicFlag */
592   guint8 no_output_of_prior_pics_flag;
593   guint8 long_term_reference_flag;
594
595   guint8 adaptive_ref_pic_marking_mode_flag;
596   GstH264RefPicMarking ref_pic_marking[10];
597   guint8 n_ref_pic_marking;
598 };
599
600
601 struct _GstH264SliceHdr
602 {
603   guint32 first_mb_in_slice;
604   guint32 type;
605   GstH264PPS *pps;
606
607   /* if seq->separate_colour_plane_flag */
608   guint8 colour_plane_id;
609
610   guint16 frame_num;
611
612   guint8 field_pic_flag;
613   guint8 bottom_field_flag;
614
615   /* if nal_unit.type == 5 */
616   guint16 idr_pic_id;
617
618   /* if seq->pic_order_cnt_type == 0 */
619   guint16 pic_order_cnt_lsb;
620   /* if seq->pic_order_present_flag && !field_pic_flag */
621   gint32 delta_pic_order_cnt_bottom;
622
623   gint32 delta_pic_order_cnt[2];
624   guint8 redundant_pic_cnt;
625
626   /* if slice_type == B_SLICE */
627   guint8 direct_spatial_mv_pred_flag;
628
629   guint8 num_ref_idx_l0_active_minus1;
630   guint8 num_ref_idx_l1_active_minus1;
631
632   guint8 ref_pic_list_modification_flag_l0;
633   guint8 n_ref_pic_list_modification_l0;
634   GstH264RefPicListModification ref_pic_list_modification_l0[32];
635   guint8 ref_pic_list_modification_flag_l1;
636   guint8 n_ref_pic_list_modification_l1;
637   GstH264RefPicListModification ref_pic_list_modification_l1[32];
638
639   GstH264PredWeightTable pred_weight_table;
640   /* if nal_unit.ref_idc != 0 */
641   GstH264DecRefPicMarking dec_ref_pic_marking;
642
643   guint8 cabac_init_idc;
644   gint8 slice_qp_delta;
645   gint8 slice_qs_delta;
646
647   guint8 disable_deblocking_filter_idc;
648   gint8 slice_alpha_c0_offset_div2;
649   gint8 slice_beta_offset_div2;
650
651   guint16 slice_group_change_cycle;
652
653   /* calculated values */
654   guint32 max_pic_num;
655   gboolean valid;
656
657   /* Size of the slice_header() in bits */
658   guint header_size;
659
660   /* Number of emulation prevention bytes (EPB) in this slice_header() */
661   guint n_emulation_prevention_bytes;
662 };
663
664
665 struct _GstH264ClockTimestamp
666 {
667   guint8 ct_type;
668   guint8 nuit_field_based_flag;
669   guint8 counting_type;
670   guint8 discontinuity_flag;
671   guint8 cnt_dropped_flag;
672   guint8 n_frames;
673
674   guint8 seconds_flag;
675   guint8 seconds_value;
676
677   guint8 minutes_flag;
678   guint8 minutes_value;
679
680   guint8 hours_flag;
681   guint8 hours_value;
682
683   guint32 time_offset;
684 };
685
686 struct _GstH264PicTiming
687 {
688   guint32 cpb_removal_delay;
689   guint32 dpb_output_delay;
690
691   guint8 pic_struct_present_flag;
692   /* if pic_struct_present_flag */
693   guint8 pic_struct;
694
695   guint8 clock_timestamp_flag[3];
696   GstH264ClockTimestamp clock_timestamp[3];
697 };
698
699 struct _GstH264BufferingPeriod
700 {
701   GstH264SPS *sps;
702
703   /* seq->vui_parameters->nal_hrd_parameters_present_flag */
704   guint8 nal_initial_cpb_removal_delay[32];
705   guint8 nal_initial_cpb_removal_delay_offset[32];
706
707   /* seq->vui_parameters->vcl_hrd_parameters_present_flag */
708   guint8 vcl_initial_cpb_removal_delay[32];
709   guint8 vcl_initial_cpb_removal_delay_offset[32];
710 };
711
712 struct _GstH264RecoveryPoint
713 {
714   guint32 recovery_frame_cnt;
715   guint8 exact_match_flag;
716   guint8 broken_link_flag;
717   guint8 changing_slice_group_idc;
718 };
719
720 struct _GstH264SEIMessage
721 {
722   GstH264SEIPayloadType payloadType;
723
724   union {
725     GstH264BufferingPeriod buffering_period;
726     GstH264PicTiming pic_timing;
727     GstH264RecoveryPoint recovery_point;
728     /* ... could implement more */
729   } payload;
730 };
731
732 /**
733  * GstH264NalParser:
734  *
735  * H264 NAL Parser (opaque structure).
736  */
737 struct _GstH264NalParser
738 {
739   /*< private >*/
740   GstH264SPS sps[GST_H264_MAX_SPS_COUNT];
741   GstH264PPS pps[GST_H264_MAX_PPS_COUNT];
742   GstH264SPS *last_sps;
743   GstH264PPS *last_pps;
744 };
745
746 GstH264NalParser *gst_h264_nal_parser_new             (void);
747
748 GstH264ParserResult gst_h264_parser_identify_nalu     (GstH264NalParser *nalparser,
749                                                        const guint8 *data, guint offset,
750                                                        gsize size, GstH264NalUnit *nalu);
751
752 GstH264ParserResult gst_h264_parser_identify_nalu_unchecked (GstH264NalParser *nalparser,
753                                                        const guint8 *data, guint offset,
754                                                        gsize size, GstH264NalUnit *nalu);
755
756 GstH264ParserResult gst_h264_parser_identify_nalu_avc (GstH264NalParser *nalparser, const guint8 *data,
757                                                        guint offset, gsize size, guint8 nal_length_size,
758                                                        GstH264NalUnit *nalu);
759
760 GstH264ParserResult gst_h264_parser_parse_nal         (GstH264NalParser *nalparser,
761                                                        GstH264NalUnit *nalu);
762
763 GstH264ParserResult gst_h264_parser_parse_slice_hdr   (GstH264NalParser *nalparser, GstH264NalUnit *nalu,
764                                                        GstH264SliceHdr *slice, gboolean parse_pred_weight_table,
765                                                        gboolean parse_dec_ref_pic_marking);
766
767 GstH264ParserResult gst_h264_parser_parse_sps         (GstH264NalParser *nalparser, GstH264NalUnit *nalu,
768                                                        GstH264SPS *sps, gboolean parse_vui_params);
769
770 GstH264ParserResult gst_h264_parser_parse_pps         (GstH264NalParser *nalparser,
771                                                        GstH264NalUnit *nalu, GstH264PPS *pps);
772
773 GstH264ParserResult gst_h264_parser_parse_sei         (GstH264NalParser *nalparser,
774                                                        GstH264NalUnit *nalu, GArray ** messages);
775
776 void gst_h264_nal_parser_free                         (GstH264NalParser *nalparser);
777
778 GstH264ParserResult gst_h264_parse_sps                (GstH264NalUnit *nalu,
779                                                        GstH264SPS *sps, gboolean parse_vui_params);
780
781 GstH264ParserResult gst_h264_parse_pps                (GstH264NalParser *nalparser,
782                                                        GstH264NalUnit *nalu, GstH264PPS *pps);
783
784 void    gst_h264_quant_matrix_8x8_get_zigzag_from_raster (guint8 out_quant[64],
785                                                           const guint8 quant[64]);
786
787 void    gst_h264_quant_matrix_8x8_get_raster_from_zigzag (guint8 out_quant[64],
788                                                           const guint8 quant[64]);
789
790 void    gst_h264_quant_matrix_4x4_get_zigzag_from_raster (guint8 out_quant[16],
791                                                           const guint8 quant[16]);
792
793 void    gst_h264_quant_matrix_4x4_get_raster_from_zigzag (guint8 out_quant[16],
794                                                           const guint8 quant[16]);
795
796 void gst_h264_video_calculate_framerate (const GstH264SPS * sps, guint field_pic_flag,
797     guint pic_struct, gint * fps_num, gint * fps_den);
798
799 G_END_DECLS
800
801 #endif