blob: 47d7f1c503b87407156e0dca6497af327d1dcdf7
1 | /* |
2 | * Copyright (C) 2014 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 | /* |
18 | * Contains implementation of a class EmulatedFakeCamera3 that encapsulates |
19 | * functionality of an advanced fake camera. |
20 | */ |
21 | |
22 | #define LOG_TAG "EmulatedCamera_FakeCamera3Info" |
23 | #include <camera/CameraMetadata.h> |
24 | #include "EmulatedFakeCamera3.h" |
25 | #include "inc/DebugUtils.h" |
26 | |
27 | namespace android { |
28 | |
29 | //level: legacy:0-4, limited:1-5, full:2-6 |
30 | const struct EmulatedFakeCamera3::KeyInfo_s EmulatedFakeCamera3::sKeyInfo[] = { |
31 | {ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES , LEGACY , BC }, |
32 | {ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES , LEGACY , BC }, |
33 | {ANDROID_CONTROL_AE_AVAILABLE_MODES , LEGACY , BC }, |
34 | {ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES , LEGACY , BC }, |
35 | {ANDROID_CONTROL_AE_COMPENSATION_RANGE , LEGACY , BC }, |
36 | {ANDROID_CONTROL_AE_COMPENSATION_STEP , LEGACY , BC }, |
37 | #if 1 |
38 | {ANDROID_CONTROL_AF_AVAILABLE_MODES , LEGACY , BC }, |
39 | #endif |
40 | {ANDROID_CONTROL_AVAILABLE_EFFECTS , LEGACY , BC }, |
41 | {ANDROID_CONTROL_AVAILABLE_SCENE_MODES , LEGACY , BC }, |
42 | {ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES , LEGACY , BC }, |
43 | {ANDROID_CONTROL_AWB_AVAILABLE_MODES , LEGACY , BC }, |
44 | // {ANDROID_CONTROL_MAX_REGIONS_AE , LEGACY , BC }, |
45 | // {ANDROID_CONTROL_MAX_REGIONS_AF , LEGACY , BC }, |
46 | // {ANDROID_CONTROL_MAX_REGIONS_AWB , LEGACY , BC }, |
47 | {ANDROID_EDGE_AVAILABLE_EDGE_MODES , FULL , NONE }, |
48 | {ANDROID_FLASH_INFO_AVAILABLE , LEGACY , BC }, |
49 | {ANDROID_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES , OPT , RAW }, |
50 | {ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL , LEGACY , BC }, |
51 | {ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES , LEGACY , BC }, |
52 | {ANDROID_LENS_FACING , LEGACY , BC }, |
53 | {ANDROID_LENS_INFO_AVAILABLE_APERTURES , FULL , MANUAL_SENSOR }, |
54 | {ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES , FULL , MANUAL_SENSOR }, |
55 | {ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS , LEGACY , BC }, |
56 | {ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION , LIMITED , MANUAL_SENSOR }, |
57 | {ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION , LIMITED , MANUAL_SENSOR }, |
58 | {ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE , LIMITED , MANUAL_SENSOR }, |
59 | {ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE , LIMITED , NONE }, |
60 | {ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES , LEGACY , BC }, |
61 | {ANDROID_REQUEST_AVAILABLE_CAPABILITIES , LEGACY , BC }, |
62 | // {ANDROID_REQUEST_MAX_NUM_OUTPUT_PROC , LEGACY , BC }, |
63 | // {ANDROID_REQUEST_MAX_NUM_OUTPUT_PROC_STALLING , LEGACY , BC }, |
64 | // {ANDROID_REQUEST_MAX_NUM_OUTPUT_RAW , LEGACY , BC }, |
65 | {ANDROID_REQUEST_PARTIAL_RESULT_COUNT , LEGACY , BC }, |
66 | {ANDROID_REQUEST_PIPELINE_MAX_DEPTH , LEGACY , BC }, |
67 | {ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM , LEGACY , BC }, |
68 | // {ANDROID_SCALER_STREAM_CONFIGURATION_MAP , LEGACY , BC }, |
69 | {ANDROID_SCALER_CROPPING_TYPE , LEGACY , BC }, |
70 | {ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES , LEGACY , NONE }, |
71 | {ANDROID_SENSOR_BLACK_LEVEL_PATTERN , FULL , MANUAL_SENSOR | RAW }, |
72 | {ANDROID_SENSOR_CALIBRATION_TRANSFORM1 , OPT , RAW }, |
73 | {ANDROID_SENSOR_CALIBRATION_TRANSFORM2 , OPT , RAW }, |
74 | {ANDROID_SENSOR_COLOR_TRANSFORM1 , OPT , RAW }, |
75 | {ANDROID_SENSOR_COLOR_TRANSFORM2 , OPT , RAW }, |
76 | {ANDROID_SENSOR_FORWARD_MATRIX1 , OPT , RAW }, |
77 | {ANDROID_SENSOR_FORWARD_MATRIX2 , OPT , RAW }, |
78 | {ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE , LEGACY , BC | RAW }, |
79 | {ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT , FULL , RAW }, |
80 | {ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE , FULL , MANUAL_SENSOR }, |
81 | {ANDROID_SENSOR_INFO_MAX_FRAME_DURATION , FULL , MANUAL_SENSOR }, |
82 | {ANDROID_SENSOR_INFO_PHYSICAL_SIZE , LEGACY , BC }, |
83 | {ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE , LEGACY , BC }, |
84 | {ANDROID_SENSOR_INFO_SENSITIVITY_RANGE , FULL , MANUAL_SENSOR }, |
85 | {ANDROID_SENSOR_INFO_WHITE_LEVEL , OPT , RAW }, |
86 | {ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE , LEGACY , BC }, |
87 | {ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY , FULL , MANUAL_SENSOR }, |
88 | {ANDROID_SENSOR_ORIENTATION , LEGACY , BC }, |
89 | {ANDROID_SENSOR_REFERENCE_ILLUMINANT1 , OPT , RAW }, |
90 | {ANDROID_SENSOR_REFERENCE_ILLUMINANT2 , OPT , RAW }, |
91 | {ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES , LEGACY , BC }, |
92 | {ANDROID_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES , OPT , RAW }, |
93 | {ANDROID_STATISTICS_INFO_MAX_FACE_COUNT , LEGACY , BC }, |
94 | {ANDROID_SYNC_MAX_LATENCY , LEGACY , BC }, |
95 | {ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES , FULL , MANUAL_SENSOR }, |
96 | {ANDROID_TONEMAP_MAX_CURVE_POINTS , FULL , MANUAL_SENSOR }, |
97 | /////////////////////split///////////////////////// |
98 | }; |
99 | |
100 | const struct EmulatedFakeCamera3::KeyInfo_s EmulatedFakeCamera3::sKeyInfoReq[] = { |
101 | // {ANDROID_CONTROL_AE_ANTIBANDING_MODE, LIMITED , BC }, |
102 | // {ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, LIMITED , BC }, |
103 | // {ANDROID_CONTROL_AE_LOCK, LIMITED , BC }, |
104 | {ANDROID_CONTROL_AE_MODE, LIMITED , BC }, |
105 | // {ANDROID_CONTROL_AE_TARGET_FPS_RANGE, LIMITED , BC }, |
106 | {ANDROID_CONTROL_AF_MODE, LIMITED , BC }, |
107 | // {ANDROID_CONTROL_AF_TRIGGER, LIMITED , BC }, |
108 | // {ANDROID_CONTROL_AWB_LOCK, LIMITED , BC }, |
109 | {ANDROID_CONTROL_AWB_MODE, LIMITED , BC }, |
110 | // {ANDROID_CONTROL_CAPTURE_INTENT, LIMITED , BC }, |
111 | // {ANDROID_CONTROL_EFFECT_MODE, LIMITED , BC }, |
112 | {ANDROID_CONTROL_MODE, LIMITED , BC }, |
113 | // {ANDROID_CONTROL_SCENE_MODE, LIMITED , BC }, |
114 | {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, LIMITED , BC }, |
115 | // {ANDROID_FLASH_MODE, LIMITED , BC }, |
116 | // {ANDROID_JPEG_GPS_LOCATION, LIMITED , BC }, |
117 | // {ANDROID_JPEG_ORIENTATION, LIMITED , BC }, |
118 | // {ANDROID_JPEG_QUALITY, LIMITED , BC }, |
119 | // {ANDROID_JPEG_THUMBNAIL_QUALITY, LIMITED , BC }, |
120 | // {ANDROID_JPEG_THUMBNAIL_SIZE, LIMITED , BC }, |
121 | // {ANDROID_SCALER_CROP_REGION, LIMITED , BC }, |
122 | {ANDROID_STATISTICS_FACE_DETECT_MODE, LIMITED , BC }, |
123 | |
124 | // {ANDROID_TONEMAP_MODE, LIMITED , MANUAL_POST_PROCESSING }, |
125 | // {ANDROID_COLOR_CORRECTION_GAINS, LIMITED , MANUAL_POST_PROCESSING }, |
126 | // {ANDROID_COLOR_CORRECTION_TRANSFORM, LIMITED , MANUAL_POST_PROCESSING }, |
127 | // {ANDROID_SHADING_MODE, LIMITED , MANUAL_POST_PROCESSING }, |
128 | // {ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, LIMITED , MANUAL_POST_PROCESSING }, |
129 | // {ANDROID_TONEMAP_CURVE, FULL , MANUAL_POST_PROCESSING }, |
130 | // {ANDROID_COLOR_CORRECTION_ABERRATION_MODE, FULL , MANUAL_POST_PROCESSING }, |
131 | |
132 | // {ANDROID_SENSOR_FRAME_DURATION, LIMITED , MANUAL_SENSOR }, |
133 | // {ANDROID_SENSOR_EXPOSURE_TIME, LIMITED , MANUAL_SENSOR }, |
134 | // {ANDROID_SENSOR_SENSITIVITY, LIMITED , MANUAL_SENSOR }, |
135 | // {ANDROID_LENS_APERTURE, LIMITED , MANUAL_SENSOR }, |
136 | // {ANDROID_LENS_FILTER_DENSITY, LIMITED , MANUAL_SENSOR }, |
137 | {ANDROID_LENS_OPTICAL_STABILIZATION_MODE, LIMITED , MANUAL_SENSOR }, |
138 | // {ANDROID_BLACK_LEVEL_LOCK, LIMITED , MANUAL_SENSOR }, |
139 | {ANDROID_NOISE_REDUCTION_MODE, LEGACY , BC }, |
140 | }; |
141 | const struct EmulatedFakeCamera3::KeyInfo_s EmulatedFakeCamera3::sKeyInfoResult[] = { |
142 | }; |
143 | |
144 | const struct EmulatedFakeCamera3::KeyInfo_s EmulatedFakeCamera3::sKeyBackwardCompat[] = { |
145 | {ANDROID_CONTROL_AE_ANTIBANDING_MODE, 0,}, |
146 | {ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 0,}, |
147 | {ANDROID_CONTROL_AE_LOCK, 0,}, |
148 | {ANDROID_CONTROL_AE_MODE, 0,}, |
149 | {ANDROID_CONTROL_AE_TARGET_FPS_RANGE, 0,}, |
150 | {ANDROID_CONTROL_AF_MODE, 0,}, |
151 | {ANDROID_CONTROL_AF_TRIGGER, 0,}, |
152 | {ANDROID_CONTROL_AWB_LOCK, 0,}, |
153 | {ANDROID_CONTROL_AWB_MODE, 0,}, |
154 | {ANDROID_CONTROL_CAPTURE_INTENT, 0,}, |
155 | {ANDROID_CONTROL_EFFECT_MODE, 0,}, |
156 | {ANDROID_CONTROL_MODE, 0,}, |
157 | {ANDROID_CONTROL_SCENE_MODE, 0,}, |
158 | {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, 0,}, |
159 | {ANDROID_FLASH_MODE, 0,}, |
160 | //{ANDROID_JPEG_GPS_LOCATION, 0}, |
161 | {ANDROID_JPEG_ORIENTATION, 0,}, |
162 | {ANDROID_JPEG_QUALITY, 0,}, |
163 | {ANDROID_JPEG_THUMBNAIL_QUALITY, 0,}, |
164 | {ANDROID_JPEG_THUMBNAIL_SIZE, 0,}, |
165 | {ANDROID_SCALER_CROP_REGION, 0,}, |
166 | {ANDROID_STATISTICS_FACE_DETECT_MODE, 0,}, |
167 | }; |
168 | |
169 | int EmulatedFakeCamera3::getAvailableChKeys(CameraMetadata *info, uint8_t level){ |
170 | //actualHwLevel: legacy:0, limited:1, full:2 |
171 | enum hardware_level_e actualHwLevel; |
172 | uint8_t availCapMask = NONE; |
173 | int size, sizeReq ,sizeofbckComp; |
174 | int availCount = 0; |
175 | camera_metadata_entry e; |
176 | const struct KeyInfo_s *keyInfo = &EmulatedFakeCamera3::sKeyInfo[0]; |
177 | |
178 | size = sizeof(sKeyInfo)/sizeof(struct KeyInfo_s); |
179 | sizeReq = sizeof(sKeyInfoReq)/sizeof(sKeyInfoReq[0]); |
180 | sizeofbckComp = sizeof(sKeyBackwardCompat)/sizeof(sKeyBackwardCompat[0]); |
181 | int32_t available_keys[size+sizeReq+sizeofbckComp]; |
182 | |
183 | e = info->find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); |
184 | if (e.count <= 0) { |
185 | CAMHAL_LOGDA("uncertained capabilities!!!\n"); |
186 | availCapMask = BC; |
187 | } |
188 | for (size_t i=0; i < e.count; i++) { |
189 | availCapMask |= (1 << e.data.u8[i]); |
190 | } |
191 | CAMHAL_LOGDB("availCapMask=%x\n", availCapMask); |
192 | |
193 | switch (level) { |
194 | case ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED: |
195 | actualHwLevel = LIMITED; |
196 | break; |
197 | |
198 | case ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL: |
199 | actualHwLevel = FULL; |
200 | break; |
201 | |
202 | default: |
203 | CAMHAL_LOGDA("!!!!uncertain hardware level\n"); |
204 | case ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY: |
205 | actualHwLevel = LEGACY; |
206 | break; |
207 | } |
208 | |
209 | for(int i = 0; i < size ; i++){ |
210 | |
211 | if (actualHwLevel >= keyInfo->level) { |
212 | available_keys[availCount] = keyInfo->key; |
213 | availCount ++; |
214 | } else if ( availCapMask & keyInfo->capmask) { |
215 | available_keys[availCount] = keyInfo->key; |
216 | availCount ++; |
217 | #if 0 |
218 | } else if ((actualHwLevel != LEGACY) || (keyInfo->level == OPT)) { |
219 | available_keys[availCount] = keyInfo->key; |
220 | availCount ++; |
221 | #endif |
222 | } |
223 | |
224 | keyInfo ++; |
225 | } |
226 | |
227 | info->update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, |
228 | (int32_t *)available_keys, availCount); |
229 | |
230 | CAMHAL_LOGVB("availableKeySize=%d\n", availCount); |
231 | |
232 | keyInfo = &EmulatedFakeCamera3::sKeyInfoReq[0]; |
233 | for (int i = 0; i < sizeReq; i ++) { |
234 | if (actualHwLevel >= keyInfo->level) { |
235 | available_keys[availCount] = keyInfo->key; |
236 | availCount ++; |
237 | } else if ( availCapMask & keyInfo->capmask) { |
238 | available_keys[availCount] = keyInfo->key; |
239 | availCount ++; |
240 | #if 0 |
241 | } else if ((actualHwLevel != LEGACY) || (keyInfo->level == OPT)) { |
242 | available_keys[availCount] = keyInfo->key; |
243 | availCount ++; |
244 | #endif |
245 | } |
246 | keyInfo ++; |
247 | } |
248 | keyInfo = &EmulatedFakeCamera3::sKeyBackwardCompat[0]; |
249 | for (int i = 0; i < sizeofbckComp; i ++){ |
250 | |
251 | if (actualHwLevel >= keyInfo->level) { |
252 | available_keys[availCount] = keyInfo->key; |
253 | availCount ++; |
254 | } else if ( availCapMask & keyInfo->capmask) { |
255 | available_keys[availCount] = keyInfo->key; |
256 | availCount ++; |
257 | #if 0 |
258 | } else if ((actualHwLevel != LEGACY) || (keyInfo->level == OPT)) { |
259 | available_keys[availCount] = keyInfo->key; |
260 | availCount ++; |
261 | #endif |
262 | } |
263 | |
264 | keyInfo ++; |
265 | |
266 | //////////////// |
267 | |
268 | } |
269 | |
270 | info->update(ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS, |
271 | (int32_t *)available_keys, availCount); |
272 | |
273 | info->update(ANDROID_REQUEST_AVAILABLE_RESULT_KEYS, |
274 | (int32_t *)available_keys, availCount); |
275 | CAMHAL_LOGVB("availableKeySize=%d\n", availCount); |
276 | return 0; |
277 | } |
278 | |
279 | } //namespace android |
280 |