rtpbin: Free storage when freeing session
[platform/upstream/gst-plugins-good.git] / gst / matroska / matroska-demux.h
index 7d55a22..68569b5 100644 (file)
@@ -1,5 +1,6 @@
 /* GStreamer Matroska muxer/demuxer
  * (c) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ * (c) 2011 Debarshi Ray <rishi@gnu.org>
  *
  * matroska-demux.h: matroska file/stream demuxer definition
  *
  *
  * 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_MATROSKA_DEMUX_H__
 #define __GST_MATROSKA_DEMUX_H__
 
 #include <gst/gst.h>
-#include <gst/bytestream/bytestream.h>
+#include <gst/base/gstflowcombiner.h>
 
 #include "ebml-read.h"
 #include "matroska-ids.h"
+#include "matroska-read-common.h"
 
 G_BEGIN_DECLS
+
 #define GST_TYPE_MATROSKA_DEMUX \
   (gst_matroska_demux_get_type ())
 #define GST_MATROSKA_DEMUX(obj) \
   (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MATROSKA_DEMUX, GstMatroskaDemux))
 #define GST_MATROSKA_DEMUX_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MATROSKA_DEMUX, GstMatroskaDemux))
+  (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MATROSKA_DEMUX, GstMatroskaDemuxClass))
 #define GST_IS_MATROSKA_DEMUX(obj) \
   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MATROSKA_DEMUX))
-#define GST_IS_MATROSKA_DEMUX_CLASS(obj) \
+#define GST_IS_MATROSKA_DEMUX_CLASS(klass) \
   (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MATROSKA_DEMUX))
-#define GST_MATROSKA_DEMUX_MAX_STREAMS 64
-    typedef enum
-{
-  GST_MATROSKA_DEMUX_STATE_START,
-  GST_MATROSKA_DEMUX_STATE_HEADER,
-  GST_MATROSKA_DEMUX_STATE_DATA
-} GstMatroskaDemuxState;
-
-typedef struct _GstMatroskaDemuxIndex
-{
-  guint64 pos;                 /* of the corresponding *cluster*! */
-  guint16 track;               /* reference to 'num' */
-  guint64 time;                        /* in nanoseconds */
-} GstMatroskaDemuxIndex;
-
-typedef struct _GstMatroskaDemux
-{
-  GstEbmlRead parent;
-
-  /* pads */
-  GstPad *sinkpad;
-  GstMatroskaTrackContext *src[GST_MATROSKA_DEMUX_MAX_STREAMS];
-  guint num_streams, num_v_streams, num_a_streams, num_t_streams;
-  GstClock *clock;
 
-  /* metadata */
-  GstCaps *metadata;
-  GstCaps *streaminfo;
-  gchar *muxing_app, *writing_app;
-  gint64 created;
-
-  /* state */
-  GstMatroskaDemuxState state;
-  guint level_up;
+typedef struct _GstMatroskaDemux {
+  GstElement              parent;
 
-  /* did we parse metadata/cues already? */
-  gboolean metadata_parsed, index_parsed;
+  /* < private > */
 
-  /* start-of-segment */
-  guint64 segment_start;
+  GstMatroskaReadCommon    common;
 
-  /* a cue (index) table */
-  GstMatroskaIndex *index;
-  guint num_indexes;
+  /* pads */
+  GstClock                *clock;
+  gboolean                 have_nonintraonly_v_streams;
+  guint                    num_v_streams;
+  guint                    num_a_streams;
+  guint                    num_t_streams;
 
-  /* timescale in the file */
-  guint64 time_scale;
+  guint                    group_id;
+  gboolean                 have_group_id;
 
-  /* length, position (time, ns) */
-  guint64 duration, pos;
+  GstFlowCombiner         *flowcombiner;
 
-  /* a possible pending seek */
-  guint64 seek_pending;
+  /* state */
+  gboolean                 streaming;
+  guint64                  seek_block;
+  gboolean                 seek_first;
+
+  /* did we parse cues/tracks/segmentinfo already? */
+  gboolean                 tracks_parsed;
+  GList                   *seek_parsed;
+
+  /* cluster positions (optional) */
+  GArray                  *clusters;
+
+  /* keeping track of playback position */
+  GstClockTime             last_stop_end;
+  GstClockTime             stream_start_time;
+
+  /* Stop time for reverse playback */
+  GstClockTime             to_time;
+  GstEvent                *new_segment;
+
+  /* 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
-{
-  GstEbmlReadClass parent;
+typedef struct _GstMatroskaDemuxClass {
+  GstElementClass parent;
 } GstMatroskaDemuxClass;
 
-GType gst_matroska_demux_get_type (void);
-
-gboolean gst_matroska_demux_plugin_init (GstPlugin * plugin);
+gboolean gst_matroska_demux_plugin_init (GstPlugin *plugin);
 
 G_END_DECLS
+
 #endif /* __GST_MATROSKA_DEMUX_H__ */