qtmux: Clear edit lists every time we recalculate them
authorSebastian Dröge <sebastian@centricular.com>
Wed, 8 Feb 2017 15:24:26 +0000 (17:24 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Wed, 8 Feb 2017 15:26:21 +0000 (17:26 +0200)
We recalculate them, so any old information has to be forgotten.
Otherwise we write invalid edit lists when writing headers multiple
times.

https://bugzilla.gnome.org/show_bug.cgi?id=778330

gst/isomp4/atoms.c
gst/isomp4/atoms.h
gst/isomp4/gstqtmux.c

index 64c121f..4c0453f 100644 (file)
@@ -3716,6 +3716,15 @@ atom_edts_add_entry (AtomEDTS * edts, gint index, EditListEntry * entry)
   *e = *entry;
 }
 
+void
+atom_trak_edts_clear (AtomTRAK * trak)
+{
+  if (trak->edts) {
+    atom_edts_clear (trak->edts);
+    trak->edts = NULL;
+  }
+}
+
 /*
  * Update an entry in this trak edits list, creating it if needed.
  * index is the index of the entry to update, or create if it's past the end.
index d38980b..fad8b0b 100644 (file)
@@ -918,6 +918,7 @@ void       atom_trak_add_samples       (AtomTRAK * trak, guint32 nsamples, guint
                                         gint64 pts_offset);
 void       atom_trak_set_elst_entry    (AtomTRAK * trak, gint index, guint32 duration,
                                         guint32 media_time, guint32 rate);
+void       atom_trak_edts_clear        (AtomTRAK * trak);
 guint32    atom_trak_get_timescale     (AtomTRAK *trak);
 guint32    atom_trak_get_id            (AtomTRAK * trak);
 void       atom_stbl_add_samples       (AtomSTBL * stbl, guint32 nsamples,
index 39640e7..8be98ba 100644 (file)
@@ -2511,6 +2511,8 @@ gst_qt_mux_update_edit_lists (GstQTMux * qtmux)
     GstCollectData *cdata = (GstCollectData *) walk->data;
     GstQTPad *qtpad = (GstQTPad *) cdata;
 
+    atom_trak_edts_clear (qtpad->trak);
+
     if (GST_CLOCK_TIME_IS_VALID (qtpad->first_ts)) {
       guint32 lateness = 0;
       guint32 duration = qtpad->trak->tkhd.duration;
@@ -2556,7 +2558,6 @@ gst_qt_mux_update_edit_lists (GstQTMux * qtmux)
 
       /* need to add the empty time to the trak duration */
       duration += lateness;
-
       qtpad->trak->tkhd.duration = duration;
       if (qtpad->tc_trak) {
         qtpad->tc_trak->tkhd.duration = duration;