Home | History | Annotate | Download | only in src
      1 /*
      2 ** Copyright (c) 2011-2012 The Linux Foundation. All rights reserved.
      3 **
      4 ** Licensed under the Apache License, Version 2.0 (the "License");
      5 ** you may not use this file except in compliance with the License.
      6 ** You may obtain a copy of the License at
      7 **
      8 **     http://www.apache.org/licenses/LICENSE-2.0
      9 **
     10 ** Unless required by applicable law or agreed to in writing, software
     11 ** distributed under the License is distributed on an "AS IS" BASIS,
     12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 ** See the License for the specific language governing permissions and
     14 ** limitations under the License.
     15 */
     16 
     17 /*#error uncomment this for compiler test!*/
     18 
     19 #define ALOG_NIDEBUG 0
     20 
     21 #define ALOG_TAG __FILE__
     22 #include <utils/Log.h>
     23 #include <utils/threads.h>
     24 #include <cutils/properties.h>
     25 #include <fcntl.h>
     26 #include <sys/mman.h>
     27 
     28 #include <hardware/camera2.h>
     29 #include <mm_camera_interface.h>
     30 
     31 
     32 namespace android {
     33 
     34 
     35 const uint32_t QCAvailableFormats[4] = {
     36         HAL_PIXEL_FORMAT_RAW16,
     37         HAL_PIXEL_FORMAT_BLOB,
     38         HAL_PIXEL_FORMAT_YV12,
     39         HAL_PIXEL_FORMAT_YCrCb_420_SP
     40 };
     41 
     42 const uint32_t QCAvailableRawSizes[2] = {
     43     640, 480
     44 };
     45 
     46 
     47 const nsecs_t QCExposureTimeRange[2] =
     48     {1000L, 30000000000L} ; // 1 us - 30 sec
     49 const nsecs_t QCFrameDurationRange[2] =
     50     {33331760L, 30000000000L}; // ~1/30 s - 30 sec
     51 const nsecs_t QCMinVerticalBlank = 10000L;
     52 
     53 const uint8_t QCColorFilterArrangement = ANDROID_SENSOR_RGGB;
     54 
     55 // Output image data characteristics
     56 const uint32_t QCMaxRawValue = 4000;
     57 const uint32_t QCBlackLevel  = 1000;
     58 
     59 const uint64_t QCAvailableRawMinDurations[1] = {
     60     QCFrameDurationRange[0]
     61 };
     62 
     63 const uint32_t QCAvailableProcessedSizes[4] = {
     64     640, 480, 320, 240
     65     //    Sensor::kResolution[0], Sensor::kResolution[1]
     66 };
     67 
     68 const uint64_t QCAvailableProcessedMinDurations[1] = {
     69     QCFrameDurationRange[0]
     70 };
     71 
     72 
     73 const uint32_t QCAvailableJpegSizes[2] = {
     74     640, 480
     75     //    Sensor::kResolution[0], Sensor::kResolution[1]
     76 };
     77 
     78 const uint64_t QCAvailableJpegMinDurations[1] = {
     79     QCFrameDurationRange[0]
     80 };
     81 
     82 static status_t addOrSize(camera_metadata_t *request,
     83         bool sizeRequest,
     84         size_t *entryCount,
     85         size_t *dataCount,
     86         uint32_t tag,
     87         const void *entryData,
     88         size_t entryDataCount) {
     89     status_t res;
     90     if (!sizeRequest) {
     91         return add_camera_metadata_entry(request, tag, entryData,
     92                 entryDataCount);
     93     } else {
     94         int type = get_camera_metadata_tag_type(tag);
     95         if (type < 0 ) return BAD_VALUE;
     96         (*entryCount)++;
     97         (*dataCount) += calculate_camera_metadata_entry_data_size(type,
     98                 entryDataCount);
     99         return OK;
    100     }
    101 }
    102 
    103 extern "C" status_t getStaticInfo(camera_metadata_t **info,
    104         mm_camera_vtbl_t *camera_vtbl, bool sizeRequest)
    105 {
    106     size_t entryCount = 0;
    107     size_t dataCount = 0;
    108     status_t ret;
    109 
    110     if(!camera_vtbl) return BAD_VALUE;
    111 
    112     bool mFacingBack = (camera_vtbl->camera_info->camera_info.position==BACK_CAMERA)?
    113                        true:false;
    114 
    115 #define ADD_OR_SIZE( tag, data, count ) \
    116     if ( ( ret = addOrSize(*info, sizeRequest, &entryCount, &dataCount, \
    117             tag, data, count) ) != OK ) return ret
    118 
    119     // android.lens
    120 
    121     static float minFocusDistance = 0;
    122     ADD_OR_SIZE(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE,
    123             &minFocusDistance, 1);
    124     ADD_OR_SIZE(ANDROID_LENS_HYPERFOCAL_DISTANCE,
    125             &minFocusDistance, 1);
    126 
    127     static float focalLength = 0.0f;
    128     camera_vtbl->ops->get_parm(camera_vtbl->camera_handle,
    129             MM_CAMERA_PARM_FOCAL_LENGTH,
    130             (void *)&focalLength);
    131     ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS,
    132             &focalLength, 1);
    133 
    134     static float aperture = 2.8f;
    135     camera_vtbl->ops->get_parm(camera_vtbl->camera_handle,
    136             MM_CAMERA_PARM_APERTURE,
    137             (void *)&aperture);
    138     ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_APERTURES,
    139             &aperture, 1);
    140 
    141     static float filterDensity = 0;
    142     ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FILTER_DENSITY,
    143             &filterDensity, 1);
    144 
    145     static const uint8_t availableOpticalStabilization =
    146             ANDROID_LENS_OPTICAL_STABILIZATION_OFF;
    147     ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_OPTICAL_STABILIZATION,
    148             &availableOpticalStabilization, 1);
    149 
    150     static const int32_t lensShadingMapSize[] = {1, 1};
    151     ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP_SIZE, lensShadingMapSize,
    152             sizeof(lensShadingMapSize)/sizeof(int32_t));
    153 
    154     static const float lensShadingMap[3 * 1 * 1 ] =
    155             { 1.f, 1.f, 1.f };
    156     ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP, lensShadingMap,
    157             sizeof(lensShadingMap)/sizeof(float));
    158 
    159     // Identity transform
    160     static const int32_t geometricCorrectionMapSize[] = {2, 2};
    161     ADD_OR_SIZE(ANDROID_LENS_GEOMETRIC_CORRECTION_MAP_SIZE,
    162             geometricCorrectionMapSize,
    163             sizeof(geometricCorrectionMapSize)/sizeof(int32_t));
    164 
    165     static const float geometricCorrectionMap[2 * 3 * 2 * 2] = {
    166             0.f, 0.f,  0.f, 0.f,  0.f, 0.f,
    167             1.f, 0.f,  1.f, 0.f,  1.f, 0.f,
    168             0.f, 1.f,  0.f, 1.f,  0.f, 1.f,
    169             1.f, 1.f,  1.f, 1.f,  1.f, 1.f};
    170     ADD_OR_SIZE(ANDROID_LENS_GEOMETRIC_CORRECTION_MAP,
    171             geometricCorrectionMap,
    172             sizeof(geometricCorrectionMap)/sizeof(float));
    173 
    174     int32_t lensFacing = mFacingBack ?
    175             ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
    176     ADD_OR_SIZE(ANDROID_LENS_FACING, &lensFacing, 1);
    177 
    178 #if 0
    179     // android.sensor
    180 
    181     ADD_OR_SIZE(ANDROID_SENSOR_EXPOSURE_TIME_RANGE,
    182             QCExposureTimeRange, 2);
    183 
    184     ADD_OR_SIZE(ANDROID_SENSOR_MAX_FRAME_DURATION,
    185             &QCFrameDurationRange[1], 1);
    186 
    187     ADD_OR_SIZE(ANDROID_SENSOR_AVAILABLE_SENSITIVITIES,
    188             QCAvailableSensitivities,
    189             sizeof(QCAvailableSensitivities)
    190             /sizeof(uint32_t));
    191 
    192     ADD_OR_SIZE(ANDROID_SENSOR_COLOR_FILTER_ARRANGEMENT,
    193             &QCColorFilterArrangement, 1);
    194 #endif
    195     static const float sensorPhysicalSize[2] = {3.20f, 2.40f}; // mm
    196     ADD_OR_SIZE(ANDROID_SENSOR_PHYSICAL_SIZE,
    197             sensorPhysicalSize, 2);
    198 
    199     const unsigned int kResolution[2]  = {640, 480};
    200     ADD_OR_SIZE(ANDROID_SENSOR_PIXEL_ARRAY_SIZE,
    201             kResolution, 2);
    202 
    203     ADD_OR_SIZE(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE,
    204             kResolution, 2);
    205 
    206 #if 0
    207     ADD_OR_SIZE(ANDROID_SENSOR_WHITE_LEVEL,
    208             &QCMaxRawValue, 1);
    209 
    210     static const int32_t blackLevelPattern[4] = {
    211             QCBlackLevel, QCBlackLevel,
    212             QCBlackLevel, QCBlackLevel
    213     };
    214     ADD_OR_SIZE(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
    215             blackLevelPattern, sizeof(blackLevelPattern)/sizeof(int32_t));
    216 
    217 #endif
    218     //TODO: sensor color calibration fields
    219 
    220     // android.flash
    221     static const uint8_t flashAvailable = 0;
    222     ADD_OR_SIZE(ANDROID_FLASH_AVAILABLE, &flashAvailable, 1);
    223 
    224     static const int64_t flashChargeDuration = 0;
    225     ADD_OR_SIZE(ANDROID_FLASH_CHARGE_DURATION, &flashChargeDuration, 1);
    226 
    227     // android.tonemap
    228 
    229     static const int32_t tonemapCurvePoints = 128;
    230     ADD_OR_SIZE(ANDROID_TONEMAP_MAX_CURVE_POINTS, &tonemapCurvePoints, 1);
    231 
    232 #if 1
    233     // android.scaler
    234     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_FORMATS,
    235             QCAvailableFormats,
    236             sizeof(QCAvailableFormats)/sizeof(uint32_t));
    237 
    238     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
    239             QCAvailableRawSizes,
    240             sizeof(QCAvailableRawSizes)/sizeof(uint32_t));
    241 
    242     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
    243             QCAvailableRawMinDurations,
    244             sizeof(QCAvailableRawMinDurations)/sizeof(uint64_t));
    245 
    246     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
    247             QCAvailableProcessedSizes,
    248             sizeof(QCAvailableProcessedSizes)/sizeof(uint32_t));
    249 
    250     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
    251             QCAvailableProcessedMinDurations,
    252             sizeof(QCAvailableProcessedMinDurations)/sizeof(uint64_t));
    253 
    254     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
    255             QCAvailableJpegSizes,
    256             sizeof(QCAvailableJpegSizes)/sizeof(uint32_t));
    257 
    258     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
    259             QCAvailableJpegMinDurations,
    260             sizeof(QCAvailableJpegMinDurations)/sizeof(uint64_t));
    261 
    262     static const float maxZoom = 10;
    263     ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_MAX_ZOOM,
    264             &maxZoom, 1);
    265 
    266     // android.jpeg
    267 
    268     static const int32_t jpegThumbnailSizes[] = {
    269             160, 120,
    270             320, 240
    271      };
    272     ADD_OR_SIZE(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
    273             jpegThumbnailSizes, sizeof(jpegThumbnailSizes)/sizeof(int32_t));
    274 
    275     static const int32_t jpegMaxSize = 300000;
    276     ADD_OR_SIZE(ANDROID_JPEG_MAX_SIZE, &jpegMaxSize, 1);
    277 
    278     // android.stats
    279 
    280     static const uint8_t availableFaceDetectModes[] = {
    281             ANDROID_STATS_FACE_DETECTION_OFF
    282     };
    283     ADD_OR_SIZE(ANDROID_STATS_AVAILABLE_FACE_DETECT_MODES,
    284             availableFaceDetectModes,
    285             sizeof(availableFaceDetectModes));
    286 
    287     static const int32_t maxFaceCount = 0;
    288     ADD_OR_SIZE(ANDROID_STATS_MAX_FACE_COUNT,
    289             &maxFaceCount, 1);
    290 
    291     static const int32_t histogramSize = 64;
    292     ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_BUCKET_COUNT,
    293             &histogramSize, 1);
    294 
    295     static const int32_t maxHistogramCount = 1000;
    296     ADD_OR_SIZE(ANDROID_STATS_MAX_HISTOGRAM_COUNT,
    297             &maxHistogramCount, 1);
    298 
    299     static const int32_t sharpnessMapSize[2] = {64, 64};
    300     ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_SIZE,
    301             sharpnessMapSize, sizeof(sharpnessMapSize)/sizeof(int32_t));
    302 
    303     static const int32_t maxSharpnessMapValue = 1000;
    304     ADD_OR_SIZE(ANDROID_STATS_MAX_SHARPNESS_MAP_VALUE,
    305             &maxSharpnessMapValue, 1);
    306 
    307     // android.control
    308 
    309     static const uint8_t availableSceneModes[] = {
    310             ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED
    311     };
    312     ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
    313             availableSceneModes, sizeof(availableSceneModes));
    314 
    315     static const uint8_t availableEffects[] = {
    316             ANDROID_CONTROL_EFFECT_OFF
    317     };
    318     ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_EFFECTS,
    319             availableEffects, sizeof(availableEffects));
    320 
    321     int32_t max3aRegions = 0;
    322     ADD_OR_SIZE(ANDROID_CONTROL_MAX_REGIONS,
    323             &max3aRegions, 1);
    324 
    325     static const uint8_t availableAeModes[] = {
    326             ANDROID_CONTROL_AE_OFF,
    327             ANDROID_CONTROL_AE_ON
    328     };
    329     ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_MODES,
    330             availableAeModes, sizeof(availableAeModes));
    331 
    332     static const camera_metadata_rational exposureCompensationStep = {
    333             1, 3
    334     };
    335     ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP,
    336             &exposureCompensationStep, 1);
    337 
    338     int32_t exposureCompensationRange[] = {-9, 9};
    339     ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE,
    340             exposureCompensationRange,
    341             sizeof(exposureCompensationRange)/sizeof(int32_t));
    342 
    343     static const int32_t availableTargetFpsRanges[] = {
    344             5, 30, 15, 30
    345     };
    346     ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
    347             availableTargetFpsRanges,
    348             sizeof(availableTargetFpsRanges)/sizeof(int32_t));
    349 
    350     static const uint8_t availableAntibandingModes[] = {
    351             ANDROID_CONTROL_AE_ANTIBANDING_OFF,
    352             ANDROID_CONTROL_AE_ANTIBANDING_AUTO
    353     };
    354     ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
    355             availableAntibandingModes, sizeof(availableAntibandingModes));
    356 
    357     static const uint8_t availableAwbModes[] = {
    358             ANDROID_CONTROL_AWB_OFF,
    359             ANDROID_CONTROL_AWB_AUTO,
    360             ANDROID_CONTROL_AWB_INCANDESCENT,
    361             ANDROID_CONTROL_AWB_FLUORESCENT,
    362             ANDROID_CONTROL_AWB_DAYLIGHT,
    363             ANDROID_CONTROL_AWB_SHADE
    364     };
    365     ADD_OR_SIZE(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
    366             availableAwbModes, sizeof(availableAwbModes));
    367 
    368     static const uint8_t availableAfModes[] = {
    369             ANDROID_CONTROL_AF_OFF
    370     };
    371     ADD_OR_SIZE(ANDROID_CONTROL_AF_AVAILABLE_MODES,
    372             availableAfModes, sizeof(availableAfModes));
    373 
    374     static const uint8_t availableVstabModes[] = {
    375             ANDROID_CONTROL_VIDEO_STABILIZATION_OFF
    376     };
    377     ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
    378             availableVstabModes, sizeof(availableVstabModes));
    379 #endif
    380 #undef ADD_OR_SIZE
    381     /** Allocate metadata if sizing */
    382     if (sizeRequest) {
    383         ALOGV("Allocating %d entries, %d extra bytes for "
    384                 "static camera info",
    385                 entryCount, dataCount);
    386         *info = allocate_camera_metadata(entryCount, dataCount);
    387         if (*info == NULL) {
    388             ALOGE("Unable to allocate camera static info"
    389                     "(%d entries, %d bytes extra data)",
    390                     entryCount, dataCount);
    391             return NO_MEMORY;
    392         }
    393     }
    394     return OK;
    395 }
    396 
    397 extern "C" status_t constructDefaultRequest(int request_template,
    398         camera_metadata_t **request, bool sizeRequest)
    399 {
    400     size_t entryCount = 0;
    401     size_t dataCount = 0;
    402     status_t ret;
    403 
    404 #define ADD_OR_SIZE( tag, data, count ) \
    405     if ( ( ret = addOrSize(*request, sizeRequest, &entryCount, &dataCount, \
    406             tag, data, count) ) != OK ) return ret
    407 
    408     static const int64_t USEC = 1000LL;
    409     static const int64_t MSEC = USEC * 1000LL;
    410     static const int64_t SEC = MSEC * 1000LL;
    411 
    412     /** android.request */
    413 
    414     static const uint8_t metadataMode = ANDROID_REQUEST_METADATA_NONE;
    415     ADD_OR_SIZE(ANDROID_REQUEST_METADATA_MODE, &metadataMode, 1);
    416 
    417     static const int32_t id = 0;
    418     ADD_OR_SIZE(ANDROID_REQUEST_ID, &id, 1);
    419 
    420     static const int32_t frameCount = 0;
    421     ADD_OR_SIZE(ANDROID_REQUEST_FRAME_COUNT, &frameCount, 1);
    422 
    423     // OUTPUT_STREAMS set by user
    424     entryCount += 1;
    425     dataCount += 5; // TODO: Should be maximum stream number
    426 
    427     /** android.lens */
    428 
    429     static const float focusDistance = 0;
    430     ADD_OR_SIZE(ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1);
    431 
    432     static const float aperture = 2.8f;
    433     ADD_OR_SIZE(ANDROID_LENS_APERTURE, &aperture, 1);
    434 
    435     static const float focalLength = 5.0f;
    436     ADD_OR_SIZE(ANDROID_LENS_FOCAL_LENGTH, &focalLength, 1);
    437 
    438     static const float filterDensity = 0;
    439     ADD_OR_SIZE(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1);
    440 
    441     static const uint8_t opticalStabilizationMode =
    442             ANDROID_LENS_OPTICAL_STABILIZATION_OFF;
    443     ADD_OR_SIZE(ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
    444             &opticalStabilizationMode, 1);
    445 
    446     // FOCUS_RANGE set only in frame
    447 
    448     /** android.sensor */
    449 
    450     static const int64_t exposureTime = 10 * MSEC;
    451     ADD_OR_SIZE(ANDROID_SENSOR_EXPOSURE_TIME, &exposureTime, 1);
    452 
    453     static const int64_t frameDuration = 33333333L; // 1/30 s
    454     ADD_OR_SIZE(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1);
    455 
    456     static const int32_t sensitivity = 100;
    457     ADD_OR_SIZE(ANDROID_SENSOR_SENSITIVITY, &sensitivity, 1);
    458 
    459     // TIMESTAMP set only in frame
    460 
    461     /** android.flash */
    462 
    463     static const uint8_t flashMode = ANDROID_FLASH_OFF;
    464     ADD_OR_SIZE(ANDROID_FLASH_MODE, &flashMode, 1);
    465 
    466     static const uint8_t flashPower = 10;
    467     ADD_OR_SIZE(ANDROID_FLASH_FIRING_POWER, &flashPower, 1);
    468 
    469     static const int64_t firingTime = 0;
    470     ADD_OR_SIZE(ANDROID_FLASH_FIRING_TIME, &firingTime, 1);
    471 
    472     /** Processing block modes */
    473     uint8_t hotPixelMode = 0;
    474     uint8_t demosaicMode = 0;
    475     uint8_t noiseMode = 0;
    476     uint8_t shadingMode = 0;
    477     uint8_t geometricMode = 0;
    478     uint8_t colorMode = 0;
    479     uint8_t tonemapMode = 0;
    480     uint8_t edgeMode = 0;
    481     switch (request_template) {
    482       case CAMERA2_TEMPLATE_PREVIEW:
    483         hotPixelMode = ANDROID_PROCESSING_FAST;
    484         demosaicMode = ANDROID_PROCESSING_FAST;
    485         noiseMode = ANDROID_PROCESSING_FAST;
    486         shadingMode = ANDROID_PROCESSING_FAST;
    487         geometricMode = ANDROID_PROCESSING_FAST;
    488         colorMode = ANDROID_PROCESSING_FAST;
    489         tonemapMode = ANDROID_PROCESSING_FAST;
    490         edgeMode = ANDROID_PROCESSING_FAST;
    491         break;
    492       case CAMERA2_TEMPLATE_STILL_CAPTURE:
    493         hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
    494         demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
    495         noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
    496         shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
    497         geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
    498         colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
    499         tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
    500         edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
    501         break;
    502       case CAMERA2_TEMPLATE_VIDEO_RECORD:
    503         hotPixelMode = ANDROID_PROCESSING_FAST;
    504         demosaicMode = ANDROID_PROCESSING_FAST;
    505         noiseMode = ANDROID_PROCESSING_FAST;
    506         shadingMode = ANDROID_PROCESSING_FAST;
    507         geometricMode = ANDROID_PROCESSING_FAST;
    508         colorMode = ANDROID_PROCESSING_FAST;
    509         tonemapMode = ANDROID_PROCESSING_FAST;
    510         edgeMode = ANDROID_PROCESSING_FAST;
    511         break;
    512       case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
    513         hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
    514         demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
    515         noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
    516         shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
    517         geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
    518         colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
    519         tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
    520         edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
    521         break;
    522       case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
    523         hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY;
    524         demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY;
    525         noiseMode = ANDROID_PROCESSING_HIGH_QUALITY;
    526         shadingMode = ANDROID_PROCESSING_HIGH_QUALITY;
    527         geometricMode = ANDROID_PROCESSING_HIGH_QUALITY;
    528         colorMode = ANDROID_PROCESSING_HIGH_QUALITY;
    529         tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY;
    530         edgeMode = ANDROID_PROCESSING_HIGH_QUALITY;
    531         break;
    532       default:
    533         hotPixelMode = ANDROID_PROCESSING_FAST;
    534         demosaicMode = ANDROID_PROCESSING_FAST;
    535         noiseMode = ANDROID_PROCESSING_FAST;
    536         shadingMode = ANDROID_PROCESSING_FAST;
    537         geometricMode = ANDROID_PROCESSING_FAST;
    538         colorMode = ANDROID_PROCESSING_FAST;
    539         tonemapMode = ANDROID_PROCESSING_FAST;
    540         edgeMode = ANDROID_PROCESSING_FAST;
    541         break;
    542     }
    543     ADD_OR_SIZE(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1);
    544     ADD_OR_SIZE(ANDROID_DEMOSAIC_MODE, &demosaicMode, 1);
    545     ADD_OR_SIZE(ANDROID_NOISE_MODE, &noiseMode, 1);
    546     ADD_OR_SIZE(ANDROID_SHADING_MODE, &shadingMode, 1);
    547     ADD_OR_SIZE(ANDROID_GEOMETRIC_MODE, &geometricMode, 1);
    548     ADD_OR_SIZE(ANDROID_COLOR_MODE, &colorMode, 1);
    549     ADD_OR_SIZE(ANDROID_TONEMAP_MODE, &tonemapMode, 1);
    550     ADD_OR_SIZE(ANDROID_EDGE_MODE, &edgeMode, 1);
    551 
    552     /** android.noise */
    553     static const uint8_t noiseStrength = 5;
    554     ADD_OR_SIZE(ANDROID_NOISE_STRENGTH, &noiseStrength, 1);
    555 
    556     /** android.color */
    557     static const float colorTransform[9] = {
    558         1.0f, 0.f, 0.f,
    559         0.f, 1.f, 0.f,
    560         0.f, 0.f, 1.f
    561     };
    562     ADD_OR_SIZE(ANDROID_COLOR_TRANSFORM, colorTransform, 9);
    563 
    564     /** android.tonemap */
    565     static const float tonemapCurve[4] = {
    566         0.f, 0.f,
    567         1.f, 1.f
    568     };
    569     ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_RED, tonemapCurve, 4);
    570     ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_GREEN, tonemapCurve, 4);
    571     ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_BLUE, tonemapCurve, 4);
    572 
    573     /** android.edge */
    574     static const uint8_t edgeStrength = 5;
    575     ADD_OR_SIZE(ANDROID_EDGE_STRENGTH, &edgeStrength, 1);
    576 
    577     /** android.scaler */
    578     static const int32_t cropRegion[3] = {
    579         0, 0, /*kResolution[0]*/
    580     };
    581     ADD_OR_SIZE(ANDROID_SCALER_CROP_REGION, cropRegion, 3);
    582 
    583     /** android.jpeg */
    584     static const int32_t jpegQuality = 80;
    585     ADD_OR_SIZE(ANDROID_JPEG_QUALITY, &jpegQuality, 1);
    586 
    587     static const int32_t thumbnailSize[2] = {
    588         640, 480
    589     };
    590     ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSize, 2);
    591 
    592     static const int32_t thumbnailQuality = 80;
    593     ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnailQuality, 1);
    594 
    595     static const double gpsCoordinates[2] = {
    596         0, 0
    597     };
    598     ADD_OR_SIZE(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 2);
    599 
    600     static const uint8_t gpsProcessingMethod[32] = "None";
    601     ADD_OR_SIZE(ANDROID_JPEG_GPS_PROCESSING_METHOD, gpsProcessingMethod, 32);
    602 
    603     static const int64_t gpsTimestamp = 0;
    604     ADD_OR_SIZE(ANDROID_JPEG_GPS_TIMESTAMP, &gpsTimestamp, 1);
    605 
    606     static const int32_t jpegOrientation = 0;
    607     ADD_OR_SIZE(ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1);
    608 
    609     /** android.stats */
    610 
    611     static const uint8_t faceDetectMode = ANDROID_STATS_FACE_DETECTION_OFF;
    612     ADD_OR_SIZE(ANDROID_STATS_FACE_DETECT_MODE, &faceDetectMode, 1);
    613 
    614     static const uint8_t histogramMode = ANDROID_STATS_OFF;
    615     ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_MODE, &histogramMode, 1);
    616 
    617     static const uint8_t sharpnessMapMode = ANDROID_STATS_OFF;
    618     ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1);
    619 
    620     // faceRectangles, faceScores, faceLandmarks, faceIds, histogram,
    621     // sharpnessMap only in frames
    622 
    623     /** android.control */
    624 
    625     uint8_t controlIntent = 0;
    626     switch (request_template) {
    627       case CAMERA2_TEMPLATE_PREVIEW:
    628         controlIntent = ANDROID_CONTROL_INTENT_PREVIEW;
    629         break;
    630       case CAMERA2_TEMPLATE_STILL_CAPTURE:
    631         controlIntent = ANDROID_CONTROL_INTENT_STILL_CAPTURE;
    632         break;
    633       case CAMERA2_TEMPLATE_VIDEO_RECORD:
    634         controlIntent = ANDROID_CONTROL_INTENT_VIDEO_RECORD;
    635         break;
    636       case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
    637         controlIntent = ANDROID_CONTROL_INTENT_VIDEO_SNAPSHOT;
    638         break;
    639       case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
    640         controlIntent = ANDROID_CONTROL_INTENT_ZERO_SHUTTER_LAG;
    641         break;
    642       default:
    643         controlIntent = ANDROID_CONTROL_INTENT_CUSTOM;
    644         break;
    645     }
    646     ADD_OR_SIZE(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
    647 
    648     static const uint8_t controlMode = ANDROID_CONTROL_AUTO;
    649     ADD_OR_SIZE(ANDROID_CONTROL_MODE, &controlMode, 1);
    650 
    651     static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_OFF;
    652     ADD_OR_SIZE(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
    653 
    654     static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY;
    655     ADD_OR_SIZE(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
    656 
    657     static const uint8_t aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH;
    658     ADD_OR_SIZE(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
    659 
    660     const unsigned int kResolution[2]  = {640, 480};
    661     static const int32_t controlRegions[5] = {
    662         0, 0, kResolution[0], kResolution[1], 1000
    663     };
    664     ADD_OR_SIZE(ANDROID_CONTROL_AE_REGIONS, controlRegions, 5);
    665 
    666     static const int32_t aeExpCompensation = 0;
    667     ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION, &aeExpCompensation, 1);
    668 
    669     static const int32_t aeTargetFpsRange[2] = {
    670         10, 30
    671     };
    672     ADD_OR_SIZE(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange, 2);
    673 
    674     static const uint8_t aeAntibandingMode =
    675             ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
    676     ADD_OR_SIZE(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &aeAntibandingMode, 1);
    677 
    678     static const uint8_t awbMode =
    679             ANDROID_CONTROL_AWB_AUTO;
    680     ADD_OR_SIZE(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
    681 
    682     ADD_OR_SIZE(ANDROID_CONTROL_AWB_REGIONS, controlRegions, 5);
    683 
    684     uint8_t afMode = 0;
    685     switch (request_template) {
    686       case CAMERA2_TEMPLATE_PREVIEW:
    687         afMode = ANDROID_CONTROL_AF_AUTO;
    688         break;
    689       case CAMERA2_TEMPLATE_STILL_CAPTURE:
    690         afMode = ANDROID_CONTROL_AF_AUTO;
    691         break;
    692       case CAMERA2_TEMPLATE_VIDEO_RECORD:
    693         afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO;
    694         break;
    695       case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT:
    696         afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO;
    697         break;
    698       case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG:
    699         afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE;
    700         break;
    701       default:
    702         afMode = ANDROID_CONTROL_AF_AUTO;
    703         break;
    704     }
    705     ADD_OR_SIZE(ANDROID_CONTROL_AF_MODE, &afMode, 1);
    706 
    707     ADD_OR_SIZE(ANDROID_CONTROL_AF_REGIONS, controlRegions, 5);
    708 
    709     static const uint8_t vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
    710     ADD_OR_SIZE(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vstabMode, 1);
    711 
    712     // aeState, awbState, afState only in frame
    713 
    714     /** Allocate metadata if sizing */
    715     if (sizeRequest) {
    716         ALOGV("Allocating %d entries, %d extra bytes for "
    717                 "request template type %d",
    718                 entryCount, dataCount, request_template);
    719         *request = allocate_camera_metadata(entryCount, dataCount);
    720         if (*request == NULL) {
    721             ALOGE("Unable to allocate new request template type %d "
    722                     "(%d entries, %d bytes extra data)", request_template,
    723                     entryCount, dataCount);
    724             return NO_MEMORY;
    725         }
    726     }
    727     return OK;
    728 #undef ADD_OR_SIZE
    729 }
    730 
    731 };
    732