GstBufferList

GstBufferList — Grouped scatter data buffer type for data-passing

Synopsis

#include <gst/gst.h>

                    GstBufferList;
                    GstBufferListIterator;
GstBuffer *         (*GstBufferListDoFunction)          (GstBuffer *buffer,
                                                         gpointer user_data);
GstBufferList *     gst_buffer_list_new                 (void);
GstBufferList *     gst_buffer_list_ref                 (GstBufferList *list);
void                gst_buffer_list_unref               (GstBufferList *list);
GstBufferList *     gst_buffer_list_copy                (const GstBufferList *list);
#define             gst_buffer_list_is_writable         (list)
#define             gst_buffer_list_make_writable       (list)
guint               gst_buffer_list_n_groups            (GstBufferList *list);
enum                GstBufferListItem;
GstBufferListItem   (*GstBufferListFunc)                (GstBuffer **buffer,
                                                         guint group,
                                                         guint idx,
                                                         gpointer user_data);
void                gst_buffer_list_foreach             (GstBufferList *list,
                                                         GstBufferListFunc func,
                                                         gpointer user_data);
GstBuffer *         gst_buffer_list_get                 (GstBufferList *list,
                                                         guint group,
                                                         guint idx);
GstBufferListIterator * gst_buffer_list_iterate         (GstBufferList *list);
void                gst_buffer_list_iterator_free       (GstBufferListIterator *it);
guint               gst_buffer_list_iterator_n_buffers  (const GstBufferListIterator *it);
void                gst_buffer_list_iterator_add        (GstBufferListIterator *it,
                                                         GstBuffer *buffer);
void                gst_buffer_list_iterator_add_group  (GstBufferListIterator *it);
void                gst_buffer_list_iterator_add_list   (GstBufferListIterator *it,
                                                         GList *list);
GstBuffer *         gst_buffer_list_iterator_next       (GstBufferListIterator *it);
gboolean            gst_buffer_list_iterator_next_group (GstBufferListIterator *it);
void                gst_buffer_list_iterator_remove     (GstBufferListIterator *it);
GstBuffer *         gst_buffer_list_iterator_steal      (GstBufferListIterator *it);
void                gst_buffer_list_iterator_take       (GstBufferListIterator *it,
                                                         GstBuffer *buffer);
GstBuffer *         gst_buffer_list_iterator_do         (GstBufferListIterator *it,
                                                         GstBufferListDoFunction do_func,
                                                         gpointer user_data);
GstBuffer *         gst_buffer_list_iterator_merge_group
                                                        (const GstBufferListIterator *it);

Description

Buffer lists are units of grouped scatter/gather data transfer in GStreamer.

Buffer lists are created with gst_buffer_list_new() and filled with data using a GstBufferListIterator. The iterator has no current buffer; its cursor position lies between buffers, immediately before the buffer that would be returned by gst_buffer_list_iterator_next(). After iterating to the end of a group the iterator must be advanced to the next group by a call to gst_buffer_list_iterator_next_group() before any further calls to gst_buffer_list_iterator_next() can return buffers again. The cursor position of a newly created iterator lies before the first group; a call to gst_buffer_list_iterator_next_group() is necessary before calls to gst_buffer_list_iterator_next() can return buffers.

     +--- group0 ----------------------+--- group1 ------------+
     |   buffer0   buffer1   buffer2   |   buffer3   buffer4   |
   ^   ^         ^         ^         ^   ^         ^         ^
   Iterator positions between buffers
  

The gst_buffer_list_iterator_remove(), gst_buffer_list_iterator_steal(), gst_buffer_list_iterator_take() and gst_buffer_list_iterator_do() functions are not defined in terms of the cursor position; they operate on the last element returned from gst_buffer_list_iterator_next().

The basic use pattern of creating a buffer list with an iterator is as follows:

Example 4. Creating a buffer list

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
GstBufferList *list;
GstBufferListIterator *it;

list = gst_buffer_list_new ();
it = gst_buffer_list_iterate (list);
gst_buffer_list_iterator_add_group (it);
gst_buffer_list_iterator_add (it, header1);
gst_buffer_list_iterator_add (it, data1);
gst_buffer_list_iterator_add_group (it);
gst_buffer_list_iterator_add (it, header2);
gst_buffer_list_iterator_add (it, data2);
gst_buffer_list_iterator_add_group (it);
gst_buffer_list_iterator_add (it, header3);
gst_buffer_list_iterator_add (it, data3);
...
gst_buffer_list_iterator_free (it);


The basic use pattern of iterating over a buffer list is as follows:

Example 5. Iterating a buffer list

1
2
3
4
5
6
7
8
9
GstBufferListIterator *it;

