/* 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>
#include <gst/pbutils/pbutils-prelude.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_PBUTILS_API
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_PBUTILS_API
GstDiscovererStreamInfo* gst_discoverer_stream_info_get_previous(GstDiscovererStreamInfo* info);

GST_PBUTILS_API
GstDiscovererStreamInfo* gst_discoverer_stream_info_get_next(GstDiscovererStreamInfo* info);

GST_PBUTILS_API
GstCaps*                 gst_discoverer_stream_info_get_caps(GstDiscovererStreamInfo* info);

GST_PBUTILS_API
const GstTagList*        gst_discoverer_stream_info_get_tags(GstDiscovererStreamInfo* info);

GST_PBUTILS_API
const GstToc*            gst_discoverer_stream_info_get_toc(GstDiscovererStreamInfo* info);

GST_PBUTILS_API
const gchar*             gst_discoverer_stream_info_get_stream_id(GstDiscovererStreamInfo* info);

GST_PBUTILS_API
const GstStructure*      gst_discoverer_stream_info_get_misc(GstDiscovererStreamInfo* info);

GST_PBUTILS_API
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_PBUTILS_API
GType gst_discoverer_container_info_get_type (void);

GST_PBUTILS_API
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_PBUTILS_API
GType gst_discoverer_audio_info_get_type (void);

GST_PBUTILS_API
guint gst_discoverer_audio_info_get_channels(const GstDiscovererAudioInfo* info);

GST_PBUTILS_API
guint64 gst_discoverer_audio_info_get_channel_mask(const GstDiscovererAudioInfo* info);

GST_PBUTILS_API
guint gst_discoverer_audio_info_get_sample_rate(const GstDiscovererAudioInfo* info);

GST_PBUTILS_API
guint gst_discoverer_audio_info_get_depth(const GstDiscovererAudioInfo* info);

GST_PBUTILS_API
guint gst_discoverer_audio_info_get_bitrate(const GstDiscovererAudioInfo* info);

GST_PBUTILS_API
guint gst_discoverer_audio_info_get_max_bitrate(const GstDiscovererAudioInfo* info);

GST_PBUTILS_API
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_PBUTILS_API
GType gst_discoverer_video_info_get_type (void);

GST_PBUTILS_API
guint           gst_discoverer_video_info_get_width(const GstDiscovererVideoInfo* info);

GST_PBUTILS_API
guint           gst_discoverer_video_info_get_height(const GstDiscovererVideoInfo* info);

GST_PBUTILS_API
guint           gst_discoverer_video_info_get_depth(const GstDiscovererVideoInfo* info);

GST_PBUTILS_API
guint           gst_discoverer_video_info_get_framerate_num(const GstDiscovererVideoInfo* info);

GST_PBUTILS_API
guint           gst_discoverer_video_info_get_framerate_denom(const GstDiscovererVideoInfo* info);

GST_PBUTILS_API
guint           gst_discoverer_video_info_get_par_num(const GstDiscovererVideoInfo* info);

GST_PBUTILS_API
guint           gst_discoverer_video_info_get_par_denom(const GstDiscovererVideoInfo* info);

GST_PBUTILS_API
gboolean        gst_discoverer_video_info_is_interlaced(const GstDiscovererVideoInfo* info);

GST_PBUTILS_API
guint           gst_discoverer_video_info_get_bitrate(const GstDiscovererVideoInfo* info);

GST_PBUTILS_API
guint           gst_discoverer_video_info_get_max_bitrate(const GstDiscovererVideoInfo* info);

GST_PBUTILS_API
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_PBUTILS_API
GType gst_discoverer_subtitle_info_get_type (void);

GST_PBUTILS_API
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_PBUTILS_API
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_PBUTILS_API
GstDiscovererInfo*        gst_discoverer_info_copy (GstDiscovererInfo * ptr);

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

GST_PBUTILS_API
GstDiscovererResult       gst_discoverer_info_get_result(const GstDiscovererInfo* info);

GST_PBUTILS_API
GstDiscovererStreamInfo*  gst_discoverer_info_get_stream_info(GstDiscovererInfo* info);

GST_PBUTILS_API
GList*                    gst_discoverer_info_get_stream_list(GstDiscovererInfo* info);

GST_PBUTILS_API
GstClockTime              gst_discoverer_info_get_duration(const GstDiscovererInfo* info);

GST_PBUTILS_API
gboolean                  gst_discoverer_info_get_seekable(const GstDiscovererInfo* info);

GST_PBUTILS_API
gboolean                  gst_discoverer_info_get_live(const GstDiscovererInfo* info);

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

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

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

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

GST_PBUTILS_API
GList *                   gst_discoverer_info_get_audio_streams (GstDiscovererInfo *info);

GST_PBUTILS_API
GList *                   gst_discoverer_info_get_video_streams (GstDiscovererInfo *info);

GST_PBUTILS_API
GList *                   gst_discoverer_info_get_subtitle_streams (GstDiscovererInfo *info);

GST_PBUTILS_API
GList *                   gst_discoverer_info_get_container_streams (GstDiscovererInfo *info);

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

GST_PBUTILS_API
GstDiscovererInfo *       gst_discoverer_info_from_variant (GVariant *variant);

GST_PBUTILS_API
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_PBUTILS_API
GType          gst_discoverer_get_type (void);

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

/* Asynchronous API */

GST_PBUTILS_API
void           gst_discoverer_start (GstDiscoverer *discoverer);

GST_PBUTILS_API
void           gst_discoverer_stop (GstDiscoverer *discoverer);

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

/* Synchronous API */

GST_PBUTILS_API
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 */
