diff --git a/subprojects/gst-plugins-bad/sys/nvcodec/gstcudanvmm.h b/subprojects/gst-plugins-bad/gst-libs/gst/cuda/gstcudanvmm-private.h similarity index 94% rename from subprojects/gst-plugins-bad/sys/nvcodec/gstcudanvmm.h rename to subprojects/gst-plugins-bad/gst-libs/gst/cuda/gstcudanvmm-private.h index be563d3f06..294445c57d 100644 --- a/subprojects/gst-plugins-bad/sys/nvcodec/gstcudanvmm.h +++ b/subprojects/gst-plugins-bad/gst-libs/gst/cuda/gstcudanvmm-private.h @@ -20,15 +20,16 @@ #pragma once #include -#include -#include +#include G_BEGIN_DECLS #define GST_CAPS_FEATURE_MEMORY_CUDA_NVMM_MEMORY "memory:NVMM" +GST_CUDA_API gboolean gst_cuda_nvmm_init_once (void); +GST_CUDA_API GstBufferPool * gst_cuda_nvmm_buffer_pool_new (void); G_END_DECLS diff --git a/subprojects/gst-plugins-bad/sys/nvcodec/gstcudanvmm.c b/subprojects/gst-plugins-bad/gst-libs/gst/cuda/gstcudanvmm.cpp similarity index 80% rename from subprojects/gst-plugins-bad/sys/nvcodec/gstcudanvmm.c rename to subprojects/gst-plugins-bad/gst-libs/gst/cuda/gstcudanvmm.cpp index 60ccfd7782..7517f05fe8 100644 --- a/subprojects/gst-plugins-bad/sys/nvcodec/gstcudanvmm.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/cuda/gstcudanvmm.cpp @@ -21,16 +21,29 @@ #include "config.h" #endif -#include "gstcudanvmm.h" +#include "gstcudanvmm-private.h" #include #include +#include "gstcuda-private.h" -GST_DEBUG_CATEGORY_EXTERN (gst_cuda_nvmm_debug); -#define GST_CAT_DEFAULT gst_cuda_nvmm_debug +#ifndef GST_DISABLE_GST_DEBUG +#define GST_CAT_DEFAULT ensure_debug_category() +static GstDebugCategory * +ensure_debug_category (void) +{ + static GstDebugCategory *cat = nullptr; + + GST_CUDA_CALL_ONCE_BEGIN { + cat = _gst_debug_category_new ("cudanvmm", 0, "cudanvmm"); + } GST_CUDA_CALL_ONCE_END; + + return cat; +} +#endif #define LOAD_SYMBOL(name) G_STMT_START { \ if (!g_module_symbol (module, G_STRINGIFY (name), (gpointer *) &vtable->name)) { \ - GST_ERROR ("Failed to load symbol '%s', %s", G_STRINGIFY (name), g_module_error()); \ + GST_INFO ("Failed to load symbol '%s', %s", G_STRINGIFY (name), g_module_error()); \ goto error; \ } \ } G_STMT_END; @@ -79,12 +92,10 @@ gboolean gst_cuda_nvmm_init_once (void) { static gboolean loaded = FALSE; - static gsize load_once = 0; - if (g_once_init_enter (&load_once)) { + GST_CUDA_CALL_ONCE_BEGIN { loaded = gst_cuda_nvmm_load_library (); - g_once_init_leave (&load_once, 1); - } + } GST_CUDA_CALL_ONCE_END; return loaded; } diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/cuda/gstcudautils.cpp b/subprojects/gst-plugins-bad/gst-libs/gst/cuda/gstcudautils.cpp index 07fc20cfda..e27e532e63 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/cuda/gstcudautils.cpp +++ b/subprojects/gst-plugins-bad/gst-libs/gst/cuda/gstcudautils.cpp @@ -39,8 +39,9 @@ #include #endif -#ifdef HAVE_NVCODEC_NVMM -#include "gstcudanvmm.h" +#ifdef HAVE_CUDA_NVMM +#include "gstcudanvmm-private.h" +#include #endif #include "gstcudamemory.h" @@ -784,7 +785,7 @@ map_buffer_and_fill_copy2d (GstBuffer * buf, const GstVideoInfo * info, gboolean buffer_mapped = FALSE; guint i; -#ifdef HAVE_NVCODEC_NVMM +#ifdef HAVE_CUDA_NVMM if (copy_type == GST_CUDA_BUFFER_COPY_NVMM) { NvBufSurface *surface; NvBufSurfaceParams *surface_params; diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/cuda/meson.build b/subprojects/gst-plugins-bad/gst-libs/gst/cuda/meson.build index 5a60d0f4cd..246bfbd6d2 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/cuda/meson.build +++ b/subprojects/gst-plugins-bad/gst-libs/gst/cuda/meson.build @@ -3,6 +3,7 @@ cuda_sources = files([ 'gstcudacontext.cpp', 'gstcudaloader.cpp', 'gstcudamemory.cpp', + 'gstcudanvmm.cpp', 'gstcudanvrtc.cpp', 'gstcudastream.cpp', 'gstcudautils.cpp', @@ -26,6 +27,9 @@ gstcuda_stub_dep = declare_dependency( include_directories: cuda_stubinc ) +have_nvbufsurface_h = false +gstcuda_nvmm_inc = [] + gstcuda_platform_dep = [] if host_system not in ['windows', 'linux'] subdir_done() @@ -80,6 +84,21 @@ if host_system == 'windows' '-Wno-redundant-decls', ]) endif +else + nvmm_opt = get_option('cuda-nvmm') + if not nvmm_opt.disabled() + nvmm_inc_opt = get_option('cuda-nvmm-include-path') + if nvmm_inc_opt != '' + gstcuda_nvmm_inc = [include_directories(nvmm_inc_opt)] + endif + + have_nvbufsurface_h = cc.has_header('nvbufsurface.h', + include_directories: gstcuda_nvmm_inc, + required: nvmm_opt) + endif + if have_nvbufsurface_h + extra_args += ['-DHAVE_CUDA_NVMM'] + endif endif pkg_name = 'gstreamer-cuda-' + api_version @@ -87,7 +106,7 @@ gstcuda= library('gstcuda-' + api_version, cuda_sources, c_args : gst_plugins_bad_args + extra_args, cpp_args : gst_plugins_bad_args + extra_args, - include_directories : [configinc, libsinc, cuda_stubinc], + include_directories : [configinc, libsinc, cuda_stubinc] + gstcuda_nvmm_inc, version : libversion, soversion : soversion, install : true, diff --git a/subprojects/gst-plugins-bad/meson_options.txt b/subprojects/gst-plugins-bad/meson_options.txt index 91ff88a240..5752b83fee 100644 --- a/subprojects/gst-plugins-bad/meson_options.txt +++ b/subprojects/gst-plugins-bad/meson_options.txt @@ -213,6 +213,10 @@ option('aja-include-dir', type : 'string', value : '', option('aja-lib-dir', type : 'string', value : '', description : 'Directory where AJA NTV2 library is located') +# CUDA library options +option('cuda-nvmm', type : 'feature', value : 'auto', description : 'Enable NVMM support in cuda library') +option('cuda-nvmm-include-path', type : 'string', value : '', description : 'Include path for NVMM support in cuda library') + # D3D11/D3D12 HLSL library options option('d3d-hlsl-precompile', type : 'feature', value : 'auto', description : 'Enable buildtime HLSL compile for d3d11/d3d12 library/plugin') diff --git a/subprojects/gst-plugins-bad/sys/nvcodec/gstcudamemorycopy.c b/subprojects/gst-plugins-bad/sys/nvcodec/gstcudamemorycopy.c index a851a0d407..0be36a438d 100644 --- a/subprojects/gst-plugins-bad/sys/nvcodec/gstcudamemorycopy.c +++ b/subprojects/gst-plugins-bad/sys/nvcodec/gstcudamemorycopy.c @@ -42,8 +42,9 @@ #include "gstcudamemorycopy.h" #include "gstcudaformat.h" #include -#ifdef HAVE_NVCODEC_NVMM -#include "gstcudanvmm.h" +#ifdef HAVE_CUDA_NVMM +#include +#include #endif #ifdef HAVE_CUDA_GST_GL @@ -272,7 +273,7 @@ create_transform_caps (GstCaps * caps, gboolean to_cuda) /* SRC -> SINK of cudadownload or SINK -> SRC of cudaupload */ ret = gst_caps_copy (caps); -#ifdef HAVE_NVCODEC_NVMM +#ifdef HAVE_CUDA_NVMM if (gst_cuda_nvmm_init_once ()) { new_caps = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_CUDA_NVMM_MEMORY); @@ -289,7 +290,7 @@ create_transform_caps (GstCaps * caps, gboolean to_cuda) /* SINK -> SRC of cudadownload or SRC -> SINK of cudaupload */ ret = gst_caps_ref (caps); -#ifdef HAVE_NVCODEC_NVMM +#ifdef HAVE_CUDA_NVMM if (gst_cuda_nvmm_init_once ()) { new_caps = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_CUDA_NVMM_MEMORY); @@ -529,7 +530,7 @@ gst_cuda_memory_copy_propose_allocation (GstBaseTransform * trans, pool = gst_d3d11_buffer_pool_new (self->d3d11_device); #endif -#ifdef HAVE_NVCODEC_NVMM +#ifdef HAVE_CUDA_NVMM } else if (features && gst_caps_features_contains (features, GST_CAPS_FEATURE_MEMORY_CUDA_NVMM_MEMORY) && gst_cuda_nvmm_init_once ()) { @@ -618,7 +619,7 @@ gst_cuda_memory_copy_decide_allocation (GstBaseTransform * trans, #ifdef G_OS_WIN32 gboolean need_d3d11 = FALSE; #endif -#ifdef HAVE_NVCODEC_NVMM +#ifdef HAVE_CUDA_NVMM gboolean need_nvmm = FALSE; #endif @@ -652,7 +653,7 @@ gst_cuda_memory_copy_decide_allocation (GstBaseTransform * trans, need_d3d11 = TRUE; } #endif -#ifdef HAVE_NVCODEC_NVMM +#ifdef HAVE_CUDA_NVMM else if (features && gst_caps_features_contains (features, GST_CAPS_FEATURE_MEMORY_CUDA_NVMM_MEMORY) && gst_cuda_nvmm_init_once ()) { @@ -673,7 +674,7 @@ gst_cuda_memory_copy_decide_allocation (GstBaseTransform * trans, } } } -#ifdef HAVE_NVCODEC_NVMM +#ifdef HAVE_CUDA_NVMM if (need_nvmm) { /* XXX: Always create new pool to set config option */ gst_clear_object (&pool); @@ -705,7 +706,7 @@ gst_cuda_memory_copy_decide_allocation (GstBaseTransform * trans, pool = gst_d3d11_buffer_pool_new (self->d3d11_device); } #endif -#ifdef HAVE_NVCODEC_NVMM +#ifdef HAVE_CUDA_NVMM else if (need_nvmm) { guint gpu_id = 0; GST_DEBUG_OBJECT (self, "create nvmm pool"); @@ -859,7 +860,7 @@ gst_cuda_memory_copy_set_info (GstCudaBaseTransform * btrans, gst_clear_object (&self->d3d11_device); #endif -#ifdef HAVE_NVCODEC_NVMM +#ifdef HAVE_CUDA_NVMM if (gst_cuda_nvmm_init_once ()) { if (in_features && gst_caps_features_contains (in_features, GST_CAPS_FEATURE_MEMORY_CUDA_NVMM_MEMORY)) { @@ -1160,7 +1161,7 @@ gst_cuda_memory_copy_register (GstPlugin * plugin, guint rank) }; GstCaps *sys_caps; GstCaps *cuda_caps; -#ifdef HAVE_NVCODEC_NVMM +#ifdef HAVE_CUDA_NVMM GstCaps *nvmm_caps = NULL; #endif #ifdef HAVE_CUDA_GST_GL @@ -1183,7 +1184,7 @@ gst_cuda_memory_copy_register (GstPlugin * plugin, guint rank) cuda_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY, GST_CUDA_FORMATS)); -#ifdef HAVE_NVCODEC_NVMM +#ifdef HAVE_CUDA_NVMM if (gst_cuda_nvmm_init_once ()) { nvmm_caps = gst_caps_from_string (GST_VIDEO_CAPS_MAKE_WITH_FEATURES @@ -1209,7 +1210,7 @@ gst_cuda_memory_copy_register (GstPlugin * plugin, guint rank) upload_sink_caps = gst_caps_merge (upload_sink_caps, gst_caps_copy (d3d11_caps)); #endif -#ifdef HAVE_NVCODEC_NVMM +#ifdef HAVE_CUDA_NVMM if (nvmm_caps) { upload_sink_caps = gst_caps_merge (upload_sink_caps, gst_caps_copy (nvmm_caps)); @@ -1219,7 +1220,7 @@ gst_cuda_memory_copy_register (GstPlugin * plugin, guint rank) gst_caps_merge (upload_sink_caps, gst_caps_copy (cuda_caps)); upload_src_caps = gst_caps_copy (cuda_caps); -#ifdef HAVE_NVCODEC_NVMM +#ifdef HAVE_CUDA_NVMM if (nvmm_caps) { upload_src_caps = gst_caps_merge (upload_src_caps, gst_caps_copy (nvmm_caps)); @@ -1228,7 +1229,7 @@ gst_cuda_memory_copy_register (GstPlugin * plugin, guint rank) upload_src_caps = gst_caps_merge (upload_src_caps, gst_caps_copy (sys_caps)); download_sink_caps = gst_caps_copy (cuda_caps); -#ifdef HAVE_NVCODEC_NVMM +#ifdef HAVE_CUDA_NVMM if (nvmm_caps) { download_sink_caps = gst_caps_merge (download_sink_caps, gst_caps_copy (nvmm_caps)); @@ -1244,7 +1245,7 @@ gst_cuda_memory_copy_register (GstPlugin * plugin, guint rank) #ifdef G_OS_WIN32 download_src_caps = gst_caps_merge (download_src_caps, d3d11_caps); #endif -#ifdef HAVE_NVCODEC_NVMM +#ifdef HAVE_CUDA_NVMM if (nvmm_caps) { download_src_caps = gst_caps_merge (download_src_caps, nvmm_caps); } diff --git a/subprojects/gst-plugins-bad/sys/nvcodec/meson.build b/subprojects/gst-plugins-bad/sys/nvcodec/meson.build index 890049b944..62d55652f8 100644 --- a/subprojects/gst-plugins-bad/sys/nvcodec/meson.build +++ b/subprojects/gst-plugins-bad/sys/nvcodec/meson.build @@ -27,10 +27,6 @@ nvcodec_sources = [ 'plugin.c', ] -nvmm_sources = [ - 'gstcudanvmm.c', -] - nvcodec_win32_sources = [ 'gstcudaipcclient_win32.cpp', 'gstcudaipcserver_win32.cpp', @@ -61,18 +57,9 @@ if gstgl_dep.found() endif if host_system == 'linux' - have_nvmm = false - if cc.has_header('nvbufsurface.h') - have_nvmm = true - elif cc.has_header('/opt/nvidia/deepstream/deepstream/sources/includes/nvbufsurface.h') - # XXX: Should add an option for SDK path?? - have_nvmm = true - plugin_incdirs += [include_directories('/opt/nvidia/deepstream/deepstream/sources/includes')] - endif - - if have_nvmm - extra_args += ['-DHAVE_NVCODEC_NVMM'] - nvcodec_sources += nvmm_sources + if have_nvbufsurface_h + extra_args += ['-DHAVE_CUDA_NVMM'] + plugin_incdirs += gstcuda_nvmm_inc endif gio_unix_dep = dependency('gio-unix-2.0', required : get_option('nvcodec')) diff --git a/subprojects/gst-plugins-bad/sys/nvcodec/plugin.c b/subprojects/gst-plugins-bad/sys/nvcodec/plugin.c index d784bdb6fe..450002f95e 100644 --- a/subprojects/gst-plugins-bad/sys/nvcodec/plugin.c +++ b/subprojects/gst-plugins-bad/sys/nvcodec/plugin.c @@ -40,9 +40,7 @@ #include "gstnvdecoder.h" #include "gstcudamemorycopy.h" #include "gstcudaconvertscale.h" -#ifdef HAVE_NVCODEC_NVMM -#include "gstcudanvmm.h" -#endif +#include #ifdef G_OS_WIN32 #include @@ -62,10 +60,6 @@ GST_DEBUG_CATEGORY (gst_nvdec_debug); GST_DEBUG_CATEGORY (gst_nvenc_debug); GST_DEBUG_CATEGORY (gst_nv_decoder_debug); -#ifdef HAVE_NVCODEC_NVMM -GST_DEBUG_CATEGORY (gst_cuda_nvmm_debug); -#endif - #define GST_CAT_DEFAULT gst_nvcodec_debug #ifdef G_OS_WIN32 @@ -135,10 +129,6 @@ plugin_init (GstPlugin * plugin) GST_DEBUG_CATEGORY_INIT (gst_nvenc_debug, "nvenc", 0, "nvenc"); GST_DEBUG_CATEGORY_INIT (gst_nv_decoder_debug, "nvdecoder", 0, "nvdecoder"); -#ifdef HAVE_NVCODEC_NVMM - GST_DEBUG_CATEGORY_INIT (gst_cuda_nvmm_debug, "cudanvmm", 0, "cudanvmm"); -#endif - if (!gst_cuda_load_library ()) { gst_plugin_add_status_warning (plugin, "CUDA library \"" CUDA_LIBNAME "\" was not found."); @@ -354,12 +344,8 @@ plugin_init (GstPlugin * plugin) "cudaipcsrc", GST_RANK_NONE, GST_TYPE_CUDA_IPC_SRC); gst_cuda_memory_init_once (); - -#ifdef HAVE_NVCODEC_NVMM - if (gst_cuda_nvmm_init_once ()) { + if (gst_cuda_nvmm_init_once ()) GST_INFO ("Enable NVMM support"); - } -#endif g_object_set_data_full (G_OBJECT (plugin), "plugin-nvcodec-shutdown", (gpointer) "shutdown-data",