/* GStreamer
 * Copyright (C) 2013 Collabora Ltd.
 *   Author: Sebastian Dröge <sebastian.droege@collabora.co.uk>
 *
 * 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_CAPS_FEATURES_H__
#define __GST_CAPS_FEATURES_H__

#include <gst/gstconfig.h>
#include <gst/glib-compat.h>

G_BEGIN_DECLS

typedef struct _GstCapsFeatures GstCapsFeatures;

#define GST_TYPE_CAPS_FEATURES (gst_caps_features_get_type ())
#define GST_IS_CAPS_FEATURES(object)       (gst_is_caps_features(object))
#define GST_CAPS_FEATURES_CAST(object)     ((GstCapsFeatures *)(object))
#define GST_CAPS_FEATURES(object)          (GST_CAPS_FEATURES_CAST(object))

#define GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY "memory:SystemMemory"

GST_EXPORT GstCapsFeatures *_gst_caps_features_any;
#define GST_CAPS_FEATURES_ANY (_gst_caps_features_any)

GST_EXPORT GstCapsFeatures *_gst_caps_features_memory_system_memory;
#define GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY (_gst_caps_features_memory_system_memory)

GType             gst_caps_features_get_type (void);
gboolean          gst_is_caps_features (gconstpointer obj);

GstCapsFeatures * gst_caps_features_new_empty (void);
GstCapsFeatures * gst_caps_features_new_any (void);
GstCapsFeatures * gst_caps_features_new (const gchar *feature1, ...);
GstCapsFeatures * gst_caps_features_new_valist (const gchar *feature1, va_list varargs);
GstCapsFeatures * gst_caps_features_new_id (GQuark feature1, ...);
GstCapsFeatures * gst_caps_features_new_id_valist (GQuark feature1, va_list varargs);

gboolean          gst_caps_features_set_parent_refcount  (GstCapsFeatures *features, gint * refcount);

GstCapsFeatures * gst_caps_features_copy (const GstCapsFeatures * features);
void              gst_caps_features_free (GstCapsFeatures * features);

gchar *           gst_caps_features_to_string (const GstCapsFeatures * features);
GstCapsFeatures * gst_caps_features_from_string (const gchar * features);

guint             gst_caps_features_get_size (const GstCapsFeatures * features);
const gchar *     gst_caps_features_get_nth (const GstCapsFeatures * features, guint i);
GQuark            gst_caps_features_get_nth_id (const GstCapsFeatures * features, guint i);

gboolean          gst_caps_features_contains (const GstCapsFeatures * features, const gchar * feature);
gboolean          gst_caps_features_contains_id (const GstCapsFeatures * features, GQuark feature);
gboolean          gst_caps_features_is_equal (const GstCapsFeatures * features1, const GstCapsFeatures * features2);

gboolean          gst_caps_features_is_any (const GstCapsFeatures * features);

void              gst_caps_features_add (GstCapsFeatures * features, const gchar * feature);
void              gst_caps_features_add_id ( GstCapsFeatures * features, GQuark feature);

void              gst_caps_features_remove (GstCapsFeatures * features, const gchar * feature);
void              gst_caps_features_remove_id (GstCapsFeatures * features, GQuark feature);

G_END_DECLS

#endif /* __GST_CAPS_FEATURES_H__ */
