[gst-cvs] gst-plugins-good: wavparse: handle LIST INFO of 0 size

Wim Taymans wtay at kemper.freedesktop.org
Sun Jun 7 04:38:22 PDT 2009


Module: gst-plugins-good
Branch: master
Commit: fb25aced92f9d2d0396f62b7b157ca9666285d86
URL:    http://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=fb25aced92f9d2d0396f62b7b157ca9666285d86

Author: Wim Taymans <wim.taymans at collabora.co.uk>
Date:   Sun Jun  7 13:37:04 2009 +0200

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 files 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;
   }





More information about the Gstreamer-commits mailing list