diff --git a/docs/libs/gstreamer-libs-sections.txt b/docs/libs/gstreamer-libs-sections.txt index 09df489f1e..d7d56345a9 100644 --- a/docs/libs/gstreamer-libs-sections.txt +++ b/docs/libs/gstreamer-libs-sections.txt @@ -939,6 +939,7 @@ gst_queue_array_free gst_queue_array_get_length gst_queue_array_pop_head gst_queue_array_peek_head +gst_queue_array_peek_nth gst_queue_array_push_tail gst_queue_array_pop_tail gst_queue_array_peek_tail @@ -948,6 +949,7 @@ gst_queue_array_find gst_queue_array_new_for_struct gst_queue_array_push_tail_struct gst_queue_array_peek_head_struct +gst_queue_array_peek_nth_struct gst_queue_array_pop_head_struct gst_queue_array_peek_tail_struct gst_queue_array_pop_tail_struct diff --git a/libs/gst/base/gstqueuearray.c b/libs/gst/base/gstqueuearray.c index 3434c815de..de8e0b4d85 100644 --- a/libs/gst/base/gstqueuearray.c +++ b/libs/gst/base/gstqueuearray.c @@ -217,6 +217,46 @@ gst_queue_array_peek_head (GstQueueArray * array) return *(gpointer *) (array->array + (sizeof (gpointer) * array->head)); } +/** + * gst_queue_array_peek_nth: (skip) + * + * Returns the item at @idx in @array, but does not remove it from the queue. + * + * Returns: The item, or %NULL if @idx was out of bounds + * + * Since: 1.16 + */ +gpointer +gst_queue_array_peek_nth (GstQueueArray * array, guint idx) +{ + g_return_val_if_fail (array != NULL, NULL); + g_return_val_if_fail (idx < array->length, NULL); + + idx = (array->head + idx) % array->size; + + return *(gpointer *) (array->array + (sizeof (gpointer) * idx)); +} + +/** + * gst_queue_array_peek_nth_struct: (skip) + * + * Returns the item at @idx in @array, but does not remove it from the queue. + * + * Returns: The item, or %NULL if @idx was out of bounds + * + * Since: 1.16 + */ +gpointer +gst_queue_array_peek_nth_struct (GstQueueArray * array, guint idx) +{ + g_return_val_if_fail (array != NULL, NULL); + g_return_val_if_fail (idx < array->length, NULL); + + idx = (array->head + idx) % array->size; + + return array->array + (array->elt_size * idx); +} + static void gst_queue_array_do_expand (GstQueueArray * array) { diff --git a/libs/gst/base/gstqueuearray.h b/libs/gst/base/gstqueuearray.h index 7f6db21660..5ad2f6ded6 100644 --- a/libs/gst/base/gstqueuearray.h +++ b/libs/gst/base/gstqueuearray.h @@ -45,6 +45,9 @@ gpointer gst_queue_array_pop_head (GstQueueArray * array); GST_BASE_API gpointer gst_queue_array_peek_head (GstQueueArray * array); +GST_BASE_API +gpointer gst_queue_array_peek_nth (GstQueueArray * array, guint idx); + GST_BASE_API gpointer gst_queue_array_pop_tail (GstQueueArray * array); @@ -81,12 +84,16 @@ gpointer gst_queue_array_pop_head_struct (GstQueueArray * array); GST_BASE_API gpointer gst_queue_array_peek_head_struct (GstQueueArray * array); +GST_BASE_API +gpointer gst_queue_array_peek_nth_struct (GstQueueArray * array, guint idx); + GST_BASE_API gboolean gst_queue_array_drop_struct (GstQueueArray * array, guint idx, gpointer p_struct); GST_BASE_API gpointer gst_queue_array_pop_tail_struct (GstQueueArray * array); + GST_BASE_API gpointer gst_queue_array_peek_tail_struct (GstQueueArray * array); diff --git a/tests/check/libs/queuearray.c b/tests/check/libs/queuearray.c index d9f0f008bd..acd8e5c9a5 100644 --- a/tests/check/libs/queuearray.c +++ b/tests/check/libs/queuearray.c @@ -261,6 +261,33 @@ GST_START_TEST (test_array_grow_from_prealloc1) } GST_END_TEST; +GST_START_TEST (test_array_peek_nth) +{ + GstQueueArray *array; + guint i; + + /* Create an array of initial size 10 */ + array = gst_queue_array_new (10); + + /* push 10 values in */ + for (i = 0; i < 10; i++) + gst_queue_array_push_tail (array, GINT_TO_POINTER (i)); + + for (i = 0; i < 10; i++) + fail_unless_equals_int (GPOINTER_TO_INT (gst_queue_array_peek_nth (array, + i)), i); + + gst_queue_array_pop_head (array); + + for (i = 0; i < 9; i++) + fail_unless_equals_int (GPOINTER_TO_INT (gst_queue_array_peek_nth (array, + i)), i + 1); + + gst_queue_array_free (array); +} + +GST_END_TEST; + GST_START_TEST (test_array_peek_pop_tail) { @@ -330,6 +357,7 @@ gst_queue_array_suite (void) tcase_add_test (tc_chain, test_array_drop2); tcase_add_test (tc_chain, test_array_grow_from_prealloc1); tcase_add_test (tc_chain, test_array_peek_pop_tail); + tcase_add_test (tc_chain, test_array_peek_nth); return s; } diff --git a/win32/common/libgstbase.def b/win32/common/libgstbase.def index 528ed9821e..9273133e80 100644 --- a/win32/common/libgstbase.def +++ b/win32/common/libgstbase.def @@ -316,6 +316,8 @@ EXPORTS gst_queue_array_new_for_struct gst_queue_array_peek_head gst_queue_array_peek_head_struct + gst_queue_array_peek_nth + gst_queue_array_peek_nth_struct gst_queue_array_peek_tail gst_queue_array_peek_tail_struct gst_queue_array_pop_head