Merge remote-tracking branch 'origin/master' into 0.11
[platform/upstream/gst-plugins-base.git] / gst-libs / gst / pbutils / gstdiscoverer.h
1 /* GStreamer
2  * Copyright (C) 2009 Edward Hervey <edward.hervey@collabora.co.uk>
3  *               2009 Nokia Corporation
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20
21 #ifndef _GST_DISCOVERER_H_
22 #define _GST_DISCOVERER_H_
23
24 #include <gst/gst.h>
25
26 G_BEGIN_DECLS
27
28 #define GST_TYPE_DISCOVERER_STREAM_INFO \
29   (gst_discoverer_stream_info_get_type ())
30 #define GST_DISCOVERER_STREAM_INFO(obj) \
31   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_STREAM_INFO, GstDiscovererStreamInfo))
32 #define GST_IS_DISCOVERER_STREAM_INFO(obj) \
33   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_STREAM_INFO))
34 typedef struct _GstDiscovererStreamInfo GstDiscovererStreamInfo;
35 typedef GObjectClass GstDiscovererStreamInfoClass;
36 GType gst_discoverer_stream_info_get_type (void);
37
38 /**
39  * GstDiscovererStreamInfo:
40  *
41  * Base structure for information concerning a media stream. Depending on the
42  * stream type, one can find more media-specific information in
43  * #GstDiscovererAudioInfo, #GstDiscovererVideoInfo, and
44  * #GstDiscovererContainerInfo.
45  *
46  * The #GstDiscovererStreamInfo represents the topology of the stream. Siblings
47  * can be iterated over with gst_discoverer_stream_info_get_next() and
48  * gst_discoverer_stream_info_get_previous(). Children (sub-streams) of a
49  * stream can be accessed using the #GstDiscovererContainerInfo API.
50  *
51  * As a simple example, if you run #GstDiscoverer on an AVI file with one audio
52  * and one video stream, you will get a #GstDiscovererContainerInfo
53  * corresponding to the AVI container, which in turn will have a
54  * #GstDiscovererAudioInfo sub-stream and a #GstDiscovererVideoInfo sub-stream
55  * for the audio and video streams respectively.
56  *
57  * Since: 0.10.31
58  */
59 #define gst_discoverer_stream_info_ref(info) ((GstDiscovererStreamInfo*) g_object_ref((GObject*) info))
60 #define gst_discoverer_stream_info_unref(info) (g_object_unref((GObject*) info))
61
62 GstDiscovererStreamInfo* gst_discoverer_stream_info_get_previous(GstDiscovererStreamInfo* info);
63 GstDiscovererStreamInfo* gst_discoverer_stream_info_get_next(GstDiscovererStreamInfo* info);
64 GstCaps*                 gst_discoverer_stream_info_get_caps(GstDiscovererStreamInfo* info);
65 const GstTagList*        gst_discoverer_stream_info_get_tags(GstDiscovererStreamInfo* info);
66 const GstStructure*      gst_discoverer_stream_info_get_misc(GstDiscovererStreamInfo* info);
67 const gchar *            gst_discoverer_stream_info_get_stream_type_nick(GstDiscovererStreamInfo* info);
68
69 /**
70  * GstDiscovererContainerInfo:
71  *
72  * #GstDiscovererStreamInfo specific to container streams.
73  *
74  * Since: 0.10.31
75  */
76 #define GST_TYPE_DISCOVERER_CONTAINER_INFO \
77   (gst_discoverer_container_info_get_type ())
78 #define GST_DISCOVERER_CONTAINER_INFO(obj) \
79   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_CONTAINER_INFO, GstDiscovererContainerInfo))
80 #define GST_IS_DISCOVERER_CONTAINER_INFO(obj) \
81   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_CONTAINER_INFO))
82 typedef struct _GstDiscovererContainerInfo GstDiscovererContainerInfo;
83 typedef GObjectClass GstDiscovererContainerInfoClass;
84
85 GType gst_discoverer_container_info_get_type (void);
86
87 GList *gst_discoverer_container_info_get_streams(GstDiscovererContainerInfo *info);
88
89
90 /**
91  * GstDiscovererAudioInfo:
92  *
93  * #GstDiscovererStreamInfo specific to audio streams.
94  *
95  * Since: 0.10.31
96  */
97 #define GST_TYPE_DISCOVERER_AUDIO_INFO \
98   (gst_discoverer_audio_info_get_type ())
99 #define GST_DISCOVERER_AUDIO_INFO(obj) \
100   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_AUDIO_INFO, GstDiscovererAudioInfo))
101 #define GST_IS_DISCOVERER_AUDIO_INFO(obj) \
102   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_AUDIO_INFO))
103 typedef struct _GstDiscovererAudioInfo GstDiscovererAudioInfo;
104 typedef GObjectClass GstDiscovererAudioInfoClass;
105
106 GType gst_discoverer_audio_info_get_type (void);
107
108 guint gst_discoverer_audio_info_get_channels(const GstDiscovererAudioInfo* info);
109 guint gst_discoverer_audio_info_get_sample_rate(const GstDiscovererAudioInfo* info);
110 guint gst_discoverer_audio_info_get_depth(const GstDiscovererAudioInfo* info);
111 guint gst_discoverer_audio_info_get_bitrate(const GstDiscovererAudioInfo* info);
112 guint gst_discoverer_audio_info_get_max_bitrate(const GstDiscovererAudioInfo* info);
113 const gchar * gst_discoverer_audio_info_get_language(const GstDiscovererAudioInfo* info);
114
115 /**
116  * GstDiscovererVideoInfo:
117  *
118  * #GstDiscovererStreamInfo specific to video streams (this includes images).
119  *
120  * Since: 0.10.31
121  */
122 #define GST_TYPE_DISCOVERER_VIDEO_INFO \
123   (gst_discoverer_video_info_get_type ())
124 #define GST_DISCOVERER_VIDEO_INFO(obj) \
125   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_VIDEO_INFO, GstDiscovererVideoInfo))
126 #define GST_IS_DISCOVERER_VIDEO_INFO(obj) \
127   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_VIDEO_INFO))
128 typedef struct _GstDiscovererVideoInfo GstDiscovererVideoInfo;
129 typedef GObjectClass GstDiscovererVideoInfoClass;
130 GType gst_discoverer_video_info_get_type (void);
131
132 guint           gst_discoverer_video_info_get_width(const GstDiscovererVideoInfo* info);
133 guint           gst_discoverer_video_info_get_height(const GstDiscovererVideoInfo* info);
134 guint           gst_discoverer_video_info_get_depth(const GstDiscovererVideoInfo* info);
135 guint           gst_discoverer_video_info_get_framerate_num(const GstDiscovererVideoInfo* info);
136 guint           gst_discoverer_video_info_get_framerate_denom(const GstDiscovererVideoInfo* info);
137 guint           gst_discoverer_video_info_get_par_num(const GstDiscovererVideoInfo* info);
138 guint           gst_discoverer_video_info_get_par_denom(const GstDiscovererVideoInfo* info);
139 gboolean        gst_discoverer_video_info_is_interlaced(const GstDiscovererVideoInfo* info);
140 guint           gst_discoverer_video_info_get_bitrate(const GstDiscovererVideoInfo* info);
141 guint           gst_discoverer_video_info_get_max_bitrate(const GstDiscovererVideoInfo* info);
142 gboolean        gst_discoverer_video_info_is_image(const GstDiscovererVideoInfo* info);
143
144 /**
145  * GstDiscovererSubtitleInfo:
146  *
147  * #GstDiscovererStreamInfo specific to subtitle streams (this includes text and
148  * image based ones).
149  *
150  * Since: 0.10.36
151  */
152 #define GST_TYPE_DISCOVERER_SUBTITLE_INFO \
153   (gst_discoverer_subtitle_info_get_type ())
154 #define GST_DISCOVERER_SUBTITLE_INFO(obj) \
155   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_SUBTITLE_INFO, GstDiscovererSubtitleInfo))
156 #define GST_IS_DISCOVERER_SUBTITLE_INFO(obj) \
157   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_SUBTITLE_INFO))
158 typedef struct _GstDiscovererSubtitleInfo GstDiscovererSubtitleInfo;
159 typedef GObjectClass GstDiscovererSubtitleInfoClass;
160 GType gst_discoverer_subtitle_info_get_type (void);
161
162 const gchar *   gst_discoverer_subtitle_info_get_language(const GstDiscovererSubtitleInfo* info);
163
164 /**
165  * GstDiscovererResult:
166  * @GST_DISCOVERER_OK: The discovery was successful
167  * @GST_DISCOVERER_URI_INVALID: the URI is invalid
168  * @GST_DISCOVERER_ERROR: an error happened and the GError is set
169  * @GST_DISCOVERER_TIMEOUT: the discovery timed-out
170  * @GST_DISCOVERER_BUSY: the discoverer was already discovering a file
171  * @GST_DISCOVERER_MISSING_PLUGINS: Some plugins are missing for full discovery
172  *
173  * Result values for the discovery process.
174  *
175  * Since: 0.10.31
176  */
177 typedef enum {
178   GST_DISCOVERER_OK               = 0,
179   GST_DISCOVERER_URI_INVALID      = 1,
180   GST_DISCOVERER_ERROR            = 2,
181   GST_DISCOVERER_TIMEOUT          = 3,
182   GST_DISCOVERER_BUSY             = 4,
183   GST_DISCOVERER_MISSING_PLUGINS  = 5
184 } GstDiscovererResult;
185
186
187 /**
188  * GstDiscovererInfo:
189  *
190  * Structure containing the information of a URI analyzed by #GstDiscoverer.
191  *
192  * Since: 0.10.31
193  */
194 typedef struct _GstDiscovererInfo GstDiscovererInfo;
195
196 #define GST_TYPE_DISCOVERER_INFO \
197   (gst_discoverer_info_get_type ())
198 #define GST_DISCOVERER_INFO(obj) \
199   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_INFO, GstDiscovererInfo))
200 #define GST_IS_DISCOVERER_INFO(obj) \
201   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_INFO))
202 typedef GObjectClass GstDiscovererInfoClass;
203 GType gst_discoverer_info_get_type (void);
204
205 #define gst_discoverer_info_unref(info) (g_object_unref((GObject*)info))
206 #define gst_discoverer_info_ref(info) (g_object_ref((Gbject*)info))
207
208 GstDiscovererInfo*        gst_discoverer_info_copy (GstDiscovererInfo * ptr);
209
210 const gchar*              gst_discoverer_info_get_uri(const GstDiscovererInfo* info);
211 GstDiscovererResult       gst_discoverer_info_get_result(const GstDiscovererInfo* info);
212 GstDiscovererStreamInfo*  gst_discoverer_info_get_stream_info(GstDiscovererInfo* info);
213 GList*                    gst_discoverer_info_get_stream_list(GstDiscovererInfo* info);
214 GstClockTime              gst_discoverer_info_get_duration(const GstDiscovererInfo* info);
215 gboolean                  gst_discoverer_info_get_seekable(const GstDiscovererInfo* info);
216 const GstStructure*       gst_discoverer_info_get_misc(const GstDiscovererInfo* info);
217 const GstTagList*         gst_discoverer_info_get_tags(const GstDiscovererInfo* info);
218
219 GList *                   gst_discoverer_info_get_streams (GstDiscovererInfo *info,
220                                                            GType streamtype);
221 GList *                   gst_discoverer_info_get_audio_streams (GstDiscovererInfo *info);
222 GList *                   gst_discoverer_info_get_video_streams (GstDiscovererInfo *info);
223 GList *                   gst_discoverer_info_get_subtitle_streams (GstDiscovererInfo *info);
224 GList *                   gst_discoverer_info_get_container_streams (GstDiscovererInfo *info);
225
226 void                      gst_discoverer_stream_info_list_free (GList *infos);
227
228 #define GST_TYPE_DISCOVERER \
229   (gst_discoverer_get_type())
230 #define GST_DISCOVERER(obj) \
231   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER,GstDiscoverer))
232 #define GST_DISCOVERER_CLASS(klass) \
233   (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DISCOVERER,GstDiscovererClass))
234 #define GST_IS_DISCOVERER(obj) \
235   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER))
236 #define GST_IS_DISCOVERER_CLASS(klass) \
237   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DISCOVERER))
238
239 typedef struct _GstDiscoverer GstDiscoverer;
240 typedef struct _GstDiscovererClass GstDiscovererClass;
241 typedef struct _GstDiscovererPrivate GstDiscovererPrivate;
242
243 /**
244  * GstDiscoverer:
245  *
246  * The #GstDiscoverer structure.
247  *
248  * Since: 0.10.31
249  **/
250 struct _GstDiscoverer {
251   GObject parent;
252
253   GstDiscovererPrivate *priv;
254
255   gpointer _reserved[GST_PADDING];
256 };
257
258 struct _GstDiscovererClass {
259   GObjectClass parentclass;
260
261   /* signals */
262   void        (*finished)        (GstDiscoverer *discoverer);
263   void        (*starting)        (GstDiscoverer *discoverer);
264   void        (*discovered)      (GstDiscoverer *discoverer,
265                                   GstDiscovererInfo *info,
266                                   const GError *err);
267
268   gpointer _reserved[GST_PADDING];
269 };
270
271 GType          gst_discoverer_get_type (void);
272 GstDiscoverer *gst_discoverer_new (GstClockTime timeout, GError **err);
273
274 /* Asynchronous API */
275 void           gst_discoverer_start (GstDiscoverer *discoverer);
276 void           gst_discoverer_stop (GstDiscoverer *discoverer);
277 gboolean       gst_discoverer_discover_uri_async (GstDiscoverer *discoverer,
278                                                   const gchar *uri);
279
280 /* Synchronous API */
281 GstDiscovererInfo *
282 gst_discoverer_discover_uri (GstDiscoverer * discoverer,
283                              const gchar * uri,
284                              GError ** err);
285
286 G_END_DECLS
287
288 #endif /* _GST_DISCOVERER_H */