consolidated IOV_MAX/UIO_MAXIOV handling per GLib + legacy behaviour for osx/ios
[platform/upstream/gstreamer.git] / plugins / elements / gstqueue2.h
index 44165b0..e71ec3f 100644 (file)
  *
  * 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
 
@@ -44,6 +46,7 @@ G_BEGIN_DECLS
 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
@@ -54,6 +57,18 @@ struct _GstQueue2Size
   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;
@@ -62,36 +77,60 @@ 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 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;
 
   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;
@@ -99,25 +138,40 @@ struct _GstQueue2
   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 _GstQueue2Class
@@ -125,7 +179,7 @@ struct _GstQueue2Class
   GstElementClass parent_class;
 };
 
-GType gst_queue2_get_type (void);
+G_GNUC_INTERNAL GType gst_queue2_get_type (void);
 
 G_END_DECLS