gsth264parse.h 3.6 KB
Newer Older
Mark Nauwelaerts's avatar
Mark Nauwelaerts committed
1
/* GStreamer H.264 Parser
2
 * Copyright (C) <2010> Collabora ltd
Mark Nauwelaerts's avatar
Mark Nauwelaerts committed
3
 * Copyright (C) <2010> Nokia Corporation
4
5
6
7
 * Copyright (C) <2011> Intel Corporation
 *
 * Copyright (C) <2010> Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
 * Copyright (C) <2011> Thibault Saunier <thibault.saunier@collabora.com>
Mark Nauwelaerts's avatar
Mark Nauwelaerts committed
8
9
10
11
12
13
14
15
16
17
18
19
20
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
Tim-Philipp Müller's avatar
Tim-Philipp Müller committed
21
22
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
Mark Nauwelaerts's avatar
Mark Nauwelaerts committed
23
24
25
26
27
28
 */

#ifndef __GST_H264_PARSE_H__
#define __GST_H264_PARSE_H__

#include <gst/gst.h>
29
#include <gst/base/gstbaseparse.h>
30
#include <gst/codecparsers/gsth264parser.h>
Mark Nauwelaerts's avatar
Mark Nauwelaerts committed
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

G_BEGIN_DECLS

typedef struct _H264Params H264Params;

#define GST_TYPE_H264_PARSE \
  (gst_h264_parse_get_type())
#define GST_H264_PARSE(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_H264_PARSE,GstH264Parse))
#define GST_H264_PARSE_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_H264_PARSE,GstH264ParseClass))
#define GST_IS_H264_PARSE(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_H264_PARSE))
#define GST_IS_H264_PARSE_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_H264_PARSE))

GType gst_h264_parse_get_type (void);

typedef struct _GstH264Parse GstH264Parse;
typedef struct _GstH264ParseClass GstH264ParseClass;

struct _GstH264Parse
{
  GstBaseParse baseparse;

  /* stream */
  gint width, height;
  gint fps_num, fps_den;
59
  gint upstream_par_n, upstream_par_d;
60
  gint parsed_par_n, parsed_par_d;
61
  /* current codec_data in output caps, if any */
Mark Nauwelaerts's avatar
Mark Nauwelaerts committed
62
  GstBuffer *codec_data;
63
64
  /* input codec_data, if any */
  GstBuffer *codec_data_in;
Mark Nauwelaerts's avatar
Mark Nauwelaerts committed
65
66
  guint nal_length_size;
  gboolean packetized;
67
68
  gboolean split_packetized;
  gboolean transform;
Mark Nauwelaerts's avatar
Mark Nauwelaerts committed
69
70

  /* state */
71
  GstH264NalParser *nalparser;
72
  guint state;
Mark Nauwelaerts's avatar
Mark Nauwelaerts committed
73
74
  guint align;
  guint format;
75
  gint current_off;
76
77
  /* True if input format and alignment match negotiated output */
  gboolean can_passthrough;
Mark Nauwelaerts's avatar
Mark Nauwelaerts committed
78
79
80

  GstClockTime last_report;
  gboolean push_codec;
81
82
  /* The following variables have a meaning in context of "have
   * SPS/PPS to push downstream", e.g. to update caps */
83
84
  gboolean have_sps;
  gboolean have_pps;
Mark Nauwelaerts's avatar
Mark Nauwelaerts committed
85

86
87
  gboolean sent_codec_tag;

88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
  /* collected SPS and PPS NALUs */
  GstBuffer *sps_nals[GST_H264_MAX_SPS_COUNT];
  GstBuffer *pps_nals[GST_H264_MAX_PPS_COUNT];

  /* Infos we need to keep track of */
  guint32 sei_cpb_removal_delay;
  guint8 sei_pic_struct;
  guint8 sei_pic_struct_pres_flag;
  guint field_pic_flag;

  /* cached timestamps */
  /* (trying to) track upstream dts and interpolate */
  GstClockTime dts;
  /* dts at start of last buffering period */
  GstClockTime ts_trn_nb;
103
  gboolean do_ts;
104

105
106
  gboolean discont;

Mark Nauwelaerts's avatar
Mark Nauwelaerts committed
107
  /* frame parsing */
108
109
  /*guint last_nal_pos;*/
  /*guint next_sc_pos;*/
110
  gint idr_pos, sei_pos;
Mark Nauwelaerts's avatar
Mark Nauwelaerts committed
111
112
113
  gboolean update_caps;
  GstAdapter *frame_out;
  gboolean keyframe;
114
  gboolean header;
Mark Nauwelaerts's avatar
Mark Nauwelaerts committed
115
116
117
118
119
120
  gboolean frame_start;
  /* AU state */
  gboolean picture_start;

  /* props */
  guint interval;
121
122
123

  GstClockTime pending_key_unit_ts;
  GstEvent *force_key_unit_event;
Mark Nauwelaerts's avatar
Mark Nauwelaerts committed
124
125
126
127
128
129
130
131
132
};

struct _GstH264ParseClass
{
  GstBaseParseClass parent_class;
};

G_END_DECLS
#endif