From 94869bff3896957d22bba0231bf3c8315024830a Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 9 Mar 2012 16:17:54 +0100 Subject: [PATCH] audio: avoid buffer copy when nothing is clipped when nothing is clipped, return the input buffer instead of creating and returning an identical copy. --- gst-libs/gst/audio/audio.c | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/gst-libs/gst/audio/audio.c b/gst-libs/gst/audio/audio.c index 86c9fdf..a3a6ca1 100644 --- a/gst-libs/gst/audio/audio.c +++ b/gst-libs/gst/audio/audio.c @@ -832,7 +832,7 @@ gst_audio_buffer_clip (GstBuffer * buffer, GstSegment * segment, gint rate, GstBuffer *ret; GstClockTime timestamp = GST_CLOCK_TIME_NONE, duration = GST_CLOCK_TIME_NONE; guint64 offset = GST_BUFFER_OFFSET_NONE, offset_end = GST_BUFFER_OFFSET_NONE; - gsize trim, size; + gsize trim, size, osize; gboolean change_duration = TRUE, change_offset = TRUE, change_offset_end = TRUE; @@ -849,7 +849,7 @@ gst_audio_buffer_clip (GstBuffer * buffer, GstSegment * segment, gint rate, * they won't be changed later though. */ trim = 0; - size = gst_buffer_get_size (buffer); + osize = size = gst_buffer_get_size (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); GST_DEBUG ("timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); @@ -953,21 +953,25 @@ gst_audio_buffer_clip (GstBuffer * buffer, GstSegment * segment, gint rate, } } - /* Get a writable buffer and apply all changes */ - GST_DEBUG ("trim %" G_GSIZE_FORMAT " size %" G_GSIZE_FORMAT, trim, size); - ret = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, trim, size); - gst_buffer_unref (buffer); - - GST_DEBUG ("timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); - GST_BUFFER_TIMESTAMP (ret) = timestamp; - - if (change_duration) - GST_BUFFER_DURATION (ret) = duration; - if (change_offset) - GST_BUFFER_OFFSET (ret) = offset; - if (change_offset_end) - GST_BUFFER_OFFSET_END (ret) = offset_end; - + if (trim == 0 && size == osize) { + /* nothing changed */ + ret = buffer; + } else { + /* Get a writable buffer and apply all changes */ + GST_DEBUG ("trim %" G_GSIZE_FORMAT " size %" G_GSIZE_FORMAT, trim, size); + ret = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, trim, size); + gst_buffer_unref (buffer); + + GST_DEBUG ("timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); + GST_BUFFER_TIMESTAMP (ret) = timestamp; + + if (change_duration) + GST_BUFFER_DURATION (ret) = duration; + if (change_offset) + GST_BUFFER_OFFSET (ret) = offset; + if (change_offset_end) + GST_BUFFER_OFFSET_END (ret) = offset_end; + } return ret; } -- 2.7.4