/* GStreamer encoding profiles library
 * Copyright (C) 2009-2010 Edward Hervey <edward.hervey@collabora.co.uk>
 *           (C) 2009-2010 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_PROFILE_H__
#define __GST_PROFILE_H__

#include <gst/gst.h>

#include <gst/pbutils/pbutils-enumtypes.h>
#include <gst/pbutils/gstdiscoverer.h>

G_BEGIN_DECLS

/**
 * GstEncodingProfile:
 *
 * The opaque base class object for all encoding profiles. This contains generic
 * information like name, description, format and preset.
 */

#define GST_TYPE_ENCODING_PROFILE                       \
  (gst_encoding_profile_get_type ())
#define GST_ENCODING_PROFILE(obj)                       \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ENCODING_PROFILE, GstEncodingProfile))
#define GST_IS_ENCODING_PROFILE(obj)                    \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ENCODING_PROFILE))
typedef struct _GstEncodingProfile GstEncodingProfile;
typedef struct _GstEncodingProfileClass GstEncodingProfileClass;

GST_EXPORT
GType gst_encoding_profile_get_type (void);



/**
 * GstEncodingContainerProfile:
 *
 * Encoding profiles for containers. Keeps track of a list of #GstEncodingProfile
 */
#define GST_TYPE_ENCODING_CONTAINER_PROFILE                     \
  (gst_encoding_container_profile_get_type ())
#define GST_ENCODING_CONTAINER_PROFILE(obj)                     \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ENCODING_CONTAINER_PROFILE, GstEncodingContainerProfile))
#define GST_IS_ENCODING_CONTAINER_PROFILE(obj)                  \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ENCODING_CONTAINER_PROFILE))
typedef struct _GstEncodingContainerProfile GstEncodingContainerProfile;
typedef struct _GstEncodingContainerProfileClass GstEncodingContainerProfileClass;

GST_EXPORT
GType gst_encoding_container_profile_get_type (void);



/**
 * GstEncodingVideoProfile:
 *
 * Variant of #GstEncodingProfile for video streams, allows specifying the @pass.
 */
#define GST_TYPE_ENCODING_VIDEO_PROFILE                 \
  (gst_encoding_video_profile_get_type ())
#define GST_ENCODING_VIDEO_PROFILE(obj)                 \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ENCODING_VIDEO_PROFILE, GstEncodingVideoProfile))
#define GST_IS_ENCODING_VIDEO_PROFILE(obj)                      \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ENCODING_VIDEO_PROFILE))
typedef struct _GstEncodingVideoProfile GstEncodingVideoProfile;
typedef struct _GstEncodingVideoProfileClass GstEncodingVideoProfileClass;

GST_EXPORT
GType gst_encoding_video_profile_get_type (void);



/**
 * GstEncodingAudioProfile:
 *
 * Variant of #GstEncodingProfile for audio streams.
 */
#define GST_TYPE_ENCODING_AUDIO_PROFILE                 \
  (gst_encoding_audio_profile_get_type ())
#define GST_ENCODING_AUDIO_PROFILE(obj)                 \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ENCODING_AUDIO_PROFILE, GstEncodingAudioProfile))
#define GST_IS_ENCODING_AUDIO_PROFILE(obj)                      \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ENCODING_AUDIO_PROFILE))
typedef struct _GstEncodingAudioProfile GstEncodingAudioProfile;
typedef struct _GstEncodingAudioProfileClass GstEncodingAudioProfileClass;

GST_EXPORT
GType gst_encoding_audio_profile_get_type (void);



/* GstEncodingProfile API */

/**
 * gst_encoding_profile_unref:
 * @profile: a #GstEncodingProfile
 *
 * Decreases the reference count of the @profile, possibly freeing the @profile.
 */
#define gst_encoding_profile_unref(profile) (g_object_unref ((GObject*) profile))

/**
 * gst_encoding_profile_ref:
 * @profile: a #GstEncodingProfile
 *
 * Increases the reference count of the @profile.
 */
#define gst_encoding_profile_ref(profile) (g_object_ref ((GObject*) profile))

GST_EXPORT
const gchar *   gst_encoding_profile_get_name           (GstEncodingProfile *profile);

GST_EXPORT
void            gst_encoding_profile_set_name           (GstEncodingProfile *profile,
                                                         const gchar *name);

GST_EXPORT
const gchar *   gst_encoding_profile_get_description    (GstEncodingProfile *profile);

GST_EXPORT
void            gst_encoding_profile_set_description    (GstEncodingProfile *profile,
                                                         const gchar *description);

GST_EXPORT
GstCaps *       gst_encoding_profile_get_format         (GstEncodingProfile *profile);

