From: Jan Schmidt Date: Tue, 15 Nov 2016 12:51:06 +0000 (+1100) Subject: baseparse: Restrict query/convert responses when demuxing X-Git-Tag: 1.12.0~232 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d81c0aec8164f27019b8b768eeebdc62ee5e5c68;p=platform%2Fupstream%2Fgstreamer.git baseparse: Restrict query/convert responses when demuxing If the parser is not parsing a raw elementary stream, restrict the position, duration and conversion query replies to things we can sensibly answer about - especially don't do random conversions to/from bytes. --- diff --git a/libs/gst/base/gstbaseparse.c b/libs/gst/base/gstbaseparse.c index 023864a..b90f561 100644 --- a/libs/gst/base/gstbaseparse.c +++ b/libs/gst/base/gstbaseparse.c @@ -1711,6 +1711,14 @@ gst_base_parse_convert_default (GstBaseParse * parse, return TRUE; } + if (parse->segment.format != GST_FORMAT_BYTES) { + /* don't do byte format conversions if we're not really parsing + * a raw elementary stream, since we don't really have BYTES + * position / duration info */ + if (src_format == GST_FORMAT_BYTES || dest_format == GST_FORMAT_BYTES); + goto no_slaved_conversions; + } + /* need at least some frames */ if (!parse->priv->framecount) goto no_framecount; @@ -1774,7 +1782,12 @@ no_duration_bytes: G_GUINT64_FORMAT, duration, bytes); return FALSE; } - +no_slaved_conversions: + { + GST_DEBUG_OBJECT (parse, + "Can't do format conversions when upstream format is not BYTES"); + return FALSE; + } } static void @@ -4048,7 +4061,10 @@ gst_base_parse_src_query_default (GstBaseParse * parse, GstQuery * query) if (!res) { /* Fall back on interpreting segment */ GST_OBJECT_LOCK (parse); - if (format == GST_FORMAT_BYTES) { + /* Only reply BYTES if upstream is in BYTES already, otherwise + * we're not in charge */ + if (format == GST_FORMAT_BYTES + && parse->segment.format == GST_FORMAT_BYTES) { dest_value = parse->priv->offset; res = TRUE; } else if (format == parse->segment.format && @@ -4058,9 +4074,10 @@ gst_base_parse_src_query_default (GstBaseParse * parse, GstQuery * query) res = TRUE; } GST_OBJECT_UNLOCK (parse); - if (!res) { + if (!res && parse->segment.format == GST_FORMAT_BYTES) { /* no precise result, upstream no idea either, then best estimate */ - /* priv->offset is updated in both PUSH/PULL modes */ + /* priv->offset is updated in both PUSH/PULL modes, *iff* we're + * in charge of things */ res = gst_base_parse_convert (parse, GST_FORMAT_BYTES, parse->priv->offset, format, &dest_value); }