--- a/libs/gst/base/gstadapter.c
+++ b/libs/gst/base/gstadapter.c
@@ -749,16 +749,12 @@ gst_adapter_take_buffer (GstAdapter * adapter, gsize nbytes)
   skip = adapter->skip;
   hsize = gst_buffer_get_size (cur);
 
-  /* our head buffer has enough data left, return it */
-  if (skip == 0 && hsize == nbytes) {
-    GST_LOG_OBJECT (adapter, "providing buffer of %" G_GSIZE_FORMAT " bytes"
-        " as head buffer", nbytes);
-    buffer = gst_buffer_ref (cur);
-    goto done;
-  } else if (hsize >= nbytes + skip) {
+  /* our head buffer has enough data left, return a copy with
+   * timestamps, metas and flags removed. */
+  if (hsize >= nbytes + skip) {
     GST_LOG_OBJECT (adapter, "providing buffer of %" G_GSIZE_FORMAT " bytes"
         " via region copy", nbytes);
-    buffer = gst_buffer_copy_region (cur, GST_BUFFER_COPY_ALL, skip, nbytes);
+    buffer = gst_buffer_copy_region (cur, GST_BUFFER_COPY_MEMORY, skip, nbytes);
     goto done;
   }
 #if 0
@@ -769,7 +765,8 @@ gst_adapter_take_buffer (GstAdapter * adapter, gsize nbytes)
     if (gst_buffer_get_size (cur) >= nbytes + skip) {
       GST_LOG_OBJECT (adapter, "providing buffer of %" G_GSIZE_FORMAT " bytes"
           " via sub-buffer", nbytes);
-      buffer = gst_buffer_copy_region (cur, GST_BUFFER_COPY_ALL, skip, nbytes);
+      buffer = gst_buffer_copy_region (cur, GST_BUFFER_COPY_MEMORY,
+          skip, nbytes);
       goto done;
     }
   }