it = gst_buffer_list_iterate (list);
while (gst_buffer_list_iterator_next_group (it)) {
  while ((buffer = gst_buffer_list_iterator_next (it)) != NULL) {
    do_something_with_buffer (buffer);
  }
}
gst_buffer_list_iterator_free (it);


The basic use pattern of modifying a buffer in a list is as follows:

Example 6. Modifying the data of the first buffer in a list

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GstBufferListIterator *it;

list = gst_buffer_list_make_writable (list);
it = gst_buffer_list_iterate (list);
if (gst_buffer_list_iterator_next_group (it)) {
  GstBuffer *buf

  buf = gst_buffer_list_iterator_next (it);
  if (buf != NULL) {
    buf = gst_buffer_list_iterator_do (it,
        (GstBufferListDoFunction) gst_mini_object_make_writable, NULL);
    modify_data (GST_BUFFER_DATA (buf));
  }
}
gst_buffer_list_iterator_free (it);


Details

GstBufferList

typedef struct _GstBufferList GstBufferList;

Opaque list of grouped buffers.

Since 0.10.24


GstBufferListIterator

typedef struct _GstBufferListIterator GstBufferListIterator;

Opaque iterator for a GstBufferList.

Since 0.10.24


GstBufferListDoFunction ()

GstBuffer *         (*GstBufferListDoFunction)          (GstBuffer *buffer,
                                                         gpointer user_data);

A function for accessing the last buffer returned by gst_buffer_list_iterator_next(). The function can leave buffer in the list, replace buffer in the list or remove buffer from the list, depending on the return value. If the function returns NULL, buffer will be removed from the list, otherwise buffer will be replaced with the returned buffer.

The last buffer returned by gst_buffer_list_iterator_next() will be replaced with the buffer returned from the function. The function takes ownership of buffer and if a different value than buffer is returned, buffer must be unreffed. If NULL is returned, the buffer will be removed from the list. The list must be writable.

buffer :

the GstBuffer. [transfer full]

user_data :

user data

Returns :

the buffer to replace buffer in the list, or NULL to remove buffer from the list. [transfer full]

Since 0.10.24


gst_buffer_list_new ()

GstBufferList *     gst_buffer_list_new                 (void);

Creates a new, empty GstBufferList. The caller is responsible for unreffing the returned GstBufferList.

Free-function: gst_buffer_list_unref

Returns :

the new GstBufferList. gst_buffer_list_unref() after usage. [transfer full]

Since 0.10.24


gst_buffer_list_ref ()

GstBufferList *     gst_buffer_list_ref                 (GstBufferList *list);

Increases the refcount of the given buffer list by one.

Note that the refcount affects the writeability of list and its data, see gst_buffer_list_make_writable(). It is important to note that keeping additional references to GstBufferList instances can potentially increase the number of memcpy operations in a pipeline.

list :

a GstBufferList

Returns :

list. [transfer full]

Since 0.10.24


gst_buffer_list_unref ()

void                gst_buffer_list_unref               (GstBufferList *list);

Decreases the refcount of the buffer list. If the refcount reaches 0, the buffer list will be freed.

list :

a GstBufferList. [transfer full]

Since 0.10.24


gst_buffer_list_copy ()

GstBufferList *     gst_buffer_list_copy                (const GstBufferList *list);

Create a shallow copy of the given buffer list. This will make a newly allocated copy of the source list with copies of buffer pointers. The refcount of buffers pointed to will be increased by one.

list :

a GstBufferList

Returns :

a new copy of list. [transfer full]

Since 0.10.24


gst_buffer_list_is_writable()

#define gst_buffer_list_is_writable(list) gst_mini_object_is_writable (GST_MINI_OBJECT_CAST (list))

Tests if you can safely add buffers and groups into a buffer list.

list :

a GstBufferList

Since 0.10.24


gst_buffer_list_make_writable()

#define gst_buffer_list_make_writable(list) GST_BUFFER_LIST_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (list)))

Makes a writable buffer list from the given buffer list. If the source buffer list is already writable, this will simply return the same buffer list. A copy will otherwise be made using gst_buffer_list_copy().

list :

a GstBufferList. [transfer full]

Returns :

a writable list, which may or may not be the same as list. [transfer full]

Since 0.10.24


gst_buffer_list_n_groups ()

guint               gst_buffer_list_n_groups            (GstBufferList *list);

Returns the number of groups in list.

list :

a GstBufferList

Returns :

the number of groups in the buffer list

Since 0.10.24


enum GstBufferListItem

typedef enum {
  GST_BUFFER_LIST_CONTINUE,
  GST_BUFFER_LIST_SKIP_GROUP,
  GST_BUFFER_LIST_END
} GstBufferListItem;

