1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef HW_EMULATOR_CAMERA_EMULATED_CAMERA3_H
18#define HW_EMULATOR_CAMERA_EMULATED_CAMERA3_H
19
20/**
21 * Contains declaration of a class EmulatedCamera that encapsulates
22 * functionality common to all version 3.0 emulated camera devices.  Instances
23 * of this class (for each emulated camera) are created during the construction
24 * of the EmulatedCameraFactory instance.  This class serves as an entry point
25 * for all camera API calls that defined by camera3_device_ops_t API.
26 */
27
28#include "hardware/camera3.h"
29#include "system/camera_metadata.h"
30#include "EmulatedBaseCamera.h"
31
32namespace android {
33
34/**
35 * Encapsulates functionality common to all version 3.0 emulated camera devices
36 *
37 * Note that EmulatedCameraFactory instantiates an object of this class just
38 * once, when EmulatedCameraFactory instance gets constructed. Connection to /
39 * disconnection from the actual camera device is handled by calls to
40 * connectDevice(), and closeCamera() methods of this class that are invoked in
41 * response to hw_module_methods_t::open, and camera_device::close callbacks.
42 */
43class EmulatedCamera3 : public camera3_device, public EmulatedBaseCamera {
44public:
45    /* Constructs EmulatedCamera3 instance.
46     * Param:
47     *  cameraId - Zero based camera identifier, which is an index of the camera
48     *      instance in camera factory's array.
49     *  module - Emulated camera HAL module descriptor.
50     */
51    EmulatedCamera3(int cameraId,
52            struct hw_module_t* module);
53
54    /* Destructs EmulatedCamera2 instance. */
55    virtual ~EmulatedCamera3();
56
57    /* List of all defined capabilities plus useful HW levels */
58    enum AvailableCapabilities {
59        BACKWARD_COMPATIBLE,
60        MANUAL_SENSOR,
61        MANUAL_POST_PROCESSING,
62        RAW,
63        PRIVATE_REPROCESSING,
64        READ_SENSOR_SETTINGS,
65        BURST_CAPTURE,
66        YUV_REPROCESSING,
67        DEPTH_OUTPUT,
68        CONSTRAINED_HIGH_SPEED_VIDEO,
69        // Levels
70        FULL_LEVEL,
71
72        NUM_CAPABILITIES
73    };
74
75    // Char strings for above enum, with size NUM_CAPABILITIES
76    static const char *sAvailableCapabilitiesStrings[];
77
78    /****************************************************************************
79     * Abstract API
80     ***************************************************************************/
81
82public:
83
84    /****************************************************************************
85     * Public API
86     ***************************************************************************/
87
88public:
89    virtual status_t Initialize();
90
91    /****************************************************************************
92     * Camera module API and generic hardware device API implementation
93     ***************************************************************************/
94
95public:
96    virtual status_t connectCamera(hw_device_t** device);
97
98    virtual status_t closeCamera();
99
100    virtual status_t getCameraInfo(struct camera_info* info);
101
102    /****************************************************************************
103     * Camera API implementation.
104     * These methods are called from the camera API callback routines.
105     ***************************************************************************/
106
107protected:
108
109    virtual status_t initializeDevice(
110        const camera3_callback_ops *callbackOps);
111
112    virtual status_t configureStreams(
113        camera3_stream_configuration *streamList);
114
115    virtual status_t registerStreamBuffers(
116        const camera3_stream_buffer_set *bufferSet) ;
117
118    virtual const camera_metadata_t* constructDefaultRequestSettings(
119        int type);
120
121    virtual status_t processCaptureRequest(camera3_capture_request *request);
122
123    virtual status_t flush();
124
125    /** Debug methods */
126
127    virtual void dump(int fd);
128
129    /****************************************************************************
130     * Camera API callbacks as defined by camera3_device_ops structure.  See
131     * hardware/libhardware/include/hardware/camera3.h for information on each
132     * of these callbacks. Implemented in this class, these callbacks simply
133     * dispatch the call into an instance of EmulatedCamera3 class defined in
134     * the 'camera_device3' parameter.
135     ***************************************************************************/
136
137private:
138
139    /** Startup */
140    static int initialize(const struct camera3_device *,
141            const camera3_callback_ops_t *callback_ops);
142
143    /** Stream configuration and buffer registration */
144
145    static int configure_streams(const struct camera3_device *,
146            camera3_stream_configuration_t *stream_list);
147
148    static int register_stream_buffers(const struct camera3_device *,
149            const camera3_stream_buffer_set_t *buffer_set);
150
151    /** Template request settings provision */
152
153    static const camera_metadata_t* construct_default_request_settings(
154            const struct camera3_device *, int type);
155
156    /** Submission of capture requests to HAL */
157
158    static int process_capture_request(const struct camera3_device *,
159            camera3_capture_request_t *request);
160
161    static void dump(const camera3_device_t *, int fd);
162
163    static int flush(const camera3_device_t *);
164
165    /** For hw_device_t ops */
166    static int close(struct hw_device_t* device);
167
168    /****************************************************************************
169     * Data members shared with implementations
170     ***************************************************************************/
171  protected:
172
173    enum {
174        // State at construction time, and after a device operation error
175        STATUS_ERROR = 0,
176        // State after startup-time init and after device instance close
177        STATUS_CLOSED,
178        // State after being opened, before device instance init
179        STATUS_OPEN,
180        // State after device instance initialization
181        STATUS_READY,
182        // State while actively capturing data
183        STATUS_ACTIVE
184    } mStatus;
185
186    /**
187     * Callbacks back to the framework
188     */
189
190    void sendCaptureResult(camera3_capture_result_t *result);
191    void sendNotify(camera3_notify_msg_t *msg);
192
193    /****************************************************************************
194     * Data members
195     ***************************************************************************/
196  private:
197    static camera3_device_ops_t   sDeviceOps;
198    const camera3_callback_ops_t *mCallbackOps;
199};
200
201}; /* namespace android */
202
203#endif  /* HW_EMULATOR_CAMERA_EMULATED_CAMERA3_H */
204