kmssink: Move the mem cache into the allocator
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Tue, 12 Sep 2017 14:36:51 +0000 (10:36 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 5 Oct 2017 20:16:16 +0000 (16:16 -0400)
No functional change, the cache will be later reused by the buffer
pool to keep track of the kmssink memory when exporting dmabuf.

https://bugzilla.gnome.org/show_bug.cgi?id=787593

sys/kms/gstkmsallocator.c
sys/kms/gstkmsallocator.h
sys/kms/gstkmssink.c
sys/kms/gstkmssink.h

index 31efce2..4c6b0d9 100644 (file)
@@ -56,6 +56,8 @@ struct kms_bo
 struct _GstKMSAllocatorPrivate
 {
   int fd;
+  /* protected by GstKMSAllocator object lock */
+  GList *mem_cache;
 };
 
 #define parent_class gst_kms_allocator_parent_class
@@ -293,6 +295,8 @@ gst_kms_allocator_finalize (GObject * obj)
 
   alloc = GST_KMS_ALLOCATOR (obj);
 
+  gst_kms_allocator_clear_cache (GST_ALLOCATOR (alloc));
+
   if (check_fd (alloc))
     close (alloc->priv->fd);
 
@@ -550,3 +554,61 @@ failed:
     return NULL;
   }
 }
+
+/* FIXME, using gdata for caching on upstream memory is not tee safe */
+GstMemory *
+gst_kms_allocator_get_cached (GstMemory * mem)
+{
+  return gst_mini_object_get_qdata (GST_MINI_OBJECT (mem),
+      g_quark_from_static_string ("kmsmem"));
+}
+
+static void
+cached_kmsmem_disposed_cb (GstKMSAllocator * alloc, GstMiniObject * obj)
+{
+  GST_OBJECT_LOCK (alloc);
+  alloc->priv->mem_cache = g_list_remove (alloc->priv->mem_cache, obj);
+  GST_OBJECT_UNLOCK (alloc);
+}
+
+void
+gst_kms_allocator_clear_cache (GstAllocator * allocator)
+{
+  GstKMSAllocator *alloc = GST_KMS_ALLOCATOR (allocator);
+  GList *iter;
+
+  GST_OBJECT_LOCK (alloc);
+
+  iter = alloc->priv->mem_cache;
+  while (iter) {
+    GstMiniObject *obj = iter->data;
+    gst_mini_object_weak_unref (obj,
+        (GstMiniObjectNotify) cached_kmsmem_disposed_cb, alloc);
+    gst_mini_object_set_qdata (obj,
+        g_quark_from_static_string ("kmsmem"), NULL, NULL);
+    iter = iter->next;
+  }
+
+  g_list_free (alloc->priv->mem_cache);
+  alloc->priv->mem_cache = NULL;
+
+  GST_OBJECT_UNLOCK (alloc);
+}
+
+/* @kmsmem is transfer-full */
+void
+gst_kms_allocator_cache (GstAllocator * allocator, GstMemory * mem,
+    GstMemory * kmsmem)
+{
+  GstKMSAllocator *alloc = GST_KMS_ALLOCATOR (allocator);
+
+  GST_OBJECT_LOCK (alloc);
+  gst_mini_object_weak_ref (GST_MINI_OBJECT (mem),
+      (GstMiniObjectNotify) cached_kmsmem_disposed_cb, alloc);
+  alloc->priv->mem_cache = g_list_prepend (alloc->priv->mem_cache, mem);
+  GST_OBJECT_UNLOCK (alloc);
+
+  gst_mini_object_set_qdata (GST_MINI_OBJECT (mem),
+      g_quark_from_static_string ("kmsmem"), kmsmem,
+      (GDestroyNotify) gst_memory_unref);
+}
index 76d4312..d36e349 100644 (file)
@@ -86,6 +86,14 @@ GstKMSMemory* gst_kms_allocator_dmabuf_import (GstAllocator *allocator,
                                               gsize offsets[GST_VIDEO_MAX_PLANES],
                                               GstVideoInfo *vinfo);
 
+GstMemory *   gst_kms_allocator_get_cached  (GstMemory * mem);
+
+void          gst_kms_allocator_clear_cache (GstAllocator * allocator);
+
+void          gst_kms_allocator_cache       (GstAllocator * allocator,
+                                             GstMemory * mem,
+                                             GstMemory * kmsmem);
+
 G_END_DECLS
 
 
index 0ece4f0..84e37c0 100644 (file)
@@ -493,58 +493,6 @@ ensure_allowed_caps (GstKMSSink * self, drmModeConnector * conn,
   return (self->allowed_caps && !gst_caps_is_empty (self->allowed_caps));
 }
 
