*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
*/
#ifndef __GST_QUEUE2_H__
#define __GST_QUEUE2_H__
#include <gst/gst.h>
+#include <stdio.h>
+#include <gst/base/gstqueuearray.h>
G_BEGIN_DECLS
-#define GST_TYPE_QUEUE \
- (gst_queue_get_type())
-#define GST_QUEUE(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_QUEUE,GstQueue))
-#define GST_QUEUE_CLASS(klass) \
- (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(klass) \
- (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QUEUE))
-#define GST_QUEUE_CAST(obj) \
- ((GstQueue *)(obj))
-
-typedef struct _GstQueue GstQueue;
-typedef struct _GstQueueSize GstQueueSize;
-typedef struct _GstQueueClass GstQueueClass;
-
-struct _GstQueue
+#define GST_TYPE_QUEUE2 \
+ (gst_queue2_get_type())
+#define GST_QUEUE2(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_QUEUE2,GstQueue2))
+#define GST_QUEUE2_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_QUEUE2,GstQueue2Class))
+#define GST_IS_QUEUE2(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QUEUE2))
+#define GST_IS_QUEUE2_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QUEUE2))
+#define GST_QUEUE2_CAST(obj) \
+ ((GstQueue2 *)(obj))
+
+typedef struct _GstQueue2 GstQueue2;
+typedef struct _GstQueue2Size GstQueue2Size;
+typedef struct _GstQueue2Class GstQueue2Class;
+typedef struct _GstQueue2Range GstQueue2Range;
+
+/* used to keep track of sizes (current and max) */
+struct _GstQueue2Size
+{
+ guint buffers;
+ guint bytes;
+ guint64 time;
+ guint64 rate_time;
+};
+
+struct _GstQueue2Range
+{
+ GstQueue2Range *next;
+
+ guint64 offset; /* offset of range start in source */
+ guint64 rb_offset; /* offset of range start in ring buffer */
+ guint64 writing_pos; /* writing position in source */
+ guint64 rb_writing_pos; /* writing position in ring buffer */
+ guint64 reading_pos; /* reading position in source */
+ guint64 max_reading_pos; /* latest requested offset in source */
+};
+
+struct _GstQueue2
{
GstElement element;
GstPad *sinkpad;
GstPad *srcpad;
+ /* upstream size in bytes (if downstream is operating in pull mode) */
+ guint64 upstream_size;
+
/* 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;
+ /* Bitrates taken from tags */
+ guint sink_tags_bitrate;
+ guint src_tags_bitrate;
+
/* flowreturn when srcpad is paused */
GstFlowReturn srcresult;
+ GstFlowReturn sinkresult;
gboolean is_eos;
gboolean unexpected;
/* the queue of data we're keeping our hands on */
- GQueue *queue;
+ GstQueueArray *queue;
+
+ GCond query_handled;
+ gboolean last_query; /* result of last serialized query */
+ GstQuery *last_handled_query;
- GstQueueSize cur_level; /* currently in the queue */
- GstQueueSize max_level; /* max. amount of data allowed in the queue */
+ GstQueue2Size cur_level; /* currently in the queue */
+ GstQueue2Size max_level; /* max. amount of data allowed in the queue */
gboolean use_buffering;
+ gboolean use_tags_bitrate;
+ gboolean use_bitrate_query;
gboolean use_rate_estimate;
GstClockTime buffering_interval;
- gint low_percent; /* low/high watermarks for buffering */
- gint high_percent;
+ guint downstream_bitrate; /* the bitrate reported by downstream */
+
+ /* low/high watermarks for buffering */
+ gint low_watermark;
+ gint high_watermark;
/* current buffering state */
gboolean is_buffering;
- guint buffering_iteration;
+ gint buffering_percent;
+ gint last_posted_buffering_percent;
/* for measuring input/output rates */
GTimer *in_timer;
gboolean in_timer_started;
+ gdouble last_update_in_rates_elapsed;
gdouble last_in_elapsed;
guint64 bytes_in;
gdouble byte_in_rate;
+ gdouble byte_in_period;
GTimer *out_timer;
gboolean out_timer_started;
guint64 bytes_out;
gdouble byte_out_rate;
- GMutex *qlock; /* lock for queue (vs object lock) */
+ GMutex qlock; /* lock for queue (vs object lock) */
gboolean waiting_add;
- GCond *item_add; /* signals buffers now available for reading */
+ GCond item_add; /* signals buffers now available for reading */
gboolean waiting_del;
- GCond *item_del; /* signals space now available for writing */
+ GCond item_del; /* signals space now available for writing */
/* temp location stuff */
gchar *temp_template;
gboolean temp_location_set;
gchar *temp_location;
+ gboolean temp_remove;
FILE *temp_file;
- guint64 writing_pos;
- guint64 reading_pos;
- guint64 max_reading_pos;
+ /* list of downloaded areas and the current area */
+ GstQueue2Range *ranges;
+ GstQueue2Range *current;
/* we need this to send the first new segment event of the stream
* because we can't save it on the file */
gboolean segment_event_received;
GstEvent *starting_segment;
+ gboolean seeking;
+
+ GstEvent *stream_start_event;
+ guint64 ring_buffer_max_size;
+ guint8 * ring_buffer;
+
+ volatile gint downstream_may_block;
+
+ GstBufferingMode mode;
+ gint64 buffering_left;
+ gint avg_in;
+ gint avg_out;
+ gboolean percent_changed;
+ GMutex buffering_post_lock; /* assures only one posted at a time */
};
-struct _GstQueueClass
+struct _GstQueue2Class
{
GstElementClass parent_class;
};
+G_GNUC_INTERNAL GType gst_queue2_get_type (void);
+
G_END_DECLS
#endif /* __GST_QUEUE2_H__ */