faad: don't access buffer after _finish_frame
authorWim Taymans <wim.taymans@collabora.co.uk>
Tue, 12 Jun 2012 07:10:54 +0000 (09:10 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Tue, 12 Jun 2012 07:13:24 +0000 (09:13 +0200)
Unmap the buffer before calling _finish_frame because we are not allowed to
access it after.

ext/faad/gstfaad.c

index c6f1e42e8e0afe0b55e7b936545c8528740f0cea..736bb872367d8e9b06bbb61e2066f2a8b82b1828 100644 (file)
@@ -732,7 +732,7 @@ init:
   info.error = 0;
 
   do {
-    GstMapInfo map;
+    GstMapInfo omap;
 
     if (!faad->packetised) {
       /* faad only really parses ADTS header at Init time, not when decoding,
@@ -775,11 +775,11 @@ init:
       /* FIXME, add bufferpool and allocator support to the base class */
       outbuf = gst_buffer_new_allocate (NULL, info.samples * faad->bps, NULL);
 
-      gst_buffer_map (outbuf, &map, GST_MAP_READWRITE);
+      gst_buffer_map (outbuf, &omap, GST_MAP_READWRITE);
       if (faad->need_reorder) {
         gint16 *dest, *src, i, j;
 
-        dest = (gint16 *) map.data;
+        dest = (gint16 *) omap.data;
         src = (gint16 *) out;
 
         for (i = 0; i < samples; i++) {
@@ -789,16 +789,19 @@ init:
           dest += channels;
         }
       } else {
-        memcpy (map.data, out, map.size);
+        memcpy (omap.data, out, omap.size);
       }
-      gst_buffer_unmap (outbuf, &map);
+      gst_buffer_unmap (outbuf, &omap);
+      gst_buffer_unmap (buffer, &map);
+      buffer = NULL;
 
       ret = gst_audio_decoder_finish_frame (dec, outbuf, 1);
     }
   } while (FALSE);
 
 out:
-  gst_buffer_unmap (buffer, &map);
+  if (buffer)
+    gst_buffer_unmap (buffer, &map);
 
   return ret;