blob: 3e43af8ae39b74be119b185013842002cb2d5b0d
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 | #include "DebugUtils.h" |
32 | |
33 | namespace android { |
34 | |
35 | /** |
36 | * Encapsulates functionality common to all version 3.0 emulated camera devices |
37 | * |
38 | * Note that EmulatedCameraFactory instantiates an object of this class just |
39 | * once, when EmulatedCameraFactory instance gets constructed. Connection to / |
40 | * disconnection from the actual camera device is handled by calls to |
41 | * connectDevice(), and closeCamera() methods of this class that are invoked in |
42 | * response to hw_module_methods_t::open, and camera_device::close callbacks. |
43 | */ |
44 | class EmulatedCamera3 : public camera3_device, public EmulatedBaseCamera { |
45 | public: |
46 | /* Constructs EmulatedCamera3 instance. |
47 | * Param: |
48 | * cameraId - Zero based camera identifier, which is an index of the camera |
49 | * instance in camera factory's array. |
50 | * module - Emulated camera HAL module descriptor. |
51 | */ |
52 | EmulatedCamera3(int cameraId, |
53 | struct hw_module_t* module); |
54 | |
55 | /* Destructs EmulatedCamera2 instance. */ |
56 | virtual ~EmulatedCamera3(); |
57 | |
58 | /**************************************************************************** |
59 | * Abstract API |
60 | ***************************************************************************/ |
61 | |
62 | public: |
63 | |
64 | /**************************************************************************** |
65 | * Public API |
66 | ***************************************************************************/ |
67 | |
68 | public: |
69 | virtual status_t Initialize(); |
70 | virtual bool getCameraStatus(); |
71 | |
72 | /**************************************************************************** |
73 | * Camera module API and generic hardware device API implementation |
74 | ***************************************************************************/ |
75 | |
76 | public: |
77 | virtual status_t connectCamera(hw_device_t** device); |
78 | |
79 | virtual status_t closeCamera(); |
80 | |
81 | virtual status_t getCameraInfo(struct camera_info* info); |
82 | |
83 | /**************************************************************************** |
84 | * Camera API implementation. |
85 | * These methods are called from the camera API callback routines. |
86 | ***************************************************************************/ |
87 | |
88 | protected: |
89 | |
90 | virtual status_t initializeDevice( |
91 | const camera3_callback_ops *callbackOps); |
92 | |
93 | virtual status_t configureStreams( |
94 | camera3_stream_configuration *streamList); |
95 | |
96 | virtual status_t registerStreamBuffers( |
97 | const camera3_stream_buffer_set *bufferSet) ; |
98 | |
99 | virtual const camera_metadata_t* constructDefaultRequestSettings( |
100 | int type); |
101 | |
102 | virtual status_t processCaptureRequest(camera3_capture_request *request); |
103 | |
104 | /** Debug methods */ |
105 | |
106 | virtual void dump(int fd); |
107 | |
108 | virtual int flush_all_requests(); |
109 | /** Tag query methods */ |
110 | virtual const char *getVendorSectionName(uint32_t tag); |
111 | |
112 | virtual const char *getVendorTagName(uint32_t tag); |
113 | |
114 | virtual int getVendorTagType(uint32_t tag); |
115 | |
116 | /**************************************************************************** |
117 | * Camera API callbacks as defined by camera3_device_ops structure. See |
118 | * hardware/libhardware/include/hardware/camera3.h for information on each |
119 | * of these callbacks. Implemented in this class, these callbacks simply |
120 | * dispatch the call into an instance of EmulatedCamera3 class defined in |
121 | * the 'camera_device3' parameter. |
122 | ***************************************************************************/ |
123 | |
124 | private: |
125 | |
126 | /** Startup */ |
127 | static int initialize(const struct camera3_device *, |
128 | const camera3_callback_ops_t *callback_ops); |
129 | |
130 | /** Stream configuration and buffer registration */ |
131 | |
132 | static int configure_streams(const struct camera3_device *, |
133 | camera3_stream_configuration_t *stream_list); |
134 | |
135 | static int register_stream_buffers(const struct camera3_device *, |
136 | const camera3_stream_buffer_set_t *buffer_set); |
137 | |
138 | /** Template request settings provision */ |
139 | |
140 | static const camera_metadata_t* construct_default_request_settings( |
141 | const struct camera3_device *, int type); |
142 | |
143 | /** Submission of capture requests to HAL */ |
144 | |
145 | static int process_capture_request(const struct camera3_device *, |
146 | camera3_capture_request_t *request); |
147 | |
148 | /** Vendor metadata registration */ |
149 | static void get_metadata_vendor_tag_ops(const camera3_device_t *, |
150 | vendor_tag_query_ops_t *ops); |
151 | // for get_metadata_vendor_tag_ops |
152 | static const char* get_camera_vendor_section_name( |
153 | const vendor_tag_query_ops_t *, |
154 | uint32_t tag); |
155 | static const char* get_camera_vendor_tag_name( |
156 | const vendor_tag_query_ops_t *, |
157 | uint32_t tag); |
158 | static int get_camera_vendor_tag_type( |
159 | const vendor_tag_query_ops_t *, |
160 | uint32_t tag); |
161 | |
162 | static void dump(const camera3_device_t *, int fd); |
163 | static int flush(const struct camera3_device *d); |
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 | struct TagOps : public vendor_tag_query_ops { |
174 | EmulatedCamera3 *parent; |
175 | }; |
176 | TagOps mVendorTagOps; |
177 | |
178 | enum { |
179 | // State at construction time, and after a device operation error |
180 | STATUS_ERROR = 0, |
181 | // State after startup-time init and after device instance close |
182 | STATUS_CLOSED, |
183 | // State after being opened, before device instance init |
184 | STATUS_OPEN, |
185 | // State after device instance initialization |
186 | STATUS_READY, |
187 | // State while actively capturing data |
188 | STATUS_ACTIVE |
189 | } mStatus; |
190 | |
191 | bool mPlugged; |
192 | /** |
193 | * Callbacks back to the framework |
194 | */ |
195 | |
196 | void sendCaptureResult(camera3_capture_result_t *result); |
197 | void sendNotify(camera3_notify_msg_t *msg); |
198 | |
199 | /**************************************************************************** |
200 | * Data members |
201 | ***************************************************************************/ |
202 | private: |
203 | static camera3_device_ops_t sDeviceOps; |
204 | const camera3_callback_ops_t *mCallbackOps; |
205 | }; |
206 | |
207 | }; /* namespace android */ |
208 | |
209 | #endif /* HW_EMULATOR_CAMERA_EMULATED_CAMERA3_H */ |
210 |