|
|
@@ -6,9 +6,9 @@
|
|
|
#include "nvvfx-load.h"
|
|
|
/* -------------------------------------------------------- */
|
|
|
|
|
|
-#define do_log(level, format, ...) \
|
|
|
- blog(level, \
|
|
|
- "[NVIDIA RTX AI Greenscreen (Background removal): '%s'] " format, \
|
|
|
+#define do_log(level, format, ...) \
|
|
|
+ blog(level, \
|
|
|
+ "[NVIDIA AI Greenscreen (Background removal): '%s'] " format, \
|
|
|
obs_source_get_name(filter->context), ##__VA_ARGS__)
|
|
|
|
|
|
#define warn(format, ...) do_log(LOG_WARNING, format, ##__VA_ARGS__)
|
|
|
@@ -33,8 +33,10 @@
|
|
|
#define TEXT_MODE_QUALITY MT_("Greenscreen.Quality")
|
|
|
#define TEXT_MODE_PERF MT_("Greenscreen.Performance")
|
|
|
#define TEXT_MODE_THRESHOLD MT_("Greenscreen.Threshold")
|
|
|
+#define TEXT_DEPRECATION MT_("Greenscreen.Deprecation")
|
|
|
|
|
|
bool nvvfx_loaded = false;
|
|
|
+bool nvvfx_new_sdk = false;
|
|
|
struct nv_greenscreen_data {
|
|
|
obs_source_t *context;
|
|
|
bool images_allocated;
|
|
|
@@ -54,6 +56,7 @@ struct nv_greenscreen_data {
|
|
|
NvCVImage *A_dst_img; // mask img on GPU
|
|
|
NvCVImage *dst_img; // mask texture
|
|
|
NvCVImage *stage; // planar stage img used for transfer to texture
|
|
|
+ unsigned int version;
|
|
|
|
|
|
/* alpha mask effect */
|
|
|
gs_effect_t *effect;
|
|
|
@@ -445,13 +448,15 @@ static void *nv_greenscreen_filter_create(obs_data_t *settings,
|
|
|
nv_greenscreen_filter_destroy(filter);
|
|
|
return NULL;
|
|
|
}
|
|
|
- /* log sdk version */
|
|
|
- unsigned int version;
|
|
|
- if (NvVFX_GetVersion(&version) == NVCV_SUCCESS) {
|
|
|
- uint8_t major = (version >> 24) & 0xff;
|
|
|
- uint8_t minor = (version >> 16) & 0x00ff;
|
|
|
- uint8_t build = (version >> 8) & 0x0000ff;
|
|
|
- info("RTX VIDEO FX version: %i.%i.%i", major, minor, build);
|
|
|
+ /* check sdk version */
|
|
|
+ if (NvVFX_GetVersion(&filter->version) == NVCV_SUCCESS) {
|
|
|
+ uint8_t major = (filter->version >> 24) & 0xff;
|
|
|
+ uint8_t minor = (filter->version >> 16) & 0x00ff;
|
|
|
+ uint8_t build = (filter->version >> 8) & 0x0000ff;
|
|
|
+ uint8_t revision = (filter->version >> 0) & 0x000000ff;
|
|
|
+ // sanity check
|
|
|
+ nvvfx_new_sdk = filter->version >= (MIN_VFX_SDK_VERSION) &&
|
|
|
+ nvvfx_new_sdk;
|
|
|
}
|
|
|
|
|
|
/* 3. Load alpha mask effect. */
|
|
|
@@ -486,6 +491,7 @@ static void *nv_greenscreen_filter_create(obs_data_t *settings,
|
|
|
|
|
|
static obs_properties_t *nv_greenscreen_filter_properties(void *data)
|
|
|
{
|
|
|
+ struct nv_greenscreen_data *filter = (struct nv_greenscreen_data *)data;
|
|
|
obs_properties_t *props = obs_properties_create();
|
|
|
obs_property_t *mode = obs_properties_add_list(props, S_MODE, TEXT_MODE,
|
|
|
OBS_COMBO_TYPE_LIST,
|
|
|
@@ -494,8 +500,14 @@ static obs_properties_t *nv_greenscreen_filter_properties(void *data)
|
|
|
obs_property_list_add_int(mode, TEXT_MODE_PERF, S_MODE_PERF);
|
|
|
obs_property_t *threshold = obs_properties_add_float_slider(
|
|
|
props, S_THRESHOLDFX, TEXT_MODE_THRESHOLD, 0, 1, 0.05);
|
|
|
+ unsigned int version = get_lib_version();
|
|
|
+ if (version < (MIN_VFX_SDK_VERSION)) {
|
|
|
+ obs_property_t *warning = obs_properties_add_text(
|
|
|
+ props, "deprecation", NULL, OBS_TEXT_INFO);
|
|
|
+ obs_property_text_set_info_type(warning, OBS_TEXT_INFO_WARNING);
|
|
|
+ obs_property_set_long_description(warning, TEXT_DEPRECATION);
|
|
|
+ }
|
|
|
|
|
|
- UNUSED_PARAMETER(data);
|
|
|
return props;
|
|
|
}
|
|
|
|
|
|
@@ -815,20 +827,33 @@ static void nv_greenscreen_filter_render(void *data, gs_effect_t *effect)
|
|
|
|
|
|
bool load_nvvfx(void)
|
|
|
{
|
|
|
+ bool old_sdk_loaded = false;
|
|
|
+ unsigned int version = get_lib_version();
|
|
|
+ uint8_t major = (version >> 24) & 0xff;
|
|
|
+ uint8_t minor = (version >> 16) & 0x00ff;
|
|
|
+ uint8_t build = (version >> 8) & 0x0000ff;
|
|
|
+ uint8_t revision = (version >> 0) & 0x000000ff;
|
|
|
+ blog(LOG_INFO,
|
|
|
+ "[NVIDIA VIDEO FX]: NVIDIA VIDEO FX version: %i.%i.%i.%i", major,
|
|
|
+ minor, build, revision);
|
|
|
+ if (version < (MIN_VFX_SDK_VERSION)) {
|
|
|
+ blog(LOG_INFO,
|
|
|
+ "[NVIDIA VIDEO FX]: NVIDIA VIDEO Effects SDK is outdated; please update both audio & video SDK.");
|
|
|
+ }
|
|
|
if (!load_nv_vfx_libs()) {
|
|
|
blog(LOG_INFO,
|
|
|
- "[NVIDIA RTX VIDEO FX]: FX disabled, redistributable not found.");
|
|
|
+ "[NVIDIA VIDEO FX]: FX disabled, redistributable not found or could not be loaded.");
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-#define LOAD_SYM_FROM_LIB(sym, lib, dll) \
|
|
|
- if (!(sym = (sym##_t)GetProcAddress(lib, #sym))) { \
|
|
|
- DWORD err = GetLastError(); \
|
|
|
- printf("[NVIDIA RTX VIDEO FX]: Couldn't load " #sym \
|
|
|
- " from " dll ": %lu (0x%lx)", \
|
|
|
- err, err); \
|
|
|
- release_nv_vfx(); \
|
|
|
- goto unload_everything; \
|
|
|
+#define LOAD_SYM_FROM_LIB(sym, lib, dll) \
|
|
|
+ if (!(sym = (sym##_t)GetProcAddress(lib, #sym))) { \
|
|
|
+ DWORD err = GetLastError(); \
|
|
|
+ printf("[NVIDIA VIDEO FX]: Couldn't load " #sym " from " dll \
|
|
|
+ ": %lu (0x%lx)", \
|
|
|
+ err, err); \
|
|
|
+ release_nv_vfx(); \
|
|
|
+ goto unload_everything; \
|
|
|
}
|
|
|
|
|
|
#define LOAD_SYM(sym) LOAD_SYM_FROM_LIB(sym, nv_videofx, "NVVideoEffects.dll")
|
|
|
@@ -857,6 +882,7 @@ bool load_nvvfx(void)
|
|
|
LOAD_SYM(NvVFX_Load);
|
|
|
LOAD_SYM(NvVFX_CudaStreamCreate);
|
|
|
LOAD_SYM(NvVFX_CudaStreamDestroy);
|
|
|
+ old_sdk_loaded = true;
|
|
|
#undef LOAD_SYM
|
|
|
#define LOAD_SYM(sym) LOAD_SYM_FROM_LIB(sym, nv_cvimage, "NVCVImage.dll")
|
|
|
LOAD_SYM(NvCV_GetErrorStringFromCode);
|
|
|
@@ -900,20 +926,22 @@ bool load_nvvfx(void)
|
|
|
if (err != NVCV_SUCCESS) {
|
|
|
if (err == NVCV_ERR_UNSUPPORTEDGPU) {
|
|
|
blog(LOG_INFO,
|
|
|
- "[NVIDIA RTX VIDEO FX]: disabled, unsupported GPU");
|
|
|
+ "[NVIDIA VIDEO FX]: disabled, unsupported GPU");
|
|
|
} else {
|
|
|
- blog(LOG_ERROR,
|
|
|
- "[NVIDIA RTX VIDEO FX]: disabled, error %i", err);
|
|
|
+ blog(LOG_ERROR, "[NVIDIA VIDEO FX]: disabled, error %i",
|
|
|
+ err);
|
|
|
}
|
|
|
goto unload_everything;
|
|
|
}
|
|
|
NvVFX_DestroyEffect(h);
|
|
|
nvvfx_loaded = true;
|
|
|
- blog(LOG_INFO, "[NVIDIA RTX VIDEO FX]: enabled, redistributable found");
|
|
|
+ blog(LOG_INFO, "[NVIDIA VIDEO FX]: enabled, redistributable found");
|
|
|
return true;
|
|
|
|
|
|
unload_everything:
|
|
|
nvvfx_loaded = false;
|
|
|
+ blog(LOG_INFO,
|
|
|
+ "[NVIDIA VIDEO FX]: disabled, redistributable not found");
|
|
|
release_nv_vfx();
|
|
|
return false;
|
|
|
}
|