Home | History | Annotate | Download | only in libcamera2
      1 /*
      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 (at) samsung.com)
     23  * \date      2012/08/06
     24  *
     25  * <b>Revision History: </b>
     26  * - 2012/08/06 : Sungjoong Kang(sj3.kang (at) samsung.com) \n
     27  *   Initial Release
     28  *
     29  */
     30 
     31 //#define LOG_NDEBUG 0
     32 #define LOG_TAG "ExynosCamera2"
     33 #include <utils/Log.h>
     34 
     35 #include "ExynosCamera2.h"
     36 
     37 #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
     38 
     39 namespace android {
     40 
     41 class Sensor {
     42 public:
     43     /**
     44      * Static sensor characteristics
     45      */
     46     static const unsigned int kResolution[2][2];
     47 
     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 
     80 };
     81 
     82 
     83 
     84 const uint32_t Sensor::kAvailableSensitivities[5] =
     85     {100, 200, 400, 800, 1600};
     86 const nsecs_t Sensor::kExposureTimeRange[2] =
     87     {1000L, 30000000000L} ; // 1 us - 30 sec
     88 const nsecs_t Sensor::kFrameDurationRange[2] =
     89     {33331760L, 30000000000L}; // ~1/30 s - 30 sec
     90 
     91 const uint8_t Sensor::kColorFilterArrangement = ANDROID_SENSOR_RGGB;
     92 
     93 const uint32_t kAvailableFormats[5] = {
     94         HAL_PIXEL_FORMAT_RAW_SENSOR,
     95         HAL_PIXEL_FORMAT_BLOB,
     96         HAL_PIXEL_FORMAT_RGBA_8888,
     97         HAL_PIXEL_FORMAT_YV12,
     98         HAL_PIXEL_FORMAT_YCrCb_420_SP
     99 };
    100 
    101 // Output image data characteristics
    102 const uint32_t Sensor::kMaxRawValue = 4000;
    103 const uint32_t Sensor::kBlackLevel  = 1000;
    104 
    105 const uint64_t kAvailableRawMinDurations[1] = {
    106     Sensor::kFrameDurationRange[0]
    107 };
    108 
    109 const uint64_t kAvailableProcessedMinDurations[1] = {
    110     Sensor::kFrameDurationRange[0]
    111 };
    112 const uint64_t kAvailableJpegMinDurations[1] = {
    113     Sensor::kFrameDurationRange[0]
    114 };
    115 
    116 const int32_t scalerResolutionS5K4E5[] =
    117 {
    118     1920, 1080, // 16:9
    119     1440, 1080, // 4:3
    120     1440,  960, // 3:2
    121     1280, 1024, // 5:4
    122     1280,  720, // 16:9
    123      960,  720, // 4:3
    124      800,  480, // 5:3
    125      768,  576, // 4:3
    126      720,  576, // 5:4
    127      720,  480, // 3:2
    128      640,  480, // 4:3
    129      352,  288, // 11:9
    130      320,  240, // 4:3
    131      240,  160, // 3:2
    132      176,  144, // 6:5
    133      128,   96, // 4:3
    134 };
    135 
    136 const int32_t jpegResolutionS5K4E5[] =
    137 {
    138     2560, 1920,
    139     2560, 1440,
    140     2160, 1440,
    141     2048, 1536,
    142     1600, 1200,
    143     1280, 1024,
    144     1280,  960,
    145     1152,  864,
    146      640,  480,
    147      320,  240,
    148 };
    149 
    150 const uint8_t availableAfModesS5K4E5[] =
    151 {
    152     ANDROID_CONTROL_AF_OFF,
    153     ANDROID_CONTROL_AF_AUTO,
    154     ANDROID_CONTROL_AF_MACRO,
    155     ANDROID_CONTROL_AF_CONTINUOUS_PICTURE,
    156     ANDROID_CONTROL_AF_CONTINUOUS_VIDEO
    157 };
    158 
    159 const uint8_t sceneModeOverridesS5K4E5[] =
    160 {
    161     // ANDROID_CONTROL_SCENE_MODE_ACTION
    162     ANDROID_CONTROL_AE_ON,
    163     ANDROID_CONTROL_AWB_AUTO,
    164     ANDROID_CONTROL_AF_CONTINUOUS_PICTURE,
    165     // ANDROID_CONTROL_SCENE_MODE_NIGHT
    166     ANDROID_CONTROL_AE_ON,
    167     ANDROID_CONTROL_AWB_AUTO,
    168     ANDROID_CONTROL_AF_CONTINUOUS_PICTURE,
    169     // ANDROID_CONTROL_SCENE_MODE_SUNSET
    170     ANDROID_CONTROL_AE_ON,
    171     ANDROID_CONTROL_AWB_DAYLIGHT,
    172     ANDROID_CONTROL_AF_CONTINUOUS_PICTURE,
    173     // ANDROID_CONTROL_SCENE_MODE_PARTY
    174     ANDROID_CONTROL_AE_ON_AUTO_FLASH,
    175     ANDROID_CONTROL_AWB_AUTO,
    176     ANDROID_CONTROL_AF_CONTINUOUS_PICTURE
    177 };
    178 
    179 const uint8_t availableAeModesS5K4E5[] =
    180 {
    181     ANDROID_CONTROL_AE_OFF,
    182     ANDROID_CONTROL_AE_ON,
    183     ANDROID_CONTROL_AE_ON_AUTO_FLASH
    184 };
    185 
    186 ExynosCamera2InfoS5K4E5::ExynosCamera2InfoS5K4E5()
    187 {
    188     sensorW             = 2560;
    189     sensorH             = 1920;
    190     sensorRawW          = (2560 + 16);
    191     sensorRawH          = (1920 + 10);
    192     numScalerResolution = ARRAY_SIZE(scalerResolutionS5K4E5)/2;
    193     scalerResolutions   = scalerResolutionS5K4E5;
    194     numJpegResolution   = ARRAY_SIZE(jpegResolutionS5K4E5)/2;
    195     jpegResolutions     = jpegResolutionS5K4E5;
    196     minFocusDistance    = 0.1f;
    197     focalLength         = 3.43f;
    198     aperture            = 2.7f;
    199     fnumber             = 2.7f;
    200     availableAfModes    = availableAfModesS5K4E5;
    201     numAvailableAfModes = ARRAY_SIZE(availableAfModesS5K4E5);
    202     sceneModeOverrides  = sceneModeOverridesS5K4E5;
    203     numSceneModeOverrides = ARRAY_SIZE(sceneModeOverridesS5K4E5);
    204     availableAeModes    = availableAeModesS5K4E5;
    205     numAvailableAeModes = ARRAY_SIZE(availableAeModesS5K4E5);
    206 }
    207 
    208 ExynosCamera2InfoS5K4E5::~ExynosCamera2InfoS5K4E5()
    209 {
    210     ALOGV("%s", __FUNCTION__);
    211 }
    212 const int32_t scalerResolutionS5K6A3[] =
    213 {
    214     1344,  896, // 3:2
    215     1280, 1024, // 5:4
    216     1024, 1024, // 1:1
    217     1280,  960, // 4:3
    218     1280,  720, // 16:9
    219      960,  720, // 4:3
    220      800,  480, // 5:3
    221      768,  576, // 4:3
    222      720,  576, // 5:4
    223      720,  480, // 3:2
    224      640,  480, // 4:3
    225      352,  288, // 11:9
    226      320,  240, // 4:3
    227      240,  160, // 3:2
    228      176,  144, // 6:5
    229      128,   96, // 4:3
    230 };
    231 
    232 const int32_t jpegResolutionS5K6A3[] =
    233 {
    234     1392, 1392,
    235     1392, 1040,
    236     1392,  928,
    237     1392,  784,
    238     1280, 1024,
    239     1280,  960,
    240     1280,  720,
    241     1152,  864,
    242      640,  480,
    243      320,  240,
    244 };
    245 
    246 const uint8_t availableAfModesS5K6A3[] =
    247 {
    248     ANDROID_CONTROL_AF_OFF
    249 };
    250 
    251 const uint8_t sceneModeOverridesS5K6A3[] =
    252 {
    253     // ANDROID_CONTROL_SCENE_MODE_ACTION
    254     ANDROID_CONTROL_AE_ON,
    255     ANDROID_CONTROL_AWB_AUTO,
    256     ANDROID_CONTROL_AF_OFF,
    257     // ANDROID_CONTROL_SCENE_MODE_NIGHT
    258     ANDROID_CONTROL_AE_ON,
    259     ANDROID_CONTROL_AWB_AUTO,
    260     ANDROID_CONTROL_AF_OFF,
    261     // ANDROID_CONTROL_SCENE_MODE_SUNSET
    262     ANDROID_CONTROL_AE_ON,
    263     ANDROID_CONTROL_AWB_DAYLIGHT,
    264     ANDROID_CONTROL_AF_OFF,
    265     // ANDROID_CONTROL_SCENE_MODE_PARTY
    266     ANDROID_CONTROL_AE_ON,
    267     ANDROID_CONTROL_AWB_AUTO,
    268     ANDROID_CONTROL_AF_OFF
    269 };
    270 
    271 const uint8_t availableAeModesS5K6A3[] =
    272 {
    273     ANDROID_CONTROL_AE_OFF,
    274     ANDROID_CONTROL_AE_ON
    275 };
    276 
    277 ExynosCamera2InfoS5K6A3::ExynosCamera2InfoS5K6A3()
    278 {
    279     sensorW     = 1392;
    280     sensorH     = 1392;
    281     sensorRawW  = (1392 + 16);
    282     sensorRawH  = (1392 + 10);
    283     numScalerResolution = ARRAY_SIZE(scalerResolutionS5K6A3)/2;
    284     scalerResolutions   = scalerResolutionS5K6A3;
    285     numJpegResolution   = ARRAY_SIZE(jpegResolutionS5K6A3)/2;
    286     jpegResolutions     = jpegResolutionS5K6A3;
    287     minFocusDistance    = 0.0f;
    288     focalLength         = 2.73f;
    289     aperture            = 2.8f;
    290     fnumber             = 2.8f;
    291     availableAfModes    = availableAfModesS5K6A3;
    292     numAvailableAfModes = ARRAY_SIZE(availableAfModesS5K6A3);
    293     sceneModeOverrides  = sceneModeOverridesS5K6A3;
    294     numSceneModeOverrides = ARRAY_SIZE(sceneModeOverridesS5K6A3);
    295     availableAeModes    = availableAeModesS5K6A3;
    296     numAvailableAeModes = ARRAY_SIZE(availableAeModesS5K6A3);
    297 }
    298 
    299 ExynosCamera2InfoS5K6A3::~ExynosCamera2InfoS5K6A3()
    300 {
    301     ALOGV("%s", __FUNCTION__);
    302 }
    303 ExynosCamera2::ExynosCamera2(int cameraId):
    304     m_cameraId(cameraId)
    305 {
    306     if (cameraId == 0)
    307         m_curCameraInfo      = new ExynosCamera2InfoS5K4E5;
    308     else
    309         m_curCameraInfo      = new ExynosCamera2InfoS5K6A3;
    310 }
    311 
    312 ExynosCamera2::~ExynosCamera2()
    313 {
    314     ALOGV("%s", __FUNCTION__);
    315 	delete m_curCameraInfo;
    316     m_curCameraInfo = NULL;
    317 }
    318 
    319 int32_t ExynosCamera2::getSensorW()
    320 {
    321     return m_curCameraInfo->sensorW;
    322 }
    323 
    324 int32_t ExynosCamera2::getSensorH()
    325 {
    326     return m_curCameraInfo->sensorH;
    327 }
    328 
    329 int32_t ExynosCamera2::getSensorRawW()
    330 {
    331     return m_curCameraInfo->sensorRawW;
    332 }
    333 
    334 int32_t ExynosCamera2::getSensorRawH()
    335 {
    336     return m_curCameraInfo->sensorRawH;
    337 }
    338 
    339 bool ExynosCamera2::isSupportedResolution(int width, int height)
    340 {
    341     int i;
    342     for (i = 0 ; i < m_curCameraInfo->numScalerResolution ; i++) {
    343         if (m_curCameraInfo->scalerResolutions[2*i] == width
    344                 && m_curCameraInfo->scalerResolutions[2*i+1] == height) {
    345             return true;
    346         }
    347     }
    348     return false;
    349 }
    350 
    351 bool ExynosCamera2::isSupportedJpegResolution(int width, int height)
    352 {
    353     int i;
    354     for (i = 0 ; i < m_curCameraInfo->numJpegResolution ; i++) {
    355         if (m_curCameraInfo->jpegResolutions[2*i] == width
    356                 && m_curCameraInfo->jpegResolutions[2*i+1] == height) {
    357             return true;
    358         }
    359     }
    360     return false;
    361 }
    362 
    363 status_t addOrSize(camera_metadata_t *request,
    364         bool sizeRequest,
    365         size_t *entryCount,
    366         size_t *dataCount,
    367         uint32_t tag,
    368         const void *entryData,
    369         size_t entryDataCount) {
    370     status_t res;
    371     if (!sizeRequest) {
    372         return add_camera_metadata_entry(request, tag, entryData,
    373                 entryDataCount);
    374     } else {
    375         int type = get_camera_metadata_tag_type(tag);
    376         if (type < 0 ) return BAD_VALUE;
    377         (*entryCount)++;
    378         (*dataCount) += calculate_camera_metadata_entry_data_size(type,
    379                 entryDataCount);
    380         return OK;
    381     }
    382 }
    383 
    384 status_t ExynosCamera2::constructStaticInfo(camera_metadata_t **info,
    385         int cameraId, bool sizeRequest) {
    386 
    387     size_t entryCount = 0;
    388     size_t dataCount = 0;
    389     status_t ret;
    390 
    391 #define ADD_OR_SIZE( tag, data, count ) \
    392     if ( ( ret = addOrSize(*info, sizeRequest, &entryCount, &dataCount, \
    393             tag, data, count) ) != OK ) return ret
    394 
    395     // android.lens
    396 
    397     ADD_OR_SIZE(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE,
    398             &(m_curCameraInfo->minFocusDistance), 1);
    399     ADD_OR_SIZE(ANDROID_LENS_HYPERFOCAL_DISTANCE,
    400             &(m_curCameraInfo->minFocusDistance), 1);
    401 
    402     ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS,
    403             &m_curCameraInfo->focalLength, 1);
    404     ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_APERTURES,
    405             &m_curCameraInfo->aperture, 1);
    406 
    407     static const float filterDensity = 0;
    408     ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FILTER_DENSITY,
    409             &filterDensity, 1);
    410     static const uint8_t availableOpticalStabilization =
    411             ANDROID_LENS_OPTICAL_STABILIZATION_OFF;
    412     ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_OPTICAL_STABILIZATION,
    413             &availableOpticalStabilization, 1);
    414 
    415     static const int32_t lensShadingMapSize[] = {1, 1};
    416     ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP_SIZE, lensShadingMapSize,
    417             sizeof(lensShadingMapSize)/sizeof(int32_t));
    418 
    419     static const float lensShadingMap[3 * 1 * 1 ] =
    420             { 1.f, 1.f, 1.f };
    421     ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP, lensShadingMap,
    422             sizeof(lensShadingMap)/sizeof(float));
    423 
    424     int32_t lensFacing = cameraId ?
    425             ANDROID_LENS_FACING_FRONT : ANDROID_LENS_FACING_BACK;
    426     ADD_OR_SIZE(ANDROID_LENS_FACING, &lensFacing, 1);
    427 
    428     // android.sensor
    429     ADD_OR_SIZE(ANDROID_SENSOR_EXPOSURE_TIME_RANGE,
    430             Sensor::kExposureTimeRange, 2);
    431 
    432     ADD_OR_SIZE(ANDROID_SENSOR_MAX_FRAME_DURATION,
    433             &Sensor::kFrameDurationRange[1], 1);
    434 
    435     ADD_OR_SIZE(ANDROID_SENSOR_AVAILABLE_SENSITIVITIES,
    436             Sensor::kAvailableSensitivities,
    437             sizeof(Sensor::kAvailableSensitivities)
    438             /sizeof(uint32_t));
    439 
    440     ADD_OR_SIZE(ANDROID_SENSOR_COLOR_FILTER_ARRANGEMENT,
    441             &Sensor::kColorFilterArrangement, 1);
    442 
    443     static const float sensorPhysicalSize[2] = {3.20f, 2.40f}; // mm
    444     ADD_OR_SIZE(ANDROID_SENSOR_PHYSICAL_SIZE,
    445             sensorPhysicalSize, 2);
    446 
    447     int32_t pixelArraySize[2] = {
    448         m_curCameraInfo->sensorW, m_curCameraInfo->sensorH
    449     };
    450     ADD_OR_SIZE(ANDROID_SENSOR_PIXEL_ARRAY_SIZE, pixelArraySize, 2);
    451     ADD_OR_SIZE(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, pixelArraySize,2);
    452 
    453     ADD_OR_SIZE(ANDROID_SENSOR_WHITE_LEVEL,
    454             &Sensor::kMaxRawValue, 1);
    455 
    456     static const int32_t blackLevelPattern[4] = {
    457             Sensor::kBlackLevel, Sensor::kBlackLevel,
    458             Sensor::kBlackLevel, Sensor::kBlackLevel
    459     };
    460     ADD_OR_SIZE(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
    461             blackLevelPattern, sizeof(blackLevelPattern)/sizeof(int32_t));
    462 
    463     //TODO: sensor color calibration fields
    464 
    465     // android.flash
    466     uint8_t flashAvailable;
    467     if (cameraId == 0)
    468         flashAvailable = 1;
    469     else
    470         flashAvailable = 0;
    471     ADD_OR_SIZE(ANDROID_FLASH_AVAILABLE, &flashAvailable, 1);
    472 
    473     static const int64_t flashChargeDuration = 0;
    474     ADD_OR_SIZE(ANDROID_FLASH_CHARGE_DURATION, &flashChargeDuration, 1);
    475 
    476     // android.tonemap
    477 
    478     static const int32_t tonemapCurvePoints = 128;
    479     ADD_OR_SIZE(ANDROID_TONEMAP_MAX_CURVE_POINTS, &tonemapCurvePoints, 1);
    480 
    481     // android.scaler
    482 
    483     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_FORMATS,
    484             kAvailableFormats,
    485             sizeof(kAvailableFormats)/sizeof(uint32_t));
    486 
    487     int32_t availableRawSizes[2] = {
    488         m_curCameraInfo->sensorRawW, m_curCameraInfo->sensorRawH
    489     };
    490     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
    491             availableRawSizes, 2);
    492 
    493     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
    494             kAvailableRawMinDurations,
    495             sizeof(kAvailableRawMinDurations)/sizeof(uint64_t));
    496 
    497 
    498     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
    499         m_curCameraInfo->scalerResolutions,
    500         (m_curCameraInfo->numScalerResolution)*2);
    501     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
    502         m_curCameraInfo->jpegResolutions,
    503         (m_curCameraInfo->numJpegResolution)*2);
    504 
    505     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
    506             kAvailableProcessedMinDurations,
    507             sizeof(kAvailableProcessedMinDurations)/sizeof(uint64_t));
    508 
    509     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
    510             kAvailableJpegMinDurations,
    511             sizeof(kAvailableJpegMinDurations)/sizeof(uint64_t));
    512 
    513     static const float maxZoom = 4;
    514     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, &maxZoom, 1);
    515 
    516     // android.jpeg
    517 
    518     static const int32_t jpegThumbnailSizes[] = {
    519             160, 120,
    520             160, 160,
    521             160, 90,
    522             144, 96,
    523               0, 0
    524     };
    525 
    526     ADD_OR_SIZE(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
    527             jpegThumbnailSizes, sizeof(jpegThumbnailSizes)/sizeof(int32_t));
    528 
    529     static const int32_t jpegMaxSize = 10 * 1024 * 1024;
    530     ADD_OR_SIZE(ANDROID_JPEG_MAX_SIZE, &jpegMaxSize, 1);
    531 
    532     // android.stats
    533 
    534     static const uint8_t availableFaceDetectModes[] = {
    535             ANDROID_STATS_FACE_DETECTION_OFF,
    536             ANDROID_STATS_FACE_DETECTION_FULL
    537     };
    538     ADD_OR_SIZE(ANDROID_STATS_AVAILABLE_FACE_DETECT_MODES,
    539             availableFaceDetectModes,
    540             sizeof(availableFaceDetectModes));
    541 
    542     m_curCameraInfo->maxFaceCount = CAMERA2_MAX_FACES;
    543     ADD_OR_SIZE(ANDROID_STATS_MAX_FACE_COUNT,
    544             &(m_curCameraInfo->maxFaceCount), 1);
    545 
    546     static const int32_t histogramSize = 64;
    547     ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_BUCKET_COUNT,
    548             &histogramSize, 1);
    549 
    550     static const int32_t maxHistogramCount = 1000;
    551     ADD_OR_SIZE(ANDROID_STATS_MAX_HISTOGRAM_COUNT,
    552             &maxHistogramCount, 1);
    553 
    554     static const int32_t sharpnessMapSize[2] = {64, 64};
    555     ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_SIZE,
    556             sharpnessMapSize, sizeof(sharpnessMapSize)/sizeof(int32_t));
    557 
    558     static const int32_t maxSharpnessMapValue = 1000;
    559     ADD_OR_SIZE(ANDROID_STATS_MAX_SHARPNESS_MAP_VALUE,
    560             &maxSharpnessMapValue, 1);
    561 
    562     // android.control
    563 
    564     static const uint8_t availableSceneModes[] = {
    565             ANDROID_CONTROL_SCENE_MODE_ACTION,
    566             ANDROID_CONTROL_SCENE_MODE_NIGHT,
    567             ANDROID_CONTROL_SCENE_MODE_SUNSET,
    568             ANDROID_CONTROL_SCENE_MODE_PARTY
    569     };
    570     ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
    571             availableSceneModes, sizeof(availableSceneModes));
    572 
    573     static const uint8_t availableEffects[] = {
    574             ANDROID_CONTROL_EFFECT_OFF
    575     };
    576     ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_EFFECTS,
    577             availableEffects, sizeof(availableEffects));
    578 
    579     int32_t max3aRegions = 1;
    580     ADD_OR_SIZE(ANDROID_CONTROL_MAX_REGIONS,
    581             &max3aRegions, 1);
    582 
    583     ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_MODES,
    584             m_curCameraInfo->availableAeModes, m_curCameraInfo->numAvailableAeModes);
    585 
    586     static const camera_metadata_rational exposureCompensationStep = {
    587             1, 1
    588     };
    589     ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP,
    590             &exposureCompensationStep, 1);
    591 
    592     int32_t exposureCompensationRange[] = {-3, 3};
    593     ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE,
    594             exposureCompensationRange,
    595             sizeof(exposureCompensationRange)/sizeof(int32_t));
    596 
    597     static const int32_t availableTargetFpsRanges[] = {
    598             15, 15, 24, 24, 25, 25, 15, 30, 30, 30
    599     };
    600     ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
    601             availableTargetFpsRanges,
    602             sizeof(availableTargetFpsRanges)/sizeof(int32_t));
    603 
    604     static const uint8_t availableAntibandingModes[] = {
    605             ANDROID_CONTROL_AE_ANTIBANDING_OFF,
    606             ANDROID_CONTROL_AE_ANTIBANDING_AUTO
    607     };
    608     ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
    609             availableAntibandingModes, sizeof(availableAntibandingModes));
    610 
    611     static const uint8_t availableAwbModes[] = {
    612             ANDROID_CONTROL_AWB_OFF,
    613             ANDROID_CONTROL_AWB_AUTO,
    614             ANDROID_CONTROL_AWB_INCANDESCENT,
    615             ANDROID_CONTROL_AWB_FLUORESCENT,
    616             ANDROID_CONTROL_AWB_DAYLIGHT,
    617             ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT
    618     };
    619     ADD_OR_SIZE(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
    620             availableAwbModes, sizeof(availableAwbModes));
    621 
    622     ADD_OR_SIZE(ANDROID_CONTROL_AF_AVAILABLE_MODES,
    623                 m_curCameraInfo->availableAfModes, m_curCameraInfo->numAvailableAfModes);
    624 
    625     static const uint8_t availableVstabModes[] = {
    626             ANDROID_CONTROL_VIDEO_STABILIZATION_OFF,
    627             ANDROID_CONTROL_VIDEO_STABILIZATION_ON
    628     };
    629     ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
    630             availableVstabModes, sizeof(availableVstabModes));
    631 
    632     ADD_OR_SIZE(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
    633             m_curCameraInfo->sceneModeOverrides, m_curCameraInfo->numSceneModeOverrides);
    634 
    635     static const uint8_t quirkTriggerAuto = 1;
    636     ADD_OR_SIZE(ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO,
    637             &quirkTriggerAuto, 1);
    638 
    639     static const uint8_t quirkUseZslFormat = 1;
    640     ADD_OR_SIZE(ANDROID_QUIRKS_USE_ZSL_FORMAT,
    641             &quirkUseZslFormat, 1);
    642 
    643     static const uint8_t quirkMeteringCropRegion = 1;
    644     ADD_OR_SIZE(ANDROID_QUIRKS_METERING_CROP_REGION,
    645             &quirkMeteringCropRegion, 1);
    646 
    647 
    648 #undef ADD_OR_SIZE
    649     /** Allocate metadata if sizing */
    650     if (sizeRequest) {
    651         ALOGV("Allocating %d entries, %d extra bytes for "
    652                 "static camera info",
    653                 entryCount, dataCount);
    654         *info = allocate_camera_metadata(entryCount, dataCount);
    655         if (*info == NULL) {
    656             ALOGE("Unable to allocate camera static info"
    657                     "(%d entries, %d bytes extra data)",
    658                     entryCount, dataCount);
    659             return NO_MEMORY;
    660         }
    661     }
    662     return OK;
    663 }
    664 
    665 status_t ExynosCamera2::constructDefaultRequest(
    666         int request_template,
    667         camera_metadata_t **request,
    668         bool sizeRequest) {
    669 
    670     size_t entryCount = 0;
    671     size_t dataCount = 0;
    672     status_t ret;
    673 
    674 #define ADD_OR_SIZE( tag, data, count ) \
    675     if ( ( ret = addOrSize(*request, sizeRequest, &entryCount, &dataCount, \
    676             tag, data, count) ) != OK ) return ret
    677 
    678     static const int64_t USEC = 1000LL;
    679     static const int64_t MSEC = USEC * 1000LL;
    680     static const int64_t SEC = MSEC * 1000LL;
    681 
    682     /** android.request */
    683 
    684     static const uint8_t metadataMode = ANDROID_REQUEST_METADATA_NONE;
    685     ADD_OR_SIZE(ANDROID_REQUEST_METADATA_MODE, &metadataMode, 1);
    686 
    687     static const int32_t id = 0;
    688     ADD_OR_SIZE(ANDROID_REQUEST_ID, &id, 1);
    689 
    690     static const int32_t frameCount = 0;
    691     ADD_OR_SIZE(ANDROID_REQUEST_FRAME_COUNT, &frameCount, 1);
    692 
    693     // OUTPUT_STREAMS set by user
    694     entryCount += 1;
    695     dataCount += 5; // TODO: Should be maximum stream number
    696 
    697     /** android.lens */
    698 
    699     static const float focusDistance = 0;
    700     ADD_OR_SIZE(ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1);
    701 
    702     ADD_OR_SIZE(ANDROID_LENS_APERTURE, &m_curCameraInfo->aperture, 1);
    703 
    704     ADD_OR_SIZE(ANDROID_LENS_FOCAL_LENGTH, &m_curCameraInfo->focalLength, 1);
    705 
    706     static const float filterDensity = 0;
    707     ADD_OR_SIZE(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1);
    708 
    709     static const uint8_t opticalStabilizationMode =
    710             ANDROID_LENS_OPTICAL_STABILIZATION_OFF;
    711     ADD_OR_SIZE(ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
    712             &opticalStabilizationMode, 1);
    713 
    714 
    715     /** android.sensor */
    716 
    717 
    718     static const int64_t frameDuration = 33333333L; // 1/30 s
    719     ADD_OR_SIZE(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1);
    720 
    721 
    722     /** android.flash */
    723 
    724     static const uint8_t flashMode = ANDROID_FLASH_OFF;
    725     ADD_OR_SIZE(ANDROID_FLASH_MODE, &flashMode, 1);
    726 
    727     static const uint8_t flashPower = 10;
    728     ADD_OR_SIZE(ANDROID_FLASH_FIRING_POWER, &flashPower, 1);
    729 
    730     static const int64_t firingTime = 0;
    731     ADD_OR_SIZE(ANDROID_FLASH_FIRING_TIME, &firingTime, 1);
    732 
    733     /** Processing block modes */
    734     uint8_t hotPixelMode = 0;
    735     uint8_t demosaicMode = 0;
    736     uint8_t noiseMode = 0;
    737     uint8_t shadingMode = 0;
    738     uint8_t geometricMode = 0;
    739     uint8_t colorMode = 0;
    740     uint8_t tonemapMode = 0;
    741     uint8_t edgeMode = 0;
    742     uint8_t vstabMode = 0;
    743 
    744     switch (request_template) {
    745       case CAMERA2_TEMPLATE_PREVIEW:
    746         hotPixelMode = ANDROID_PROCESSING_FAST;
    747         demosaicMode = ANDROID_PROCESSING_FAST;
    748         noiseMode = ANDROID_PROCESSING_FAST;
    749         shadingMode = ANDROID_PROCESSING_FAST;
    750         geometricMode = ANDROID_PROCESSING_FAST;
    751         colorMode = ANDROID_PROCESSING_FAST;
    752         tonemapMode = ANDROID_PROCESSING_FAST;
    753         edgeMode = ANDROID_PROCESSING_FAST;
    754         vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
    755         break;
    756       case CAMERA2_TEMPLATE_STILL_CAPTURE:
    757         hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
    758         demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
    759         noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
    760         shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
    761         geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
    762         colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
    763         tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
    764         edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
    765         vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
    766         break;
    767       case CAMERA2_TEMPLATE_VIDEO_RECORD:
    768         hotPixelMode = ANDROID_PROCESSING_FAST;
    769         demosaicMode = ANDROID_PROCESSING_FAST;
    770         noiseMode = ANDROID_PROCESSING_FAST;
    771         shadingMode = ANDROID_PROCESSING_FAST;
    772         geometricMode = ANDROID_PROCESSING_FAST;
    773         colorMode = ANDROID_PROCESSING_FAST;
    774         tonemapMode = ANDROID_PROCESSING_FAST;
    775         edgeMode = ANDROID_PROCESSING_FAST;
    776         vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_ON;
    777         break;
    778       case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
    779         hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
    780         demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
    781         noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
    782         shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
    783         geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
    784         colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
    785         tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
    786         edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
    787         vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_ON;
    788         break;
    789       case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
    790         hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
    791         demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
    792         noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
    793         shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
    794         geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
    795         colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
    796         tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
    797         edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
    798         vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
    799         break;
    800       default:
    801         hotPixelMode = ANDROID_PROCESSING_FAST;
    802         demosaicMode = ANDROID_PROCESSING_FAST;
    803         noiseMode = ANDROID_PROCESSING_FAST;
    804         shadingMode = ANDROID_PROCESSING_FAST;
    805         geometricMode = ANDROID_PROCESSING_FAST;
    806         colorMode = ANDROID_PROCESSING_FAST;
    807         tonemapMode = ANDROID_PROCESSING_FAST;
    808         edgeMode = ANDROID_PROCESSING_FAST;
    809         vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
    810         break;
    811     }
    812     ADD_OR_SIZE(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1);
    813     ADD_OR_SIZE(ANDROID_DEMOSAIC_MODE, &demosaicMode, 1);
    814     ADD_OR_SIZE(ANDROID_NOISE_MODE, &noiseMode, 1);
    815     ADD_OR_SIZE(ANDROID_SHADING_MODE, &shadingMode, 1);
    816     ADD_OR_SIZE(ANDROID_GEOMETRIC_MODE, &geometricMode, 1);
    817     ADD_OR_SIZE(ANDROID_COLOR_MODE, &colorMode, 1);
    818     ADD_OR_SIZE(ANDROID_TONEMAP_MODE, &tonemapMode, 1);
    819     ADD_OR_SIZE(ANDROID_EDGE_MODE, &edgeMode, 1);
    820     ADD_OR_SIZE(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vstabMode, 1);
    821 
    822     /** android.noise */
    823     static const uint8_t noiseStrength = 5;
    824     ADD_OR_SIZE(ANDROID_NOISE_STRENGTH, &noiseStrength, 1);
    825 
    826     /** android.color */
    827     static const float colorTransform[9] = {
    828         1.0f, 0.f, 0.f,
    829         0.f, 1.f, 0.f,
    830         0.f, 0.f, 1.f
    831     };
    832     ADD_OR_SIZE(ANDROID_COLOR_TRANSFORM, colorTransform, 9);
    833 
    834     /** android.tonemap */
    835     static const float tonemapCurve[4] = {
    836         0.f, 0.f,
    837         1.f, 1.f
    838     };
    839     ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_RED, tonemapCurve, 32); // sungjoong
    840     ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_GREEN, tonemapCurve, 32);
    841     ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_BLUE, tonemapCurve, 32);
    842 
    843     /** android.edge */
    844     static const uint8_t edgeStrength = 5;
    845     ADD_OR_SIZE(ANDROID_EDGE_STRENGTH, &edgeStrength, 1);
    846 
    847     /** android.scaler */
    848     int32_t cropRegion[3] = {
    849         0, 0, m_curCameraInfo->sensorW
    850     };
    851     ADD_OR_SIZE(ANDROID_SCALER_CROP_REGION, cropRegion, 3);
    852 
    853     /** android.jpeg */
    854     static const int32_t jpegQuality = 100;
    855     ADD_OR_SIZE(ANDROID_JPEG_QUALITY, &jpegQuality, 1);
    856 
    857     static const int32_t thumbnailSize[2] = {
    858         160, 120
    859     };
    860     ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSize, 2);
    861 
    862     static const int32_t thumbnailQuality = 100;
    863     ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnailQuality, 1);
    864 
    865     static const double gpsCoordinates[3] = {
    866         0, 0, 0
    867     };
    868     ADD_OR_SIZE(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 3);
    869 
    870     static const uint8_t gpsProcessingMethod[32] = "None";
    871     ADD_OR_SIZE(ANDROID_JPEG_GPS_PROCESSING_METHOD, gpsProcessingMethod, 32);
    872 
    873     static const int64_t gpsTimestamp = 0;
    874     ADD_OR_SIZE(ANDROID_JPEG_GPS_TIMESTAMP, &gpsTimestamp, 1);
    875 
    876     static const int32_t jpegOrientation = 0;
    877     ADD_OR_SIZE(ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1);
    878 
    879     /** android.stats */
    880 
    881     static const uint8_t faceDetectMode = ANDROID_STATS_FACE_DETECTION_FULL;
    882     ADD_OR_SIZE(ANDROID_STATS_FACE_DETECT_MODE, &faceDetectMode, 1);
    883 
    884     static const uint8_t histogramMode = ANDROID_STATS_OFF;
    885     ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_MODE, &histogramMode, 1);
    886 
    887     static const uint8_t sharpnessMapMode = ANDROID_STATS_OFF;
    888     ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1);
    889 
    890 
    891     /** android.control */
    892 
    893     uint8_t controlIntent = 0;
    894     switch (request_template) {
    895       case CAMERA2_TEMPLATE_PREVIEW:
    896         controlIntent = ANDROID_CONTROL_INTENT_PREVIEW;
    897         break;
    898       case CAMERA2_TEMPLATE_STILL_CAPTURE:
    899         controlIntent = ANDROID_CONTROL_INTENT_STILL_CAPTURE;
    900         break;
    901       case CAMERA2_TEMPLATE_VIDEO_RECORD:
    902         controlIntent = ANDROID_CONTROL_INTENT_VIDEO_RECORD;
    903         break;
    904       case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
    905         controlIntent = ANDROID_CONTROL_INTENT_VIDEO_SNAPSHOT;
    906         break;
    907       case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
    908         controlIntent = ANDROID_CONTROL_INTENT_ZERO_SHUTTER_LAG;
    909         break;
    910       default:
    911         controlIntent = ANDROID_CONTROL_INTENT_CUSTOM;
    912         break;
    913     }
    914     ADD_OR_SIZE(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
    915 
    916     static const uint8_t controlMode = ANDROID_CONTROL_AUTO;
    917     ADD_OR_SIZE(ANDROID_CONTROL_MODE, &controlMode, 1);
    918 
    919     static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_OFF;
    920     ADD_OR_SIZE(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
    921 
    922     static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED;
    923     ADD_OR_SIZE(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
    924 
    925     static const uint8_t aeMode = ANDROID_CONTROL_AE_ON;
    926     ADD_OR_SIZE(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
    927 
    928     int32_t controlRegions[5] = {
    929         0, 0, m_curCameraInfo->sensorW, m_curCameraInfo->sensorH, 1000
    930     };
    931     ADD_OR_SIZE(ANDROID_CONTROL_AE_REGIONS, controlRegions, 5);
    932 
    933     static const int32_t aeExpCompensation = 0;
    934     ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION, &aeExpCompensation, 1);
    935 
    936     static const int32_t aeTargetFpsRange[2] = {
    937         15, 30
    938     };
    939     ADD_OR_SIZE(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange, 2);
    940 
    941     static const uint8_t aeAntibandingMode =
    942             ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
    943     ADD_OR_SIZE(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &aeAntibandingMode, 1);
    944 
    945     static const uint8_t awbMode =
    946             ANDROID_CONTROL_AWB_AUTO;
    947     ADD_OR_SIZE(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
    948 
    949     ADD_OR_SIZE(ANDROID_CONTROL_AWB_REGIONS, controlRegions, 5);
    950 
    951     uint8_t afMode = 0;
    952     switch (request_template) {
    953       case CAMERA2_TEMPLATE_PREVIEW:
    954         afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE;
    955         break;
    956       case CAMERA2_TEMPLATE_STILL_CAPTURE:
    957         afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE;
    958         break;
    959       case CAMERA2_TEMPLATE_VIDEO_RECORD:
    960         afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO;
    961         break;
    962       case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
    963         afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO;
    964         break;
    965       case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
    966         afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE;
    967         break;
    968       default:
    969         afMode = ANDROID_CONTROL_AF_AUTO;
    970         break;
    971     }
    972     ADD_OR_SIZE(ANDROID_CONTROL_AF_MODE, &afMode, 1);
    973 
    974     ADD_OR_SIZE(ANDROID_CONTROL_AF_REGIONS, controlRegions, 5);
    975 
    976     if (sizeRequest) {
    977         ALOGV("Allocating %d entries, %d extra bytes for "
    978                 "request template type %d",
    979                 entryCount, dataCount, request_template);
    980         *request = allocate_camera_metadata(entryCount, dataCount);
    981         if (*request == NULL) {
    982             ALOGE("Unable to allocate new request template type %d "
    983                     "(%d entries, %d bytes extra data)", request_template,
    984                     entryCount, dataCount);
    985             return NO_MEMORY;
    986         }
    987     }
    988     return OK;
    989 #undef ADD_OR_SIZE
    990 }
    991 
    992 }
    993