summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2016-11-22 20:24:59 +0200
committerSebastian Dröge <sebastian@centricular.com>2016-11-22 20:24:59 +0200
commit5d4c71d76e553d40f22e25bf7bad81b77ceb7ac5 (patch)
tree932704cc716c746396e9bf1b37dd159b16992d4a
parentc0da05df383b5d6b2e018069b4398be8c3d4f121 (diff)
matroskademux: Fix cluster searching if we search multiple times in one chunk
After finding a cluster id in the byte reader, we skip ahead the reader position by one further byte to be able to continue searching from there inside the same chunk if the cluster candidate was a false positive. We have to accomodate for that additional byte when resuming the search, otherwise all following pulls are off-by-one for every resume and we run into an assertion.
-rw-r--r--gst/matroska/matroska-demux.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c
index ae787453b..ee808ffb8 100644
--- a/gst/matroska/matroska-demux.c
+++ b/gst/matroska/matroska-demux.c
@@ -1766,13 +1766,22 @@ gst_matroska_demux_search_cluster (GstMatroskaDemux * demux, gint64 * pos)
demux->common.offset += length + needed;
ret = gst_matroska_read_common_peek_id_length_pull (&demux->common,
GST_ELEMENT_CAST (demux), &id, &length, &needed);
- if (ret != GST_FLOW_OK)
+ if (ret != GST_FLOW_OK) {
+ /* we skipped one byte in the reader above, need to accomodate for
+ * that when resuming skipping from the reader instead of reading a
+ * new chunk */
+ newpos += 1;
goto resume;
+ }
GST_DEBUG_OBJECT (demux, "next element is %scluster",
id == GST_MATROSKA_ID_CLUSTER ? "" : "not ");
if (id == GST_MATROSKA_ID_CLUSTER)
break;
- /* not ok, resume */
+ /* not ok, resume
+ * we skipped one byte in the reader above, need to accomodate for
+ * that when resuming skipping from the reader instead of reading a
+ * new chunk */
+ newpos += 1;
goto resume;
} else {
/* partial cluster id may have been in tail of buffer */