API: gst_queue_array_peek_nth
authorMathieu Duponchelle <mathieu@centricular.com>
Wed, 11 Apr 2018 13:38:36 +0000 (15:38 +0200)
committerMathieu Duponchelle <mathieu@centricular.com>
Fri, 13 Apr 2018 22:14:56 +0000 (00:14 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=795157

docs/libs/gstreamer-libs-sections.txt
libs/gst/base/gstqueuearray.c
libs/gst/base/gstqueuearray.h
tests/check/libs/queuearray.c
win32/common/libgstbase.def

index 09df489..d7d5634 100644 (file)
@@ -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
index 3434c81..de8e0b4 100644 (file)
@@ -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)
 {
index 7f6db21..5ad2f6d 100644 (file)
@@ -46,6 +46,9 @@ 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);
 
 GST_BASE_API
@@ -82,11 +85,15 @@ 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);
 
index d9f0f00..acd8e5c 100644 (file)
@@ -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;
 }
index 528ed98..9273133 100644 (file)
@@ -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