qtmux: handle issues correctly when downstream is not seekable
authorAndoni Morales Alastruey <ylatuya@gmail.com>
Tue, 17 Sep 2013 10:17:54 +0000 (12:17 +0200)
committerSebastian Dröge <slomo@circular-chaos.org>
Fri, 20 Sep 2013 08:09:48 +0000 (10:09 +0200)
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

index eb54cc0..58533a4 100644 (file)
@@ -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:
   {