-static GstMemory *
-get_cached_kmsmem (GstMemory * mem)
-{
-  return gst_mini_object_get_qdata (GST_MINI_OBJECT (mem),
-      g_quark_from_static_string ("kmsmem"));
-}
-
-static void
-cached_kmsmem_disposed_cb (GstKMSSink * self, GstMiniObject * obj)
-{
-  GST_OBJECT_LOCK (self);
-  self->mem_cache = g_list_remove (self->mem_cache, obj);
-  GST_OBJECT_UNLOCK (self);
-}
-
-static void
-clear_cached_kmsmem (GstKMSSink * self)
-{
-  GList *iter;
-
-  GST_OBJECT_LOCK (self);
-
-  iter = self->mem_cache;
-  while (iter) {
-    GstMiniObject *obj = iter->data;
-    gst_mini_object_weak_unref (obj,
-        (GstMiniObjectNotify) cached_kmsmem_disposed_cb, self);
-    gst_mini_object_set_qdata (obj,
-        g_quark_from_static_string ("kmsmem"), NULL, NULL);
-    iter = iter->next;
-  }
-
-  g_list_free (self->mem_cache);
-  self->mem_cache = NULL;
-
-  GST_OBJECT_UNLOCK (self);
-}
-
-static void
-set_cached_kmsmem (GstKMSSink * self, GstMemory * mem, GstMemory * kmsmem)
-{
-  GST_OBJECT_LOCK (self);
-  gst_mini_object_weak_ref (GST_MINI_OBJECT (mem),
-      (GstMiniObjectNotify) cached_kmsmem_disposed_cb, self);
-  self->mem_cache = g_list_prepend (self->mem_cache, mem);
-  GST_OBJECT_UNLOCK (self);
-
-  return gst_mini_object_set_qdata (GST_MINI_OBJECT (mem),
-      g_quark_from_static_string ("kmsmem"), kmsmem,
-      (GDestroyNotify) gst_memory_unref);
-}
-
 static gboolean
 gst_kms_sink_start (GstBaseSink * bsink)
 {
@@ -735,7 +683,7 @@ gst_kms_sink_stop (GstBaseSink * bsink)
 
   self = GST_KMS_SINK (bsink);
 
-  clear_cached_kmsmem (self);
+  gst_kms_allocator_clear_cache (self->allocator);
 
   gst_buffer_replace (&self->last_buffer, NULL);
   gst_caps_replace (&self->allowed_caps, NULL);
@@ -1153,7 +1101,7 @@ gst_kms_sink_import_dmabuf (GstKMSSink * self, GstBuffer * inbuf,
       return FALSE;
   }
 
-  kmsmem = (GstKMSMemory *) get_cached_kmsmem (mems[0]);
+  kmsmem = (GstKMSMemory *) gst_kms_allocator_get_cached (mems[0]);
   if (kmsmem) {
     GST_LOG_OBJECT (self, "found KMS mem %p in DMABuf mem %p with fb id = %d",
         kmsmem, mems[0], kmsmem->fb_id);
@@ -1166,14 +1114,14 @@ gst_kms_sink_import_dmabuf (GstKMSSink * self, GstBuffer * inbuf,
   GST_LOG_OBJECT (self, "found these prime ids: %d, %d, %d, %d", prime_fds[0],
       prime_fds[1], prime_fds[2], prime_fds[3]);
 
-  kmsmem = gst_kms_allocator_dmabuf_import (self->allocator, prime_fds,
-      n_planes, mems_skip, &self->vinfo);
+  kmsmem = gst_kms_allocator_dmabuf_import (self->allocator,
+      prime_fds, n_planes, mems_skip, &self->vinfo);
   if (!kmsmem)
     return FALSE;
 
   GST_LOG_OBJECT (self, "setting KMS mem %p to DMABuf mem %p with fb id = %d",
       kmsmem, mems[0], kmsmem->fb_id);
-  set_cached_kmsmem (self, mems[0], GST_MEMORY_CAST (kmsmem));
+  gst_kms_allocator_cache (self->allocator, mems[0], GST_MEMORY_CAST (kmsmem));
 
 wrap_mem:
   *outbuf = gst_buffer_new ();
@@ -1402,7 +1350,7 @@ gst_kms_sink_drain (GstKMSSink * self)
   if (parent_meta) {
     GstBuffer *dumb_buf;
     dumb_buf = gst_kms_sink_copy_to_dumb_buffer (self, parent_meta->buffer);
-    clear_cached_kmsmem (self);
+    gst_kms_allocator_clear_cache (self->allocator);
     gst_kms_sink_show_frame (GST_VIDEO_SINK (self), dumb_buf);
     gst_buffer_unref (dumb_buf);
   }
index 7c7e32d..68a0178 100644 (file)
@@ -72,7 +72,6 @@ struct _GstKMSSink {
   GstAllocator *allocator;
   GstBuffer *last_buffer;
   GstMemory *tmp_kmsmem;
-  GList *mem_cache;
 
   gchar *devname;
   gchar *bus_id;