14 changed files with 1520 additions and 172 deletions
-
15src/citra/config.cpp
-
16src/citra/default_ini.h
-
32src/citra_qt/config.cpp
-
6src/core/CMakeLists.txt
-
31src/core/frontend/camera/blank_camera.cpp
-
28src/core/frontend/camera/blank_camera.h
-
32src/core/frontend/camera/factory.cpp
-
41src/core/frontend/camera/factory.h
-
11src/core/frontend/camera/interface.cpp
-
61src/core/frontend/camera/interface.h
-
1024src/core/hle/service/cam/cam.cpp
-
358src/core/hle/service/cam/cam.h
-
32src/core/hle/service/cam/cam_u.cpp
-
5src/core/settings.h
@ -0,0 +1,31 @@ |
|||
// Copyright 2016 Citra Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "core/frontend/camera/blank_camera.h"
|
|||
|
|||
namespace Camera { |
|||
|
|||
void BlankCamera::StartCapture() {} |
|||
|
|||
void BlankCamera::StopCapture() {} |
|||
|
|||
void BlankCamera::SetFormat(Service::CAM::OutputFormat output_format) { |
|||
output_rgb = output_format == Service::CAM::OutputFormat::RGB565; |
|||
} |
|||
|
|||
void BlankCamera::SetResolution(const Service::CAM::Resolution& resolution) { |
|||
width = resolution.width; |
|||
height = resolution.height; |
|||
}; |
|||
|
|||
void BlankCamera::SetFlip(Service::CAM::Flip) {} |
|||
|
|||
void BlankCamera::SetEffect(Service::CAM::Effect) {} |
|||
|
|||
std::vector<u16> BlankCamera::ReceiveFrame() const { |
|||
// Note: 0x80008000 stands for two black pixels in YUV422
|
|||
return std::vector<u16>(width * height, output_rgb ? 0 : 0x8000); |
|||
} |
|||
|
|||
} // namespace Camera
|
|||
@ -0,0 +1,28 @@ |
|||
// Copyright 2016 Citra Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include "core/frontend/camera/factory.h" |
|||
#include "core/frontend/camera/interface.h" |
|||
|
|||
namespace Camera { |
|||
|
|||
class BlankCamera final : public CameraInterface { |
|||
public: |
|||
void StartCapture() override; |
|||
void StopCapture() override; |
|||
void SetResolution(const Service::CAM::Resolution&) override; |
|||
void SetFlip(Service::CAM::Flip) override; |
|||
void SetEffect(Service::CAM::Effect) override; |
|||
void SetFormat(Service::CAM::OutputFormat) override; |
|||
std::vector<u16> ReceiveFrame() const override; |
|||
|
|||
private: |
|||
int width = 0; |
|||
int height = 0; |
|||
bool output_rgb = false; |
|||
}; |
|||
|
|||
} // namespace Camera |
|||
@ -0,0 +1,32 @@ |
|||
// Copyright 2016 Citra Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include <unordered_map>
|
|||
#include "common/logging/log.h"
|
|||
#include "core/frontend/camera/blank_camera.h"
|
|||
#include "core/frontend/camera/factory.h"
|
|||
|
|||
namespace Camera { |
|||
|
|||
static std::unordered_map<std::string, std::unique_ptr<CameraFactory>> factories; |
|||
|
|||
CameraFactory::~CameraFactory() = default; |
|||
|
|||
void RegisterFactory(const std::string& name, std::unique_ptr<CameraFactory> factory) { |
|||
factories[name] = std::move(factory); |
|||
} |
|||
|
|||
std::unique_ptr<CameraInterface> CreateCamera(const std::string& name, const std::string& config) { |
|||
auto pair = factories.find(name); |
|||
if (pair != factories.end()) { |
|||
return pair->second->Create(config); |
|||
} |
|||
|
|||
if (name != "blank") { |
|||
LOG_ERROR(Service_CAM, "Unknown camera \"%s\"", name.c_str()); |
|||
} |
|||
return std::make_unique<BlankCamera>(); |
|||
} |
|||
|
|||
} // namespace Camera
|
|||
@ -0,0 +1,41 @@ |
|||
// Copyright 2016 Citra Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include <memory> |
|||
#include <string> |
|||
#include "core/frontend/camera/interface.h" |
|||
|
|||
namespace Camera { |
|||
|
|||
class CameraFactory { |
|||
public: |
|||
virtual ~CameraFactory(); |
|||
|
|||
/** |
|||
* Creates a camera object based on the configuration string. |
|||
* @params config Configuration string to create the camera. The implementation can decide the |
|||
* meaning of this string. |
|||
* @returns a unique_ptr to the created camera object. |
|||
*/ |
|||
virtual std::unique_ptr<CameraInterface> Create(const std::string& config) const = 0; |
|||
}; |
|||
|
|||
/** |
|||
* Registers an external camera factory. |
|||
* @param name Identifier of the camera factory. |
|||
* @param factory Camera factory to register. |
|||
*/ |
|||
void RegisterFactory(const std::string& name, std::unique_ptr<CameraFactory> factory); |
|||
|
|||
/** |
|||
* Creates a camera from the factory. |
|||
* @param name Identifier of the camera factory. |
|||
* @param config Configuration string to create the camera. The meaning of this string is |
|||
* defined by the factory. |
|||
*/ |
|||
std::unique_ptr<CameraInterface> CreateCamera(const std::string& name, const std::string& config); |
|||
|
|||
} // namespace Camera |
|||
@ -0,0 +1,11 @@ |
|||
// Copyright 2016 Citra Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "core/frontend/camera/interface.h"
|
|||
|
|||
namespace Camera { |
|||
|
|||
CameraInterface::~CameraInterface() = default; |
|||
|
|||
} // namespace Camera
|
|||
@ -0,0 +1,61 @@ |
|||
// Copyright 2016 Citra Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include <vector> |
|||
#include "common/common_types.h" |
|||
#include "core/hle/service/cam/cam.h" |
|||
|
|||
namespace Camera { |
|||
|
|||
/// An abstract class standing for a camera. All camera implementations should inherit from this. |
|||
class CameraInterface { |
|||
public: |
|||
virtual ~CameraInterface(); |
|||
|
|||
/// Starts the camera for video capturing. |
|||
virtual void StartCapture() = 0; |
|||
|
|||
/// Stops the camera for video capturing. |
|||
virtual void StopCapture() = 0; |
|||
|
|||
/** |
|||
* Sets the video resolution from raw CAM service parameters. |
|||
* For the meaning of the parameters, please refer to Service::CAM::Resolution. Note that the |
|||
* actual camera implementation doesn't need to respect all the parameters. However, the width |
|||
* and the height parameters must be respected and be used to determine the size of output |
|||
* frames. |
|||
* @param resolution The resolution parameters to set |
|||
*/ |
|||
virtual void SetResolution(const Service::CAM::Resolution& resolution) = 0; |
|||
|
|||
/** |
|||
* Configures how received frames should be flipped by the camera. |
|||
* @param flip Flip applying to the frame |
|||
*/ |
|||
virtual void SetFlip(Service::CAM::Flip flip) = 0; |
|||
|
|||
/** |
|||
* Configures what effect should be applied to received frames by the camera. |
|||
* @param effect Effect applying to the frame |
|||
*/ |
|||
virtual void SetEffect(Service::CAM::Effect effect) = 0; |
|||
|
|||
/** |
|||
* Sets the output format of the all frames received after this function is called. |
|||
* @param format Output format of the frame |
|||
*/ |
|||
virtual void SetFormat(Service::CAM::OutputFormat format) = 0; |
|||
|
|||
/** |
|||
* Receives a frame from the camera. |
|||
* This function should be only called between a StartCapture call and a StopCapture call. |
|||
* @returns A std::vector<u16> containing pixels. The total size of the vector is width * height |
|||
* where width and height are set by a call to SetResolution. |
|||
*/ |
|||
virtual std::vector<u16> ReceiveFrame() const = 0; |
|||
}; |
|||
|
|||
} // namespace Camera |
|||
1024
src/core/hle/service/cam/cam.cpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue