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 index 0000000000..feabf38809 --- /dev/null +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdk_va.c @@ -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 index 0000000000..96bbb1c634 --- /dev/null +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdk_va.h @@ -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 +#include + +G_BEGIN_DECLS + +VASurfaceID gst_msdk_va_peek_buffer_surface (GstBuffer * buffer); + +G_END_DECLS + +#endif /* _WIN32 */ +#endif /* GST_MSDK_VA_H_ */ diff --git a/subprojects/gst-plugins-bad/sys/msdk/meson.build b/subprojects/gst-plugins-bad/sys/msdk/meson.build index e07a42f394..205de2a0be 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/meson.build +++ b/subprojects/gst-plugins-bad/sys/msdk/meson.build @@ -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')