matroskamux: add streamheaders
[platform/upstream/gst-plugins-good.git] / gst / matroska / ebml-write.h
index 8974ecb..72ac2e1 100644 (file)
@@ -1,5 +1,6 @@
 /* GStreamer EBML I/O
  * (c) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
+ * (c) 2005 Michal Benes <michal.benes@xeris.cz>
  *
  * ebml-write.c: write EBML data to file/stream
  *
 
 #include <glib.h>
 #include <gst/gst.h>
+#include <gst/base/gstbytewriter.h>
 
 G_BEGIN_DECLS
+
 #define GST_TYPE_EBML_WRITE \
   (gst_ebml_write_get_type ())
 #define GST_EBML_WRITE(obj) \
@@ -34,69 +37,113 @@ G_BEGIN_DECLS
   (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_EBML_WRITE, GstEbmlWriteClass))
 #define GST_IS_EBML_WRITE(obj) \
   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_EBML_WRITE))
-#define GST_IS_EBML_WRITE_CLASS(obj) \
+#define GST_IS_EBML_WRITE_CLASS(klass) \
   (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_EBML_WRITE))
 #define GST_EBML_WRITE_GET_CLASS(obj) \
   (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_EBML_WRITE, GstEbmlWriteClass))
-    typedef struct _GstEbmlWrite
-{
-  GstElement parent;
+
+typedef struct _GstEbmlWrite {
+  GstObject object;
 
   GstPad *srcpad;
   guint64 pos;
+  GstClockTime timestamp;
+
+  GstByteWriter *cache;
+  guint64 cache_pos;
+
+  GstFlowReturn last_write_result;
+
+  gboolean need_newsegment;
 
-  GstBuffer *cache;
-  guint handled;
+  gboolean writing_streamheader;
+  GstByteWriter *streamheader;
+  guint64 streamheader_pos;
 } GstEbmlWrite;
 
-typedef struct _GstEbmlWriteClass
-{
-  GstElementClass parent;
+typedef struct _GstEbmlWriteClass {
+  GstObjectClass parent;
 } GstEbmlWriteClass;
 
-GType gst_ebml_write_get_type (void);
+GType   gst_ebml_write_get_type      (void);
+
+GstEbmlWrite *gst_ebml_write_new     (GstPad *srcpad);
+void    gst_ebml_write_reset         (GstEbmlWrite *ebml);
+
+GstFlowReturn gst_ebml_last_write_result (GstEbmlWrite *ebml);
+
+/* Used to create streamheaders */
+void    gst_ebml_start_streamheader  (GstEbmlWrite *ebml);
+GstBuffer*    gst_ebml_stop_streamheader   (GstEbmlWrite *ebml);
 
 /*
  * Caching means that we do not push one buffer for
  * each element, but fill this one until a flush.
  */
-void gst_ebml_write_set_cache (GstEbmlWrite * ebml, guint size);
-void gst_ebml_write_flush_cache (GstEbmlWrite * ebml);
+void    gst_ebml_write_set_cache     (GstEbmlWrite *ebml,
+                                      guint         size);
+void    gst_ebml_write_flush_cache   (GstEbmlWrite *ebml);
 
 /*
  * Seeking.
  */
-void gst_ebml_write_seek (GstEbmlWrite * ebml, guint64 pos);
+void    gst_ebml_write_seek          (GstEbmlWrite *ebml,
+                                      guint64       pos);
 
 /*
  * Data writing. 
  */
-void gst_ebml_write_uint (GstEbmlWrite * ebml, guint32 id, guint64 num);
-void gst_ebml_write_sint (GstEbmlWrite * ebml, guint32 id, gint64 num);
-void gst_ebml_write_float (GstEbmlWrite * ebml, guint32 id, gdouble num);
-void gst_ebml_write_ascii (GstEbmlWrite * ebml, guint32 id, const gchar * str);
-void gst_ebml_write_utf8 (GstEbmlWrite * ebml, guint32 id, const gchar * str);
-void gst_ebml_write_date (GstEbmlWrite * ebml, guint32 id, gint64 date);
-guint64 gst_ebml_write_master_start (GstEbmlWrite * ebml, guint32 id);
-void gst_ebml_write_master_finish (GstEbmlWrite * ebml, guint64 startpos);
-void gst_ebml_write_binary (GstEbmlWrite * ebml,
-    guint32 id, guchar * binary, guint64 length);
-void gst_ebml_write_header (GstEbmlWrite * ebml,
-    gchar * doctype, guint version);
+void    gst_ebml_write_uint          (GstEbmlWrite *ebml,
+                                      guint32       id,
+                                      guint64       num);
+void    gst_ebml_write_sint          (GstEbmlWrite *ebml,
+                                      guint32       id,
+                                      gint64        num);
+void    gst_ebml_write_float         (GstEbmlWrite *ebml,
+                                      guint32       id,
+                                      gdouble       num);
+void    gst_ebml_write_ascii         (GstEbmlWrite *ebml,
+                                      guint32       id,
+                                      const gchar  *str);
+void    gst_ebml_write_utf8          (GstEbmlWrite *ebml,
+                                      guint32       id,
+                                      const gchar  *str);
+void    gst_ebml_write_date          (GstEbmlWrite *ebml,
+                                      guint32       id,
+                                      gint64        date);
+guint64 gst_ebml_write_master_start  (GstEbmlWrite *ebml,
+                                      guint32       id);
+void    gst_ebml_write_master_finish (GstEbmlWrite *ebml,
+                                      guint64       startpos);
+void    gst_ebml_write_master_finish_full (GstEbmlWrite * ebml,
+                                      guint64 startpos,
+                                      guint64 extra_size);
+void    gst_ebml_write_binary        (GstEbmlWrite *ebml,
+                                      guint32       id,
+                                      guchar       *binary,
+                                      guint64       length);
+void    gst_ebml_write_header        (GstEbmlWrite *ebml,
+                                      const gchar  *doctype,
+                                      guint         version);
 
 /*
  * Note: this is supposed to be used only for media data.
  */
-void gst_ebml_write_buffer_header (GstEbmlWrite * ebml,
-    guint32 id, guint64 length);
-void gst_ebml_write_buffer (GstEbmlWrite * ebml, GstBuffer * data);
+void    gst_ebml_write_buffer_header (GstEbmlWrite *ebml,
+                                      guint32       id,
+                                      guint64       length);
+void    gst_ebml_write_buffer        (GstEbmlWrite *ebml,
+                                      GstBuffer    *data);
 
 /*
  * A hack, basically... See matroska-mux.c. I should actually
  * make a nice _replace_element_with_size() or so, but this
  * works for now.
  */
-void gst_ebml_replace_uint (GstEbmlWrite * ebml, guint64 pos, guint64 num);
+void    gst_ebml_replace_uint        (GstEbmlWrite *ebml,
+                                      guint64       pos,
+                                      guint64       num);
 
 G_END_DECLS
+
 #endif /* __GST_EBML_WRITE_H__ */