From fb25aced92f9d2d0396f62b7b157ca9666285d86 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Sun, 7 Jun 2009 13:37:04 +0200 Subject: [PATCH] wavparse: handle LIST INFO of 0 size Handle LIST INFO chunks of 0 size instead of causing errors. Fixes #584981 --- gst/wavparse/gstwavparse.c | 49 ++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/gst/wavparse/gstwavparse.c b/gst/wavparse/gstwavparse.c index 2aea100..b169d8a 100644 --- a/gst/wavparse/gstwavparse.c +++ b/gst/wavparse/gstwavparse.c @@ -1429,36 +1429,42 @@ gst_wavparse_stream_headers (GstWavParse * wav) const guint data_size = size - 4; GstTagList *new; - GST_INFO_OBJECT (wav, "Have LIST chunk INFO"); + GST_INFO_OBJECT (wav, "Have LIST chunk INFO size %u", data_size); if (wav->streaming) { gst_adapter_flush (wav->adapter, 12); if (gst_adapter_available (wav->adapter) < data_size) { return GST_FLOW_OK; } gst_buffer_unref (buf); - buf = gst_adapter_take_buffer (wav->adapter, data_size); + if (data_size > 0) + buf = gst_adapter_take_buffer (wav->adapter, data_size); } else { wav->offset += 12; gst_buffer_unref (buf); - if ((res = - gst_pad_pull_range (wav->sinkpad, wav->offset, data_size, - &buf)) != GST_FLOW_OK) - goto header_read_error; - } - /* parse tags */ - gst_riff_parse_info (GST_ELEMENT (wav), buf, &new); - if (new) { - GstTagList *old = wav->tags; - wav->tags = gst_tag_list_merge (old, new, GST_TAG_MERGE_REPLACE); - if (old) - gst_tag_list_free (old); - gst_tag_list_free (new); + if (data_size > 0) { + if ((res = + gst_pad_pull_range (wav->sinkpad, wav->offset, + data_size, &buf)) != GST_FLOW_OK) + goto header_read_error; + } } - if (wav->streaming) { - gst_adapter_flush (wav->adapter, data_size); - } else { - gst_buffer_unref (buf); - wav->offset += data_size; + if (data_size > 0) { + /* parse tags */ + gst_riff_parse_info (GST_ELEMENT (wav), buf, &new); + if (new) { + GstTagList *old = wav->tags; + wav->tags = + gst_tag_list_merge (old, new, GST_TAG_MERGE_REPLACE); + if (old) + gst_tag_list_free (old); + gst_tag_list_free (new); + } + if (wav->streaming) { + gst_adapter_flush (wav->adapter, data_size); + } else { + gst_buffer_unref (buf); + wav->offset += data_size; + } } break; } @@ -1583,7 +1589,8 @@ unknown_format: } header_read_error: { - GST_ELEMENT_ERROR (wav, STREAM, DEMUX, (NULL), ("Couldn't read in header")); + GST_ELEMENT_ERROR (wav, STREAM, DEMUX, (NULL), + ("Couldn't read in header %d (%s)", res, gst_flow_get_name (res))); g_free (codec_name); return GST_FLOW_ERROR; } -- 2.7.4