* 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
(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;
- /* number of nanoseconds until a blocked queue 'times out'
- * to receive data and returns a filler event. -1 = disable */
- guint64 block_timeout;
+ 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;
- /* it the queue should fail on possible deadlocks */
- gboolean may_deadlock;
- gboolean flush;
+ gboolean silent; /* don't emit signals */
- 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 */
+ /* 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 {
/* 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