/* GStreamer
 * Copyright (C) 2009 Edward Hervey <edward.hervey@collabora.co.uk>
 *               2009 Nokia Corporation
 *
 * 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
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifndef _GST_DISCOVERER_H_
#define _GST_DISCOVERER_H_

#include <gst/gst.h>

G_BEGIN_DECLS

#define GST_TYPE_DISCOVERER_STREAM_INFO \
  (gst_discoverer_stream_info_get_type ())
#define GST_DISCOVERER_STREAM_INFO(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_STREAM_INFO, GstDiscovererStreamInfo))
#define GST_IS_DISCOVERER_STREAM_INFO(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_STREAM_INFO))
typedef struct _GstDiscovererStreamInfo GstDiscovererStreamInfo;
typedef GObjectClass GstDiscovererStreamInfoClass;

GST_EXPORT
GType gst_discoverer_stream_info_get_type (void);

/**
 * GstDiscovererStreamInfo:
 *
 * Base structure for information concerning a media stream. Depending on the
 * stream type, one can find more media-specific information in
 * #GstDiscovererAudioInfo, #GstDiscovererVideoInfo, and
 * #GstDiscovererContainerInfo.
 *
 * The #GstDiscovererStreamInfo represents the topology of the stream. Siblings
 * can be iterated over with gst_discoverer_stream_info_get_next() and
 * gst_discoverer_stream_info_get_previous(). Children (sub-streams) of a
 * stream can be accessed using the #GstDiscovererContainerInfo API.
 *
 * As a simple example, if you run #GstDiscoverer on an AVI file with one audio
 * and one video stream, you will get a #GstDiscovererContainerInfo
 * corresponding to the AVI container, which in turn will have a
 * #GstDiscovererAudioInfo sub-stream and a #GstDiscovererVideoInfo sub-stream
 * for the audio and video streams respectively.
 */
#define gst_discoverer_stream_info_ref(info) ((GstDiscovererStreamInfo*) g_object_ref((GObject*) info))
#define gst_discoverer_stream_info_unref(info) (g_object_unref((GObject*) info))

GST_EXPORT
GstDiscovererStreamInfo* gst_discoverer_stream_info_get_previous(GstDiscovererStreamInfo* info);

GST_EXPORT
GstDiscovererStreamInfo* gst_discoverer_stream_info_get_next(GstDiscovererStreamInfo* info);

GST_EXPORT
GstCaps*                 gst_discoverer_stream_info_get_caps(GstDiscovererStreamInfo* info);

GST_EXPORT
const GstTagList*        gst_discoverer_stream_info_get_tags(GstDiscovererStreamInfo* info);

GST_EXPORT
const GstToc*            gst_discoverer_stream_info_get_toc(GstDiscovererStreamInfo* info);

GST_EXPORT
const gchar*             gst_discoverer_stream_info_get_stream_id(GstDiscovererStreamInfo* info);

GST_EXPORT
const GstStructure*      gst_discoverer_stream_info_get_misc(GstDiscovererStreamInfo* info);

GST_EXPORT
const gchar *            gst_discoverer_stream_info_get_stream_type_nick(GstDiscovererStreamInfo* info);

/**
 * GstDiscovererContainerInfo:
 *
 * #GstDiscovererStreamInfo specific to container streams.
 */
#define GST_TYPE_DISCOVERER_CONTAINER_INFO \
  (gst_discoverer_container_info_get_type ())
#define GST_DISCOVERER_CONTAINER_INFO(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_CONTAINER_INFO, GstDiscovererContainerInfo))
#define GST_IS_DISCOVERER_CONTAINER_INFO(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_CONTAINER_INFO))
typedef struct _GstDiscovererContainerInfo GstDiscovererContainerInfo;
typedef GObjectClass GstDiscovererContainerInfoClass;

GST_EXPORT
GType gst_discoverer_container_info_get_type (void);

GST_EXPORT
GList *gst_discoverer_container_info_get_streams(GstDiscovererContainerInfo *info);


/**
 * GstDiscovererAudioInfo:
 *
 * #GstDiscovererStreamInfo specific to audio streams.
 */
