diff --git a/src/citra_qt/camera/qt_camera_base.cpp b/src/citra_qt/camera/qt_camera_base.cpp index e48b6d258..bbbb06d34 100644 --- a/src/citra_qt/camera/qt_camera_base.cpp +++ b/src/citra_qt/camera/qt_camera_base.cpp @@ -1,8 +1,11 @@ -// Copyright Citra Emulator Project / Lime3DS Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include #include +#include +#include #include "citra_qt/camera/camera_util.h" #include "citra_qt/camera/qt_camera_base.h" #include "common/logging/log.h" @@ -38,8 +41,17 @@ void QtCameraInterface::SetEffect(Service::CAM::Effect effect) { } std::vector QtCameraInterface::ReceiveFrame() { - return CameraUtil::ProcessImage(QtReceiveFrame(), width, height, output_rgb, flip_horizontal, - flip_vertical); + QImage img; + // If executing from Qt thread, call directly as normal + if (QThread::currentThread() == QCoreApplication::instance()->thread()) { + img = QtReceiveFrame(); + } else { // If not on Qt thread, switch to Qt thread to call QtReceiveFrame, as calling it from + // a different thread will cause deadlocks in msys2 builds + QMetaObject::invokeMethod( + QCoreApplication::instance(), [&]() { img = QtReceiveFrame(); }, + Qt::BlockingQueuedConnection); + } + return CameraUtil::ProcessImage(img, width, height, output_rgb, flip_horizontal, flip_vertical); } std::unique_ptr QtCameraFactory::CreatePreview(const std::string& config,