blob: 66176a444623871f67ddb32a1a6730693f0f889a [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{
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700118 1920, 1080,
119 1280, 720,
120};
121
122const int32_t jpegResolutionS5K4E5[] =
123{
124 2560, 1920,
125 1280, 720,
126};
127
128ExynosCamera2InfoS5K4E5::ExynosCamera2InfoS5K4E5()
129{
130 sensorW = 2560;
131 sensorH = 1920;
132 sensorRawW = (2560 + 16);
133 sensorRawH = (1920 + 10);
134 numScalerResolution = ARRAY_SIZE(scalerResolutionS5K4E5)/2;
135 scalerResolutions = scalerResolutionS5K4E5;
136 numJpegResolution = ARRAY_SIZE(jpegResolutionS5K4E5)/2;
137 jpegResolutions = jpegResolutionS5K4E5;
138}
139
140const int32_t scalerResolutionS5K6A3[] =
141{
142 1280, 720,
143};
144
145const int32_t jpegResolutionS5K6A3[] =
146{
147 1280, 720,
148};
149
150ExynosCamera2InfoS5K6A3::ExynosCamera2InfoS5K6A3()
151{
152 sensorW = 1392;
153 sensorH = 1392;
154 sensorRawW = (1392 + 16);
155 sensorRawH = (1392 + 10);
156 numScalerResolution = ARRAY_SIZE(scalerResolutionS5K6A3)/2;
157 scalerResolutions = scalerResolutionS5K6A3;
158 numJpegResolution = ARRAY_SIZE(jpegResolutionS5K6A3)/2;
159 jpegResolutions = jpegResolutionS5K6A3;
160}
161
162ExynosCamera2::ExynosCamera2(int cameraId):
163 m_cameraId(cameraId)
164{
165 if (cameraId == 0)
166 m_curCameraInfo = new ExynosCamera2InfoS5K4E5;
167 else
168 m_curCameraInfo = new ExynosCamera2InfoS5K6A3;
169}
170
171ExynosCamera2::~ExynosCamera2()
172{
173 delete m_curCameraInfo;
174}
175
176int32_t ExynosCamera2::getSensorW()
177{
178 return m_curCameraInfo->sensorW;
179}
180
181int32_t ExynosCamera2::getSensorH()
182{
183 return m_curCameraInfo->sensorH;
184}
185
186int32_t ExynosCamera2::getSensorRawW()
187{
188 return m_curCameraInfo->sensorRawW;
189}
190
191int32_t ExynosCamera2::getSensorRawH()
192{
193 return m_curCameraInfo->sensorRawH;
194}
195
196bool ExynosCamera2::isSupportedResolution(int width, int height)
197{
198 int i;
199 for (i = 0 ; i < m_curCameraInfo->numScalerResolution ; i++) {
200 if (m_curCameraInfo->scalerResolutions[2*i] == width
201 && m_curCameraInfo->scalerResolutions[2*i+1] == height) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900202 return true;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700203 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900204 }
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700205 return false;
206}
207
208bool ExynosCamera2::isSupportedJpegResolution(int width, int height)
209{
210 int i;
211 for (i = 0 ; i < m_curCameraInfo->numJpegResolution ; i++) {
212 if (m_curCameraInfo->jpegResolutions[2*i] == width
213 && m_curCameraInfo->jpegResolutions[2*i+1] == height) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900214 return true;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700215 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900216 }
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700217 return false;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900218}
219
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700220status_t addOrSize(camera_metadata_t *request,
221 bool sizeRequest,
222 size_t *entryCount,
223 size_t *dataCount,
224 uint32_t tag,
225 const void *entryData,
226 size_t entryDataCount) {
227 status_t res;
228 if (!sizeRequest) {
229 return add_camera_metadata_entry(request, tag, entryData,
230 entryDataCount);
231 } else {
232 int type = get_camera_metadata_tag_type(tag);
233 if (type < 0 ) return BAD_VALUE;
234 (*entryCount)++;
235 (*dataCount) += calculate_camera_metadata_entry_data_size(type,
236 entryDataCount);
237 return OK;
238 }
239}
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700240
241status_t ExynosCamera2::constructStaticInfo(camera_metadata_t **info,
242 int cameraId, bool sizeRequest) {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700243
244 size_t entryCount = 0;
245 size_t dataCount = 0;
246 status_t ret;
247
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700248#define ADD_OR_SIZE( tag, data, count ) \
249 if ( ( ret = addOrSize(*info, sizeRequest, &entryCount, &dataCount, \
250 tag, data, count) ) != OK ) return ret
251
252 // android.lens
253
254 static const float minFocusDistance = 0;
255 ADD_OR_SIZE(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE,
256 &minFocusDistance, 1);
257 ADD_OR_SIZE(ANDROID_LENS_HYPERFOCAL_DISTANCE,
258 &minFocusDistance, 1);
259
260 static const float focalLength = 3.30f; // mm
261 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS,
262 &focalLength, 1);
263 static const float aperture = 2.8f;
264 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_APERTURES,
265 &aperture, 1);
266 static const float filterDensity = 0;
267 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FILTER_DENSITY,
268 &filterDensity, 1);
269 static const uint8_t availableOpticalStabilization =
270 ANDROID_LENS_OPTICAL_STABILIZATION_OFF;
271 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_OPTICAL_STABILIZATION,
272 &availableOpticalStabilization, 1);
273
274 static const int32_t lensShadingMapSize[] = {1, 1};
275 ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP_SIZE, lensShadingMapSize,
276 sizeof(lensShadingMapSize)/sizeof(int32_t));
277
278 static const float lensShadingMap[3 * 1 * 1 ] =
279 { 1.f, 1.f, 1.f };
280 ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP, lensShadingMap,
281 sizeof(lensShadingMap)/sizeof(float));
282
283 // Identity transform
284 static const int32_t geometricCorrectionMapSize[] = {2, 2};
285 ADD_OR_SIZE(ANDROID_LENS_GEOMETRIC_CORRECTION_MAP_SIZE,
286 geometricCorrectionMapSize,
287 sizeof(geometricCorrectionMapSize)/sizeof(int32_t));
288
289 static const float geometricCorrectionMap[2 * 3 * 2 * 2] = {
290 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
291 1.f, 0.f, 1.f, 0.f, 1.f, 0.f,
292 0.f, 1.f, 0.f, 1.f, 0.f, 1.f,
293 1.f, 1.f, 1.f, 1.f, 1.f, 1.f};
294 ADD_OR_SIZE(ANDROID_LENS_GEOMETRIC_CORRECTION_MAP,
295 geometricCorrectionMap,
296 sizeof(geometricCorrectionMap)/sizeof(float));
297
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900298 int32_t lensFacing = cameraId ?
299 ANDROID_LENS_FACING_FRONT : ANDROID_LENS_FACING_BACK;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700300 ADD_OR_SIZE(ANDROID_LENS_FACING, &lensFacing, 1);
301
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700302 // android.sensor
303 ADD_OR_SIZE(ANDROID_SENSOR_EXPOSURE_TIME_RANGE,
304 Sensor::kExposureTimeRange, 2);
305
306 ADD_OR_SIZE(ANDROID_SENSOR_MAX_FRAME_DURATION,
307 &Sensor::kFrameDurationRange[1], 1);
308
309 ADD_OR_SIZE(ANDROID_SENSOR_AVAILABLE_SENSITIVITIES,
310 Sensor::kAvailableSensitivities,
311 sizeof(Sensor::kAvailableSensitivities)
312 /sizeof(uint32_t));
313
314 ADD_OR_SIZE(ANDROID_SENSOR_COLOR_FILTER_ARRANGEMENT,
315 &Sensor::kColorFilterArrangement, 1);
316
317 static const float sensorPhysicalSize[2] = {3.20f, 2.40f}; // mm
318 ADD_OR_SIZE(ANDROID_SENSOR_PHYSICAL_SIZE,
319 sensorPhysicalSize, 2);
320
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700321 int32_t pixelArraySize[2] = {
322 m_curCameraInfo->sensorW, m_curCameraInfo->sensorH
323 };
324 ADD_OR_SIZE(ANDROID_SENSOR_PIXEL_ARRAY_SIZE, pixelArraySize, 2);
325 ADD_OR_SIZE(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, pixelArraySize,2);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700326
327 ADD_OR_SIZE(ANDROID_SENSOR_WHITE_LEVEL,
328 &Sensor::kMaxRawValue, 1);
329
330 static const int32_t blackLevelPattern[4] = {
331 Sensor::kBlackLevel, Sensor::kBlackLevel,
332 Sensor::kBlackLevel, Sensor::kBlackLevel
333 };
334 ADD_OR_SIZE(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
335 blackLevelPattern, sizeof(blackLevelPattern)/sizeof(int32_t));
336
337 //TODO: sensor color calibration fields
338
339 // android.flash
340 static const uint8_t flashAvailable = 0;
341 ADD_OR_SIZE(ANDROID_FLASH_AVAILABLE, &flashAvailable, 1);
342
343 static const int64_t flashChargeDuration = 0;
344 ADD_OR_SIZE(ANDROID_FLASH_CHARGE_DURATION, &flashChargeDuration, 1);
345
346 // android.tonemap
347
348 static const int32_t tonemapCurvePoints = 128;
349 ADD_OR_SIZE(ANDROID_TONEMAP_MAX_CURVE_POINTS, &tonemapCurvePoints, 1);
350
351 // android.scaler
352
353 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_FORMATS,
354 kAvailableFormats,
355 sizeof(kAvailableFormats)/sizeof(uint32_t));
356
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700357 int32_t availableRawSizes[2] = {
358 m_curCameraInfo->sensorRawW, m_curCameraInfo->sensorRawH
359 };
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700360 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700361 availableRawSizes, 2);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700362
363 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
364 kAvailableRawMinDurations,
365 sizeof(kAvailableRawMinDurations)/sizeof(uint64_t));
366
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700367
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700368 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
369 m_curCameraInfo->scalerResolutions,
370 (m_curCameraInfo->numScalerResolution)*2);
371 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
372 m_curCameraInfo->jpegResolutions,
373 (m_curCameraInfo->numJpegResolution)*2);
374
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700375 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
376 kAvailableProcessedMinDurations,
377 sizeof(kAvailableProcessedMinDurations)/sizeof(uint64_t));
378
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700379 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
380 kAvailableJpegMinDurations,
381 sizeof(kAvailableJpegMinDurations)/sizeof(uint64_t));
382
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700383 static const float maxZoom = 3.5;
384 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, &maxZoom, 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700385
386 // android.jpeg
387
388 static const int32_t jpegThumbnailSizes[] = {
389 160, 120,
390 320, 240,
391 640, 480
392 };
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700393
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700394 ADD_OR_SIZE(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
395 jpegThumbnailSizes, sizeof(jpegThumbnailSizes)/sizeof(int32_t));
396
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900397 static const int32_t jpegMaxSize = 5*1024*1024;
398 ADD_OR_SIZE(ANDROID_JPEG_MAX_SIZE, &jpegMaxSize, 1);
399
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700400 // android.stats
401
402 static const uint8_t availableFaceDetectModes[] = {
403 ANDROID_STATS_FACE_DETECTION_OFF
404 };
405 ADD_OR_SIZE(ANDROID_STATS_AVAILABLE_FACE_DETECT_MODES,
406 availableFaceDetectModes,
407 sizeof(availableFaceDetectModes));
408
409 static const int32_t maxFaceCount = 0;
410 ADD_OR_SIZE(ANDROID_STATS_MAX_FACE_COUNT,
411 &maxFaceCount, 1);
412
413 static const int32_t histogramSize = 64;
414 ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_BUCKET_COUNT,
415 &histogramSize, 1);
416
417 static const int32_t maxHistogramCount = 1000;
418 ADD_OR_SIZE(ANDROID_STATS_MAX_HISTOGRAM_COUNT,
419 &maxHistogramCount, 1);
420
421 static const int32_t sharpnessMapSize[2] = {64, 64};
422 ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_SIZE,
423 sharpnessMapSize, sizeof(sharpnessMapSize)/sizeof(int32_t));
424
425 static const int32_t maxSharpnessMapValue = 1000;
426 ADD_OR_SIZE(ANDROID_STATS_MAX_SHARPNESS_MAP_VALUE,
427 &maxSharpnessMapValue, 1);
428
429 // android.control
430
431 static const uint8_t availableSceneModes[] = {
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700432 ANDROID_CONTROL_SCENE_MODE_PARTY,
433 ANDROID_CONTROL_SCENE_MODE_SPORTS,
434 ANDROID_CONTROL_SCENE_MODE_NIGHT,
435 ANDROID_CONTROL_SCENE_MODE_BEACH
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700436 };
437 ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
438 availableSceneModes, sizeof(availableSceneModes));
439
440 static const uint8_t availableEffects[] = {
441 ANDROID_CONTROL_EFFECT_OFF
442 };
443 ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_EFFECTS,
444 availableEffects, sizeof(availableEffects));
445
446 int32_t max3aRegions = 0;
447 ADD_OR_SIZE(ANDROID_CONTROL_MAX_REGIONS,
448 &max3aRegions, 1);
449
450 static const uint8_t availableAeModes[] = {
451 ANDROID_CONTROL_AE_OFF,
452 ANDROID_CONTROL_AE_ON
453 };
454 ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_MODES,
455 availableAeModes, sizeof(availableAeModes));
456
457 static const camera_metadata_rational exposureCompensationStep = {
458 1, 3
459 };
460 ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP,
461 &exposureCompensationStep, 1);
462
463 int32_t exposureCompensationRange[] = {-9, 9};
464 ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE,
465 exposureCompensationRange,
466 sizeof(exposureCompensationRange)/sizeof(int32_t));
467
468 static const int32_t availableTargetFpsRanges[] = {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900469 5, 30, 30, 30
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700470 };
471 ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
472 availableTargetFpsRanges,
473 sizeof(availableTargetFpsRanges)/sizeof(int32_t));
474
475 static const uint8_t availableAntibandingModes[] = {
476 ANDROID_CONTROL_AE_ANTIBANDING_OFF,
477 ANDROID_CONTROL_AE_ANTIBANDING_AUTO
478 };
479 ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
480 availableAntibandingModes, sizeof(availableAntibandingModes));
481
482 static const uint8_t availableAwbModes[] = {
483 ANDROID_CONTROL_AWB_OFF,
484 ANDROID_CONTROL_AWB_AUTO,
485 ANDROID_CONTROL_AWB_INCANDESCENT,
486 ANDROID_CONTROL_AWB_FLUORESCENT,
487 ANDROID_CONTROL_AWB_DAYLIGHT,
488 ANDROID_CONTROL_AWB_SHADE
489 };
490 ADD_OR_SIZE(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
491 availableAwbModes, sizeof(availableAwbModes));
492
493 static const uint8_t availableAfModes[] = {
494 ANDROID_CONTROL_AF_OFF
495 };
496 ADD_OR_SIZE(ANDROID_CONTROL_AF_AVAILABLE_MODES,
497 availableAfModes, sizeof(availableAfModes));
498
499 static const uint8_t availableVstabModes[] = {
500 ANDROID_CONTROL_VIDEO_STABILIZATION_OFF
501 };
502 ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
503 availableVstabModes, sizeof(availableVstabModes));
504
505#undef ADD_OR_SIZE
506 /** Allocate metadata if sizing */
507 if (sizeRequest) {
508 ALOGV("Allocating %d entries, %d extra bytes for "
509 "static camera info",
510 entryCount, dataCount);
511 *info = allocate_camera_metadata(entryCount, dataCount);
512 if (*info == NULL) {
513 ALOGE("Unable to allocate camera static info"
514 "(%d entries, %d bytes extra data)",
515 entryCount, dataCount);
516 return NO_MEMORY;
517 }
518 }
519 return OK;
520}
521
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700522status_t ExynosCamera2::constructDefaultRequest(
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700523 int request_template,
524 camera_metadata_t **request,
525 bool sizeRequest) {
526
527 size_t entryCount = 0;
528 size_t dataCount = 0;
529 status_t ret;
530
531#define ADD_OR_SIZE( tag, data, count ) \
532 if ( ( ret = addOrSize(*request, sizeRequest, &entryCount, &dataCount, \
533 tag, data, count) ) != OK ) return ret
534
535 static const int64_t USEC = 1000LL;
536 static const int64_t MSEC = USEC * 1000LL;
537 static const int64_t SEC = MSEC * 1000LL;
538
539 /** android.request */
540
541 static const uint8_t metadataMode = ANDROID_REQUEST_METADATA_NONE;
542 ADD_OR_SIZE(ANDROID_REQUEST_METADATA_MODE, &metadataMode, 1);
543
544 static const int32_t id = 0;
545 ADD_OR_SIZE(ANDROID_REQUEST_ID, &id, 1);
546
547 static const int32_t frameCount = 0;
548 ADD_OR_SIZE(ANDROID_REQUEST_FRAME_COUNT, &frameCount, 1);
549
550 // OUTPUT_STREAMS set by user
551 entryCount += 1;
552 dataCount += 5; // TODO: Should be maximum stream number
553
554 /** android.lens */
555
556 static const float focusDistance = 0;
557 ADD_OR_SIZE(ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1);
558
559 static const float aperture = 2.8f;
560 ADD_OR_SIZE(ANDROID_LENS_APERTURE, &aperture, 1);
561
562 static const float focalLength = 5.0f;
563 ADD_OR_SIZE(ANDROID_LENS_FOCAL_LENGTH, &focalLength, 1);
564
565 static const float filterDensity = 0;
566 ADD_OR_SIZE(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1);
567
568 static const uint8_t opticalStabilizationMode =
569 ANDROID_LENS_OPTICAL_STABILIZATION_OFF;
570 ADD_OR_SIZE(ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
571 &opticalStabilizationMode, 1);
572
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700573
574 /** android.sensor */
575
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700576
577 static const int64_t frameDuration = 33333333L; // 1/30 s
578 ADD_OR_SIZE(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1);
579
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700580
581 /** android.flash */
582
583 static const uint8_t flashMode = ANDROID_FLASH_OFF;
584 ADD_OR_SIZE(ANDROID_FLASH_MODE, &flashMode, 1);
585
586 static const uint8_t flashPower = 10;
587 ADD_OR_SIZE(ANDROID_FLASH_FIRING_POWER, &flashPower, 1);
588
589 static const int64_t firingTime = 0;
590 ADD_OR_SIZE(ANDROID_FLASH_FIRING_TIME, &firingTime, 1);
591
592 /** Processing block modes */
593 uint8_t hotPixelMode = 0;
594 uint8_t demosaicMode = 0;
595 uint8_t noiseMode = 0;
596 uint8_t shadingMode = 0;
597 uint8_t geometricMode = 0;
598 uint8_t colorMode = 0;
599 uint8_t tonemapMode = 0;
600 uint8_t edgeMode = 0;
601 switch (request_template) {
602 case CAMERA2_TEMPLATE_PREVIEW:
603 hotPixelMode = ANDROID_PROCESSING_FAST;
604 demosaicMode = ANDROID_PROCESSING_FAST;
605 noiseMode = ANDROID_PROCESSING_FAST;
606 shadingMode = ANDROID_PROCESSING_FAST;
607 geometricMode = ANDROID_PROCESSING_FAST;
608 colorMode = ANDROID_PROCESSING_FAST;
609 tonemapMode = ANDROID_PROCESSING_FAST;
610 edgeMode = ANDROID_PROCESSING_FAST;
611 break;
612 case CAMERA2_TEMPLATE_STILL_CAPTURE:
613 hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
614 demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
615 noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
616 shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
617 geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
618 colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
619 tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
620 edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
621 break;
622 case CAMERA2_TEMPLATE_VIDEO_RECORD:
623 hotPixelMode = ANDROID_PROCESSING_FAST;
624 demosaicMode = ANDROID_PROCESSING_FAST;
625 noiseMode = ANDROID_PROCESSING_FAST;
626 shadingMode = ANDROID_PROCESSING_FAST;
627 geometricMode = ANDROID_PROCESSING_FAST;
628 colorMode = ANDROID_PROCESSING_FAST;
629 tonemapMode = ANDROID_PROCESSING_FAST;
630 edgeMode = ANDROID_PROCESSING_FAST;
631 break;
632 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
633 hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
634 demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
635 noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
636 shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
637 geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
638 colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
639 tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
640 edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
641 break;
642 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
643 hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
644 demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
645 noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
646 shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
647 geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
648 colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
649 tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
650 edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
651 break;
652 default:
653 hotPixelMode = ANDROID_PROCESSING_FAST;
654 demosaicMode = ANDROID_PROCESSING_FAST;
655 noiseMode = ANDROID_PROCESSING_FAST;
656 shadingMode = ANDROID_PROCESSING_FAST;
657 geometricMode = ANDROID_PROCESSING_FAST;
658 colorMode = ANDROID_PROCESSING_FAST;
659 tonemapMode = ANDROID_PROCESSING_FAST;
660 edgeMode = ANDROID_PROCESSING_FAST;
661 break;
662 }
663 ADD_OR_SIZE(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1);
664 ADD_OR_SIZE(ANDROID_DEMOSAIC_MODE, &demosaicMode, 1);
665 ADD_OR_SIZE(ANDROID_NOISE_MODE, &noiseMode, 1);
666 ADD_OR_SIZE(ANDROID_SHADING_MODE, &shadingMode, 1);
667 ADD_OR_SIZE(ANDROID_GEOMETRIC_MODE, &geometricMode, 1);
668 ADD_OR_SIZE(ANDROID_COLOR_MODE, &colorMode, 1);
669 ADD_OR_SIZE(ANDROID_TONEMAP_MODE, &tonemapMode, 1);
670 ADD_OR_SIZE(ANDROID_EDGE_MODE, &edgeMode, 1);
671
672 /** android.noise */
673 static const uint8_t noiseStrength = 5;
674 ADD_OR_SIZE(ANDROID_NOISE_STRENGTH, &noiseStrength, 1);
675
676 /** android.color */
677 static const float colorTransform[9] = {
678 1.0f, 0.f, 0.f,
679 0.f, 1.f, 0.f,
680 0.f, 0.f, 1.f
681 };
682 ADD_OR_SIZE(ANDROID_COLOR_TRANSFORM, colorTransform, 9);
683
684 /** android.tonemap */
685 static const float tonemapCurve[4] = {
686 0.f, 0.f,
687 1.f, 1.f
688 };
689 ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_RED, tonemapCurve, 32); // sungjoong
690 ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_GREEN, tonemapCurve, 32);
691 ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_BLUE, tonemapCurve, 32);
692
693 /** android.edge */
694 static const uint8_t edgeStrength = 5;
695 ADD_OR_SIZE(ANDROID_EDGE_STRENGTH, &edgeStrength, 1);
696
697 /** android.scaler */
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700698 int32_t cropRegion[3] = {
699 0, 0, m_curCameraInfo->sensorW
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700700 };
701 ADD_OR_SIZE(ANDROID_SCALER_CROP_REGION, cropRegion, 3);
702
703 /** android.jpeg */
704 static const int32_t jpegQuality = 80;
705 ADD_OR_SIZE(ANDROID_JPEG_QUALITY, &jpegQuality, 1);
706
707 static const int32_t thumbnailSize[2] = {
708 640, 480
709 };
710 ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSize, 2);
711
712 static const int32_t thumbnailQuality = 80;
713 ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnailQuality, 1);
714
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700715 static const double gpsCoordinates[3] = {
716 0, 0, 0
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700717 };
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700718 ADD_OR_SIZE(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 3);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700719
720 static const uint8_t gpsProcessingMethod[32] = "None";
721 ADD_OR_SIZE(ANDROID_JPEG_GPS_PROCESSING_METHOD, gpsProcessingMethod, 32);
722
723 static const int64_t gpsTimestamp = 0;
724 ADD_OR_SIZE(ANDROID_JPEG_GPS_TIMESTAMP, &gpsTimestamp, 1);
725
726 static const int32_t jpegOrientation = 0;
727 ADD_OR_SIZE(ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1);
728
729 /** android.stats */
730
731 static const uint8_t faceDetectMode = ANDROID_STATS_FACE_DETECTION_OFF;
732 ADD_OR_SIZE(ANDROID_STATS_FACE_DETECT_MODE, &faceDetectMode, 1);
733
734 static const uint8_t histogramMode = ANDROID_STATS_OFF;
735 ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_MODE, &histogramMode, 1);
736
737 static const uint8_t sharpnessMapMode = ANDROID_STATS_OFF;
738 ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1);
739
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700740
741 /** android.control */
742
743 uint8_t controlIntent = 0;
744 switch (request_template) {
745 case CAMERA2_TEMPLATE_PREVIEW:
746 controlIntent = ANDROID_CONTROL_INTENT_PREVIEW;
747 break;
748 case CAMERA2_TEMPLATE_STILL_CAPTURE:
749 controlIntent = ANDROID_CONTROL_INTENT_STILL_CAPTURE;
750 break;
751 case CAMERA2_TEMPLATE_VIDEO_RECORD:
752 controlIntent = ANDROID_CONTROL_INTENT_VIDEO_RECORD;
753 break;
754 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
755 controlIntent = ANDROID_CONTROL_INTENT_VIDEO_SNAPSHOT;
756 break;
757 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
758 controlIntent = ANDROID_CONTROL_INTENT_ZERO_SHUTTER_LAG;
759 break;
760 default:
761 controlIntent = ANDROID_CONTROL_INTENT_CUSTOM;
762 break;
763 }
764 ADD_OR_SIZE(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
765
766 static const uint8_t controlMode = ANDROID_CONTROL_AUTO;
767 ADD_OR_SIZE(ANDROID_CONTROL_MODE, &controlMode, 1);
768
769 static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_OFF;
770 ADD_OR_SIZE(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
771
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700772 static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700773 ADD_OR_SIZE(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
774
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700775 static const uint8_t aeMode = ANDROID_CONTROL_AE_ON;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700776 ADD_OR_SIZE(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
777
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700778 int32_t controlRegions[5] = {
779 0, 0, m_curCameraInfo->sensorW, m_curCameraInfo->sensorH, 1000
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700780 };
781 ADD_OR_SIZE(ANDROID_CONTROL_AE_REGIONS, controlRegions, 5);
782
783 static const int32_t aeExpCompensation = 0;
784 ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION, &aeExpCompensation, 1);
785
786 static const int32_t aeTargetFpsRange[2] = {
787 10, 30
788 };
789 ADD_OR_SIZE(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange, 2);
790
791 static const uint8_t aeAntibandingMode =
792 ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
793 ADD_OR_SIZE(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &aeAntibandingMode, 1);
794
795 static const uint8_t awbMode =
796 ANDROID_CONTROL_AWB_AUTO;
797 ADD_OR_SIZE(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
798
799 ADD_OR_SIZE(ANDROID_CONTROL_AWB_REGIONS, controlRegions, 5);
800
801 uint8_t afMode = 0;
802 switch (request_template) {
803 case CAMERA2_TEMPLATE_PREVIEW:
804 afMode = ANDROID_CONTROL_AF_AUTO;
805 break;
806 case CAMERA2_TEMPLATE_STILL_CAPTURE:
807 afMode = ANDROID_CONTROL_AF_AUTO;
808 break;
809 case CAMERA2_TEMPLATE_VIDEO_RECORD:
810 afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO;
811 break;
812 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
813 afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO;
814 break;
815 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
816 afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE;
817 break;
818 default:
819 afMode = ANDROID_CONTROL_AF_AUTO;
820 break;
821 }
822 ADD_OR_SIZE(ANDROID_CONTROL_AF_MODE, &afMode, 1);
823
824 ADD_OR_SIZE(ANDROID_CONTROL_AF_REGIONS, controlRegions, 5);
825
826 static const uint8_t vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
827 ADD_OR_SIZE(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vstabMode, 1);
828
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700829 if (sizeRequest) {
830 ALOGV("Allocating %d entries, %d extra bytes for "
831 "request template type %d",
832 entryCount, dataCount, request_template);
833 *request = allocate_camera_metadata(entryCount, dataCount);
834 if (*request == NULL) {
835 ALOGE("Unable to allocate new request template type %d "
836 "(%d entries, %d bytes extra data)", request_template,
837 entryCount, dataCount);
838 return NO_MEMORY;
839 }
840 }
841 return OK;
842#undef ADD_OR_SIZE
843}
844
845}