ExynosCamera2.cpp revision b8146879a137e53742fb20c2ac3cbb6bd8d3feb3
1daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang/*
2daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang**
3daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang** Copyright 2008, The Android Open Source Project
4daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang** Copyright 2012, Samsung Electronics Co. LTD
5daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang**
6daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang** Licensed under the Apache License, Version 2.0 (the "License");
7daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang** you may not use this file except in compliance with the License.
8daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang** You may obtain a copy of the License at
9daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang**
10daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang**     http://www.apache.org/licenses/LICENSE-2.0
11daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang**
12daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang** Unless required by applicable law or agreed to in writing, software
13daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang** distributed under the License is distributed on an "AS IS" BASIS,
14daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang** See the License for the specific language governing permissions and
16daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang** limitations under the License.
17daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang*/
18daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang
19daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang/*!
20daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang * \file      ExynosCamera2.cpp
21daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang * \brief     source file for static information of camera2
22daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang * \author    Sungjoong Kang(sj3.kang@samsung.com)
23daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang * \date      2012/08/06
24daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang *
25daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang * <b>Revision History: </b>
26daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang * - 2012/08/06 : Sungjoong Kang(sj3.kang@samsung.com) \n
27daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang *   Initial Release
28daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang *
29daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang */
30c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
31c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin//#define LOG_NDEBUG 0
32daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang#define LOG_TAG "ExynosCamera2"
33c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include <utils/Log.h>
34c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
35daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang#include "ExynosCamera2.h"
36daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang
37daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
38c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
39c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinnamespace android {
40c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
41c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinclass Sensor {
42c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinpublic:
43c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    /**
44c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin     * Static sensor characteristics
45c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin     */
469dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    static const unsigned int kResolution[2][2];
47c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
48c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const nsecs_t kExposureTimeRange[2];
49c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const nsecs_t kFrameDurationRange[2];
50c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const nsecs_t kMinVerticalBlank;
51c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
52c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t kColorFilterArrangement;
53c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
54c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    // Output image data characteristics
55c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint32_t kMaxRawValue;
56c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint32_t kBlackLevel;
57c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    // Sensor sensitivity, approximate
58c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
59c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const float kSaturationVoltage;
60c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint32_t kSaturationElectrons;
61c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const float kVoltsPerLuxSecond;
62c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const float kElectronsPerLuxSecond;
63c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
64c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const float kBaseGainFactor;
65c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
66c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const float kReadNoiseStddevBeforeGain; // In electrons
67c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const float kReadNoiseStddevAfterGain;  // In raw digital units
68c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const float kReadNoiseVarBeforeGain;
69c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const float kReadNoiseVarAfterGain;
70c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
71c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    // While each row has to read out, reset, and then expose, the (reset +
72c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    // expose) sequence can be overlapped by other row readouts, so the final
73c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    // minimum frame duration is purely a function of row readout time, at least
74c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    // if there's a reasonable number of rows.
75c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const nsecs_t kRowReadoutTime;
76c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
77c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint32_t kAvailableSensitivities[5];
78c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint32_t kDefaultSensitivity;
79c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
80c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin};
81c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
829dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
83c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
84daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangconst uint32_t Sensor::kAvailableSensitivities[5] =
85daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    {100, 200, 400, 800, 1600};
86c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinconst nsecs_t Sensor::kExposureTimeRange[2] =
87c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    {1000L, 30000000000L} ; // 1 us - 30 sec
88c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinconst nsecs_t Sensor::kFrameDurationRange[2] =
89c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    {33331760L, 30000000000L}; // ~1/30 s - 30 sec
90c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
91c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinconst uint8_t Sensor::kColorFilterArrangement = ANDROID_SENSOR_RGGB;
92c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
9313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kangconst uint32_t kAvailableFormats[5] = {
94c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        HAL_PIXEL_FORMAT_RAW_SENSOR,
9513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        HAL_PIXEL_FORMAT_BLOB,
9613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        HAL_PIXEL_FORMAT_RGBA_8888,
97c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        HAL_PIXEL_FORMAT_YV12,
98c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        HAL_PIXEL_FORMAT_YCrCb_420_SP
99c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin};
100c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
101daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang// Output image data characteristics
102daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangconst uint32_t Sensor::kMaxRawValue = 4000;
103daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangconst uint32_t Sensor::kBlackLevel  = 1000;
10413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
105daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangconst uint64_t kAvailableRawMinDurations[1] = {
106daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    Sensor::kFrameDurationRange[0]
107c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin};
108c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
109daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangconst uint64_t kAvailableProcessedMinDurations[1] = {
110c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    Sensor::kFrameDurationRange[0]
111c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin};
112daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangconst uint64_t kAvailableJpegMinDurations[1] = {
113daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    Sensor::kFrameDurationRange[0]
1149dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang};
115c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
116daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangconst int32_t scalerResolutionS5K4E5[] =
117daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang{
1180b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi    1920, 1080, // 16:9
1190b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi    1440, 1080, // 4:3
1200b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi    1440,  960, // 3:2
1210b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi    1280, 1024, // 5:4
1220b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi    1280,  720, // 16:9
1230b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     960,  720, // 4:3
1240b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     800,  480, // 5:3
1250b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     768,  576, // 4:3
1260b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     720,  576, // 5:4
1270b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     720,  480, // 3:2
1280b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     640,  480, // 4:3
1290b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     352,  288, // 11:9
1300b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     320,  240, // 4:3
1310b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     240,  160, // 3:2
1320b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     176,  144, // 6:5
1330b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     128,   96, // 4:3
134c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin};
135c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
136daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangconst int32_t jpegResolutionS5K4E5[] =
137daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang{
138daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    2560, 1920,
139e4657e32d8ce4a88f2c15de1de60e27f3d1778abSungjoong Kang    2560, 1440,
140a44c3365bfc7ca02a8462264e3af05604eb1ebf5hyeonmyeong Choi    2160, 1440,
14115fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    2048, 1536,
14215fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    1600, 1200,
14315fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    1280, 1024,
14415fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    1280,  960,
14515fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    1152,  864,
14615fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang     640,  480,
14715fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang     320,  240,
148c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin};
149c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
150daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong KangExynosCamera2InfoS5K4E5::ExynosCamera2InfoS5K4E5()
151daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang{
152daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    sensorW             = 2560;
153daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    sensorH             = 1920;
154daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    sensorRawW          = (2560 + 16);
155daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    sensorRawH          = (1920 + 10);
156daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    numScalerResolution = ARRAY_SIZE(scalerResolutionS5K4E5)/2;
157daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    scalerResolutions   = scalerResolutionS5K4E5;
158daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    numJpegResolution   = ARRAY_SIZE(jpegResolutionS5K4E5)/2;
159daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    jpegResolutions     = jpegResolutionS5K4E5;
1600f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    minFocusDistance    = 0.1f;
1610f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    focalLength         = 3.43f;
1620f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    aperture            = 2.7f;
163e00f6591f64959131a8ddfbbcec7ff36c7eee94eSungjoong Kang    fnumber             = 2.7f;
164daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang}
165c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
16615fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong KangExynosCamera2InfoS5K4E5::~ExynosCamera2InfoS5K4E5()
16715fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang{
16815fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    ALOGV("%s", __FUNCTION__);
16915fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang}
170daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangconst int32_t scalerResolutionS5K6A3[] =
171daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang{
1720b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi    1392, 1392, // 1:1
1730b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi    1344,  896, // 3:2
1740b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi    1280, 1024, // 5:4
1750b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi    1280,  960, // 4:3
1760b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi    1280,  720, // 16:9
1770b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     960,  720, // 4:3
1780b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     800,  480, // 5:3
1790b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     768,  576, // 4:3
1800b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     720,  576, // 5:4
1810b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     720,  480, // 3:2
1820b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     640,  480, // 4:3
1830b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     352,  288, // 11:9
1840b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     320,  240, // 4:3
1850b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     240,  160, // 3:2
1860b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     176,  144, // 6:5
1870b7b757d7ef65c064a1cf3bcd3738b7a242811eehyeonmyeong Choi     128,   96, // 4:3
188c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin};
189c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
190daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangconst int32_t jpegResolutionS5K6A3[] =
191daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang{
19215fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    1392, 1392,
19315fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    1392, 1040,
194a44c3365bfc7ca02a8462264e3af05604eb1ebf5hyeonmyeong Choi    1392,  928,
19515fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    1392,  784,
19615fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    1280, 1024,
197ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang    1280,  960,
198e4657e32d8ce4a88f2c15de1de60e27f3d1778abSungjoong Kang    1280,  720,
19915fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    1152,  864,
20015fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang     640,  480,
20115fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang     320,  240,
202daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang};
203c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
204daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong KangExynosCamera2InfoS5K6A3::ExynosCamera2InfoS5K6A3()
2059dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang{
206daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    sensorW     = 1392;
207daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    sensorH     = 1392;
208daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    sensorRawW  = (1392 + 16);
209daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    sensorRawH  = (1392 + 10);
210daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    numScalerResolution = ARRAY_SIZE(scalerResolutionS5K6A3)/2;
211daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    scalerResolutions   = scalerResolutionS5K6A3;
212daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    numJpegResolution   = ARRAY_SIZE(jpegResolutionS5K6A3)/2;
213daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    jpegResolutions     = jpegResolutionS5K6A3;
2140f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    minFocusDistance    = 0.0f;
2150f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    focalLength         = 2.73f;
2160f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    aperture            = 2.8f;
217e00f6591f64959131a8ddfbbcec7ff36c7eee94eSungjoong Kang    fnumber             = 2.8f;
2189dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang}
2199dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
22015fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong KangExynosCamera2InfoS5K6A3::~ExynosCamera2InfoS5K6A3()
22115fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang{
22215fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    ALOGV("%s", __FUNCTION__);
22315fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang}
224daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong KangExynosCamera2::ExynosCamera2(int cameraId):
225daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    m_cameraId(cameraId)
2269dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang{
227daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    if (cameraId == 0)
228daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        m_curCameraInfo      = new ExynosCamera2InfoS5K4E5;
2299dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    else
230daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        m_curCameraInfo      = new ExynosCamera2InfoS5K6A3;
2319dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang}
2329dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
233daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong KangExynosCamera2::~ExynosCamera2()
2349dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang{
23515fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    ALOGV("%s", __FUNCTION__);
236daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang	delete m_curCameraInfo;
23715fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    m_curCameraInfo = NULL;
238daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang}
2399dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
240daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangint32_t ExynosCamera2::getSensorW()
2419dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang{
242daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    return m_curCameraInfo->sensorW;
2439dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang}
2449dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
245daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangint32_t ExynosCamera2::getSensorH()
246daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang{
247daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    return m_curCameraInfo->sensorH;
248daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang}
2499dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
250daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangint32_t ExynosCamera2::getSensorRawW()
2519dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang{
252daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    return m_curCameraInfo->sensorRawW;
253daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang}
2549dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
255daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangint32_t ExynosCamera2::getSensorRawH()
2569dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang{
257daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    return m_curCameraInfo->sensorRawH;
2589dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang}
2599dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
260daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangbool ExynosCamera2::isSupportedResolution(int width, int height)
2619dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang{
262daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    int i;
263daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    for (i = 0 ; i < m_curCameraInfo->numScalerResolution ; i++) {
264daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        if (m_curCameraInfo->scalerResolutions[2*i] == width
265daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang                && m_curCameraInfo->scalerResolutions[2*i+1] == height) {
266daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang            return true;
267daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        }
2689dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    }
269daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    return false;
270daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang}
2719dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
272daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangbool ExynosCamera2::isSupportedJpegResolution(int width, int height)
2739dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang{
274daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    int i;
275daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    for (i = 0 ; i < m_curCameraInfo->numJpegResolution ; i++) {
276daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        if (m_curCameraInfo->jpegResolutions[2*i] == width
277daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang                && m_curCameraInfo->jpegResolutions[2*i+1] == height) {
278daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang            return true;
279daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        }
2809dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    }
281daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    return false;
2829dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang}
2839dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
284c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinstatus_t addOrSize(camera_metadata_t *request,
285c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        bool sizeRequest,
286c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        size_t *entryCount,
287c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        size_t *dataCount,
288c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        uint32_t tag,
289c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        const void *entryData,
290c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        size_t entryDataCount) {
291c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    status_t res;
292c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    if (!sizeRequest) {
293c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        return add_camera_metadata_entry(request, tag, entryData,
294c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                entryDataCount);
295c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    } else {
296c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        int type = get_camera_metadata_tag_type(tag);
297c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        if (type < 0 ) return BAD_VALUE;
298c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        (*entryCount)++;
299c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        (*dataCount) += calculate_camera_metadata_entry_data_size(type,
300c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                entryDataCount);
301c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        return OK;
302c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    }
303c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin}
304daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang
305daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangstatus_t ExynosCamera2::constructStaticInfo(camera_metadata_t **info,
306daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        int cameraId, bool sizeRequest) {
307c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
308c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    size_t entryCount = 0;
309c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    size_t dataCount = 0;
310c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    status_t ret;
311c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
312c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define ADD_OR_SIZE( tag, data, count ) \
313c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    if ( ( ret = addOrSize(*info, sizeRequest, &entryCount, &dataCount, \
314c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            tag, data, count) ) != OK ) return ret
315c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
316c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    // android.lens
317c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
318c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE,
3190f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang            &(m_curCameraInfo->minFocusDistance), 1);
320c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_LENS_HYPERFOCAL_DISTANCE,
3210f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang            &(m_curCameraInfo->minFocusDistance), 1);
322c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
323c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS,
3240f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang            &m_curCameraInfo->focalLength, 1);
325c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_APERTURES,
3260f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang            &m_curCameraInfo->aperture, 1);
3270f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang
328c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const float filterDensity = 0;
329c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FILTER_DENSITY,
330c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            &filterDensity, 1);
331c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t availableOpticalStabilization =
332c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            ANDROID_LENS_OPTICAL_STABILIZATION_OFF;
333c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_OPTICAL_STABILIZATION,
334c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            &availableOpticalStabilization, 1);
335c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
336c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t lensShadingMapSize[] = {1, 1};
337c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP_SIZE, lensShadingMapSize,
338c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            sizeof(lensShadingMapSize)/sizeof(int32_t));
339c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
340c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const float lensShadingMap[3 * 1 * 1 ] =
341c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            { 1.f, 1.f, 1.f };
342c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP, lensShadingMap,
343c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            sizeof(lensShadingMap)/sizeof(float));
344c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
3459dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int32_t lensFacing = cameraId ?
3469dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang            ANDROID_LENS_FACING_FRONT : ANDROID_LENS_FACING_BACK;
347c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_LENS_FACING, &lensFacing, 1);
348c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
349c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    // android.sensor
350c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_SENSOR_EXPOSURE_TIME_RANGE,
351c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            Sensor::kExposureTimeRange, 2);
352c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
353c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_SENSOR_MAX_FRAME_DURATION,
354c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            &Sensor::kFrameDurationRange[1], 1);
355c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
356c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_SENSOR_AVAILABLE_SENSITIVITIES,
357c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            Sensor::kAvailableSensitivities,
358c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            sizeof(Sensor::kAvailableSensitivities)
359c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            /sizeof(uint32_t));
360c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
361c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_SENSOR_COLOR_FILTER_ARRANGEMENT,
362c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            &Sensor::kColorFilterArrangement, 1);
363c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
364c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const float sensorPhysicalSize[2] = {3.20f, 2.40f}; // mm
365c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_SENSOR_PHYSICAL_SIZE,
366c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            sensorPhysicalSize, 2);
367c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
368daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    int32_t pixelArraySize[2] = {
369daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        m_curCameraInfo->sensorW, m_curCameraInfo->sensorH
370daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    };
371daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    ADD_OR_SIZE(ANDROID_SENSOR_PIXEL_ARRAY_SIZE, pixelArraySize, 2);
372daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    ADD_OR_SIZE(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, pixelArraySize,2);
373c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
374c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_SENSOR_WHITE_LEVEL,
375c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            &Sensor::kMaxRawValue, 1);
376c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
377c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t blackLevelPattern[4] = {
378c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            Sensor::kBlackLevel, Sensor::kBlackLevel,
379c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            Sensor::kBlackLevel, Sensor::kBlackLevel
380c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
381c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
382c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            blackLevelPattern, sizeof(blackLevelPattern)/sizeof(int32_t));
383c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
384c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    //TODO: sensor color calibration fields
385c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
386c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    // android.flash
3879a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo    uint8_t flashAvailable;
3889a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo    if (cameraId == 0)
3899a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo        flashAvailable = 1;
3909a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo    else
3919a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo        flashAvailable = 0;
392c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_FLASH_AVAILABLE, &flashAvailable, 1);
393c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
394c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int64_t flashChargeDuration = 0;
395c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_FLASH_CHARGE_DURATION, &flashChargeDuration, 1);
396c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
397c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    // android.tonemap
398c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
399c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t tonemapCurvePoints = 128;
400c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_TONEMAP_MAX_CURVE_POINTS, &tonemapCurvePoints, 1);
401c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
402c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    // android.scaler
403c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
404c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_FORMATS,
405c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            kAvailableFormats,
406c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            sizeof(kAvailableFormats)/sizeof(uint32_t));
407c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
408daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    int32_t availableRawSizes[2] = {
409daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        m_curCameraInfo->sensorRawW, m_curCameraInfo->sensorRawH
410daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    };
411c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
412daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang            availableRawSizes, 2);
413c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
414c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
415c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            kAvailableRawMinDurations,
416c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            sizeof(kAvailableRawMinDurations)/sizeof(uint64_t));
417c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
418c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
419daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
420daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        m_curCameraInfo->scalerResolutions,
421daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        (m_curCameraInfo->numScalerResolution)*2);
422daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
423daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        m_curCameraInfo->jpegResolutions,
424daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        (m_curCameraInfo->numJpegResolution)*2);
425daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang
426c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
427c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            kAvailableProcessedMinDurations,
428c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            sizeof(kAvailableProcessedMinDurations)/sizeof(uint64_t));
429c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
430c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
431c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            kAvailableJpegMinDurations,
432c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            sizeof(kAvailableJpegMinDurations)/sizeof(uint64_t));
433c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
434e4657e32d8ce4a88f2c15de1de60e27f3d1778abSungjoong Kang    static const float maxZoom = 4;
435daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, &maxZoom, 1);
436c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
437c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    // android.jpeg
438c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
439c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t jpegThumbnailSizes[] = {
440c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            160, 120,
4412d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang            160, 160,
4422d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang            160, 90,
4434017b08c048a827a1299fb60859a72bfcda473f4Sungjoong Kang            144, 96,
4444017b08c048a827a1299fb60859a72bfcda473f4Sungjoong Kang              0, 0
445c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
446daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang
447c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
448c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            jpegThumbnailSizes, sizeof(jpegThumbnailSizes)/sizeof(int32_t));
449c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
4503c006f81491a876ab9ea48a6479592ea85c5059eSungjoong Kang    static const int32_t jpegMaxSize = 10 * 1024 * 1024;
45113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    ADD_OR_SIZE(ANDROID_JPEG_MAX_SIZE, &jpegMaxSize, 1);
45213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
453c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    // android.stats
454c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
455c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t availableFaceDetectModes[] = {
456fd2d78a2d270f85a71578423e1f2b4f99fd99216Sungjoong Kang            ANDROID_STATS_FACE_DETECTION_OFF,
457fd2d78a2d270f85a71578423e1f2b4f99fd99216Sungjoong Kang            ANDROID_STATS_FACE_DETECTION_FULL
458c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
459c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_STATS_AVAILABLE_FACE_DETECT_MODES,
460c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            availableFaceDetectModes,
461c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            sizeof(availableFaceDetectModes));
462c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
463f3312f8b250f3d2774564123ca0d7802f5016df5Younghwan Joo    m_curCameraInfo->maxFaceCount = CAMERA2_MAX_FACES;
464c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_STATS_MAX_FACE_COUNT,
465fd2d78a2d270f85a71578423e1f2b4f99fd99216Sungjoong Kang            &(m_curCameraInfo->maxFaceCount), 1);
466c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
467c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t histogramSize = 64;
468c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_BUCKET_COUNT,
469c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            &histogramSize, 1);
470c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
471c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t maxHistogramCount = 1000;
472c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_STATS_MAX_HISTOGRAM_COUNT,
473c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            &maxHistogramCount, 1);
474c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
475c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t sharpnessMapSize[2] = {64, 64};
476c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_SIZE,
477c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            sharpnessMapSize, sizeof(sharpnessMapSize)/sizeof(int32_t));
478c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
479c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t maxSharpnessMapValue = 1000;
480c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_STATS_MAX_SHARPNESS_MAP_VALUE,
481c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            &maxSharpnessMapValue, 1);
482c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
483c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    // android.control
484c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
485c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t availableSceneModes[] = {
4862bdec0603559f57a420e8926da22cc437e1336ecSungjoong Kang            ANDROID_CONTROL_SCENE_MODE_ACTION,
487daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang            ANDROID_CONTROL_SCENE_MODE_NIGHT,
4882bdec0603559f57a420e8926da22cc437e1336ecSungjoong Kang            ANDROID_CONTROL_SCENE_MODE_SUNSET,
4892bdec0603559f57a420e8926da22cc437e1336ecSungjoong Kang            ANDROID_CONTROL_SCENE_MODE_PARTY
490c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
491c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
492c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            availableSceneModes, sizeof(availableSceneModes));
493c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
494c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t availableEffects[] = {
495c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            ANDROID_CONTROL_EFFECT_OFF
496c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
497c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_EFFECTS,
498c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            availableEffects, sizeof(availableEffects));
499c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
5008e2c2fdbd940265e8413d512c3a0549bbc53c8a2Sungjoong Kang    int32_t max3aRegions = 1;
501c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_MAX_REGIONS,
502c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            &max3aRegions, 1);
503c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
504c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t availableAeModes[] = {
505c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            ANDROID_CONTROL_AE_OFF,
506fd2d78a2d270f85a71578423e1f2b4f99fd99216Sungjoong Kang            ANDROID_CONTROL_AE_ON,
507fd2d78a2d270f85a71578423e1f2b4f99fd99216Sungjoong Kang            ANDROID_CONTROL_AE_ON_AUTO_FLASH
508c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
509c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_MODES,
510c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            availableAeModes, sizeof(availableAeModes));
511c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
512c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const camera_metadata_rational exposureCompensationStep = {
5132bdec0603559f57a420e8926da22cc437e1336ecSungjoong Kang            1, 1
514c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
515c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP,
516c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            &exposureCompensationStep, 1);
517c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
5182bdec0603559f57a420e8926da22cc437e1336ecSungjoong Kang    int32_t exposureCompensationRange[] = {-3, 3};
519c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE,
520c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            exposureCompensationRange,
521c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            sizeof(exposureCompensationRange)/sizeof(int32_t));
522c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
523c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t availableTargetFpsRanges[] = {
524b8146879a137e53742fb20c2ac3cbb6bd8d3feb3Sungjoong Kang            15, 30, 30, 30
525c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
526c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
527c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            availableTargetFpsRanges,
528c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            sizeof(availableTargetFpsRanges)/sizeof(int32_t));
529c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
530c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t availableAntibandingModes[] = {
531c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            ANDROID_CONTROL_AE_ANTIBANDING_OFF,
532c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            ANDROID_CONTROL_AE_ANTIBANDING_AUTO
533c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
534c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
535c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            availableAntibandingModes, sizeof(availableAntibandingModes));
536c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
537c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t availableAwbModes[] = {
538c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            ANDROID_CONTROL_AWB_OFF,
539c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            ANDROID_CONTROL_AWB_AUTO,
540c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            ANDROID_CONTROL_AWB_INCANDESCENT,
541c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            ANDROID_CONTROL_AWB_FLUORESCENT,
542c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            ANDROID_CONTROL_AWB_DAYLIGHT,
5432bdec0603559f57a420e8926da22cc437e1336ecSungjoong Kang            ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT
544c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
545c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
546c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            availableAwbModes, sizeof(availableAwbModes));
547c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
548c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t availableAfModes[] = {
5490f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang            ANDROID_CONTROL_AF_OFF,
5500f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang            ANDROID_CONTROL_AF_AUTO,
5510f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang            ANDROID_CONTROL_AF_MACRO,
5520f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang            ANDROID_CONTROL_AF_CONTINUOUS_PICTURE,
5530f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang            ANDROID_CONTROL_AF_CONTINUOUS_VIDEO
554c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
555c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AF_AVAILABLE_MODES,
556c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            availableAfModes, sizeof(availableAfModes));
557c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
558c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t availableVstabModes[] = {
559a86f87c74965e066748af3632000737fb115b56fAlex Ray            ANDROID_CONTROL_VIDEO_STABILIZATION_OFF,
560a86f87c74965e066748af3632000737fb115b56fAlex Ray            ANDROID_CONTROL_VIDEO_STABILIZATION_ON
561c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
562c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
563c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            availableVstabModes, sizeof(availableVstabModes));
564c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
565c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#undef ADD_OR_SIZE
566c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    /** Allocate metadata if sizing */
567c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    if (sizeRequest) {
568c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        ALOGV("Allocating %d entries, %d extra bytes for "
569c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                "static camera info",
570c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                entryCount, dataCount);
571c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        *info = allocate_camera_metadata(entryCount, dataCount);
572c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        if (*info == NULL) {
573c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            ALOGE("Unable to allocate camera static info"
574c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                    "(%d entries, %d bytes extra data)",
575c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                    entryCount, dataCount);
576c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            return NO_MEMORY;
577c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        }
578c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    }
579c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    return OK;
580c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin}
581c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
582daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kangstatus_t ExynosCamera2::constructDefaultRequest(
583c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        int request_template,
584c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        camera_metadata_t **request,
585c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        bool sizeRequest) {
586c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
587c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    size_t entryCount = 0;
588c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    size_t dataCount = 0;
589c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    status_t ret;
590c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
591c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define ADD_OR_SIZE( tag, data, count ) \
592c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    if ( ( ret = addOrSize(*request, sizeRequest, &entryCount, &dataCount, \
593c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            tag, data, count) ) != OK ) return ret
594c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
595c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int64_t USEC = 1000LL;
596c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int64_t MSEC = USEC * 1000LL;
597c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int64_t SEC = MSEC * 1000LL;
598c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
599c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    /** android.request */
600c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
601c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t metadataMode = ANDROID_REQUEST_METADATA_NONE;
602c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_REQUEST_METADATA_MODE, &metadataMode, 1);
603c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
604c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t id = 0;
605c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_REQUEST_ID, &id, 1);
606c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
607c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t frameCount = 0;
608c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_REQUEST_FRAME_COUNT, &frameCount, 1);
609c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
610c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    // OUTPUT_STREAMS set by user
611c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    entryCount += 1;
612c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    dataCount += 5; // TODO: Should be maximum stream number
613c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
614c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    /** android.lens */
615c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
616c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const float focusDistance = 0;
617c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1);
618c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
6190f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    ADD_OR_SIZE(ANDROID_LENS_APERTURE, &m_curCameraInfo->aperture, 1);
620c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
6210f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    ADD_OR_SIZE(ANDROID_LENS_FOCAL_LENGTH, &m_curCameraInfo->focalLength, 1);
622c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
623c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const float filterDensity = 0;
624c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1);
625c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
626c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t opticalStabilizationMode =
627c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            ANDROID_LENS_OPTICAL_STABILIZATION_OFF;
628c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
629c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            &opticalStabilizationMode, 1);
630c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
631c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
632c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    /** android.sensor */
633c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
634c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
635c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int64_t frameDuration = 33333333L; // 1/30 s
636c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1);
637c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
638c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
639c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    /** android.flash */
640c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
641c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t flashMode = ANDROID_FLASH_OFF;
642c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_FLASH_MODE, &flashMode, 1);
643c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
644c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t flashPower = 10;
645c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_FLASH_FIRING_POWER, &flashPower, 1);
646c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
647c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int64_t firingTime = 0;
648c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_FLASH_FIRING_TIME, &firingTime, 1);
649c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
650c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    /** Processing block modes */
651c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    uint8_t hotPixelMode = 0;
652c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    uint8_t demosaicMode = 0;
653c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    uint8_t noiseMode = 0;
654c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    uint8_t shadingMode = 0;
655c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    uint8_t geometricMode = 0;
656c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    uint8_t colorMode = 0;
657c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    uint8_t tonemapMode = 0;
658c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    uint8_t edgeMode = 0;
659fac627c49392731fe561f548e5c87be3510364d6Sungjoong Kang    uint8_t vstabMode = 0;
660fac627c49392731fe561f548e5c87be3510364d6Sungjoong Kang
661c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    switch (request_template) {
662c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      case CAMERA2_TEMPLATE_PREVIEW:
663c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        hotPixelMode = ANDROID_PROCESSING_FAST;
664c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        demosaicMode = ANDROID_PROCESSING_FAST;
665c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        noiseMode = ANDROID_PROCESSING_FAST;
666c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        shadingMode = ANDROID_PROCESSING_FAST;
667c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        geometricMode = ANDROID_PROCESSING_FAST;
668c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        colorMode = ANDROID_PROCESSING_FAST;
669c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        tonemapMode = ANDROID_PROCESSING_FAST;
670c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        edgeMode = ANDROID_PROCESSING_FAST;
671fac627c49392731fe561f548e5c87be3510364d6Sungjoong Kang        vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
672c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
673c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      case CAMERA2_TEMPLATE_STILL_CAPTURE:
674c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
675c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
676c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
677c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
678c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
679c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
680c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
681c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
682fac627c49392731fe561f548e5c87be3510364d6Sungjoong Kang        vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
683c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
684c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      case CAMERA2_TEMPLATE_VIDEO_RECORD:
685c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        hotPixelMode = ANDROID_PROCESSING_FAST;
686c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        demosaicMode = ANDROID_PROCESSING_FAST;
687c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        noiseMode = ANDROID_PROCESSING_FAST;
688c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        shadingMode = ANDROID_PROCESSING_FAST;
689c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        geometricMode = ANDROID_PROCESSING_FAST;
690c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        colorMode = ANDROID_PROCESSING_FAST;
691c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        tonemapMode = ANDROID_PROCESSING_FAST;
692c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        edgeMode = ANDROID_PROCESSING_FAST;
693fac627c49392731fe561f548e5c87be3510364d6Sungjoong Kang        vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_ON;
694c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
695c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
696c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
697c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
698c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
699c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
700c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
701c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
702c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
703c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
704fac627c49392731fe561f548e5c87be3510364d6Sungjoong Kang        vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_ON;
705c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
706c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
707c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
708c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
709c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
710c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
711c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
712c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
713c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
714c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
715fac627c49392731fe561f548e5c87be3510364d6Sungjoong Kang        vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
716c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
717c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      default:
718c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        hotPixelMode = ANDROID_PROCESSING_FAST;
719c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        demosaicMode = ANDROID_PROCESSING_FAST;
720c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        noiseMode = ANDROID_PROCESSING_FAST;
721c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        shadingMode = ANDROID_PROCESSING_FAST;
722c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        geometricMode = ANDROID_PROCESSING_FAST;
723c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        colorMode = ANDROID_PROCESSING_FAST;
724c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        tonemapMode = ANDROID_PROCESSING_FAST;
725c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        edgeMode = ANDROID_PROCESSING_FAST;
726fac627c49392731fe561f548e5c87be3510364d6Sungjoong Kang        vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
727c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
728c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    }
729c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1);
730c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_DEMOSAIC_MODE, &demosaicMode, 1);
731c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_NOISE_MODE, &noiseMode, 1);
732c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_SHADING_MODE, &shadingMode, 1);
733c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_GEOMETRIC_MODE, &geometricMode, 1);
734c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_COLOR_MODE, &colorMode, 1);
735c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_TONEMAP_MODE, &tonemapMode, 1);
736c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_EDGE_MODE, &edgeMode, 1);
737fac627c49392731fe561f548e5c87be3510364d6Sungjoong Kang    ADD_OR_SIZE(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vstabMode, 1);
738c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
739c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    /** android.noise */
740c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t noiseStrength = 5;
741c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_NOISE_STRENGTH, &noiseStrength, 1);
742c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
743c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    /** android.color */
744c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const float colorTransform[9] = {
745c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        1.0f, 0.f, 0.f,
746c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        0.f, 1.f, 0.f,
747c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        0.f, 0.f, 1.f
748c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
749c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_COLOR_TRANSFORM, colorTransform, 9);
750c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
751c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    /** android.tonemap */
752c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const float tonemapCurve[4] = {
753c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        0.f, 0.f,
754c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        1.f, 1.f
755c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
756c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_RED, tonemapCurve, 32); // sungjoong
757c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_GREEN, tonemapCurve, 32);
758c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_BLUE, tonemapCurve, 32);
759c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
760c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    /** android.edge */
761c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t edgeStrength = 5;
762c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_EDGE_STRENGTH, &edgeStrength, 1);
763c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
764c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    /** android.scaler */
765daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    int32_t cropRegion[3] = {
766daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        0, 0, m_curCameraInfo->sensorW
767c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
768c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_SCALER_CROP_REGION, cropRegion, 3);
769c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
770c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    /** android.jpeg */
771c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t jpegQuality = 80;
772c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_JPEG_QUALITY, &jpegQuality, 1);
773c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
774c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t thumbnailSize[2] = {
7752d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang        160, 120
776c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
777c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSize, 2);
778c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
779c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t thumbnailQuality = 80;
780c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnailQuality, 1);
781c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
782daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    static const double gpsCoordinates[3] = {
783daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        0, 0, 0
784c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
785daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    ADD_OR_SIZE(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 3);
786c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
787c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t gpsProcessingMethod[32] = "None";
788c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_JPEG_GPS_PROCESSING_METHOD, gpsProcessingMethod, 32);
789c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
790c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int64_t gpsTimestamp = 0;
791c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_JPEG_GPS_TIMESTAMP, &gpsTimestamp, 1);
792c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
793c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t jpegOrientation = 0;
794c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1);
795c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
796c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    /** android.stats */
797c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
798fd2d78a2d270f85a71578423e1f2b4f99fd99216Sungjoong Kang    static const uint8_t faceDetectMode = ANDROID_STATS_FACE_DETECTION_FULL;
799c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_STATS_FACE_DETECT_MODE, &faceDetectMode, 1);
800c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
801c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t histogramMode = ANDROID_STATS_OFF;
802c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_MODE, &histogramMode, 1);
803c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
804c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t sharpnessMapMode = ANDROID_STATS_OFF;
805c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1);
806c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
807c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
808c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    /** android.control */
809c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
810c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    uint8_t controlIntent = 0;
811c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    switch (request_template) {
812c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      case CAMERA2_TEMPLATE_PREVIEW:
813c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        controlIntent = ANDROID_CONTROL_INTENT_PREVIEW;
814c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
815c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      case CAMERA2_TEMPLATE_STILL_CAPTURE:
816c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        controlIntent = ANDROID_CONTROL_INTENT_STILL_CAPTURE;
817c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
818c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      case CAMERA2_TEMPLATE_VIDEO_RECORD:
819c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        controlIntent = ANDROID_CONTROL_INTENT_VIDEO_RECORD;
820c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
821c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
822c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        controlIntent = ANDROID_CONTROL_INTENT_VIDEO_SNAPSHOT;
823c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
824c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
825c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        controlIntent = ANDROID_CONTROL_INTENT_ZERO_SHUTTER_LAG;
826c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
827c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      default:
828c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        controlIntent = ANDROID_CONTROL_INTENT_CUSTOM;
829c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
830c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    }
831c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
832c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
833c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t controlMode = ANDROID_CONTROL_AUTO;
834c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_MODE, &controlMode, 1);
835c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
836c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_OFF;
837c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
838c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
839daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED;
840c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
841c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
842daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    static const uint8_t aeMode = ANDROID_CONTROL_AE_ON;
843c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
844c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
845daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    int32_t controlRegions[5] = {
846daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang        0, 0, m_curCameraInfo->sensorW, m_curCameraInfo->sensorH, 1000
847c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
848c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AE_REGIONS, controlRegions, 5);
849c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
850c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t aeExpCompensation = 0;
851c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION, &aeExpCompensation, 1);
852c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
853c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const int32_t aeTargetFpsRange[2] = {
854b8146879a137e53742fb20c2ac3cbb6bd8d3feb3Sungjoong Kang        15, 30
855c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
856c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange, 2);
857c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
858c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t aeAntibandingMode =
859c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
860c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &aeAntibandingMode, 1);
861c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
862c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    static const uint8_t awbMode =
863c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            ANDROID_CONTROL_AWB_AUTO;
864c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
865c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
866c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AWB_REGIONS, controlRegions, 5);
867c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
868c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    uint8_t afMode = 0;
869c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    switch (request_template) {
870c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      case CAMERA2_TEMPLATE_PREVIEW:
8710f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang        afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE;
872c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
873c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      case CAMERA2_TEMPLATE_STILL_CAPTURE:
8740f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang        afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE;
875c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
876c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      case CAMERA2_TEMPLATE_VIDEO_RECORD:
877c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO;
878c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
879c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
880c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO;
881c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
882c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
883c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE;
884c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
885c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin      default:
886c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        afMode = ANDROID_CONTROL_AF_AUTO;
887c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        break;
888c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    }
889c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AF_MODE, &afMode, 1);
890c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
891c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ADD_OR_SIZE(ANDROID_CONTROL_AF_REGIONS, controlRegions, 5);
892c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
893c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    if (sizeRequest) {
894c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        ALOGV("Allocating %d entries, %d extra bytes for "
895c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                "request template type %d",
896c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                entryCount, dataCount, request_template);
897c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        *request = allocate_camera_metadata(entryCount, dataCount);
898c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        if (*request == NULL) {
899c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            ALOGE("Unable to allocate new request template type %d "
900c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                    "(%d entries, %d bytes extra data)", request_template,
901c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                    entryCount, dataCount);
902c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            return NO_MEMORY;
903c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        }
904c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    }
905c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    return OK;
906c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#undef ADD_OR_SIZE
907c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin}
908c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
909c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin}
910