From b588d6181bcae7b6886e3b3116c9475a59836c2d Mon Sep 17 00:00:00 2001 From: liushuyu Date: Fri, 23 Dec 2022 23:15:31 -0700 Subject: [PATCH] qt_multimedia_camera: fix image handling in Qt 5.15+ ... (#6231) ... In Qt 5.15+ the QImage will not accept non-natively handled pixel formats anymore. We can however use the newly added conversion method provided in `QVideoFrame` to convert it to `QImage` instead --- src/citra_qt/camera/qt_multimedia_camera.cpp | 33 ++++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/citra_qt/camera/qt_multimedia_camera.cpp b/src/citra_qt/camera/qt_multimedia_camera.cpp index 0681814b7d..ec3a6f5a4c 100644 --- a/src/citra_qt/camera/qt_multimedia_camera.cpp +++ b/src/citra_qt/camera/qt_multimedia_camera.cpp @@ -19,25 +19,31 @@ namespace Camera { QList QtCameraSurface::supportedPixelFormats( [[maybe_unused]] QAbstractVideoBuffer::HandleType handleType) const { return QList() - << QVideoFrame::Format_ARGB32 << QVideoFrame::Format_ARGB32_Premultiplied - << QVideoFrame::Format_RGB32 << QVideoFrame::Format_RGB24 << QVideoFrame::Format_RGB565 - << QVideoFrame::Format_RGB555 << QVideoFrame::Format_ARGB8565_Premultiplied - << QVideoFrame::Format_BGRA32 << QVideoFrame::Format_BGRA32_Premultiplied - << QVideoFrame::Format_BGR32 << QVideoFrame::Format_BGR24 << QVideoFrame::Format_BGR565 - << QVideoFrame::Format_BGR555 << QVideoFrame::Format_BGRA5658_Premultiplied - << QVideoFrame::Format_AYUV444 << QVideoFrame::Format_AYUV444_Premultiplied - << QVideoFrame::Format_YUV444 << QVideoFrame::Format_YUV420P << QVideoFrame::Format_YV12 - << QVideoFrame::Format_UYVY << QVideoFrame::Format_YUYV << QVideoFrame::Format_NV12 - << QVideoFrame::Format_NV21 << QVideoFrame::Format_IMC1 << QVideoFrame::Format_IMC2 - << QVideoFrame::Format_IMC3 << QVideoFrame::Format_IMC4 << QVideoFrame::Format_Y8 - << QVideoFrame::Format_Y16 << QVideoFrame::Format_Jpeg << QVideoFrame::Format_CameraRaw - << QVideoFrame::Format_AdobeDng; // Supporting all the formats + << QVideoFrame::Format_RGB32 << QVideoFrame::Format_RGB24 + << QVideoFrame::Format_ARGB32_Premultiplied << QVideoFrame::Format_ARGB32 + << QVideoFrame::Format_RGB565 << QVideoFrame::Format_RGB555 + << QVideoFrame::Format_Jpeg + // the following formats are supported via Qt internal conversions + << QVideoFrame::Format_ARGB8565_Premultiplied << QVideoFrame::Format_BGRA32 + << QVideoFrame::Format_BGRA32_Premultiplied << QVideoFrame::Format_BGR32 + << QVideoFrame::Format_BGR24 << QVideoFrame::Format_BGR565 << QVideoFrame::Format_BGR555 + << QVideoFrame::Format_AYUV444 << QVideoFrame::Format_YUV444 + << QVideoFrame::Format_YUV420P << QVideoFrame::Format_YV12 << QVideoFrame::Format_UYVY + << QVideoFrame::Format_YUYV << QVideoFrame::Format_NV12 + << QVideoFrame::Format_NV21; // Supporting all the QImage convertible formats, ordered by + // QImage decoding performance } bool QtCameraSurface::present(const QVideoFrame& frame) { if (!frame.isValid()) { return false; } +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + QMutexLocker locker(&mutex); + // In Qt 5.15, the image is already flipped + current_frame = frame.image(); + locker.unlock(); +#else QVideoFrame cloneFrame(frame); cloneFrame.map(QAbstractVideoBuffer::ReadOnly); const QImage image(cloneFrame.bits(), cloneFrame.width(), cloneFrame.height(), @@ -46,6 +52,7 @@ bool QtCameraSurface::present(const QVideoFrame& frame) { current_frame = image.mirrored(true, true); locker.unlock(); cloneFrame.unmap(); +#endif return true; }