rtpbin: Free storage when freeing session
[platform/upstream/gst-plugins-good.git] / gst / matroska / matroska-demux.h
index d9da4ae..68569b5 100644 (file)
@@ -24,6 +24,7 @@
 #define __GST_MATROSKA_DEMUX_H__
 
 #include <gst/gst.h>
+#include <gst/base/gstflowcombiner.h>
 
 #include "ebml-read.h"
 #include "matroska-ids.h"
@@ -51,6 +52,7 @@ typedef struct _GstMatroskaDemux {
 
   /* pads */
   GstClock                *clock;
+  gboolean                 have_nonintraonly_v_streams;
   guint                    num_v_streams;
   guint                    num_a_streams;
   guint                    num_t_streams;
@@ -58,9 +60,10 @@ typedef struct _GstMatroskaDemux {
   guint                    group_id;
   gboolean                 have_group_id;
 
+  GstFlowCombiner         *flowcombiner;
+
   /* state */
   gboolean                 streaming;
-  guint                    level_up;
   guint64                  seek_block;
   gboolean                 seek_first;
 
@@ -82,27 +85,49 @@ typedef struct _GstMatroskaDemux {
   /* some state saving */
   GstClockTime             cluster_time;
   guint64                  cluster_offset;
+  guint64                  cluster_prevsize;       /* 0 if unknown */
   guint64                  first_cluster_offset;
   guint64                  next_cluster_offset;
   GstClockTime             requested_seek_time;
   guint64                  seek_offset;
 
+  /* alternative duration; optionally obtained from last cluster */
+  guint64                  last_cluster_offset;
+  GstClockTime             stream_last_time;
+
   /* index stuff */
   gboolean                 seekable;
   gboolean                 building_index;
   guint64                  index_offset;
   GstEvent                *seek_event;
+  GstEvent                *deferred_seek_event;
+  GstPad                  *deferred_seek_pad;
   gboolean                 need_segment;
+  guint32                  segment_seqnum;
 
   /* reverse playback */
   GArray                  *seek_index;
   gint                     seek_entry;
 
+  gboolean                 seen_cluster_prevsize;  /* We track this because the
+                                                    * first cluster won't have
+                                                    * this set, so we can't just
+                                                    * check cluster_prevsize to
+                                                    * determine if it's there
+                                                    * or not. We assume if one
+                                                    * cluster has it, all but
+                                                    * the first will have it. */
+
+  guint                    max_backtrack_distance; /* in seconds (0 = don't backtrack) */
+
   /* gap handling */
   guint64                  max_gap_time;
 
   /* for non-finalized files, with invalid segment duration */
   gboolean                 invalid_duration;
+
+  /* Cached upstream length (default G_MAXUINT64) */
+  guint64                 cached_length;
 } GstMatroskaDemux;
 
 typedef struct _GstMatroskaDemuxClass {