mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-09-08 21:28:45 +00:00
qtdemux: do not free streams if they were not created locally
When parsing a trak only free streams on failures if those streams were created locally. They could have been created from a previous fragment, in this case we they have valid info from the other fragment. Including pads. https://bugzilla.gnome.org/show_bug.cgi?id=691570
This commit is contained in:
parent
220a947dc7
commit
fcc78aa3bd
1 changed files with 13 additions and 6 deletions
|
@ -7078,6 +7078,7 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
|
||||||
GNode *tref;
|
GNode *tref;
|
||||||
|
|
||||||
QtDemuxStream *stream = NULL;
|
QtDemuxStream *stream = NULL;
|
||||||
|
gboolean new_stream = FALSE;
|
||||||
GstTagList *list = NULL;
|
GstTagList *list = NULL;
|
||||||
gchar *codec = NULL;
|
gchar *codec = NULL;
|
||||||
const guint8 *stsd_data;
|
const guint8 *stsd_data;
|
||||||
|
@ -7107,6 +7108,7 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
|
||||||
goto existing_stream;
|
goto existing_stream;
|
||||||
stream = _create_stream ();
|
stream = _create_stream ();
|
||||||
stream->track_id = track_id;
|
stream->track_id = track_id;
|
||||||
|
new_stream = TRUE;
|
||||||
} else {
|
} else {
|
||||||
stream = qtdemux_find_stream (qtdemux, track_id);
|
stream = qtdemux_find_stream (qtdemux, track_id);
|
||||||
if (!stream) {
|
if (!stream) {
|
||||||
|
@ -8494,20 +8496,23 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
|
||||||
skip_track:
|
skip_track:
|
||||||
{
|
{
|
||||||
GST_INFO_OBJECT (qtdemux, "skip disabled track");
|
GST_INFO_OBJECT (qtdemux, "skip disabled track");
|
||||||
g_free (stream);
|
if (new_stream)
|
||||||
|
g_free (stream);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
corrupt_file:
|
corrupt_file:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX,
|
GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX,
|
||||||
(_("This file is corrupt and cannot be played.")), (NULL));
|
(_("This file is corrupt and cannot be played.")), (NULL));
|
||||||
g_free (stream);
|
if (new_stream)
|
||||||
|
g_free (stream);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
error_encrypted:
|
error_encrypted:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (qtdemux, STREAM, DECRYPT, (NULL), (NULL));
|
GST_ELEMENT_ERROR (qtdemux, STREAM, DECRYPT, (NULL), (NULL));
|
||||||
g_free (stream);
|
if (new_stream)
|
||||||
|
g_free (stream);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
samples_failed:
|
samples_failed:
|
||||||
|
@ -8516,14 +8521,15 @@ segments_failed:
|
||||||
/* we posted an error already */
|
/* we posted an error already */
|
||||||
/* free stbl sub-atoms */
|
/* free stbl sub-atoms */
|
||||||
gst_qtdemux_stbl_free (stream);
|
gst_qtdemux_stbl_free (stream);
|
||||||
g_free (stream);
|
if (new_stream)
|
||||||
|
g_free (stream);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
existing_stream:
|
existing_stream:
|
||||||
{
|
{
|
||||||
GST_INFO_OBJECT (qtdemux, "stream with track id %i already exists",
|
GST_INFO_OBJECT (qtdemux, "stream with track id %i already exists",
|
||||||
track_id);
|
track_id);
|
||||||
if (stream)
|
if (new_stream)
|
||||||
g_free (stream);
|
g_free (stream);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -8531,7 +8537,8 @@ unknown_stream:
|
||||||
{
|
{
|
||||||
GST_INFO_OBJECT (qtdemux, "unknown subtype %" GST_FOURCC_FORMAT,
|
GST_INFO_OBJECT (qtdemux, "unknown subtype %" GST_FOURCC_FORMAT,
|
||||||
GST_FOURCC_ARGS (stream->subtype));
|
GST_FOURCC_ARGS (stream->subtype));
|
||||||
g_free (stream);
|
if (new_stream)
|
||||||
|
g_free (stream);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
too_many_streams:
|
too_many_streams:
|
||||||
|
|
Loading…
Reference in a new issue