#define __GST_QUEUE_H__
#include <gst/gst.h>
+#include "gstqueuearray.h"
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
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;
+
+ 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);
- void (*pushing) (GstQueue *queue);
+ void (*pushing) (GstQueue *queue);
};
-GType gst_queue_get_type (void);
+G_GNUC_INTERNAL GType gst_queue_get_type (void);
G_END_DECLS