blob: 87f3cd0f57bd46d805db5d02c81a508ff30f7758 [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 Kangdaa1fcd2012-08-08 11:49:43 -0700163}
164
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700165ExynosCamera2InfoS5K4E5::~ExynosCamera2InfoS5K4E5()
166{
167 ALOGV("%s", __FUNCTION__);
168}
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700169const int32_t scalerResolutionS5K6A3[] =
170{
hyeonmyeong Choi0b7b7572012-09-06 12:45:44 -0700171 1392, 1392, // 1:1
172 1344, 896, // 3:2
173 1280, 1024, // 5:4
174 1280, 960, // 4:3
175 1280, 720, // 16:9
176 960, 720, // 4:3
177 800, 480, // 5:3
178 768, 576, // 4:3
179 720, 576, // 5:4
180 720, 480, // 3:2
181 640, 480, // 4:3
182 352, 288, // 11:9
183 320, 240, // 4:3
184 240, 160, // 3:2
185 176, 144, // 6:5
186 128, 96, // 4:3
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700187};
188
189const int32_t jpegResolutionS5K6A3[] =
190{
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700191 1392, 1392,
192 1392, 1040,
hyeonmyeong Choia44c3362012-08-30 19:01:25 -0700193 1392, 928,
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700194 1392, 784,
195 1280, 1024,
Sungjoong Kangad378612012-08-17 12:34:33 -0700196 1280, 960,
Sungjoong Kange4657e32012-08-28 15:02:19 -0700197 1280, 720,
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700198 1152, 864,
199 640, 480,
200 320, 240,
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700201};
202
203ExynosCamera2InfoS5K6A3::ExynosCamera2InfoS5K6A3()
204{
205 sensorW = 1392;
206 sensorH = 1392;
207 sensorRawW = (1392 + 16);
208 sensorRawH = (1392 + 10);
209 numScalerResolution = ARRAY_SIZE(scalerResolutionS5K6A3)/2;
210 scalerResolutions = scalerResolutionS5K6A3;
211 numJpegResolution = ARRAY_SIZE(jpegResolutionS5K6A3)/2;
212 jpegResolutions = jpegResolutionS5K6A3;
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700213 minFocusDistance = 0.0f;
214 focalLength = 2.73f;
215 aperture = 2.8f;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700216}
217
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700218ExynosCamera2InfoS5K6A3::~ExynosCamera2InfoS5K6A3()
219{
220 ALOGV("%s", __FUNCTION__);
221}
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700222ExynosCamera2::ExynosCamera2(int cameraId):
223 m_cameraId(cameraId)
224{
225 if (cameraId == 0)
226 m_curCameraInfo = new ExynosCamera2InfoS5K4E5;
227 else
228 m_curCameraInfo = new ExynosCamera2InfoS5K6A3;
229}
230
231ExynosCamera2::~ExynosCamera2()
232{
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700233 ALOGV("%s", __FUNCTION__);
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700234 delete m_curCameraInfo;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700235 m_curCameraInfo = NULL;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700236}
237
238int32_t ExynosCamera2::getSensorW()
239{
240 return m_curCameraInfo->sensorW;
241}
242
243int32_t ExynosCamera2::getSensorH()
244{
245 return m_curCameraInfo->sensorH;
246}
247
248int32_t ExynosCamera2::getSensorRawW()
249{
250 return m_curCameraInfo->sensorRawW;
251}
252
253int32_t ExynosCamera2::getSensorRawH()
254{
255 return m_curCameraInfo->sensorRawH;
256}
257
258bool ExynosCamera2::isSupportedResolution(int width, int height)
259{
260 int i;
261 for (i = 0 ; i < m_curCameraInfo->numScalerResolution ; i++) {
262 if (m_curCameraInfo->scalerResolutions[2*i] == width
263 && m_curCameraInfo->scalerResolutions[2*i+1] == height) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900264 return true;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700265 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900266 }
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700267 return false;
268}
269
270bool ExynosCamera2::isSupportedJpegResolution(int width, int height)
271{
272 int i;
273 for (i = 0 ; i < m_curCameraInfo->numJpegResolution ; i++) {
274 if (m_curCameraInfo->jpegResolutions[2*i] == width
275 && m_curCameraInfo->jpegResolutions[2*i+1] == height) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900276 return true;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700277 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900278 }
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700279 return false;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900280}
281
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700282status_t addOrSize(camera_metadata_t *request,
283 bool sizeRequest,
284 size_t *entryCount,
285 size_t *dataCount,
286 uint32_t tag,
287 const void *entryData,
288 size_t entryDataCount) {
289 status_t res;
290 if (!sizeRequest) {
291 return add_camera_metadata_entry(request, tag, entryData,
292 entryDataCount);
293 } else {
294 int type = get_camera_metadata_tag_type(tag);
295 if (type < 0 ) return BAD_VALUE;
296 (*entryCount)++;
297 (*dataCount) += calculate_camera_metadata_entry_data_size(type,
298 entryDataCount);
299 return OK;
300 }
301}
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700302
303status_t ExynosCamera2::constructStaticInfo(camera_metadata_t **info,
304 int cameraId, bool sizeRequest) {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700305
306 size_t entryCount = 0;
307 size_t dataCount = 0;
308 status_t ret;
309
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700310#define ADD_OR_SIZE( tag, data, count ) \
311 if ( ( ret = addOrSize(*info, sizeRequest, &entryCount, &dataCount, \
312 tag, data, count) ) != OK ) return ret
313
314 // android.lens
315
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700316 ADD_OR_SIZE(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE,
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700317 &(m_curCameraInfo->minFocusDistance), 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700318 ADD_OR_SIZE(ANDROID_LENS_HYPERFOCAL_DISTANCE,
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700319 &(m_curCameraInfo->minFocusDistance), 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700320
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700321 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS,
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700322 &m_curCameraInfo->focalLength, 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700323 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_APERTURES,
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700324 &m_curCameraInfo->aperture, 1);
325
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700326 static const float filterDensity = 0;
327 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FILTER_DENSITY,
328 &filterDensity, 1);
329 static const uint8_t availableOpticalStabilization =
330 ANDROID_LENS_OPTICAL_STABILIZATION_OFF;
331 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_OPTICAL_STABILIZATION,
332 &availableOpticalStabilization, 1);
333
334 static const int32_t lensShadingMapSize[] = {1, 1};
335 ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP_SIZE, lensShadingMapSize,
336 sizeof(lensShadingMapSize)/sizeof(int32_t));
337
338 static const float lensShadingMap[3 * 1 * 1 ] =
339 { 1.f, 1.f, 1.f };
340 ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP, lensShadingMap,
341 sizeof(lensShadingMap)/sizeof(float));
342
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900343 int32_t lensFacing = cameraId ?
344 ANDROID_LENS_FACING_FRONT : ANDROID_LENS_FACING_BACK;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700345 ADD_OR_SIZE(ANDROID_LENS_FACING, &lensFacing, 1);
346
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700347 // android.sensor
348 ADD_OR_SIZE(ANDROID_SENSOR_EXPOSURE_TIME_RANGE,
349 Sensor::kExposureTimeRange, 2);
350
351 ADD_OR_SIZE(ANDROID_SENSOR_MAX_FRAME_DURATION,
352 &Sensor::kFrameDurationRange[1], 1);
353
354 ADD_OR_SIZE(ANDROID_SENSOR_AVAILABLE_SENSITIVITIES,
355 Sensor::kAvailableSensitivities,
356 sizeof(Sensor::kAvailableSensitivities)
357 /sizeof(uint32_t));
358
359 ADD_OR_SIZE(ANDROID_SENSOR_COLOR_FILTER_ARRANGEMENT,
360 &Sensor::kColorFilterArrangement, 1);
361
362 static const float sensorPhysicalSize[2] = {3.20f, 2.40f}; // mm
363 ADD_OR_SIZE(ANDROID_SENSOR_PHYSICAL_SIZE,
364 sensorPhysicalSize, 2);
365
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700366 int32_t pixelArraySize[2] = {
367 m_curCameraInfo->sensorW, m_curCameraInfo->sensorH
368 };
369 ADD_OR_SIZE(ANDROID_SENSOR_PIXEL_ARRAY_SIZE, pixelArraySize, 2);
370 ADD_OR_SIZE(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, pixelArraySize,2);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700371
372 ADD_OR_SIZE(ANDROID_SENSOR_WHITE_LEVEL,
373 &Sensor::kMaxRawValue, 1);
374
375 static const int32_t blackLevelPattern[4] = {
376 Sensor::kBlackLevel, Sensor::kBlackLevel,
377 Sensor::kBlackLevel, Sensor::kBlackLevel
378 };
379 ADD_OR_SIZE(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
380 blackLevelPattern, sizeof(blackLevelPattern)/sizeof(int32_t));
381
382 //TODO: sensor color calibration fields
383
384 // android.flash
Younghwan Joo9a710a42012-09-05 17:52:08 -0700385 uint8_t flashAvailable;
386 if (cameraId == 0)
387 flashAvailable = 1;
388 else
389 flashAvailable = 0;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700390 ADD_OR_SIZE(ANDROID_FLASH_AVAILABLE, &flashAvailable, 1);
391
392 static const int64_t flashChargeDuration = 0;
393 ADD_OR_SIZE(ANDROID_FLASH_CHARGE_DURATION, &flashChargeDuration, 1);
394
395 // android.tonemap
396
397 static const int32_t tonemapCurvePoints = 128;
398 ADD_OR_SIZE(ANDROID_TONEMAP_MAX_CURVE_POINTS, &tonemapCurvePoints, 1);
399
400 // android.scaler
401
402 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_FORMATS,
403 kAvailableFormats,
404 sizeof(kAvailableFormats)/sizeof(uint32_t));
405
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700406 int32_t availableRawSizes[2] = {
407 m_curCameraInfo->sensorRawW, m_curCameraInfo->sensorRawH
408 };
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700409 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700410 availableRawSizes, 2);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700411
412 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
413 kAvailableRawMinDurations,
414 sizeof(kAvailableRawMinDurations)/sizeof(uint64_t));
415
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700416
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700417 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
418 m_curCameraInfo->scalerResolutions,
419 (m_curCameraInfo->numScalerResolution)*2);
420 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
421 m_curCameraInfo->jpegResolutions,
422 (m_curCameraInfo->numJpegResolution)*2);
423
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700424 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
425 kAvailableProcessedMinDurations,
426 sizeof(kAvailableProcessedMinDurations)/sizeof(uint64_t));
427
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700428 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
429 kAvailableJpegMinDurations,
430 sizeof(kAvailableJpegMinDurations)/sizeof(uint64_t));
431
Sungjoong Kange4657e32012-08-28 15:02:19 -0700432 static const float maxZoom = 4;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700433 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, &maxZoom, 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700434
435 // android.jpeg
436
437 static const int32_t jpegThumbnailSizes[] = {
438 160, 120,
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +0900439 160, 160,
440 160, 90,
441 144, 96
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700442 };
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700443
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700444 ADD_OR_SIZE(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
445 jpegThumbnailSizes, sizeof(jpegThumbnailSizes)/sizeof(int32_t));
446
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900447 static const int32_t jpegMaxSize = 5*1024*1024;
448 ADD_OR_SIZE(ANDROID_JPEG_MAX_SIZE, &jpegMaxSize, 1);
449
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700450 // android.stats
451
452 static const uint8_t availableFaceDetectModes[] = {
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700453 ANDROID_STATS_FACE_DETECTION_OFF,
454 ANDROID_STATS_FACE_DETECTION_FULL
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700455 };
456 ADD_OR_SIZE(ANDROID_STATS_AVAILABLE_FACE_DETECT_MODES,
457 availableFaceDetectModes,
458 sizeof(availableFaceDetectModes));
459
Sungjoong Kangb55ed662012-08-31 21:31:34 -0700460 m_curCameraInfo->maxFaceCount = 3;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700461 ADD_OR_SIZE(ANDROID_STATS_MAX_FACE_COUNT,
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700462 &(m_curCameraInfo->maxFaceCount), 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700463
464 static const int32_t histogramSize = 64;
465 ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_BUCKET_COUNT,
466 &histogramSize, 1);
467
468 static const int32_t maxHistogramCount = 1000;
469 ADD_OR_SIZE(ANDROID_STATS_MAX_HISTOGRAM_COUNT,
470 &maxHistogramCount, 1);
471
472 static const int32_t sharpnessMapSize[2] = {64, 64};
473 ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_SIZE,
474 sharpnessMapSize, sizeof(sharpnessMapSize)/sizeof(int32_t));
475
476 static const int32_t maxSharpnessMapValue = 1000;
477 ADD_OR_SIZE(ANDROID_STATS_MAX_SHARPNESS_MAP_VALUE,
478 &maxSharpnessMapValue, 1);
479
480 // android.control
481
482 static const uint8_t availableSceneModes[] = {
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700483 ANDROID_CONTROL_SCENE_MODE_ACTION,
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700484 ANDROID_CONTROL_SCENE_MODE_NIGHT,
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700485 ANDROID_CONTROL_SCENE_MODE_SUNSET,
486 ANDROID_CONTROL_SCENE_MODE_PARTY
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700487 };
488 ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
489 availableSceneModes, sizeof(availableSceneModes));
490
491 static const uint8_t availableEffects[] = {
492 ANDROID_CONTROL_EFFECT_OFF
493 };
494 ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_EFFECTS,
495 availableEffects, sizeof(availableEffects));
496
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -0700497 int32_t max3aRegions = 1;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700498 ADD_OR_SIZE(ANDROID_CONTROL_MAX_REGIONS,
499 &max3aRegions, 1);
500
501 static const uint8_t availableAeModes[] = {
502 ANDROID_CONTROL_AE_OFF,
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700503 ANDROID_CONTROL_AE_ON,
504 ANDROID_CONTROL_AE_ON_AUTO_FLASH
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700505 };
506 ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_MODES,
507 availableAeModes, sizeof(availableAeModes));
508
509 static const camera_metadata_rational exposureCompensationStep = {
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700510 1, 1
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700511 };
512 ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP,
513 &exposureCompensationStep, 1);
514
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700515 int32_t exposureCompensationRange[] = {-3, 3};
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700516 ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE,
517 exposureCompensationRange,
518 sizeof(exposureCompensationRange)/sizeof(int32_t));
519
520 static const int32_t availableTargetFpsRanges[] = {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900521 5, 30, 30, 30
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700522 };
523 ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
524 availableTargetFpsRanges,
525 sizeof(availableTargetFpsRanges)/sizeof(int32_t));
526
527 static const uint8_t availableAntibandingModes[] = {
528 ANDROID_CONTROL_AE_ANTIBANDING_OFF,
529 ANDROID_CONTROL_AE_ANTIBANDING_AUTO
530 };
531 ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
532 availableAntibandingModes, sizeof(availableAntibandingModes));
533
534 static const uint8_t availableAwbModes[] = {
535 ANDROID_CONTROL_AWB_OFF,
536 ANDROID_CONTROL_AWB_AUTO,
537 ANDROID_CONTROL_AWB_INCANDESCENT,
538 ANDROID_CONTROL_AWB_FLUORESCENT,
539 ANDROID_CONTROL_AWB_DAYLIGHT,
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700540 ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700541 };
542 ADD_OR_SIZE(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
543 availableAwbModes, sizeof(availableAwbModes));
544
545 static const uint8_t availableAfModes[] = {
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700546 ANDROID_CONTROL_AF_OFF,
547 ANDROID_CONTROL_AF_AUTO,
548 ANDROID_CONTROL_AF_MACRO,
549 ANDROID_CONTROL_AF_CONTINUOUS_PICTURE,
550 ANDROID_CONTROL_AF_CONTINUOUS_VIDEO
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700551 };
552 ADD_OR_SIZE(ANDROID_CONTROL_AF_AVAILABLE_MODES,
553 availableAfModes, sizeof(availableAfModes));
554
555 static const uint8_t availableVstabModes[] = {
556 ANDROID_CONTROL_VIDEO_STABILIZATION_OFF
557 };
558 ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
559 availableVstabModes, sizeof(availableVstabModes));
560
561#undef ADD_OR_SIZE
562 /** Allocate metadata if sizing */
563 if (sizeRequest) {
564 ALOGV("Allocating %d entries, %d extra bytes for "
565 "static camera info",
566 entryCount, dataCount);
567 *info = allocate_camera_metadata(entryCount, dataCount);
568 if (*info == NULL) {
569 ALOGE("Unable to allocate camera static info"
570 "(%d entries, %d bytes extra data)",
571 entryCount, dataCount);
572 return NO_MEMORY;
573 }
574 }
575 return OK;
576}
577
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700578status_t ExynosCamera2::constructDefaultRequest(
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700579 int request_template,
580 camera_metadata_t **request,
581 bool sizeRequest) {
582
583 size_t entryCount = 0;
584 size_t dataCount = 0;
585 status_t ret;
586
587#define ADD_OR_SIZE( tag, data, count ) \
588 if ( ( ret = addOrSize(*request, sizeRequest, &entryCount, &dataCount, \
589 tag, data, count) ) != OK ) return ret
590
591 static const int64_t USEC = 1000LL;
592 static const int64_t MSEC = USEC * 1000LL;
593 static const int64_t SEC = MSEC * 1000LL;
594
595 /** android.request */
596
597 static const uint8_t metadataMode = ANDROID_REQUEST_METADATA_NONE;
598 ADD_OR_SIZE(ANDROID_REQUEST_METADATA_MODE, &metadataMode, 1);
599
600 static const int32_t id = 0;
601 ADD_OR_SIZE(ANDROID_REQUEST_ID, &id, 1);
602
603 static const int32_t frameCount = 0;
604 ADD_OR_SIZE(ANDROID_REQUEST_FRAME_COUNT, &frameCount, 1);
605
606 // OUTPUT_STREAMS set by user
607 entryCount += 1;
608 dataCount += 5; // TODO: Should be maximum stream number
609
610 /** android.lens */
611
612 static const float focusDistance = 0;
613 ADD_OR_SIZE(ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1);
614
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700615 ADD_OR_SIZE(ANDROID_LENS_APERTURE, &m_curCameraInfo->aperture, 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700616
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700617 ADD_OR_SIZE(ANDROID_LENS_FOCAL_LENGTH, &m_curCameraInfo->focalLength, 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700618
619 static const float filterDensity = 0;
620 ADD_OR_SIZE(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1);
621
622 static const uint8_t opticalStabilizationMode =
623 ANDROID_LENS_OPTICAL_STABILIZATION_OFF;
624 ADD_OR_SIZE(ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
625 &opticalStabilizationMode, 1);
626
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700627
628 /** android.sensor */
629
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700630
631 static const int64_t frameDuration = 33333333L; // 1/30 s
632 ADD_OR_SIZE(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1);
633
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700634
635 /** android.flash */
636
637 static const uint8_t flashMode = ANDROID_FLASH_OFF;
638 ADD_OR_SIZE(ANDROID_FLASH_MODE, &flashMode, 1);
639
640 static const uint8_t flashPower = 10;
641 ADD_OR_SIZE(ANDROID_FLASH_FIRING_POWER, &flashPower, 1);
642
643 static const int64_t firingTime = 0;
644 ADD_OR_SIZE(ANDROID_FLASH_FIRING_TIME, &firingTime, 1);
645
646 /** Processing block modes */
647 uint8_t hotPixelMode = 0;
648 uint8_t demosaicMode = 0;
649 uint8_t noiseMode = 0;
650 uint8_t shadingMode = 0;
651 uint8_t geometricMode = 0;
652 uint8_t colorMode = 0;
653 uint8_t tonemapMode = 0;
654 uint8_t edgeMode = 0;
655 switch (request_template) {
656 case CAMERA2_TEMPLATE_PREVIEW:
657 hotPixelMode = ANDROID_PROCESSING_FAST;
658 demosaicMode = ANDROID_PROCESSING_FAST;
659 noiseMode = ANDROID_PROCESSING_FAST;
660 shadingMode = ANDROID_PROCESSING_FAST;
661 geometricMode = ANDROID_PROCESSING_FAST;
662 colorMode = ANDROID_PROCESSING_FAST;
663 tonemapMode = ANDROID_PROCESSING_FAST;
664 edgeMode = ANDROID_PROCESSING_FAST;
665 break;
666 case CAMERA2_TEMPLATE_STILL_CAPTURE:
667 hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
668 demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
669 noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
670 shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
671 geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
672 colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
673 tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
674 edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
675 break;
676 case CAMERA2_TEMPLATE_VIDEO_RECORD:
677 hotPixelMode = ANDROID_PROCESSING_FAST;
678 demosaicMode = ANDROID_PROCESSING_FAST;
679 noiseMode = ANDROID_PROCESSING_FAST;
680 shadingMode = ANDROID_PROCESSING_FAST;
681 geometricMode = ANDROID_PROCESSING_FAST;
682 colorMode = ANDROID_PROCESSING_FAST;
683 tonemapMode = ANDROID_PROCESSING_FAST;
684 edgeMode = ANDROID_PROCESSING_FAST;
685 break;
686 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
687 hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
688 demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
689 noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
690 shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
691 geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
692 colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
693 tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
694 edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
695 break;
696 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
697 hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
698 demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
699 noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
700 shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
701 geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
702 colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
703 tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
704 edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
705 break;
706 default:
707 hotPixelMode = ANDROID_PROCESSING_FAST;
708 demosaicMode = ANDROID_PROCESSING_FAST;
709 noiseMode = ANDROID_PROCESSING_FAST;
710 shadingMode = ANDROID_PROCESSING_FAST;
711 geometricMode = ANDROID_PROCESSING_FAST;
712 colorMode = ANDROID_PROCESSING_FAST;
713 tonemapMode = ANDROID_PROCESSING_FAST;
714 edgeMode = ANDROID_PROCESSING_FAST;
715 break;
716 }
717 ADD_OR_SIZE(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1);
718 ADD_OR_SIZE(ANDROID_DEMOSAIC_MODE, &demosaicMode, 1);
719 ADD_OR_SIZE(ANDROID_NOISE_MODE, &noiseMode, 1);
720 ADD_OR_SIZE(ANDROID_SHADING_MODE, &shadingMode, 1);
721 ADD_OR_SIZE(ANDROID_GEOMETRIC_MODE, &geometricMode, 1);
722 ADD_OR_SIZE(ANDROID_COLOR_MODE, &colorMode, 1);
723 ADD_OR_SIZE(ANDROID_TONEMAP_MODE, &tonemapMode, 1);
724 ADD_OR_SIZE(ANDROID_EDGE_MODE, &edgeMode, 1);
725
726 /** android.noise */
727 static const uint8_t noiseStrength = 5;
728 ADD_OR_SIZE(ANDROID_NOISE_STRENGTH, &noiseStrength, 1);
729
730 /** android.color */
731 static const float colorTransform[9] = {
732 1.0f, 0.f, 0.f,
733 0.f, 1.f, 0.f,
734 0.f, 0.f, 1.f
735 };
736 ADD_OR_SIZE(ANDROID_COLOR_TRANSFORM, colorTransform, 9);
737
738 /** android.tonemap */
739 static const float tonemapCurve[4] = {
740 0.f, 0.f,
741 1.f, 1.f
742 };
743 ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_RED, tonemapCurve, 32); // sungjoong
744 ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_GREEN, tonemapCurve, 32);
745 ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_BLUE, tonemapCurve, 32);
746
747 /** android.edge */
748 static const uint8_t edgeStrength = 5;
749 ADD_OR_SIZE(ANDROID_EDGE_STRENGTH, &edgeStrength, 1);
750
751 /** android.scaler */
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700752 int32_t cropRegion[3] = {
753 0, 0, m_curCameraInfo->sensorW
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700754 };
755 ADD_OR_SIZE(ANDROID_SCALER_CROP_REGION, cropRegion, 3);
756
757 /** android.jpeg */
758 static const int32_t jpegQuality = 80;
759 ADD_OR_SIZE(ANDROID_JPEG_QUALITY, &jpegQuality, 1);
760
761 static const int32_t thumbnailSize[2] = {
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +0900762 160, 120
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700763 };
764 ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSize, 2);
765
766 static const int32_t thumbnailQuality = 80;
767 ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnailQuality, 1);
768
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700769 static const double gpsCoordinates[3] = {
770 0, 0, 0
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700771 };
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700772 ADD_OR_SIZE(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 3);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700773
774 static const uint8_t gpsProcessingMethod[32] = "None";
775 ADD_OR_SIZE(ANDROID_JPEG_GPS_PROCESSING_METHOD, gpsProcessingMethod, 32);
776
777 static const int64_t gpsTimestamp = 0;
778 ADD_OR_SIZE(ANDROID_JPEG_GPS_TIMESTAMP, &gpsTimestamp, 1);
779
780 static const int32_t jpegOrientation = 0;
781 ADD_OR_SIZE(ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1);
782
783 /** android.stats */
784
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700785 static const uint8_t faceDetectMode = ANDROID_STATS_FACE_DETECTION_FULL;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700786 ADD_OR_SIZE(ANDROID_STATS_FACE_DETECT_MODE, &faceDetectMode, 1);
787
788 static const uint8_t histogramMode = ANDROID_STATS_OFF;
789 ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_MODE, &histogramMode, 1);
790
791 static const uint8_t sharpnessMapMode = ANDROID_STATS_OFF;
792 ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1);
793
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700794
795 /** android.control */
796
797 uint8_t controlIntent = 0;
798 switch (request_template) {
799 case CAMERA2_TEMPLATE_PREVIEW:
800 controlIntent = ANDROID_CONTROL_INTENT_PREVIEW;
801 break;
802 case CAMERA2_TEMPLATE_STILL_CAPTURE:
803 controlIntent = ANDROID_CONTROL_INTENT_STILL_CAPTURE;
804 break;
805 case CAMERA2_TEMPLATE_VIDEO_RECORD:
806 controlIntent = ANDROID_CONTROL_INTENT_VIDEO_RECORD;
807 break;
808 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
809 controlIntent = ANDROID_CONTROL_INTENT_VIDEO_SNAPSHOT;
810 break;
811 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
812 controlIntent = ANDROID_CONTROL_INTENT_ZERO_SHUTTER_LAG;
813 break;
814 default:
815 controlIntent = ANDROID_CONTROL_INTENT_CUSTOM;
816 break;
817 }
818 ADD_OR_SIZE(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
819
820 static const uint8_t controlMode = ANDROID_CONTROL_AUTO;
821 ADD_OR_SIZE(ANDROID_CONTROL_MODE, &controlMode, 1);
822
823 static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_OFF;
824 ADD_OR_SIZE(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
825
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700826 static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700827 ADD_OR_SIZE(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
828
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700829 static const uint8_t aeMode = ANDROID_CONTROL_AE_ON;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700830 ADD_OR_SIZE(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
831
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700832 int32_t controlRegions[5] = {
833 0, 0, m_curCameraInfo->sensorW, m_curCameraInfo->sensorH, 1000
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700834 };
835 ADD_OR_SIZE(ANDROID_CONTROL_AE_REGIONS, controlRegions, 5);
836
837 static const int32_t aeExpCompensation = 0;
838 ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION, &aeExpCompensation, 1);
839
840 static const int32_t aeTargetFpsRange[2] = {
841 10, 30
842 };
843 ADD_OR_SIZE(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange, 2);
844
845 static const uint8_t aeAntibandingMode =
846 ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
847 ADD_OR_SIZE(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &aeAntibandingMode, 1);
848
849 static const uint8_t awbMode =
850 ANDROID_CONTROL_AWB_AUTO;
851 ADD_OR_SIZE(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
852
853 ADD_OR_SIZE(ANDROID_CONTROL_AWB_REGIONS, controlRegions, 5);
854
855 uint8_t afMode = 0;
856 switch (request_template) {
857 case CAMERA2_TEMPLATE_PREVIEW:
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700858 afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700859 break;
860 case CAMERA2_TEMPLATE_STILL_CAPTURE:
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700861 afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700862 break;
863 case CAMERA2_TEMPLATE_VIDEO_RECORD:
864 afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO;
865 break;
866 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
867 afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO;
868 break;
869 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
870 afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE;
871 break;
872 default:
873 afMode = ANDROID_CONTROL_AF_AUTO;
874 break;
875 }
876 ADD_OR_SIZE(ANDROID_CONTROL_AF_MODE, &afMode, 1);
877
878 ADD_OR_SIZE(ANDROID_CONTROL_AF_REGIONS, controlRegions, 5);
879
880 static const uint8_t vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
881 ADD_OR_SIZE(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vstabMode, 1);
882
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700883 if (sizeRequest) {
884 ALOGV("Allocating %d entries, %d extra bytes for "
885 "request template type %d",
886 entryCount, dataCount, request_template);
887 *request = allocate_camera_metadata(entryCount, dataCount);
888 if (*request == NULL) {
889 ALOGE("Unable to allocate new request template type %d "
890 "(%d entries, %d bytes extra data)", request_template,
891 entryCount, dataCount);
892 return NO_MEMORY;
893 }
894 }
895 return OK;
896#undef ADD_OR_SIZE
897}
898
899}