From deb9c62cd9643f252dfa54c0a041d3b4e8e3ca07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 15 Jun 2017 11:50:44 +0300 Subject: [PATCH] qtmux: Un-merge the last two stsc entries after serializing The last entry will most likely get new samples added to it in "robust" muxing mode, changing the samples_per_chunk and thus making it wrong to keep the last two entries merged. It will run into an assertion later when adding a new sample to the chunk. Thanks to gdiener@cardinalpeak.com for the analysis of the bug and proposal for a solution. --- gst/isomp4/atoms.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/gst/isomp4/atoms.c b/gst/isomp4/atoms.c index 7fbbb1d627..adce9a1b0d 100644 --- a/gst/isomp4/atoms.c +++ b/gst/isomp4/atoms.c @@ -2221,6 +2221,7 @@ atom_stsc_copy_data (AtomSTSC * stsc, guint8 ** buffer, guint64 * size, { guint64 original_offset = *offset; guint i, len; + gboolean last_entries_merged = FALSE; if (!atom_full_copy_data (&stsc->header, buffer, size, offset)) { return 0; @@ -2232,6 +2233,7 @@ atom_stsc_copy_data (AtomSTSC * stsc, guint8 ** buffer, guint64 * size, ((atom_array_index (&stsc->entries, len - 1)).samples_per_chunk == (atom_array_index (&stsc->entries, len - 2)).samples_per_chunk)) { stsc->entries.len--; + last_entries_merged = TRUE; } prop_copy_uint32 (atom_array_get_len (&stsc->entries), buffer, size, offset); @@ -2248,6 +2250,15 @@ atom_stsc_copy_data (AtomSTSC * stsc, guint8 ** buffer, guint64 * size, } atom_write_size (buffer, size, offset, original_offset); + + /* Need to add the last entry again as in "robust" muxing mode we will most + * likely add new samples to the last chunk, thus making the + * samples_per_chunk in the last one different to the second to last one, + * and thus making it wrong to keep them merged + */ + if (last_entries_merged) + stsc->entries.len++; + return *offset - original_offset; }