The result of the GstBufferListFunc.

GST_BUFFER_LIST_CONTINUE

Retrieve next buffer

GST_BUFFER_LIST_SKIP_GROUP

Skip to next group

GST_BUFFER_LIST_END

End iteration

Since 0.10.24


GstBufferListFunc ()

GstBufferListItem   (*GstBufferListFunc)                (GstBuffer **buffer,
                                                         guint group,
                                                         guint idx,
                                                         gpointer user_data);

A function that will be called from gst_buffer_list_foreach(). The buffer field will point to a the reference of the buffer at idx in group.

When this function returns GST_BUFFER_LIST_CONTINUE, the next buffer will be returned. When GST_BUFFER_LIST_SKIP_GROUP is returned, all remaining buffers in the current group will be skipped and the first buffer of the next group is returned (if any). When GST_BUFFER_LIST_END is returned, gst_buffer_list_foreach() will return.

When buffer is set to NULL, the item will be removed from the bufferlist. When buffer has been made writable, the new buffer reference can be assigned to buffer. This function is responsible for unreffing the old buffer when removing or modifying.

buffer :

pointer the buffer

group :

the group index of buffer

idx :

the index in group of buffer

user_data :

user data passed to gst_buffer_list_foreach()

Returns :

a GstBufferListItem

Since 0.10.24


gst_buffer_list_foreach ()

void                gst_buffer_list_foreach             (GstBufferList *list,
                                                         GstBufferListFunc func,
                                                         gpointer user_data);

Call func with data for each buffer in list.

func can modify the passed buffer pointer or its contents. The return value of func define if this function returns or if the remaining buffers in a group should be skipped.

list :

a GstBufferList

func :

a GstBufferListFunc to call. [scope call]

user_data :

user data passed to func. [closure]

Since 0.10.24


gst_buffer_list_get ()

GstBuffer *         gst_buffer_list_get                 (GstBufferList *list,
                                                         guint group,
                                                         guint idx);

Get the buffer at idx in group.

Note that this function is not efficient for iterating over the entire list. Use an iterator or gst_buffer_list_foreach() instead.

list :

a GstBufferList

group :

the group

idx :

the index in group

Returns :

the buffer at idx in group or NULL when there is no buffer. The buffer remains valid as long as list is valid. [transfer none]

Since 0.10.24


gst_buffer_list_iterate ()

GstBufferListIterator * gst_buffer_list_iterate         (GstBufferList *list);

Iterate the buffers in list. The owner of the iterator must also be the owner of a reference to list while the returned iterator is in use.

Free-function: gst_buffer_list_iterator_free

list :

a GstBufferList

Returns :

a new GstBufferListIterator of the buffers in list. gst_buffer_list_iterator_free() after usage. [transfer full]

Since 0.10.24


gst_buffer_list_iterator_free ()

void                gst_buffer_list_iterator_free       (GstBufferListIterator *it);

Free the iterator.

it :

the GstBufferListIterator to free. [transfer full]

Since 0.10.24


gst_buffer_list_iterator_n_buffers ()

guint               gst_buffer_list_iterator_n_buffers  (const GstBufferListIterator *it);

Returns the number of buffers left to iterate in the current group. I.e. the number of calls that can be made to gst_buffer_list_iterator_next() before it returns NULL.

This function will not move the implicit cursor or in any other way affect the state of the iterator it.

it :

a GstBufferListIterator

Returns :

the number of buffers left to iterate in the current group

Since 0.10.24


gst_buffer_list_iterator_add ()

void                gst_buffer_list_iterator_add        (GstBufferListIterator *it,
                                                         GstBuffer *buffer);

Inserts buffer into the GstBufferList iterated with it. The buffer is inserted into the current group, immediately before the buffer that would be returned by gst_buffer_list_iterator_next(). The buffer is inserted before the implicit cursor, a subsequent call to gst_buffer_list_iterator_next() will return the buffer after the inserted buffer, if any.

This function takes ownership of buffer.

it :

a GstBufferListIterator

buffer :

a GstBuffer. [transfer full]

Since 0.10.24


gst_buffer_list_iterator_add_group ()

void                gst_buffer_list_iterator_add_group  (GstBufferListIterator *it);

Inserts a new, empty group into the GstBufferList iterated with it. The group is inserted immediately before the group that would be returned by gst_buffer_list_iterator_next_group(). A subsequent call to gst_buffer_list_iterator_next_group() will advance the iterator to the group after the inserted group, if any.

Since 0.10.24


gst_buffer_list_iterator_add_list ()

void                gst_buffer_list_iterator_add_list   (GstBufferListIterator *it,
                                                         GList *list);

