2 * Copyright (C) 2009 Edward Hervey <edward.hervey@collabora.co.uk>
3 * 2009 Nokia Corporation
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.
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.
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.
21 #ifndef _GST_DISCOVERER_H_
22 #define _GST_DISCOVERER_H_
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;
38 GType gst_discoverer_stream_info_get_type (void);
41 * GstDiscovererStreamInfo:
43 * Base structure for information concerning a media stream. Depending on the
44 * stream type, one can find more media-specific information in
45 * #GstDiscovererAudioInfo, #GstDiscovererVideoInfo, and
46 * #GstDiscovererContainerInfo.
48 * The #GstDiscovererStreamInfo represents the topology of the stream. Siblings
49 * can be iterated over with gst_discoverer_stream_info_get_next() and
50 * gst_discoverer_stream_info_get_previous(). Children (sub-streams) of a
51 * stream can be accessed using the #GstDiscovererContainerInfo API.
53 * As a simple example, if you run #GstDiscoverer on an AVI file with one audio
54 * and one video stream, you will get a #GstDiscovererContainerInfo
55 * corresponding to the AVI container, which in turn will have a
56 * #GstDiscovererAudioInfo sub-stream and a #GstDiscovererVideoInfo sub-stream
57 * for the audio and video streams respectively.
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))
63 GstDiscovererStreamInfo* gst_discoverer_stream_info_get_previous(GstDiscovererStreamInfo* info);
66 GstDiscovererStreamInfo* gst_discoverer_stream_info_get_next(GstDiscovererStreamInfo* info);
69 GstCaps* gst_discoverer_stream_info_get_caps(GstDiscovererStreamInfo* info);
72 const GstTagList* gst_discoverer_stream_info_get_tags(GstDiscovererStreamInfo* info);
75 const GstToc* gst_discoverer_stream_info_get_toc(GstDiscovererStreamInfo* info);
78 const gchar* gst_discoverer_stream_info_get_stream_id(GstDiscovererStreamInfo* info);
81 const GstStructure* gst_discoverer_stream_info_get_misc(GstDiscovererStreamInfo* info);
84 const gchar * gst_discoverer_stream_info_get_stream_type_nick(GstDiscovererStreamInfo* info);
87 * GstDiscovererContainerInfo:
89 * #GstDiscovererStreamInfo specific to container streams.
91 #define GST_TYPE_DISCOVERER_CONTAINER_INFO \
92 (gst_discoverer_container_info_get_type ())
93 #define GST_DISCOVERER_CONTAINER_INFO(obj) \
94 (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_CONTAINER_INFO, GstDiscovererContainerInfo))
95 #define GST_IS_DISCOVERER_CONTAINER_INFO(obj) \
96 (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_CONTAINER_INFO))
97 typedef struct _GstDiscovererContainerInfo GstDiscovererContainerInfo;
98 typedef GObjectClass GstDiscovererContainerInfoClass;
101 GType gst_discoverer_container_info_get_type (void);
104 GList *gst_discoverer_container_info_get_streams(GstDiscovererContainerInfo *info);
108 * GstDiscovererAudioInfo:
110 * #GstDiscovererStreamInfo specific to audio streams.
112 #define GST_TYPE_DISCOVERER_AUDIO_INFO \
113 (gst_discoverer_audio_info_get_type ())
114 #define GST_DISCOVERER_AUDIO_INFO(obj) \
115 (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_AUDIO_INFO, GstDiscovererAudioInfo))
116 #define GST_IS_DISCOVERER_AUDIO_INFO(obj) \
117 (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_AUDIO_INFO))
118 typedef struct _GstDiscovererAudioInfo GstDiscovererAudioInfo;
119 typedef GObjectClass GstDiscovererAudioInfoClass;
122 GType gst_discoverer_audio_info_get_type (void);
125 guint gst_discoverer_audio_info_get_channels(const GstDiscovererAudioInfo* info);
128 guint64 gst_discoverer_audio_info_get_channel_mask(const GstDiscovererAudioInfo* info);
131 guint gst_discoverer_audio_info_get_sample_rate(const GstDiscovererAudioInfo* info);
134 guint gst_discoverer_audio_info_get_depth(const GstDiscovererAudioInfo* info);
137 guint gst_discoverer_audio_info_get_bitrate(const GstDiscovererAudioInfo* info);
140 guint gst_discoverer_audio_info_get_max_bitrate(const GstDiscovererAudioInfo* info);
143 const gchar * gst_discoverer_audio_info_get_language(const GstDiscovererAudioInfo* info);
146 * GstDiscovererVideoInfo:
148 * #GstDiscovererStreamInfo specific to video streams (this includes images).
150 #define GST_TYPE_DISCOVERER_VIDEO_INFO \
151 (gst_discoverer_video_info_get_type ())
152 #define GST_DISCOVERER_VIDEO_INFO(obj) \
153 (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_VIDEO_INFO, GstDiscovererVideoInfo))
154 #define GST_IS_DISCOVERER_VIDEO_INFO(obj) \
155 (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_VIDEO_INFO))
156 typedef struct _GstDiscovererVideoInfo GstDiscovererVideoInfo;
157 typedef GObjectClass GstDiscovererVideoInfoClass;
160 GType gst_discoverer_video_info_get_type (void);
163 guint gst_discoverer_video_info_get_width(const GstDiscovererVideoInfo* info);
166 guint gst_discoverer_video_info_get_height(const GstDiscovererVideoInfo* info);
169 guint gst_discoverer_video_info_get_depth(const GstDiscovererVideoInfo* info);
172 guint gst_discoverer_video_info_get_framerate_num(const GstDiscovererVideoInfo* info);
175 guint gst_discoverer_video_info_get_framerate_denom(const GstDiscovererVideoInfo* info);
178 guint gst_discoverer_video_info_get_par_num(const GstDiscovererVideoInfo* info);
181 guint gst_discoverer_video_info_get_par_denom(const GstDiscovererVideoInfo* info);
184 gboolean gst_discoverer_video_info_is_interlaced(const GstDiscovererVideoInfo* info);
187 guint gst_discoverer_video_info_get_bitrate(const GstDiscovererVideoInfo* info);
190 guint gst_discoverer_video_info_get_max_bitrate(const GstDiscovererVideoInfo* info);
193 gboolean gst_discoverer_video_info_is_image(const GstDiscovererVideoInfo* info);
196 * GstDiscovererSubtitleInfo:
198 * #GstDiscovererStreamInfo specific to subtitle streams (this includes text and
201 #define GST_TYPE_DISCOVERER_SUBTITLE_INFO \
202 (gst_discoverer_subtitle_info_get_type ())
203 #define GST_DISCOVERER_SUBTITLE_INFO(obj) \
204 (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_SUBTITLE_INFO, GstDiscovererSubtitleInfo))
205 #define GST_IS_DISCOVERER_SUBTITLE_INFO(obj) \
206 (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_SUBTITLE_INFO))
207 typedef struct _GstDiscovererSubtitleInfo GstDiscovererSubtitleInfo;
208 typedef GObjectClass GstDiscovererSubtitleInfoClass;
211 GType gst_discoverer_subtitle_info_get_type (void);
214 const gchar * gst_discoverer_subtitle_info_get_language(const GstDiscovererSubtitleInfo* info);
217 * GstDiscovererResult:
218 * @GST_DISCOVERER_OK: The discovery was successful
219 * @GST_DISCOVERER_URI_INVALID: the URI is invalid
220 * @GST_DISCOVERER_ERROR: an error happened and the GError is set
221 * @GST_DISCOVERER_TIMEOUT: the discovery timed-out
222 * @GST_DISCOVERER_BUSY: the discoverer was already discovering a file
223 * @GST_DISCOVERER_MISSING_PLUGINS: Some plugins are missing for full discovery
225 * Result values for the discovery process.
228 GST_DISCOVERER_OK = 0,
229 GST_DISCOVERER_URI_INVALID = 1,
230 GST_DISCOVERER_ERROR = 2,
231 GST_DISCOVERER_TIMEOUT = 3,
232 GST_DISCOVERER_BUSY = 4,
233 GST_DISCOVERER_MISSING_PLUGINS = 5
234 } GstDiscovererResult;
237 * GstDiscovererSerializeFlags:
238 * @GST_DISCOVERER_SERIALIZE_BASIC: Serialize only basic information, excluding
239 * caps, tags and miscellaneous information
240 * @GST_DISCOVERER_SERIALIZE_CAPS: Serialize the caps for each stream
241 * @GST_DISCOVERER_SERIALIZE_TAGS: Serialize the tags for each stream
242 * @GST_DISCOVERER_SERIALIZE_MISC: Serialize miscellaneous information for each stream
243 * @GST_DISCOVERER_SERIALIZE_ALL: Serialize all the available info, including
244 * caps, tags and miscellaneous information
246 * You can use these flags to control what is serialized by
247 * gst_discoverer_info_to_variant()
253 GST_DISCOVERER_SERIALIZE_BASIC = 0,
254 GST_DISCOVERER_SERIALIZE_CAPS = 1 << 0,
255 GST_DISCOVERER_SERIALIZE_TAGS = 1 << 1,
256 GST_DISCOVERER_SERIALIZE_MISC = 1 << 2,
257 GST_DISCOVERER_SERIALIZE_ALL = GST_DISCOVERER_SERIALIZE_CAPS | GST_DISCOVERER_SERIALIZE_TAGS | GST_DISCOVERER_SERIALIZE_MISC
258 } GstDiscovererSerializeFlags;
263 * Structure containing the information of a URI analyzed by #GstDiscoverer.
265 typedef struct _GstDiscovererInfo GstDiscovererInfo;
267 #define GST_TYPE_DISCOVERER_INFO \
268 (gst_discoverer_info_get_type ())
269 #define GST_DISCOVERER_INFO(obj) \
270 (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_INFO, GstDiscovererInfo))
271 #define GST_IS_DISCOVERER_INFO(obj) \
272 (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_INFO))
273 typedef GObjectClass GstDiscovererInfoClass;
276 GType gst_discoverer_info_get_type (void);
278 #define gst_discoverer_info_unref(info) (g_object_unref((GObject*)info))
279 #define gst_discoverer_info_ref(info) (g_object_ref((GObject*)info))
282 GstDiscovererInfo* gst_discoverer_info_copy (GstDiscovererInfo * ptr);
285 const gchar* gst_discoverer_info_get_uri(const GstDiscovererInfo* info);
288 GstDiscovererResult gst_discoverer_info_get_result(const GstDiscovererInfo* info);
291 GstDiscovererStreamInfo* gst_discoverer_info_get_stream_info(GstDiscovererInfo* info);
294 GList* gst_discoverer_info_get_stream_list(GstDiscovererInfo* info);
297 GstClockTime gst_discoverer_info_get_duration(const GstDiscovererInfo* info);
300 gboolean gst_discoverer_info_get_seekable(const GstDiscovererInfo* info);
303 const GstStructure* gst_discoverer_info_get_misc(const GstDiscovererInfo* info);
306 const GstTagList* gst_discoverer_info_get_tags(const GstDiscovererInfo* info);
308 const GstToc* gst_discoverer_info_get_toc(const GstDiscovererInfo* info);
311 const gchar** gst_discoverer_info_get_missing_elements_installer_details(const GstDiscovererInfo* info);
314 GList * gst_discoverer_info_get_streams (GstDiscovererInfo *info,
318 GList * gst_discoverer_info_get_audio_streams (GstDiscovererInfo *info);
321 GList * gst_discoverer_info_get_video_streams (GstDiscovererInfo *info);
324 GList * gst_discoverer_info_get_subtitle_streams (GstDiscovererInfo *info);
327 GList * gst_discoverer_info_get_container_streams (GstDiscovererInfo *info);
330 GVariant * gst_discoverer_info_to_variant (GstDiscovererInfo *info,
331 GstDiscovererSerializeFlags flags);
334 GstDiscovererInfo * gst_discoverer_info_from_variant (GVariant *variant);
337 void gst_discoverer_stream_info_list_free (GList *infos);
339 #define GST_TYPE_DISCOVERER \
340 (gst_discoverer_get_type())
341 #define GST_DISCOVERER(obj) \
342 (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER,GstDiscoverer))
343 #define GST_DISCOVERER_CLASS(klass) \
344 (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DISCOVERER,GstDiscovererClass))
345 #define GST_IS_DISCOVERER(obj) \
346 (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER))
347 #define GST_IS_DISCOVERER_CLASS(klass) \
348 (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DISCOVERER))
350 typedef struct _GstDiscoverer GstDiscoverer;
351 typedef struct _GstDiscovererClass GstDiscovererClass;
352 typedef struct _GstDiscovererPrivate GstDiscovererPrivate;
357 * The #GstDiscoverer structure.
359 struct _GstDiscoverer {
363 GstDiscovererPrivate *priv;
365 gpointer _reserved[GST_PADDING];
368 struct _GstDiscovererClass {
369 GObjectClass parentclass;
372 void (*finished) (GstDiscoverer *discoverer);
373 void (*starting) (GstDiscoverer *discoverer);
374 void (*discovered) (GstDiscoverer *discoverer,
375 GstDiscovererInfo *info,
377 void (*source_setup) (GstDiscoverer *discoverer,
380 gpointer _reserved[GST_PADDING];
384 GType gst_discoverer_get_type (void);
387 GstDiscoverer *gst_discoverer_new (GstClockTime timeout, GError **err);
389 /* Asynchronous API */
392 void gst_discoverer_start (GstDiscoverer *discoverer);
395 void gst_discoverer_stop (GstDiscoverer *discoverer);
398 gboolean gst_discoverer_discover_uri_async (GstDiscoverer *discoverer,
401 /* Synchronous API */
405 gst_discoverer_discover_uri (GstDiscoverer * discoverer,
409 #ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
410 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDiscoverer, gst_object_unref)
413 #ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
414 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDiscovererAudioInfo, gst_object_unref)
417 #ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
418 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDiscovererContainerInfo, gst_object_unref)
421 #ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
422 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDiscovererInfo, gst_object_unref)
425 #ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
426 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDiscovererStreamInfo, gst_object_unref)
429 #ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
430 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDiscovererSubtitleInfo, gst_object_unref)
433 #ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
434 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDiscovererVideoInfo, gst_object_unref)
439 #endif /* _GST_DISCOVERER_H */