queue: embed GstQueueArray structure
[platform/upstream/gstreamer.git] / plugins / elements / gstqueue.h
index dc728e7..1ed123e 100644 (file)
@@ -24,8 +24,8 @@
 #ifndef __GST_QUEUE_H__
 #define __GST_QUEUE_H__
 
-
-#include <gst/gstelement.h>
+#include <gst/gst.h>
+#include "gstqueuearray.h"
 
 G_BEGIN_DECLS
 
@@ -37,50 +37,103 @@ G_BEGIN_DECLS
   (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_QUEUE,GstQueueClass))
 #define GST_IS_QUEUE(obj) \
   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QUEUE))
-#define GST_IS_QUEUE_CLASS(obj) \
+#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
+ * @time: amount of time
+ *
+ * Structure describing the size of a queue.
+ */
 struct _GstQueueSize {
-    guint   buffers;   /* no. of buffers */
-    guint   bytes;     /* no. of bytes */
-    guint64 time;      /* amount of time */
+    guint   buffers;
+    guint   bytes;
+    guint64 time;
 };
 
+#define GST_QUEUE_CLEAR_LEVEL(l) G_STMT_START {         \
+  l.buffers = 0;                                        \
+  l.bytes = 0;                                          \
+  l.time = 0;                                           \
+} G_STMT_END
+
+/**
+ * GstQueue:
+ *
+ * Opaque #GstQueue structure.
+ */
 struct _GstQueue {
   GstElement element;
 
+  /*< private >*/
   GstPad *sinkpad;
   GstPad *srcpad;
 
+  /* segments to keep track of timestamps */
+  GstSegment sink_segment;
+  GstSegment src_segment;
+
+  /* position of src/sink */
+  GstClockTime sinktime, srctime;
+  /* TRUE if either position needs to be recalculated */
+  gboolean sink_tainted, src_tainted;
+
   /* flowreturn when srcpad is paused */
   GstFlowReturn srcresult;
+  gboolean      unexpected;
+  gboolean      eos;
 
   /* the queue of data we're keeping our grubby hands on */
-  GQueue *queue;
+  GstQueueArray queue;
 
   GstQueueSize
-    cur_level,         /* currently in the queue */
-    max_size,          /* max. amount of data allowed in the queue */
-    min_threshold;     /* min. amount of data required to wake reader */
+    cur_level,          /* currently in the queue */
+    max_size,           /* max. amount of data allowed in the queue */
+    min_threshold,      /* min. amount of data required to wake reader */
+    orig_min_threshold; /* Original min.threshold, for reset in EOS */
 
   /* 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;
 
-  gpointer _gst_reserved[GST_PADDING];
+  gboolean last_query;
 };
 
 struct _GstQueueClass {
@@ -88,14 +141,14 @@ struct _GstQueueClass {
 
   /* signals - 'running' is called from both sides
    * which might make it sort of non-useful... */
-  void (*underrun)     (GstQueue *queue);
-  void (*running)      (GstQueue *queue);
-  void (*overrun)      (GstQueue *queue);
+  void (*underrun)      (GstQueue *queue);
+  void (*running)       (GstQueue *queue);
+  void (*overrun)       (GstQueue *queue);
 
-  gpointer _gst_reserved[GST_PADDING];
+  void (*pushing)       (GstQueue *queue);
 };
 
-GType gst_queue_get_type (void);
+G_GNUC_INTERNAL GType gst_queue_get_type (void);
 
 G_END_DECLS