## GstIndex

GstIndex — Generate indexes on objects

## Synopsis

    #include <gst/gst.h>

    struct      GstIndexEntry;
    struct      GstIndexGroup;
    enum        GstIndexCertainty;
    enum        GstIndexEntryType;
    enum        GstIndexLookupMethod;
    #define     GST_INDEX_NASSOCS               (entry)
    #define     GST_INDEX_ASSOC_FLAGS           (entry)
    #define     GST_INDEX_ASSOC_FORMAT          (entry,i)
    #define     GST_INDEX_ASSOC_VALUE           (entry,i)
    struct      GstIndexAssociation;
    enum        GstAssocFlags;
    #define     GST_INDEX_FORMAT_FORMAT         (entry)
    #define     GST_INDEX_FORMAT_KEY            (entry)
    #define     GST_INDEX_ID_DESCRIPTION        (entry)
    gboolean    (*GstIndexFilter)               (GstIndex *index,
                                                 GstIndexEntry *entry);
    gboolean    (*GstIndexResolver)             (GstIndex *index,
                                                 GstObject *writer,
                                                 gchar **writer_string,
                                                 gpointer user_data);
    struct      GstIndex;
    GstIndex*   gst_index_new                   (void);
    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);
    void        gst_index_set_filter            (GstIndex *index,
                                                 GstIndexFilter filter,
                                                 gpointer user_data);
    void        gst_index_set_resolver          (GstIndex *index,
                                                 GstIndexResolver resolver,
                                                 gpointer user_data);
    gboolean    gst_index_get_writer_id         (GstIndex *index,
                                                 GstObject *writer,
                                                 gint *id);
    GstIndexEntry* gst_index_add_format         (GstIndex *index,
                                                 gint id,
                                                 GstFormat format);
    GstIndexEntry* gst_index_add_association    (GstIndex *index,
                                                 gint id,
                                                 GstAssocFlags flags,
                                                 GstFormat format,
                                                 gint64 value,
                                                 ...);
    GstIndexEntry* gst_index_add_object         (GstIndex *index,
                                                 gint id,
                                                 gchar *key,
                                                 GType type,
                                                 gpointer object);
    GstIndexEntry* gst_index_add_id             (GstIndex *index,
                                                 gint id,
                                                 gchar *description);
    GstIndexEntry* gst_index_get_assoc_entry    (GstIndex *index,
                                                 gint id,
                                                 GstIndexLookupMethod method,
                                                 GstAssocFlags flags,
                                                 GstFormat format,
                                                 gint64 value);
    GstIndexEntry* gst_index_get_assoc_entry_full
                                                (GstIndex *index,
                                                 gint id,
                                                 GstIndexLookupMethod method,
                                                 GstAssocFlags flags,
                                                 GstFormat format,
                                                 gint64 value,
                                                 GCompareDataFunc func,
                                                 gpointer user_data);
    void        gst_index_entry_free            (GstIndexEntry *entry);
    gboolean    gst_index_entry_assoc_map       (GstIndexEntry *entry,
                                                 GstFormat format,
                                                 gint64 *value);

## Object Hierarchy

      GObject
       +----GstObject
             +----GstIndex

## Properties

      "resolver"             GstIndexResolver     : Read / Write

## Signal Prototypes

    "entry-added"
                void        user_function      (GstIndex *gstindex,
                                                gpointer arg1,
                                                gpointer user_data);

## Description

GstIndex is used to generate a stream index of one or more elements in a pipeline.

## Details

### struct GstIndexEntry

    struct GstIndexEntry {

      GstIndexEntryType	 type;
      gint			 id;

      union {
        struct {
          gchar		*description;
        } id;
        struct {
          gint		 nassocs;
          GstIndexAssociation
    	      		*assocs;
          GstAssocFlags	 flags;
        } assoc;
        struct {
          gchar		*key;
          GType		 type;
          gpointer		 object;
        } object;
        struct {
          GstFormat		 format;
          gchar		*key;
        } format;
      } data;
    };

The basic element of an index.

