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
This commit is contained in:
Andoni Morales Alastruey 2013-09-17 12:17:54 +02:00 committed by Sebastian Dröge
parent 9ae5082204
commit cfefdaebb6

View 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;
}
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");
}
gst_query_unref (query);
if (!seekable) {
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");
}
}
}
/* 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:
{