From 36b7e5890f4f8b68384978e4e62c0e1839f98237 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Tue, 4 Apr 2017 13:19:02 +0200 Subject: [PATCH] videorate: stop copying buffers in drop-only mode gst_video_rate_flush_prev() ensures that the pushed buffer is writable by calling gst_buffer_make_writable() on videorate->prevbuf. In drop-only mode we always push buffers directly when they are received from GstBaseTransform (gst_video_rate_transform_ip()) and do not keep them around. GstBaseTransform already ensures that those buffers are writable so there is no need to do it twice. This change saves us from copying buffers in drop-only mode as we no longer calls gst_buffer_make_writable() with a buffer having a refcount of 2 (one ref owned by GstBaseTransform and one in videorate->prevbuf). https://bugzilla.gnome.org/show_bug.cgi?id=780767 --- gst/videorate/gstvideorate.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gst/videorate/gstvideorate.c b/gst/videorate/gstvideorate.c index 84d8755af8..5976432a8e 100644 --- a/gst/videorate/gstvideorate.c +++ b/gst/videorate/gstvideorate.c @@ -712,9 +712,6 @@ gst_video_rate_flush_prev (GstVideoRate * videorate, gboolean duplicate, goto eos_before_buffers; outbuf = gst_buffer_ref (videorate->prevbuf); - if (videorate->drop_only) - gst_buffer_replace (&videorate->prevbuf, NULL); - /* make sure we can write to the metadata */ outbuf = gst_buffer_make_writable (outbuf); @@ -1387,8 +1384,11 @@ gst_video_rate_transform_ip (GstBaseTransform * trans, GstBuffer * buffer) (videorate->segment.rate < 0.0 && intime <= videorate->next_ts)) { GstFlowReturn r; - /* on error the _flush function posted a warning already */ - if ((r = gst_video_rate_flush_prev (videorate, FALSE, + /* The buffer received from basetransform is garanteed to be writable. + * It just needs to be reffed so the buffer won't be consumed once pushed and + * GstBaseTransform can get its reference back. */ + if ((r = gst_video_rate_push_buffer (videorate, + gst_buffer_ref (buffer), FALSE, GST_CLOCK_TIME_NONE)) != GST_FLOW_OK) { res = r; goto done;