videorate: stop copying buffers in drop-only mode
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Tue, 4 Apr 2017 11:19:02 +0000 (13:19 +0200)
committerOlivier CrĂȘte <olivier.crete@collabora.com>
Sat, 20 May 2017 14:35:53 +0000 (16:35 +0200)
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

index 84d8755..5976432 100644 (file)
@@ -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;