blob: 49ba590359682774c4670f079565d3de77c418e8 [file] [log] [blame]
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -07001/*
2**
3** Copyright 2008, The Android Open Source Project
4** Copyright 2012, Samsung Electronics Co. LTD
5**
6** Licensed under the Apache License, Version 2.0 (the "License");
7** you may not use this file except in compliance with the License.
8** You may obtain a copy of the License at
9**
10** http://www.apache.org/licenses/LICENSE-2.0
11**
12** Unless required by applicable law or agreed to in writing, software
13** distributed under the License is distributed on an "AS IS" BASIS,
14** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15** See the License for the specific language governing permissions and
16** limitations under the License.
17*/
18
19/*!
20 * \file ExynosCamera2.cpp
21 * \brief source file for static information of camera2
22 * \author Sungjoong Kang(sj3.kang@samsung.com)
23 * \date 2012/08/06
24 *
25 * <b>Revision History: </b>
26 * - 2012/08/06 : Sungjoong Kang(sj3.kang@samsung.com) \n
27 * Initial Release
28 *
29 */
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070030
31//#define LOG_NDEBUG 0
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -070032#define LOG_TAG "ExynosCamera2"
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070033#include <utils/Log.h>
34
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -070035#include "ExynosCamera2.h"
36
37#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070038
39namespace android {
40
41class Sensor {
42public:
43 /**
44 * Static sensor characteristics
45 */
Sungjoong Kang9dd63e12012-07-24 00:25:51 +090046 static const unsigned int kResolution[2][2];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070047
48 static const nsecs_t kExposureTimeRange[2];
49 static const nsecs_t kFrameDurationRange[2];
50 static const nsecs_t kMinVerticalBlank;
51
52 static const uint8_t kColorFilterArrangement;
53
54 // Output image data characteristics
55 static const uint32_t kMaxRawValue;
56 static const uint32_t kBlackLevel;
57 // Sensor sensitivity, approximate
58
59 static const float kSaturationVoltage;
60 static const uint32_t kSaturationElectrons;
61 static const float kVoltsPerLuxSecond;
62 static const float kElectronsPerLuxSecond;
63
64 static const float kBaseGainFactor;
65
66 static const float kReadNoiseStddevBeforeGain; // In electrons
67 static const float kReadNoiseStddevAfterGain; // In raw digital units
68 static const float kReadNoiseVarBeforeGain;
69 static const float kReadNoiseVarAfterGain;
70
71 // While each row has to read out, reset, and then expose, the (reset +
72 // expose) sequence can be overlapped by other row readouts, so the final
73 // minimum frame duration is purely a function of row readout time, at least
74 // if there's a reasonable number of rows.
75 static const nsecs_t kRowReadoutTime;
76
77 static const uint32_t kAvailableSensitivities[5];
78 static const uint32_t kDefaultSensitivity;
79
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070080};
81
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070082
Sungjoong Kang9dd63e12012-07-24 00:25:51 +090083
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -070084const uint32_t Sensor::kAvailableSensitivities[5] =
85 {100, 200, 400, 800, 1600};
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070086const nsecs_t Sensor::kExposureTimeRange[2] =
87 {1000L, 30000000000L} ; // 1 us - 30 sec
88const nsecs_t Sensor::kFrameDurationRange[2] =
89 {33331760L, 30000000000L}; // ~1/30 s - 30 sec
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070090
91const uint8_t Sensor::kColorFilterArrangement = ANDROID_SENSOR_RGGB;
92
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090093const uint32_t kAvailableFormats[5] = {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070094 HAL_PIXEL_FORMAT_RAW_SENSOR,
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090095 HAL_PIXEL_FORMAT_BLOB,
96 HAL_PIXEL_FORMAT_RGBA_8888,
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070097 HAL_PIXEL_FORMAT_YV12,
98 HAL_PIXEL_FORMAT_YCrCb_420_SP
99};
100
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700101// Output image data characteristics
102const uint32_t Sensor::kMaxRawValue = 4000;
103const uint32_t Sensor::kBlackLevel = 1000;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700104
105const uint64_t kAvailableRawMinDurations[1] = {
106 Sensor::kFrameDurationRange[0]
107};
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900108
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700109const uint64_t kAvailableProcessedMinDurations[1] = {
110 Sensor::kFrameDurationRange[0]
111};
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700112const uint64_t kAvailableJpegMinDurations[1] = {
113 Sensor::kFrameDurationRange[0]
114};
115
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700116const int32_t scalerResolutionS5K4E5[] =
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900117{
hyeonmyeong Choi0b7b7572012-09-06 12:45:44 -0700118 1920, 1080, // 16:9
119 1440, 1080, // 4:3
120 1440, 960, // 3:2
121 1280, 1024, // 5:4
122 1280, 720, // 16:9
123 960, 720, // 4:3
124 800, 480, // 5:3
125 768, 576, // 4:3
126 720, 576, // 5:4
127 720, 480, // 3:2
128 640, 480, // 4:3
129 352, 288, // 11:9
130 320, 240, // 4:3
131 240, 160, // 3:2
132 176, 144, // 6:5
133 128, 96, // 4:3
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700134};
135
136const int32_t jpegResolutionS5K4E5[] =
137{
138 2560, 1920,
Sungjoong Kange4657e32012-08-28 15:02:19 -0700139 2560, 1440,
hyeonmyeong Choia44c3362012-08-30 19:01:25 -0700140 2160, 1440,
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700141 2048, 1536,
142 1600, 1200,
143 1280, 1024,
144 1280, 960,
145 1152, 864,
146 640, 480,
147 320, 240,
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700148};
149
150ExynosCamera2InfoS5K4E5::ExynosCamera2InfoS5K4E5()
151{
152 sensorW = 2560;
153 sensorH = 1920;
154 sensorRawW = (2560 + 16);
155 sensorRawH = (1920 + 10);
156 numScalerResolution = ARRAY_SIZE(scalerResolutionS5K4E5)/2;
157 scalerResolutions = scalerResolutionS5K4E5;
158 numJpegResolution = ARRAY_SIZE(jpegResolutionS5K4E5)/2;
159 jpegResolutions = jpegResolutionS5K4E5;
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700160 minFocusDistance = 0.1f;
161 focalLength = 3.43f;
162 aperture = 2.7f;
Sungjoong Kange00f6592012-09-07 19:05:31 -0700163 fnumber = 2.7f;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700164}
165
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700166ExynosCamera2InfoS5K4E5::~ExynosCamera2InfoS5K4E5()
167{
168 ALOGV("%s", __FUNCTION__);
169}
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700170const int32_t scalerResolutionS5K6A3[] =
171{
hyeonmyeong Choi0b7b7572012-09-06 12:45:44 -0700172 1392, 1392, // 1:1
173 1344, 896, // 3:2
174 1280, 1024, // 5:4
175 1280, 960, // 4:3
176 1280, 720, // 16:9
177 960, 720, // 4:3
178 800, 480, // 5:3
179 768, 576, // 4:3
180 720, 576, // 5:4
181 720, 480, // 3:2
182 640, 480, // 4:3
183 352, 288, // 11:9
184 320, 240, // 4:3
185 240, 160, // 3:2
186 176, 144, // 6:5
187 128, 96, // 4:3
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700188};
189
190const int32_t jpegResolutionS5K6A3[] =
191{
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700192 1392, 1392,
193 1392, 1040,
hyeonmyeong Choia44c3362012-08-30 19:01:25 -0700194 1392, 928,
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700195 1392, 784,
196 1280, 1024,
Sungjoong Kangad378612012-08-17 12:34:33 -0700197 1280, 960,
Sungjoong Kange4657e32012-08-28 15:02:19 -0700198 1280, 720,
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700199 1152, 864,
200 640, 480,
201 320, 240,
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700202};
203
204ExynosCamera2InfoS5K6A3::ExynosCamera2InfoS5K6A3()
205{
206 sensorW = 1392;
207 sensorH = 1392;
208 sensorRawW = (1392 + 16);
209 sensorRawH = (1392 + 10);
210 numScalerResolution = ARRAY_SIZE(scalerResolutionS5K6A3)/2;
211 scalerResolutions = scalerResolutionS5K6A3;
212 numJpegResolution = ARRAY_SIZE(jpegResolutionS5K6A3)/2;
213 jpegResolutions = jpegResolutionS5K6A3;
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700214 minFocusDistance = 0.0f;
215 focalLength = 2.73f;
216 aperture = 2.8f;
Sungjoong Kange00f6592012-09-07 19:05:31 -0700217 fnumber = 2.8f;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700218}
219
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700220ExynosCamera2InfoS5K6A3::~ExynosCamera2InfoS5K6A3()
221{
222 ALOGV("%s", __FUNCTION__);
223}
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700224ExynosCamera2::ExynosCamera2(int cameraId):
225 m_cameraId(cameraId)
226{
227 if (cameraId == 0)
228 m_curCameraInfo = new ExynosCamera2InfoS5K4E5;
229 else
230 m_curCameraInfo = new ExynosCamera2InfoS5K6A3;
231}
232
233ExynosCamera2::~ExynosCamera2()
234{
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700235 ALOGV("%s", __FUNCTION__);
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700236 delete m_curCameraInfo;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700237 m_curCameraInfo = NULL;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700238}
239
240int32_t ExynosCamera2::getSensorW()
241{
242 return m_curCameraInfo->sensorW;
243}
244
245int32_t ExynosCamera2::getSensorH()
246{
247 return m_curCameraInfo->sensorH;
248}
249
250int32_t ExynosCamera2::getSensorRawW()
251{
252 return m_curCameraInfo->sensorRawW;
253}
254
255int32_t ExynosCamera2::getSensorRawH()
256{
257 return m_curCameraInfo->sensorRawH;
258}
259
260bool ExynosCamera2::isSupportedResolution(int width, int height)
261{
262 int i;
263 for (i = 0 ; i < m_curCameraInfo->numScalerResolution ; i++) {
264 if (m_curCameraInfo->scalerResolutions[2*i] == width
265 && m_curCameraInfo->scalerResolutions[2*i+1] == height) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900266 return true;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700267 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900268 }
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700269 return false;
270}
271
272bool ExynosCamera2::isSupportedJpegResolution(int width, int height)
273{
274 int i;
275 for (i = 0 ; i < m_curCameraInfo->numJpegResolution ; i++) {
276 if (m_curCameraInfo->jpegResolutions[2*i] == width
277 && m_curCameraInfo->jpegResolutions[2*i+1] == height) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900278 return true;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700279 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900280 }
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700281 return false;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900282}
283
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700284status_t addOrSize(camera_metadata_t *request,
285 bool sizeRequest,
286 size_t *entryCount,
287 size_t *dataCount,
288 uint32_t tag,
289 const void *entryData,
290 size_t entryDataCount) {
291 status_t res;
292 if (!sizeRequest) {
293 return add_camera_metadata_entry(request, tag, entryData,
294 entryDataCount);
295 } else {
296 int type = get_camera_metadata_tag_type(tag);
297 if (type < 0 ) return BAD_VALUE;
298 (*entryCount)++;
299 (*dataCount) += calculate_camera_metadata_entry_data_size(type,
300 entryDataCount);
301 return OK;
302 }
303}
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700304
305status_t ExynosCamera2::constructStaticInfo(camera_metadata_t **info,
306 int cameraId, bool sizeRequest) {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700307
308 size_t entryCount = 0;
309 size_t dataCount = 0;
310 status_t ret;
311
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700312#define ADD_OR_SIZE( tag, data, count ) \
313 if ( ( ret = addOrSize(*info, sizeRequest, &entryCount, &dataCount, \
314 tag, data, count) ) != OK ) return ret
315
316 // android.lens
317
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700318 ADD_OR_SIZE(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE,
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700319 &(m_curCameraInfo->minFocusDistance), 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700320 ADD_OR_SIZE(ANDROID_LENS_HYPERFOCAL_DISTANCE,
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700321 &(m_curCameraInfo->minFocusDistance), 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700322
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700323 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS,
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700324 &m_curCameraInfo->focalLength, 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700325 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_APERTURES,
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700326 &m_curCameraInfo->aperture, 1);
327
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700328 static const float filterDensity = 0;
329 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FILTER_DENSITY,
330 &filterDensity, 1);
331 static const uint8_t availableOpticalStabilization =
332 ANDROID_LENS_OPTICAL_STABILIZATION_OFF;
333 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_OPTICAL_STABILIZATION,
334 &availableOpticalStabilization, 1);
335
336 static const int32_t lensShadingMapSize[] = {1, 1};
337 ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP_SIZE, lensShadingMapSize,
338 sizeof(lensShadingMapSize)/sizeof(int32_t));
339
340 static const float lensShadingMap[3 * 1 * 1 ] =
341 { 1.f, 1.f, 1.f };
342 ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP, lensShadingMap,
343 sizeof(lensShadingMap)/sizeof(float));
344
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900345 int32_t lensFacing = cameraId ?
346 ANDROID_LENS_FACING_FRONT : ANDROID_LENS_FACING_BACK;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700347 ADD_OR_SIZE(ANDROID_LENS_FACING, &lensFacing, 1);
348
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700349 // android.sensor
350 ADD_OR_SIZE(ANDROID_SENSOR_EXPOSURE_TIME_RANGE,
351 Sensor::kExposureTimeRange, 2);
352
353 ADD_OR_SIZE(ANDROID_SENSOR_MAX_FRAME_DURATION,
354 &Sensor::kFrameDurationRange[1], 1);
355
356 ADD_OR_SIZE(ANDROID_SENSOR_AVAILABLE_SENSITIVITIES,
357 Sensor::kAvailableSensitivities,
358 sizeof(Sensor::kAvailableSensitivities)
359 /sizeof(uint32_t));
360
361 ADD_OR_SIZE(ANDROID_SENSOR_COLOR_FILTER_ARRANGEMENT,
362 &Sensor::kColorFilterArrangement, 1);
363
364 static const float sensorPhysicalSize[2] = {3.20f, 2.40f}; // mm
365 ADD_OR_SIZE(ANDROID_SENSOR_PHYSICAL_SIZE,
366 sensorPhysicalSize, 2);
367
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700368 int32_t pixelArraySize[2] = {
369 m_curCameraInfo->sensorW, m_curCameraInfo->sensorH
370 };
371 ADD_OR_SIZE(ANDROID_SENSOR_PIXEL_ARRAY_SIZE, pixelArraySize, 2);
372 ADD_OR_SIZE(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, pixelArraySize,2);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700373
374 ADD_OR_SIZE(ANDROID_SENSOR_WHITE_LEVEL,
375 &Sensor::kMaxRawValue, 1);
376
377 static const int32_t blackLevelPattern[4] = {
378 Sensor::kBlackLevel, Sensor::kBlackLevel,
379 Sensor::kBlackLevel, Sensor::kBlackLevel
380 };
381 ADD_OR_SIZE(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
382 blackLevelPattern, sizeof(blackLevelPattern)/sizeof(int32_t));
383
384 //TODO: sensor color calibration fields
385
386 // android.flash
Younghwan Joo9a710a42012-09-05 17:52:08 -0700387 uint8_t flashAvailable;
388 if (cameraId == 0)
389 flashAvailable = 1;
390 else
391 flashAvailable = 0;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700392 ADD_OR_SIZE(ANDROID_FLASH_AVAILABLE, &flashAvailable, 1);
393
394 static const int64_t flashChargeDuration = 0;
395 ADD_OR_SIZE(ANDROID_FLASH_CHARGE_DURATION, &flashChargeDuration, 1);
396
397 // android.tonemap
398
399 static const int32_t tonemapCurvePoints = 128;
400 ADD_OR_SIZE(ANDROID_TONEMAP_MAX_CURVE_POINTS, &tonemapCurvePoints, 1);
401
402 // android.scaler
403
404 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_FORMATS,
405 kAvailableFormats,
406 sizeof(kAvailableFormats)/sizeof(uint32_t));
407
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700408 int32_t availableRawSizes[2] = {
409 m_curCameraInfo->sensorRawW, m_curCameraInfo->sensorRawH
410 };
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700411 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700412 availableRawSizes, 2);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700413
414 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
415 kAvailableRawMinDurations,
416 sizeof(kAvailableRawMinDurations)/sizeof(uint64_t));
417
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700418
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700419 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
420 m_curCameraInfo->scalerResolutions,
421 (m_curCameraInfo->numScalerResolution)*2);
422 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
423 m_curCameraInfo->jpegResolutions,
424 (m_curCameraInfo->numJpegResolution)*2);
425
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700426 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
427 kAvailableProcessedMinDurations,
428 sizeof(kAvailableProcessedMinDurations)/sizeof(uint64_t));
429
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700430 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
431 kAvailableJpegMinDurations,
432 sizeof(kAvailableJpegMinDurations)/sizeof(uint64_t));
433
Sungjoong Kange4657e32012-08-28 15:02:19 -0700434 static const float maxZoom = 4;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700435 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, &maxZoom, 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700436
437 // android.jpeg
438
439 static const int32_t jpegThumbnailSizes[] = {
440 160, 120,
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +0900441 160, 160,
442 160, 90,
Sungjoong Kang4017b082012-09-21 15:44:48 -0700443 144, 96,
444 0, 0
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700445 };
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700446
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700447 ADD_OR_SIZE(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
448 jpegThumbnailSizes, sizeof(jpegThumbnailSizes)/sizeof(int32_t));
449
Sungjoong Kang3c006f82012-09-27 16:02:40 -0700450 static const int32_t jpegMaxSize = 10 * 1024 * 1024;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900451 ADD_OR_SIZE(ANDROID_JPEG_MAX_SIZE, &jpegMaxSize, 1);
452
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700453 // android.stats
454
455 static const uint8_t availableFaceDetectModes[] = {
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700456 ANDROID_STATS_FACE_DETECTION_OFF,
457 ANDROID_STATS_FACE_DETECTION_FULL
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700458 };
459 ADD_OR_SIZE(ANDROID_STATS_AVAILABLE_FACE_DETECT_MODES,
460 availableFaceDetectModes,
461 sizeof(availableFaceDetectModes));
462
Younghwan Joof3312f82012-09-20 13:56:59 -0700463 m_curCameraInfo->maxFaceCount = CAMERA2_MAX_FACES;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700464 ADD_OR_SIZE(ANDROID_STATS_MAX_FACE_COUNT,
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700465 &(m_curCameraInfo->maxFaceCount), 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700466
467 static const int32_t histogramSize = 64;
468 ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_BUCKET_COUNT,
469 &histogramSize, 1);
470
471 static const int32_t maxHistogramCount = 1000;
472 ADD_OR_SIZE(ANDROID_STATS_MAX_HISTOGRAM_COUNT,
473 &maxHistogramCount, 1);
474
475 static const int32_t sharpnessMapSize[2] = {64, 64};
476 ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_SIZE,
477 sharpnessMapSize, sizeof(sharpnessMapSize)/sizeof(int32_t));
478
479 static const int32_t maxSharpnessMapValue = 1000;
480 ADD_OR_SIZE(ANDROID_STATS_MAX_SHARPNESS_MAP_VALUE,
481 &maxSharpnessMapValue, 1);
482
483 // android.control
484
485 static const uint8_t availableSceneModes[] = {
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700486 ANDROID_CONTROL_SCENE_MODE_ACTION,
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700487 ANDROID_CONTROL_SCENE_MODE_NIGHT,
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700488 ANDROID_CONTROL_SCENE_MODE_SUNSET,
489 ANDROID_CONTROL_SCENE_MODE_PARTY
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700490 };
491 ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
492 availableSceneModes, sizeof(availableSceneModes));
493
494 static const uint8_t availableEffects[] = {
495 ANDROID_CONTROL_EFFECT_OFF
496 };
497 ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_EFFECTS,
498 availableEffects, sizeof(availableEffects));
499
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -0700500 int32_t max3aRegions = 1;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700501 ADD_OR_SIZE(ANDROID_CONTROL_MAX_REGIONS,
502 &max3aRegions, 1);
503
504 static const uint8_t availableAeModes[] = {
505 ANDROID_CONTROL_AE_OFF,
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700506 ANDROID_CONTROL_AE_ON,
507 ANDROID_CONTROL_AE_ON_AUTO_FLASH
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700508 };
509 ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_MODES,
510 availableAeModes, sizeof(availableAeModes));
511
512 static const camera_metadata_rational exposureCompensationStep = {
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700513 1, 1
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700514 };
515 ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP,
516 &exposureCompensationStep, 1);
517
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700518 int32_t exposureCompensationRange[] = {-3, 3};
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700519 ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE,
520 exposureCompensationRange,
521 sizeof(exposureCompensationRange)/sizeof(int32_t));
522
523 static const int32_t availableTargetFpsRanges[] = {
Sungjoong Kangb8146872012-10-01 13:01:11 -0700524 15, 30, 30, 30
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700525 };
526 ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
527 availableTargetFpsRanges,
528 sizeof(availableTargetFpsRanges)/sizeof(int32_t));
529
530 static const uint8_t availableAntibandingModes[] = {
531 ANDROID_CONTROL_AE_ANTIBANDING_OFF,
532 ANDROID_CONTROL_AE_ANTIBANDING_AUTO
533 };
534 ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
535 availableAntibandingModes, sizeof(availableAntibandingModes));
536
537 static const uint8_t availableAwbModes[] = {
538 ANDROID_CONTROL_AWB_OFF,
539 ANDROID_CONTROL_AWB_AUTO,
540 ANDROID_CONTROL_AWB_INCANDESCENT,
541 ANDROID_CONTROL_AWB_FLUORESCENT,
542 ANDROID_CONTROL_AWB_DAYLIGHT,
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700543 ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700544 };
545 ADD_OR_SIZE(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
546 availableAwbModes, sizeof(availableAwbModes));
547
548 static const uint8_t availableAfModes[] = {
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700549 ANDROID_CONTROL_AF_OFF,
550 ANDROID_CONTROL_AF_AUTO,
551 ANDROID_CONTROL_AF_MACRO,
552 ANDROID_CONTROL_AF_CONTINUOUS_PICTURE,
553 ANDROID_CONTROL_AF_CONTINUOUS_VIDEO
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700554 };
555 ADD_OR_SIZE(ANDROID_CONTROL_AF_AVAILABLE_MODES,
556 availableAfModes, sizeof(availableAfModes));
557
558 static const uint8_t availableVstabModes[] = {
Alex Raya86f87c2012-09-21 01:52:40 -0700559 ANDROID_CONTROL_VIDEO_STABILIZATION_OFF,
560 ANDROID_CONTROL_VIDEO_STABILIZATION_ON
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700561 };
562 ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
563 availableVstabModes, sizeof(availableVstabModes));
564
Sungjoong Kangc68cd002012-10-01 21:50:09 -0700565 static const uint8_t sceneModeOverrides[] = {
566 // ANDROID_CONTROL_SCENE_MODE_ACTION
567 ANDROID_CONTROL_AE_ON,
568 ANDROID_CONTROL_AWB_AUTO,
569 ANDROID_CONTROL_AF_CONTINUOUS_PICTURE,
570 // ANDROID_CONTROL_SCENE_MODE_NIGHT
571 ANDROID_CONTROL_AE_ON,
572 ANDROID_CONTROL_AWB_AUTO,
573 ANDROID_CONTROL_AF_CONTINUOUS_PICTURE,
574 // ANDROID_CONTROL_SCENE_MODE_SUNSET
575 ANDROID_CONTROL_AE_ON,
576 ANDROID_CONTROL_AWB_DAYLIGHT,
577 ANDROID_CONTROL_AF_CONTINUOUS_PICTURE,
578 // ANDROID_CONTROL_SCENE_MODE_PARTY
579 ANDROID_CONTROL_AE_ON_AUTO_FLASH,
580 ANDROID_CONTROL_AWB_AUTO,
581 ANDROID_CONTROL_AF_CONTINUOUS_PICTURE
582 };
583 ADD_OR_SIZE(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
584 sceneModeOverrides, sizeof(sceneModeOverrides));
585
586 static const uint8_t quirkTriggerAuto = 1;
587 ADD_OR_SIZE(ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO,
588 &quirkTriggerAuto, 1);
589
590 static const uint8_t quirkUseZslFormat = 1;
591 ADD_OR_SIZE(ANDROID_QUIRKS_USE_ZSL_FORMAT,
592 &quirkUseZslFormat, 1);
593
Sungjoong Kangc6053422012-10-03 16:10:53 -0700594 static const uint8_t quirkMeteringCropRegion = 1;
595 ADD_OR_SIZE(ANDROID_QUIRKS_METERING_CROP_REGION,
596 &quirkMeteringCropRegion, 1);
597
598
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700599#undef ADD_OR_SIZE
600 /** Allocate metadata if sizing */
601 if (sizeRequest) {
602 ALOGV("Allocating %d entries, %d extra bytes for "
603 "static camera info",
604 entryCount, dataCount);
605 *info = allocate_camera_metadata(entryCount, dataCount);
606 if (*info == NULL) {
607 ALOGE("Unable to allocate camera static info"
608 "(%d entries, %d bytes extra data)",
609 entryCount, dataCount);
610 return NO_MEMORY;
611 }
612 }
613 return OK;
614}
615
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700616status_t ExynosCamera2::constructDefaultRequest(
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700617 int request_template,
618 camera_metadata_t **request,
619 bool sizeRequest) {
620
621 size_t entryCount = 0;
622 size_t dataCount = 0;
623 status_t ret;
624
625#define ADD_OR_SIZE( tag, data, count ) \
626 if ( ( ret = addOrSize(*request, sizeRequest, &entryCount, &dataCount, \
627 tag, data, count) ) != OK ) return ret
628
629 static const int64_t USEC = 1000LL;
630 static const int64_t MSEC = USEC * 1000LL;
631 static const int64_t SEC = MSEC * 1000LL;
632
633 /** android.request */
634
635 static const uint8_t metadataMode = ANDROID_REQUEST_METADATA_NONE;
636 ADD_OR_SIZE(ANDROID_REQUEST_METADATA_MODE, &metadataMode, 1);
637
638 static const int32_t id = 0;
639 ADD_OR_SIZE(ANDROID_REQUEST_ID, &id, 1);
640
641 static const int32_t frameCount = 0;
642 ADD_OR_SIZE(ANDROID_REQUEST_FRAME_COUNT, &frameCount, 1);
643
644 // OUTPUT_STREAMS set by user
645 entryCount += 1;
646 dataCount += 5; // TODO: Should be maximum stream number
647
648 /** android.lens */
649
650 static const float focusDistance = 0;
651 ADD_OR_SIZE(ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1);
652
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700653 ADD_OR_SIZE(ANDROID_LENS_APERTURE, &m_curCameraInfo->aperture, 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700654
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700655 ADD_OR_SIZE(ANDROID_LENS_FOCAL_LENGTH, &m_curCameraInfo->focalLength, 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700656
657 static const float filterDensity = 0;
658 ADD_OR_SIZE(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1);
659
660 static const uint8_t opticalStabilizationMode =
661 ANDROID_LENS_OPTICAL_STABILIZATION_OFF;
662 ADD_OR_SIZE(ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
663 &opticalStabilizationMode, 1);
664
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700665
666 /** android.sensor */
667
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700668
669 static const int64_t frameDuration = 33333333L; // 1/30 s
670 ADD_OR_SIZE(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1);
671
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700672
673 /** android.flash */
674
675 static const uint8_t flashMode = ANDROID_FLASH_OFF;
676 ADD_OR_SIZE(ANDROID_FLASH_MODE, &flashMode, 1);
677
678 static const uint8_t flashPower = 10;
679 ADD_OR_SIZE(ANDROID_FLASH_FIRING_POWER, &flashPower, 1);
680
681 static const int64_t firingTime = 0;
682 ADD_OR_SIZE(ANDROID_FLASH_FIRING_TIME, &firingTime, 1);
683
684 /** Processing block modes */
685 uint8_t hotPixelMode = 0;
686 uint8_t demosaicMode = 0;
687 uint8_t noiseMode = 0;
688 uint8_t shadingMode = 0;
689 uint8_t geometricMode = 0;
690 uint8_t colorMode = 0;
691 uint8_t tonemapMode = 0;
692 uint8_t edgeMode = 0;
Sungjoong Kangfac627c2012-09-18 23:44:00 -0700693 uint8_t vstabMode = 0;
694
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700695 switch (request_template) {
696 case CAMERA2_TEMPLATE_PREVIEW:
697 hotPixelMode = ANDROID_PROCESSING_FAST;
698 demosaicMode = ANDROID_PROCESSING_FAST;
699 noiseMode = ANDROID_PROCESSING_FAST;
700 shadingMode = ANDROID_PROCESSING_FAST;
701 geometricMode = ANDROID_PROCESSING_FAST;
702 colorMode = ANDROID_PROCESSING_FAST;
703 tonemapMode = ANDROID_PROCESSING_FAST;
704 edgeMode = ANDROID_PROCESSING_FAST;
Sungjoong Kangfac627c2012-09-18 23:44:00 -0700705 vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700706 break;
707 case CAMERA2_TEMPLATE_STILL_CAPTURE:
708 hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
709 demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
710 noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
711 shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
712 geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
713 colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
714 tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
715 edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
Sungjoong Kangfac627c2012-09-18 23:44:00 -0700716 vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700717 break;
718 case CAMERA2_TEMPLATE_VIDEO_RECORD:
719 hotPixelMode = ANDROID_PROCESSING_FAST;
720 demosaicMode = ANDROID_PROCESSING_FAST;
721 noiseMode = ANDROID_PROCESSING_FAST;
722 shadingMode = ANDROID_PROCESSING_FAST;
723 geometricMode = ANDROID_PROCESSING_FAST;
724 colorMode = ANDROID_PROCESSING_FAST;
725 tonemapMode = ANDROID_PROCESSING_FAST;
726 edgeMode = ANDROID_PROCESSING_FAST;
Sungjoong Kangfac627c2012-09-18 23:44:00 -0700727 vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_ON;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700728 break;
729 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
730 hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
731 demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
732 noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
733 shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
734 geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
735 colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
736 tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
737 edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
Sungjoong Kangfac627c2012-09-18 23:44:00 -0700738 vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_ON;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700739 break;
740 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
741 hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
742 demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
743 noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
744 shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
745 geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
746 colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
747 tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
748 edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
Sungjoong Kangfac627c2012-09-18 23:44:00 -0700749 vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700750 break;
751 default:
752 hotPixelMode = ANDROID_PROCESSING_FAST;
753 demosaicMode = ANDROID_PROCESSING_FAST;
754 noiseMode = ANDROID_PROCESSING_FAST;
755 shadingMode = ANDROID_PROCESSING_FAST;
756 geometricMode = ANDROID_PROCESSING_FAST;
757 colorMode = ANDROID_PROCESSING_FAST;
758 tonemapMode = ANDROID_PROCESSING_FAST;
759 edgeMode = ANDROID_PROCESSING_FAST;
Sungjoong Kangfac627c2012-09-18 23:44:00 -0700760 vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700761 break;
762 }
763 ADD_OR_SIZE(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1);
764 ADD_OR_SIZE(ANDROID_DEMOSAIC_MODE, &demosaicMode, 1);
765 ADD_OR_SIZE(ANDROID_NOISE_MODE, &noiseMode, 1);
766 ADD_OR_SIZE(ANDROID_SHADING_MODE, &shadingMode, 1);
767 ADD_OR_SIZE(ANDROID_GEOMETRIC_MODE, &geometricMode, 1);
768 ADD_OR_SIZE(ANDROID_COLOR_MODE, &colorMode, 1);
769 ADD_OR_SIZE(ANDROID_TONEMAP_MODE, &tonemapMode, 1);
770 ADD_OR_SIZE(ANDROID_EDGE_MODE, &edgeMode, 1);
Sungjoong Kangfac627c2012-09-18 23:44:00 -0700771 ADD_OR_SIZE(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vstabMode, 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700772
773 /** android.noise */
774 static const uint8_t noiseStrength = 5;
775 ADD_OR_SIZE(ANDROID_NOISE_STRENGTH, &noiseStrength, 1);
776
777 /** android.color */
778 static const float colorTransform[9] = {
779 1.0f, 0.f, 0.f,
780 0.f, 1.f, 0.f,
781 0.f, 0.f, 1.f
782 };
783 ADD_OR_SIZE(ANDROID_COLOR_TRANSFORM, colorTransform, 9);
784
785 /** android.tonemap */
786 static const float tonemapCurve[4] = {
787 0.f, 0.f,
788 1.f, 1.f
789 };
790 ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_RED, tonemapCurve, 32); // sungjoong
791 ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_GREEN, tonemapCurve, 32);
792 ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_BLUE, tonemapCurve, 32);
793
794 /** android.edge */
795 static const uint8_t edgeStrength = 5;
796 ADD_OR_SIZE(ANDROID_EDGE_STRENGTH, &edgeStrength, 1);
797
798 /** android.scaler */
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700799 int32_t cropRegion[3] = {
800 0, 0, m_curCameraInfo->sensorW
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700801 };
802 ADD_OR_SIZE(ANDROID_SCALER_CROP_REGION, cropRegion, 3);
803
804 /** android.jpeg */
805 static const int32_t jpegQuality = 80;
806 ADD_OR_SIZE(ANDROID_JPEG_QUALITY, &jpegQuality, 1);
807
808 static const int32_t thumbnailSize[2] = {
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +0900809 160, 120
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700810 };
811 ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSize, 2);
812
813 static const int32_t thumbnailQuality = 80;
814 ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnailQuality, 1);
815
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700816 static const double gpsCoordinates[3] = {
817 0, 0, 0
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700818 };
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700819 ADD_OR_SIZE(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 3);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700820
821 static const uint8_t gpsProcessingMethod[32] = "None";
822 ADD_OR_SIZE(ANDROID_JPEG_GPS_PROCESSING_METHOD, gpsProcessingMethod, 32);
823
824 static const int64_t gpsTimestamp = 0;
825 ADD_OR_SIZE(ANDROID_JPEG_GPS_TIMESTAMP, &gpsTimestamp, 1);
826
827 static const int32_t jpegOrientation = 0;
828 ADD_OR_SIZE(ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1);
829
830 /** android.stats */
831
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700832 static const uint8_t faceDetectMode = ANDROID_STATS_FACE_DETECTION_FULL;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700833 ADD_OR_SIZE(ANDROID_STATS_FACE_DETECT_MODE, &faceDetectMode, 1);
834
835 static const uint8_t histogramMode = ANDROID_STATS_OFF;
836 ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_MODE, &histogramMode, 1);
837
838 static const uint8_t sharpnessMapMode = ANDROID_STATS_OFF;
839 ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1);
840
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700841
842 /** android.control */
843
844 uint8_t controlIntent = 0;
845 switch (request_template) {
846 case CAMERA2_TEMPLATE_PREVIEW:
847 controlIntent = ANDROID_CONTROL_INTENT_PREVIEW;
848 break;
849 case CAMERA2_TEMPLATE_STILL_CAPTURE:
850 controlIntent = ANDROID_CONTROL_INTENT_STILL_CAPTURE;
851 break;
852 case CAMERA2_TEMPLATE_VIDEO_RECORD:
853 controlIntent = ANDROID_CONTROL_INTENT_VIDEO_RECORD;
854 break;
855 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
856 controlIntent = ANDROID_CONTROL_INTENT_VIDEO_SNAPSHOT;
857 break;
858 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
859 controlIntent = ANDROID_CONTROL_INTENT_ZERO_SHUTTER_LAG;
860 break;
861 default:
862 controlIntent = ANDROID_CONTROL_INTENT_CUSTOM;
863 break;
864 }
865 ADD_OR_SIZE(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
866
867 static const uint8_t controlMode = ANDROID_CONTROL_AUTO;
868 ADD_OR_SIZE(ANDROID_CONTROL_MODE, &controlMode, 1);
869
870 static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_OFF;
871 ADD_OR_SIZE(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
872
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700873 static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700874 ADD_OR_SIZE(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
875
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700876 static const uint8_t aeMode = ANDROID_CONTROL_AE_ON;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700877 ADD_OR_SIZE(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
878
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700879 int32_t controlRegions[5] = {
880 0, 0, m_curCameraInfo->sensorW, m_curCameraInfo->sensorH, 1000
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700881 };
882 ADD_OR_SIZE(ANDROID_CONTROL_AE_REGIONS, controlRegions, 5);
883
884 static const int32_t aeExpCompensation = 0;
885 ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION, &aeExpCompensation, 1);
886
887 static const int32_t aeTargetFpsRange[2] = {
Sungjoong Kangb8146872012-10-01 13:01:11 -0700888 15, 30
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700889 };
890 ADD_OR_SIZE(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange, 2);
891
892 static const uint8_t aeAntibandingMode =
893 ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
894 ADD_OR_SIZE(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &aeAntibandingMode, 1);
895
896 static const uint8_t awbMode =
897 ANDROID_CONTROL_AWB_AUTO;
898 ADD_OR_SIZE(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
899
900 ADD_OR_SIZE(ANDROID_CONTROL_AWB_REGIONS, controlRegions, 5);
901
902 uint8_t afMode = 0;
903 switch (request_template) {
904 case CAMERA2_TEMPLATE_PREVIEW:
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700905 afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700906 break;
907 case CAMERA2_TEMPLATE_STILL_CAPTURE:
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700908 afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700909 break;
910 case CAMERA2_TEMPLATE_VIDEO_RECORD:
911 afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO;
912 break;
913 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
914 afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO;
915 break;
916 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
917 afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE;
918 break;
919 default:
920 afMode = ANDROID_CONTROL_AF_AUTO;
921 break;
922 }
923 ADD_OR_SIZE(ANDROID_CONTROL_AF_MODE, &afMode, 1);
924
925 ADD_OR_SIZE(ANDROID_CONTROL_AF_REGIONS, controlRegions, 5);
926
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700927 if (sizeRequest) {
928 ALOGV("Allocating %d entries, %d extra bytes for "
929 "request template type %d",
930 entryCount, dataCount, request_template);
931 *request = allocate_camera_metadata(entryCount, dataCount);
932 if (*request == NULL) {
933 ALOGE("Unable to allocate new request template type %d "
934 "(%d entries, %d bytes extra data)", request_template,
935 entryCount, dataCount);
936 return NO_MEMORY;
937 }
938 }
939 return OK;
940#undef ADD_OR_SIZE
941}
942
943}