Top |
void | (*GstIteratorCopyFunction) () |
GstIteratorResult | (*GstIteratorNextFunction) () |
GstIteratorItem | (*GstIteratorItemFunction) () |
void | (*GstIteratorResyncFunction) () |
void | (*GstIteratorFreeFunction) () |
void | (*GstIteratorForeachFunction) () |
gboolean | (*GstIteratorFoldFunction) () |
#define | GST_ITERATOR() |
#define | GST_ITERATOR_LOCK() |
#define | GST_ITERATOR_COOKIE() |
#define | GST_ITERATOR_ORIG_COOKIE() |
GstIterator * | gst_iterator_new () |
GstIterator * | gst_iterator_new_list () |
GstIterator * | gst_iterator_new_single () |
GstIterator * | gst_iterator_copy () |
void | gst_iterator_free () |
GstIteratorResult | gst_iterator_next () |
void | gst_iterator_resync () |
void | gst_iterator_push () |
GstIterator * | gst_iterator_filter () |
GstIteratorResult | gst_iterator_fold () |
GstIteratorResult | gst_iterator_foreach () |
gboolean | gst_iterator_find_custom () |
A GstIterator is used to retrieve multiple objects from another object in a threadsafe way.
Various GStreamer objects provide access to their internal structures using an iterator.
In general, whenever calling a GstIterator function results in your code receiving a refcounted object, the refcount for that object will have been increased. Your code is responsible for unreffing that object after use.
The basic use pattern of an iterator is as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
GstIterator *it = _get_iterator(object); done = FALSE; while (!done) { switch (gst_iterator_next (it, &item)) { case GST_ITERATOR_OK: ... use/change item here... g_value_reset (&item); break; case GST_ITERATOR_RESYNC: ...rollback changes to items... gst_iterator_resync (it); break; case GST_ITERATOR_ERROR: ...wrong parameters were given... done = TRUE; break; case GST_ITERATOR_DONE: done = TRUE; break; } } g_value_unset (&item); gst_iterator_free (it); |
void (*GstIteratorCopyFunction) (const GstIterator *it
,GstIterator *copy
);
This function will be called when creating a copy of it
and should
create a copy of all custom iterator fields or increase their
reference counts.
GstIteratorResult (*GstIteratorNextFunction) (GstIterator *it
,GValue *result
);
The function that will be called when the next element of the iterator should be retrieved.
Implementors of a GstIterator should implement this function and pass it to the constructor of the custom iterator. The function will be called with the iterator lock held.
GstIteratorItem (*GstIteratorItemFunction) (GstIterator *it
,const GValue *item
);
The function that will be called after the next item of the iterator has been retrieved. This function can be used to skip items or stop the iterator.
The function will be called with the iterator lock held.
void
(*GstIteratorResyncFunction) (GstIterator *it
);
This function will be called whenever a concurrent update happened to the iterated datastructure. The implementor of the iterator should restart the iterator from the beginning and clean up any state it might have.
Implementors of a GstIterator should implement this function and pass it to the constructor of the custom iterator. The function will be called with the iterator lock held.
void
(*GstIteratorFreeFunction) (GstIterator *it
);
This function will be called when the iterator is freed.
Implementors of a GstIterator should implement this function and pass it to the constructor of the custom iterator. The function will be called with the iterator lock held.
void (*GstIteratorForeachFunction) (const GValue *item
,gpointer user_data
);
A function that is called by gst_iterator_foreach()
for every element.
gboolean (*GstIteratorFoldFunction) (const GValue *item
,GValue *ret
,gpointer user_data
);
A function to be passed to gst_iterator_fold()
.
item |
the item to fold |
|
ret |
a GValue collecting the result |
|
user_data |
data passed to |
#define GST_ITERATOR_LOCK(it) (GST_ITERATOR(it)->lock)
Macro to get the lock protecting the datastructure being iterated.
#define GST_ITERATOR_COOKIE(it) (GST_ITERATOR(it)->cookie)
Macro to get the cookie of a GstIterator. The cookie of the iterator is the value of the master cookie when the iterator was created. Whenever the iterator is iterated, the value is compared to the value of the master cookie. If they are different, a concurrent modification happened to the iterator and a resync is needed.
#define GST_ITERATOR_ORIG_COOKIE(it) (GST_ITERATOR(it)->master_cookie)
Macro to get a pointer to where the master cookie is stored. The master cookie protects the structure being iterated and gets updated whenever the datastructure changes.
GstIterator * gst_iterator_new (guint size
,GType type
,GMutex *lock
,guint32 *master_cookie
,GstIteratorCopyFunction copy
,GstIteratorNextFunction next
,GstIteratorItemFunction item
,GstIteratorResyncFunction resync
,GstIteratorFreeFunction free
);
Create a new iterator. This function is mainly used for objects implementing the next/resync/free function to iterate a data structure.
For each item retrieved, the item
function is called with the lock
held. The free
function is called when the iterator is freed.
size |
the size of the iterator structure |
|
type |
GType of children |
|
lock |
pointer to a GMutex. |
|
master_cookie |
pointer to a guint32 that is changed when the items in the iterator changed. |
|
copy |
copy function |
|
next |
function to get next item |
|
item |
function to call on each item retrieved |
|
resync |
function to resync the iterator |
|
free |
function to free the iterator |
GstIterator * gst_iterator_new_list (GType type
,GMutex *lock
,guint32 *master_cookie
,GList **list
,GObject *owner
,GstIteratorItemFunction item
);
Create a new iterator designed for iterating list
.
The list you iterate is usually part of a data structure owner
and is
protected with lock
.
The iterator will use lock
to retrieve the next item of the list and it
will then call the item
function before releasing lock
again.
When a concurrent update to the list is performed, usually by owner
while
holding lock
, master_cookie
will be updated. The iterator implementation
will notice the update of the cookie and will return GST_ITERATOR_RESYNC
to
the user of the iterator in the next call to gst_iterator_next()
.
GstIterator * gst_iterator_new_single (GType type
,const GValue *object
);
This GstIterator is a convenient iterator for the common case where a GstIterator needs to be returned but only a single object has to be considered. This happens often for the GstPadIterIntLinkFunction.
GstIterator *
gst_iterator_copy (const GstIterator *it
);
Copy the iterator and its state.
GstIteratorResult gst_iterator_next (GstIterator *it
,GValue *elem
);
Get the next item from the iterator in elem
.
Only when this function returns GST_ITERATOR_OK
, elem
will contain a valid
value. elem
must have been initialized to the type of the iterator or
initialized to zeroes with g_value_unset()
. The caller is responsible for
unsetting or resetting elem
with g_value_unset()
or g_value_reset()
after usage.
When this function returns GST_ITERATOR_DONE
, no more elements can be
retrieved from it
.
A return value of GST_ITERATOR_RESYNC
indicates that the element list was
concurrently updated. The user of it
should call gst_iterator_resync()
to
get the newly updated list.
A return value of GST_ITERATOR_ERROR
indicates an unrecoverable fatal error.
void
gst_iterator_resync (GstIterator *it
);
Resync the iterator. this function is mostly called
after gst_iterator_next()
returned GST_ITERATOR_RESYNC
.
When an iterator was pushed on it
, it will automatically be popped again
with this function.
MT safe.
void gst_iterator_push (GstIterator *it
,GstIterator *other
);
Pushes other
iterator onto it
. All calls performed on it
are
forwarded to other
. If other
returns GST_ITERATOR_DONE
, it is
popped again and calls are handled by it
again.
This function is mainly used by objects implementing the iterator next function to recurse into substructures.
When gst_iterator_resync()
is called on it
, other
will automatically be
popped.
MT safe.
GstIterator * gst_iterator_filter (GstIterator *it
,GCompareFunc func
,const GValue *user_data
);
Create a new iterator from an existing iterator. The new iterator
will only return those elements that match the given compare function func
.
The first parameter that is passed to func
is the GValue of the current
iterator element and the second parameter is user_data
. func
should
return 0 for elements that should be included in the filtered iterator.
When this iterator is freed, it
will also be freed.
it |
The GstIterator to filter |
|
func |
the compare function to select elements. |
[scope call] |
user_data |
user data passed to the compare function. |
[closure] |
GstIteratorResult gst_iterator_fold (GstIterator *it
,GstIteratorFoldFunction func
,GValue *ret
,gpointer user_data
);
Folds func
over the elements of iter
. That is to say, func
will be called
as func
(object, ret
, user_data
) for each object in it
. The normal use
of this procedure is to accumulate the results of operating on the objects in
ret
.
This procedure can be used (and is used internally) to implement the
gst_iterator_foreach()
and gst_iterator_find_custom()
operations.
The fold will proceed as long as func
returns TRUE
. When the iterator has no
more arguments, GST_ITERATOR_DONE
will be returned. If func
returns FALSE
,
the fold will stop, and GST_ITERATOR_OK
will be returned. Errors or resyncs
will cause fold to return GST_ITERATOR_ERROR
or GST_ITERATOR_RESYNC
as
appropriate.
The iterator will not be freed.
it |
The GstIterator to fold over |
|
func |
the fold function. |
[scope call] |
ret |
the seed value passed to the fold function |
|
user_data |
user data passed to the fold function. |
[closure] |
GstIteratorResult gst_iterator_foreach (GstIterator *it
,GstIteratorForeachFunction func
,gpointer user_data
);
Iterate over all element of it
and call the given function func
for
each element.
it |
The GstIterator to iterate |
|
func |
the function to call for each element. |
[scope call] |
user_data |
user data passed to the function. |
[closure] |
gboolean gst_iterator_find_custom (GstIterator *it
,GCompareFunc func
,GValue *elem
,gpointer user_data
);
Find the first element in it
that matches the compare function func
.
func
should return 0 when the element is found. The first parameter
to func
will be the current element of the iterator and the
second parameter will be user_data
.
The result will be stored in elem
if a result is found.
The iterator will not be freed.
This function will return FALSE
if an error happened to the iterator
or if the element wasn't found.
it |
The GstIterator to iterate |
|
func |
the compare function to use. |
[scope call] |
elem |
pointer to a GValue where to store the result. |
[out] |
user_data |
user data passed to the compare function. |
[closure] |
struct GstIterator { };
GstIterator base structure. The values of this structure are protected for subclasses, use the methods to use the GstIterator.