msdk: allocator: get dmabuf handle during allocation if required
authorHyunjun Ko <zzoon@igalia.com>
Fri, 30 Mar 2018 19:03:17 +0000 (11:03 -0800)
committerSreerenj Balachandran <sreerenj.balachandran@intel.com>
Fri, 30 Mar 2018 19:04:28 +0000 (11:04 -0800)
https://bugzilla.gnome.org/show_bug.cgi?id=793707

sys/msdk/gstmsdkallocator.h
sys/msdk/gstmsdkallocator_libva.c

index cbe03e6..4d94b8b 100644 (file)
@@ -46,6 +46,7 @@ struct _GstMsdkMemoryID {
 #ifndef _WIN32
   VASurfaceID *surface;
   VAImage image;
+  VABufferInfo info;
 #else
   /* TODO: This is just to avoid compile errors on Windows.
    * Implement handling Windows-specific video-memory.
index a7fc253..4566fc1 100644 (file)
@@ -31,6 +31,7 @@
  */
 
 #include <va/va.h>
+#include <va/va_drmcommon.h>
 #include "gstmsdkallocator.h"
 #include "msdk_libva.h"
 
@@ -104,6 +105,31 @@ gst_msdk_frame_alloc (mfxHDL pthis, mfxFrameAllocRequest * req,
     }
 
     for (i = 0; i < surfaces_num; i++) {
+      /* Get dmabuf handle if MFX_MEMTYPE_EXPORT_FRAME */
+      if (req->Type & MFX_MEMTYPE_EXPORT_FRAME) {
+        msdk_mids[i].info.mem_type = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME;
+        va_status =
+            vaDeriveImage (gst_msdk_context_get_handle (context), surfaces[i],
+            &msdk_mids[i].image);
+        status = gst_msdk_get_mfx_status_from_va_status (va_status);
+
+        if (MFX_ERR_NONE != status) {
+          GST_ERROR ("failed to derive image");
+          return status;
+        }
+
+        va_status =
+            vaAcquireBufferHandle (gst_msdk_context_get_handle (context),
+            msdk_mids[i].image.buf, &msdk_mids[i].info);
+        status = gst_msdk_get_mfx_status_from_va_status (va_status);
+
+        if (MFX_ERR_NONE != status) {
+          GST_ERROR ("failed to get dmabuf handle");
+          vaDestroyImage (gst_msdk_context_get_handle (context),
+              msdk_mids[i].image.image_id);
+        }
+      }
+
       msdk_mids[i].surface = &surfaces[i];
       mids[i] = (mfxMemId *) & msdk_mids[i];
     }
@@ -170,6 +196,11 @@ gst_msdk_frame_free (mfxHDL pthis, mfxFrameAllocResponse * resp)
     /* Make sure that all the vaImages are destroyed */
     for (i = 0; i < resp->NumFrameActual; i++) {
       GstMsdkMemoryID *mem = resp->mids[i];
+
+      /* Release dmabuf handle if used */
+      if (mem->info.mem_type == VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME)
+        vaReleaseBufferHandle (dpy, mem->image.buf);
+
       vaDestroyImage (dpy, mem->image.image_id);
     }