From dcc4557dd6228324ef4b473e99b79c02b258d33c Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Sun, 4 Oct 2020 10:01:31 +0200 Subject: [PATCH] va: allocator: refactor flush methods for both allocators Since the logic is the same, it can be generalized in a single common function. Also the methods run the common function with a lock and signal the buffers' conditional. Part-of: --- sys/va/gstvaallocator.c | 63 ++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/sys/va/gstvaallocator.c b/sys/va/gstvaallocator.c index 027f0d1..60f4bbe 100644 --- a/sys/va/gstvaallocator.c +++ b/sys/va/gstvaallocator.c @@ -360,6 +360,27 @@ gst_va_buffer_surface_new (VASurfaceID surface, GstVideoFormat format, return buf; } +static void +_available_mems_flush (GstVaDisplay * display, GstAtomicQueue * available_mems) +{ + GstMemory *mem; + GstVaBufferSurface *buf; + + while ((mem = gst_atomic_queue_pop (available_mems))) { + /* destroy the surface */ + buf = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), + gst_va_buffer_surface_quark ()); + if (buf && g_atomic_int_dec_and_test (&buf->ref_count)) { + GST_LOG ("Destroying surface %#x", buf->surface); + _destroy_surfaces (display, &buf->surface, 1); + g_slice_free (GstVaBufferSurface, buf); + } + + GST_MINI_OBJECT_CAST (mem)->dispose = NULL; + gst_memory_unref (mem); + } +} + /*=========================== GstVaDmabufAllocator ===========================*/ struct _GstVaDmabufAllocator @@ -418,7 +439,7 @@ gst_va_dmabuf_allocator_dispose (GObject * object) { GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (object); - gst_va_dmabuf_allocator_flush (GST_ALLOCATOR (object)); + _available_mems_flush (self->display, self->available_mems); gst_atomic_queue_unref (self->available_mems); gst_clear_object (&self->display); @@ -628,23 +649,12 @@ gst_va_dmabuf_allocator_prepare_buffer (GstAllocator * allocator, void gst_va_dmabuf_allocator_flush (GstAllocator * allocator) { - GstMemory *mem; - GstVaBufferSurface *buf; GstVaDmabufAllocator *self = GST_VA_DMABUF_ALLOCATOR (allocator); - while ((mem = gst_atomic_queue_pop (self->available_mems))) { - /* destroy the surface */ - buf = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), - gst_va_buffer_surface_quark ()); - if (buf && g_atomic_int_dec_and_test (&buf->ref_count)) { - GST_LOG_OBJECT (self, "Destroying surface %#x", buf->surface); - _destroy_surfaces (self->display, &buf->surface, 1); - g_slice_free (GstVaBufferSurface, buf); - } - - GST_MINI_OBJECT_CAST (mem)->dispose = NULL; - gst_memory_unref (mem); - } + GST_OBJECT_LOCK (self); + _available_mems_flush (self->display, self->available_mems); + g_cond_signal (&self->buffer_cond); + GST_OBJECT_UNLOCK (self); } gboolean @@ -790,7 +800,7 @@ gst_va_allocator_dispose (GObject * object) { GstVaAllocator *self = GST_VA_ALLOCATOR (object); - gst_va_allocator_flush (GST_ALLOCATOR (object)); + _available_mems_flush (self->display, self->available_mems); gst_atomic_queue_unref (self->available_mems); gst_clear_object (&self->display); @@ -1185,23 +1195,12 @@ gst_va_allocator_prepare_buffer (GstAllocator * allocator, GstBuffer * buffer) void gst_va_allocator_flush (GstAllocator * allocator) { - GstMemory *mem; - GstVaBufferSurface *buf; GstVaAllocator *self = GST_VA_ALLOCATOR (allocator); - while ((mem = gst_atomic_queue_pop (self->available_mems))) { - /* destroy the surface */ - buf = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem), - gst_va_buffer_surface_quark ()); - if (buf && g_atomic_int_dec_and_test (&buf->ref_count)) { - GST_LOG_OBJECT (self, "Destroying surface %#x", buf->surface); - _destroy_surfaces (self->display, &buf->surface, 1); - g_slice_free (GstVaBufferSurface, buf); - } - - GST_MINI_OBJECT_CAST (mem)->dispose = NULL; - gst_memory_unref (mem); - } + GST_OBJECT_LOCK (self); + _available_mems_flush (self->display, self->available_mems); + g_cond_signal (&self->buffer_cond); + GST_OBJECT_UNLOCK (self); } gboolean -- 2.7.4