camera: Use pre-allocated vector for camera data
And avoid an unnecessary copy
This commit is contained in:
parent
9ff891ce71
commit
7bf4bec257
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Reference in New Issue