### struct GstIndexGroup

    struct GstIndexGroup {

      /* 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;
    };

A group of related entries in an index.

### enum GstIndexCertainty

    typedef enum {
      GST_INDEX_UNKNOWN,
      GST_INDEX_CERTAIN,
      GST_INDEX_FUZZY
    } GstIndexCertainty;

The certainty of a group in the index.

`GST_INDEX_UNKNOWN` | accuracy is not known
`GST_INDEX_CERTAIN` | accuracy is perfect
`GST_INDEX_FUZZY` | accuracy is fuzzy

### enum GstIndexEntryType

    typedef enum {
      GST_INDEX_ENTRY_ID,
      GST_INDEX_ENTRY_ASSOCIATION,
      GST_INDEX_ENTRY_OBJECT,
      GST_INDEX_ENTRY_FORMAT
    } GstIndexEntryType;

The different types of entries in the index.

`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

### enum GstIndexLookupMethod

    typedef enum {
      GST_INDEX_LOOKUP_EXACT,
      GST_INDEX_LOOKUP_BEFORE,
      GST_INDEX_LOOKUP_AFTER
    } GstIndexLookupMethod;

Specify the method to find an index entry in the index.

`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

### GST_INDEX_NASSOCS()

    #define GST_INDEX_NASSOCS(entry)		((entry)->data.assoc.nassocs)

Get the number of associations in the entry.

`entry` : | The entry to query

### GST_INDEX_ASSOC_FLAGS()

    #define GST_INDEX_ASSOC_FLAGS(entry)		((entry)->data.assoc.flags)

Get the flags for this entry

`entry` : | The entry to query

### GST_INDEX_ASSOC_FORMAT()

    #define GST_INDEX_ASSOC_FORMAT(entry,i)		((entry)->data.assoc.assocs[(i)].format)

Get the i-th format of the entry.

`entry` : | The entry to query
`i` : | The format index

### GST_INDEX_ASSOC_VALUE()

    #define GST_INDEX_ASSOC_VALUE(entry,i)		((entry)->data.assoc.assocs[(i)].value)

Get the i-th value of the entry.

`entry` : | The entry to query
`i` : | The value index

### struct GstIndexAssociation

    struct GstIndexAssociation {

      GstFormat 	format;
      gint64 	value;
    };

An association in an entry.

GstFormat `format` | the format of the association
gint64 `value` | the value of the association

### enum GstAssocFlags

    typedef enum {
      GST_ASSOCIATION_FLAG_NONE 	= 0,
      GST_ASSOCIATION_FLAG_KEY_UNIT = (1 << 0),

      /* new flags should start here */
      GST_ASSOCIATION_FLAG_LAST	= (1 << 8)
    } GstAssocFlags;

flags for an association entry

`GST_ASSOCIATION_FLAG_NONE` | no extra flags
`GST_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_ASSOCIATION_FLAG_LAST` | extra user defined flags should start here.

### GST_INDEX_FORMAT_FORMAT()

    #define GST_INDEX_FORMAT_FORMAT(entry)		((entry)->data.format.format)

Get the format of the format entry

`entry` : | The entry to query

### GST_INDEX_FORMAT_KEY()

    #define GST_INDEX_FORMAT_KEY(entry)		((entry)->data.format.key)

Get the key of the format entry

`entry` : | The entry to query

### GST_INDEX_ID_DESCRIPTION()

    #define GST_INDEX_ID_DESCRIPTION(entry)		((entry)->data.id.description)

Get the description of the id entry

`entry` : | The entry to query

### GstIndexFilter ()

    gboolean    (*GstIndexFilter)               (GstIndex *index,
                                                 GstIndexEntry *entry);

Function to filter out entries in the index.

`index` : | The index being queried
`entry` : | The entry to be added.
Returns : | This function should return TRUE if the entry is to be added to the index, FALSE otherwise.

### GstIndexResolver ()

    gboolean    (*GstIndexResolver)             (GstIndex *index,
                                                 GstObject *writer,
                                                 gchar **writer_string,
                                                 gpointer user_data);

Function to resolve ids to writer descriptions.

