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,
*_offset = av;
if (*len > av)
*len = av;
- gst_buffer_unref (guard);
+ g_assert (guard);
++ g_free (guard);
}
return ret;