From cfefdaebb697a29ea96229dd649ae05a80c9aeaf Mon Sep 17 00:00:00 2001 From: Andoni Morales Alastruey Date: Tue, 17 Sep 2013 12:17:54 +0200 Subject: [PATCH] qtmux: handle issues correctly when downstream is not seekable The streamable property only make sense for fragmented formats. For regular MP4, when downstream is not seekable we can't rewrite the headers, so qtmux can only work with fast-start=TRUE, where the headers are written finishing the file. For fragmented MP4, when streamable is not seekable and the streamable property is FALSE, we must enforce streamable=TRUE warning the user about this change https://bugzilla.gnome.org/show_bug.cgi?id=707242 --- gst/isomp4/gstqtmux.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/gst/isomp4/gstqtmux.c b/gst/isomp4/gstqtmux.c index eb54cc0..58533a4 100644 --- a/gst/isomp4/gstqtmux.c +++ b/gst/isomp4/gstqtmux.c @@ -1615,6 +1615,7 @@ serialize_error: static GstFlowReturn gst_qt_mux_start_file (GstQTMux * qtmux) { + GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux)); GstFlowReturn ret = GST_FLOW_OK; GstCaps *caps; GstSegment segment; @@ -1648,14 +1649,20 @@ gst_qt_mux_start_file (GstQTMux * qtmux) GST_WARNING_OBJECT (qtmux, "downstream did not handle seeking query"); seekable = FALSE; } + gst_query_unref (query); if (!seekable) { - qtmux->streamable = TRUE; - g_object_notify (G_OBJECT (qtmux), "streamable"); - GST_WARNING_OBJECT (qtmux, "downstream is not seekable, but " - "streamable=false. Will ignore that and create streamable output " - "instead"); + if (qtmux_klass->format != GST_QT_MUX_FORMAT_ISML) { + if (!qtmux->fast_start) { + goto not_seekable_error; + } + } else { + GST_WARNING_OBJECT (qtmux, "downstream is not seekable, but " + "streamable=false. Will ignore that and create streamable output " + "instead"); + qtmux->streamable = TRUE; + g_object_notify (G_OBJECT (qtmux), "streamable"); + } } - gst_query_unref (query); } /* let downstream know we think in BYTES and expect to do seeking later on */ @@ -1767,6 +1774,15 @@ gst_qt_mux_start_file (GstQTMux * qtmux) exit: return ret; +not_seekable_error: + { + GST_ELEMENT_ERROR (qtmux, STREAM, FAILED, + ("Downstream is not seekable and headers can't be rewritten"), + GST_ERROR_SYSTEM); + GST_OBJECT_UNLOCK (qtmux); + return GST_FLOW_ERROR; + } + /* ERRORS */ open_failed: { -- 2.7.4