mirror of
https://github.com/Xaymar/obs-StreamFX
synced 2024-11-11 06:15:05 +00:00
filter/nvidia-face-tracking: Update to nvidia::cuda::obs
This commit is contained in:
parent
18afbdea25
commit
3c05d892e6
2 changed files with 14 additions and 43 deletions
|
@ -53,8 +53,7 @@ face_tracking_instance::face_tracking_instance(obs_data_t* settings, obs_source_
|
||||||
|
|
||||||
_geometry(), _filters(), _values(),
|
_geometry(), _filters(), _values(),
|
||||||
|
|
||||||
_cuda(face_tracking_factory::get()->get_cuda()), _cuda_ctx(face_tracking_factory::get()->get_cuda_context()),
|
_cuda(::nvidia::cuda::obs::get()), _cuda_stream(),
|
||||||
_cuda_stream(),
|
|
||||||
|
|
||||||
_ar_library(face_tracking_factory::get()->get_ar()), _ar_loaded(false), _ar_feature(), _ar_is_tracking(false),
|
_ar_library(face_tracking_factory::get()->get_ar()), _ar_loaded(false), _ar_feature(), _ar_is_tracking(false),
|
||||||
_ar_bboxes_confidence(), _ar_bboxes_data(), _ar_bboxes(), _ar_texture(), _ar_texture_cuda_fresh(false),
|
_ar_bboxes_confidence(), _ar_bboxes_data(), _ar_bboxes(), _ar_texture(), _ar_texture_cuda_fresh(false),
|
||||||
|
@ -76,7 +75,7 @@ face_tracking_instance::face_tracking_instance(obs_data_t* settings, obs_source_
|
||||||
auto gctx = gs::context{};
|
auto gctx = gs::context{};
|
||||||
_rt = std::make_shared<gs::rendertarget>(GS_RGBA, GS_ZS_NONE);
|
_rt = std::make_shared<gs::rendertarget>(GS_RGBA, GS_ZS_NONE);
|
||||||
_geometry = std::make_shared<gs::vertex_buffer>(uint32_t(4), uint8_t(1));
|
_geometry = std::make_shared<gs::vertex_buffer>(uint32_t(4), uint8_t(1));
|
||||||
auto cctx = std::make_shared<::nvidia::cuda::context_stack>(_cuda_ctx);
|
auto cctx = _cuda->get_context()->enter();
|
||||||
_cuda_stream = std::make_shared<::nvidia::cuda::stream>(::nvidia::cuda::stream_flags::NON_BLOCKING, 0);
|
_cuda_stream = std::make_shared<::nvidia::cuda::stream>(::nvidia::cuda::stream_flags::NON_BLOCKING, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,7 +137,7 @@ void face_tracking_instance::async_initialize(std::shared_ptr<void> ptr)
|
||||||
|
|
||||||
// Update the current CUDA context for working.
|
// Update the current CUDA context for working.
|
||||||
gs::context gctx;
|
gs::context gctx;
|
||||||
auto cctx = std::make_shared<::nvidia::cuda::context_stack>(_cuda_ctx);
|
auto cctx = _cuda->get_context()->enter();
|
||||||
|
|
||||||
// Create Face Detection feature.
|
// Create Face Detection feature.
|
||||||
{
|
{
|
||||||
|
@ -266,7 +265,7 @@ void face_tracking_instance::async_track(std::shared_ptr<void> ptr)
|
||||||
gs::context gctx{};
|
gs::context gctx{};
|
||||||
|
|
||||||
// Update the current CUDA context for working.
|
// Update the current CUDA context for working.
|
||||||
auto cctx = std::make_shared<::nvidia::cuda::context_stack>(_cuda_ctx);
|
auto cctx = _cuda->get_context()->enter();
|
||||||
|
|
||||||
// Refresh any now broken buffers.
|
// Refresh any now broken buffers.
|
||||||
if (!_ar_texture_cuda_fresh) {
|
if (!_ar_texture_cuda_fresh) {
|
||||||
|
@ -291,7 +290,7 @@ void face_tracking_instance::async_track(std::shared_ptr<void> ptr)
|
||||||
NVCV_INTERLEAVED, NVCV_CUDA, 0);
|
NVCV_INTERLEAVED, NVCV_CUDA, 0);
|
||||||
|
|
||||||
// Synchronize Streams.
|
// Synchronize Streams.
|
||||||
_cuda->cuStreamSynchronize(_cuda_stream->get());
|
_cuda_stream->synchronize();
|
||||||
|
|
||||||
// Finally set the input object.
|
// Finally set the input object.
|
||||||
if (NvCV_Status res = _ar_library->set_object(_ar_feature.get(), NvAR_Parameter_Input(Image),
|
if (NvCV_Status res = _ar_library->set_object(_ar_feature.get(), NvAR_Parameter_Input(Image),
|
||||||
|
@ -327,7 +326,7 @@ void face_tracking_instance::async_track(std::shared_ptr<void> ptr)
|
||||||
mc.width_in_bytes = static_cast<size_t>(_ar_image.pitch);
|
mc.width_in_bytes = static_cast<size_t>(_ar_image.pitch);
|
||||||
mc.height = _ar_image.height;
|
mc.height = _ar_image.height;
|
||||||
|
|
||||||
if (::nvidia::cuda::result res = _cuda->cuMemcpy2DAsync(&mc, _cuda_stream->get());
|
if (::nvidia::cuda::result res = _cuda->get_cuda()->cuMemcpy2DAsync(&mc, _cuda_stream->get());
|
||||||
res != ::nvidia::cuda::result::SUCCESS) {
|
res != ::nvidia::cuda::result::SUCCESS) {
|
||||||
DLOG_ERROR("<%s> Failed to prepare buffers for tracking.", obs_source_get_name(_self));
|
DLOG_ERROR("<%s> Failed to prepare buffers for tracking.", obs_source_get_name(_self));
|
||||||
return;
|
return;
|
||||||
|
@ -347,8 +346,8 @@ void face_tracking_instance::async_track(std::shared_ptr<void> ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Synchronize Streams.
|
// Synchronize Streams.
|
||||||
_cuda->cuStreamSynchronize(_cuda_stream->get());
|
_cuda_stream->synchronize();
|
||||||
_cuda->cuCtxSynchronize();
|
_cuda->get_context()->synchronize();
|
||||||
}
|
}
|
||||||
|
|
||||||
{ // Track any faces.
|
{ // Track any faces.
|
||||||
|
@ -604,24 +603,11 @@ bool face_tracking_instance::button_profile(obs_properties_t* props, obs_propert
|
||||||
face_tracking_factory::face_tracking_factory()
|
face_tracking_factory::face_tracking_factory()
|
||||||
{
|
{
|
||||||
// Try and load CUDA.
|
// Try and load CUDA.
|
||||||
_cuda = ::nvidia::cuda::cuda::get();
|
_cuda = ::nvidia::cuda::obs::get();
|
||||||
|
|
||||||
// Try and load AR.
|
// Try and load AR.
|
||||||
_ar = std::make_shared<::nvidia::ar::ar>();
|
_ar = std::make_shared<::nvidia::ar::ar>();
|
||||||
|
|
||||||
// Initialize CUDA
|
|
||||||
{
|
|
||||||
auto gctx = gs::context{};
|
|
||||||
#ifdef WIN32
|
|
||||||
if (gs_get_device_type() == GS_DEVICE_DIRECT3D_11) {
|
|
||||||
_cuda_ctx = std::make_shared<::nvidia::cuda::context>(reinterpret_cast<ID3D11Device*>(gs_get_device_obj()));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (gs_get_device_type() == GS_DEVICE_OPENGL) {
|
|
||||||
throw std::runtime_error("OpenGL not supported.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Info
|
// Info
|
||||||
_info.id = PREFIX "filter-nvidia-face-tracking";
|
_info.id = PREFIX "filter-nvidia-face-tracking";
|
||||||
_info.type = OBS_SOURCE_TYPE_FILTER;
|
_info.type = OBS_SOURCE_TYPE_FILTER;
|
||||||
|
@ -693,16 +679,6 @@ obs_properties_t* face_tracking_factory::get_properties2(face_tracking_instance*
|
||||||
return pr;
|
return pr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<::nvidia::cuda::cuda> face_tracking_factory::get_cuda()
|
|
||||||
{
|
|
||||||
return _cuda;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<::nvidia::cuda::context> face_tracking_factory::get_cuda_context()
|
|
||||||
{
|
|
||||||
return _cuda_ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<::nvidia::ar::ar> face_tracking_factory::get_ar()
|
std::shared_ptr<::nvidia::ar::ar> face_tracking_factory::get_ar()
|
||||||
{
|
{
|
||||||
return _ar;
|
return _ar;
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "nvidia/cuda/nvidia-cuda-context.hpp"
|
#include "nvidia/cuda/nvidia-cuda-context.hpp"
|
||||||
#include "nvidia/cuda/nvidia-cuda-gs-texture.hpp"
|
#include "nvidia/cuda/nvidia-cuda-gs-texture.hpp"
|
||||||
#include "nvidia/cuda/nvidia-cuda-memory.hpp"
|
#include "nvidia/cuda/nvidia-cuda-memory.hpp"
|
||||||
|
#include "nvidia/cuda/nvidia-cuda-obs.hpp"
|
||||||
#include "nvidia/cuda/nvidia-cuda-stream.hpp"
|
#include "nvidia/cuda/nvidia-cuda-stream.hpp"
|
||||||
#include "nvidia/cuda/nvidia-cuda.hpp"
|
#include "nvidia/cuda/nvidia-cuda.hpp"
|
||||||
|
|
||||||
|
@ -62,9 +63,8 @@ namespace streamfx::filter::nvidia {
|
||||||
} _values;
|
} _values;
|
||||||
|
|
||||||
// Nvidia CUDA interop
|
// Nvidia CUDA interop
|
||||||
std::shared_ptr<::nvidia::cuda::cuda> _cuda;
|
std::shared_ptr<::nvidia::cuda::obs> _cuda;
|
||||||
std::shared_ptr<::nvidia::cuda::context> _cuda_ctx;
|
std::shared_ptr<::nvidia::cuda::stream> _cuda_stream;
|
||||||
std::shared_ptr<::nvidia::cuda::stream> _cuda_stream;
|
|
||||||
|
|
||||||
// Nvidia AR interop
|
// Nvidia AR interop
|
||||||
std::shared_ptr<::nvidia::ar::ar> _ar_library;
|
std::shared_ptr<::nvidia::ar::ar> _ar_library;
|
||||||
|
@ -129,9 +129,8 @@ namespace streamfx::filter::nvidia {
|
||||||
|
|
||||||
class face_tracking_factory
|
class face_tracking_factory
|
||||||
: public obs::source_factory<filter::nvidia::face_tracking_factory, filter::nvidia::face_tracking_instance> {
|
: public obs::source_factory<filter::nvidia::face_tracking_factory, filter::nvidia::face_tracking_instance> {
|
||||||
std::shared_ptr<::nvidia::cuda::cuda> _cuda;
|
std::shared_ptr<::nvidia::cuda::obs> _cuda;
|
||||||
std::shared_ptr<::nvidia::cuda::context> _cuda_ctx;
|
std::shared_ptr<::nvidia::ar::ar> _ar;
|
||||||
std::shared_ptr<::nvidia::ar::ar> _ar;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
face_tracking_factory();
|
face_tracking_factory();
|
||||||
|
@ -143,10 +142,6 @@ namespace streamfx::filter::nvidia {
|
||||||
|
|
||||||
virtual obs_properties_t* get_properties2(filter::nvidia::face_tracking_instance* data) override;
|
virtual obs_properties_t* get_properties2(filter::nvidia::face_tracking_instance* data) override;
|
||||||
|
|
||||||
std::shared_ptr<::nvidia::cuda::cuda> get_cuda();
|
|
||||||
|
|
||||||
std::shared_ptr<::nvidia::cuda::context> get_cuda_context();
|
|
||||||
|
|
||||||
std::shared_ptr<::nvidia::ar::ar> get_ar();
|
std::shared_ptr<::nvidia::ar::ar> get_ar();
|
||||||
|
|
||||||
public: // Singleton
|
public: // Singleton
|
||||||
|
|
Loading…
Reference in a new issue