#define GST_TYPE_DISCOVERER_AUDIO_INFO \
  (gst_discoverer_audio_info_get_type ())
#define GST_DISCOVERER_AUDIO_INFO(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_AUDIO_INFO, GstDiscovererAudioInfo))
#define GST_IS_DISCOVERER_AUDIO_INFO(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_AUDIO_INFO))
typedef struct _GstDiscovererAudioInfo GstDiscovererAudioInfo;
typedef GObjectClass GstDiscovererAudioInfoClass;

GST_EXPORT
GType gst_discoverer_audio_info_get_type (void);

GST_EXPORT
guint gst_discoverer_audio_info_get_channels(const GstDiscovererAudioInfo* info);

GST_EXPORT
guint64 gst_discoverer_audio_info_get_channel_mask(const GstDiscovererAudioInfo* info);

GST_EXPORT
guint gst_discoverer_audio_info_get_sample_rate(const GstDiscovererAudioInfo* info);

GST_EXPORT
guint gst_discoverer_audio_info_get_depth(const GstDiscovererAudioInfo* info);

GST_EXPORT
guint gst_discoverer_audio_info_get_bitrate(const GstDiscovererAudioInfo* info);

GST_EXPORT
guint gst_discoverer_audio_info_get_max_bitrate(const GstDiscovererAudioInfo* info);

GST_EXPORT
const gchar * gst_discoverer_audio_info_get_language(const GstDiscovererAudioInfo* info);

/**
 * GstDiscovererVideoInfo:
 *
 * #GstDiscovererStreamInfo specific to video streams (this includes images).
 */
#define GST_TYPE_DISCOVERER_VIDEO_INFO \
  (gst_discoverer_video_info_get_type ())
#define GST_DISCOVERER_VIDEO_INFO(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_VIDEO_INFO, GstDiscovererVideoInfo))
#define GST_IS_DISCOVERER_VIDEO_INFO(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_VIDEO_INFO))
typedef struct _GstDiscovererVideoInfo GstDiscovererVideoInfo;
typedef GObjectClass GstDiscovererVideoInfoClass;

GST_EXPORT
GType gst_discoverer_video_info_get_type (void);

GST_EXPORT
guint           gst_discoverer_video_info_get_width(const GstDiscovererVideoInfo* info);

GST_EXPORT
guint           gst_discoverer_video_info_get_height(const GstDiscovererVideoInfo* info);

GST_EXPORT
guint           gst_discoverer_video_info_get_depth(const GstDiscovererVideoInfo* info);

GST_EXPORT
guint           gst_discoverer_video_info_get_framerate_num(const GstDiscovererVideoInfo* info);

GST_EXPORT
guint           gst_discoverer_video_info_get_framerate_denom(const GstDiscovererVideoInfo* info);

GST_EXPORT
guint           gst_discoverer_video_info_get_par_num(const GstDiscovererVideoInfo* info);

GST_EXPORT
guint           gst_discoverer_video_info_get_par_denom(const GstDiscovererVideoInfo* info);

GST_EXPORT
gboolean        gst_discoverer_video_info_is_interlaced(const GstDiscovererVideoInfo* info);

GST_EXPORT
guint           gst_discoverer_video_info_get_bitrate(const GstDiscovererVideoInfo* info);

GST_EXPORT
guint           gst_discoverer_video_info_get_max_bitrate(const GstDiscovererVideoInfo* info);

GST_EXPORT
gboolean        gst_discoverer_video_info_is_image(const GstDiscovererVideoInfo* info);

/**
 * GstDiscovererSubtitleInfo:
 *
 * #GstDiscovererStreamInfo specific to subtitle streams (this includes text and
 * image based ones).
 */
#define GST_TYPE_DISCOVERER_SUBTITLE_INFO \
  (gst_discoverer_subtitle_info_get_type ())
#define GST_DISCOVERER_SUBTITLE_INFO(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_SUBTITLE_INFO, GstDiscovererSubtitleInfo))
#define GST_IS_DISCOVERER_SUBTITLE_INFO(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_SUBTITLE_INFO))
typedef struct _GstDiscovererSubtitleInfo GstDiscovererSubtitleInfo;
typedef GObjectClass GstDiscovererSubtitleInfoClass;

