vpxdec: Fix direct rendering, avoid holding write access
authorHavard Graff <havard.graff@gmail.com>
Wed, 22 May 2019 09:16:56 +0000 (11:16 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Mon, 23 Aug 2021 14:31:37 +0000 (14:31 +0000)
When a buffer is pushed downstream, we should try not to hold the
buffer mapped with write access. Doing so would often lead to
an unneccesary memcpy later.

For instance, gst_buffer_make_writable() in
gst_video_decoder_finish_frame() will cause a memcpy because of
_memory_get_exclusive_reference().

We know that we can perform a two-step remap when using system
memory, as this will not cause the location of the memory to
change.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/812>

ext/vpx/gstvpxdec.c
ext/vpx/gstvpxdec.h

index adf8428..03adba8 100644 (file)
@@ -286,6 +286,7 @@ gst_vpx_dec_start (GstVideoDecoder * decoder)
 
   GST_DEBUG_OBJECT (gst_vpx_dec, "start");
   gst_vpx_dec->decoder_inited = FALSE;
+  gst_vpx_dec->safe_remap = FALSE;
 
   return TRUE;
 }
@@ -401,6 +402,15 @@ gst_vpx_dec_prepare_image (GstVPXDec * dec, const vpx_image_t * img)
 
   buffer = gst_buffer_ref (frame->buffer);
 
+  /* FIXME: an atomic remap would be preferable, for now we simply
+   * remap the buffer from RW to RO when using a sysmem allocator,
+   * in order to avoid a useless memcpy in GstVideoDecoder.
+   */
+  if (dec->safe_remap) {
+    gst_buffer_unmap (buffer, &frame->info);
+    gst_buffer_map (buffer, &frame->info, GST_MAP_READ);
+  }
+
   vmeta = gst_buffer_get_video_meta (buffer);
   vmeta->format = GST_VIDEO_INFO_FORMAT (info);
   vmeta->width = GST_VIDEO_INFO_WIDTH (info);
@@ -450,6 +460,9 @@ gst_vpx_dec_get_buffer_cb (gpointer priv, gsize min_size,
       allocator = NULL;
     }
 
+    dec->safe_remap = (allocator == NULL
+        || !g_strcmp0 (allocator->mem_type, GST_ALLOCATOR_SYSMEM));
+
     pool = gst_buffer_pool_new ();
     config = gst_buffer_pool_get_config (pool);
     gst_buffer_pool_config_set_allocator (config, allocator, &params);
index 35ea428..00035f5 100644 (file)
@@ -82,6 +82,7 @@ struct _GstVPXDec
   gboolean have_video_meta;
   GstBufferPool *pool;
   gsize buf_size;
+  gboolean safe_remap;
 };
 
 struct _GstVPXDecClass