*
* 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
{
GstQueue2Range *next;
- guint64 offset;
- guint64 writing_pos;
- guint64 reading_pos;
- guint64 max_reading_pos;
+ 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
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 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;
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;
gint buffering_percent;
- guint buffering_iteration;
+ 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;
* 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;
- gboolean use_ring_buffer;
- guint ring_buffer_max_size;
+ 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 _GstQueue2Class
GstElementClass parent_class;
};
-GType gst_queue2_get_type (void);
+G_GNUC_INTERNAL GType gst_queue2_get_type (void);
G_END_DECLS