Fix FSF address
[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., 51 Franklin St, Fifth Floor,
18  * Boston, MA 02110-1301, 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 #define gst_discoverer_stream_info_ref(info) ((GstDiscovererStreamInfo*) g_object_ref((GObject*) info))
58 #define gst_discoverer_stream_info_unref(info) (g_object_unref((GObject*) info))
59
60 GstDiscovererStreamInfo* gst_discoverer_stream_info_get_previous(GstDiscovererStreamInfo* info);
61 GstDiscovererStreamInfo* gst_discoverer_stream_info_get_next(GstDiscovererStreamInfo* info);
62 GstCaps*                 gst_discoverer_stream_info_get_caps(GstDiscovererStreamInfo* info);
63 const GstTagList*        gst_discoverer_stream_info_get_tags(GstDiscovererStreamInfo* info);
64 const GstToc*            gst_discoverer_stream_info_get_toc(GstDiscovererStreamInfo* info);
65 const GstStructure*      gst_discoverer_stream_info_get_misc(GstDiscovererStreamInfo* info);
66 const gchar *            gst_discoverer_stream_info_get_stream_type_nick(GstDiscovererStreamInfo* info);
67
68 /**
69  * GstDiscovererContainerInfo:
70  *
71  * #GstDiscovererStreamInfo specific to container streams.
72  */
73 #define GST_TYPE_DISCOVERER_CONTAINER_INFO \
74   (gst_discoverer_container_info_get_type ())
75 #define GST_DISCOVERER_CONTAINER_INFO(obj) \
76   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_CONTAINER_INFO, GstDiscovererContainerInfo))
77 #define GST_IS_DISCOVERER_CONTAINER_INFO(obj) \
78   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_CONTAINER_INFO))
79 typedef struct _GstDiscovererContainerInfo GstDiscovererContainerInfo;
80 typedef GObjectClass GstDiscovererContainerInfoClass;
81
82 GType gst_discoverer_container_info_get_type (void);
83
84 GList *gst_discoverer_container_info_get_streams(GstDiscovererContainerInfo *info);
85
86
87 /**
88  * GstDiscovererAudioInfo:
89  *
90  * #GstDiscovererStreamInfo specific to audio streams.
91  */
92 #define GST_TYPE_DISCOVERER_AUDIO_INFO \
93   (gst_discoverer_audio_info_get_type ())
94 #define GST_DISCOVERER_AUDIO_INFO(obj) \
95   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_AUDIO_INFO, GstDiscovererAudioInfo))
96 #define GST_IS_DISCOVERER_AUDIO_INFO(obj) \
97   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_AUDIO_INFO))
98 typedef struct _GstDiscovererAudioInfo GstDiscovererAudioInfo;
99 typedef GObjectClass GstDiscovererAudioInfoClass;
100
101 GType gst_discoverer_audio_info_get_type (void);
102
103 guint gst_discoverer_audio_info_get_channels(const GstDiscovererAudioInfo* info);
104 guint gst_discoverer_audio_info_get_sample_rate(const GstDiscovererAudioInfo* info);
105 guint gst_discoverer_audio_info_get_depth(const GstDiscovererAudioInfo* info);
106 guint gst_discoverer_audio_info_get_bitrate(const GstDiscovererAudioInfo* info);
107 guint gst_discoverer_audio_info_get_max_bitrate(const GstDiscovererAudioInfo* info);
108 const gchar * gst_discoverer_audio_info_get_language(const GstDiscovererAudioInfo* info);
109
110 /**
111  * GstDiscovererVideoInfo:
112  *
113  * #GstDiscovererStreamInfo specific to video streams (this includes images).
114  */
115 #define GST_TYPE_DISCOVERER_VIDEO_INFO \
116   (gst_discoverer_video_info_get_type ())
117 #define GST_DISCOVERER_VIDEO_INFO(obj) \
118   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_VIDEO_INFO, GstDiscovererVideoInfo))
119 #define GST_IS_DISCOVERER_VIDEO_INFO(obj) \
120   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_VIDEO_INFO))
121 typedef struct _GstDiscovererVideoInfo GstDiscovererVideoInfo;
122 typedef GObjectClass GstDiscovererVideoInfoClass;
123 GType gst_discoverer_video_info_get_type (void);
124
125 guint           gst_discoverer_video_info_get_width(const GstDiscovererVideoInfo* info);
126 guint           gst_discoverer_video_info_get_height(const GstDiscovererVideoInfo* info);
127 guint           gst_discoverer_video_info_get_depth(const GstDiscovererVideoInfo* info);
128 guint           gst_discoverer_video_info_get_framerate_num(const GstDiscovererVideoInfo* info);
129 guint           gst_discoverer_video_info_get_framerate_denom(const GstDiscovererVideoInfo* info);
130 guint           gst_discoverer_video_info_get_par_num(const GstDiscovererVideoInfo* info);
131 guint           gst_discoverer_video_info_get_par_denom(const GstDiscovererVideoInfo* info);
132 gboolean        gst_discoverer_video_info_is_interlaced(const GstDiscovererVideoInfo* info);
133 guint           gst_discoverer_video_info_get_bitrate(const GstDiscovererVideoInfo* info);
134 guint           gst_discoverer_video_info_get_max_bitrate(const GstDiscovererVideoInfo* info);
135 gboolean        gst_discoverer_video_info_is_image(const GstDiscovererVideoInfo* info);
136
137 /**
138  * GstDiscovererSubtitleInfo:
139  *
140  * #GstDiscovererStreamInfo specific to subtitle streams (this includes text and
141  * image based ones).
142  */
143 #define GST_TYPE_DISCOVERER_SUBTITLE_INFO \
144   (gst_discoverer_subtitle_info_get_type ())
145 #define GST_DISCOVERER_SUBTITLE_INFO(obj) \
146   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_SUBTITLE_INFO, GstDiscovererSubtitleInfo))
147 #define GST_IS_DISCOVERER_SUBTITLE_INFO(obj) \
148   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_SUBTITLE_INFO))
149 typedef struct _GstDiscovererSubtitleInfo GstDiscovererSubtitleInfo;
150 typedef GObjectClass GstDiscovererSubtitleInfoClass;
151 GType gst_discoverer_subtitle_info_get_type (void);
152
153 const gchar *   gst_discoverer_subtitle_info_get_language(const GstDiscovererSubtitleInfo* info);
154
155 /**
156  * GstDiscovererResult:
157  * @GST_DISCOVERER_OK: The discovery was successful
158  * @GST_DISCOVERER_URI_INVALID: the URI is invalid
159  * @GST_DISCOVERER_ERROR: an error happened and the GError is set
160  * @GST_DISCOVERER_TIMEOUT: the discovery timed-out
161  * @GST_DISCOVERER_BUSY: the discoverer was already discovering a file
162  * @GST_DISCOVERER_MISSING_PLUGINS: Some plugins are missing for full discovery
163  *
164  * Result values for the discovery process.
165  */
166 typedef enum {
167   GST_DISCOVERER_OK               = 0,
168   GST_DISCOVERER_URI_INVALID      = 1,
169   GST_DISCOVERER_ERROR            = 2,
170   GST_DISCOVERER_TIMEOUT          = 3,
171   GST_DISCOVERER_BUSY             = 4,
172   GST_DISCOVERER_MISSING_PLUGINS  = 5
173 } GstDiscovererResult;
174
175
176 /**
177  * GstDiscovererInfo:
178  *
179  * Structure containing the information of a URI analyzed by #GstDiscoverer.
180  */
181 typedef struct _GstDiscovererInfo GstDiscovererInfo;
182
183 #define GST_TYPE_DISCOVERER_INFO \
184   (gst_discoverer_info_get_type ())
185 #define GST_DISCOVERER_INFO(obj) \
186   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_INFO, GstDiscovererInfo))
187 #define GST_IS_DISCOVERER_INFO(obj) \
188   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_INFO))
189 typedef GObjectClass GstDiscovererInfoClass;
190 GType gst_discoverer_info_get_type (void);
191
192 #define gst_discoverer_info_unref(info) (g_object_unref((GObject*)info))
193 #define gst_discoverer_info_ref(info) (g_object_ref((Gbject*)info))
194
195 GstDiscovererInfo*        gst_discoverer_info_copy (GstDiscovererInfo * ptr);
196
197 const gchar*              gst_discoverer_info_get_uri(const GstDiscovererInfo* info);
198 GstDiscovererResult       gst_discoverer_info_get_result(const GstDiscovererInfo* info);
199 GstDiscovererStreamInfo*  gst_discoverer_info_get_stream_info(GstDiscovererInfo* info);
200 GList*                    gst_discoverer_info_get_stream_list(GstDiscovererInfo* info);
201 GstClockTime              gst_discoverer_info_get_duration(const GstDiscovererInfo* info);
202 gboolean                  gst_discoverer_info_get_seekable(const GstDiscovererInfo* info);
203 const GstStructure*       gst_discoverer_info_get_misc(const GstDiscovererInfo* info);
204 const GstTagList*         gst_discoverer_info_get_tags(const GstDiscovererInfo* info); 
205 const GstToc*             gst_discoverer_info_get_toc(const GstDiscovererInfo* info);
206
207 GList *                   gst_discoverer_info_get_streams (GstDiscovererInfo *info,
208                                                            GType streamtype);
209 GList *                   gst_discoverer_info_get_audio_streams (GstDiscovererInfo *info);
210 GList *                   gst_discoverer_info_get_video_streams (GstDiscovererInfo *info);
211 GList *                   gst_discoverer_info_get_subtitle_streams (GstDiscovererInfo *info);
212 GList *                   gst_discoverer_info_get_container_streams (GstDiscovererInfo *info);
213
214 void                      gst_discoverer_stream_info_list_free (GList *infos);
215
216 #define GST_TYPE_DISCOVERER \
217   (gst_discoverer_get_type())
218 #define GST_DISCOVERER(obj) \
219   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER,GstDiscoverer))
220 #define GST_DISCOVERER_CLASS(klass) \
221   (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DISCOVERER,GstDiscovererClass))
222 #define GST_IS_DISCOVERER(obj) \
223   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER))
224 #define GST_IS_DISCOVERER_CLASS(klass) \
225   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DISCOVERER))
226
227 typedef struct _GstDiscoverer GstDiscoverer;
228 typedef struct _GstDiscovererClass GstDiscovererClass;
229 typedef struct _GstDiscovererPrivate GstDiscovererPrivate;
230
231 /**
232  * GstDiscoverer:
233  *
234  * The #GstDiscoverer structure.
235  **/
236 struct _GstDiscoverer {
237   GObject parent;
238
239   /*< private >*/
240   GstDiscovererPrivate *priv;
241
242   gpointer _reserved[GST_PADDING];
243 };
244
245 struct _GstDiscovererClass {
246   GObjectClass parentclass;
247
248   /* signals */
249   void        (*finished)        (GstDiscoverer *discoverer);
250   void        (*starting)        (GstDiscoverer *discoverer);
251   void        (*discovered)      (GstDiscoverer *discoverer,
252                                   GstDiscovererInfo *info,
253                                   const GError *err);
254   void        (*source_setup)    (GstDiscoverer *discoverer,
255                                   GstElement *source);
256
257   gpointer _reserved[GST_PADDING];
258 };
259
260 GType          gst_discoverer_get_type (void);
261 GstDiscoverer *gst_discoverer_new (GstClockTime timeout, GError **err);
262
263 /* Asynchronous API */
264 void           gst_discoverer_start (GstDiscoverer *discoverer);
265 void           gst_discoverer_stop (GstDiscoverer *discoverer);
266 gboolean       gst_discoverer_discover_uri_async (GstDiscoverer *discoverer,
267                                                   const gchar *uri);
268
269 /* Synchronous API */
270 GstDiscovererInfo *
271 gst_discoverer_discover_uri (GstDiscoverer * discoverer,
272                              const gchar * uri,
273                              GError ** err);
274
275 G_END_DECLS
276
277 #endif /* _GST_DISCOVERER_H */