/* GStreamer
 * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
 *                    2000 Wim Taymans <wim.taymans@chello.be>
 *
 * gstindex.h: Header for GstIndex, base class to handle efficient
 *             storage or caching of seeking information.
 *
 * 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_INDEX_H__
#define __GST_INDEX_H__

#include <gst/gstobject.h>
#include <gst/gstformat.h>
#include <gst/gstpluginfeature.h>

G_BEGIN_DECLS

#define GST_TYPE_INDEX                  (gst_index_get_type ())
#define GST_INDEX(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_INDEX, GstIndex))
#define GST_IS_INDEX(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_INDEX))
#define GST_INDEX_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_INDEX, GstIndexClass))
#define GST_IS_INDEX_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_INDEX))
#define GST_INDEX_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_INDEX, GstIndexClass))

#define GST_TYPE_INDEX_ENTRY            (gst_index_entry_get_type())

typedef struct _GstIndexEntry GstIndexEntry;
typedef struct _GstIndexGroup GstIndexGroup;
typedef struct _GstIndex GstIndex;
typedef struct _GstIndexClass GstIndexClass;

/**
 * GstIndexCertainty:
 * @GST_INDEX_UNKNOWN: accuracy is not known
 * @GST_INDEX_CERTAIN: accuracy is perfect
 * @GST_INDEX_FUZZY: accuracy is fuzzy
 *
 * The certainty of a group in the index.
 */
typedef enum {
  GST_INDEX_UNKNOWN,
  GST_INDEX_CERTAIN,
  GST_INDEX_FUZZY
} GstIndexCertainty;

/**
 * GstIndexEntryType:
 * @GST_INDEX_ENTRY_ID: This entry is an id that maps an index id to its owner object
 * @GST_INDEX_ENTRY_ASSOCIATION: This entry is an association between formats
 * @GST_INDEX_ENTRY_OBJECT: An object
 * @GST_INDEX_ENTRY_FORMAT: A format definition
 *
 * The different types of entries in the index.
 */
typedef enum {
  GST_INDEX_ENTRY_ID,
  GST_INDEX_ENTRY_ASSOCIATION,
  GST_INDEX_ENTRY_OBJECT,
  GST_INDEX_ENTRY_FORMAT
} GstIndexEntryType;

/**
 * GstIndexLookupMethod:
 * @GST_INDEX_LOOKUP_EXACT: There has to be an exact indexentry with the given format/value
 * @GST_INDEX_LOOKUP_BEFORE: The exact entry or the one before it
 * @GST_INDEX_LOOKUP_AFTER: The exact entry or the one after it
 *
 * Specify the method to find an index entry in the index.
 */
typedef enum {
  GST_INDEX_LOOKUP_EXACT,
  GST_INDEX_LOOKUP_BEFORE,
  GST_INDEX_LOOKUP_AFTER
} GstIndexLookupMethod;

/**
 * GST_INDEX_NASSOCS:
 * @entry: The entry to query
 *
 * Get the number of associations in the entry.
 */
#define GST_INDEX_NASSOCS(entry)                ((entry)->data.assoc.nassocs)

/**
 * GST_INDEX_ASSOC_FLAGS:
 * @entry: The entry to query
 *
 *  Get the flags for this entry.
 */
#define GST_INDEX_ASSOC_FLAGS(entry)            ((entry)->data.assoc.flags)

/**
 * GST_INDEX_ASSOC_FORMAT:
 * @entry: The entry to query
 * @i: The format index
 *
 * Get the i-th format of the entry.
 */
#define GST_INDEX_ASSOC_FORMAT(entry,i)         ((entry)->data.assoc.assocs[(i)].format)

/**
 * GST_INDEX_ASSOC_VALUE:
 * @entry: The entry to query
 * @i: The value index
 *
 * Get the i-th value of the entry.
 */
#define GST_INDEX_ASSOC_VALUE(entry,i)          ((entry)->data.assoc.assocs[(i)].value)

typedef struct _GstIndexAssociation GstIndexAssociation;

/**
 * GstIndexAssociation:
 * @format: the format of the association
 * @value: the value of the association
 *
 * An association in an entry.
 */
struct _GstIndexAssociation {
  GstFormat     format;
  gint64        value;
};

/**
 * GstIndexAssociationFlags:
 * @GST_INDEX_ASSOCIATION_FLAG_NONE: no extra flags
 * @GST_INDEX_ASSOCIATION_FLAG_KEY_UNIT: the entry marks a key unit, a key unit is one
 *  that marks a place where one can randomly seek to.
 * @GST_INDEX_ASSOCIATION_FLAG_DELTA_UNIT: the entry marks a delta unit, a delta unit
 *  is one that marks a place where one can relatively seek to.
 * @GST_INDEX_ASSOCIATION_FLAG_LAST: extra user defined flags should start here.
 *
 * Flags for an association entry.
 */