GST_EXPORT
GType gst_discoverer_subtitle_info_get_type (void);

GST_EXPORT
const gchar *   gst_discoverer_subtitle_info_get_language(const GstDiscovererSubtitleInfo* info);

/**
 * GstDiscovererResult:
 * @GST_DISCOVERER_OK: The discovery was successful
 * @GST_DISCOVERER_URI_INVALID: the URI is invalid
 * @GST_DISCOVERER_ERROR: an error happened and the GError is set
 * @GST_DISCOVERER_TIMEOUT: the discovery timed-out
 * @GST_DISCOVERER_BUSY: the discoverer was already discovering a file
 * @GST_DISCOVERER_MISSING_PLUGINS: Some plugins are missing for full discovery
 *
 * Result values for the discovery process.
 */
typedef enum {
  GST_DISCOVERER_OK               = 0,
  GST_DISCOVERER_URI_INVALID      = 1,
  GST_DISCOVERER_ERROR            = 2,
  GST_DISCOVERER_TIMEOUT          = 3,
  GST_DISCOVERER_BUSY             = 4,
  GST_DISCOVERER_MISSING_PLUGINS  = 5
} GstDiscovererResult;

/**
 * GstDiscovererSerializeFlags:
 * @GST_DISCOVERER_SERIALIZE_BASIC: Serialize only basic information, excluding
 * caps, tags and miscellaneous information
 * @GST_DISCOVERER_SERIALIZE_CAPS: Serialize the caps for each stream
 * @GST_DISCOVERER_SERIALIZE_TAGS: Serialize the tags for each stream
 * @GST_DISCOVERER_SERIALIZE_MISC: Serialize miscellaneous information for each stream
 * @GST_DISCOVERER_SERIALIZE_ALL: Serialize all the available info, including
 * caps, tags and miscellaneous information
 *
 * You can use these flags to control what is serialized by
 * gst_discoverer_info_to_variant()
 *
 * Since: 1.6
 */

typedef enum {
  GST_DISCOVERER_SERIALIZE_BASIC = 0,
  GST_DISCOVERER_SERIALIZE_CAPS  = 1 << 0,
  GST_DISCOVERER_SERIALIZE_TAGS  = 1 << 1,
  GST_DISCOVERER_SERIALIZE_MISC  = 1 << 2,
  GST_DISCOVERER_SERIALIZE_ALL   = GST_DISCOVERER_SERIALIZE_CAPS | GST_DISCOVERER_SERIALIZE_TAGS | GST_DISCOVERER_SERIALIZE_MISC
} GstDiscovererSerializeFlags;

/**
 * GstDiscovererInfo:
 *
 * Structure containing the information of a URI analyzed by #GstDiscoverer.
 */
typedef struct _GstDiscovererInfo GstDiscovererInfo;

#define GST_TYPE_DISCOVERER_INFO \
  (gst_discoverer_info_get_type ())
#define GST_DISCOVERER_INFO(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER_INFO, GstDiscovererInfo))
#define GST_IS_DISCOVERER_INFO(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER_INFO))
typedef GObjectClass GstDiscovererInfoClass;

GST_EXPORT
GType gst_discoverer_info_get_type (void);

#define gst_discoverer_info_unref(info) (g_object_unref((GObject*)info))
#define gst_discoverer_info_ref(info) (g_object_ref((GObject*)info))

GST_EXPORT
GstDiscovererInfo*        gst_discoverer_info_copy (GstDiscovererInfo * ptr);

GST_EXPORT
const gchar*              gst_discoverer_info_get_uri(const GstDiscovererInfo* info);

GST_EXPORT
GstDiscovererResult       gst_discoverer_info_get_result(const GstDiscovererInfo* info);

GST_EXPORT
GstDiscovererStreamInfo*  gst_discoverer_info_get_stream_info(GstDiscovererInfo* info);

GST_EXPORT
GList*                    gst_discoverer_info_get_stream_list(GstDiscovererInfo* info);

GST_EXPORT
GstClockTime              gst_discoverer_info_get_duration(const GstDiscovererInfo* info);

GST_EXPORT
gboolean                  gst_discoverer_info_get_seekable(const GstDiscovererInfo* info);

