blob: b7be30ec5db05120b1558129e2c517743326a671
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 void setCameraStatus(camera_status_t status); |
71 | virtual camera_status_t getCameraStatus(); |
72 | |
73 | /**************************************************************************** |
74 | * Camera module API and generic hardware device API implementation |
75 | ***************************************************************************/ |
76 | |
77 | public: |
78 | virtual status_t connectCamera(hw_device_t** device); |
79 | |
80 | virtual status_t closeCamera(); |
81 | |
82 | virtual status_t getCameraInfo(struct camera_info* info); |
83 | |
84 | /**************************************************************************** |
85 | * Camera API implementation. |
86 | * These methods are called from the camera API callback routines. |
87 | ***************************************************************************/ |
88 | |
89 | protected: |
90 | |
91 | virtual status_t initializeDevice( |
92 | const camera3_callback_ops *callbackOps); |
93 | |
94 | virtual status_t configureStreams( |
95 | camera3_stream_configuration *streamList); |
96 | |
97 | virtual status_t registerStreamBuffers( |
98 | const camera3_stream_buffer_set *bufferSet) ; |
99 | |
100 | virtual const camera_metadata_t* constructDefaultRequestSettings( |
101 | int type); |
102 | |
103 | virtual status_t processCaptureRequest(camera3_capture_request *request); |
104 | |
105 | /** Debug methods */ |
106 | |
107 | virtual void dump(int fd); |
108 | |
109 | virtual int flush_all_requests(); |
110 | /** Tag query methods */ |
111 | virtual const char *getVendorSectionName(uint32_t tag); |
112 | |
113 | virtual const char *getVendorTagName(uint32_t tag); |
114 | |
115 | virtual int getVendorTagType(uint32_t tag); |
116 | |
117 | /**************************************************************************** |
118 | * Camera API callbacks as defined by camera3_device_ops structure. See |
119 | * hardware/libhardware/include/hardware/camera3.h for information on each |
120 | * of these callbacks. Implemented in this class, these callbacks simply |
121 | * dispatch the call into an instance of EmulatedCamera3 class defined in |
122 | * the 'camera_device3' parameter. |
123 | ***************************************************************************/ |
124 | |
125 | private: |
126 | |
127 | /** Startup */ |
128 | static int initialize(const struct camera3_device *, |
129 | const camera3_callback_ops_t *callback_ops); |
130 | |
131 | /** Stream configuration and buffer registration */ |
132 | |
133 | static int configure_streams(const struct camera3_device *, |
134 | camera3_stream_configuration_t *stream_list); |
135 | |
136 | static int register_stream_buffers(const struct camera3_device *, |
137 | const camera3_stream_buffer_set_t *buffer_set); |
138 | |
139 | /** Template request settings provision */ |
140 | |
141 | static const camera_metadata_t* construct_default_request_settings( |
142 | const struct camera3_device *, int type); |
143 | |
144 | /** Submission of capture requests to HAL */ |
145 | |
146 | static int process_capture_request(const struct camera3_device *, |
147 | camera3_capture_request_t *request); |
148 | |
149 | /** Vendor metadata registration */ |
150 | static void get_metadata_vendor_tag_ops(const camera3_device_t *, |
151 | vendor_tag_query_ops_t *ops); |
152 | // for get_metadata_vendor_tag_ops |
153 | static const char* get_camera_vendor_section_name( |
154 | const vendor_tag_query_ops_t *, |
155 | uint32_t tag); |
156 | static const char* get_camera_vendor_tag_name( |
157 | const vendor_tag_query_ops_t *, |
158 | uint32_t tag); |
159 | static int get_camera_vendor_tag_type( |
160 | const vendor_tag_query_ops_t *, |
161 | uint32_t tag); |
162 | |
163 | static void dump(const camera3_device_t *, int fd); |
164 | static int flush(const struct camera3_device *d); |
165 | |
166 | /** For hw_device_t ops */ |
167 | static int close(struct hw_device_t* device); |
168 | |
169 | /**************************************************************************** |
170 | * Data members shared with implementations |
171 | ***************************************************************************/ |
172 | protected: |
173 | |
174 | struct TagOps : public vendor_tag_query_ops { |
175 | EmulatedCamera3 *parent; |
176 | }; |
177 | TagOps mVendorTagOps; |
178 | |
179 | enum { |
180 | // State at construction time, and after a device operation error |
181 | STATUS_ERROR = 0, |
182 | // State after startup-time init and after device instance close |
183 | STATUS_CLOSED, |
184 | // State after being opened, before device instance init |
185 | STATUS_OPEN, |
186 | // State after device instance initialization |
187 | STATUS_READY, |
188 | // State while actively capturing data |
189 | STATUS_ACTIVE |
190 | } mStatus; |
191 | |
192 | bool mPlugged; |
193 | /** |
194 | * Callbacks back to the framework |
195 | */ |
196 | |
197 | void sendCaptureResult(camera3_capture_result_t *result); |
198 | void sendNotify(camera3_notify_msg_t *msg); |
199 | |
200 | /**************************************************************************** |
201 | * Data members |
202 | ***************************************************************************/ |
203 | private: |
204 | static camera3_device_ops_t sDeviceOps; |
205 | const camera3_callback_ops_t *mCallbackOps; |
206 | }; |
207 | |
208 | }; /* namespace android */ |
209 | |
210 | #endif /* HW_EMULATOR_CAMERA_EMULATED_CAMERA3_H */ |
211 |