/* * Copyright (C) 2013 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_CAMERA3_H #define HW_EMULATOR_CAMERA_EMULATED_CAMERA3_H /** * Contains declaration of a class EmulatedCamera that encapsulates * functionality common to all version 3.0 emulated camera devices. Instances * of this class (for each emulated camera) are created during the construction * of the EmulatedCameraFactory instance. This class serves as an entry point * for all camera API calls that defined by camera3_device_ops_t API. */ #include "hardware/camera3.h" #include "system/camera_metadata.h" #include "EmulatedBaseCamera.h" namespace android { /** * Encapsulates functionality common to all version 3.0 emulated camera devices * * Note that EmulatedCameraFactory instantiates an object of this class just * once, when EmulatedCameraFactory instance gets constructed. Connection to / * disconnection from the actual camera device is handled by calls to * connectDevice(), and closeCamera() methods of this class that are invoked in * response to hw_module_methods_t::open, and camera_device::close callbacks. */ class EmulatedCamera3 : public camera3_device, public EmulatedBaseCamera { public: /* Constructs EmulatedCamera3 instance. * Param: * cameraId - Zero based camera identifier, which is an index of the camera * instance in camera factory's array. * module - Emulated camera HAL module descriptor. */ EmulatedCamera3(int cameraId, struct hw_module_t* module); /* Destructs EmulatedCamera2 instance. */ virtual ~EmulatedCamera3(); /**************************************************************************** * Abstract API ***************************************************************************/ public: /**************************************************************************** * Public API ***************************************************************************/ public: virtual status_t Initialize(); /**************************************************************************** * Camera module API and generic hardware device API implementation ***************************************************************************/ public: virtual status_t connectCamera(hw_device_t** device); virtual status_t closeCamera(); virtual status_t getCameraInfo(struct camera_info* info); /**************************************************************************** * Camera API implementation. * These methods are called from the camera API callback routines. ***************************************************************************/ protected: virtual status_t initializeDevice( const camera3_callback_ops *callbackOps); virtual status_t configureStreams( camera3_stream_configuration *streamList); virtual status_t registerStreamBuffers( const camera3_stream_buffer_set *bufferSet) ; virtual const camera_metadata_t* constructDefaultRequestSettings( int type); virtual status_t processCaptureRequest(camera3_capture_request *request); /** Debug methods */ virtual void dump(int fd); /** Tag query methods */ virtual const char *getVendorSectionName(uint32_t tag); virtual const char *getVendorTagName(uint32_t tag); virtual int getVendorTagType(uint32_t tag); /**************************************************************************** * Camera API callbacks as defined by camera3_device_ops structure. See * hardware/libhardware/include/hardware/camera3.h for information on each * of these callbacks. Implemented in this class, these callbacks simply * dispatch the call into an instance of EmulatedCamera3 class defined in * the 'camera_device3' parameter. ***************************************************************************/ private: /** Startup */ static int initialize(const struct camera3_device *, const camera3_callback_ops_t *callback_ops); /** Stream configuration and buffer registration */ static int configure_streams(const struct camera3_device *, camera3_stream_configuration_t *stream_list); static int register_stream_buffers(const struct camera3_device *, const camera3_stream_buffer_set_t *buffer_set); /** Template request settings provision */ static const camera_metadata_t* construct_default_request_settings( const struct camera3_device *, int type); /** Submission of capture requests to HAL */ static int process_capture_request(const struct camera3_device *, camera3_capture_request_t *request); /** Vendor metadata registration */ static void get_metadata_vendor_tag_ops(const camera3_device_t *, vendor_tag_query_ops_t *ops); // for get_metadata_vendor_tag_ops static const char* get_camera_vendor_section_name( const vendor_tag_query_ops_t *, uint32_t tag); static const char* get_camera_vendor_tag_name( const vendor_tag_query_ops_t *, uint32_t tag); static int get_camera_vendor_tag_type( const vendor_tag_query_ops_t *, uint32_t tag); static void dump(const camera3_device_t *, int fd); /** For hw_device_t ops */ static int close(struct hw_device_t* device); /**************************************************************************** * Data members shared with implementations ***************************************************************************/ protected: struct TagOps : public vendor_tag_query_ops { EmulatedCamera3 *parent; }; TagOps mVendorTagOps; enum { // State at construction time, and after a device operation error STATUS_ERROR = 0, // State after startup-time init and after device instance close STATUS_CLOSED, // State after being opened, before device instance init STATUS_OPEN, // State after device instance initialization STATUS_READY, // State while actively capturing data STATUS_ACTIVE } mStatus; /** * Callbacks back to the framework */ void sendCaptureResult(camera3_capture_result_t *result); void sendNotify(camera3_notify_msg_t *msg); /**************************************************************************** * Data members ***************************************************************************/ private: static camera3_device_ops_t sDeviceOps; const camera3_callback_ops_t *mCallbackOps; }; }; /* namespace android */ #endif /* HW_EMULATOR_CAMERA_EMULATED_CAMERA3_H */