queue: embed GstQueueArray structure
[platform/upstream/gstreamer.git] / plugins / elements / gstqueue.h
index 1499c07..1ed123e 100644 (file)
@@ -25,6 +25,7 @@
 #define __GST_QUEUE_H__
 
 #include <gst/gst.h>
+#include "gstqueuearray.h"
 
 G_BEGIN_DECLS
 
@@ -38,18 +39,29 @@ G_BEGIN_DECLS
   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QUEUE))
 #define GST_IS_QUEUE_CLASS(klass) \
   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QUEUE))
-
-enum {
-  GST_QUEUE_NO_LEAK             = 0,
-  GST_QUEUE_LEAK_UPSTREAM       = 1,
-  GST_QUEUE_LEAK_DOWNSTREAM     = 2
-};
+#define GST_QUEUE_CAST(obj) \
+  ((GstQueue *)(obj))
 
 typedef struct _GstQueue GstQueue;
 typedef struct _GstQueueSize GstQueueSize;
+typedef enum _GstQueueLeaky GstQueueLeaky;
 typedef struct _GstQueueClass GstQueueClass;
 
 /**
+ * GstQueueLeaky:
+ * @GST_QUEUE_NO_LEAK: Not Leaky
+ * @GST_QUEUE_LEAK_UPSTREAM: Leaky on upstream (new buffers)
+ * @GST_QUEUE_LEAK_DOWNSTREAM: Leaky on downstream (old buffers)
+ *
+ * Buffer dropping scheme to avoid the queue to block when full.
+ */
+enum _GstQueueLeaky {
+  GST_QUEUE_NO_LEAK             = 0,
+  GST_QUEUE_LEAK_UPSTREAM       = 1,
+  GST_QUEUE_LEAK_DOWNSTREAM     = 2
+};
+
+/*
  * GstQueueSize:
  * @buffers: number of buffers
  * @bytes: number of bytes
@@ -96,7 +108,7 @@ struct _GstQueue {
   gboolean      eos;
 
   /* the queue of data we're keeping our grubby hands on */
-  GQueue *queue;
+  GstQueueArray queue;
 
   GstQueueSize
     cur_level,          /* currently in the queue */
@@ -107,12 +119,21 @@ struct _GstQueue {
   /* whether we leak data, and at which end */
   gint leaky;
 
-  GMutex *qlock;        /* lock for queue (vs object lock) */
-  GCond *item_add;      /* signals buffers now available for reading */
-  GCond *item_del;      /* signals space now available for writing */
+  GMutex qlock;        /* lock for queue (vs object lock) */
+  gboolean waiting_add;
+  GCond item_add;      /* signals buffers now available for reading */
+  gboolean waiting_del;
+  GCond item_del;      /* signals space now available for writing */
 
   gboolean head_needs_discont, tail_needs_discont;
   gboolean push_newsegment;
+
+  gboolean silent;      /* don't emit signals */
+
+  /* whether the first new segment has been applied to src */
+  gboolean newseg_applied_to_src;
+
+  gboolean last_query;
 };
 
 struct _GstQueueClass {
@@ -127,7 +148,7 @@ struct _GstQueueClass {
   void (*pushing)       (GstQueue *queue);
 };
 
-GType gst_queue_get_type (void);
+G_GNUC_INTERNAL GType gst_queue_get_type (void);
 
 G_END_DECLS