Inserts list of buffers into the GstBufferList iterated with it. The list is inserted into the current group, immediately before the buffer that would be returned by gst_buffer_list_iterator_next(). The list is inserted before the implicit cursor, a subsequent call to gst_buffer_list_iterator_next() will return the buffer after the last buffer of the inserted list, if any.

This function takes ownership of list and all its buffers.

it :

a GstBufferListIterator

list :

a GList of buffers. [transfer full][element-type Gst.Buffer]

Since 0.10.31


gst_buffer_list_iterator_next ()

GstBuffer *         gst_buffer_list_iterator_next       (GstBufferListIterator *it);

Returns the next buffer in the list iterated with it. If the iterator is at the end of a group, NULL will be returned. This function may be called repeatedly to iterate through the current group.

The caller will not get a new ref to the returned GstBuffer and must not unref it.

it :

a GstBufferListIterator

Returns :

the next buffer in the current group of the buffer list, or NULL. [transfer none]

Since 0.10.24


gst_buffer_list_iterator_next_group ()

gboolean            gst_buffer_list_iterator_next_group (GstBufferListIterator *it);

Advance the iterator it to the first buffer in the next group. If the iterator is at the last group, FALSE will be returned. This function may be called repeatedly to iterate through the groups in a buffer list.

it :

a GstBufferListIterator

Returns :

TRUE if the iterator could be advanced to the next group, FALSE if the iterator was already at the last group

Since 0.10.24


gst_buffer_list_iterator_remove ()

void                gst_buffer_list_iterator_remove     (GstBufferListIterator *it);

Removes the last buffer returned by gst_buffer_list_iterator_next() from the GstBufferList iterated with it. gst_buffer_list_iterator_next() must have been called on it before this function is called. This function can only be called once per call to gst_buffer_list_iterator_next().

The removed buffer is unreffed.

Since 0.10.24


gst_buffer_list_iterator_steal ()

GstBuffer *         gst_buffer_list_iterator_steal      (GstBufferListIterator *it);

Returns the last buffer returned by gst_buffer_list_iterator_next() without modifying the refcount of the buffer.

it :

a GstBufferListIterator

Returns :

the last buffer returned by gst_buffer_list_iterator_next(). [transfer none]

Since 0.10.24


gst_buffer_list_iterator_take ()

void                gst_buffer_list_iterator_take       (GstBufferListIterator *it,
                                                         GstBuffer *buffer);

Replaces the last buffer returned by gst_buffer_list_iterator_next() with buffer in the GstBufferList iterated with it and takes ownership of buffer. gst_buffer_list_iterator_next() must have been called on it before this function is called. gst_buffer_list_iterator_remove() must not have been called since the last call to gst_buffer_list_iterator_next().

This function unrefs the replaced buffer if it has not been stolen with gst_buffer_list_iterator_steal() and takes ownership of buffer (i.e. the refcount of buffer is not increased).

FIXME 0.11: this conditional taking-ownership is not good for bindings

it :

a GstBufferListIterator

buffer :

a GstBuffer. [transfer full]

Since 0.10.24


gst_buffer_list_iterator_do ()

GstBuffer *         gst_buffer_list_iterator_do         (GstBufferListIterator *it,
                                                         GstBufferListDoFunction do_func,
                                                         gpointer user_data);

Calls the given function for the last buffer returned by gst_buffer_list_iterator_next(). gst_buffer_list_iterator_next() must have been called on it before this function is called. gst_buffer_list_iterator_remove() and gst_buffer_list_iterator_steal() must not have been called since the last call to gst_buffer_list_iterator_next().

See GstBufferListDoFunction for more details.

it :

a GstBufferListIterator

do_func :

the function to be called. [scope call]

user_data :

the gpointer to optional user data. [closure]

Returns :

the return value from do_func. [transfer none]

Since 0.10.24


gst_buffer_list_iterator_merge_group ()

GstBuffer *         gst_buffer_list_iterator_merge_group
                                                        (const GstBufferListIterator *it);

Merge a buffer list group into a normal GstBuffer by copying its metadata and memcpying its data into consecutive memory. All buffers in the current group after the implicit cursor will be merged into one new buffer. The metadata of the new buffer will be a copy of the metadata of the buffer that would be returned by gst_buffer_list_iterator_next(). If there is no buffer in the current group after the implicit cursor, NULL will be returned.

This function will not move the implicit cursor or in any other way affect the state of the iterator it or the list.

it :

a GstBufferListIterator

Returns :

a new GstBuffer, gst_buffer_unref() after usage, or NULL. [transfer full]

Since 0.10.24

See Also

GstPad, GstMiniObject