queue: embed GstQueueArray structure
[platform/upstream/gstreamer.git] / plugins / elements / gstqueue.h
index 2cd55f3..1ed123e 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
  *                    2000 Wim Taymans <wtay@chello.be>
  *
- * gstqueue.h: 
+ * gstqueue.h:
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
 #ifndef __GST_QUEUE_H__
 #define __GST_QUEUE_H__
 
-
-#include <gst/gstelement.h>
-
+#include <gst/gst.h>
+#include "gstqueuearray.h"
 
 G_BEGIN_DECLS
 
-extern GstElementDetails gst_queue_details;
-
-
 #define GST_TYPE_QUEUE \
   (gst_queue_get_type())
 #define GST_QUEUE(obj) \
@@ -41,60 +37,118 @@ extern GstElementDetails gst_queue_details;
   (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;
+    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;
 
-  /* the queue of buffers we're keeping our grubby hands on */
-  GQueue *queue;
+  /* 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;
 
-  guint level_buffers; /* number of buffers queued here */
-  guint level_bytes;   /* number of bytes queued here */
-  guint64 level_time;  /* amount of time queued here */
+  /* flowreturn when srcpad is paused */
+  GstFlowReturn srcresult;
+  gboolean      unexpected;
+  gboolean      eos;
 
-  guint size_buffers;  /* size of queue in buffers */
-  guint size_bytes;    /* size of queue in bytes */
-  guint64 size_time;   /* size of queue in time */
+  /* the queue of data we're keeping our grubby hands on */
+  GstQueueArray queue;
 
-  gint leaky;          /* whether the queue is leaky, and if so at which end */
-  gint block_timeout;   /* microseconds until a blocked queue times out and returns GST_EVENT_FILLER. 
-                         * A value of -1 will block forever. */
-  guint min_threshold_bytes; /* the minimum number of bytes required before
-                              * waking up the reader thread */ 
-  gboolean may_deadlock; /* it the queue should fail on possible deadlocks */
-  gboolean interrupt;
-  gboolean flush;
+  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 */
+    orig_min_threshold; /* Original min.threshold, for reset in EOS */
 
-  GMutex *qlock;       /* lock for queue (vs object lock) */
-  GCond *not_empty;    /* signals buffers now available for reading */
-  GCond *not_full;     /* signals space now available for writing */
+  /* whether we leak data, and at which end */
+  gint leaky;
 
-  GTimeVal *timeval;   /* the timeout for the queue locking */
-  GAsyncQueue *events; /* upstream events get decoupled here */
+  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 {
   GstElementClass parent_class;
 
-  /* signal callbacks */
-  void (*full)         (GstQueue *queue);
+  /* 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 (*pushing)       (GstQueue *queue);
 };
 
-GType gst_queue_get_type (void);
+G_GNUC_INTERNAL GType gst_queue_get_type (void);
 
 G_END_DECLS