camera: Use pre-allocated vector for camera data

And avoid an unnecessary copy
This commit is contained in:
ameerj 2022-12-15 22:50:36 -05:00
parent 9ff891ce71
commit 7bf4bec257
4 changed files with 12 additions and 9 deletions

View file

@ -17,7 +17,7 @@ Camera::Camera(std::string input_engine_) : InputEngine(std::move(input_engine_)
PreSetController(identifier); PreSetController(identifier);
} }
void Camera::SetCameraData(std::size_t width, std::size_t height, std::vector<u32> data) { void Camera::SetCameraData(std::size_t width, std::size_t height, std::span<const u32> data) {
const std::size_t desired_width = getImageWidth(); const std::size_t desired_width = getImageWidth();
const std::size_t desired_height = getImageHeight(); const std::size_t desired_height = getImageHeight();
status.data.resize(desired_width * desired_height); status.data.resize(desired_width * desired_height);

View file

@ -3,6 +3,8 @@
#pragma once #pragma once
#include <span>
#include "input_common/input_engine.h" #include "input_common/input_engine.h"
namespace InputCommon { namespace InputCommon {
@ -15,7 +17,7 @@ class Camera final : public InputEngine {
public: public:
explicit Camera(std::string input_engine_); explicit Camera(std::string input_engine_);
void SetCameraData(std::size_t width, std::size_t height, std::vector<u32> data); void SetCameraData(std::size_t width, std::size_t height, std::span<const u32> data);
std::size_t getImageWidth() const; std::size_t getImageWidth() const;
std::size_t getImageHeight() const; std::size_t getImageHeight() const;

View file

@ -752,6 +752,7 @@ void GRenderWindow::InitializeCamera() {
return; return;
} }
camera_data.resize(CAMERA_WIDTH * CAMERA_HEIGHT);
camera_capture->setCaptureDestination(QCameraImageCapture::CaptureDestination::CaptureToBuffer); camera_capture->setCaptureDestination(QCameraImageCapture::CaptureDestination::CaptureToBuffer);
connect(camera_capture.get(), &QCameraImageCapture::imageCaptured, this, connect(camera_capture.get(), &QCameraImageCapture::imageCaptured, this,
&GRenderWindow::OnCameraCapture); &GRenderWindow::OnCameraCapture);
@ -807,16 +808,13 @@ void GRenderWindow::RequestCameraCapture() {
} }
void GRenderWindow::OnCameraCapture(int requestId, const QImage& img) { void GRenderWindow::OnCameraCapture(int requestId, const QImage& img) {
constexpr std::size_t camera_width = 320; // TODO: Capture directly in the format and resolution needed
constexpr std::size_t camera_height = 240;
const auto converted = const auto converted =
img.scaled(camera_width, camera_height, Qt::AspectRatioMode::IgnoreAspectRatio, img.scaled(CAMERA_WIDTH, CAMERA_HEIGHT, Qt::AspectRatioMode::IgnoreAspectRatio,
Qt::TransformationMode::SmoothTransformation) Qt::TransformationMode::SmoothTransformation)
.mirrored(false, true); .mirrored(false, true);
std::vector<u32> camera_data{}; std::memcpy(camera_data.data(), converted.bits(), CAMERA_WIDTH * CAMERA_HEIGHT * sizeof(u32));
camera_data.resize(camera_width * camera_height); input_subsystem->GetCamera()->SetCameraData(CAMERA_WIDTH, CAMERA_HEIGHT, camera_data);
std::memcpy(camera_data.data(), converted.bits(), camera_width * camera_height * sizeof(u32));
input_subsystem->GetCamera()->SetCameraData(camera_width, camera_height, camera_data);
pending_camera_snapshots = 0; pending_camera_snapshots = 0;
} }

View file

@ -246,6 +246,9 @@ private:
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) && YUZU_USE_QT_MULTIMEDIA #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) && YUZU_USE_QT_MULTIMEDIA
std::unique_ptr<QCamera> camera; std::unique_ptr<QCamera> camera;
std::unique_ptr<QCameraImageCapture> camera_capture; std::unique_ptr<QCameraImageCapture> camera_capture;
static constexpr std::size_t CAMERA_WIDTH = 320;
static constexpr std::size_t CAMERA_HEIGHT = 240;
std::vector<u32> camera_data;
#endif #endif
std::unique_ptr<QTimer> camera_timer; std::unique_ptr<QTimer> camera_timer;