From 46281ece4c98e51cddc491cd5aab15ecb8c50a5c Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 13 May 2025 19:37:06 +0200 Subject: [PATCH] test --- rpcs3/rpcs3qt/camera_settings_dialog.cpp | 16 +++++++++++----- rpcs3/rpcs3qt/camera_settings_dialog.h | 3 +++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/rpcs3/rpcs3qt/camera_settings_dialog.cpp b/rpcs3/rpcs3qt/camera_settings_dialog.cpp index f03587c025..710268f5c1 100644 --- a/rpcs3/rpcs3qt/camera_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/camera_settings_dialog.cpp @@ -630,8 +630,12 @@ void camera_settings_dialog::handle_sdl_settings_change(const QVariant& item_dat { // It was observed that connecting sendVideoFrame directly can soft-lock the software. // So let's just create the video frame here and call it manually. - const QVideoFrame video_frame(m_sdl_image); - m_video_frame_input->sendVideoFrame(video_frame); + std::unique_lock lock(m_sdl_image_mutex, std::defer_lock); + if (lock.try_lock()) + { + const QVideoFrame video_frame(m_sdl_image); + m_video_frame_input->sendVideoFrame(video_frame); + } }); #endif @@ -674,18 +678,20 @@ void camera_settings_dialog::run_sdl() } #if (QT_VERSION_MAJOR >= 6 && QT_VERSION_MINOR >= 8) // TODO: Remove when MacOs is at Qt 6.8+ - Emu.BlockingCallFromMainThread([this, frame]() { // Map image const QImage::Format format = SDL_ISPIXELFORMAT_ALPHA(frame->format) ? QImage::Format_RGBA8888 : QImage::Format_RGB888; const QImage image = QImage(reinterpret_cast(frame->pixels), frame->w, frame->h, format); // Copy image to prevent memory access violations - m_sdl_image = image.copy(); + { + std::lock_guard lock(m_sdl_image_mutex); + m_sdl_image = image.copy(); + } // Notify UI Q_EMIT sdl_frame_ready(); - }); + } #endif SDL_ReleaseCameraFrame(m_sdl_camera, frame); diff --git a/rpcs3/rpcs3qt/camera_settings_dialog.h b/rpcs3/rpcs3qt/camera_settings_dialog.h index b2bb289dc4..39162feb3f 100644 --- a/rpcs3/rpcs3qt/camera_settings_dialog.h +++ b/rpcs3/rpcs3qt/camera_settings_dialog.h @@ -11,6 +11,8 @@ #endif #include +#include + #ifdef HAVE_SDL3 #ifndef _MSC_VER #pragma GCC diagnostic push @@ -62,6 +64,7 @@ private: SDL_Camera* m_sdl_camera = nullptr; SDL_CameraID m_sdl_camera_id = 0; QImage m_sdl_image; + std::mutex m_sdl_image_mutex; std::unique_ptr>> m_sdl_thread; #if (QT_VERSION_MAJOR >= 6 && QT_VERSION_MINOR >= 8) // TODO: Remove when MacOs is at Qt 6.8+ std::unique_ptr m_video_frame_input;