typedef enum {
  GST_INDEX_ASSOCIATION_FLAG_NONE       = 0,
  GST_INDEX_ASSOCIATION_FLAG_KEY_UNIT   = (1 << 0),
  GST_INDEX_ASSOCIATION_FLAG_DELTA_UNIT = (1 << 1),

  /* new flags should start here */
  GST_INDEX_ASSOCIATION_FLAG_LAST     = (1 << 8)
} GstIndexAssociationFlags;

/**
 * GST_INDEX_FORMAT_FORMAT:
 * @entry: The entry to query
 *
 * Get the format of the format entry
 */
#define GST_INDEX_FORMAT_FORMAT(entry)          ((entry)->data.format.format)

/**
 * GST_INDEX_FORMAT_KEY:
 * @entry: The entry to query
 *
 * Get the key of the format entry
 */
#define GST_INDEX_FORMAT_KEY(entry)             ((entry)->data.format.key)

/**
 * GST_INDEX_ID_INVALID:
 *
 * Constant for an invalid index id
 */
#define GST_INDEX_ID_INVALID                    (-1)

/**
 * GST_INDEX_ID_DESCRIPTION:
 * @entry: The entry to query
 *
 * Get the description of the id entry
 */
#define GST_INDEX_ID_DESCRIPTION(entry)         ((entry)->data.id.description)

/**
 * GstIndexEntry:
 *
 * The basic element of an index.
 */
struct _GstIndexEntry {
  /*< private >*/
  GstIndexEntryType      type;
  gint                   id;

  union {
    struct {
      gchar             *description;
    } id;
    struct {
      gint               nassocs;
      GstIndexAssociation
                        *assocs;
      GstIndexAssociationFlags      flags;
    } assoc;
    struct {
      gchar             *key;
      GType              type;
      gpointer           object;
    } object;
    struct {
      GstFormat          format;
      const gchar       *key;
    } format;
  } data;
  // FIXME 2.0: add padding
};

/**
 * GstIndexGroup:
 *
 * A group of related entries in an index.
 */

struct _GstIndexGroup {
  /*< private >*/
  /* unique ID of group in index */
  gint groupnum;

  /* list of entries */
  GList *entries;

  /* the certainty level of the group */
  GstIndexCertainty certainty;

  /* peer group that contains more certain entries */
  gint peergroup;
  // FIXME 2.0: add padding
};

/**
 * GstIndexFilter:
 * @index: The index being queried
 * @entry: The entry to be added.
 * @user_data: User data passed to the function.
 *
 * Function to filter out entries in the index.
 *
 * Returns: This function should return %TRUE if the entry is to be added
 * to the index, %FALSE otherwise.
 *
 */
typedef gboolean        (*GstIndexFilter)               (GstIndex *index,
                                                         GstIndexEntry *entry,
                                                         gpointer user_data);
/**
 * GstIndexResolverMethod:
 * @GST_INDEX_RESOLVER_CUSTOM: Use a custom resolver
 * @GST_INDEX_RESOLVER_GTYPE: Resolve based on the GType of the object
 * @GST_INDEX_RESOLVER_PATH: Resolve on the path in graph
 *
 * The method used to resolve index writers
 */
typedef enum {
  GST_INDEX_RESOLVER_CUSTOM,
  GST_INDEX_RESOLVER_GTYPE,
  GST_INDEX_RESOLVER_PATH
} GstIndexResolverMethod;

/**
 * GstIndexResolver:
 * @index: the index being queried.
 * @writer: The object that wants to write
 * @writer_string: A description of the writer.
 * @user_data: user_data as registered
 *
 * Function to resolve ids to writer descriptions.
 *
 * Returns: %TRUE if an id could be assigned to the writer.
 */
typedef gboolean        (*GstIndexResolver)             (GstIndex *index,
                                                         GstObject *writer,
                                                         gchar **writer_string,
                                                         gpointer user_data);

/**
 * GstIndexFlags:
 * @GST_INDEX_WRITABLE: The index is writable
 * @GST_INDEX_READABLE: The index is readable
 * @GST_INDEX_FLAG_LAST: First flag that can be used by subclasses
 *
 * Flags for this index
 */
typedef enum {
  GST_INDEX_WRITABLE    = (GST_OBJECT_FLAG_LAST << 0),
  GST_INDEX_READABLE    = (GST_OBJECT_FLAG_LAST << 1),

  GST_INDEX_FLAG_LAST   = (GST_OBJECT_FLAG_LAST << 8)
} GstIndexFlags;

/**
 * GST_INDEX_IS_READABLE:
 * @obj: The index to check
 *
 * Check if the index can be read from
 */
#define GST_INDEX_IS_READABLE(obj)    (GST_OBJECT_FLAG_IS_SET (obj, GST_INDEX_READABLE))

