* 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/gst.h>
+#include "gstqueuearray.h"
-#include <gst/gstelement.h>
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-
-extern GstElementDetails gst_queue_details;
-
+G_BEGIN_DECLS
#define GST_TYPE_QUEUE \
(gst_queue_get_type())
(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 */
- GList *queue;
+ /* segments to keep track of timestamps */
+ GstSegment sink_segment;
+ GstSegment src_segment;
- guint level_buffers; /* number of buffers queued here */
- guint level_bytes; /* number of bytes queued here */
- guint64 level_time; /* amount of time queued here */
+ /* position of src/sink */
+ GstClockTime sinktime, srctime;
+ /* TRUE if either position needs to be recalculated */
+ gboolean sink_tainted, src_tainted;
- guint size_buffers; /* size of queue in buffers */
- guint size_bytes; /* size of queue in bytes */
- guint64 size_time; /* size of queue in time */
+ /* flowreturn when srcpad is paused */
+ GstFlowReturn srcresult;
+ gboolean unexpected;
+ gboolean eos;
- gint leaky; /* whether the queue is leaky, and if so at which end */
- gboolean may_deadlock; /* it the queue should fail on possible deadlocks */
- gboolean interrupt;
+ /* the queue of data we're keeping our grubby hands on */
+ GstQueueArray queue;
- GMutex *qlock; /* lock for queue (vs object lock) */
- /* we are single reader and single writer queue */
- gboolean reader; /* reader waiting on empty queue */
- gboolean writer; /* writer waiting on full queue */
- GCond *not_empty; /* signals buffers now available for reading */
- GCond *not_full; /* signals space now available for writing */
+ 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 */
- GTimeVal *timeval; /* the timeout for the queue locking */
+ /* whether we leak data, and at which end */
+ gint leaky;
+
+ 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 (*low_watermark) (GstQueue *queue, gint level);
- void (*high_watermark) (GstQueue *queue, gint level);
+ /* 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);
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
+G_END_DECLS
#endif /* __GST_QUEUE_H__ */