Merge branch 'master' into 0.11
authorWim Taymans <wim.taymans@collabora.co.uk>
Fri, 17 Feb 2012 08:16:32 +0000 (09:16 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Fri, 17 Feb 2012 08:16:32 +0000 (09:16 +0100)
Conflicts:
ext/mad/gstmad.c

1  2 
ext/mad/gstmad.c

@@@ -279,24 -277,33 +277,33 @@@ gst_mad_parse (GstAudioDecoder * dec, G
      gint * _offset, gint * len)
  {
    GstMad *mad;
 -  GstFlowReturn ret = GST_FLOW_UNEXPECTED;
 +  GstFlowReturn ret = GST_FLOW_EOS;
    gint av, size, offset, prev_offset, consumed = 0;
    const guint8 *data;
 -  GstBuffer *guard = NULL;
+   gboolean eos;
++  guint8 *guard = NULL;
  
    mad = GST_MAD (dec);
  
-   if (mad->eos) {
-     /* This is one steaming hack right there.
+   av = gst_adapter_available (adapter);
 -  data = gst_adapter_peek (adapter, av);
++  data = gst_adapter_map (adapter, av);
+   gst_audio_decoder_get_parse_state (dec, NULL, &eos);
+   if (eos) {
+     /* This is one streaming hack right there.
       * mad will not decode the last frame if it is not followed by
       * a number of 0 bytes, due to some buffer overflow, which can
       * not be fixed for reasons I did not inquire into, see
       * http://www.mars.org/mailman/public/mad-dev/2001-May/000262.html
       */
-     GstBuffer *guard = gst_buffer_new_and_alloc (MAD_BUFFER_GUARD);
-     gst_buffer_memset (guard, 0, 0, MAD_BUFFER_GUARD);
-     GST_DEBUG_OBJECT (mad, "Discreetly stuffing %u zero bytes in the adapter",
-         MAD_BUFFER_GUARD);
-     gst_adapter_push (adapter, guard);
 -    guard = gst_buffer_new_and_alloc (av + MAD_BUFFER_GUARD);
++    guard = g_malloc (av + MAD_BUFFER_GUARD);
+     /* let's be nice and not mess with baseclass state and keep hacks local */
 -    memset (GST_BUFFER_DATA (guard), 0, GST_BUFFER_SIZE (guard));
 -    memcpy (GST_BUFFER_DATA (guard), data, av);
++    memcpy (guard, data, av);
++    memset (guard + av, 0, MAD_BUFFER_GUARD);
+     GST_DEBUG_OBJECT (mad, "Added %u zero guard bytes in the adapter; "
+         "using fallback buffer of size %u",
 -        GST_BUFFER_SIZE (guard) - av, GST_BUFFER_SIZE (guard));
 -    data = GST_BUFFER_DATA (guard);
++        MAD_BUFFER_GUARD, av + MAD_BUFFER_GUARD);
++    data = guard;
    }
  
    /* we basically let mad library do parsing,
@@@ -428,6 -429,8 +432,8 @@@ exit
        *_offset = av;
      if (*len > av)
        *len = av;
 -    gst_buffer_unref (guard);
+     g_assert (guard);
++    g_free (guard);
    }
  
    return ret;