Imported Upstream version 0.10.23
[profile/ivi/gst-plugins-bad.git] / gst / mpegdemux / mpegtspacketizer.h
1 /*
2  * mpegtspacketizer.h - 
3  * Copyright (C) 2007 Alessandro Decina
4  * 
5  * Authors:
6  *   Alessandro Decina <alessandro@nnva.org>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public
19  * License along with this library; if not, write to the
20  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23
24 #ifndef GST_MPEGTS_PACKETIZER_H
25 #define GST_MPEGTS_PACKETIZER_H
26
27 #include <gst/gst.h>
28 #include <gst/base/gstadapter.h>
29 #include <glib.h>
30
31 #define MPEGTS_NORMAL_PACKETSIZE  188
32 #define MPEGTS_M2TS_PACKETSIZE    192
33 #define MPEGTS_DVB_ASI_PACKETSIZE 204
34 #define MPEGTS_ATSC_PACKETSIZE    208
35
36 #define MPEGTS_MIN_PACKETSIZE MPEGTS_NORMAL_PACKETSIZE
37 #define MPEGTS_MAX_PACKETSIZE MPEGTS_ATSC_PACKETSIZE
38
39 G_BEGIN_DECLS
40
41 #define GST_TYPE_MPEGTS_PACKETIZER \
42   (mpegts_packetizer_get_type())
43 #define GST_MPEGTS_PACKETIZER(obj) \
44   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MPEGTS_PACKETIZER,MpegTSPacketizer))
45 #define GST_MPEGTS_PACKETIZER_CLASS(klass) \
46   (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MPEGTS_PACKETIZER,MpegTSPacketizerClass))
47 #define GST_IS_MPEGTS_PACKETIZER(obj) \
48   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MPEGTS_PACKETIZER))
49 #define GST_IS_MPEGTS_PACKETIZER_CLASS(klass) \
50   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MPEGTS_PACKETIZER))
51
52
53 typedef struct _MpegTSPacketizer MpegTSPacketizer;
54 typedef struct _MpegTSPacketizerClass MpegTSPacketizerClass;
55
56 typedef struct
57 {
58   guint continuity_counter;
59   GstAdapter *section_adapter;
60   guint8 section_table_id;
61   guint section_length;
62   GSList *subtables;
63 } MpegTSPacketizerStream;
64
65 struct _MpegTSPacketizer {
66   GObject object;
67
68   GstAdapter *adapter;
69   /* streams hashed by pid */
70   MpegTSPacketizerStream **streams;
71   gboolean disposed;
72   gboolean know_packet_size;
73   guint16 packet_size;
74   GstCaps *caps;
75 };
76
77 struct _MpegTSPacketizerClass {
78   GObjectClass object_class;
79 };
80
81 typedef struct
82 {
83   GstBuffer *buffer;
84   gint16 pid;
85   guint8 payload_unit_start_indicator;
86   guint8 adaptation_field_control;
87   guint8 continuity_counter;
88   guint8 *payload;
89
90   guint8 *data_start;
91   guint8 *data_end;
92   guint8 *data;
93
94 } MpegTSPacketizerPacket;
95
96 typedef struct
97 {
98   gboolean complete;
99   GstBuffer *buffer;
100   gint16 pid;
101   guint8 table_id;
102   guint16 subtable_extension;
103   guint section_length;
104   guint8 version_number;
105   guint8 current_next_indicator;
106   guint32 crc;
107 } MpegTSPacketizerSection; 
108
109 typedef struct
110 {
111   guint8 table_id;
112   /* the spec says sub_table_extension is the fourth and fifth byte of a 
113    * section when the section_syntax_indicator is set to a value of "1". If 
114    * section_syntax_indicator is 0, sub_table_extension will be set to 0 */
115   guint16 subtable_extension;
116   guint8 version_number;
117   guint32 crc;
118 } MpegTSPacketizerStreamSubtable;
119
120 typedef enum {
121   PACKET_BAD       = FALSE,
122   PACKET_OK        = TRUE,
123   PACKET_NEED_MORE
124 } MpegTSPacketizerPacketReturn;
125
126 GType mpegts_packetizer_get_type(void);
127
128 MpegTSPacketizer *mpegts_packetizer_new (void);
129 void mpegts_packetizer_clear (MpegTSPacketizer *packetizer);
130 void mpegts_packetizer_push (MpegTSPacketizer *packetizer, GstBuffer *buffer);
131 gboolean mpegts_packetizer_has_packets (MpegTSPacketizer *packetizer);
132 MpegTSPacketizerPacketReturn mpegts_packetizer_next_packet (MpegTSPacketizer *packetizer,
133   MpegTSPacketizerPacket *packet);
134 void mpegts_packetizer_clear_packet (MpegTSPacketizer *packetizer,
135   MpegTSPacketizerPacket *packet);
136 void mpegts_packetizer_remove_stream(MpegTSPacketizer *packetizer, 
137   gint16 pid);
138
139 gboolean mpegts_packetizer_push_section (MpegTSPacketizer *packetzer,
140   MpegTSPacketizerPacket *packet, MpegTSPacketizerSection *section);
141 GstStructure *mpegts_packetizer_parse_pat (MpegTSPacketizer *packetizer,
142   MpegTSPacketizerSection *section);
143 GstStructure *mpegts_packetizer_parse_pmt (MpegTSPacketizer *packetizer,
144   MpegTSPacketizerSection *section);
145 GstStructure *mpegts_packetizer_parse_nit (MpegTSPacketizer *packetizer,
146   MpegTSPacketizerSection *section);
147 GstStructure *mpegts_packetizer_parse_sdt (MpegTSPacketizer *packetizer,
148   MpegTSPacketizerSection *section);
149 GstStructure *mpegts_packetizer_parse_eit (MpegTSPacketizer *packetizer,
150   MpegTSPacketizerSection *section);
151 GstStructure *mpegts_packetizer_parse_tdt (MpegTSPacketizer *packetizer,
152   MpegTSPacketizerSection *section);
153
154 G_END_DECLS
155
156 #endif /* GST_MPEGTS_PACKETIZER_H */