mirror of
https://github.com/Xaymar/obs-StreamFX
synced 2024-11-24 12:25:11 +00:00
269 lines
8.5 KiB
C++
269 lines
8.5 KiB
C++
/*
|
|
* Modern effects for a modern Streamer
|
|
* Copyright (C) 2020 Michael Fabian Dirks
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
#include "nvidia-ar.hpp"
|
|
#include <stdexcept>
|
|
#include <util/bmem.h>
|
|
#include <util/platform.h>
|
|
|
|
#ifdef WIN32
|
|
#include <Shlobj.h>
|
|
#include <Windows.h>
|
|
#endif
|
|
|
|
#include <nvARProxy.cpp>
|
|
#define nvGetProcAddress nvGetProcAddressCV
|
|
#define nvFreeLibrary nvFreeLibraryCV
|
|
#include <nvCVImageProxy.cpp>
|
|
#undef nvGetProcAddress
|
|
#undef nvFreeLibrary
|
|
|
|
streamfx::nvidia::ar::ar::ar()
|
|
{
|
|
if (!getNvARLib())
|
|
throw std::runtime_error("Failed to load NVIDIA AR SDK runtime.");
|
|
}
|
|
|
|
streamfx::nvidia::ar::ar::~ar() {}
|
|
|
|
std::filesystem::path streamfx::nvidia::ar::ar::get_ar_sdk_path()
|
|
{
|
|
char* arsdk_path = getenv("NV_AR_SDK_PATH");
|
|
if (arsdk_path) {
|
|
return std::filesystem::path(std::string{arsdk_path});
|
|
} else {
|
|
std::filesystem::path res;
|
|
#ifdef WIN32
|
|
std::vector<wchar_t> dll_path_w;
|
|
dll_path_w.resize(65535);
|
|
DWORD size_w = GetModuleFileNameW(getNvARLib(), dll_path_w.data(), static_cast<DWORD>(dll_path_w.size()));
|
|
|
|
std::vector<char> dll_path;
|
|
dll_path.resize(65535);
|
|
std::size_t size = os_wcs_to_utf8(dll_path_w.data(), size_w, dll_path.data(), dll_path.size());
|
|
|
|
std::filesystem::path dll = std::string{dll_path.data(), dll_path.data() + size};
|
|
res = dll.remove_filename();
|
|
#endif
|
|
return res;
|
|
}
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::image_init(NvCVImage* im, unsigned width, unsigned height, int pitch,
|
|
void* pixels, NvCVImage_PixelFormat format,
|
|
NvCVImage_ComponentType type, unsigned isPlanar, unsigned onGPU)
|
|
{
|
|
return NvCVImage_Init(im, width, height, pitch, pixels, format, type, isPlanar, onGPU);
|
|
}
|
|
|
|
void streamfx::nvidia::ar::ar::image_init_view(NvCVImage* subImg, NvCVImage* fullImg, int x, int y, unsigned width,
|
|
unsigned height)
|
|
{
|
|
NvCVImage_InitView(subImg, fullImg, x, y, width, height);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::image_alloc(NvCVImage* im, unsigned width, unsigned height,
|
|
NvCVImage_PixelFormat format, NvCVImage_ComponentType type,
|
|
unsigned isPlanar, unsigned onGPU, unsigned alignment)
|
|
{
|
|
return NvCVImage_Alloc(im, width, height, format, type, isPlanar, onGPU, alignment);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::image_realloc(NvCVImage* im, unsigned width, unsigned height,
|
|
NvCVImage_PixelFormat format, NvCVImage_ComponentType type,
|
|
unsigned isPlanar, unsigned onGPU, unsigned alignment)
|
|
{
|
|
return NvCVImage_Realloc(im, width, height, format, type, isPlanar, onGPU, alignment);
|
|
}
|
|
|
|
void streamfx::nvidia::ar::ar::image_dealloc(NvCVImage* im)
|
|
{
|
|
NvCVImage_Dealloc(im);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::image_create(unsigned width, unsigned height, NvCVImage_PixelFormat format,
|
|
NvCVImage_ComponentType type, unsigned isPlanar, unsigned onGPU,
|
|
unsigned alignment, NvCVImage** out)
|
|
{
|
|
return NvCVImage_Create(width, height, format, type, isPlanar, onGPU, alignment, out);
|
|
}
|
|
|
|
void streamfx::nvidia::ar::ar::image_destroy(NvCVImage* im)
|
|
{
|
|
NvCVImage_Destroy(im);
|
|
}
|
|
|
|
void streamfx::nvidia::ar::ar::image_component_offsets(NvCVImage_PixelFormat format, int* rOff, int* gOff, int* bOff,
|
|
int* aOff, int* yOff)
|
|
{
|
|
NvCVImage_ComponentOffsets(format, rOff, gOff, bOff, aOff, yOff);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::image_transfer(const NvCVImage* src, NvCVImage* dst, float scale,
|
|
CUstream_st* stream, NvCVImage* tmp)
|
|
{
|
|
return NvCVImage_Transfer(src, dst, scale, stream, tmp);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::image_composite(const NvCVImage* src, const NvCVImage* mat, NvCVImage* dst)
|
|
{
|
|
//return NvCVImage_Composite(src, mat, dst);
|
|
throw std::runtime_error("Not implemented.");
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::image_composite_over_constant(const NvCVImage* src, const NvCVImage* mat,
|
|
const unsigned char bgColor[3], NvCVImage* dst)
|
|
{
|
|
return NvCVImage_CompositeOverConstant(src, mat, bgColor, dst);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::image_flipy(const NvCVImage* src, NvCVImage* dst)
|
|
{
|
|
return NvCVImage_FlipY(src, dst);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::create(NvAR_FeatureID featureID, NvAR_FeatureHandle* handle)
|
|
{
|
|
return NvAR_Create(featureID, handle);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::destroy(NvAR_FeatureHandle handle)
|
|
{
|
|
return NvAR_Destroy(handle);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::set_uint32(NvAR_FeatureHandle handle, const char* name, unsigned int val)
|
|
{
|
|
return NvAR_SetU32(handle, name, val);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::set_int32(NvAR_FeatureHandle handle, const char* name, int val)
|
|
{
|
|
return NvAR_SetS32(handle, name, val);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::set_float32(NvAR_FeatureHandle handle, const char* name, float val)
|
|
{
|
|
return NvAR_SetF32(handle, name, val);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::set_float64(NvAR_FeatureHandle handle, const char* name, double val)
|
|
{
|
|
return NvAR_SetF64(handle, name, val);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::set_uint64(NvAR_FeatureHandle handle, const char* name, unsigned long long val)
|
|
{
|
|
return NvAR_SetU64(handle, name, val);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::set_object(NvAR_FeatureHandle handle, const char* name, void* ptr,
|
|
unsigned long typeSize)
|
|
{
|
|
return NvAR_SetObject(handle, name, ptr, typeSize);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::set_string(NvAR_FeatureHandle handle, const char* name, const char* str)
|
|
{
|
|
return NvAR_SetString(handle, name, str);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::set_cuda_stream(NvAR_FeatureHandle handle, const char* name, CUstream stream)
|
|
{
|
|
return NvAR_SetCudaStream(handle, name, stream);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::set_float32_array(NvAR_FeatureHandle handle, const char* name, float* val,
|
|
int count)
|
|
{
|
|
return NvAR_SetF32Array(handle, name, val, count);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::get_uint32(NvAR_FeatureHandle handle, const char* name, unsigned int* val)
|
|
{
|
|
return NvAR_GetU32(handle, name, val);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::get_int32(NvAR_FeatureHandle handle, const char* name, int* val)
|
|
{
|
|
return NvAR_GetS32(handle, name, val);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::get_float32(NvAR_FeatureHandle handle, const char* name, float* val)
|
|
{
|
|
return NvAR_GetF32(handle, name, val);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::get_float64(NvAR_FeatureHandle handle, const char* name, double* val)
|
|
{
|
|
return NvAR_GetF64(handle, name, val);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::get_uint64(NvAR_FeatureHandle handle, const char* name, unsigned long long* val)
|
|
{
|
|
return NvAR_GetU64(handle, name, val);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::get_object(NvAR_FeatureHandle handle, const char* name, const void** ptr,
|
|
unsigned long typeSize)
|
|
{
|
|
return NvAR_GetObject(handle, name, ptr, typeSize);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::get_string(NvAR_FeatureHandle handle, const char* name, const char** str)
|
|
{
|
|
return NvAR_GetString(handle, name, str);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::get_cuda_stream(NvAR_FeatureHandle handle, const char* name,
|
|
const CUstream* stream)
|
|
{
|
|
return NvAR_GetCudaStream(handle, name, stream);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::get_float32_array(NvAR_FeatureHandle handle, const char* name, const float** vals,
|
|
int* count)
|
|
{
|
|
return NvAR_GetF32Array(handle, name, vals, count);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::run(NvAR_FeatureHandle handle)
|
|
{
|
|
return NvAR_Run(handle);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::load(NvAR_FeatureHandle handle)
|
|
{
|
|
return NvAR_Load(handle);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::cuda_stream_create(CUstream* stream)
|
|
{
|
|
return NvAR_CudaStreamCreate(stream);
|
|
}
|
|
|
|
NvCV_Status streamfx::nvidia::ar::ar::cuda_stream_destroy(CUstream stream)
|
|
{
|
|
return NvAR_CudaStreamDestroy(stream);
|
|
}
|
|
|
|
const char* streamfx::nvidia::ar::ar::cv_get_error_string_from_code(NvCV_Status code)
|
|
{
|
|
return NvCV_GetErrorStringFromCode(code);
|
|
}
|