From 308ea6289a8bd7936d0c4e104fbe88065be67696 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Mon, 26 Sep 2022 21:13:58 +0200 Subject: [PATCH] implement xflip in the UI --- src/frontend/qt_sdl/CameraManager.cpp | 50 ++++++++++++++------ src/frontend/qt_sdl/CameraManager.h | 12 +++-- src/frontend/qt_sdl/CameraSettingsDialog.cpp | 8 ++++ src/frontend/qt_sdl/CameraSettingsDialog.h | 4 +- src/frontend/qt_sdl/main.cpp | 2 + 5 files changed, 54 insertions(+), 22 deletions(-) diff --git a/src/frontend/qt_sdl/CameraManager.cpp b/src/frontend/qt_sdl/CameraManager.cpp index 2ca441e1..d1f9232a 100644 --- a/src/frontend/qt_sdl/CameraManager.cpp +++ b/src/frontend/qt_sdl/CameraManager.cpp @@ -22,7 +22,7 @@ CameraFrameDumper::CameraFrameDumper(QObject* parent) : QAbstractVideoSurface(parent) { - camList.append((CameraManager*)parent); + cam = (CameraManager*)parent; } bool CameraFrameDumper::present(const QVideoFrame& _frame) @@ -33,8 +33,7 @@ bool CameraFrameDumper::present(const QVideoFrame& _frame) if (!frame.isReadable()) return false; - for (CameraManager* cam : camList) - cam->feedFrame((u32*)frame.bits(), frame.width(), frame.height(), frame.pixelFormat() == QVideoFrame::Format_YUYV); + cam->feedFrame((u32*)frame.bits(), frame.width(), frame.height(), frame.pixelFormat() == QVideoFrame::Format_YUYV); frame.unmap(); @@ -71,6 +70,7 @@ CameraManager::CameraManager(int num, int width, int height, bool yuv) : QObject frameBuffer = new u32[fbsize]; inputType = -1; + xFlip = false; init(); } @@ -120,13 +120,14 @@ void CameraManager::init() if (frameFormatYUV) { copyFrame_RGBtoYUV((u32*)img.bits(), img.width(), img.height(), - frameBuffer, frameWidth, frameHeight); + frameBuffer, frameWidth, frameHeight, + false); } else { copyFrame_Straight((u32*)img.bits(), img.width(), img.height(), frameBuffer, frameWidth, frameHeight, - false); + false, false); } } } @@ -205,11 +206,19 @@ void CameraManager::camStop() camDevice->stop(); } +void CameraManager::setXFlip(bool flip) +{ + xFlip = flip; +} + void CameraManager::captureFrame(u32* frame, int width, int height, bool yuv) { frameMutex.lock(); - if (width == frameWidth && height == frameHeight && yuv == frameFormatYUV) + if ((width == frameWidth) && + (height == frameHeight) && + (yuv == frameFormatYUV) && + (!xFlip)) { int len = width * height; if (yuv) len /= 2; @@ -221,17 +230,19 @@ void CameraManager::captureFrame(u32* frame, int width, int height, bool yuv) { copyFrame_Straight(frameBuffer, frameWidth, frameHeight, frame, width, height, - yuv); + xFlip, yuv); } else if (yuv) { copyFrame_RGBtoYUV(frameBuffer, frameWidth, frameHeight, - frame, width, height); + frame, width, height, + xFlip); } else { copyFrame_YUVtoRGB(frameBuffer, frameWidth, frameHeight, - frame, width, height); + frame, width, height, + xFlip); } } @@ -254,24 +265,26 @@ void CameraManager::feedFrame(u32* frame, int width, int height, bool yuv) { copyFrame_Straight(frame, width, height, frameBuffer, frameWidth, frameHeight, - yuv); + false, yuv); } else if (yuv) { copyFrame_RGBtoYUV(frame, width, height, - frameBuffer, frameWidth, frameHeight); + frameBuffer, frameWidth, frameHeight, + false); } else { copyFrame_YUVtoRGB(frame, width, height, - frameBuffer, frameWidth, frameHeight); + frameBuffer, frameWidth, frameHeight, + false); } } frameMutex.unlock(); } -void CameraManager::copyFrame_Straight(u32* src, int swidth, int sheight, u32* dst, int dwidth, int dheight, bool yuv) +void CameraManager::copyFrame_Straight(u32* src, int swidth, int sheight, u32* dst, int dwidth, int dheight, bool xflip, bool yuv) { if (yuv) { @@ -286,13 +299,14 @@ void CameraManager::copyFrame_Straight(u32* src, int swidth, int sheight, u32* d for (int dx = 0; dx < dwidth; dx++) { int sx = (dx * swidth) / dwidth; + if (xflip) sx = swidth-1 - sx; dst[(dy * dwidth) + dx] = src[(sy * swidth) + sx]; } } } -void CameraManager::copyFrame_RGBtoYUV(u32* src, int swidth, int sheight, u32* dst, int dwidth, int dheight) +void CameraManager::copyFrame_RGBtoYUV(u32* src, int swidth, int sheight, u32* dst, int dwidth, int dheight, bool xflip) { for (int dy = 0; dy < dheight; dy++) { @@ -303,9 +317,13 @@ void CameraManager::copyFrame_RGBtoYUV(u32* src, int swidth, int sheight, u32* d int sx; sx = (dx * swidth) / dwidth; + if (xflip) sx = swidth-1 - sx; + u32 pixel1 = src[sy*swidth + sx]; sx = ((dx+1) * swidth) / dwidth; + if (xflip) sx = swidth-1 - sx; + u32 pixel2 = src[sy*swidth + sx]; int r1 = (pixel1 >> 16) & 0xFF; @@ -339,7 +357,7 @@ void CameraManager::copyFrame_RGBtoYUV(u32* src, int swidth, int sheight, u32* d } } -void CameraManager::copyFrame_YUVtoRGB(u32* src, int swidth, int sheight, u32* dst, int dwidth, int dheight) +void CameraManager::copyFrame_YUVtoRGB(u32* src, int swidth, int sheight, u32* dst, int dwidth, int dheight, bool xflip) { for (int dy = 0; dy < dheight; dy++) { @@ -348,6 +366,8 @@ void CameraManager::copyFrame_YUVtoRGB(u32* src, int swidth, int sheight, u32* d for (int dx = 0; dx < dwidth; dx+=2) { int sx = (dx * swidth) / dwidth; + if (xflip) sx = swidth-1 - sx; + u32 val = src[(sy*swidth + sx) / 2]; int y1 = val & 0xFF; diff --git a/src/frontend/qt_sdl/CameraManager.h b/src/frontend/qt_sdl/CameraManager.h index 58a34a89..ec882930 100644 --- a/src/frontend/qt_sdl/CameraManager.h +++ b/src/frontend/qt_sdl/CameraManager.h @@ -40,7 +40,7 @@ public: QList supportedPixelFormats(QAbstractVideoBuffer::HandleType type = QAbstractVideoBuffer::NoHandle) const override; private: - QList camList; + CameraManager* cam; }; class CameraManager : public QObject @@ -58,6 +58,8 @@ public: void stop(); bool isStarted(); + void setXFlip(bool flip); + void captureFrame(u32* frame, int width, int height, bool yuv); void feedFrame(u32* frame, int width, int height, bool yuv); @@ -87,9 +89,11 @@ private: u32* frameBuffer; QMutex frameMutex; - void copyFrame_Straight(u32* src, int swidth, int sheight, u32* dst, int dwidth, int dheight, bool yuv); - void copyFrame_RGBtoYUV(u32* src, int swidth, int sheight, u32* dst, int dwidth, int dheight); - void copyFrame_YUVtoRGB(u32* src, int swidth, int sheight, u32* dst, int dwidth, int dheight); + bool xFlip; + + void copyFrame_Straight(u32* src, int swidth, int sheight, u32* dst, int dwidth, int dheight, bool xflip, bool yuv); + void copyFrame_RGBtoYUV(u32* src, int swidth, int sheight, u32* dst, int dwidth, int dheight, bool xflip); + void copyFrame_YUVtoRGB(u32* src, int swidth, int sheight, u32* dst, int dwidth, int dheight, bool xflip); }; #endif // CAMERAMANAGER_H diff --git a/src/frontend/qt_sdl/CameraSettingsDialog.cpp b/src/frontend/qt_sdl/CameraSettingsDialog.cpp index 65d60361..9830c662 100644 --- a/src/frontend/qt_sdl/CameraSettingsDialog.cpp +++ b/src/frontend/qt_sdl/CameraSettingsDialog.cpp @@ -270,3 +270,11 @@ void CameraSettingsDialog::populateCamControls(int id) ui->chkFlipPicture->setChecked(cfg.XFlip); } + +void CameraSettingsDialog::on_chkFlipPicture_clicked() +{ + if (!currentCfg) return; + + currentCfg->XFlip = ui->chkFlipPicture->isChecked(); + if (currentCam) currentCam->setXFlip(currentCfg->XFlip); +} diff --git a/src/frontend/qt_sdl/CameraSettingsDialog.h b/src/frontend/qt_sdl/CameraSettingsDialog.h index 8311cae1..8572ac42 100644 --- a/src/frontend/qt_sdl/CameraSettingsDialog.h +++ b/src/frontend/qt_sdl/CameraSettingsDialog.h @@ -79,9 +79,6 @@ public: currentDlg = nullptr; } -signals: - // - private slots: void on_CameraSettingsDialog_accepted(); void on_CameraSettingsDialog_rejected(); @@ -91,6 +88,7 @@ private slots: void on_txtSrcImagePath_textChanged(); void on_btnSrcImageBrowse_clicked(); void on_cbPhysicalCamera_currentIndexChanged(int id); + void on_chkFlipPicture_clicked(); private: Ui::CameraSettingsDialog* ui; diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index f261f07a..a9d0c4d9 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -3233,6 +3233,8 @@ int main(int argc, char** argv) camStarted[1] = false; camManager[0] = new CameraManager(0, 640, 480, true); camManager[1] = new CameraManager(1, 640, 480, true); + camManager[0]->setXFlip(Config::Camera[0].XFlip); + camManager[1]->setXFlip(Config::Camera[1].XFlip); ROMManager::EnableCheats(Config::EnableCheats != 0);