GST_EXPORT
void            gst_encoding_profile_set_format         (GstEncodingProfile *profile,
                                                         GstCaps *format);

GST_EXPORT
gboolean  gst_encoding_profile_get_allow_dynamic_output (GstEncodingProfile *profile);

GST_EXPORT
void      gst_encoding_profile_set_allow_dynamic_output (GstEncodingProfile *profile,
                                                         gboolean allow_dynamic_output);

GST_EXPORT
const gchar *   gst_encoding_profile_get_preset         (GstEncodingProfile *profile);

GST_EXPORT
const gchar *   gst_encoding_profile_get_preset_name    (GstEncodingProfile *profile);

GST_EXPORT
void            gst_encoding_profile_set_preset         (GstEncodingProfile *profile,
                                                         const gchar *preset);

GST_EXPORT
guint           gst_encoding_profile_get_presence       (GstEncodingProfile *profile);

GST_EXPORT
void            gst_encoding_profile_set_presence       (GstEncodingProfile *profile,
                                                         guint presence);

GST_EXPORT
void            gst_encoding_profile_set_preset_name    (GstEncodingProfile * profile,
                                                         const gchar * preset_name);

GST_EXPORT
GstCaps *       gst_encoding_profile_get_restriction    (GstEncodingProfile *profile);

GST_EXPORT
void            gst_encoding_profile_set_restriction    (GstEncodingProfile *profile,
                                                         GstCaps *restriction);

GST_EXPORT
gboolean        gst_encoding_profile_is_equal           (GstEncodingProfile *a,
                                                         GstEncodingProfile *b);

GST_EXPORT
GstCaps *       gst_encoding_profile_get_input_caps     (GstEncodingProfile *profile);

GST_EXPORT
const gchar *   gst_encoding_profile_get_type_nick      (GstEncodingProfile *profile);

GST_EXPORT
const gchar *   gst_encoding_profile_get_file_extension (GstEncodingProfile * profile);

GST_EXPORT
GstEncodingProfile * gst_encoding_profile_find (const gchar *targetname,
                                                const gchar *profilename,
                                                const gchar *category);

GST_EXPORT
gboolean        gst_encoding_profile_is_enabled        (GstEncodingProfile *profile);

GST_EXPORT
void            gst_encoding_profile_set_enabled       (GstEncodingProfile *profile,
                                                         gboolean enabled);
/* GstEncodingContainerProfile API */

GST_EXPORT
gboolean        gst_encoding_container_profile_add_profile       (GstEncodingContainerProfile *container,
                                                                  GstEncodingProfile *profile);

GST_EXPORT
gboolean        gst_encoding_container_profile_contains_profile  (GstEncodingContainerProfile * container,
                                                                  GstEncodingProfile *profile);

GST_EXPORT
const GList *   gst_encoding_container_profile_get_profiles      (GstEncodingContainerProfile *profile);


GST_EXPORT
GstEncodingContainerProfile *  gst_encoding_container_profile_new (const gchar *name,
                                                                   const gchar *description,
                                                                   GstCaps *format,
                                                                   const gchar *preset);


/* Invidual stream encodingprofile API */

GST_EXPORT
GstEncodingVideoProfile * gst_encoding_video_profile_new (GstCaps *format,
                                                          const gchar *preset,
                                                          GstCaps *restriction,
                                                          guint presence);

GST_EXPORT
GstEncodingAudioProfile * gst_encoding_audio_profile_new (GstCaps *format,
                                                          const gchar *preset,
                                                          GstCaps *restriction,
                                                          guint presence);

GST_EXPORT
guint    gst_encoding_video_profile_get_pass              (GstEncodingVideoProfile *prof);

GST_EXPORT
gboolean gst_encoding_video_profile_get_variableframerate (GstEncodingVideoProfile *prof);

GST_EXPORT
void     gst_encoding_video_profile_set_pass              (GstEncodingVideoProfile *prof,
                                                           guint pass);

GST_EXPORT
void     gst_encoding_video_profile_set_variableframerate (GstEncodingVideoProfile *prof,
                                                           gboolean variableframerate);

GST_EXPORT
GstEncodingProfile * gst_encoding_profile_from_discoverer (GstDiscovererInfo *info);

GST_EXPORT
GstEncodingProfile * gst_encoding_profile_copy (GstEncodingProfile *self);

#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstEncodingAudioProfile, gst_object_unref)
#endif

#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstEncodingContainerProfile, gst_object_unref)
#endif

#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstEncodingProfile, gst_object_unref)
#endif

#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstEncodingVideoProfile, gst_object_unref)
#endif

G_END_DECLS

#endif /* __GST_PROFILE_H__ */
