ext/vorbis/vorbisenc.c: If we get a zero-sized input buffer, don't pass it to libvorb...
authorMichael Smith <msmith@xiph.org>
Tue, 20 Mar 2007 11:49:55 +0000 (11:49 +0000)
committerMichael Smith <msmith@xiph.org>
Tue, 20 Mar 2007 11:49:55 +0000 (11:49 +0000)
Original commit message from CVS:
* ext/vorbis/vorbisenc.c: (gst_vorbis_enc_chain):
If we get a zero-sized input buffer, don't pass it to libvorbis, as
that marks EOS internally. After that, libvorbis will buffer all
input data, and encode none of it, eventually leading to memory
exhaustion.

ChangeLog
ext/vorbis/vorbisenc.c

index 31588abddd85da5e9010d84e7b16f4c96d0e8d53..c0927d17db5d6b128c4579f588a089300a11cc0d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-03-20  Michael Smith  <msmith@fluendo.com>
+
+       * ext/vorbis/vorbisenc.c: (gst_vorbis_enc_chain):
+         If we get a zero-sized input buffer, don't pass it to libvorbis, as
+         that marks EOS internally. After that, libvorbis will buffer all
+         input data, and encode none of it, eventually leading to memory
+         exhaustion.
+
 2007-03-19  Wim Taymans  <wim@fluendo.com>
 
        * gst/playback/gstdecodebin.c: (remove_fakesink):
index 6eccdc2fa70f8e08369876095bb845df1d415033..f17ea4f1a211deafd4028ed8ea7f9146716065dd 100644 (file)
@@ -1149,6 +1149,12 @@ gst_vorbis_enc_chain (GstPad * pad, GstBuffer * buffer)
     vorbisenc->next_discont = TRUE;
   }
 
+  /* Sending zero samples to libvorbis marks EOS, so we mustn't do that */
+  if (GST_BUFFER_SIZE (buffer) == 0) {
+    gst_buffer_unref (buffer);
+    return GST_FLOW_OK;
+  }
+
   /* data to encode */
   data = (gfloat *) GST_BUFFER_DATA (buffer);
   size = GST_BUFFER_SIZE (buffer) / (vorbisenc->channels * sizeof (float));