gst/avi/gstavimux.*: Ensure header size invariance during subsequent rewrite by using...
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Tue, 6 Jan 2009 14:50:29 +0000 (14:50 +0000)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Tue, 6 Jan 2009 14:50:29 +0000 (14:50 +0000)
Original commit message from CVS:
* gst/avi/gstavimux.c: (gst_avi_mux_reset),
(gst_avi_mux_riff_get_avi_header):
* gst/avi/gstavimux.h:
Ensure header size invariance during subsequent rewrite by using
tags snapshot.

ChangeLog
gst/avi/gstavimux.c
gst/avi/gstavimux.h

index 823bc68da5626e5dec8420a93e3cabc7d2ec200c..2c97e711300dcd377c62185bde56e5ad0e2e7628 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2009-01-06  Mark Nauwelaerts  <mark.nauwelaerts@collabora.co.uk>
+
+       * gst/avi/gstavimux.c: (gst_avi_mux_reset),
+       (gst_avi_mux_riff_get_avi_header):
+       * gst/avi/gstavimux.h:
+       Ensure header size invariance during subsequent rewrite by using
+       tags snapshot.
+
 2009-01-05  Sebastian Dröge  <sebastian.droege@collabora.co.uk>
 
        * ext/pulse/pulsesink.c: (gst_pulsesink_destroy_stream):
index 0e3c4ad33d9822a8785107119091ee5ace9c736e..e93c8b18d937e414a0168cd81c0965057517124a 100644 (file)
@@ -383,6 +383,11 @@ gst_avi_mux_reset (GstAviMux * avimux)
   avimux->avi_hdr.max_bps = 10000000;
   avimux->codec_data_size = 0;
 
+  if (avimux->tags_snap) {
+    gst_tag_list_free (avimux->tags_snap);
+    avimux->tags_snap = NULL;
+  }
+
   g_free (avimux->idx);
   avimux->idx = NULL;
 
@@ -965,7 +970,15 @@ gst_avi_mux_riff_get_avi_header (GstAviMux * avimux)
   GST_DEBUG_OBJECT (avimux, "creating avi header, data_size %u, idx_size %u",
       avimux->data_size, avimux->idx_size);
 
-  tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (avimux));
+  if (avimux->tags_snap)
+    tags = avimux->tags_snap;
+  else {
+    /* need to make snapshot of current state of tags to ensure the same set
+     * is used next time around during header rewrite at the end */
+    tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (avimux));
+    if (tags)
+      tags = avimux->tags_snap = gst_tag_list_copy (tags);
+  }
   if (tags) {
     /* that should be the strlen of all tags + header sizes
      * not all of tags end up in a avi, still this is a good estimate
index f3b0665d832178e9e9bd23f5565d8861ac1026c9..3b392856303511b201ff6fff8bb3175beb9510c7 100644 (file)
@@ -148,6 +148,9 @@ struct _GstAviMux {
   gboolean write_header;
   gboolean restart;
 
+  /* tags */
+  GstTagList *tags_snap;
+
   /* information about the AVI index ('idx') */
   gst_riff_index_entry *idx;
   gint idx_index, idx_count;