From: <wt...@ke...> - 2008-06-10 11:05:37
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Jun 10 2008 11:05:45 UTC Log message: * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), (gst_avi_demux_parse_index), (gst_avi_demux_massage_index), (gst_avi_demux_calculate_durations_from_index), (gst_avi_demux_stream_header_push), (gst_avi_demux_stream_header_pull): Try to ignore unparsable/unknown streams and give a warning instead of erroring out. Fixes #537377. Modified files: . : ChangeLog gst/avi : gstavidemux.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3526&r2=1.3527 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/avi/gstavidemux.c.diff?r1=1.235&r2=1.236 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3526 retrieving revision 1.3527 diff -u -d -r1.3526 -r1.3527 --- ChangeLog 10 Jun 2008 10:44:49 -0000 1.3526 +++ ChangeLog 10 Jun 2008 11:05:29 -0000 1.3527 @@ -1,3 +1,13 @@ +2008-06-10 Wim Taymans <wim...@co...> + + * gst/avi/gstavidemux.c: (gst_avi_demux_parse_stream), + (gst_avi_demux_parse_index), (gst_avi_demux_massage_index), + (gst_avi_demux_calculate_durations_from_index), + (gst_avi_demux_stream_header_push), + (gst_avi_demux_stream_header_pull): + Try to ignore unparsable/unknown streams and give a warning instead of + erroring out. Fixes #537377. 2008-06-10 Sebastian Dröge <sl...@ci...> * gst/matroska/ebml-write.c: (gst_ebml_write_float): Index: gstavidemux.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/avi/gstavidemux.c,v retrieving revision 1.235 retrieving revision 1.236 diff -u -d -r1.235 -r1.236 --- gstavidemux.c 5 Jun 2008 09:45:00 -0000 1.235 +++ gstavidemux.c 10 Jun 2008 11:05:30 -0000 1.236 @@ -1335,12 +1335,12 @@ } if (!got_strh) { - GST_ERROR_OBJECT (avi, "Failed to find strh chunk"); + GST_WARNING_OBJECT (avi, "Failed to find strh chunk"); goto fail; if (!got_strf) { - GST_ERROR_OBJECT (avi, "Failed to find strf chunk"); + GST_WARNING_OBJECT (avi, "Failed to find strf chunk"); @@ -1642,6 +1642,11 @@ target->stream_nr = stream_nr; stream = &avi->stream[stream_nr]; + if (!stream->strh) { + GST_WARNING_OBJECT (avi, "Unhandled stream %d, skipping", stream_nr); + continue; + } target->index_nr = i; target->flags = (entry. @@ -2422,6 +2427,8 @@ gchar *pad_name; for (i = 0; i < avi->num_streams; i++) { + if (!avi->stream[i].pad) + continue; pad_name = GST_OBJECT_NAME (avi->stream[i].pad); sprintf (&str[i * (1 + 6 + 2)], " %6u %c", num_per_stream[i], pad_name[0]); @@ -2471,6 +2478,8 @@ avi_stream_context *streamc = &avi->stream[stream]; gst_riff_strh *strh = streamc->strh; + if (!strh) /* get header duration */ hduration = gst_util_uint64_scale ((guint64) strh->length * strh->scale, GST_SECOND, (guint64) strh->rate); @@ -2615,8 +2624,9 @@ switch (GST_READ_UINT32_LE (GST_BUFFER_DATA (sub))) { case GST_RIFF_LIST_strl: if (!(gst_avi_demux_parse_stream (avi, sub))) { - GST_DEBUG_OBJECT (avi, "avi_demux_parse_stream failed"); - return GST_FLOW_ERROR; + GST_ELEMENT_WARNING (avi, STREAM, DEMUX, (NULL), + ("failed to parse stream, ignoring")); + goto next; } goto next; case GST_RIFF_LIST_odml: @@ -2891,9 +2901,11 @@ switch (fourcc) { case GST_RIFF_LIST_strl: - if (!(gst_avi_demux_parse_stream (avi, sub))) - goto parse_stream_failed; - + if (!(gst_avi_demux_parse_stream (avi, sub))) { + GST_ELEMENT_WARNING (avi, STREAM, DEMUX, (NULL), + ("faile to parse stream, ignoring")); + sub = NULL; + } goto next; case GST_RIFF_LIST_odml: gst_avi_demux_parse_odml (avi, sub); @@ -2915,7 +2927,8 @@ /* fall-through */ case GST_RIFF_TAG_JUNK: next: - gst_buffer_unref (sub); + if (sub) + gst_buffer_unref (sub); sub = NULL; break; } @@ -3033,11 +3046,6 @@ return GST_FLOW_OK; /* ERRORS */ -parse_stream_failed: - { - GST_DEBUG_OBJECT (avi, "avi_demux_parse_stream failed"); - return GST_FLOW_ERROR; - } no_list: { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), |