/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef HW_EMULATOR_CAMERA_EMULATED_CAMERA_FACTORY_H
#define HW_EMULATOR_CAMERA_EMULATED_CAMERA_FACTORY_H
#include <utils/RefBase.h>
#include <utils/Vector.h>
#include "CameraConfiguration.h"
#include "EmulatedBaseCamera.h"
#include "common/libs/threads/cuttlefish_thread.h"
#include "guest/libs/platform_support/api_level_fixes.h"
namespace android {
class EmulatedCameraHotplugThread;
/*
* Contains declaration of a class EmulatedCameraFactory that manages cameras
* available for the emulation. A global instance of this class is statically
* instantiated and initialized when camera emulation HAL is loaded.
*/
/* Class EmulatedCameraFactoryManages cameras available for the emulation.
*
* When the global static instance of this class is created on the module load,
* it enumerates cameras available for the emulation by connecting to the
* emulator's 'camera' service. For every camera found out there it creates an
* instance of an appropriate class, and stores it an in array of emulated
* cameras. In addition to the cameras reported by the emulator, a fake camera
* emulator is always created, so there is always at least one camera that is
* available.
*
* Instance of this class is also used as the entry point for the camera HAL
* API, including:
* - hw_module_methods_t::open entry point
* - camera_module_t::get_number_of_cameras entry point
* - camera_module_t::get_camera_info entry point
*
*/
class EmulatedCameraFactory {
public:
/* Constructs EmulatedCameraFactory instance.
* In this constructor the factory will create and initialize a list of
* emulated cameras. All errors that occur on this constructor are reported
* via mConstructedOK data member of this class.
*/
EmulatedCameraFactory();
/* Destructs EmulatedCameraFactory instance. */
~EmulatedCameraFactory();
/****************************************************************************
* Camera HAL API handlers.
***************************************************************************/
public:
/* Returns a (singleton) instance of the EmulatedCameraFactory.
*/
static EmulatedCameraFactory& Instance();
/* Opens (connects to) a camera device.
* This method is called in response to hw_module_methods_t::open callback.
*/
int cameraDeviceOpen(int camera_id, hw_device_t** device);
/* Gets emulated camera information.
* This method is called in response to camera_module_t::get_camera_info
* callback.
*/
int getCameraInfo(int camera_id, struct camera_info* info);
#if VSOC_PLATFORM_SDK_AFTER(J_MR2)
/* Sets emulated camera callbacks.
* This method is called in response to camera_module_t::set_callbacks
* callback.
*/
int setCallbacks(const camera_module_callbacks_t* callbacks);
/* Fill in vendor tags for the module
* This method is called in response to camera_module_t::get_vendor_tag_ops
* callback.
*/
void getVendorTagOps(vendor_tag_ops_t* ops);
#endif
int setTorchMode(const char* camera_id, bool enabled);
/****************************************************************************
* Camera HAL API callbacks.
***************************************************************************/
public:
/* camera_module_t::get_number_of_cameras callback entry point. */
static int get_number_of_cameras(void);
/* camera_module_t::get_camera_info callback entry point. */
static int get_camera_info(int camera_id, struct camera_info* info);
#if VSOC_PLATFORM_SDK_AFTER(J_MR2)
/* camera_module_t::set_callbacks callback entry point. */
static int set_callbacks(const camera_module_callbacks_t* callbacks);
/* camera_module_t::get_vendor_tag_ops callback entry point */
static void get_vendor_tag_ops(vendor_tag_ops_t* ops);
#endif
/* camera_module_t::open_legacy callback entry point */
static int open_legacy(const struct hw_module_t* module, const char* id,
uint32_t halVersion, struct hw_device_t** device);
static int set_torch_mode(const char* camera_id, bool enabled);
private:
/* hw_module_methods_t::open callback entry point. */
static int device_open(const hw_module_t* module, const char* name,
hw_device_t** device);
/****************************************************************************
* Public API.
***************************************************************************/
public:
/* Gets fake camera orientation. */
int getFakeCameraOrientation() {
/* TODO: Have a boot property that controls that. */
return 90;
}
/* Gets number of emulated cameras.
*/
inline size_t getEmulatedCameraNum() const {
return mCameraDefinitions.size();
}
void onStatusChanged(int cameraId, int newStatus);
void onTorchModeStatusChanged(int cameraId, int newStatus);
/****************************************************************************
* Private API
***************************************************************************/
private:
/* Create new or return existing fake camera based on camera definition
* found in mCameraDefinitions.
* Returns NULL if cameraId is not valid (= not a valid index of
* mCameraDefinitions)
*/
EmulatedBaseCamera* getOrCreateFakeCamera(size_t cameraId);
/****************************************************************************
* Data members.
***************************************************************************/
private:
/* Array of cameras available for the emulation. */
Vector<EmulatedBaseCamera*> mEmulatedCameras;
/* Guards access to mEmulatedCameras. */
cvd::Mutex mEmulatedCamerasMutex;
#if VSOC_PLATFORM_SDK_AFTER(J_MR2)
/* Camera callbacks (for status changing) */
const camera_module_callbacks_t* mCallbacks;
/* Hotplug thread (to call onStatusChanged) */
sp<EmulatedCameraHotplugThread> mHotplugThread;
#endif
/* Back- and front camera properties accessed from the vsoc device. */
cvd::CameraConfiguration mCameraConfiguration;
Vector<cvd::CameraDefinition> mCameraDefinitions;
public:
/* Contains device open entry point, as required by HAL API. */
static struct hw_module_methods_t mCameraModuleMethods;
};
}; /* namespace android */
#endif /* HW_EMULATOR_CAMERA_EMULATED_CAMERA_FACTORY_H */