GST_EXPORT
gboolean                  gst_discoverer_info_get_live(const GstDiscovererInfo* info);

GST_EXPORT
const GstStructure*       gst_discoverer_info_get_misc(const GstDiscovererInfo* info);

GST_EXPORT
const GstTagList*         gst_discoverer_info_get_tags(const GstDiscovererInfo* info); 
GST_EXPORT
const GstToc*             gst_discoverer_info_get_toc(const GstDiscovererInfo* info);

GST_EXPORT
const gchar**             gst_discoverer_info_get_missing_elements_installer_details(const GstDiscovererInfo* info);

GST_EXPORT
GList *                   gst_discoverer_info_get_streams (GstDiscovererInfo *info,
							   GType streamtype);

GST_EXPORT
GList *                   gst_discoverer_info_get_audio_streams (GstDiscovererInfo *info);

GST_EXPORT
GList *                   gst_discoverer_info_get_video_streams (GstDiscovererInfo *info);

GST_EXPORT
GList *                   gst_discoverer_info_get_subtitle_streams (GstDiscovererInfo *info);

GST_EXPORT
GList *                   gst_discoverer_info_get_container_streams (GstDiscovererInfo *info);

GST_EXPORT
GVariant *                gst_discoverer_info_to_variant (GstDiscovererInfo *info,
                                                          GstDiscovererSerializeFlags flags);

GST_EXPORT
GstDiscovererInfo *       gst_discoverer_info_from_variant (GVariant *variant);

GST_EXPORT
void                      gst_discoverer_stream_info_list_free (GList *infos);

#define GST_TYPE_DISCOVERER \
  (gst_discoverer_get_type())
#define GST_DISCOVERER(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOVERER,GstDiscoverer))
#define GST_DISCOVERER_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DISCOVERER,GstDiscovererClass))
#define GST_IS_DISCOVERER(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOVERER))
#define GST_IS_DISCOVERER_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DISCOVERER))

typedef struct _GstDiscoverer GstDiscoverer;
typedef struct _GstDiscovererClass GstDiscovererClass;
typedef struct _GstDiscovererPrivate GstDiscovererPrivate;

/**
 * GstDiscoverer:
 *
 * The #GstDiscoverer structure.
 **/
struct _GstDiscoverer {
  GObject parent;

  /*< private >*/
  GstDiscovererPrivate *priv;

  gpointer _reserved[GST_PADDING];
};

struct _GstDiscovererClass {
  GObjectClass parentclass;

  /* signals */
  void        (*finished)        (GstDiscoverer *discoverer);
  void        (*starting)        (GstDiscoverer *discoverer);
  void        (*discovered)      (GstDiscoverer *discoverer,
                                  GstDiscovererInfo *info,
				  const GError *err);
  void        (*source_setup)    (GstDiscoverer *discoverer,
                                  GstElement *source);

  gpointer _reserved[GST_PADDING];
};

GST_EXPORT
GType          gst_discoverer_get_type (void);

GST_EXPORT
GstDiscoverer *gst_discoverer_new (GstClockTime timeout, GError **err);

/* Asynchronous API */

GST_EXPORT
void           gst_discoverer_start (GstDiscoverer *discoverer);

GST_EXPORT
void           gst_discoverer_stop (GstDiscoverer *discoverer);

GST_EXPORT
gboolean       gst_discoverer_discover_uri_async (GstDiscoverer *discoverer,
						  const gchar *uri);

/* Synchronous API */

GST_EXPORT
GstDiscovererInfo *
gst_discoverer_discover_uri (GstDiscoverer * discoverer,
			     const gchar * uri,
			     GError ** err);

#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDiscoverer, gst_object_unref)
#endif

#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDiscovererAudioInfo, gst_object_unref)
#endif

#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDiscovererContainerInfo, gst_object_unref)
#endif

#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDiscovererInfo, gst_object_unref)
#endif

#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDiscovererStreamInfo, gst_object_unref)
#endif

#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDiscovererSubtitleInfo, gst_object_unref)
#endif

#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDiscovererVideoInfo, gst_object_unref)
#endif

G_END_DECLS

#endif /* _GST_DISCOVERER_H */