/**
 * GST_INDEX_IS_WRITABLE:
 * @obj: The index to check
 *
 * Check if the index can be written to
 */
#define GST_INDEX_IS_WRITABLE(obj)    (GST_OBJECT_FLAG_IS_SET (obj, GST_INDEX_WRITABLE))

/**
 * GstIndex:
 *
 * Opaque #GstIndex structure.
 */
struct _GstIndex {
  GstObject              object;

  /*< private >*/
  GList                 *groups;
  GstIndexGroup         *curgroup;
  gint                   maxgroup;

  GstIndexResolverMethod method;
  GstIndexResolver       resolver;
  gpointer               resolver_user_data;
  GDestroyNotify         resolver_user_data_destroy;

  GstIndexFilter         filter;
  gpointer               filter_user_data;
  GDestroyNotify         filter_user_data_destroy;

  GHashTable            *writers;
  gint                   last_id;

  /*< private >*/
  gpointer _gst_reserved[GST_PADDING];
};

struct _GstIndexClass {
  GstObjectClass parent_class;

  /*< protected >*/
  gboolean      (*get_writer_id)        (GstIndex *index, gint *id, gchar *writer);

  void          (*commit)               (GstIndex *index, gint id);

  /* abstract methods */
  void          (*add_entry)            (GstIndex *index, GstIndexEntry *entry);

  GstIndexEntry* (*get_assoc_entry)     (GstIndex *index, gint id,
                                         GstIndexLookupMethod method, GstIndexAssociationFlags flags,
                                         GstFormat format, gint64 value,
                                         GCompareDataFunc func,
                                         gpointer user_data);
  /* signals */
  void          (*entry_added)          (GstIndex *index, GstIndexEntry *entry);

  /*< private >*/
  gpointer _gst_reserved[GST_PADDING];
};

static
GType                   gst_index_get_type              (void);

#if 0
GstIndex*               gst_index_new                   (void);
void                    gst_index_commit                (GstIndex *index, gint id);

gint                    gst_index_get_group             (GstIndex *index);
gint                    gst_index_new_group             (GstIndex *index);
gboolean                gst_index_set_group             (GstIndex *index, gint groupnum);

void                    gst_index_set_certainty         (GstIndex *index,
                                                         GstIndexCertainty certainty);
GstIndexCertainty       gst_index_get_certainty         (GstIndex *index);

static
void                    gst_index_set_filter            (GstIndex *index,
                                                         GstIndexFilter filter, gpointer user_data);
static
void                    gst_index_set_filter_full       (GstIndex *index,
                                                         GstIndexFilter filter, gpointer user_data,
                                                         GDestroyNotify user_data_destroy);

void                    gst_index_set_resolver          (GstIndex *index,
                                                         GstIndexResolver resolver, gpointer user_data);
void                    gst_index_set_resolver_full     (GstIndex *index, GstIndexResolver resolver,
                                                         gpointer user_data,
                                                         GDestroyNotify user_data_destroy);
#endif

static
gboolean                gst_index_get_writer_id         (GstIndex *index, GstObject *writer, gint *id);

#if 0
GstIndexEntry*          gst_index_add_format            (GstIndex *index, gint id, GstFormat format);
#endif

static
GstIndexEntry*          gst_index_add_associationv      (GstIndex * index, gint id, GstIndexAssociationFlags flags,
                                                         gint n, const GstIndexAssociation * list);
#if 0
GstIndexEntry*          gst_index_add_association       (GstIndex *index, gint id, GstIndexAssociationFlags flags,
                                                         GstFormat format, gint64 value, ...)
GstIndexEntry*          gst_index_add_object            (GstIndex *index, gint id, gchar *key,
                                                         GType type, gpointer object);
#endif

static
GstIndexEntry*          gst_index_add_id                (GstIndex *index, gint id,
                                                         gchar *description);

static
GstIndexEntry*          gst_index_get_assoc_entry       (GstIndex *index, gint id,
                                                         GstIndexLookupMethod method, GstIndexAssociationFlags flags,
                                                         GstFormat format, gint64 value);
static
GstIndexEntry*          gst_index_get_assoc_entry_full  (GstIndex *index, gint id,
                                                         GstIndexLookupMethod method, GstIndexAssociationFlags flags,
                                                         GstFormat format, gint64 value,
                                                         GCompareDataFunc func,
                                                         gpointer user_data);

/* working with index entries */
static
GType gst_index_entry_get_type (void);
static
GstIndexEntry *         gst_index_entry_copy            (GstIndexEntry *entry);
static
void                    gst_index_entry_free            (GstIndexEntry *entry);
static
gboolean                gst_index_entry_assoc_map       (GstIndexEntry *entry,
                                                         GstFormat format, gint64 *value);

G_END_DECLS

#endif /* __GST_INDEX_H__ */
