## GstIndex GstIndex — Generate indexes on objects |

## Synopsis

    #include <gst/gst.h>

    struct              GstIndex;
    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_INVALID
    #define             GST_INDEX_ID_DESCRIPTION            (entry)
    gboolean            (*GstIndexFilter)                   (GstIndex *index,
                                                             GstIndexEntry *entry,
                                                             gpointer user_data);
    enum                GstIndexResolverMethod;
    gboolean            (*GstIndexResolver)                 (GstIndex *index,
                                                             GstObject *writer,
                                                             gchar **writer_string,
                                                             gpointer user_data);
    enum                GstIndexFlags;
    #define             GST_INDEX_IS_READABLE               (obj)
    #define             GST_INDEX_IS_WRITABLE               (obj)
    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);
    void                gst_index_set_filter                (GstIndex *index,
                                                             GstIndexFilter filter,
                                                             gpointer user_data);
    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);
    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_associationv          (GstIndex *index,
                                                             gint id,
                                                             GstAssocFlags flags,
                                                             gint n,
                                                             const GstIndexAssociation *list);
    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);
    GstIndexEntry *     gst_index_entry_copy                (GstIndexEntry *entry);
    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

## Signals

      "entry-added"                                    : Run Last

## Description

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

Elements will overload the set_index and get_index virtual methods in GstElement. When streaming data, the element will add index entries if it has an index set.

Each element that adds to the index will do that using a writer_id. The writer_id is obtained from `gst_index_get_writer_id()`.

The application that wants to index the stream will create a new index object using `gst_index_new()` or `gst_index_factory_make()`. The index is assigned to a specific element, a bin or the whole pipeline. This will cause indexable elements to add entires to the index while playing.

## Details

### struct GstIndex

    struct GstIndex;

Opaque GstIndex structure.

### struct GstIndexEntry

    struct GstIndexEntry {
    };

The basic element of an index.

### struct GstIndexGroup

    struct GstIndexGroup {
    };

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),
      GST_ASSOCIATION_FLAG_DELTA_UNIT = (1 << 1),

      /* 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_DELTA_UNIT` | the entry marks a delta unit, a delta unit is one that marks a place where one can relatively 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_INVALID

    #define GST_INDEX_ID_INVALID                    (-1)

Constant for an invalid index id

### 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,
                                                             gpointer user_data);

Function to filter out entries in the index.

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

### enum GstIndexResolverMethod

    typedef enum {
      GST_INDEX_RESOLVER_CUSTOM,
      GST_INDEX_RESOLVER_GTYPE,
      GST_INDEX_RESOLVER_PATH
    } GstIndexResolverMethod;

The method used to resolve index writers

`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

### 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.

### enum GstIndexFlags

    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;

Flags for this index

`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

### GST_INDEX_IS_READABLE()

    #define GST_INDEX_IS_READABLE(obj)    (GST_OBJECT_FLAG_IS_SET (obj, GST_INDEX_READABLE))

Check if the index can be read from

`obj` : | The index to check

### GST_INDEX_IS_WRITABLE()

    #define GST_INDEX_IS_WRITABLE(obj)    (GST_OBJECT_FLAG_IS_SET (obj, GST_INDEX_WRITABLE))

Check if the index can be written to

`obj` : | The index to check

### gst_index_new ()

    GstIndex *          gst_index_new                       (void);

Create a new dummy index object. Use `gst_element_set_index()` to assign that to an element or pipeline. This index is not storing anything, but will still emit e.g. the "entry-added" signal.

Returns : | a new index object. [transfer full]

### gst_index_commit ()

    void                gst_index_commit                    (GstIndex *index,
                                                             gint id);

Tell the index that the writer with the given id is done with this index and is not going to write any more entries to it.

`index` : | the index to commit
`id` : | the writer that commited the index

### 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_filter_full ()

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

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
`user_data_destroy` : | function to call when `user_data` is unset

### 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_set_resolver_full ()

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

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
`user_data_destroy` : | destroy function for `user_data`

Since 0.10.18

### 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.

### Note

The caller must not hold `writer`'s GST_OBJECT_LOCK, as the default resolver may call functions that take the object lock as well, and the lock is not recursive.

`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.

Free-function: gst_index_entry_free

`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. [transfer full]

### 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 each other. 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_associationv ()

    GstIndexEntry *     gst_index_add_associationv          (GstIndex *index,
                                                             gint id,
                                                             GstAssocFlags flags,
                                                             gint n,
                                                             const GstIndexAssociation *list);

Associate given format/value pairs with each other.

`index` : | the index to add the entry to
`id` : | the id of the index writer
`flags` : | optinal flags for this entry
`n` : | number of associations
`list` : | list of associations
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.

This function is not yet implemented.

`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_copy ()

    GstIndexEntry *     gst_index_entry_copy                (GstIndexEntry *entry);

Copies an entry and returns the result.

Free-function: gst_index_entry_free

`entry` : | the entry to copy
Returns : | a newly allocated GstIndexEntry. [transfer full]

### gst_index_entry_free ()

    void                gst_index_entry_free                (GstIndexEntry *entry);

Free the memory used by the given entry.

`entry` : | the entry to free. [transfer full]

### 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.

## Property Details

### The `"resolver"` property

      "resolver"                 GstIndexResolver      : Read / Write

Select a predefined object to string mapper.

Default value: GST_INDEX_RESOLVER_PATH

## Signal Details

### The `"entry-added"` signal

    void                user_function                      (GstIndex      *gstindex,
                                                            GstIndexEntry *arg1,
                                                            gpointer       user_data)      : Run Last

Is emitted 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