mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	Merge pull request #2368 from wwylele/camera-2
CAM: build the service framework with a dummy implementation
This commit is contained in:
		
						commit
						1410aa1824
					
				
					 14 changed files with 1517 additions and 169 deletions
				
			
		
							
								
								
									
										31
									
								
								src/core/frontend/camera/blank_camera.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/core/frontend/camera/blank_camera.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -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
 | ||||
							
								
								
									
										28
									
								
								src/core/frontend/camera/blank_camera.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/core/frontend/camera/blank_camera.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -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
 | ||||
							
								
								
									
										32
									
								
								src/core/frontend/camera/factory.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/core/frontend/camera/factory.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -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
 | ||||
							
								
								
									
										41
									
								
								src/core/frontend/camera/factory.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/core/frontend/camera/factory.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -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
 | ||||
							
								
								
									
										11
									
								
								src/core/frontend/camera/interface.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/core/frontend/camera/interface.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -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
 | ||||
							
								
								
									
										61
									
								
								src/core/frontend/camera/interface.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								src/core/frontend/camera/interface.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -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
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue