qtdemux: Gracefully handle mov files misusing the WAVE atoms

Check that the WAVEHEADER node is present instead of blindly using it.
If not present we won't be able to provide a more refined caps, but at
least we won't crash.

https://bugzilla.gnome.org/show_bug.cgi?id=640028
This commit is contained in:
Edward Hervey 2011-01-20 11:45:47 +01:00
parent 9acda034f8
commit 6d545e29ad

View file

@ -7004,31 +7004,34 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
guint32 headerlen; guint32 headerlen;
waveheadernode = qtdemux_tree_get_child_by_type (wavenode, fourcc); waveheadernode = qtdemux_tree_get_child_by_type (wavenode, fourcc);
waveheader = (const guint8 *) waveheadernode->data; if (waveheadernode) {
headerlen = QT_UINT32 (waveheader); waveheader = (const guint8 *) waveheadernode->data;
headerlen = QT_UINT32 (waveheader);
if (headerlen > 8) { if (headerlen > 8) {
gst_riff_strf_auds *header = NULL; gst_riff_strf_auds *header = NULL;
GstBuffer *headerbuf; GstBuffer *headerbuf;
GstBuffer *extra; GstBuffer *extra;
waveheader += 8; waveheader += 8;
headerlen -= 8; headerlen -= 8;
headerbuf = gst_buffer_new (); headerbuf = gst_buffer_new ();
GST_BUFFER_DATA (headerbuf) = (guint8 *) waveheader; GST_BUFFER_DATA (headerbuf) = (guint8 *) waveheader;
GST_BUFFER_SIZE (headerbuf) = headerlen; GST_BUFFER_SIZE (headerbuf) = headerlen;
if (gst_riff_parse_strf_auds (GST_ELEMENT_CAST (qtdemux), if (gst_riff_parse_strf_auds (GST_ELEMENT_CAST (qtdemux),
headerbuf, &header, &extra)) { headerbuf, &header, &extra)) {
gst_caps_unref (stream->caps); gst_caps_unref (stream->caps);
stream->caps = gst_riff_create_audio_caps (header->format, NULL, stream->caps = gst_riff_create_audio_caps (header->format, NULL,
header, extra, NULL, NULL); header, extra, NULL, NULL);
if (extra) if (extra)
gst_buffer_unref (extra); gst_buffer_unref (extra);
}
} }
} } else
GST_DEBUG ("Didn't find waveheadernode for this codec");
} }
g_node_destroy (wavenode); g_node_destroy (wavenode);
} }