MSDK: Add helper function to peek VA surface of VA kind gstbuffer.
authorHe Junyan <junyan.he@intel.com>
Sat, 8 May 2021 09:26:27 +0000 (17:26 +0800)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Fri, 11 Feb 2022 07:13:45 +0000 (07:13 +0000)
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1087>

subprojects/gst-plugins-bad/sys/msdk/gstmsdk_va.c [new file with mode: 0644]
subprojects/gst-plugins-bad/sys/msdk/gstmsdk_va.h [new file with mode: 0644]
subprojects/gst-plugins-bad/sys/msdk/meson.build

diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdk_va.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdk_va.c
new file mode 100644 (file)
index 0000000..feabf38
--- /dev/null
@@ -0,0 +1,104 @@
+/* GStreamer Intel MSDK plugin
+ * Copyright (c) 2021, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGDECE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _WIN32
+#include "gstmsdk_va.h"
+
+#define GST_MAP_VA (GST_MAP_FLAG_LAST << 1)
+
+static GQuark
+gst_msdk_va_memory_surface_quark_get (void)
+{
+  static gsize g_quark;
+
+  if (g_once_init_enter (&g_quark)) {
+    gsize quark = (gsize) g_quark_from_static_string ("GstMsdkMemoryVASurface");
+    g_once_init_leave (&g_quark, quark);
+  }
+  return g_quark;
+}
+
+static gboolean
+gst_msdk_is_va_mem (GstMemory * mem)
+{
+  GstAllocator *allocator;
+
+  allocator = mem->allocator;
+  if (!allocator)
+    return FALSE;
+
+  return g_str_equal (allocator->mem_type, "VAMemory");
+}
+
+VASurfaceID
+gst_msdk_va_peek_buffer_surface (GstBuffer * buffer)
+{
+  GstMemory *mem;
+  VASurfaceID surface;
+  GstMapInfo map_info;
+  gpointer data;
+
+  g_return_val_if_fail (buffer, VA_INVALID_SURFACE);
+
+  mem = gst_buffer_peek_memory (buffer, 0);
+  if (!mem)
+    return VA_INVALID_SURFACE;
+
+  if (!gst_msdk_is_va_mem (mem))
+    return VA_INVALID_SURFACE;
+
+  data = gst_mini_object_get_qdata (GST_MINI_OBJECT (mem),
+      gst_msdk_va_memory_surface_quark_get ());
+  if (data) {
+    surface = *(VASurfaceID *) data;
+    g_assert (surface != VA_INVALID_SURFACE);
+    return surface;
+  }
+
+  if (!gst_buffer_map (buffer, &map_info, GST_MAP_READ | GST_MAP_VA))
+    return VA_INVALID_SURFACE;
+
+  surface = (*(VASurfaceID *) map_info.data);
+  gst_buffer_unmap (buffer, &map_info);
+
+  if (surface == VA_INVALID_ID) {
+    GST_WARNING ("Fail to get va surface by GST_MAP_VA mapping");
+  } else {
+    data = g_new (VASurfaceID, 1);
+    *(VASurfaceID *) data = surface;
+    gst_mini_object_set_qdata (GST_MINI_OBJECT_CAST (mem),
+        gst_msdk_va_memory_surface_quark_get (), data, g_free);
+  }
+
+  return surface;
+}
+
+#endif /* _WIN32 */
diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdk_va.h b/subprojects/gst-plugins-bad/sys/msdk/gstmsdk_va.h
new file mode 100644 (file)
index 0000000..96bbb1c
--- /dev/null
@@ -0,0 +1,48 @@
+/* GStreamer Intel MSDK plugin
+ * Copyright (c) 2021, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGDECE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GST_MSDK_VA_H_
+#define GST_MSDK_VA_H_
+
+#ifndef _WIN32
+
+#include "msdk.h"
+#include <va/va.h>
+#include <va/va_drmcommon.h>
+
+G_BEGIN_DECLS
+
+VASurfaceID gst_msdk_va_peek_buffer_surface (GstBuffer * buffer);
+
+G_END_DECLS
+
+#endif /* _WIN32 */
+#endif /* GST_MSDK_VA_H_ */
index e07a42f..205de2a 100644 (file)
@@ -43,7 +43,7 @@ else
     endif
     subdir_done()
   endif
-  msdk_sources += ['msdk_libva.c', 'gstmsdkallocator_libva.c']
+  msdk_sources += ['msdk_libva.c', 'gstmsdkallocator_libva.c', 'gstmsdk_va.c']
 endif
 
 mfx_api = get_option('mfx_api')