`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
Returns : | TRUE if an id could be assigned to the writer.

### struct GstIndex

    struct GstIndex;

The GstIndex object

### gst_index_new ()

    GstIndex*   gst_index_new                   (void);

Create a new tileindex object

Returns : | a new index object

### gst_index_get_group ()

    gint        gst_index_get_group             (GstIndex *index);

Get the id of the current group.

`index` : | the index to get the current group from
Returns : | the id of the current group.

### gst_index_new_group ()

    gint        gst_index_new_group             (GstIndex *index);

Create a new group for the given index. It will be set as the current group.

`index` : | the index to create the new group in
Returns : | the id of the newly created group.

### gst_index_set_group ()

    gboolean    gst_index_set_group             (GstIndex *index,
                                                 gint groupnum);

Set the current groupnumber to the given argument.

`index` : | the index to set the new group in
`groupnum` : | the groupnumber to set
Returns : | TRUE if the operation succeeded, FALSE if the group did not exist.

### gst_index_set_certainty ()

    void        gst_index_set_certainty         (GstIndex *index,
                                                 GstIndexCertainty certainty);

Set the certainty of the given index.

`index` : | the index to set the certainty on
`certainty` : | the certainty to set

### gst_index_get_certainty ()

    GstIndexCertainty gst_index_get_certainty   (GstIndex *index);

Get the certainty of the given index.

`index` : | the index to get the certainty of
Returns : | the certainty of the index.

### gst_index_set_filter ()

    void        gst_index_set_filter            (GstIndex *index,
                                                 GstIndexFilter filter,
                                                 gpointer user_data);

Lets the app register a custom filter function so that it can select what entries should be stored in the index.

`index` : | the index to register the filter on
`filter` : | the filter to register
`user_data` : | data passed to the filter function

### gst_index_set_resolver ()

    void        gst_index_set_resolver          (GstIndex *index,
                                                 GstIndexResolver resolver,
                                                 gpointer user_data);

Lets the app register a custom function to map index ids to writer descriptions.

`index` : | the index to register the resolver on
`resolver` : | the resolver to register
`user_data` : | data passed to the resolver function

### gst_index_get_writer_id ()

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

Before entries can be added to the index, a writer should obtain a unique id. The methods to add new entries to the index require this id as an argument.

The application can implement a custom function to map the writer object to a string. That string will be used to register or look up an id in the index.

`index` : | the index to get a unique write id for
`writer` : | the GstObject to allocate an id for
`id` : | a pointer to a gint to hold the id
Returns : | TRUE if the writer would be mapped to an id.

### gst_index_add_format ()

    GstIndexEntry* gst_index_add_format         (GstIndex *index,
                                                 gint id,
                                                 GstFormat format);

Adds a format entry into the index. This function is used to map dynamic GstFormat ids to their original format key.

`index` : | the index to add the entry to
`id` : | the id of the index writer
`format` : | the format to add to the index
Returns : | a pointer to the newly added entry in the index.

### gst_index_add_association ()

    GstIndexEntry* gst_index_add_association    (GstIndex *index,
                                                 gint id,
                                                 GstAssocFlags flags,
                                                 GstFormat format,
                                                 gint64 value,
                                                 ...);

Associate given format/value pairs with eachother. Be sure to pass gint64 values to this functions varargs, you might want to use a gint64 cast to be sure.

`index` : | the index to add the entry to
`id` : | the id of the index writer
`flags` : | optinal flags for this entry
`format` : | the format of the value
`value` : | the value
`...` : | other format/value pairs or 0 to end the list
Returns : | a pointer to the newly added entry in the index.

### gst_index_add_object ()

    GstIndexEntry* gst_index_add_object         (GstIndex *index,
                                                 gint id,
                                                 gchar *key,
                                                 GType type,
                                                 gpointer object);

Add the given object to the index with the given key.

`index` : | the index to add the object to
`id` : | the id of the index writer
`key` : | a key for the object
`type` : | the GType of the object
`object` : | a pointer to the object to add
Returns : | a pointer to the newly added entry in the index.

### gst_index_add_id ()

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

Add an id entry into the index.

`index` : | the index to add the entry to
`id` : | the id of the index writer
`description` : | the description of the index writer
Returns : | a pointer to the newly added entry in the index.

### gst_index_get_assoc_entry ()

    GstIndexEntry* gst_index_get_assoc_entry    (GstIndex *index,
                                                 gint id,
                                                 GstIndexLookupMethod method,
                                                 GstAssocFlags flags,
                                                 GstFormat format,
                                                 gint64 value);

Finds the given format/value in the index

`index` : | the index to search
`id` : | the id of the index writer
`method` : | The lookup method to use
`flags` : | Flags for the entry
`format` : | the format of the value
`value` : | the value to find
Returns : | the entry associated with the value or NULL if the value was not found.

### gst_index_get_assoc_entry_full ()

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

Finds the given format/value in the index with the given compare function and user_data.

`index` : | the index to search
`id` : | the id of the index writer
`method` : | The lookup method to use
`flags` : | Flags for the entry
`format` : | the format of the value
`value` : | the value to find
`func` : | the function used to compare entries
`user_data` : | user data passed to the compare function
Returns : | the entry associated with the value or NULL if the value was not found.

### gst_index_entry_free ()

    void        gst_index_entry_free            (GstIndexEntry *entry);

Free the memory used by the given entry.

`entry` : | the entry to free

### gst_index_entry_assoc_map ()

    gboolean    gst_index_entry_assoc_map       (GstIndexEntry *entry,
                                                 GstFormat format,
                                                 gint64 *value);

Gets alternative formats associated with the indexentry.

`entry` : | the index to search
`format` : | the format of the value the find
`value` : | a pointer to store the value
Returns : | TRUE if there was a value associated with the given format.

## Properties

"`resolver`" (GstIndexResolver : Read / Write) | Select a predefined object to string mapper.

## Signals

### The "entry-added" signal

    void        user_function                  (GstIndex *gstindex,
                                                gpointer arg1,
                                                gpointer user_data);

Is emited when a new entry is added to the index.

`gstindex` : | the object which received the signal.
`arg1` : | The entry added to the index.
`user_data` : | user data set when the signal handler was connected.

## See Also

GstIndexFactory