Home | History | Annotate | Download | only in camera
      1 /*
      2 ** Copyright (c) 2011-2012, 2015, 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 //#define ALOG_NDEBUG 0
     18 #define ALOG_NIDEBUG 0
     19 #define LOG_TAG "QCameraHWI_Parm"
     20 #include <utils/Log.h>
     21 
     22 #include <utils/Errors.h>
     23 #include <utils/threads.h>
     24 //#include <binder/MemoryHeapPmem.h>
     25 #include <utils/String16.h>
     26 #include <sys/types.h>
     27 #include <sys/stat.h>
     28 #include <unistd.h>
     29 #include <fcntl.h>
     30 #include <cutils/properties.h>
     31 #include <math.h>
     32 #include <linux/ioctl.h>
     33 #include "QCameraParameters.h"
     34 #include <media/mediarecorder.h>
     35 #include <gralloc_priv.h>
     36 
     37 #include "linux/msm_mdp.h"
     38 #include <linux/fb.h>
     39 #include <limits.h>
     40 
     41 extern "C" {
     42 #include <fcntl.h>
     43 #include <time.h>
     44 #include <pthread.h>
     45 #include <stdio.h>
     46 #include <string.h>
     47 #include <unistd.h>
     48 #include <termios.h>
     49 #include <assert.h>
     50 #include <stdlib.h>
     51 #include <ctype.h>
     52 #include <signal.h>
     53 #include <errno.h>
     54 #include <sys/mman.h>
     55 #include <sys/system_properties.h>
     56 #include <sys/time.h>
     57 #include <stdlib.h>
     58 #include <linux/msm_ion.h>
     59 
     60 } // extern "C"
     61 
     62 #include "QCameraHWI.h"
     63 #include "QCameraStream.h"
     64 
     65 /* QCameraHardwareInterface class implementation goes here*/
     66 /* following code implements the parameter logic of this class*/
     67 #define EXPOSURE_COMPENSATION_MAXIMUM_NUMERATOR 12
     68 #define EXPOSURE_COMPENSATION_MINIMUM_NUMERATOR -12
     69 #define EXPOSURE_COMPENSATION_DEFAULT_NUMERATOR 0
     70 #define EXPOSURE_COMPENSATION_DENOMINATOR 6
     71 #define EXPOSURE_COMPENSATION_STEP ((float (1))/EXPOSURE_COMPENSATION_DENOMINATOR)
     72 #define DEFAULT_CAMERA_AREA "(0,0,0,0,0)" // important: spaces not allowed
     73 
     74 #define HDR_HAL_FRAME 2
     75 
     76 #define BURST_INTREVAL_MIN 1
     77 #define BURST_INTREVAL_MAX 10
     78 #define BURST_INTREVAL_DEFAULT 1
     79 
     80 //Default FPS
     81 #define MINIMUM_FPS 5
     82 #define MAXIMUM_FPS 30
     83 #define DEFAULT_FIXED_FPS 30
     84 #define DEFAULT_FPS 30
     85 
     86 //Default Picture Width
     87 #define DEFAULT_PICTURE_WIDTH  640
     88 #define DEFAULT_PICTURE_HEIGHT 480
     89 
     90 //Default Video Width
     91 #define DEFAULT_VIDEO_WIDTH 1920
     92 #define DEFAULT_VIDEO_HEIGHT 1088
     93 
     94 #define THUMBNAIL_SIZE_COUNT (sizeof(thumbnail_sizes)/sizeof(thumbnail_size_type))
     95 #define DEFAULT_THUMBNAIL_SETTING 4
     96 #define THUMBNAIL_WIDTH_STR "512"
     97 #define THUMBNAIL_HEIGHT_STR "384"
     98 #define THUMBNAIL_SMALL_HEIGHT 144
     99 
    100 #define DONT_CARE_COORDINATE -1
    101 
    102 //for histogram stats
    103 #define HISTOGRAM_STATS_SIZE 257
    104 
    105 //Supported preview fps ranges should be added to this array in the form (minFps,maxFps)
    106 static  android::FPSRange FpsRangesSupported[] = {
    107             android::FPSRange(MINIMUM_FPS*1000,MAXIMUM_FPS*1000)
    108         };
    109 #define FPS_RANGES_SUPPORTED_COUNT (sizeof(FpsRangesSupported)/sizeof(FpsRangesSupported[0]))
    110 
    111 
    112 typedef struct {
    113     uint32_t aspect_ratio;
    114     uint32_t width;
    115     uint32_t height;
    116 } thumbnail_size_type;
    117 
    118 static thumbnail_size_type thumbnail_sizes[] = {
    119 { 7281, 512, 288 }, //1.777778
    120 { 6826, 480, 288 }, //1.666667
    121 { 6808, 256, 154 }, //1.66233
    122 { 6144, 432, 288 }, //1.5
    123 { 5461, 512, 384 }, //1.333333
    124 { 5006, 352, 288 }, //1.222222
    125 { 5461, 320, 240 }, //1.33333
    126 { 5006, 176, 144 }, //1.222222
    127 
    128 };
    129 
    130 static struct camera_size_type zsl_picture_sizes[] = {
    131   { 1280, 960}, // 1.3MP
    132   { 800, 600}, //SVGA
    133   { 800, 480}, // WVGA
    134   { 640, 480}, // VGA
    135   { 352, 288}, //CIF
    136   { 320, 240}, // QVGA
    137   { 176, 144} // QCIF
    138 };
    139 
    140 static camera_size_type default_picture_sizes[] = {
    141   { 4000, 3000}, // 12MP
    142   { 3264, 2448}, // 8MP
    143   { 3264, 1836}, // Picture Size to match 1080p,720p AR
    144   { 3264, 2176}, // Picture Size to match 480p AR
    145   { 2592, 1944}, // 5MP
    146   { 2048, 1536}, // 3MP QXGA
    147   { 1920, 1080}, // HD1080
    148   { 1600, 1200}, // 2MP UXGA
    149   { 1280, 960}, // 1.3MP
    150   { 1280, 720},
    151   { 720, 480},
    152   { 800, 480}, // WVGA
    153   { 640, 480}, // VGA
    154   { 352, 288}, // CIF
    155   { 320, 240}, // QVGA
    156   { 176, 144} // QCIF
    157 };
    158 
    159 static int iso_speed_values[] = {
    160     0, 1, 100, 200, 400, 800, 1600
    161 };
    162 
    163 extern int HAL_numOfCameras;
    164 extern qcamera_info_t HAL_cameraInfo[MSM_MAX_CAMERA_SENSORS];
    165 extern mm_camera_t * HAL_camerahandle[MSM_MAX_CAMERA_SENSORS];
    166 
    167 namespace android {
    168 
    169 static uint32_t  HFR_SIZE_COUNT=2;
    170 static const int PICTURE_FORMAT_JPEG = 1;
    171 static const int PICTURE_FORMAT_RAW = 2;
    172 
    173 /********************************************************************/
    174 static const str_map effects[] = {
    175     { QCameraParameters::EFFECT_NONE,       CAMERA_EFFECT_OFF },
    176     { QCameraParameters::EFFECT_MONO,       CAMERA_EFFECT_MONO },
    177     { QCameraParameters::EFFECT_NEGATIVE,   CAMERA_EFFECT_NEGATIVE },
    178     { QCameraParameters::EFFECT_SOLARIZE,   CAMERA_EFFECT_SOLARIZE },
    179     { QCameraParameters::EFFECT_SEPIA,      CAMERA_EFFECT_SEPIA },
    180     { QCameraParameters::EFFECT_POSTERIZE,  CAMERA_EFFECT_POSTERIZE },
    181     { QCameraParameters::EFFECT_AQUA,       CAMERA_EFFECT_AQUA },
    182     { QCameraParameters::EFFECT_EMBOSS,     CAMERA_EFFECT_EMBOSS },
    183     { QCameraParameters::EFFECT_SKETCH,     CAMERA_EFFECT_SKETCH },
    184     { QCameraParameters::EFFECT_NEON,       CAMERA_EFFECT_NEON }
    185 };
    186 
    187 static const str_map iso[] = {
    188     { QCameraParameters::ISO_AUTO,  CAMERA_ISO_AUTO},
    189     { QCameraParameters::ISO_HJR,   CAMERA_ISO_DEBLUR},
    190     { QCameraParameters::ISO_100,   CAMERA_ISO_100},
    191     { QCameraParameters::ISO_200,   CAMERA_ISO_200},
    192     { QCameraParameters::ISO_400,   CAMERA_ISO_400},
    193     { QCameraParameters::ISO_800,   CAMERA_ISO_800 },
    194     { QCameraParameters::ISO_1600,  CAMERA_ISO_1600 }
    195 };
    196 
    197 static const str_map scenemode[] = {
    198     { QCameraParameters::SCENE_MODE_AUTO,           CAMERA_BESTSHOT_OFF },
    199     { QCameraParameters::SCENE_MODE_ASD,            CAMERA_BESTSHOT_AUTO },
    200     { QCameraParameters::SCENE_MODE_ACTION,         CAMERA_BESTSHOT_ACTION },
    201     { QCameraParameters::SCENE_MODE_PORTRAIT,       CAMERA_BESTSHOT_PORTRAIT },
    202     { QCameraParameters::SCENE_MODE_LANDSCAPE,      CAMERA_BESTSHOT_LANDSCAPE },
    203     { QCameraParameters::SCENE_MODE_NIGHT,          CAMERA_BESTSHOT_NIGHT },
    204     { QCameraParameters::SCENE_MODE_NIGHT_PORTRAIT, CAMERA_BESTSHOT_NIGHT_PORTRAIT },
    205     { QCameraParameters::SCENE_MODE_THEATRE,        CAMERA_BESTSHOT_THEATRE },
    206     { QCameraParameters::SCENE_MODE_BEACH,          CAMERA_BESTSHOT_BEACH },
    207     { QCameraParameters::SCENE_MODE_SNOW,           CAMERA_BESTSHOT_SNOW },
    208     { QCameraParameters::SCENE_MODE_SUNSET,         CAMERA_BESTSHOT_SUNSET },
    209     { QCameraParameters::SCENE_MODE_STEADYPHOTO,    CAMERA_BESTSHOT_ANTISHAKE },
    210     { QCameraParameters::SCENE_MODE_FIREWORKS ,     CAMERA_BESTSHOT_FIREWORKS },
    211     { QCameraParameters::SCENE_MODE_SPORTS ,        CAMERA_BESTSHOT_SPORTS },
    212     { QCameraParameters::SCENE_MODE_PARTY,          CAMERA_BESTSHOT_PARTY },
    213     { QCameraParameters::SCENE_MODE_CANDLELIGHT,    CAMERA_BESTSHOT_CANDLELIGHT },
    214     { QCameraParameters::SCENE_MODE_BACKLIGHT,      CAMERA_BESTSHOT_BACKLIGHT },
    215     { QCameraParameters::SCENE_MODE_FLOWERS,        CAMERA_BESTSHOT_FLOWERS },
    216     { QCameraParameters::SCENE_MODE_AR,             CAMERA_BESTSHOT_AR },
    217     { QCameraParameters::SCENE_MODE_HDR,            CAMERA_BESTSHOT_AUTO },
    218 };
    219 
    220 static const str_map scenedetect[] = {
    221     { QCameraParameters::SCENE_DETECT_OFF, false  },
    222     { QCameraParameters::SCENE_DETECT_ON, true },
    223 };
    224 
    225 #define DONT_CARE AF_MODE_MAX
    226 // These are listed as the supported focus-modes for cameras with AF
    227 static const str_map focus_modes_auto[] = {
    228     { QCameraParameters::FOCUS_MODE_AUTO,     AF_MODE_AUTO},
    229     { QCameraParameters::FOCUS_MODE_INFINITY, AF_MODE_INFINITY },
    230     { QCameraParameters::FOCUS_MODE_NORMAL,   AF_MODE_NORMAL },
    231     { QCameraParameters::FOCUS_MODE_MACRO,    AF_MODE_MACRO },
    232     { QCameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE, AF_MODE_CAF},
    233     { QCameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO, AF_MODE_CAF },
    234     // Note that "FIXED" is omitted
    235 };
    236 
    237 // These are the supported focus-modes for cameras without AF
    238 static const str_map focus_modes_fixed[] = {
    239     { QCameraParameters::FOCUS_MODE_FIXED,    AF_MODE_INFINITY },
    240 };
    241 
    242 static const str_map selectable_zone_af[] = {
    243     { QCameraParameters::SELECTABLE_ZONE_AF_AUTO,  AUTO },
    244     { QCameraParameters::SELECTABLE_ZONE_AF_SPOT_METERING, SPOT },
    245     { QCameraParameters::SELECTABLE_ZONE_AF_CENTER_WEIGHTED, CENTER_WEIGHTED },
    246     { QCameraParameters::SELECTABLE_ZONE_AF_FRAME_AVERAGE, AVERAGE }
    247 };
    248 
    249 static const str_map autoexposure[] = {
    250     { QCameraParameters::AUTO_EXPOSURE_FRAME_AVG,  CAMERA_AEC_FRAME_AVERAGE },
    251     { QCameraParameters::AUTO_EXPOSURE_CENTER_WEIGHTED, CAMERA_AEC_CENTER_WEIGHTED },
    252     { QCameraParameters::AUTO_EXPOSURE_SPOT_METERING, CAMERA_AEC_SPOT_METERING }
    253 };
    254 
    255 // from aeecamera.h
    256 static const str_map whitebalance[] = {
    257     { QCameraParameters::WHITE_BALANCE_AUTO,            CAMERA_WB_AUTO },
    258     { QCameraParameters::WHITE_BALANCE_INCANDESCENT,    CAMERA_WB_INCANDESCENT },
    259     { QCameraParameters::WHITE_BALANCE_FLUORESCENT,     CAMERA_WB_FLUORESCENT },
    260     { QCameraParameters::WHITE_BALANCE_DAYLIGHT,        CAMERA_WB_DAYLIGHT },
    261     { QCameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT, CAMERA_WB_CLOUDY_DAYLIGHT }
    262 };
    263 
    264 static const str_map antibanding[] = {
    265     { QCameraParameters::ANTIBANDING_OFF,  CAMERA_ANTIBANDING_OFF },
    266     { QCameraParameters::ANTIBANDING_50HZ, CAMERA_ANTIBANDING_50HZ },
    267     { QCameraParameters::ANTIBANDING_60HZ, CAMERA_ANTIBANDING_60HZ },
    268     { QCameraParameters::ANTIBANDING_AUTO, CAMERA_ANTIBANDING_AUTO }
    269 };
    270 
    271 static const str_map frame_rate_modes[] = {
    272         {QCameraParameters::KEY_PREVIEW_FRAME_RATE_AUTO_MODE, FPS_MODE_AUTO},
    273         {QCameraParameters::KEY_PREVIEW_FRAME_RATE_FIXED_MODE, FPS_MODE_FIXED}
    274 };
    275 
    276 static const str_map touchafaec[] = {
    277     { QCameraParameters::TOUCH_AF_AEC_OFF, false },
    278     { QCameraParameters::TOUCH_AF_AEC_ON, true }
    279 };
    280 
    281 static const str_map hfr[] = {
    282     { QCameraParameters::VIDEO_HFR_OFF, CAMERA_HFR_MODE_OFF },
    283     { QCameraParameters::VIDEO_HFR_2X, CAMERA_HFR_MODE_60FPS },
    284     { QCameraParameters::VIDEO_HFR_3X, CAMERA_HFR_MODE_90FPS },
    285     { QCameraParameters::VIDEO_HFR_4X, CAMERA_HFR_MODE_120FPS },
    286 };
    287 static const int HFR_VALUES_COUNT = (sizeof(hfr)/sizeof(str_map));
    288 
    289 static const str_map flash[] = {
    290     { QCameraParameters::FLASH_MODE_OFF,  LED_MODE_OFF },
    291     { QCameraParameters::FLASH_MODE_AUTO, LED_MODE_AUTO },
    292     { QCameraParameters::FLASH_MODE_ON, LED_MODE_ON },
    293     { QCameraParameters::FLASH_MODE_TORCH, LED_MODE_TORCH}
    294 };
    295 
    296 static const str_map lensshade[] = {
    297     { QCameraParameters::LENSSHADE_ENABLE, true },
    298     { QCameraParameters::LENSSHADE_DISABLE, false }
    299 };
    300 
    301 static const str_map mce[] = {
    302     { QCameraParameters::MCE_ENABLE, true },
    303     { QCameraParameters::MCE_DISABLE, false }
    304 };
    305 
    306 static const str_map histogram[] = {
    307     { QCameraParameters::HISTOGRAM_ENABLE, true },
    308     { QCameraParameters::HISTOGRAM_DISABLE, false }
    309 };
    310 
    311 static const str_map skinToneEnhancement[] = {
    312     { QCameraParameters::SKIN_TONE_ENHANCEMENT_ENABLE, true },
    313     { QCameraParameters::SKIN_TONE_ENHANCEMENT_DISABLE, false }
    314 };
    315 
    316 static const str_map denoise[] = {
    317     { QCameraParameters::DENOISE_OFF, false },
    318     { QCameraParameters::DENOISE_ON, true }
    319 };
    320 
    321 static const str_map facedetection[] = {
    322     { QCameraParameters::FACE_DETECTION_OFF, false },
    323     { QCameraParameters::FACE_DETECTION_ON, true }
    324 };
    325 
    326 static const str_map redeye_reduction[] = {
    327     { QCameraParameters::REDEYE_REDUCTION_ENABLE, true },
    328     { QCameraParameters::REDEYE_REDUCTION_DISABLE, false }
    329 };
    330 
    331 static const str_map picture_formats[] = {
    332         {QCameraParameters::PIXEL_FORMAT_JPEG, PICTURE_FORMAT_JPEG},
    333         {QCameraParameters::PIXEL_FORMAT_RAW, PICTURE_FORMAT_RAW}
    334 };
    335 
    336 static const str_map recording_Hints[] = {
    337         {"false", false},
    338         {"true",  true}
    339 };
    340 
    341 static const str_map preview_formats[] = {
    342         {QCameraParameters::PIXEL_FORMAT_YUV420SP,   HAL_PIXEL_FORMAT_YCrCb_420_SP},
    343         {QCameraParameters::PIXEL_FORMAT_YUV420SP_ADRENO, HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO},
    344         {QCameraParameters::PIXEL_FORMAT_YV12, HAL_PIXEL_FORMAT_YV12},
    345         {QCameraParameters::PIXEL_FORMAT_YUV420P,HAL_PIXEL_FORMAT_YV12},
    346         {QCameraParameters::PIXEL_FORMAT_NV12, HAL_PIXEL_FORMAT_YCbCr_420_SP}
    347 };
    348 
    349 static const preview_format_info_t preview_format_info_list[] = {
    350   {HAL_PIXEL_FORMAT_YCrCb_420_SP, CAMERA_YUV_420_NV21, CAMERA_PAD_TO_WORD, 2},
    351   {HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO, CAMERA_YUV_420_NV21, CAMERA_PAD_TO_4K, 2},
    352   {HAL_PIXEL_FORMAT_YCbCr_420_SP, CAMERA_YUV_420_NV12, CAMERA_PAD_TO_WORD, 2},
    353   {HAL_PIXEL_FORMAT_YV12,         CAMERA_YUV_420_YV12, CAMERA_PAD_TO_WORD, 3}
    354 };
    355 
    356 static const str_map zsl_modes[] = {
    357     { QCameraParameters::ZSL_OFF, false },
    358     { QCameraParameters::ZSL_ON, true },
    359 };
    360 
    361 
    362 static const str_map hdr_bracket[] = {
    363     { QCameraParameters::AE_BRACKET_HDR_OFF,HDR_BRACKETING_OFF},
    364     { QCameraParameters::AE_BRACKET_HDR,HDR_MODE },
    365 };
    366 
    367 typedef enum {
    368     NORMAL_POWER,
    369     LOW_POWER
    370 } power_mode;
    371 
    372 static const str_map power_modes[] = {
    373     { QCameraParameters::NORMAL_POWER,NORMAL_POWER },
    374     { QCameraParameters::LOW_POWER,LOW_POWER }
    375 };
    376 
    377 /**************************************************************************/
    378 static int attr_lookup(const str_map arr[], int len, const char *name)
    379 {
    380     if (name) {
    381         for (int i = 0; i < len; i++) {
    382             if (!strcmp(arr[i].desc, name))
    383                 return arr[i].val;
    384         }
    385     }
    386     return NOT_FOUND;
    387 }
    388 
    389 bool QCameraHardwareInterface::native_set_parms(
    390     mm_camera_parm_type_t type, uint16_t length, void *value)
    391 {
    392     ALOGV("%s : type : %d Value : %d",__func__,type,*((int *)value));
    393     if(MM_CAMERA_OK != cam_config_set_parm(mCameraId, type,value )) {
    394         ALOGE("native_set_parms failed: type %d length %d error %s",
    395             type, length, strerror(errno));
    396         return false;
    397     }
    398 
    399     return true;
    400 
    401 }
    402 
    403 bool QCameraHardwareInterface::native_set_parms(
    404     mm_camera_parm_type_t type, uint16_t length, void *value, int *result)
    405 {
    406     *result= cam_config_set_parm(mCameraId, type,value );
    407     if(MM_CAMERA_OK == *result) {
    408         ALOGV("native_set_parms: succeeded : %d", *result);
    409         return true;
    410     }
    411 
    412     ALOGE("native_set_parms failed: type %d length %d error str %s error# %d",
    413         type, length, strerror(errno), errno);
    414     return false;
    415 }
    416 
    417 //Filter Picture sizes based on max width and height
    418 /* TBD: do we still need this - except for ZSL? */
    419 void QCameraHardwareInterface::filterPictureSizes(){
    420     unsigned int i;
    421     if(mPictureSizeCount <= 0)
    422         return;
    423     maxSnapshotWidth = mPictureSizes[0].width;
    424     maxSnapshotHeight = mPictureSizes[0].height;
    425    // Iterate through all the width and height to find the max value
    426     for(i =0; i<mPictureSizeCount;i++){
    427         if(((maxSnapshotWidth < mPictureSizes[i].width) &&
    428             (maxSnapshotHeight <= mPictureSizes[i].height))){
    429             maxSnapshotWidth = mPictureSizes[i].width;
    430             maxSnapshotHeight = mPictureSizes[i].height;
    431         }
    432     }
    433     if(myMode & CAMERA_ZSL_MODE){
    434         // due to lack of PMEM we restrict to lower resolution
    435         mPictureSizesPtr = zsl_picture_sizes;
    436         mSupportedPictureSizesCount = 7;
    437     }else{
    438         mPictureSizesPtr = mPictureSizes;
    439         mSupportedPictureSizesCount = mPictureSizeCount;
    440     }
    441 }
    442 
    443 static String8 create_sizes_str(const camera_size_type *sizes, int len) {
    444     String8 str;
    445     char buffer[32];
    446 
    447     if (len > 0) {
    448         snprintf(buffer, sizeof(buffer), "%dx%d", sizes[0].width, sizes[0].height);
    449         str.append(buffer);
    450     }
    451     for (int i = 1; i < len; i++) {
    452         snprintf(buffer, sizeof(buffer), ",%dx%d", sizes[i].width, sizes[i].height);
    453         str.append(buffer);
    454     }
    455     return str;
    456 }
    457 
    458 String8 QCameraHardwareInterface::create_values_str(const str_map *values, int len) {
    459     String8 str;
    460 
    461     if (len > 0) {
    462         str.append(values[0].desc);
    463     }
    464     for (int i = 1; i < len; i++) {
    465         str.append(",");
    466         str.append(values[i].desc);
    467     }
    468     return str;
    469 }
    470 
    471 static String8 create_fps_str(const android:: FPSRange* fps, int len) {
    472     String8 str;
    473     char buffer[32];
    474 
    475     if (len > 0) {
    476         snprintf(buffer, sizeof(buffer), "(%d,%d)", fps[0].minFPS, fps[0].maxFPS);
    477         str.append(buffer);
    478     }
    479     for (int i = 1; i < len; i++) {
    480         snprintf(buffer, sizeof(buffer), ",(%d,%d)", fps[i].minFPS, fps[i].maxFPS);
    481         str.append(buffer);
    482     }
    483     return str;
    484 }
    485 
    486 static String8 create_values_range_str(int min, int max){
    487     String8 str;
    488     char buffer[32];
    489 
    490     if(min <= max){
    491         snprintf(buffer, sizeof(buffer), "%d", min);
    492         str.append(buffer);
    493 
    494         for (int i = min + 1; i <= max; i++) {
    495             snprintf(buffer, sizeof(buffer), ",%d", i);
    496             str.append(buffer);
    497         }
    498     }
    499     return str;
    500 }
    501 
    502 static int parse_size(const char *str, int &width, int &height)
    503 {
    504     // Find the width.
    505     char *end;
    506     int w = (int)strtol(str, &end, 10);
    507     // If an 'x' or 'X' does not immediately follow, give up.
    508     if ( (*end != 'x') && (*end != 'X') )
    509         return -1;
    510 
    511     // Find the height, immediately after the 'x'.
    512     int h = (int)strtol(end+1, 0, 10);
    513 
    514     width = w;
    515     height = h;
    516 
    517     return 0;
    518 }
    519 
    520 bool QCameraHardwareInterface::isValidDimension(int width, int height) {
    521     bool retVal = false;
    522     /* This function checks if a given resolution is valid or not.
    523      * A particular resolution is considered valid if it satisfies
    524      * the following conditions:
    525      * 1. width & height should be multiple of 16.
    526      * 2. width & height should be less than/equal to the dimensions
    527      *    supported by the camera sensor.
    528      * 3. the aspect ratio is a valid aspect ratio and is among the
    529      *    commonly used aspect ratio as determined by the thumbnail_sizes
    530      *    data structure.
    531      */
    532 
    533     if( (width == CEILING16(width)) && (height == CEILING16(height))
    534      && (width <= maxSnapshotWidth)
    535     && (height <= maxSnapshotHeight) )
    536     {
    537         uint32_t pictureAspectRatio = (uint32_t)((width * Q12)/height);
    538         for(uint32_t i = 0; i < THUMBNAIL_SIZE_COUNT; i++ ) {
    539             if(thumbnail_sizes[i].aspect_ratio == pictureAspectRatio) {
    540                 retVal = true;
    541                 break;
    542             }
    543         }
    544     }
    545     return retVal;
    546 }
    547 
    548 void QCameraHardwareInterface::hasAutoFocusSupport(){
    549 
    550     ALOGV("%s",__func__);
    551 
    552     if(isZSLMode()){
    553         mHasAutoFocusSupport = false;
    554         return;
    555     }
    556 
    557     if(cam_ops_is_op_supported (mCameraId, MM_CAMERA_OPS_FOCUS )) {
    558         mHasAutoFocusSupport = true;
    559     }
    560     else {
    561         ALOGV("AutoFocus is not supported");
    562         mHasAutoFocusSupport = false;
    563     }
    564 
    565     ALOGV("%s:rc= %d",__func__, mHasAutoFocusSupport);
    566 
    567 }
    568 
    569 bool QCameraHardwareInterface::supportsSceneDetection() {
    570    bool rc = cam_config_is_parm_supported(mCameraId,MM_CAMERA_PARM_ASD_ENABLE);
    571    return rc;
    572 }
    573 
    574 bool QCameraHardwareInterface::supportsFaceDetection() {
    575     bool rc;
    576 
    577     status_t ret = NO_ERROR;
    578     mm_camera_op_mode_type_t op_mode;
    579 
    580     ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_OP_MODE, &op_mode);
    581     if(ret != NO_ERROR){
    582         ALOGE("%s: Failed to get Op Mode", __func__);
    583     }
    584 
    585     ALOGV("%s: OP_Mode is %d, ret=%d, mHdrMode=%d",__func__,op_mode,ret,mHdrMode);
    586     if ((ret == NO_ERROR) && (op_mode == MM_CAMERA_OP_MODE_VIDEO) && (mHdrMode != HDR_MODE))
    587     {
    588         ALOGV("%s: Video mode : FD not supported",__func__);
    589         return false;
    590     }
    591     else{
    592         rc = cam_config_is_parm_supported(mCameraId,MM_CAMERA_PARM_FD);
    593         ALOGV("%s: Still mode : FD supported : %d",__func__,rc);
    594         return rc;
    595     }
    596 }
    597 
    598 bool QCameraHardwareInterface::supportsSelectableZoneAf() {
    599    bool rc = cam_config_is_parm_supported(mCameraId,MM_CAMERA_PARM_FOCUS_RECT);
    600    return rc;
    601 }
    602 
    603 bool QCameraHardwareInterface::supportsRedEyeReduction() {
    604    bool rc = cam_config_is_parm_supported(mCameraId,MM_CAMERA_PARM_REDEYE_REDUCTION);
    605    return rc;
    606 }
    607 
    608 static String8 create_str(int16_t *arr, int length){
    609     String8 str;
    610     char buffer[32] = {0};
    611 
    612     if(length > 0){
    613         snprintf(buffer, sizeof(buffer), "%d", arr[0]);
    614         str.append(buffer);
    615     }
    616 
    617     for (int i =1;i<length;i++){
    618         snprintf(buffer, sizeof(buffer), ",%d",arr[i]);
    619         str.append(buffer);
    620     }
    621     return str;
    622 }
    623 
    624 bool QCameraHardwareInterface::getMaxPictureDimension(mm_camera_dimension_t *maxDim)
    625 {
    626     bool ret = NO_ERROR;
    627     mm_camera_dimension_t dim;
    628 
    629     ret = cam_config_get_parm(mCameraId,
    630                               MM_CAMERA_PARM_MAX_PICTURE_SIZE, &dim);
    631     if (ret != NO_ERROR)
    632         return ret;
    633 
    634     /* Find the first dimension in the mPictureSizes
    635      * array which is smaller than the max dimension.
    636      * This will be the valid max picture resolution */
    637     for (unsigned int i = 0; i < mPictureSizeCount; i++) {
    638         if ((mPictureSizes[i].width <= dim.width) &&
    639             (mPictureSizes[i].height <= dim.height)) {
    640             maxDim->height = mPictureSizes[i].height;
    641             maxDim->width  = mPictureSizes[i].width;
    642             break;
    643         }
    644     }
    645     ALOGV("%s: Found Max Picture dimension: %d x %d", __func__,
    646           maxDim->width, maxDim->height);
    647     return ret;
    648 }
    649 void QCameraHardwareInterface::loadTables()
    650 {
    651 
    652     bool ret = NO_ERROR;
    653     ALOGV("%s: E", __func__);
    654 
    655     ret = cam_config_get_parm(mCameraId,
    656             MM_CAMERA_PARM_PREVIEW_SIZES_CNT, &preview_sizes_count);
    657 
    658     default_sizes_tbl_t preview_sizes_tbl;
    659     preview_sizes_tbl.tbl_size=preview_sizes_count;
    660     preview_sizes_tbl.sizes_tbl=&default_preview_sizes[0];
    661     if(MM_CAMERA_OK != cam_config_get_parm(mCameraId,
    662                             MM_CAMERA_PARM_DEF_PREVIEW_SIZES, &preview_sizes_tbl)){
    663         ALOGE("%s:Failed to get default preview sizes",__func__);
    664     }
    665     ret = cam_config_get_parm(mCameraId,
    666                 MM_CAMERA_PARM_VIDEO_SIZES_CNT, &video_sizes_count);
    667 
    668     default_sizes_tbl_t video_sizes_tbl;
    669     video_sizes_tbl.tbl_size=video_sizes_count;
    670     video_sizes_tbl.sizes_tbl=&default_video_sizes[0];
    671     if(MM_CAMERA_OK != cam_config_get_parm(mCameraId,
    672                             MM_CAMERA_PARM_DEF_VIDEO_SIZES, &video_sizes_tbl)){
    673         ALOGE("%s:Failed to get default video sizes",__func__);
    674     }
    675 
    676     ret = cam_config_get_parm(mCameraId,
    677                 MM_CAMERA_PARM_THUMB_SIZES_CNT, &thumbnail_sizes_count);
    678 
    679     default_sizes_tbl_t thumbnail_sizes_tbl;
    680     thumbnail_sizes_tbl.tbl_size=thumbnail_sizes_count;
    681     thumbnail_sizes_tbl.sizes_tbl=&default_thumbnail_sizes[0];
    682     if(MM_CAMERA_OK != cam_config_get_parm(mCameraId,
    683                             MM_CAMERA_PARM_DEF_THUMB_SIZES, &thumbnail_sizes_tbl)){
    684         ALOGE("%s:Failed to get default thumbnail sizes",__func__);
    685     }
    686 
    687     ret = cam_config_get_parm(mCameraId,
    688                 MM_CAMERA_PARM_HFR_SIZES_CNT, &hfr_sizes_count);
    689 
    690     default_sizes_tbl_t hfr_sizes_tbl;
    691     hfr_sizes_tbl.tbl_size=hfr_sizes_count;
    692     hfr_sizes_tbl.sizes_tbl=&default_hfr_sizes[0];
    693     if(MM_CAMERA_OK != cam_config_get_parm(mCameraId,
    694                             MM_CAMERA_PARM_DEF_HFR_SIZES, &hfr_sizes_tbl)){
    695         ALOGE("%s:Failed to get default HFR  sizes",__func__);
    696     }
    697     ALOGV("%s: X", __func__);
    698 }
    699 
    700 rat_t getRational(int num, int denom)
    701 {
    702     rat_t temp = {num, denom};
    703     return temp;
    704 }
    705 
    706 void QCameraHardwareInterface::initDefaultParameters()
    707 {
    708     bool ret;
    709     char prop[PROPERTY_VALUE_MAX];
    710     mm_camera_dimension_t maxDim;
    711     int rc = MM_CAMERA_OK;
    712     ALOGV("%s: E", __func__);
    713 
    714     memset(&maxDim, 0, sizeof(mm_camera_dimension_t));
    715     ret = getMaxPictureDimension(&maxDim);
    716 
    717     if (ret != NO_ERROR) {
    718         ALOGE("%s: Cannot get Max picture size supported", __func__);
    719         return;
    720     }
    721     if (!maxDim.width || !maxDim.height) {
    722         maxDim.width = DEFAULT_LIVESHOT_WIDTH;
    723         maxDim.height = DEFAULT_LIVESHOT_HEIGHT;
    724     }
    725 
    726     memset(prop, 0, sizeof(prop));
    727     property_get("persist.camera.snap.format", prop, "0");
    728     mSnapshotFormat = atoi(prop);
    729     ALOGV("%s: prop =(%s), snap_format=%d", __func__, prop, mSnapshotFormat);
    730 
    731     //cam_ctrl_dimension_t dim;
    732     mHFRLevel = 0;
    733     memset(&mDimension, 0, sizeof(cam_ctrl_dimension_t));
    734     memset(&mPreviewFormatInfo, 0, sizeof(preview_format_info_t));
    735     mDimension.video_width     = DEFAULT_VIDEO_WIDTH;
    736     mDimension.video_height    = DEFAULT_VIDEO_HEIGHT;
    737     // mzhu mDimension.picture_width   = DEFAULT_STREAM_WIDTH;
    738     // mzhu mDimension.picture_height  = DEFAULT_STREAM_HEIGHT;
    739     mDimension.picture_width   = maxDim.width;
    740     mDimension.picture_height  = maxDim.height;
    741     mDimension.display_width   = DEFAULT_STREAM_WIDTH;
    742     mDimension.display_height  = DEFAULT_STREAM_HEIGHT;
    743     mDimension.orig_picture_dx = mDimension.picture_width;
    744     mDimension.orig_picture_dy = mDimension.picture_height;
    745     mDimension.ui_thumbnail_width = DEFAULT_STREAM_WIDTH;
    746     mDimension.ui_thumbnail_height = DEFAULT_STREAM_HEIGHT;
    747     mDimension.orig_video_width = DEFAULT_STREAM_WIDTH;
    748     mDimension.orig_video_height = DEFAULT_STREAM_HEIGHT;
    749 
    750     mDimension.prev_format     = CAMERA_YUV_420_NV21;
    751     mDimension.enc_format      = CAMERA_YUV_420_NV12;
    752     if (mSnapshotFormat == 1) {
    753       mDimension.main_img_format = CAMERA_YUV_422_NV61;
    754     } else {
    755       mDimension.main_img_format = CAMERA_YUV_420_NV21;
    756     }
    757     mDimension.thumb_format    = CAMERA_YUV_420_NV21;
    758     ALOGV("%s: main_img_format =%d, thumb_format=%d", __func__,
    759          mDimension.main_img_format, mDimension.thumb_format);
    760     mDimension.prev_padding_format = CAMERA_PAD_TO_WORD;
    761 
    762     ret = native_set_parms(MM_CAMERA_PARM_DIMENSION,
    763                               sizeof(cam_ctrl_dimension_t), (void *) &mDimension);
    764     if(!ret) {
    765       ALOGE("MM_CAMERA_PARM_DIMENSION Failed.");
    766       return;
    767     }
    768 
    769     hasAutoFocusSupport();
    770 
    771     // Initialize constant parameter strings. This will happen only once in the
    772     // lifetime of the mediaserver process.
    773     if (true/*!mParamStringInitialized*/) {
    774         //filter picture sizes
    775         filterPictureSizes();
    776         mPictureSizeValues = create_sizes_str(
    777                 mPictureSizesPtr, mSupportedPictureSizesCount);
    778         mPreviewSizeValues = create_sizes_str(
    779                 mPreviewSizes,  mPreviewSizeCount);
    780         mVideoSizeValues = create_sizes_str(
    781                 mVideoSizes,  mVideoSizeCount);
    782 
    783         //Query for max HFR value
    784         camera_hfr_mode_t maxHFR;
    785         cam_config_get_parm(mCameraId, MM_CAMERA_PARM_MAX_HFR_MODE, (void *)&maxHFR);
    786         //Filter HFR values and build parameter string
    787         String8 str;
    788         for(int i=0; i<HFR_VALUES_COUNT; i++){
    789             if(hfr[i].val <= maxHFR){
    790                 if(i>0)	str.append(",");
    791                 str.append(hfr[i].desc);
    792             }
    793         }
    794         mHfrValues = str;
    795         mHfrSizeValues = create_sizes_str(
    796                 default_hfr_sizes, hfr_sizes_count);
    797         mFpsRangesSupportedValues = create_fps_str(
    798             FpsRangesSupported,FPS_RANGES_SUPPORTED_COUNT );
    799         mParameters.set(
    800             QCameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
    801             mFpsRangesSupportedValues);
    802         mParameters.setPreviewFpsRange(MINIMUM_FPS*1000,MAXIMUM_FPS*1000);
    803         mFlashValues = create_values_str(
    804             flash, sizeof(flash) / sizeof(str_map));
    805         mLensShadeValues = create_values_str(
    806             lensshade,sizeof(lensshade)/sizeof(str_map));
    807         mMceValues = create_values_str(
    808             mce,sizeof(mce)/sizeof(str_map));
    809         mEffectValues = create_values_str(effects, sizeof(effects) / sizeof(str_map));
    810         mAntibandingValues = create_values_str(
    811             antibanding, sizeof(antibanding) / sizeof(str_map));
    812         mIsoValues = create_values_str(iso,sizeof(iso)/sizeof(str_map));
    813         mAutoExposureValues = create_values_str(
    814             autoexposure, sizeof(autoexposure) / sizeof(str_map));
    815         mWhitebalanceValues = create_values_str(
    816             whitebalance, sizeof(whitebalance) / sizeof(str_map));
    817 
    818         if(mHasAutoFocusSupport){
    819             mFocusModeValues = create_values_str(
    820                     focus_modes_auto, sizeof(focus_modes_auto) / sizeof(str_map));
    821         }
    822 
    823         mSceneModeValues = create_values_str(scenemode, sizeof(scenemode) / sizeof(str_map));
    824 
    825         if(mHasAutoFocusSupport){
    826             mTouchAfAecValues = create_values_str(
    827                 touchafaec,sizeof(touchafaec)/sizeof(str_map));
    828         }
    829         //Currently Enabling Histogram for 8x60
    830         mHistogramValues = create_values_str(
    831             histogram,sizeof(histogram)/sizeof(str_map));
    832 
    833         mSkinToneEnhancementValues = create_values_str(
    834             skinToneEnhancement,sizeof(skinToneEnhancement)/sizeof(str_map));
    835 
    836         mPictureFormatValues = create_values_str(
    837             picture_formats, sizeof(picture_formats)/sizeof(str_map));
    838 
    839         mZoomSupported=false;
    840         mMaxZoom=0;
    841         mm_camera_zoom_tbl_t zmt;
    842         if(MM_CAMERA_OK != cam_config_get_parm(mCameraId,
    843                              MM_CAMERA_PARM_MAXZOOM, &mMaxZoom)){
    844             ALOGE("%s:Failed to get max zoom",__func__);
    845         }else{
    846 
    847             ALOGV("Max Zoom:%d",mMaxZoom);
    848             /* Kernel driver limits the max amount of data that can be retreived through a control
    849             command to 260 bytes hence we conservatively limit to 110 zoom ratios */
    850             if(mMaxZoom>MAX_ZOOM_RATIOS) {
    851                 ALOGV("%s:max zoom is larger than sizeof zoomRatios table",__func__);
    852                 mMaxZoom=MAX_ZOOM_RATIOS-1;
    853             }
    854             zmt.size=mMaxZoom;
    855             zmt.zoom_ratio_tbl=&zoomRatios[0];
    856             if(MM_CAMERA_OK != cam_config_get_parm(mCameraId,
    857                                  MM_CAMERA_PARM_ZOOM_RATIO, &zmt)){
    858                 ALOGE("%s:Failed to get max zoom ratios",__func__);
    859             }else{
    860                 mZoomSupported=true;
    861                 mZoomRatioValues =  create_str(zoomRatios, mMaxZoom);
    862             }
    863         }
    864 
    865         ALOGV("Zoom supported:%d",mZoomSupported);
    866 
    867         denoise_value = create_values_str(
    868             denoise, sizeof(denoise) / sizeof(str_map));
    869 
    870        if(supportsFaceDetection()) {
    871             mFaceDetectionValues = create_values_str(
    872                 facedetection, sizeof(facedetection) / sizeof(str_map));
    873         }
    874 
    875         if(mHasAutoFocusSupport){
    876             mSelectableZoneAfValues = create_values_str(
    877                 selectable_zone_af, sizeof(selectable_zone_af) / sizeof(str_map));
    878         }
    879 
    880         mSceneDetectValues = create_values_str(scenedetect, sizeof(scenedetect) / sizeof(str_map));
    881 
    882         mRedeyeReductionValues = create_values_str(
    883             redeye_reduction, sizeof(redeye_reduction) / sizeof(str_map));
    884 
    885         mZslValues = create_values_str(
    886             zsl_modes,sizeof(zsl_modes)/sizeof(str_map));
    887 
    888         mParamStringInitialized = true;
    889     }
    890 
    891     //set supported video sizes
    892     mParameters.set(QCameraParameters::KEY_SUPPORTED_VIDEO_SIZES, mVideoSizeValues.string());
    893 
    894     //set default video size to first one in supported table
    895     String8 vSize = create_sizes_str(&mVideoSizes[0], 1);
    896     mParameters.set(QCameraParameters::KEY_VIDEO_SIZE, vSize.string());
    897 
    898     //Set Preview size
    899     int default_preview_width, default_preview_height;
    900     cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DEFAULT_PREVIEW_WIDTH,
    901             &default_preview_width);
    902     cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DEFAULT_PREVIEW_HEIGHT,
    903             &default_preview_height);
    904     mParameters.setPreviewSize(default_preview_width, default_preview_height);
    905     mParameters.set(QCameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
    906                     mPreviewSizeValues.string());
    907     mDimension.display_width = default_preview_width;
    908     mDimension.display_height = default_preview_height;
    909 
    910     //Set Preview Frame Rate
    911     if(mFps >= MINIMUM_FPS && mFps <= MAXIMUM_FPS) {
    912         mPreviewFrameRateValues = create_values_range_str(
    913         MINIMUM_FPS, mFps);
    914     }else{
    915         mPreviewFrameRateValues = create_values_range_str(
    916         MINIMUM_FPS, MAXIMUM_FPS);
    917     }
    918 
    919 
    920     if (cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_FPS)) {
    921         mParameters.set(QCameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
    922                         mPreviewFrameRateValues.string());
    923      } else {
    924         mParameters.set(
    925             QCameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
    926             DEFAULT_FIXED_FPS);
    927     }
    928 
    929     //Set Preview Frame Rate Modes
    930     mParameters.setPreviewFrameRateMode("frame-rate-auto");
    931     mFrameRateModeValues = create_values_str(
    932             frame_rate_modes, sizeof(frame_rate_modes) / sizeof(str_map));
    933       if(cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_FPS_MODE)){
    934         mParameters.set(QCameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATE_MODES,
    935                     mFrameRateModeValues.string());
    936     }
    937 
    938     //Set Preview Format
    939     //mParameters.setPreviewFormat("yuv420sp"); // informative
    940     mParameters.setPreviewFormat(QCameraParameters::PIXEL_FORMAT_YUV420SP);
    941 
    942     mPreviewFormatValues = create_values_str(
    943         preview_formats, sizeof(preview_formats) / sizeof(str_map));
    944     mParameters.set(QCameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
    945             mPreviewFormatValues.string());
    946 
    947     //Set Overlay Format
    948     mParameters.set("overlay-format", HAL_PIXEL_FORMAT_YCbCr_420_SP);
    949     mParameters.set("max-num-detected-faces-hw", "2");
    950 
    951     // Set supported max faces
    952     int maxNumFaces = 0;
    953     if (supportsFaceDetection()) {
    954         //Query the maximum number of faces supported by hardware.
    955         if(MM_CAMERA_OK != cam_config_get_parm(mCameraId,
    956                                MM_CAMERA_PARM_MAX_NUM_FACES_DECT, &maxNumFaces)){
    957             ALOGE("%s:Failed to get max number of faces supported",__func__);
    958         }
    959     }
    960     mParameters.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, maxNumFaces);
    961     //This paramtere is set to default here. This will be changed by application
    962     //if it needs to support specific number of faces. See also setParameters.
    963     mParameters.set(QCameraParameters::KEY_MAX_NUM_REQUESTED_FACES, 2);
    964 
    965     // Set camera features supported flag
    966     int32_t featureFlag = 0;
    967     if (supportsFaceDetection()) {
    968         featureFlag |= 0x00000001; // bit 0 indicate faciral feature
    969     }
    970     mParameters.set(QCameraParameters::KEY_SUPPORTED_CAMERA_FEATURES, featureFlag);
    971 
    972     //Set Picture Size
    973     mParameters.setPictureSize(DEFAULT_PICTURE_WIDTH, DEFAULT_PICTURE_HEIGHT);
    974     mParameters.set(QCameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
    975                     mPictureSizeValues.string());
    976 
    977     //Set Preview Frame Rate
    978     if(mFps >= MINIMUM_FPS && mFps <= MAXIMUM_FPS) {
    979         mParameters.setPreviewFrameRate(mFps);
    980     }else{
    981         mParameters.setPreviewFrameRate(DEFAULT_FPS);
    982     }
    983 
    984     //Set Picture Format
    985     mParameters.setPictureFormat("jpeg"); // informative
    986     mParameters.set(QCameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
    987                     mPictureFormatValues);
    988 
    989     mParameters.set(QCameraParameters::KEY_JPEG_QUALITY, "90"); // max quality
    990     mJpegQuality = 90;
    991     //Set Video Format
    992     mParameters.set(QCameraParameters::KEY_VIDEO_FRAME_FORMAT, "yuv420sp");
    993 
    994     //Set Thumbnail parameters
    995     mParameters.set(QCameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
    996                     THUMBNAIL_WIDTH_STR); // informative
    997     mParameters.set(QCameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
    998                     THUMBNAIL_HEIGHT_STR); // informative
    999     mDimension.ui_thumbnail_width =
   1000             thumbnail_sizes[DEFAULT_THUMBNAIL_SETTING].width;
   1001     mDimension.ui_thumbnail_height =
   1002             thumbnail_sizes[DEFAULT_THUMBNAIL_SETTING].height;
   1003     mParameters.set(QCameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, "90");
   1004     String8 valuesStr = create_sizes_str(default_thumbnail_sizes, thumbnail_sizes_count);
   1005     mParameters.set(QCameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
   1006                 valuesStr.string());
   1007     // Define CAMERA_SMOOTH_ZOOM in Android.mk file , to enable smoothzoom
   1008 #ifdef CAMERA_SMOOTH_ZOOM
   1009     mParameters.set(QCameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "true");
   1010 #endif
   1011     if(mZoomSupported){
   1012         mParameters.set(QCameraParameters::KEY_ZOOM_SUPPORTED, "true");
   1013         ALOGV("max zoom is %d", mMaxZoom-1);
   1014         /* mMaxZoom value that the query interface returns is the size
   1015         ALOGV("max zoom is %d", mMaxZoom-1);
   1016         * mMaxZoom value that the query interface returns is the size
   1017          * of zoom table. So the actual max zoom value will be one
   1018          * less than that value.          */
   1019 
   1020         mParameters.set("max-zoom",mMaxZoom-1);
   1021         mParameters.set(QCameraParameters::KEY_ZOOM_RATIOS,
   1022                             mZoomRatioValues);
   1023     } else
   1024         {
   1025         mParameters.set(QCameraParameters::KEY_ZOOM_SUPPORTED, "false");
   1026     }
   1027 
   1028     /* Enable zoom support for video application if VPE enabled */
   1029     if(mZoomSupported) {
   1030         mParameters.set("video-zoom-support", "true");
   1031     } else {
   1032         mParameters.set("video-zoom-support", "false");
   1033     }
   1034 
   1035     //8960 supports Power modes : Low power, Normal Power.
   1036     mParameters.set("power-mode-supported", "true");
   1037 
   1038     //Set Live shot support
   1039     rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_LIVESHOT_MAIN);
   1040     if(!rc) {
   1041         ALOGV("%s:LIVESHOT is  not supported", __func__);
   1042         mParameters.set("video-snapshot-supported", "false");
   1043     } else {
   1044         mParameters.set("video-snapshot-supported", "true");
   1045     }
   1046 
   1047 
   1048     //Set default power mode
   1049     mParameters.set(QCameraParameters::KEY_POWER_MODE,"Low_Power");
   1050     //Set Wnr on
   1051     mParameters.set(QCameraParameters::KEY_DENOISE,true);
   1052     //Set Camera Mode
   1053     mParameters.set(QCameraParameters::KEY_CAMERA_MODE,1);
   1054     mParameters.set(QCameraParameters::KEY_AE_BRACKET_HDR,"Off");
   1055 
   1056     //Set Antibanding
   1057     mParameters.set(QCameraParameters::KEY_ANTIBANDING,
   1058                     QCameraParameters::ANTIBANDING_AUTO);
   1059     mParameters.set(QCameraParameters::KEY_SUPPORTED_ANTIBANDING,
   1060                     mAntibandingValues);
   1061 
   1062     //Set Effect
   1063     mParameters.set(QCameraParameters::KEY_EFFECT,
   1064                     QCameraParameters::EFFECT_NONE);
   1065     mParameters.set(QCameraParameters::KEY_SUPPORTED_EFFECTS, mEffectValues);
   1066 
   1067     //Set Auto Exposure
   1068     mParameters.set(QCameraParameters::KEY_AUTO_EXPOSURE,
   1069                     QCameraParameters::AUTO_EXPOSURE_CENTER_WEIGHTED);
   1070     mParameters.set(QCameraParameters::KEY_SUPPORTED_AUTO_EXPOSURE, mAutoExposureValues);
   1071 
   1072     //Set WhiteBalance
   1073     mParameters.set(QCameraParameters::KEY_WHITE_BALANCE,
   1074                     QCameraParameters::WHITE_BALANCE_AUTO);
   1075     mParameters.set(QCameraParameters::KEY_SUPPORTED_WHITE_BALANCE,mWhitebalanceValues);
   1076 
   1077     //Set AEC_LOCK
   1078     mParameters.set(QCameraParameters::KEY_AUTO_EXPOSURE_LOCK, "false");
   1079     if(cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_AEC_LOCK)){
   1080         mParameters.set(QCameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, "true");
   1081     } else {
   1082         mParameters.set(QCameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, "false");
   1083     }
   1084     //Set AWB_LOCK
   1085     mParameters.set(QCameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, "false");
   1086     if(cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_AWB_LOCK))
   1087         mParameters.set(QCameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, "true");
   1088     else
   1089         mParameters.set(QCameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, "false");
   1090 
   1091     //Set Focus Mode
   1092     if(mHasAutoFocusSupport){
   1093        mParameters.set(QCameraParameters::KEY_FOCUS_MODE,
   1094                           QCameraParameters::FOCUS_MODE_AUTO);
   1095        mFocusMode = AF_MODE_AUTO;
   1096        mParameters.set(QCameraParameters::KEY_SUPPORTED_FOCUS_MODES,
   1097                           mFocusModeValues);
   1098        mParameters.set(QCameraParameters::KEY_MAX_NUM_FOCUS_AREAS, "1");
   1099        mParameters.set(QCameraParameters::KEY_MAX_NUM_METERING_AREAS, "1");
   1100    } else {
   1101        mParameters.set(QCameraParameters::KEY_FOCUS_MODE,
   1102        QCameraParameters::FOCUS_MODE_FIXED);
   1103        mFocusMode = DONT_CARE;
   1104        mParameters.set(QCameraParameters::KEY_SUPPORTED_FOCUS_MODES,
   1105        QCameraParameters::FOCUS_MODE_FIXED);
   1106        mParameters.set(QCameraParameters::KEY_MAX_NUM_FOCUS_AREAS, "0");
   1107        mParameters.set(QCameraParameters::KEY_MAX_NUM_METERING_AREAS, "0");
   1108    }
   1109 
   1110     mParameters.set(QCameraParameters::KEY_FOCUS_AREAS, DEFAULT_CAMERA_AREA);
   1111     mParameters.set(QCameraParameters::KEY_METERING_AREAS, DEFAULT_CAMERA_AREA);
   1112 
   1113     //Set Flash
   1114     if (cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_LED_MODE)) {
   1115         mParameters.set(QCameraParameters::KEY_FLASH_MODE,
   1116                         QCameraParameters::FLASH_MODE_OFF);
   1117         mParameters.set(QCameraParameters::KEY_SUPPORTED_FLASH_MODES,
   1118                         mFlashValues);
   1119     }
   1120 
   1121     //Set Sharpness
   1122     mParameters.set(QCameraParameters::KEY_MAX_SHARPNESS,
   1123             CAMERA_MAX_SHARPNESS);
   1124     mParameters.set(QCameraParameters::KEY_SHARPNESS,
   1125                     CAMERA_DEF_SHARPNESS);
   1126 
   1127     //Set Contrast
   1128     mParameters.set(QCameraParameters::KEY_MAX_CONTRAST,
   1129             CAMERA_MAX_CONTRAST);
   1130     mParameters.set(QCameraParameters::KEY_CONTRAST,
   1131                     CAMERA_DEF_CONTRAST);
   1132 
   1133     //Set Saturation
   1134     mParameters.set(QCameraParameters::KEY_MAX_SATURATION,
   1135             CAMERA_MAX_SATURATION);
   1136     mParameters.set(QCameraParameters::KEY_SATURATION,
   1137                     CAMERA_DEF_SATURATION);
   1138 
   1139     //Set Brightness/luma-adaptaion
   1140     mParameters.set("luma-adaptation", "3");
   1141 
   1142     mParameters.set(QCameraParameters::KEY_PICTURE_FORMAT,
   1143                     QCameraParameters::PIXEL_FORMAT_JPEG);
   1144 
   1145     //Set Lensshading
   1146     mParameters.set(QCameraParameters::KEY_LENSSHADE,
   1147                     QCameraParameters::LENSSHADE_ENABLE);
   1148     mParameters.set(QCameraParameters::KEY_SUPPORTED_LENSSHADE_MODES,
   1149                     mLensShadeValues);
   1150 
   1151     //Set ISO Mode
   1152     mParameters.set(QCameraParameters::KEY_ISO_MODE,
   1153                     QCameraParameters::ISO_AUTO);
   1154     mParameters.set(QCameraParameters::KEY_SUPPORTED_ISO_MODES,
   1155                     mIsoValues);
   1156 
   1157     //Set MCE
   1158     mParameters.set(QCameraParameters::KEY_MEMORY_COLOR_ENHANCEMENT,
   1159                     QCameraParameters::MCE_ENABLE);
   1160     mParameters.set(QCameraParameters::KEY_SUPPORTED_MEM_COLOR_ENHANCE_MODES,
   1161                     mMceValues);
   1162     //Set HFR
   1163     if (cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_HFR)) {
   1164         mParameters.set(QCameraParameters::KEY_VIDEO_HIGH_FRAME_RATE,
   1165                     QCameraParameters::VIDEO_HFR_OFF);
   1166         mParameters.set(QCameraParameters::KEY_SUPPORTED_HFR_SIZES,
   1167                     mHfrSizeValues.string());
   1168         mParameters.set(QCameraParameters::KEY_SUPPORTED_VIDEO_HIGH_FRAME_RATE_MODES,
   1169                     mHfrValues);
   1170     } else{
   1171         mParameters.set(QCameraParameters::KEY_SUPPORTED_HFR_SIZES,"");
   1172     }
   1173 
   1174     //Set Histogram
   1175     mParameters.set(QCameraParameters::KEY_HISTOGRAM,
   1176                     QCameraParameters::HISTOGRAM_DISABLE);
   1177     mParameters.set(QCameraParameters::KEY_SUPPORTED_HISTOGRAM_MODES,
   1178                     mHistogramValues);
   1179 
   1180     //Set SkinTone Enhancement
   1181     mParameters.set(QCameraParameters::KEY_SKIN_TONE_ENHANCEMENT,
   1182                     QCameraParameters::SKIN_TONE_ENHANCEMENT_DISABLE);
   1183     mParameters.set("skinToneEnhancement", "0");
   1184     mParameters.set(QCameraParameters::KEY_SUPPORTED_SKIN_TONE_ENHANCEMENT_MODES,
   1185                     mSkinToneEnhancementValues);
   1186 
   1187     //Set Scene Mode
   1188     mParameters.set(QCameraParameters::KEY_SCENE_MODE,
   1189                     QCameraParameters::SCENE_MODE_AUTO);
   1190     mParameters.set(QCameraParameters::KEY_SUPPORTED_SCENE_MODES,
   1191                     mSceneModeValues);
   1192 
   1193     //Set Streaming Textures
   1194     mParameters.set("strtextures", "OFF");
   1195 
   1196     //Set Denoise
   1197     mParameters.set(QCameraParameters::KEY_DENOISE,
   1198                     QCameraParameters::DENOISE_ON);
   1199     mParameters.set(QCameraParameters::KEY_SUPPORTED_DENOISE,
   1200                         denoise_value);
   1201     //Set Touch AF/AEC
   1202     mParameters.set(QCameraParameters::KEY_TOUCH_AF_AEC,
   1203                     QCameraParameters::TOUCH_AF_AEC_OFF);
   1204     mParameters.set(QCameraParameters::KEY_SUPPORTED_TOUCH_AF_AEC,
   1205                     mTouchAfAecValues);
   1206     /* touch-AF ROI for reducing af fail case */
   1207     mParameters.set("touchAfAec-dx","200");
   1208     mParameters.set("touchAfAec-dy","200");
   1209 
   1210     //Set Scene Detection
   1211     mParameters.set(QCameraParameters::KEY_SCENE_DETECT,
   1212                    QCameraParameters::SCENE_DETECT_OFF);
   1213     mParameters.set(QCameraParameters::KEY_SUPPORTED_SCENE_DETECT,
   1214                     mSceneDetectValues);
   1215 
   1216     //Set Selectable Zone AF
   1217     mParameters.set(QCameraParameters::KEY_SELECTABLE_ZONE_AF,
   1218                     QCameraParameters::SELECTABLE_ZONE_AF_AUTO);
   1219     mParameters.set(QCameraParameters::KEY_SUPPORTED_SELECTABLE_ZONE_AF,
   1220                     mSelectableZoneAfValues);
   1221 
   1222     //Set Face Detection
   1223     if(supportsFaceDetection()){
   1224         mParameters.set(QCameraParameters::KEY_FACE_DETECTION,
   1225                         QCameraParameters::FACE_DETECTION_OFF);
   1226         mParameters.set(QCameraParameters::KEY_SUPPORTED_FACE_DETECTION,
   1227                         mFaceDetectionValues);
   1228     }
   1229 
   1230     //Set Red Eye Reduction
   1231     mParameters.set(QCameraParameters::KEY_REDEYE_REDUCTION,
   1232                     QCameraParameters::REDEYE_REDUCTION_DISABLE);
   1233     mParameters.set(QCameraParameters::KEY_SUPPORTED_REDEYE_REDUCTION,
   1234                     mRedeyeReductionValues);
   1235 
   1236     //Set ZSL
   1237     mParameters.set(QCameraParameters::KEY_ZSL,
   1238                     QCameraParameters::ZSL_OFF);
   1239     mParameters.set(QCameraParameters::KEY_SUPPORTED_ZSL_MODES,
   1240                     mZslValues);
   1241 
   1242     //Set Focal length, horizontal and vertical view angles
   1243     focus_distances_info_t focalLength;
   1244     float horizontalViewAngle = 0.0f;
   1245     float verticalViewAngle = 0.0f;
   1246     cam_config_get_parm(mCameraId, MM_CAMERA_PARM_FOCAL_LENGTH,
   1247             (void *)&focalLength);
   1248     mParameters.setFloat(QCameraParameters::KEY_FOCAL_LENGTH,
   1249                     focalLength.focus_distance[0]);
   1250     cam_config_get_parm(mCameraId, MM_CAMERA_PARM_HORIZONTAL_VIEW_ANGLE,
   1251             (void *)&horizontalViewAngle);
   1252     mParameters.setFloat(QCameraParameters::KEY_HORIZONTAL_VIEW_ANGLE,
   1253                     horizontalViewAngle);
   1254     cam_config_get_parm(mCameraId, MM_CAMERA_PARM_VERTICAL_VIEW_ANGLE,
   1255             (void *)&verticalViewAngle);
   1256     mParameters.setFloat(QCameraParameters::KEY_VERTICAL_VIEW_ANGLE,
   1257                     verticalViewAngle);
   1258 
   1259     //Set Aperture
   1260     float f_number = 0.0f;
   1261     cam_config_get_parm(mCameraId, MM_CAMERA_PARM_F_NUMBER,
   1262             (void *)&f_number);
   1263     mExifValues.f_number = getRational(f_number*F_NUMBER_DECIMAL_PRECISION, F_NUMBER_DECIMAL_PRECISION);
   1264 
   1265     //Set Exposure Compensation
   1266     mParameters.set(
   1267             QCameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
   1268             EXPOSURE_COMPENSATION_MAXIMUM_NUMERATOR);
   1269     mParameters.set(
   1270             QCameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
   1271             EXPOSURE_COMPENSATION_MINIMUM_NUMERATOR);
   1272     mParameters.set(
   1273             QCameraParameters::KEY_EXPOSURE_COMPENSATION,
   1274             EXPOSURE_COMPENSATION_DEFAULT_NUMERATOR);
   1275     mParameters.setFloat(
   1276             QCameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
   1277             EXPOSURE_COMPENSATION_STEP);
   1278 
   1279     mParameters.set("num-snaps-per-shutter", 1);
   1280 
   1281     mParameters.set("capture-burst-captures-values", getZSLQueueDepth());
   1282     mParameters.set("capture-burst-interval-supported", "true");
   1283     mParameters.set("capture-burst-interval-max", BURST_INTREVAL_MAX); /*skip frames*/
   1284     mParameters.set("capture-burst-interval-min", BURST_INTREVAL_MIN); /*skip frames*/
   1285     mParameters.set("capture-burst-interval", BURST_INTREVAL_DEFAULT); /*skip frames*/
   1286     mParameters.set("capture-burst-retroactive", 0);
   1287     mParameters.set("capture-burst-retroactive-max", getZSLQueueDepth());
   1288     mParameters.set("capture-burst-exposures", "");
   1289     mParameters.set("capture-burst-exposures-values",
   1290       "-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12");
   1291     {
   1292       String8 CamModeStr;
   1293       char buffer[32];
   1294       int flag = 0;
   1295 
   1296       for (int i = 0; i < HAL_CAM_MODE_MAX; i++) {
   1297         if ( 0 ) { /*exclude some conflicting case*/
   1298         } else {
   1299           if (flag == 0) { /*first item*/
   1300           snprintf(buffer, sizeof(buffer), "%d", i);
   1301           } else {
   1302             snprintf(buffer, sizeof(buffer), ",%d", i);
   1303           }
   1304           flag = 1;
   1305           CamModeStr.append(buffer);
   1306         }
   1307       }
   1308       mParameters.set("camera-mode-values", CamModeStr);
   1309     }
   1310 
   1311     mParameters.set("ae-bracket-hdr-values",
   1312       create_values_str(hdr_bracket, sizeof(hdr_bracket)/sizeof(str_map) ));
   1313 
   1314 // if(mIs3DModeOn)
   1315 //     mParameters.set("3d-frame-format", "left-right");
   1316     mParameters.set("no-display-mode", 0);
   1317     //mUseOverlay = useOverlay();
   1318     mParameters.set("zoom", 0);
   1319 
   1320     int mNuberOfVFEOutputs;
   1321     ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_VFE_OUTPUT_ENABLE, &mNuberOfVFEOutputs);
   1322     if(ret != MM_CAMERA_OK) {
   1323         ALOGE("get parm MM_CAMERA_PARM_VFE_OUTPUT_ENABLE  failed");
   1324         ret = BAD_VALUE;
   1325     }
   1326     if(mNuberOfVFEOutputs == 1)
   1327     {
   1328        mParameters.set(QCameraParameters::KEY_SINGLE_ISP_OUTPUT_ENABLED, "true");
   1329     } else {
   1330        mParameters.set(QCameraParameters::KEY_SINGLE_ISP_OUTPUT_ENABLED, "false");
   1331     }
   1332 
   1333     if (setParameters(mParameters) != NO_ERROR) {
   1334         ALOGE("Failed to set default parameters?!");
   1335     }
   1336 
   1337     mNoDisplayMode = 0;
   1338     mLedStatusForZsl = LED_MODE_OFF;
   1339 
   1340     mInitialized = true;
   1341     strTexturesOn = false;
   1342 
   1343     ALOGV("%s: X", __func__);
   1344     return;
   1345 }
   1346 
   1347 /**
   1348  * Set the camera parameters. This returns BAD_VALUE if any parameter is
   1349  * invalid or not supported.
   1350  */
   1351 
   1352 int QCameraHardwareInterface::setParameters(const char *parms)
   1353 {
   1354     QCameraParameters param;
   1355     String8 str = String8(parms);
   1356     param.unflatten(str);
   1357     status_t ret = setParameters(param);
   1358 	if(ret == NO_ERROR)
   1359 		return 0;
   1360 	else
   1361 		return -1;
   1362 }
   1363 
   1364 /**
   1365  * Set the camera parameters. This returns BAD_VALUE if any parameter is
   1366  * invalid or not supported. */
   1367 status_t QCameraHardwareInterface::setParameters(const QCameraParameters& params)
   1368 {
   1369     status_t ret = NO_ERROR;
   1370 
   1371     ALOGV("%s: E", __func__);
   1372 //    Mutex::Autolock l(&mLock);
   1373     status_t rc, final_rc = NO_ERROR;
   1374 
   1375     if ((rc = setPowerMode(params)))                    final_rc = rc;
   1376     if ((rc = setPreviewSize(params)))                  final_rc = rc;
   1377     if ((rc = setVideoSize(params)))                    final_rc = rc;
   1378     if ((rc = setPictureSize(params)))                  final_rc = rc;
   1379     if ((rc = setJpegThumbnailSize(params)))            final_rc = rc;
   1380     if ((rc = setJpegQuality(params)))                  final_rc = rc;
   1381     if ((rc = setEffect(params)))                       final_rc = rc;
   1382     if ((rc = setGpsLocation(params)))                  final_rc = rc;
   1383     if ((rc = setRotation(params)))                     final_rc = rc;
   1384     if ((rc = setZoom(params)))                         final_rc = rc;
   1385     if ((rc = setOrientation(params)))                  final_rc = rc;
   1386     if ((rc = setLensshadeValue(params)))               final_rc = rc;
   1387     if ((rc = setMCEValue(params)))                     final_rc = rc;
   1388     if ((rc = setPictureFormat(params)))                final_rc = rc;
   1389     if ((rc = setSharpness(params)))                    final_rc = rc;
   1390     if ((rc = setSaturation(params)))                   final_rc = rc;
   1391     if ((rc = setSceneMode(params)))                    final_rc = rc;
   1392     if ((rc = setContrast(params)))                     final_rc = rc;
   1393 //    if ((rc = setFaceDetect(params)))                   final_rc = rc;
   1394     if ((rc = setStrTextures(params)))                  final_rc = rc;
   1395     if ((rc = setPreviewFormat(params)))                final_rc = rc;
   1396     if ((rc = setSkinToneEnhancement(params)))          final_rc = rc;
   1397     if ((rc = setWaveletDenoise(params)))               final_rc = rc;
   1398     if ((rc = setAntibanding(params)))                  final_rc = rc;
   1399     //    if ((rc = setOverlayFormats(params)))         final_rc = rc;
   1400     if ((rc = setRedeyeReduction(params)))              final_rc = rc;
   1401     if ((rc = setCaptureBurstExp()))                    final_rc = rc;
   1402 
   1403     const char *str_val = params.get("capture-burst-exposures");
   1404     if ( str_val == NULL || strlen(str_val)==0 ) {
   1405         char burst_exp[PROPERTY_VALUE_MAX];
   1406         memset(burst_exp, 0, sizeof(burst_exp));
   1407         property_get("persist.capture.burst.exposures", burst_exp, "");
   1408         if ( strlen(burst_exp)>0 ) {
   1409             mParameters.set("capture-burst-exposures", burst_exp);
   1410         }
   1411     } else {
   1412       mParameters.set("capture-burst-exposures", str_val);
   1413     }
   1414 
   1415     if ((rc = setAEBracket(params)))              final_rc = rc;
   1416     //    if ((rc = setDenoise(params)))                final_rc = rc;
   1417     if ((rc = setPreviewFpsRange(params)))              final_rc = rc;
   1418     if((rc = setRecordingHint(params)))                 final_rc = rc;
   1419     if ((rc = setNumOfSnapshot()))                      final_rc = rc;
   1420     if ((rc = setAecAwbLock(params)))                   final_rc = rc;
   1421     if ((rc = setWhiteBalance(params)))                 final_rc = rc;
   1422     const char *str = params.get(QCameraParameters::KEY_SCENE_MODE);
   1423     int32_t value = attr_lookup(scenemode, sizeof(scenemode) / sizeof(str_map), str);
   1424 
   1425     if((value != NOT_FOUND) && (value == CAMERA_BESTSHOT_OFF )) {
   1426         //if ((rc = setPreviewFrameRateMode(params)))     final_rc = rc;
   1427         if ((rc = setPreviewFrameRate(params)))         final_rc = rc;
   1428         if ((rc = setBrightness(params)))               final_rc = rc;
   1429         if ((rc = setISOValue(params)))                 final_rc = rc;
   1430         if ((rc = setFocusAreas(params)))               final_rc = rc;
   1431         if ((rc = setMeteringAreas(params)))            final_rc = rc;
   1432     }
   1433     if ((rc = setFocusMode(params)))                    final_rc = rc;
   1434     if ((rc = setAutoExposure(params)))                 final_rc = rc;
   1435     if ((rc = setExposureCompensation(params)))         final_rc = rc;
   1436     if ((rc = setFlash(params)))                        final_rc = rc;
   1437     //selectableZoneAF needs to be invoked after continuous AF
   1438     if ((rc = setSelectableZoneAf(params)))             final_rc = rc;
   1439     // setHighFrameRate needs to be done at end, as there can
   1440     // be a preview restart, and need to use the updated parameters
   1441     if ((rc = setHighFrameRate(params)))  final_rc = rc;
   1442     if ((rc = setZSLBurstLookBack(params))) final_rc = rc;
   1443     if ((rc = setZSLBurstInterval(params))) final_rc = rc;
   1444     if ((rc = setNoDisplayMode(params))) final_rc = rc;
   1445 
   1446     //Update Exiftag values.
   1447     setExifTags();
   1448 
   1449    ALOGV("%s: X", __func__);
   1450    return final_rc;
   1451 }
   1452 
   1453 /** Retrieve the camera parameters.  The buffer returned by the camera HAL
   1454 	must be returned back to it with put_parameters, if put_parameters
   1455 	is not NULL.
   1456  */
   1457 int QCameraHardwareInterface::getParameters(char **parms)
   1458 {
   1459     char* rc = NULL;
   1460     String8 str;
   1461     QCameraParameters param = getParameters();
   1462     //param.dump();
   1463     str = param.flatten( );
   1464     rc = (char *)malloc(sizeof(char)*(str.length()+1));
   1465     if(rc != NULL){
   1466         memset(rc, 0, sizeof(char)*(str.length()+1));
   1467         strncpy(rc, str.string(), str.length());
   1468 	rc[str.length()] = 0;
   1469 	*parms = rc;
   1470     }
   1471     return 0;
   1472 }
   1473 
   1474 /** The camera HAL uses its own memory to pass us the parameters when we
   1475 	call get_parameters.  Use this function to return the memory back to
   1476 	the camera HAL, if put_parameters is not NULL.  If put_parameters
   1477 	is NULL, then you have to use free() to release the memory.
   1478 */
   1479 void QCameraHardwareInterface::putParameters(char *rc)
   1480 {
   1481     free(rc);
   1482     rc = NULL;
   1483 }
   1484 
   1485 QCameraParameters& QCameraHardwareInterface::getParameters()
   1486 {
   1487     Mutex::Autolock lock(mLock);
   1488     mParameters.set(QCameraParameters::KEY_FOCUS_DISTANCES, mFocusDistance.string());
   1489     const char *str = mParameters.get(QCameraParameters::KEY_SCENE_MODE);
   1490     if (mHasAutoFocusSupport && strcmp(str, "auto")) {
   1491         mParameters.set(QCameraParameters::KEY_FOCUS_MODE,
   1492                                         QCameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE);
   1493     }
   1494     return mParameters;
   1495 }
   1496 
   1497 status_t QCameraHardwareInterface::runFaceDetection()
   1498 {
   1499     bool ret = true;
   1500 
   1501     const char *str = mParameters.get(QCameraParameters::KEY_FACE_DETECTION);
   1502     if (str != NULL) {
   1503         int value = attr_lookup(facedetection,
   1504                 sizeof(facedetection) / sizeof(str_map), str);
   1505         fd_set_parm_t fd_set_parm;
   1506         int requested_faces = mParameters.getInt(QCameraParameters::KEY_MAX_NUM_REQUESTED_FACES);
   1507         fd_set_parm.fd_mode = value;
   1508         fd_set_parm.num_fd = requested_faces;
   1509         ret = native_set_parms(MM_CAMERA_PARM_FD, sizeof(fd_set_parm_t), (void *)&fd_set_parm);
   1510         return ret ? NO_ERROR : UNKNOWN_ERROR;
   1511     }
   1512     ALOGE("Invalid Face Detection value: %s", (str == NULL) ? "NULL" : str);
   1513     return BAD_VALUE;
   1514 }
   1515 
   1516 status_t QCameraHardwareInterface::setSharpness(const QCameraParameters& params)
   1517 {
   1518     bool ret = false;
   1519     int rc = MM_CAMERA_OK;
   1520     ALOGV("%s",__func__);
   1521     rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_SHARPNESS);
   1522     if(!rc) {
   1523         ALOGV("%s:CONTRAST not supported", __func__);
   1524         return NO_ERROR;
   1525     }
   1526     int sharpness = params.getInt(QCameraParameters::KEY_SHARPNESS);
   1527     if((sharpness < CAMERA_MIN_SHARPNESS
   1528             || sharpness > CAMERA_MAX_SHARPNESS))
   1529         return UNKNOWN_ERROR;
   1530 
   1531     ALOGV("setting sharpness %d", sharpness);
   1532     mParameters.set(QCameraParameters::KEY_SHARPNESS, sharpness);
   1533     ret = native_set_parms(MM_CAMERA_PARM_SHARPNESS, sizeof(sharpness),
   1534                                (void *)&sharpness);
   1535     return ret ? NO_ERROR : UNKNOWN_ERROR;
   1536 }
   1537 
   1538 status_t QCameraHardwareInterface::setSaturation(const QCameraParameters& params)
   1539 {
   1540     bool ret = false;
   1541     int rc = MM_CAMERA_OK;
   1542     ALOGV("%s",__func__);
   1543     rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_SATURATION);
   1544     if(!rc) {
   1545         ALOGV("%s:MM_CAMERA_PARM_SATURATION not supported", __func__);
   1546         return NO_ERROR;
   1547     }
   1548     int result;
   1549     int saturation = params.getInt(QCameraParameters::KEY_SATURATION);
   1550 
   1551     if((saturation < CAMERA_MIN_SATURATION)
   1552         || (saturation > CAMERA_MAX_SATURATION))
   1553     return UNKNOWN_ERROR;
   1554 
   1555     ALOGV("Setting saturation %d", saturation);
   1556     mParameters.set(QCameraParameters::KEY_SATURATION, saturation);
   1557     ret = native_set_parms(MM_CAMERA_PARM_SATURATION, sizeof(saturation),
   1558         (void *)&saturation, (int *)&result);
   1559     if(result != MM_CAMERA_OK)
   1560         ALOGV("Saturation Value: %d is not set as the selected value is not supported", saturation);
   1561     return ret ? NO_ERROR : UNKNOWN_ERROR;
   1562 }
   1563 
   1564 status_t QCameraHardwareInterface::setContrast(const QCameraParameters& params)
   1565 {
   1566    ALOGV("%s E", __func__ );
   1567    int rc = MM_CAMERA_OK;
   1568    rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_CONTRAST);
   1569    if(!rc) {
   1570         ALOGV("%s:CONTRAST not supported", __func__);
   1571         return NO_ERROR;
   1572     }
   1573    const char *str = params.get(QCameraParameters::KEY_SCENE_MODE);
   1574    ALOGV("Contrast : %s",str);
   1575    int32_t value = attr_lookup(scenemode, sizeof(scenemode) / sizeof(str_map), str);
   1576    if(value == CAMERA_BESTSHOT_OFF) {
   1577         int contrast = params.getInt(QCameraParameters::KEY_CONTRAST);
   1578         if((contrast < CAMERA_MIN_CONTRAST)
   1579                 || (contrast > CAMERA_MAX_CONTRAST))
   1580         {
   1581             ALOGV("Contrast Value not matching");
   1582             return UNKNOWN_ERROR;
   1583         }
   1584         ALOGV("setting contrast %d", contrast);
   1585         mParameters.set(QCameraParameters::KEY_CONTRAST, contrast);
   1586         ALOGV("Calling Contrast set on Lower layer");
   1587         bool ret = native_set_parms(MM_CAMERA_PARM_CONTRAST, sizeof(contrast),
   1588                                    (void *)&contrast);
   1589         ALOGV("Lower layer returned %d", ret);
   1590         int bestshot_reconfigure;
   1591         cam_config_get_parm(mCameraId, MM_CAMERA_PARM_BESTSHOT_RECONFIGURE,
   1592                             &bestshot_reconfigure);
   1593         if(bestshot_reconfigure) {
   1594              if (mContrast != contrast) {
   1595                   mContrast = contrast;
   1596                  if (mPreviewState == QCAMERA_HAL_PREVIEW_STARTED && ret) {
   1597                       mRestartPreview = 1;
   1598                       pausePreviewForZSL();
   1599                   }
   1600              }
   1601         }
   1602         return ret ? NO_ERROR : UNKNOWN_ERROR;
   1603     } else {
   1604           ALOGV(" Contrast value will not be set " \
   1605           "when the scenemode selected is %s", str);
   1606           return NO_ERROR;
   1607     }
   1608     return BAD_VALUE;
   1609 }
   1610 
   1611 status_t QCameraHardwareInterface::setSceneDetect(const QCameraParameters& params)
   1612 {
   1613     ALOGV("%s",__func__);
   1614     bool retParm;
   1615     int rc = MM_CAMERA_OK;
   1616 
   1617     rc = cam_config_is_parm_supported(mCameraId,MM_CAMERA_PARM_ASD_ENABLE);
   1618     if(!rc) {
   1619         ALOGV("%s:MM_CAMERA_PARM_ASD_ENABLE not supported", __func__);
   1620         return NO_ERROR;
   1621     }
   1622 
   1623     const char *str = params.get(QCameraParameters::KEY_SCENE_DETECT);
   1624     ALOGV("Scene Detect string : %s",str);
   1625     if (str != NULL) {
   1626         int32_t value = attr_lookup(scenedetect, sizeof(scenedetect) / sizeof(str_map), str);
   1627         ALOGV("Scenedetect Value : %d",value);
   1628         if (value != NOT_FOUND) {
   1629             mParameters.set(QCameraParameters::KEY_SCENE_DETECT, str);
   1630 
   1631             retParm = native_set_parms(MM_CAMERA_PARM_ASD_ENABLE, sizeof(value),
   1632                                        (void *)&value);
   1633 
   1634             return retParm ? NO_ERROR : UNKNOWN_ERROR;
   1635         }
   1636     }
   1637    return BAD_VALUE;
   1638 }
   1639 
   1640 status_t QCameraHardwareInterface::setZoom(const QCameraParameters& params)
   1641 {
   1642     status_t rc = NO_ERROR;
   1643 
   1644     ALOGV("%s: E",__func__);
   1645 
   1646 
   1647     if( !( cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_ZOOM))) {
   1648         ALOGV("%s:MM_CAMERA_PARM_ZOOM not supported", __func__);
   1649         return NO_ERROR;
   1650     }
   1651     // No matter how many different zoom values the driver can provide, HAL
   1652     // provides applictations the same number of zoom levels. The maximum driver
   1653     // zoom value depends on sensor output (VFE input) and preview size (VFE
   1654     // output) because VFE can only crop and cannot upscale. If the preview size
   1655     // is bigger, the maximum zoom ratio is smaller. However, we want the
   1656     // zoom ratio of each zoom level is always the same whatever the preview
   1657     // size is. Ex: zoom level 1 is always 1.2x, zoom level 2 is 1.44x, etc. So,
   1658     // we need to have a fixed maximum zoom value and do read it from the
   1659     // driver.
   1660     static const int ZOOM_STEP = 1;
   1661     int32_t zoom_level = params.getInt("zoom");
   1662     if(zoom_level >= 0 && zoom_level <= mMaxZoom-1) {
   1663         mParameters.set("zoom", zoom_level);
   1664         int32_t zoom_value = ZOOM_STEP * zoom_level;
   1665         bool ret = native_set_parms(MM_CAMERA_PARM_ZOOM,
   1666             sizeof(zoom_value), (void *)&zoom_value);
   1667         if(ret) {
   1668             mCurrentZoom=zoom_level;
   1669         }
   1670         rc = ret ? NO_ERROR : UNKNOWN_ERROR;
   1671     } else {
   1672         rc = BAD_VALUE;
   1673     }
   1674     ALOGV("%s X",__func__);
   1675     return rc;
   1676 
   1677 }
   1678 
   1679 status_t  QCameraHardwareInterface::setISOValue(const QCameraParameters& params) {
   1680 
   1681     status_t rc = NO_ERROR;
   1682     ALOGV("%s",__func__);
   1683 
   1684     rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_ISO);
   1685     if(!rc) {
   1686         ALOGV("%s:MM_CAMERA_PARM_ISO not supported", __func__);
   1687         return NO_ERROR;
   1688     }
   1689     const char *str = params.get(QCameraParameters::KEY_ISO_MODE);
   1690     ALOGV("ISO string : %s", str);
   1691     int8_t temp_hjr;
   1692     if (str != NULL) {
   1693         int value = (camera_iso_mode_type)attr_lookup(
   1694           iso, sizeof(iso) / sizeof(str_map), str);
   1695         ALOGV("ISO string : %s", str);
   1696         if (value != NOT_FOUND) {
   1697             camera_iso_mode_type temp = (camera_iso_mode_type) value;
   1698             if (value == CAMERA_ISO_DEBLUR) {
   1699                temp_hjr = true;
   1700                native_set_parms(MM_CAMERA_PARM_HJR, sizeof(int8_t), (void*)&temp_hjr);
   1701                mHJR = value;
   1702             }
   1703             else {
   1704                if (mHJR == CAMERA_ISO_DEBLUR) {
   1705                    temp_hjr = false;
   1706                    native_set_parms(MM_CAMERA_PARM_HJR, sizeof(int8_t), (void*)&temp_hjr);
   1707                    mHJR = value;
   1708                }
   1709             }
   1710 
   1711             mParameters.set(QCameraParameters::KEY_ISO_MODE, str);
   1712             native_set_parms(MM_CAMERA_PARM_ISO, sizeof(camera_iso_mode_type), (void *)&temp);
   1713             mIsoValue = (int)temp;
   1714             return NO_ERROR;
   1715         }
   1716     }
   1717     return BAD_VALUE;
   1718 }
   1719 
   1720 status_t QCameraHardwareInterface::updateFocusDistances()
   1721 {
   1722     ALOGV("%s: IN", __FUNCTION__);
   1723     focus_distances_info_t focusDistances;
   1724     if(cam_config_get_parm(mCameraId, MM_CAMERA_PARM_FOCUS_DISTANCES,
   1725       &focusDistances) == MM_CAMERA_OK) {
   1726         String8 str;
   1727         char buffer[32] = {0};
   1728         //set all distances to infinity if focus mode is infinity
   1729         if(mFocusMode == AF_MODE_INFINITY) {
   1730             snprintf(buffer, sizeof(buffer), "Infinity,");
   1731             str.append(buffer);
   1732             snprintf(buffer, sizeof(buffer), "Infinity,");
   1733             str.append(buffer);
   1734             snprintf(buffer, sizeof(buffer), "Infinity");
   1735             str.append(buffer);
   1736         } else {
   1737             snprintf(buffer, sizeof(buffer), "%f", focusDistances.focus_distance[0]);
   1738             str.append(buffer);
   1739             snprintf(buffer, sizeof(buffer), ",%f", focusDistances.focus_distance[1]);
   1740             str.append(buffer);
   1741             snprintf(buffer, sizeof(buffer), ",%f", focusDistances.focus_distance[2]);
   1742             str.append(buffer);
   1743         }
   1744         ALOGV("%s: setting KEY_FOCUS_DISTANCES as %s", __FUNCTION__, str.string());
   1745         mFocusDistance = str;
   1746         return NO_ERROR;
   1747     }
   1748     ALOGE("%s: get CAMERA_PARM_FOCUS_DISTANCES failed!!!", __FUNCTION__);
   1749     return BAD_VALUE;
   1750 }
   1751 
   1752 // Parse string like "(1, 2, 3, 4, ..., N)"
   1753 // num is pointer to an allocated array of size N
   1754 static int parseNDimVector(const char *str, int *num, int N, char delim = ',')
   1755 {
   1756     char *start, *end;
   1757     if(num == NULL) {
   1758         ALOGE("Invalid output array (num == NULL)");
   1759         return -1;
   1760     }
   1761     //check if string starts and ends with parantheses
   1762     if(str[0] != '(' || str[strlen(str)-1] != ')') {
   1763         ALOGE("Invalid format of string %s, valid format is (n1, n2, n3, n4 ...)", str);
   1764         return -1;
   1765     }
   1766     start = (char*) str;
   1767     start++;
   1768     for(int i=0; i<N; i++) {
   1769         *(num+i) = (int) strtol(start, &end, 10);
   1770         if(*end != delim && i < N-1) {
   1771             ALOGE("Cannot find delimeter '%c' in string \"%s\". end = %c", delim, str, *end);
   1772             return -1;
   1773         }
   1774         start = end+1;
   1775     }
   1776     return 0;
   1777 }
   1778 
   1779 // parse string like "(1, 2, 3, 4, 5),(1, 2, 3, 4, 5),..."
   1780 static int parseCameraAreaString(const char* str, int max_num_areas,
   1781                                  camera_area_t *pAreas, int *num_areas_found)
   1782 {
   1783     char area_str[32];
   1784     const char *start, *end, *p;
   1785     start = str; end = NULL;
   1786     int values[5], index=0;
   1787     *num_areas_found = 0;
   1788 
   1789     while(start != NULL) {
   1790        if(*start != '(') {
   1791             ALOGE("%s: error: Ill formatted area string: %s", __func__, str);
   1792             return -1;
   1793        }
   1794        end = strchr(start, ')');
   1795        if(end == NULL) {
   1796             ALOGE("%s: error: Ill formatted area string: %s", __func__, str);
   1797             return -1;
   1798        }
   1799        int i;
   1800        for (i=0,p=start; p<=end; p++, i++) {
   1801            area_str[i] = *p;
   1802        }
   1803        area_str[i] = '\0';
   1804        if(parseNDimVector(area_str, values, 5) < 0){
   1805             ALOGE("%s: error: Failed to parse the area string: %s", __func__, area_str);
   1806             return -1;
   1807        }
   1808        // no more areas than max_num_areas are accepted.
   1809        if(index >= max_num_areas) {
   1810             ALOGE("%s: error: too many areas specified %s", __func__, str);
   1811             return -1;
   1812        }
   1813        pAreas[index].x1 = values[0];
   1814        pAreas[index].y1 = values[1];
   1815        pAreas[index].x2 = values[2];
   1816        pAreas[index].y2 = values[3];
   1817        pAreas[index].weight = values[4];
   1818 
   1819        index++;
   1820        start = strchr(end, '('); // serach for next '('
   1821     }
   1822     (*num_areas_found) = index;
   1823     return 0;
   1824 }
   1825 static bool validateCameraAreas(camera_area_t *areas, int num_areas)
   1826 {
   1827     for(int i=0; i<num_areas; i++) {
   1828 
   1829         // handle special case (0, 0, 0, 0, 0)
   1830         if((areas[i].x1 == 0) && (areas[i].y1 == 0)
   1831             && (areas[i].x2 == 0) && (areas[i].y2 == 0) && (areas[i].weight == 0)) {
   1832             continue;
   1833         }
   1834         if(areas[i].x1 < -1000) return false;               // left should be >= -1000
   1835         if(areas[i].y1 < -1000) return false;               // top  should be >= -1000
   1836         if(areas[i].x2 > 1000) return false;                // right  should be <= 1000
   1837         if(areas[i].y2 > 1000) return false;                // bottom should be <= 1000
   1838         if(areas[i].weight <= 0 || areas[i].weight > 1000)  // weight should be in [1, 1000]
   1839             return false;
   1840         if(areas[i].x1 >= areas[i].x2) {                    // left should be < right
   1841             return false;
   1842         }
   1843         if(areas[i].y1 >= areas[i].y2)                      // top should be < bottom
   1844             return false;
   1845     }
   1846     return true;
   1847 }
   1848 
   1849 status_t QCameraHardwareInterface::setFocusAreas(const QCameraParameters& params)
   1850 {
   1851     ALOGV("%s: E", __func__);
   1852     status_t rc;
   1853     int max_num_af_areas = mParameters.getInt(QCameraParameters::KEY_MAX_NUM_FOCUS_AREAS);
   1854     if(max_num_af_areas == 0) {
   1855         return NO_ERROR;
   1856     }
   1857     const char *str = params.get(QCameraParameters::KEY_FOCUS_AREAS);
   1858     if (str == NULL) {
   1859         ALOGE("%s: Parameter string is null", __func__);
   1860         rc = NO_ERROR;
   1861     } else {
   1862         camera_area_t *areas = new camera_area_t[max_num_af_areas];
   1863         int num_areas_found=0;
   1864         if(parseCameraAreaString(str, max_num_af_areas, areas, &num_areas_found) < 0) {
   1865             ALOGE("%s: Failed to parse the string: %s", __func__, str);
   1866             delete areas;
   1867             return BAD_VALUE;
   1868         }
   1869         for(int i=0; i<num_areas_found; i++) {
   1870             ALOGV("FocusArea[%d] = (%d, %d, %d, %d, %d)", i, (areas[i].x1), (areas[i].y1),
   1871                         (areas[i].x2), (areas[i].y2), (areas[i].weight));
   1872         }
   1873         if(validateCameraAreas(areas, num_areas_found) == false) {
   1874             ALOGE("%s: invalid areas specified : %s", __func__, str);
   1875             delete areas;
   1876             return BAD_VALUE;
   1877         }
   1878         mParameters.set(QCameraParameters::KEY_FOCUS_AREAS, str);
   1879         num_areas_found = 1; //temp; need to change after the multi-roi is enabled
   1880 
   1881         //if the native_set_parms is called when preview is not started, it
   1882         //crashes in lower layer, so return of preview is not started
   1883         if(mPreviewState == QCAMERA_HAL_PREVIEW_STOPPED) {
   1884             delete areas;
   1885             return NO_ERROR;
   1886         }
   1887 
   1888         //for special area string (0, 0, 0, 0, 0), set the num_areas_found to 0,
   1889         //so no action is takenby the lower layer
   1890         if(num_areas_found == 1 && (areas[0].x1 == 0) && (areas[0].y1 == 0)
   1891             && (areas[0].x2 == 0) && (areas[0].y2 == 0) && (areas[0].weight == 0)) {
   1892             num_areas_found = 0;
   1893         }
   1894 #if 1 //temp solution
   1895 
   1896         roi_info_t af_roi_value;
   1897         memset(&af_roi_value, 0, sizeof(roi_info_t));
   1898         uint16_t x1, x2, y1, y2, dx, dy;
   1899         int previewWidth, previewHeight;
   1900         this->getPreviewSize(&previewWidth, &previewHeight);
   1901         //transform the coords from (-1000, 1000) to (0, previewWidth or previewHeight)
   1902         x1 = (uint16_t)((areas[0].x1 + 1000.0f)*(previewWidth/2000.0f));
   1903         y1 = (uint16_t)((areas[0].y1 + 1000.0f)*(previewHeight/2000.0f));
   1904         x2 = (uint16_t)((areas[0].x2 + 1000.0f)*(previewWidth/2000.0f));
   1905         y2 = (uint16_t)((areas[0].y2 + 1000.0f)*(previewHeight/2000.0f));
   1906         dx = x2 - x1;
   1907         dy = y2 - y1;
   1908 
   1909         af_roi_value.num_roi = num_areas_found;
   1910         af_roi_value.roi[0].x = x1;
   1911         af_roi_value.roi[0].y = y1;
   1912         af_roi_value.roi[0].dx = dx;
   1913         af_roi_value.roi[0].dy = dy;
   1914         af_roi_value.is_multiwindow = 0;
   1915         if (native_set_parms(MM_CAMERA_PARM_AF_ROI, sizeof(roi_info_t), (void*)&af_roi_value))
   1916             rc = NO_ERROR;
   1917         else
   1918             rc = BAD_VALUE;
   1919         delete areas;
   1920 #endif
   1921 #if 0   //better solution with multi-roi, to be enabled later
   1922         af_mtr_area_t afArea;
   1923         afArea.num_area = num_areas_found;
   1924 
   1925         uint16_t x1, x2, y1, y2, dx, dy;
   1926         int previewWidth, previewHeight;
   1927         this->getPreviewSize(&previewWidth, &previewHeight);
   1928 
   1929         for(int i=0; i<num_areas_found; i++) {
   1930             //transform the coords from (-1000, 1000) to (0, previewWidth or previewHeight)
   1931             x1 = (uint16_t)((areas[i].x1 + 1000.0f)*(previewWidth/2000.0f));
   1932             y1 = (uint16_t)((areas[i].y1 + 1000.0f)*(previewHeight/2000.0f));
   1933             x2 = (uint16_t)((areas[i].x2 + 1000.0f)*(previewWidth/2000.0f));
   1934             y2 = (uint16_t)((areas[i].y2 + 1000.0f)*(previewHeight/2000.0f));
   1935             dx = x2 - x1;
   1936             dy = y2 - y1;
   1937             afArea.mtr_area[i].x = x1;
   1938             afArea.mtr_area[i].y = y1;
   1939             afArea.mtr_area[i].dx = dx;
   1940             afArea.mtr_area[i].dy = dy;
   1941             afArea.weight[i] = areas[i].weight;
   1942         }
   1943 
   1944         if(native_set_parms(MM_CAMERA_PARM_AF_MTR_AREA, sizeof(af_mtr_area_t), (void*)&afArea))
   1945             rc = NO_ERROR;
   1946         else
   1947             rc = BAD_VALUE;*/
   1948 #endif
   1949     }
   1950     ALOGV("%s: X", __func__);
   1951     return rc;
   1952 }
   1953 
   1954 status_t QCameraHardwareInterface::setMeteringAreas(const QCameraParameters& params)
   1955 {
   1956     ALOGV("%s: E", __func__);
   1957     status_t rc;
   1958     int max_num_mtr_areas = mParameters.getInt(QCameraParameters::KEY_MAX_NUM_METERING_AREAS);
   1959     if(max_num_mtr_areas == 0) {
   1960         return NO_ERROR;
   1961     }
   1962 
   1963     const char *str = params.get(QCameraParameters::KEY_METERING_AREAS);
   1964     if (str == NULL) {
   1965         ALOGE("%s: Parameter string is null", __func__);
   1966         rc = NO_ERROR;
   1967     } else {
   1968         camera_area_t *areas = new camera_area_t[max_num_mtr_areas];
   1969         int num_areas_found=0;
   1970         if(parseCameraAreaString(str, max_num_mtr_areas, areas, &num_areas_found) < 0) {
   1971             ALOGE("%s: Failed to parse the string: %s", __func__, str);
   1972             delete areas;
   1973             return BAD_VALUE;
   1974         }
   1975         for(int i=0; i<num_areas_found; i++) {
   1976             ALOGV("MeteringArea[%d] = (%d, %d, %d, %d, %d)", i, (areas[i].x1), (areas[i].y1),
   1977                         (areas[i].x2), (areas[i].y2), (areas[i].weight));
   1978         }
   1979         if(validateCameraAreas(areas, num_areas_found) == false) {
   1980             ALOGE("%s: invalid areas specified : %s", __func__, str);
   1981             delete areas;
   1982             return BAD_VALUE;
   1983         }
   1984         mParameters.set(QCameraParameters::KEY_METERING_AREAS, str);
   1985 
   1986         //if the native_set_parms is called when preview is not started, it
   1987         //crashes in lower layer, so return of preview is not started
   1988         if(mPreviewState == QCAMERA_HAL_PREVIEW_STOPPED) {
   1989             delete areas;
   1990             return NO_ERROR;
   1991         }
   1992 
   1993         num_areas_found = 1; //temp; need to change after the multi-roi is enabled
   1994 
   1995         //for special area string (0, 0, 0, 0, 0), set the num_areas_found to 0,
   1996         //so no action is takenby the lower layer
   1997         if(num_areas_found == 1 && (areas[0].x1 == 0) && (areas[0].y1 == 0)
   1998              && (areas[0].x2 == 0) && (areas[0].y2 == 0) && (areas[0].weight == 0)) {
   1999             num_areas_found = 0;
   2000         }
   2001 #if 1
   2002         cam_set_aec_roi_t aec_roi_value;
   2003         uint16_t x1, x2, y1, y2;
   2004         int previewWidth, previewHeight;
   2005         this->getPreviewSize(&previewWidth, &previewHeight);
   2006         //transform the coords from (-1000, 1000) to (0, previewWidth or previewHeight)
   2007         x1 = (uint16_t)((areas[0].x1 + 1000.0f)*(previewWidth/2000.0f));
   2008         y1 = (uint16_t)((areas[0].y1 + 1000.0f)*(previewHeight/2000.0f));
   2009         x2 = (uint16_t)((areas[0].x2 + 1000.0f)*(previewWidth/2000.0f));
   2010         y2 = (uint16_t)((areas[0].y2 + 1000.0f)*(previewHeight/2000.0f));
   2011         delete areas;
   2012 
   2013         if(num_areas_found == 1) {
   2014             aec_roi_value.aec_roi_enable = AEC_ROI_ON;
   2015             aec_roi_value.aec_roi_type = AEC_ROI_BY_COORDINATE;
   2016             aec_roi_value.aec_roi_position.coordinate.x = (x1+x2)/2;
   2017             aec_roi_value.aec_roi_position.coordinate.y = (y1+y2)/2;
   2018         } else {
   2019             aec_roi_value.aec_roi_enable = AEC_ROI_OFF;
   2020             aec_roi_value.aec_roi_type = AEC_ROI_BY_COORDINATE;
   2021             aec_roi_value.aec_roi_position.coordinate.x = DONT_CARE_COORDINATE;
   2022             aec_roi_value.aec_roi_position.coordinate.y = DONT_CARE_COORDINATE;
   2023         }
   2024 
   2025         if(native_set_parms(MM_CAMERA_PARM_AEC_ROI, sizeof(cam_set_aec_roi_t), (void *)&aec_roi_value))
   2026             rc = NO_ERROR;
   2027         else
   2028             rc = BAD_VALUE;
   2029 #endif
   2030 #if 0   //solution including multi-roi, to be enabled later
   2031         aec_mtr_area_t aecArea;
   2032         aecArea.num_area = num_areas_found;
   2033 
   2034         uint16_t x1, x2, y1, y2, dx, dy;
   2035         int previewWidth, previewHeight;
   2036         this->getPreviewSize(&previewWidth, &previewHeight);
   2037 
   2038         for(int i=0; i<num_areas_found; i++) {
   2039             //transform the coords from (-1000, 1000) to (0, previewWidth or previewHeight)
   2040             x1 = (uint16_t)((areas[i].x1 + 1000.0f)*(previewWidth/2000.0f));
   2041             y1 = (uint16_t)((areas[i].y1 + 1000.0f)*(previewHeight/2000.0f));
   2042             x2 = (uint16_t)((areas[i].x2 + 1000.0f)*(previewWidth/2000.0f));
   2043             y2 = (uint16_t)((areas[i].y2 + 1000.0f)*(previewHeight/2000.0f));
   2044             dx = x2 - x1;
   2045             dy = y2 - y1;
   2046             aecArea.mtr_area[i].x = x1;
   2047             aecArea.mtr_area[i].y = y1;
   2048             aecArea.mtr_area[i].dx = dx;
   2049             aecArea.mtr_area[i].dy = dy;
   2050             aecArea.weight[i] = areas[i].weight;
   2051         }
   2052         delete areas;
   2053 
   2054         if(native_set_parms(MM_CAMERA_PARM_AEC_MTR_AREA, sizeof(aec_mtr_area_t), (void*)&aecArea))
   2055             rc = NO_ERROR;
   2056         else
   2057             rc = BAD_VALUE;
   2058 #endif
   2059     }
   2060     ALOGV("%s: X", __func__);
   2061     return rc;
   2062 }
   2063 
   2064 status_t QCameraHardwareInterface::setFocusMode(const QCameraParameters& params)
   2065 {
   2066     const char *str = params.get(QCameraParameters::KEY_FOCUS_MODE);
   2067     const char *prev_str = mParameters.get(QCameraParameters::KEY_FOCUS_MODE);
   2068     bool modesAreSame = strcmp(str, prev_str) == 0;
   2069     ALOGV("%s",__func__);
   2070     if (str != NULL) {
   2071         ALOGV("Focus mode '%s', previous focus mode '%s' (cmp %d)",str, prev_str, strcmp(str, prev_str));
   2072 
   2073         int32_t value;
   2074 
   2075         if (mHasAutoFocusSupport){
   2076             value = attr_lookup(focus_modes_auto,
   2077                                     sizeof(focus_modes_auto) / sizeof(str_map), str);
   2078         } else {
   2079             value = attr_lookup(focus_modes_fixed,
   2080                                     sizeof(focus_modes_fixed) / sizeof(str_map), str);
   2081         }
   2082 
   2083         if (value != NOT_FOUND) {
   2084             mParameters.set(QCameraParameters::KEY_FOCUS_MODE, str);
   2085             mFocusMode = value;
   2086 
   2087             if(updateFocusDistances() != NO_ERROR) {
   2088                ALOGE("%s: updateFocusDistances failed for %s", __FUNCTION__, str);
   2089                return UNKNOWN_ERROR;
   2090             }
   2091             mParameters.set(QCameraParameters::KEY_FOCUS_DISTANCES, mFocusDistance.string());
   2092 
   2093             // Do not set the AF state to 'not running';
   2094             // this prevents a bug where an autoFocus followed by a setParameters
   2095             // with the same exact focus mode resulting in dropping the autoFocusEvent
   2096             if(modesAreSame) {
   2097                 ALOGV("AF mode unchanged (still '%s'); don't touch CAF", str);
   2098                 return NO_ERROR;
   2099             } else {
   2100                 ALOGV("AF made has changed to '%s'", str);
   2101             }
   2102 
   2103             if(mHasAutoFocusSupport){
   2104                 bool ret = native_set_parms(MM_CAMERA_PARM_FOCUS_MODE,
   2105                                       sizeof(value),
   2106                                       (void *)&value);
   2107 
   2108                 int cafSupport = false;
   2109                 int caf_type=0;
   2110                 const char *str_hdr = mParameters.get(QCameraParameters::KEY_SCENE_MODE);
   2111                 if(!strcmp(str, QCameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ||
   2112                    !strcmp(str, QCameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE)){
   2113                     cafSupport = true;
   2114                     bool rc = false;
   2115                     if(!strcmp(str, QCameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO))
   2116                     {
   2117                         caf_type = 1;
   2118                         rc = native_set_parms(MM_CAMERA_PARM_CAF_TYPE, sizeof(caf_type), (void *)&caf_type);
   2119                     }
   2120                     else if(!strcmp(str, QCameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE))
   2121                     {
   2122                         caf_type = 2;
   2123                         rc = native_set_parms(MM_CAMERA_PARM_CAF_TYPE, sizeof(caf_type), (void *)&caf_type);
   2124                     }
   2125                     ALOGV("caf_type %d rc %d", caf_type, rc);
   2126                 }
   2127 
   2128 
   2129                 ALOGV("Continuous Auto Focus %d", cafSupport);
   2130                 if(mAutoFocusRunning && cafSupport){
   2131                   ALOGV("Set auto focus running to false");
   2132                   mAutoFocusRunning = false;
   2133                   if(MM_CAMERA_OK!=cam_ops_action(mCameraId,false,MM_CAMERA_OPS_FOCUS,NULL )) {
   2134                     ALOGE("%s: AF command failed err:%d error %s",__func__, errno,strerror(errno));
   2135                   }
   2136                 }
   2137                 ret = native_set_parms(MM_CAMERA_PARM_CONTINUOUS_AF, sizeof(cafSupport),
   2138                                        (void *)&cafSupport);
   2139             }
   2140 
   2141             return NO_ERROR;
   2142         }
   2143         ALOGV("%s:Could not look up str value",__func__);
   2144     }
   2145     ALOGE("Invalid focus mode value: %s", (str == NULL) ? "NULL" : str);
   2146     return BAD_VALUE;
   2147 }
   2148 
   2149 status_t QCameraHardwareInterface::setSceneMode(const QCameraParameters& params)
   2150 {
   2151     status_t rc = NO_ERROR;
   2152     ALOGV("%s",__func__);
   2153 
   2154     rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_BESTSHOT_MODE);
   2155     if(!rc) {
   2156         ALOGV("%s:Parameter Scenemode is not supported for this sensor", __func__);
   2157         return NO_ERROR;
   2158     }
   2159     const char *str = params.get(QCameraParameters::KEY_SCENE_MODE);
   2160     const char *oldstr = mParameters.get(QCameraParameters::KEY_SCENE_MODE);
   2161 
   2162     if (str != NULL && oldstr != NULL) {
   2163         int32_t value = attr_lookup(scenemode, sizeof(scenemode) / sizeof(str_map), str);
   2164         if (value != NOT_FOUND) {
   2165             /* Check to see if there was a change of scene mode */
   2166             if(strcmp(str,oldstr)) {
   2167                 ALOGV("%s: valued changed from %s to %s",__func__,oldstr, str);
   2168 
   2169                 if (!strcmp(str, "hdr")) {
   2170                     ALOGV("%s: setting num-snaps-per-shutter to 2", __func__);
   2171                     mParameters.set("num-snaps-per-shutter", 2);
   2172                 } else {
   2173                     ALOGV("%s: setting num-snaps-per-shutter to 1", __func__);
   2174                     mParameters.set("num-snaps-per-shutter", 1);
   2175                 }
   2176 
   2177                 /* Check if we are either transitioning to/from HDR state
   2178                    if yes preview needs restart*/
   2179                 if(!strcmp(str, "hdr") || !strcmp(oldstr, "hdr") ) {
   2180                     ALOGV("Changed between HDR/non-HDR states");
   2181 
   2182                     /* Restart only if preview already running*/
   2183                     if (mPreviewState == QCAMERA_HAL_PREVIEW_STARTED) {
   2184                         ALOGV("Preview in progress,restarting for HDR transition");
   2185                         mParameters.set(QCameraParameters::KEY_SCENE_MODE, str);
   2186                         mRestartPreview = 1;
   2187                         pausePreviewForZSL();
   2188                     }
   2189                 }
   2190 
   2191             }
   2192 
   2193 
   2194             mParameters.set(QCameraParameters::KEY_SCENE_MODE, str);
   2195             bool ret = native_set_parms(MM_CAMERA_PARM_BESTSHOT_MODE, sizeof(value),
   2196                                        (void *)&value);
   2197             int bestshot_reconfigure;
   2198             cam_config_get_parm(mCameraId, MM_CAMERA_PARM_BESTSHOT_RECONFIGURE,
   2199                                 &bestshot_reconfigure);
   2200             if(bestshot_reconfigure) {
   2201                 if (mBestShotMode != value) {
   2202                      mBestShotMode = value;
   2203                      if (mPreviewState == QCAMERA_HAL_PREVIEW_STARTED && ret) {
   2204                            ALOGV("%s:Bestshot trigerring restart",__func__);
   2205                            mRestartPreview = 1;
   2206                            pausePreviewForZSL();
   2207                       }
   2208                  }
   2209             }
   2210             return ret ? NO_ERROR : UNKNOWN_ERROR;
   2211         }
   2212     }
   2213     ALOGE("Invalid scenemode value: %s", (str == NULL) ? "NULL" : str);
   2214     return BAD_VALUE;
   2215 }
   2216 
   2217 status_t QCameraHardwareInterface::setSelectableZoneAf(const QCameraParameters& params)
   2218 {
   2219     ALOGV("%s",__func__);
   2220     status_t rc = NO_ERROR;
   2221     if(mHasAutoFocusSupport) {
   2222         const char *str = params.get(QCameraParameters::KEY_SELECTABLE_ZONE_AF);
   2223         if (str != NULL) {
   2224             int32_t value = attr_lookup(selectable_zone_af, sizeof(selectable_zone_af) / sizeof(str_map), str);
   2225             if (value != NOT_FOUND) {
   2226                  rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_FOCUS_RECT);
   2227                  if(!rc) {
   2228                     ALOGV("SelectableZoneAF  is not supported for this sensor");
   2229                     return NO_ERROR;
   2230                  }else {
   2231                     mParameters.set(QCameraParameters::KEY_SELECTABLE_ZONE_AF, str);
   2232                     bool ret = native_set_parms(MM_CAMERA_PARM_FOCUS_RECT, sizeof(value),
   2233                             (void *)&value);
   2234                     return ret ? NO_ERROR : UNKNOWN_ERROR;
   2235                  }
   2236             }
   2237         }
   2238         ALOGE("Invalid selectable zone af value: %s", (str == NULL) ? "NULL" : str);
   2239         return BAD_VALUE;
   2240 
   2241     }
   2242     return NO_ERROR;
   2243 }
   2244 
   2245 status_t QCameraHardwareInterface::setEffect(const QCameraParameters& params)
   2246 {
   2247     ALOGV("%s",__func__);
   2248     status_t rc = NO_ERROR;
   2249     const char *str = params.get(QCameraParameters::KEY_EFFECT);
   2250     int result;
   2251     if (str != NULL) {
   2252         ALOGV("Setting effect %s",str);
   2253         int32_t value = attr_lookup(effects, sizeof(effects) / sizeof(str_map), str);
   2254         if (value != NOT_FOUND) {
   2255            rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_EFFECT);
   2256            if(!rc) {
   2257                ALOGV("Camera Effect - %s mode is not supported for this sensor",str);
   2258                return NO_ERROR;
   2259            }else {
   2260                mParameters.set(QCameraParameters::KEY_EFFECT, str);
   2261                bool ret = native_set_parms(MM_CAMERA_PARM_EFFECT, sizeof(value),
   2262                                            (void *)&value,(int *)&result);
   2263                 if(result != MM_CAMERA_OK) {
   2264                     ALOGE("Camera Effect: %s is not set as the selected value is not supported ", str);
   2265                 }
   2266                 int bestshot_reconfigure;
   2267                 cam_config_get_parm(mCameraId, MM_CAMERA_PARM_BESTSHOT_RECONFIGURE,
   2268                                     &bestshot_reconfigure);
   2269                 if(bestshot_reconfigure) {
   2270                      if (mEffects != value) {
   2271                          mEffects = value;
   2272                          if (mPreviewState == QCAMERA_HAL_PREVIEW_STARTED && ret) {
   2273                                mRestartPreview = 1;
   2274                                pausePreviewForZSL();
   2275                           }
   2276                    }
   2277                }
   2278                return ret ? NO_ERROR : UNKNOWN_ERROR;
   2279           }
   2280         }
   2281     }
   2282     ALOGE("Invalid effect value: %s", (str == NULL) ? "NULL" : str);
   2283     ALOGV("setEffect X");
   2284     return BAD_VALUE;
   2285 }
   2286 
   2287 status_t QCameraHardwareInterface::setBrightness(const QCameraParameters& params) {
   2288 
   2289     ALOGV("%s",__func__);
   2290     status_t rc = NO_ERROR;
   2291     rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_BRIGHTNESS);
   2292    if(!rc) {
   2293        ALOGV("MM_CAMERA_PARM_BRIGHTNESS mode is not supported for this sensor");
   2294        return NO_ERROR;
   2295    }
   2296    int brightness = params.getInt("luma-adaptation");
   2297    if (mBrightness !=  brightness) {
   2298        ALOGV(" new brightness value : %d ", brightness);
   2299        mBrightness =  brightness;
   2300        mParameters.set("luma-adaptation", brightness);
   2301        bool ret = native_set_parms(MM_CAMERA_PARM_BRIGHTNESS, sizeof(mBrightness),
   2302                                    (void *)&mBrightness);
   2303         return ret ? NO_ERROR : UNKNOWN_ERROR;
   2304    }
   2305 
   2306     return NO_ERROR;
   2307 }
   2308 
   2309 status_t QCameraHardwareInterface::setAutoExposure(const QCameraParameters& params)
   2310 {
   2311 
   2312     ALOGV("%s",__func__);
   2313     status_t rc = NO_ERROR;
   2314     rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_EXPOSURE);
   2315    if(!rc) {
   2316        ALOGV("MM_CAMERA_PARM_EXPOSURE mode is not supported for this sensor");
   2317        return NO_ERROR;
   2318    }
   2319    const char *str = params.get(QCameraParameters::KEY_AUTO_EXPOSURE);
   2320     if (str != NULL) {
   2321         int32_t value = attr_lookup(autoexposure, sizeof(autoexposure) / sizeof(str_map), str);
   2322         if (value != NOT_FOUND) {
   2323             mParameters.set(QCameraParameters::KEY_AUTO_EXPOSURE, str);
   2324             bool ret = native_set_parms(MM_CAMERA_PARM_EXPOSURE, sizeof(value),
   2325                                        (void *)&value);
   2326             return ret ? NO_ERROR : UNKNOWN_ERROR;
   2327         }
   2328     }
   2329     ALOGE("Invalid auto exposure value: %s", (str == NULL) ? "NULL" : str);
   2330     return BAD_VALUE;
   2331 }
   2332 
   2333 status_t QCameraHardwareInterface::setExposureCompensation(
   2334         const QCameraParameters & params){
   2335     ALOGV("%s",__func__);
   2336     status_t rc = NO_ERROR;
   2337     rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_EXPOSURE_COMPENSATION);
   2338     if(!rc) {
   2339        ALOGV("MM_CAMERA_PARM_EXPOSURE_COMPENSATION mode is not supported for this sensor");
   2340        return NO_ERROR;
   2341     }
   2342     int numerator = params.getInt(QCameraParameters::KEY_EXPOSURE_COMPENSATION);
   2343     if(EXPOSURE_COMPENSATION_MINIMUM_NUMERATOR <= numerator &&
   2344             numerator <= EXPOSURE_COMPENSATION_MAXIMUM_NUMERATOR){
   2345         int16_t  numerator16 = (int16_t)(numerator & 0x0000ffff);
   2346         uint16_t denominator16 = EXPOSURE_COMPENSATION_DENOMINATOR;
   2347         uint32_t  value = 0;
   2348         value = numerator16 << 16 | denominator16;
   2349 
   2350         const char *sce_str = params.get(QCameraParameters::KEY_SCENE_MODE);
   2351         if (sce_str != NULL) {
   2352             if(!strcmp(sce_str, "sunset")){
   2353                 //Exposure comp value in sunset scene mode
   2354                 mParameters.set(QCameraParameters::KEY_EXPOSURE_COMPENSATION,
   2355                             -6);
   2356             }else{
   2357                 //Exposure comp value for other
   2358                 mParameters.set(QCameraParameters::KEY_EXPOSURE_COMPENSATION,
   2359                             numerator);
   2360             }
   2361         }else {
   2362             mParameters.set(QCameraParameters::KEY_EXPOSURE_COMPENSATION,
   2363                             numerator);
   2364         }
   2365         bool ret = native_set_parms(MM_CAMERA_PARM_EXPOSURE_COMPENSATION,
   2366                                     sizeof(value), (void *)&value);
   2367         return ret ? NO_ERROR : UNKNOWN_ERROR;
   2368     }
   2369     ALOGE("Invalid Exposure Compensation");
   2370     return BAD_VALUE;
   2371 }
   2372 
   2373 status_t QCameraHardwareInterface::setWhiteBalance(const QCameraParameters& params)
   2374 {
   2375 
   2376     ALOGV("%s",__func__);
   2377     status_t rc = NO_ERROR;
   2378     int result;
   2379     const char *str = NULL;
   2380     rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_WHITE_BALANCE);
   2381     if(!rc) {
   2382        ALOGV("MM_CAMERA_PARM_WHITE_BALANCE mode is not supported for this sensor");
   2383        return NO_ERROR;
   2384     }
   2385 
   2386     const char *sce_str = params.get(QCameraParameters::KEY_SCENE_MODE);
   2387     if (sce_str != NULL) {
   2388         if(!strcmp(sce_str, "sunset")){
   2389             //AWB value in sunset scene mode
   2390             str = QCameraParameters::WHITE_BALANCE_DAYLIGHT;
   2391             mParameters.set(QCameraParameters::KEY_WHITE_BALANCE, str);
   2392         }else if(!strcmp(sce_str, "auto")){
   2393             str = params.get(QCameraParameters::KEY_WHITE_BALANCE);
   2394         }else{
   2395             //AWB in  other scene Mode
   2396             str = QCameraParameters::WHITE_BALANCE_AUTO;
   2397             mParameters.set(QCameraParameters::KEY_WHITE_BALANCE, str);
   2398         }
   2399     }else {
   2400         str = params.get(QCameraParameters::KEY_WHITE_BALANCE);
   2401     }
   2402 
   2403     if (str != NULL) {
   2404         int32_t value = attr_lookup(whitebalance, sizeof(whitebalance) / sizeof(str_map), str);
   2405         if (value != NOT_FOUND) {
   2406             mParameters.set(QCameraParameters::KEY_WHITE_BALANCE, str);
   2407             bool ret = native_set_parms(MM_CAMERA_PARM_WHITE_BALANCE, sizeof(value),
   2408                                        (void *)&value, (int *)&result);
   2409             if(result != MM_CAMERA_OK) {
   2410                 ALOGE("WhiteBalance Value: %s is not set as the selected value is not supported ", str);
   2411             }
   2412             return ret ? NO_ERROR : UNKNOWN_ERROR;
   2413         }
   2414     }
   2415     ALOGE("Invalid whitebalance value: %s", (str == NULL) ? "NULL" : str);
   2416     return BAD_VALUE;
   2417 }
   2418 
   2419 status_t QCameraHardwareInterface::setAntibanding(const QCameraParameters& params)
   2420 {
   2421     int result;
   2422 
   2423     ALOGV("%s",__func__);
   2424     status_t rc = NO_ERROR;
   2425     rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_ANTIBANDING);
   2426     if(!rc) {
   2427        ALOGV("ANTIBANDING mode is not supported for this sensor");
   2428        return NO_ERROR;
   2429     }
   2430     const char *str = params.get(QCameraParameters::KEY_ANTIBANDING);
   2431     if (str != NULL) {
   2432         int value = (camera_antibanding_type)attr_lookup(
   2433           antibanding, sizeof(antibanding) / sizeof(str_map), str);
   2434         if (value != NOT_FOUND) {
   2435             camera_antibanding_type temp = (camera_antibanding_type) value;
   2436             ALOGV("Antibanding Value : %d",value);
   2437             mParameters.set(QCameraParameters::KEY_ANTIBANDING, str);
   2438             bool ret = native_set_parms(MM_CAMERA_PARM_ANTIBANDING,
   2439                        sizeof(camera_antibanding_type), (void *)&value ,(int *)&result);
   2440             if(result != MM_CAMERA_OK) {
   2441                 ALOGE("AntiBanding Value: %s is not supported for the given BestShot Mode", str);
   2442             }
   2443             return ret ? NO_ERROR : UNKNOWN_ERROR;
   2444         }
   2445     }
   2446     ALOGE("Invalid antibanding value: %s", (str == NULL) ? "NULL" : str);
   2447 
   2448     return BAD_VALUE;
   2449 }
   2450 
   2451 status_t QCameraHardwareInterface::setPreviewFrameRate(const QCameraParameters& params)
   2452 {
   2453     ALOGV("%s",__func__);
   2454     status_t rc = NO_ERROR;
   2455     rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_FPS);
   2456     if(!rc) {
   2457        ALOGV("MM_CAMERA_PARM_FPS is not supported for this sensor");
   2458        return NO_ERROR;
   2459     }
   2460     uint16_t previousFps = (uint16_t)mParameters.getPreviewFrameRate();
   2461     uint16_t fps = (uint16_t)params.getPreviewFrameRate();
   2462     ALOGV("requested preview frame rate  is %u", fps);
   2463 
   2464     if(mInitialized && (fps == previousFps)){
   2465         ALOGV("No change is FPS Value %d",fps );
   2466         return NO_ERROR;
   2467     }
   2468 
   2469     if(MINIMUM_FPS <= fps && fps <=MAXIMUM_FPS){
   2470         mParameters.setPreviewFrameRate(fps);
   2471         bool ret = native_set_parms(MM_CAMERA_PARM_FPS,
   2472                 sizeof(fps), (void *)&fps);
   2473         return ret ? NO_ERROR : UNKNOWN_ERROR;
   2474     }
   2475 
   2476     return BAD_VALUE;
   2477 }
   2478 
   2479 status_t QCameraHardwareInterface::setPreviewFrameRateMode(const QCameraParameters& params) {
   2480 
   2481     ALOGV("%s",__func__);
   2482     status_t rc = NO_ERROR;
   2483     rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_FPS);
   2484     if(!rc) {
   2485        ALOGV(" CAMERA FPS mode is not supported for this sensor");
   2486        return NO_ERROR;
   2487     }
   2488     rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_FPS_MODE);
   2489     if(!rc) {
   2490        ALOGV("CAMERA FPS MODE mode is not supported for this sensor");
   2491        return NO_ERROR;
   2492     }
   2493 
   2494     const char *previousMode = mParameters.getPreviewFrameRateMode();
   2495     const char *str = params.getPreviewFrameRateMode();
   2496     if (NULL == previousMode) {
   2497         ALOGV("Preview Frame Rate Mode is NULL\n");
   2498         return NO_ERROR;
   2499     }
   2500     if (NULL == str) {
   2501         ALOGV("Preview Frame Rate Mode is NULL\n");
   2502         return NO_ERROR;
   2503     }
   2504     int32_t frameRateMode = attr_lookup(frame_rate_modes, sizeof(frame_rate_modes) / sizeof(str_map),str);
   2505     if(frameRateMode != NOT_FOUND) {
   2506         ALOGV("setPreviewFrameRateMode: %s ", str);
   2507         mParameters.setPreviewFrameRateMode(str);
   2508         bool ret = native_set_parms(MM_CAMERA_PARM_FPS_MODE, sizeof(frameRateMode), (void *)&frameRateMode);
   2509         if(!ret) return ret;
   2510         //set the fps value when chaging modes
   2511         int16_t fps = (uint16_t)params.getPreviewFrameRate();
   2512         if(MINIMUM_FPS <= fps && fps <=MAXIMUM_FPS){
   2513             mParameters.setPreviewFrameRate(fps);
   2514             ret = native_set_parms(MM_CAMERA_PARM_FPS,
   2515                                         sizeof(fps), (void *)&fps);
   2516             return ret ? NO_ERROR : UNKNOWN_ERROR;
   2517         }
   2518         ALOGE("Invalid preview frame rate value: %d", fps);
   2519         return BAD_VALUE;
   2520     }
   2521     ALOGE("Invalid preview frame rate mode value: %s", (str == NULL) ? "NULL" : str);
   2522 
   2523     return BAD_VALUE;
   2524 }
   2525 
   2526 status_t QCameraHardwareInterface::setSkinToneEnhancement(const QCameraParameters& params) {
   2527     ALOGV("%s",__func__);
   2528     status_t rc = NO_ERROR;
   2529     rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_SCE_FACTOR);
   2530     if(!rc) {
   2531        ALOGV("SkinToneEnhancement is not supported for this sensor");
   2532        return NO_ERROR;
   2533     }
   2534      int skinToneValue = params.getInt("skinToneEnhancement");
   2535      if (mSkinToneEnhancement != skinToneValue) {
   2536           ALOGV(" new skinTone correction value : %d ", skinToneValue);
   2537           mSkinToneEnhancement = skinToneValue;
   2538           mParameters.set("skinToneEnhancement", skinToneValue);
   2539           bool ret = native_set_parms(MM_CAMERA_PARM_SCE_FACTOR, sizeof(mSkinToneEnhancement),
   2540                         (void *)&mSkinToneEnhancement);
   2541           return ret ? NO_ERROR : UNKNOWN_ERROR;
   2542     }
   2543     return NO_ERROR;
   2544 }
   2545 
   2546 status_t QCameraHardwareInterface::setWaveletDenoise(const QCameraParameters& params) {
   2547     ALOGV("%s",__func__);
   2548     status_t rc = NO_ERROR;
   2549     rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_WAVELET_DENOISE);
   2550     if(rc != MM_CAMERA_PARM_SUPPORT_SET) {
   2551         ALOGV("Wavelet Denoise is not supported for this sensor");
   2552         /* TO DO */
   2553 //        return NO_ERROR;
   2554     }
   2555     const char *str = params.get(QCameraParameters::KEY_DENOISE);
   2556     if (str != NULL) {
   2557         int value = attr_lookup(denoise,
   2558                 sizeof(denoise) / sizeof(str_map), str);
   2559         if ((value != NOT_FOUND) &&  (mDenoiseValue != value)) {
   2560             mDenoiseValue =  value;
   2561             mParameters.set(QCameraParameters::KEY_DENOISE, str);
   2562 
   2563             char prop[PROPERTY_VALUE_MAX];
   2564             memset(prop, 0, sizeof(prop));
   2565             property_get("persist.denoise.process.plates", prop, "1");
   2566 
   2567             denoise_param_t temp;
   2568             memset(&temp, 0, sizeof(denoise_param_t));
   2569             temp.denoise_enable = value;
   2570             temp.process_plates = atoi(prop);
   2571             ALOGV("Denoise enable=%d, plates=%d", temp.denoise_enable, temp.process_plates);
   2572             bool ret = native_set_parms(MM_CAMERA_PARM_WAVELET_DENOISE, sizeof(temp),
   2573                     (void *)&temp);
   2574             return ret ? NO_ERROR : UNKNOWN_ERROR;
   2575         }
   2576         return NO_ERROR;
   2577     }
   2578     ALOGE("Invalid Denoise value: %s", (str == NULL) ? "NULL" : str);
   2579     return BAD_VALUE;
   2580 }
   2581 
   2582 status_t QCameraHardwareInterface::setVideoSize(const QCameraParameters& params)
   2583 {
   2584     const char *str= NULL;
   2585     const char *str_t= NULL;
   2586     int old_vid_w = 0, old_vid_h = 0;
   2587     ALOGV("%s: E", __func__);
   2588     str = params.get(QCameraParameters::KEY_VIDEO_SIZE);
   2589     str_t = mParameters.get(CameraParameters::KEY_VIDEO_SIZE);
   2590     if(!str) {
   2591         mParameters.set(QCameraParameters::KEY_VIDEO_SIZE, "");
   2592         //If application didn't set this parameter string, use the values from
   2593         //getPreviewSize() as video dimensions.
   2594         ALOGV("No Record Size requested, use the preview dimensions");
   2595         mVideoWidth = mPreviewWidth;
   2596         mVideoHeight = mPreviewHeight;
   2597     } else {
   2598         //Extract the record witdh and height that application requested.
   2599         ALOGV("%s: requested record size %s", __func__, str);
   2600         if(!parse_size(str, mVideoWidth, mVideoHeight)) {
   2601             parse_size(str_t, old_vid_w, old_vid_h);
   2602             if(old_vid_w != mVideoWidth || old_vid_h != mVideoHeight) {
   2603                 mRestartPreview = true;
   2604                 ALOGV("%s: Video sizes changes, Restart preview...", __func__);
   2605             }
   2606             mParameters.set(QCameraParameters::KEY_VIDEO_SIZE, str);
   2607         } else {
   2608             mParameters.set(QCameraParameters::KEY_VIDEO_SIZE, "");
   2609             ALOGE("%s: error :failed to parse parameter record-size (%s)", __func__, str);
   2610             return BAD_VALUE;
   2611         }
   2612     }
   2613     ALOGV("%s: preview dimensions: %dx%d", __func__, mPreviewWidth, mPreviewHeight);
   2614     ALOGV("%s: video dimensions: %dx%d", __func__, mVideoWidth, mVideoHeight);
   2615 
   2616     ALOGV("%s: X", __func__);
   2617     return NO_ERROR;
   2618 }
   2619 
   2620 status_t QCameraHardwareInterface::setCameraMode(const QCameraParameters& params) {
   2621     int32_t value = params.getInt(QCameraParameters::KEY_CAMERA_MODE);
   2622     mParameters.set(QCameraParameters::KEY_CAMERA_MODE,value);
   2623 
   2624     ALOGV("ZSL is enabled  %d", value);
   2625     if (value == 1) {
   2626         myMode = (camera_mode_t)(myMode | CAMERA_ZSL_MODE);
   2627     } else {
   2628         myMode = (camera_mode_t)(myMode & ~CAMERA_ZSL_MODE);
   2629     }
   2630 
   2631     return NO_ERROR;
   2632 }
   2633 
   2634 status_t QCameraHardwareInterface::setPowerMode(const QCameraParameters& params) {
   2635     uint32_t value = NORMAL_POWER;
   2636     const char *powermode = NULL;
   2637 
   2638     powermode = params.get(QCameraParameters::KEY_POWER_MODE);
   2639     if (powermode != NULL) {
   2640         value = attr_lookup(power_modes,
   2641                 sizeof(power_modes) / sizeof(str_map), powermode);
   2642         if((value == LOW_POWER) || mHFRLevel > 1) {
   2643             ALOGV("Enable Low Power Mode");
   2644             value = LOW_POWER;
   2645             mPowerMode = value;
   2646             mParameters.set(QCameraParameters::KEY_POWER_MODE,"Low_Power");
   2647         } else {
   2648             ALOGV("Enable Normal Power Mode");
   2649             mPowerMode = value;
   2650             mParameters.set(QCameraParameters::KEY_POWER_MODE,"Normal_Power");
   2651         }
   2652     }
   2653 
   2654     ALOGV("%s Low power mode %s value = %d", __func__,
   2655           value ? "Enabled" : "Disabled", value);
   2656     native_set_parms(MM_CAMERA_PARM_LOW_POWER_MODE, sizeof(value),
   2657                                                (void *)&value);
   2658     return NO_ERROR;
   2659 }
   2660 
   2661 
   2662 status_t QCameraHardwareInterface::setPreviewSize(const QCameraParameters& params)
   2663 {
   2664     int width, height;
   2665     params.getPreviewSize(&width, &height);
   2666     ALOGV("################requested preview size %d x %d", width, height);
   2667 
   2668     // Validate the preview size
   2669     for (size_t i = 0; i <  mPreviewSizeCount; ++i) {
   2670         if (width ==  mPreviewSizes[i].width
   2671            && height ==  mPreviewSizes[i].height) {
   2672             int old_width, old_height;
   2673             mParameters.getPreviewSize(&old_width,&old_height);
   2674             if(width != old_width || height != old_height) {
   2675                 mRestartPreview = true;
   2676             }
   2677             mParameters.setPreviewSize(width, height);
   2678             ALOGV("setPreviewSize:  width: %d   heigh: %d", width, height);
   2679             mPreviewWidth = width;
   2680             mPreviewHeight = height;
   2681 
   2682             mDimension.display_width = mPreviewWidth;
   2683             mDimension.display_height= mPreviewHeight;
   2684             mDimension.orig_video_width = mPreviewWidth;
   2685             mDimension.orig_video_height = mPreviewHeight;
   2686             mDimension.video_width = mPreviewWidth;
   2687             mDimension.video_height = mPreviewHeight;
   2688 
   2689             return NO_ERROR;
   2690         }
   2691     }
   2692     ALOGE("Invalid preview size requested: %dx%d", width, height);
   2693     return BAD_VALUE;
   2694 }
   2695 status_t QCameraHardwareInterface::setPreviewFpsRange(const QCameraParameters& params)
   2696 {
   2697     ALOGV("%s: E", __func__);
   2698     int minFps,maxFps;
   2699     int prevMinFps, prevMaxFps;
   2700     int rc = NO_ERROR;
   2701     bool found = false;
   2702 
   2703     mParameters.getPreviewFpsRange(&prevMinFps, &prevMaxFps);
   2704     ALOGV("%s: Existing FpsRange Values:(%d, %d)", __func__, prevMinFps, prevMaxFps);
   2705     params.getPreviewFpsRange(&minFps,&maxFps);
   2706     ALOGV("%s: Requested FpsRange Values:(%d, %d)", __func__, minFps, maxFps);
   2707 
   2708     if(mInitialized && (minFps == prevMinFps && maxFps == prevMaxFps)) {
   2709         ALOGV("%s: No change in FpsRange", __func__);
   2710         rc = NO_ERROR;
   2711         goto end;
   2712     }
   2713     for(size_t i=0; i<FPS_RANGES_SUPPORTED_COUNT; i++) {
   2714         // if the value is in the supported list
   2715         if(minFps==FpsRangesSupported[i].minFPS && maxFps == FpsRangesSupported[i].maxFPS){
   2716             found = true;
   2717             ALOGV("FPS: i=%d : minFps = %d, maxFps = %d ",i,FpsRangesSupported[i].minFPS,FpsRangesSupported[i].maxFPS );
   2718             mParameters.setPreviewFpsRange(minFps,maxFps);
   2719             // validate the values
   2720             bool valid = true;
   2721             // FPS can not be negative
   2722             if(minFps < 0 || maxFps < 0) valid = false;
   2723             // minFps must be >= maxFps
   2724             if(minFps > maxFps) valid = false;
   2725 
   2726             if(valid) {
   2727                 //Set the FPS mode
   2728                 const char *str = (minFps == maxFps) ?
   2729                     QCameraParameters::KEY_PREVIEW_FRAME_RATE_FIXED_MODE:
   2730                     QCameraParameters::KEY_PREVIEW_FRAME_RATE_AUTO_MODE;
   2731                 ALOGV("%s FPS_MODE = %s", __func__, str);
   2732                 int32_t frameRateMode = attr_lookup(frame_rate_modes,
   2733                         sizeof(frame_rate_modes) / sizeof(str_map),str);
   2734                 bool ret;
   2735                 ret = native_set_parms(MM_CAMERA_PARM_FPS_MODE, sizeof(int32_t),
   2736                             (void *)&frameRateMode);
   2737 
   2738                 //set FPS values
   2739                 uint32_t fps;  //lower 2 bytes specify maxFps and higher 2 bytes specify minFps
   2740                 fps = ((uint32_t)(minFps/1000) << 16) + ((uint16_t)(maxFps/1000));
   2741                 ret = native_set_parms(MM_CAMERA_PARM_FPS, sizeof(uint32_t), (void *)&fps);
   2742                 mParameters.setPreviewFpsRange(minFps, maxFps);
   2743                 if(ret)
   2744                     rc = NO_ERROR;
   2745                 else {
   2746                     rc = BAD_VALUE;
   2747                     ALOGE("%s: error: native_set_params failed", __func__);
   2748                 }
   2749             } else {
   2750                 ALOGE("%s: error: invalid FPS range value", __func__);
   2751                 rc = BAD_VALUE;
   2752             }
   2753         }
   2754     }
   2755     if(found == false){
   2756             ALOGE("%s: error: FPS range value not supported", __func__);
   2757             rc = BAD_VALUE;
   2758     }
   2759 end:
   2760     ALOGV("%s: X", __func__);
   2761     return rc;
   2762 }
   2763 
   2764 status_t QCameraHardwareInterface::setJpegThumbnailSize(const QCameraParameters& params){
   2765     int width = params.getInt(QCameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
   2766     int height = params.getInt(QCameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
   2767 
   2768     ALOGV("requested jpeg thumbnail size %d x %d", width, height);
   2769 
   2770     // Validate the picture size
   2771     for (unsigned int i = 0; i < thumbnail_sizes_count; ++i) {
   2772        if (width == default_thumbnail_sizes[i].width
   2773          && height == default_thumbnail_sizes[i].height) {
   2774            thumbnailWidth = width;
   2775            thumbnailHeight = height;
   2776            mParameters.set(QCameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, width);
   2777            mParameters.set(QCameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, height);
   2778            return NO_ERROR;
   2779        }
   2780     }
   2781     ALOGE("error: setting jpeg thumbnail size");
   2782     return BAD_VALUE;
   2783 }
   2784 status_t QCameraHardwareInterface::setPictureSize(const QCameraParameters& params)
   2785 {
   2786     int width, height;
   2787     ALOGV("QualcommCameraHardware::setPictureSize E");
   2788     params.getPictureSize(&width, &height);
   2789     ALOGV("requested picture size %d x %d", width, height);
   2790 
   2791     // Validate the picture size
   2792     for (int i = 0; i < mSupportedPictureSizesCount; ++i) {
   2793         if (width == mPictureSizesPtr[i].width
   2794           && height == mPictureSizesPtr[i].height) {
   2795             int old_width, old_height;
   2796             mParameters.getPictureSize(&old_width,&old_height);
   2797             if(width != old_width || height != old_height) {
   2798                 mRestartPreview = true;
   2799             }
   2800             mParameters.setPictureSize(width, height);
   2801             mDimension.picture_width = width;
   2802             mDimension.picture_height = height;
   2803             return NO_ERROR;
   2804         }
   2805     }
   2806     /* Dimension not among the ones in the list. Check if
   2807      * its a valid dimension, if it is, then configure the
   2808      * camera accordingly. else reject it.
   2809      */
   2810     if( isValidDimension(width, height) ) {
   2811         mParameters.setPictureSize(width, height);
   2812         mDimension.picture_width = width;
   2813         mDimension.picture_height = height;
   2814         return NO_ERROR;
   2815     } else
   2816         ALOGE("Invalid picture size requested: %dx%d", width, height);
   2817     return BAD_VALUE;
   2818 }
   2819 
   2820 status_t QCameraHardwareInterface::setJpegRotation(int isZsl) {
   2821     return mm_jpeg_encoder_setRotation(mRotation, isZsl);
   2822 }
   2823 
   2824 int QCameraHardwareInterface::getJpegRotation(void) {
   2825     return mRotation;
   2826 }
   2827 
   2828 int QCameraHardwareInterface::getISOSpeedValue()
   2829 {
   2830     const char *iso_str = mParameters.get(QCameraParameters::KEY_ISO_MODE);
   2831     int iso_index = attr_lookup(iso, sizeof(iso) / sizeof(str_map), iso_str);
   2832     int iso_value = iso_speed_values[iso_index];
   2833     return iso_value;
   2834 }
   2835 
   2836 
   2837 status_t QCameraHardwareInterface::setJpegQuality(const QCameraParameters& params) {
   2838     status_t rc = NO_ERROR;
   2839     int quality = params.getInt(QCameraParameters::KEY_JPEG_QUALITY);
   2840     ALOGV("setJpegQuality E");
   2841     if (quality >= 0 && quality <= 100) {
   2842         mParameters.set(QCameraParameters::KEY_JPEG_QUALITY, quality);
   2843         mJpegQuality = quality;
   2844     } else {
   2845         ALOGE("Invalid jpeg quality=%d", quality);
   2846         rc = BAD_VALUE;
   2847     }
   2848 
   2849     quality = params.getInt(QCameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
   2850     if (quality >= 0 && quality <= 100) {
   2851         mParameters.set(QCameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, quality);
   2852     } else {
   2853         ALOGE("Invalid jpeg thumbnail quality=%d", quality);
   2854         rc = BAD_VALUE;
   2855     }
   2856     ALOGV("setJpegQuality X");
   2857     return rc;
   2858 }
   2859 
   2860 status_t QCameraHardwareInterface::
   2861 setNumOfSnapshot() {
   2862     status_t rc = NO_ERROR;
   2863 
   2864     int num_of_snapshot = getNumOfSnapshots();
   2865 
   2866     bool result = native_set_parms(MM_CAMERA_PARM_SNAPSHOT_BURST_NUM,
   2867                                    sizeof(int),
   2868                                    (void *)&num_of_snapshot);
   2869     if(!result)
   2870         ALOGE("%s:Failure setting number of snapshots!!!", __func__);
   2871     return rc;
   2872 }
   2873 
   2874 status_t QCameraHardwareInterface::setPreviewFormat(const QCameraParameters& params) {
   2875     const char *str = params.getPreviewFormat();
   2876     int32_t previewFormat = attr_lookup(preview_formats, sizeof(preview_formats) / sizeof(str_map), str);
   2877     if(previewFormat != NOT_FOUND) {
   2878         int num = sizeof(preview_format_info_list)/sizeof(preview_format_info_t);
   2879         int i;
   2880 
   2881         for (i = 0; i < num; i++) {
   2882           if (preview_format_info_list[i].Hal_format == previewFormat) {
   2883             mPreviewFormatInfo = preview_format_info_list[i];
   2884             break;
   2885           }
   2886         }
   2887 
   2888         if (i == num) {
   2889           mPreviewFormatInfo.mm_cam_format = CAMERA_YUV_420_NV21;
   2890           mPreviewFormatInfo.padding = CAMERA_PAD_TO_WORD;
   2891           return BAD_VALUE;
   2892         }
   2893         bool ret = native_set_parms(MM_CAMERA_PARM_PREVIEW_FORMAT, sizeof(cam_format_t),
   2894                                    (void *)&mPreviewFormatInfo.mm_cam_format);
   2895         mParameters.set(QCameraParameters::KEY_PREVIEW_FORMAT, str);
   2896         mPreviewFormat = mPreviewFormatInfo.mm_cam_format;
   2897         ALOGV("Setting preview format to %d, i =%d, num=%d, hal_format=%d",
   2898              mPreviewFormat, i, num, mPreviewFormatInfo.Hal_format);
   2899         return NO_ERROR;
   2900     } else if ( strTexturesOn ) {
   2901       mPreviewFormatInfo.mm_cam_format = CAMERA_YUV_420_NV21;
   2902       mPreviewFormatInfo.padding = CAMERA_PAD_TO_4K;
   2903     } else {
   2904       mPreviewFormatInfo.mm_cam_format = CAMERA_YUV_420_NV21;
   2905       mPreviewFormatInfo.padding = CAMERA_PAD_TO_WORD;
   2906     }
   2907     ALOGE("Invalid preview format value: %s", (str == NULL) ? "NULL" : str);
   2908     return BAD_VALUE;
   2909 }
   2910 
   2911 status_t QCameraHardwareInterface::setStrTextures(const QCameraParameters& params) {
   2912     const char *str = params.get("strtextures");
   2913     const char *prev_str = mParameters.get("strtextures");
   2914 
   2915     if(str != NULL) {
   2916         if(!strcmp(str,prev_str)) {
   2917             return NO_ERROR;
   2918         }
   2919         int str_size = strlen(str);
   2920         mParameters.set("strtextures", str);
   2921         if(str_size == 2) {
   2922             if(!strncmp(str, "on", str_size) || !strncmp(str, "ON", str_size)){
   2923                 ALOGV("Resetting mUseOverlay to false");
   2924                 strTexturesOn = true;
   2925                 mUseOverlay = false;
   2926             }
   2927         }else if(str_size == 3){
   2928             if (!strncmp(str, "off", str_size) || !strncmp(str, "OFF", str_size)) {
   2929                 strTexturesOn = false;
   2930                 mUseOverlay = true;
   2931             }
   2932         }
   2933 
   2934     }
   2935     return NO_ERROR;
   2936 }
   2937 
   2938 status_t QCameraHardwareInterface::setFlash(const QCameraParameters& params)
   2939 {
   2940     const char *str = NULL;
   2941 
   2942     ALOGV("%s: E",__func__);
   2943     int rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_LED_MODE);
   2944     if(!rc) {
   2945         ALOGV("%s:LED FLASH not supported", __func__);
   2946         return NO_ERROR;
   2947     }
   2948 
   2949     const char *sce_str = params.get(QCameraParameters::KEY_SCENE_MODE);
   2950     if (sce_str != NULL) {
   2951         if (!strcmp(sce_str, "hdr")) {
   2952             //Flash In HDR
   2953             str = QCameraParameters::FLASH_MODE_OFF;
   2954             mParameters.set(QCameraParameters::KEY_FLASH_MODE, str);
   2955         }else if(!strcmp(sce_str, "auto")){
   2956             //Flash Mode in auto scene mode
   2957             str = params.get(QCameraParameters::KEY_FLASH_MODE);
   2958         }else{
   2959             //FLASH in  scene Mode except auto, hdr
   2960             str = QCameraParameters::FLASH_MODE_AUTO;
   2961             mParameters.set(QCameraParameters::KEY_FLASH_MODE, str);
   2962         }
   2963     }else {
   2964         str = params.get(QCameraParameters::KEY_FLASH_MODE);
   2965     }
   2966 
   2967     if (str != NULL) {
   2968         int32_t value = attr_lookup(flash, sizeof(flash) / sizeof(str_map), str);
   2969         if (value != NOT_FOUND) {
   2970             mParameters.set(QCameraParameters::KEY_FLASH_MODE, str);
   2971             bool ret = native_set_parms(MM_CAMERA_PARM_LED_MODE,
   2972                                        sizeof(value), (void *)&value);
   2973             mLedStatusForZsl = (led_mode_t)value;
   2974             return ret ? NO_ERROR : UNKNOWN_ERROR;
   2975         }
   2976     }
   2977     ALOGE("Invalid flash mode value: %s", (str == NULL) ? "NULL" : str);
   2978 
   2979     return BAD_VALUE;
   2980 }
   2981 
   2982 status_t QCameraHardwareInterface::setAecAwbLock(const QCameraParameters & params)
   2983 {
   2984     ALOGV("%s : E", __func__);
   2985     status_t rc = NO_ERROR;
   2986     int32_t value;
   2987     const char* str;
   2988 
   2989     //for AEC lock
   2990     str = params.get(QCameraParameters::KEY_AUTO_EXPOSURE_LOCK);
   2991     value = (strcmp(str, "true") == 0)? 1 : 0;
   2992     mParameters.set(QCameraParameters::KEY_AUTO_EXPOSURE_LOCK, str);
   2993     rc = (native_set_parms(MM_CAMERA_PARM_AEC_LOCK, sizeof(int32_t), (void *)(&value))) ?
   2994                             NO_ERROR : UNKNOWN_ERROR;
   2995 
   2996     //for AWB lock
   2997     str = params.get(QCameraParameters::KEY_AUTO_WHITEBALANCE_LOCK);
   2998     value = (strcmp(str, "true") == 0)? 1 : 0;
   2999     mParameters.set(QCameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, str);
   3000     rc = (native_set_parms(MM_CAMERA_PARM_AWB_LOCK, sizeof(int32_t), (void *)(&value))) ?
   3001                         NO_ERROR : UNKNOWN_ERROR;
   3002     ALOGV("%s : X", __func__);
   3003     return rc;
   3004 }
   3005 
   3006 status_t QCameraHardwareInterface::setOverlayFormats(const QCameraParameters& params)
   3007 {
   3008     mParameters.set("overlay-format", HAL_PIXEL_FORMAT_YCbCr_420_SP);
   3009     if(mIs3DModeOn == true) {
   3010        int ovFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP|HAL_3D_IN_SIDE_BY_SIDE_L_R|HAL_3D_OUT_SIDE_BY_SIDE;
   3011         mParameters.set("overlay-format", ovFormat);
   3012     }
   3013     return NO_ERROR;
   3014 }
   3015 
   3016 status_t QCameraHardwareInterface::setMCEValue(const QCameraParameters& params)
   3017 {
   3018     ALOGV("%s",__func__);
   3019     status_t rc = NO_ERROR;
   3020     rc = cam_config_is_parm_supported(mCameraId,MM_CAMERA_PARM_MCE);
   3021    if(!rc) {
   3022        ALOGV("MM_CAMERA_PARM_MCE mode is not supported for this sensor");
   3023        return NO_ERROR;
   3024    }
   3025    const char *str = params.get(QCameraParameters::KEY_MEMORY_COLOR_ENHANCEMENT);
   3026     if (str != NULL) {
   3027         int value = attr_lookup(mce, sizeof(mce) / sizeof(str_map), str);
   3028         if (value != NOT_FOUND) {
   3029             int temp = (int8_t)value;
   3030             ALOGV("%s: setting MCE value of %s", __FUNCTION__, str);
   3031             mParameters.set(QCameraParameters::KEY_MEMORY_COLOR_ENHANCEMENT, str);
   3032 
   3033             native_set_parms(MM_CAMERA_PARM_MCE, sizeof(int8_t), (void *)&temp);
   3034             return NO_ERROR;
   3035         }
   3036     }
   3037     ALOGE("Invalid MCE value: %s", (str == NULL) ? "NULL" : str);
   3038 
   3039     return NO_ERROR;
   3040 }
   3041 
   3042 status_t QCameraHardwareInterface::setHighFrameRate(const QCameraParameters& params)
   3043 {
   3044 
   3045     bool mCameraRunning;
   3046 
   3047     int rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_HFR);
   3048     if(!rc) {
   3049         ALOGV("%s: MM_CAMERA_PARM_HFR not supported", __func__);
   3050         return NO_ERROR;
   3051     }
   3052 
   3053     const char *str = params.get(QCameraParameters::KEY_VIDEO_HIGH_FRAME_RATE);
   3054     if (str != NULL) {
   3055         int value = attr_lookup(hfr, sizeof(hfr) / sizeof(str_map), str);
   3056         if (value != NOT_FOUND) {
   3057             mHFRLevel = (int32_t)value;
   3058             //Check for change in HFR value
   3059             const char *oldHfr = mParameters.get(QCameraParameters::KEY_VIDEO_HIGH_FRAME_RATE);
   3060             if(strcmp(oldHfr, str)){
   3061                 mParameters.set(QCameraParameters::KEY_VIDEO_HIGH_FRAME_RATE, str);
   3062 //              mHFRMode = true;
   3063 		mCameraRunning=isPreviewRunning();
   3064                 if(mCameraRunning == true) {
   3065 //                    mHFRThreadWaitLock.lock();
   3066 //                    pthread_attr_t pattr;
   3067 //                    pthread_attr_init(&pattr);
   3068 //                    pthread_attr_setdetachstate(&pattr, PTHREAD_CREATE_DETACHED);
   3069 //                    mHFRThreadRunning = !pthread_create(&mHFRThread,
   3070 //                                      &pattr,
   3071 //                                      hfr_thread,
   3072 //                                      (void*)NULL);
   3073 //                    mHFRThreadWaitLock.unlock();
   3074                     stopPreviewInternal();
   3075                     mPreviewState = QCAMERA_HAL_PREVIEW_STOPPED;
   3076                     native_set_parms(MM_CAMERA_PARM_HFR, sizeof(int32_t), (void *)&mHFRLevel);
   3077                     mPreviewState = QCAMERA_HAL_PREVIEW_START;
   3078                     if (startPreview2() == NO_ERROR)
   3079                         mPreviewState = QCAMERA_HAL_PREVIEW_STARTED;
   3080                     return NO_ERROR;
   3081                 }
   3082             }
   3083             native_set_parms(MM_CAMERA_PARM_HFR, sizeof(int32_t), (void *)&mHFRLevel);
   3084             return NO_ERROR;
   3085         }
   3086     }
   3087     ALOGE("Invalid HFR value: %s", (str == NULL) ? "NULL" : str);
   3088     return NO_ERROR;
   3089 }
   3090 
   3091 status_t QCameraHardwareInterface::setLensshadeValue(const QCameraParameters& params)
   3092 {
   3093 
   3094     int rc = cam_config_is_parm_supported(mCameraId, MM_CAMERA_PARM_ROLLOFF);
   3095     if(!rc) {
   3096         ALOGV("%s:LENS SHADING not supported", __func__);
   3097         return NO_ERROR;
   3098     }
   3099 
   3100     const char *str = params.get(QCameraParameters::KEY_LENSSHADE);
   3101     if (str != NULL) {
   3102         int value = attr_lookup(lensshade,
   3103                                     sizeof(lensshade) / sizeof(str_map), str);
   3104         if (value != NOT_FOUND) {
   3105             int8_t temp = (int8_t)value;
   3106             mParameters.set(QCameraParameters::KEY_LENSSHADE, str);
   3107             native_set_parms(MM_CAMERA_PARM_ROLLOFF, sizeof(int8_t), (void *)&temp);
   3108             return NO_ERROR;
   3109         }
   3110     }
   3111     ALOGE("Invalid lensShade value: %s", (str == NULL) ? "NULL" : str);
   3112     return BAD_VALUE;
   3113 }
   3114 
   3115 status_t QCameraHardwareInterface::setFaceDetect(const QCameraParameters& params)
   3116 {
   3117     if(supportsFaceDetection() == false){
   3118         ALOGI("setFaceDetect support is not available");
   3119         return NO_ERROR;
   3120     }
   3121 
   3122     int requested_faces = params.getInt(QCameraParameters::KEY_MAX_NUM_REQUESTED_FACES);
   3123     int hardware_supported_faces = mParameters.getInt(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW);
   3124     if (requested_faces > hardware_supported_faces) {
   3125         requested_faces = hardware_supported_faces;
   3126     }
   3127     mParameters.set(QCameraParameters::KEY_MAX_NUM_REQUESTED_FACES, requested_faces);
   3128     const char *str = params.get(QCameraParameters::KEY_FACE_DETECTION);
   3129     ALOGV("setFaceDetect: %s", str);
   3130     if (str != NULL) {
   3131         fd_set_parm_t fd_set_parm;
   3132         int value = attr_lookup(facedetection,
   3133                 sizeof(facedetection) / sizeof(str_map), str);
   3134         mFaceDetectOn = value;
   3135         fd_set_parm.fd_mode = value;
   3136         fd_set_parm.num_fd = requested_faces;
   3137         ALOGV("%s Face detection value = %d, num_fd = %d",__func__, value, requested_faces);
   3138         native_set_parms(MM_CAMERA_PARM_FD, sizeof(fd_set_parm_t), (void *)&fd_set_parm);
   3139         mParameters.set(QCameraParameters::KEY_FACE_DETECTION, str);
   3140         return NO_ERROR;
   3141     }
   3142     ALOGE("Invalid Face Detection value: %s", (str == NULL) ? "NULL" : str);
   3143     return BAD_VALUE;
   3144 }
   3145 status_t QCameraHardwareInterface::setFaceDetection(const char *str)
   3146 {
   3147     if(supportsFaceDetection() == false){
   3148         ALOGV("Face detection is not enabled");
   3149         return NO_ERROR;
   3150     }
   3151     if (str != NULL) {
   3152         int requested_faces = mParameters.getInt(QCameraParameters::KEY_MAX_NUM_REQUESTED_FACES);
   3153         int value = attr_lookup(facedetection,
   3154                                     sizeof(facedetection) / sizeof(str_map), str);
   3155         if (value != NOT_FOUND) {
   3156             fd_set_parm_t fd_set_parm;
   3157             mMetaDataWaitLock.lock();
   3158             mFaceDetectOn = value;
   3159             mMetaDataWaitLock.unlock();
   3160             fd_set_parm.fd_mode = value;
   3161             fd_set_parm.num_fd = requested_faces;
   3162             ALOGV("%s Face detection value = %d, num_fd = %d",__func__, value, requested_faces);
   3163             native_set_parms(MM_CAMERA_PARM_FD, sizeof(fd_set_parm_t), (void *)&fd_set_parm);
   3164             mParameters.set(QCameraParameters::KEY_FACE_DETECTION, str);
   3165             return NO_ERROR;
   3166         }
   3167     }
   3168     ALOGE("Invalid Face Detection value: %s", (str == NULL) ? "NULL" : str);
   3169     return BAD_VALUE;
   3170 }
   3171 
   3172 status_t QCameraHardwareInterface::setAEBracket(const QCameraParameters& params)
   3173 {
   3174     const char *str;
   3175     if(!cam_config_is_parm_supported(mCameraId,MM_CAMERA_PARM_HDR) || (myMode & CAMERA_ZSL_MODE)) {
   3176         ALOGV("Parameter HDR is not supported for this sensor/ ZSL mode");
   3177 
   3178         if (myMode & CAMERA_ZSL_MODE) {
   3179             ALOGV("In ZSL mode, reset AEBBracket to HDR_OFF mode");
   3180             exp_bracketing_t temp;
   3181             memset(&temp, 0, sizeof(temp));
   3182             mHdrMode = HDR_BRACKETING_OFF;
   3183             temp.hdr_enable= false;
   3184             temp.mode = HDR_BRACKETING_OFF;
   3185             native_set_parms(MM_CAMERA_PARM_HDR, sizeof(exp_bracketing_t), (void *)&temp);
   3186         }
   3187         return NO_ERROR;
   3188     }
   3189 
   3190     const char *str2 = params.get(QCameraParameters::KEY_SCENE_MODE);
   3191     if(!strcmp(str2, "hdr")) {
   3192         str="HDR";
   3193     }   else {
   3194         str=QCameraParameters::AE_BRACKET_HDR_OFF;
   3195     }
   3196 
   3197     if (str != NULL) {
   3198         int value = attr_lookup(hdr_bracket,
   3199                                     sizeof(hdr_bracket) / sizeof(str_map), str);
   3200         exp_bracketing_t temp;
   3201         memset(&temp, 0, sizeof(temp));
   3202         switch (value) {
   3203             case HDR_MODE:
   3204                 {
   3205                     mHdrMode = HDR_MODE;
   3206                 }
   3207                 break;
   3208             case EXP_BRACKETING_MODE:
   3209                 {
   3210                     int numFrames = getNumOfSnapshots();
   3211                     const char *str_val = params.get("capture-burst-exposures");
   3212                     if ((str_val != NULL) && (strlen(str_val)>0)) {
   3213                         ALOGV("%s: capture-burst-exposures %s", __FUNCTION__, str_val);
   3214 
   3215                         mHdrMode = EXP_BRACKETING_MODE;
   3216                         temp.hdr_enable = false;
   3217                         temp.mode = EXP_BRACKETING_MODE;
   3218                         temp.total_frames = (numFrames >  MAX_SNAPSHOT_BUFFERS -2) ? MAX_SNAPSHOT_BUFFERS -2 : numFrames;
   3219                         temp.total_hal_frames = temp.total_frames;
   3220                         strlcpy(temp.values, str_val, MAX_EXP_BRACKETING_LENGTH);
   3221                         ALOGV("%s: setting Exposure Bracketing value of %s, frame (%d)", __FUNCTION__, temp.values, temp.total_hal_frames);
   3222                         native_set_parms(MM_CAMERA_PARM_HDR, sizeof(exp_bracketing_t), (void *)&temp);
   3223                     }
   3224                     else {
   3225                         /* Apps not set capture-burst-exposures, error case fall into bracketing off mode */
   3226                         ALOGV("%s: capture-burst-exposures not set, back to HDR OFF mode", __FUNCTION__);
   3227                         mHdrMode = HDR_BRACKETING_OFF;
   3228                         temp.hdr_enable= false;
   3229                         temp.mode = HDR_BRACKETING_OFF;
   3230                         native_set_parms(MM_CAMERA_PARM_HDR, sizeof(exp_bracketing_t), (void *)&temp);
   3231                     }
   3232                 }
   3233                 break;
   3234             case HDR_BRACKETING_OFF:
   3235             default:
   3236                 {
   3237                     mHdrMode = HDR_BRACKETING_OFF;
   3238                     temp.hdr_enable= false;
   3239                     temp.mode = HDR_BRACKETING_OFF;
   3240                     native_set_parms(MM_CAMERA_PARM_HDR, sizeof(exp_bracketing_t), (void *)&temp);
   3241                 }
   3242                 break;
   3243         }
   3244 
   3245         /* save the value*/
   3246         mParameters.set(QCameraParameters::KEY_AE_BRACKET_HDR, str);
   3247     }
   3248     return NO_ERROR;
   3249 }
   3250 
   3251 status_t QCameraHardwareInterface::setCaptureBurstExp()
   3252 {
   3253     char burst_exp[PROPERTY_VALUE_MAX];
   3254     memset(burst_exp, 0, sizeof(burst_exp));
   3255     property_get("persist.capture.burst.exposures", burst_exp, "");
   3256     if (NULL != burst_exp)
   3257       mParameters.set("capture-burst-exposures", burst_exp);
   3258     return NO_ERROR;
   3259 }
   3260 
   3261 status_t QCameraHardwareInterface::setRedeyeReduction(const QCameraParameters& params)
   3262 {
   3263     if(supportsRedEyeReduction() == false) {
   3264         ALOGV("Parameter Redeye Reduction is not supported for this sensor");
   3265         return NO_ERROR;
   3266     }
   3267 
   3268     const char *str = params.get(QCameraParameters::KEY_REDEYE_REDUCTION);
   3269     if (str != NULL) {
   3270         int value = attr_lookup(redeye_reduction, sizeof(redeye_reduction) / sizeof(str_map), str);
   3271         if (value != NOT_FOUND) {
   3272             int8_t temp = (int8_t)value;
   3273             ALOGV("%s: setting Redeye Reduction value of %s", __FUNCTION__, str);
   3274             mParameters.set(QCameraParameters::KEY_REDEYE_REDUCTION, str);
   3275 
   3276             native_set_parms(MM_CAMERA_PARM_REDEYE_REDUCTION, sizeof(int8_t), (void *)&temp);
   3277             return NO_ERROR;
   3278         }
   3279     }
   3280     ALOGE("Invalid Redeye Reduction value: %s", (str == NULL) ? "NULL" : str);
   3281     return BAD_VALUE;
   3282 }
   3283 
   3284 status_t QCameraHardwareInterface::setGpsLocation(const QCameraParameters& params)
   3285 {
   3286     const char *method = params.get(QCameraParameters::KEY_GPS_PROCESSING_METHOD);
   3287     if (method) {
   3288         mParameters.set(QCameraParameters::KEY_GPS_PROCESSING_METHOD, method);
   3289     }else {
   3290          mParameters.remove(QCameraParameters::KEY_GPS_PROCESSING_METHOD);
   3291     }
   3292 
   3293     const char *latitude = params.get(QCameraParameters::KEY_GPS_LATITUDE);
   3294     if (latitude) {
   3295         mParameters.set(QCameraParameters::KEY_GPS_LATITUDE, latitude);
   3296     }else {
   3297          mParameters.remove(QCameraParameters::KEY_GPS_LATITUDE);
   3298     }
   3299 
   3300     const char *latitudeRef = params.get(QCameraParameters::KEY_GPS_LATITUDE_REF);
   3301     if (latitudeRef) {
   3302         mParameters.set(QCameraParameters::KEY_GPS_LATITUDE_REF, latitudeRef);
   3303     }else {
   3304          mParameters.remove(QCameraParameters::KEY_GPS_LATITUDE_REF);
   3305     }
   3306 
   3307     const char *longitude = params.get(QCameraParameters::KEY_GPS_LONGITUDE);
   3308     if (longitude) {
   3309         mParameters.set(QCameraParameters::KEY_GPS_LONGITUDE, longitude);
   3310     }else {
   3311          mParameters.remove(QCameraParameters::KEY_GPS_LONGITUDE);
   3312     }
   3313 
   3314     const char *longitudeRef = params.get(QCameraParameters::KEY_GPS_LONGITUDE_REF);
   3315     if (longitudeRef) {
   3316         mParameters.set(QCameraParameters::KEY_GPS_LONGITUDE_REF, longitudeRef);
   3317     }else {
   3318          mParameters.remove(QCameraParameters::KEY_GPS_LONGITUDE_REF);
   3319     }
   3320 
   3321     const char *altitudeRef = params.get(QCameraParameters::KEY_GPS_ALTITUDE_REF);
   3322     if (altitudeRef) {
   3323         mParameters.set(QCameraParameters::KEY_GPS_ALTITUDE_REF, altitudeRef);
   3324     }else {
   3325          mParameters.remove(QCameraParameters::KEY_GPS_ALTITUDE_REF);
   3326     }
   3327 
   3328     const char *altitude = params.get(QCameraParameters::KEY_GPS_ALTITUDE);
   3329     if (altitude) {
   3330         mParameters.set(QCameraParameters::KEY_GPS_ALTITUDE, altitude);
   3331     }else {
   3332          mParameters.remove(QCameraParameters::KEY_GPS_ALTITUDE);
   3333     }
   3334 
   3335     const char *status = params.get(QCameraParameters::KEY_GPS_STATUS);
   3336     if (status) {
   3337         mParameters.set(QCameraParameters::KEY_GPS_STATUS, status);
   3338     }
   3339 
   3340     const char *dateTime = params.get(QCameraParameters::KEY_EXIF_DATETIME);
   3341     if (dateTime) {
   3342         mParameters.set(QCameraParameters::KEY_EXIF_DATETIME, dateTime);
   3343     }else {
   3344          mParameters.remove(QCameraParameters::KEY_EXIF_DATETIME);
   3345     }
   3346 
   3347     const char *timestamp = params.get(QCameraParameters::KEY_GPS_TIMESTAMP);
   3348     if (timestamp) {
   3349         mParameters.set(QCameraParameters::KEY_GPS_TIMESTAMP, timestamp);
   3350     }else {
   3351          mParameters.remove(QCameraParameters::KEY_GPS_TIMESTAMP);
   3352     }
   3353     ALOGV("setGpsLocation X");
   3354     return NO_ERROR;
   3355 }
   3356 
   3357 status_t QCameraHardwareInterface::setRotation(const QCameraParameters& params)
   3358 {
   3359     status_t rc = NO_ERROR;
   3360     int rotation = params.getInt(QCameraParameters::KEY_ROTATION);
   3361     if (rotation != NOT_FOUND) {
   3362         if (rotation == 0 || rotation == 90 || rotation == 180
   3363             || rotation == 270) {
   3364           mParameters.set(QCameraParameters::KEY_ROTATION, rotation);
   3365           mRotation = rotation;
   3366         } else {
   3367             ALOGE("Invalid rotation value: %d", rotation);
   3368             rc = BAD_VALUE;
   3369         }
   3370     }
   3371     ALOGV("setRotation");
   3372     return rc;
   3373 }
   3374 
   3375 status_t QCameraHardwareInterface::setDenoise(const QCameraParameters& params)
   3376 {
   3377 #if 0
   3378     if(!mCfgControl.mm_camera_is_supported(MM_CAMERA_PARM_WAVELET_DENOISE)) {
   3379         ALOGE("Wavelet Denoise is not supported for this sensor");
   3380         return NO_ERROR;
   3381     }
   3382     const char *str = params.get(QCameraParameters::KEY_DENOISE);
   3383     if (str != NULL) {
   3384         int value = attr_lookup(denoise,
   3385         sizeof(denoise) / sizeof(str_map), str);
   3386         if ((value != NOT_FOUND) &&  (mDenoiseValue != value)) {
   3387         mDenoiseValue =  value;
   3388         mParameters.set(QCameraParameters::KEY_DENOISE, str);
   3389         bool ret = native_set_parms(MM_CAMERA_PARM_WAVELET_DENOISE, sizeof(value),
   3390                                                (void *)&value);
   3391         return ret ? NO_ERROR : UNKNOWN_ERROR;
   3392         }
   3393         return NO_ERROR;
   3394     }
   3395     ALOGE("Invalid Denoise value: %s", (str == NULL) ? "NULL" : str);
   3396 #endif
   3397     return BAD_VALUE;
   3398 }
   3399 
   3400 status_t QCameraHardwareInterface::setOrientation(const QCameraParameters& params)
   3401 {
   3402     const char *str = params.get("orientation");
   3403 
   3404     if (str != NULL) {
   3405         if (strcmp(str, "portrait") == 0 || strcmp(str, "landscape") == 0) {
   3406             // Camera service needs this to decide if the preview frames and raw
   3407             // pictures should be rotated.
   3408             mParameters.set("orientation", str);
   3409         } else {
   3410             ALOGE("Invalid orientation value: %s", str);
   3411             return BAD_VALUE;
   3412         }
   3413     }
   3414     return NO_ERROR;
   3415 }
   3416 
   3417 status_t QCameraHardwareInterface::setPictureFormat(const QCameraParameters& params)
   3418 {
   3419     const char * str = params.get(QCameraParameters::KEY_PICTURE_FORMAT);
   3420 
   3421     if(str != NULL){
   3422         int32_t value = attr_lookup(picture_formats,
   3423                                     sizeof(picture_formats) / sizeof(str_map), str);
   3424         if(value != NOT_FOUND){
   3425             mParameters.set(QCameraParameters::KEY_PICTURE_FORMAT, str);
   3426         } else {
   3427             ALOGE("Invalid Picture Format value: %s", str);
   3428             return BAD_VALUE;
   3429         }
   3430     }
   3431     return NO_ERROR;
   3432 }
   3433 
   3434 status_t QCameraHardwareInterface::setRecordingHintValue(const int32_t value)
   3435 {
   3436     native_set_parms(MM_CAMERA_PARM_RECORDING_HINT, sizeof(value),
   3437                                            (void *)&value);
   3438     if (value == true){
   3439         native_set_parms(MM_CAMERA_PARM_CAF_ENABLE, sizeof(value),
   3440                                            (void *)&value);
   3441     }
   3442     setDISMode();
   3443     setFullLiveshot();
   3444     return NO_ERROR;
   3445 }
   3446 
   3447 status_t QCameraHardwareInterface::setRecordingHint(const QCameraParameters& params)
   3448 {
   3449 
   3450   const char * str = params.get(QCameraParameters::KEY_RECORDING_HINT);
   3451 
   3452   if(str != NULL){
   3453       int32_t value = attr_lookup(recording_Hints,
   3454                                   sizeof(recording_Hints) / sizeof(str_map), str);
   3455       if(value != NOT_FOUND){
   3456           mRecordingHint = value;
   3457           setRecordingHintValue(mRecordingHint);
   3458           mParameters.set(QCameraParameters::KEY_RECORDING_HINT, str);
   3459           return NO_ERROR;
   3460       } else {
   3461           ALOGE("Invalid Picture Format value: %s", str);
   3462           setDISMode();
   3463           setFullLiveshot();
   3464           return BAD_VALUE;
   3465       }
   3466   }
   3467   setDISMode();
   3468   setFullLiveshot();
   3469   return NO_ERROR;
   3470 }
   3471 
   3472 status_t QCameraHardwareInterface::setDISMode() {
   3473   /* Enable DIS only if
   3474    * - Camcorder mode AND
   3475    * - DIS property is set AND
   3476    * - Not in Low power mode. */
   3477   uint32_t value = mRecordingHint && mDisEnabled
   3478                    && !isLowPowerCamcorder();
   3479 
   3480   ALOGV("%s DIS is %s value = %d", __func__,
   3481           value ? "Enabled" : "Disabled", value);
   3482   native_set_parms(MM_CAMERA_PARM_DIS_ENABLE, sizeof(value),
   3483                                                (void *)&value);
   3484   return NO_ERROR;
   3485 }
   3486 
   3487 status_t QCameraHardwareInterface::setFullLiveshot()
   3488 {
   3489   /* Enable full size liveshot only if
   3490    * - Camcorder mode AND
   3491    * - Full size liveshot is enabled. */
   3492   uint32_t value = mRecordingHint && mFullLiveshotEnabled
   3493                    && !isLowPowerCamcorder();
   3494 
   3495   if (((mDimension.picture_width == mVideoWidth) &&
   3496       (mDimension.picture_height == mVideoHeight))) {
   3497     /* If video size matches the live snapshot size
   3498      * turn off full size liveshot to get higher fps. */
   3499     value = 0;
   3500   }
   3501 
   3502   ALOGV("%s Full size liveshot %s value = %d", __func__,
   3503           value ? "Enabled" : "Disabled", value);
   3504   native_set_parms(MM_CAMERA_PARM_FULL_LIVESHOT, sizeof(value),
   3505                                                (void *)&value);
   3506   return NO_ERROR;
   3507 }
   3508 
   3509 
   3510 isp3a_af_mode_t QCameraHardwareInterface::getAutoFocusMode(
   3511   const QCameraParameters& params)
   3512 {
   3513   isp3a_af_mode_t afMode = AF_MODE_MAX;
   3514   afMode = (isp3a_af_mode_t)mFocusMode;
   3515   return afMode;
   3516 }
   3517 
   3518 void QCameraHardwareInterface::getPictureSize(int *picture_width,
   3519                                               int *picture_height) const
   3520 {
   3521     mParameters.getPictureSize(picture_width, picture_height);
   3522 }
   3523 
   3524 void QCameraHardwareInterface::getPreviewSize(int *preview_width,
   3525                                               int *preview_height) const
   3526 {
   3527     mParameters.getPreviewSize(preview_width, preview_height);
   3528 }
   3529 
   3530 cam_format_t QCameraHardwareInterface::getPreviewFormat() const
   3531 {
   3532     cam_format_t foramt = CAMERA_YUV_420_NV21;
   3533     const char *str = mParameters.getPreviewFormat();
   3534     int32_t value = attr_lookup(preview_formats,
   3535                                 sizeof(preview_formats)/sizeof(str_map),
   3536                                 str);
   3537 
   3538     if(value != NOT_FOUND) {
   3539         int num = sizeof(preview_format_info_list)/sizeof(preview_format_info_t);
   3540         int i;
   3541         for (i = 0; i < num; i++) {
   3542           if (preview_format_info_list[i].Hal_format == value) {
   3543             foramt = preview_format_info_list[i].mm_cam_format;
   3544             break;
   3545           }
   3546         }
   3547     }
   3548 
   3549     return foramt;
   3550 }
   3551 
   3552 cam_pad_format_t QCameraHardwareInterface::getPreviewPadding() const
   3553 {
   3554   return mPreviewFormatInfo.padding;
   3555 }
   3556 
   3557 int QCameraHardwareInterface::getJpegQuality() const
   3558 {
   3559     return mJpegQuality;
   3560 }
   3561 
   3562 int QCameraHardwareInterface::getNumOfSnapshots(void) const
   3563 {
   3564     char prop[PROPERTY_VALUE_MAX];
   3565     memset(prop, 0, sizeof(prop));
   3566     property_get("persist.camera.snapshot.number", prop, "0");
   3567     ALOGV("%s: prop enable/disable = %d", __func__, atoi(prop));
   3568     if (atoi(prop)) {
   3569         ALOGV("%s: Reading maximum no of snapshots = %d"
   3570              "from properties", __func__, atoi(prop));
   3571         return atoi(prop);
   3572     } else {
   3573         return mParameters.getInt("num-snaps-per-shutter");
   3574     }
   3575 }
   3576 
   3577 int QCameraHardwareInterface::
   3578 getThumbSizesFromAspectRatio(uint32_t aspect_ratio,
   3579                              int *picture_width,
   3580                              int *picture_height)
   3581 {
   3582     for(unsigned int i = 0; i < THUMBNAIL_SIZE_COUNT; i++ ){
   3583         if(thumbnail_sizes[i].aspect_ratio == aspect_ratio)
   3584         {
   3585             *picture_width = thumbnail_sizes[i].width;
   3586             *picture_height = thumbnail_sizes[i].height;
   3587             return NO_ERROR;
   3588         }
   3589     }
   3590 
   3591     return BAD_VALUE;
   3592 }
   3593 
   3594 bool QCameraHardwareInterface::isRawSnapshot()
   3595 {
   3596   const char *format = mParameters.getPictureFormat();
   3597     if( format!= NULL &&
   3598        !strcmp(format, QCameraParameters::PIXEL_FORMAT_RAW)){
   3599         return true;
   3600     }
   3601     else{
   3602         return false;
   3603     }
   3604 }
   3605 
   3606 status_t QCameraHardwareInterface::setPreviewSizeTable(void)
   3607 {
   3608     status_t ret = NO_ERROR;
   3609     mm_camera_dimension_t dim;
   3610     struct camera_size_type* preview_size_table;
   3611     int preview_table_size;
   3612     int i = 0;
   3613     char str[10] = {0};
   3614 
   3615     /* Initialize table with default values */
   3616     preview_size_table = default_preview_sizes;
   3617     preview_table_size = preview_sizes_count;
   3618 
   3619 
   3620     /* Get maximum preview size supported by sensor*/
   3621     memset(&dim, 0, sizeof(mm_camera_dimension_t));
   3622     ret = cam_config_get_parm(mCameraId,
   3623                               MM_CAMERA_PARM_MAX_PREVIEW_SIZE, &dim);
   3624     if (ret != NO_ERROR) {
   3625         ALOGE("%s: Failure getting Max Preview Size supported by camera",
   3626              __func__);
   3627         goto end;
   3628     }
   3629 
   3630     ALOGV("%s: Max Preview Sizes Supported: %d X %d", __func__,
   3631          dim.width, dim.height);
   3632 
   3633     for (i = 0; i < preview_table_size; i++) {
   3634         if ((preview_size_table->width <= dim.width) &&
   3635             (preview_size_table->height <= dim.height)) {
   3636             ALOGV("%s: Camera Preview Size Table "
   3637                  "Max width: %d height %d table_size: %d",
   3638                  __func__, preview_size_table->width,
   3639                  preview_size_table->height, preview_table_size - i);
   3640             break;
   3641         }
   3642         preview_size_table++;
   3643     }
   3644     //set preferred preview size to maximum preview size
   3645     sprintf(str, "%dx%d", preview_size_table->width, preview_size_table->height);
   3646     mParameters.set(QCameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, str);
   3647     ALOGV("KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO = %s", str);
   3648 
   3649 end:
   3650     /* Save the table in global member*/
   3651     mPreviewSizes = preview_size_table;
   3652     mPreviewSizeCount = preview_table_size - i;
   3653 
   3654     return ret;
   3655 }
   3656 
   3657 status_t QCameraHardwareInterface::setPictureSizeTable(void)
   3658 {
   3659     status_t ret = NO_ERROR;
   3660     mm_camera_dimension_t dim;
   3661     struct camera_size_type* picture_size_table;
   3662     int picture_table_size;
   3663     int i = 0, count = 0;
   3664 
   3665     /* Initialize table with default values */
   3666     picture_table_size = sizeof(default_picture_sizes)/
   3667         sizeof(default_picture_sizes[0]);
   3668     picture_size_table = default_picture_sizes;
   3669     mPictureSizes =
   3670         ( struct camera_size_type *)malloc(picture_table_size *
   3671                                            sizeof(struct camera_size_type));
   3672     if (mPictureSizes == NULL) {
   3673         ALOGE("%s: Failre allocating memory to store picture size table",__func__);
   3674         goto end;
   3675     }
   3676 
   3677     /* Get maximum picture size supported by sensor*/
   3678     memset(&dim, 0, sizeof(mm_camera_dimension_t));
   3679     ret = cam_config_get_parm(mCameraId,
   3680                               MM_CAMERA_PARM_MAX_PICTURE_SIZE, &dim);
   3681     if (ret != NO_ERROR) {
   3682         ALOGE("%s: Failure getting Max Picture Size supported by camera",
   3683              __func__);
   3684         ret = NO_MEMORY;
   3685         free(mPictureSizes);
   3686         mPictureSizes = NULL;
   3687         goto end;
   3688     }
   3689 
   3690     ALOGV("%s: Max Picture Sizes Supported: %d X %d", __func__,
   3691          dim.width, dim.height);
   3692 
   3693     for (i = 0; i < picture_table_size; i++) {
   3694         /* We'll store those dimensions whose width AND height
   3695            are less than or equal to maximum supported */
   3696         if ((picture_size_table->width <= dim.width) &&
   3697             (picture_size_table->height <= dim.height)) {
   3698             ALOGV("%s: Camera Picture Size Table "
   3699                  "Max width: %d height %d table_size: %d",
   3700                  __func__, picture_size_table->width,
   3701                  picture_size_table->height, count+1);
   3702             mPictureSizes[count].height = picture_size_table->height;
   3703             mPictureSizes[count].width = picture_size_table->width;
   3704             count++;
   3705         }
   3706         picture_size_table++;
   3707     }
   3708     mPictureSizeCount = count;
   3709 
   3710 end:
   3711      /* In case of error, we use default picture sizes */
   3712      if (ret != NO_ERROR) {
   3713         mPictureSizes = default_picture_sizes;
   3714         mPictureSizeCount = picture_table_size;
   3715     }
   3716     return ret;
   3717 }
   3718 
   3719 status_t QCameraHardwareInterface::setVideoSizeTable(void)
   3720 {
   3721     status_t ret = NO_ERROR;
   3722     mm_camera_dimension_t dim;
   3723     struct camera_size_type* video_size_table;
   3724     int video_table_size;
   3725     int i = 0, count = 0;
   3726     ALOGV("%s: E", __func__);
   3727 
   3728     /* Initialize table with default values */
   3729     video_table_size = video_sizes_count;
   3730     video_size_table = default_video_sizes;
   3731     mVideoSizes =
   3732         (struct camera_size_type *)malloc(video_table_size *
   3733                                            sizeof(struct camera_size_type));
   3734     if(mVideoSizes == NULL) {
   3735         ALOGE("%s: error allocating memory to store video size table",__func__);
   3736         ret = BAD_VALUE;
   3737         goto end;
   3738     }
   3739 
   3740     /* Get maximum video size supported by sensor*/
   3741     memset(&dim, 0, sizeof(mm_camera_dimension_t));
   3742     ret = cam_config_get_parm(mCameraId,
   3743                               MM_CAMERA_PARM_MAX_VIDEO_SIZE, &dim);
   3744     if(ret != NO_ERROR) {
   3745         ALOGE("%s: error getting Max Video Size supported by camera",
   3746              __func__);
   3747         ret = NO_MEMORY;
   3748         free(mVideoSizes);
   3749         mVideoSizes = NULL;
   3750         ret = BAD_VALUE;
   3751         goto end;
   3752     }
   3753 
   3754     ALOGV("%s: Max Video Size Supported: %d X %d", __func__,
   3755          dim.width, dim.height);
   3756 
   3757     for(i=0; i < video_table_size; i++) {
   3758         /* We'll store those dimensions whose width AND height
   3759            are less than or equal to maximum supported */
   3760         if((video_size_table->width <= dim.width) &&
   3761             (video_size_table->height <= dim.height)) {
   3762             ALOGV("%s: Supported Video Size [%d] = %dx%d", __func__, count, video_size_table->width,
   3763                                     video_size_table->height);
   3764             mVideoSizes[count].height = video_size_table->height;
   3765             mVideoSizes[count].width = video_size_table->width;
   3766             count++;
   3767         }
   3768         video_size_table++;
   3769     }
   3770     mVideoSizeCount = count;
   3771 
   3772 end:
   3773     ALOGV("%s: X", __func__);
   3774     return ret;
   3775 }
   3776 
   3777 void QCameraHardwareInterface::freeVideoSizeTable(void)
   3778 {
   3779     if(mVideoSizes != NULL)
   3780     {
   3781         free(mVideoSizes);
   3782     }
   3783     mVideoSizeCount = 0;
   3784 }
   3785 
   3786 
   3787 void QCameraHardwareInterface::freePictureTable(void)
   3788 {
   3789     /* If we couldn't allocate memory to store picture table
   3790        we use the picture table pointer to point to default
   3791        picture table array. In that case we cannot free it.*/
   3792     if ((mPictureSizes != default_picture_sizes) && mPictureSizes) {
   3793         free(mPictureSizes);
   3794     }
   3795 }
   3796 
   3797 status_t QCameraHardwareInterface::setHistogram(int histogram_en)
   3798 {
   3799     ALOGV("setHistogram: E");
   3800     if(mStatsOn == histogram_en) {
   3801         return NO_ERROR;
   3802     }
   3803 
   3804     mSendData = histogram_en;
   3805     mStatsOn = histogram_en;
   3806     mCurrentHisto = -1;
   3807     mStatSize = sizeof(uint32_t)* HISTOGRAM_STATS_SIZE;
   3808 
   3809     if (histogram_en == QCAMERA_PARM_ENABLE) {
   3810         /*Currently the Ashmem is multiplying the buffer size with total number
   3811         of buffers and page aligning. This causes a crash in JNI as each buffer
   3812         individually expected to be page aligned  */
   3813         int page_size_minus_1 = getpagesize() - 1;
   3814         int statSize = sizeof (camera_preview_histogram_info );
   3815         int32_t mAlignedStatSize = ((statSize + page_size_minus_1) & (~page_size_minus_1));
   3816 #if 0
   3817         mStatHeap =
   3818         new AshmemPool(mAlignedStatSize, 3, statSize, "stat");
   3819         if (!mStatHeap->initialized()) {
   3820             ALOGE("Stat Heap X failed ");
   3821             mStatHeap.clear();
   3822             mStatHeap = NULL;
   3823             return UNKNOWN_ERROR;
   3824         }
   3825 #endif
   3826         for(int cnt = 0; cnt<3; cnt++) {
   3827                 mStatsMapped[cnt]=mGetMemory(-1, mStatSize, 1, mCallbackCookie);
   3828                 if(mStatsMapped[cnt] == NULL) {
   3829                     ALOGE("Failed to get camera memory for stats heap index: %d", cnt);
   3830                     return(-1);
   3831                 } else {
   3832                    ALOGV("Received following info for stats mapped data:%p,handle:%p, size:%d,release:%p",
   3833                    mStatsMapped[cnt]->data ,mStatsMapped[cnt]->handle, mStatsMapped[cnt]->size, mStatsMapped[cnt]->release);
   3834                 }
   3835                 mHistServer.size = sizeof(camera_preview_histogram_info);
   3836 #ifdef USE_ION
   3837                 if(allocate_ion_memory(&mHistServer, cnt, ION_IOMMU_HEAP_ID) < 0) {
   3838                   ALOGE("%s ION alloc failed\n", __func__);
   3839                   return -1;
   3840                 }
   3841 #else
   3842 		        mHistServer.fd[cnt] = open("/dev/pmem_adsp", O_RDWR|O_SYNC);
   3843 		        if(mHistServer.fd[cnt] <= 0) {
   3844 			      ALOGE("%s: no pmem for frame %d", __func__, cnt);
   3845 			      return -1;
   3846 		        }
   3847 #endif
   3848                 mHistServer.camera_memory[cnt]=mGetMemory(mHistServer.fd[cnt],mHistServer.size, 1, mCallbackCookie);
   3849                 if(mHistServer.camera_memory[cnt] == NULL) {
   3850                     ALOGE("Failed to get camera memory for server side histogram index: %d", cnt);
   3851                     return(-1);
   3852                 } else {
   3853                    ALOGV("Received following info for server side histogram data:%p,handle:%p, size:%d,release:%p",
   3854                    mHistServer.camera_memory[cnt]->data ,mHistServer.camera_memory[cnt]->handle,
   3855                         mHistServer.camera_memory[cnt]->size, mHistServer.camera_memory[cnt]->release);
   3856                 }
   3857                 /*Register buffer at back-end*/
   3858                 if (NO_ERROR != sendMappingBuf(0, cnt, mHistServer.fd[cnt],
   3859                                                    mHistServer.size, mCameraId,
   3860                                                CAM_SOCK_MSG_TYPE_HIST_MAPPING)) {
   3861                     ALOGE("%s could not send buffer to back-end\n", __func__);
   3862                 }
   3863         }
   3864     }
   3865     ALOGV("Setting histogram = %d", histogram_en);
   3866     native_set_parms(MM_CAMERA_PARM_HISTOGRAM, sizeof(int), &histogram_en);
   3867     if(histogram_en == QCAMERA_PARM_DISABLE)
   3868     {
   3869         //release memory
   3870         for(int i=0; i<3; i++){
   3871             if(mStatsMapped[i] != NULL) {
   3872                 mStatsMapped[i]->release(mStatsMapped[i]);
   3873             }
   3874             /*Unregister buffer at back-end */
   3875             if (NO_ERROR != sendUnMappingBuf(0, i, mCameraId, CAM_SOCK_MSG_TYPE_HIST_UNMAPPING)) {
   3876               ALOGE("%s could not unregister buffer from back-end\n", __func__);
   3877             }
   3878             if(mHistServer.camera_memory[i] != NULL) {
   3879                 mHistServer.camera_memory[i]->release(mHistServer.camera_memory[i]);
   3880             }
   3881             close(mHistServer.fd[i]);
   3882 #ifdef USE_ION
   3883             deallocate_ion_memory(&mHistServer, i);
   3884 #endif
   3885         }
   3886     }
   3887     return NO_ERROR;
   3888 }
   3889 
   3890 status_t QCameraHardwareInterface::setZSLBurstLookBack(const QCameraParameters& params)
   3891 {
   3892   const char *v = params.get("capture-burst-retroactive");
   3893   if (v) {
   3894     int look_back = atoi(v);
   3895     ALOGV("%s: look_back =%d", __func__, look_back);
   3896     mParameters.set("capture-burst-retroactive", look_back);
   3897   }
   3898   return NO_ERROR;
   3899 }
   3900 
   3901 status_t QCameraHardwareInterface::setZSLBurstInterval(const QCameraParameters& params)
   3902 {
   3903   mZslInterval = BURST_INTREVAL_DEFAULT;
   3904   const char *v = params.get("capture-burst-interval");
   3905   if (v) {
   3906     int interval = atoi(v);
   3907     ALOGV("%s: Interval =%d", __func__, interval);
   3908     if(interval < BURST_INTREVAL_MIN ||interval > BURST_INTREVAL_MAX ) {
   3909       return BAD_VALUE;
   3910     }
   3911     mZslInterval =  interval;
   3912   }
   3913   return NO_ERROR;
   3914 }
   3915 
   3916 int QCameraHardwareInterface::getZSLBurstInterval( void )
   3917 {
   3918   int val;
   3919 
   3920   if (mZslInterval == BURST_INTREVAL_DEFAULT) {
   3921     char prop[PROPERTY_VALUE_MAX];
   3922     memset(prop, 0, sizeof(prop));
   3923     property_get("persist.camera.zsl.interval", prop, "1");
   3924     val = atoi(prop);
   3925     ALOGV("%s: prop interval = %d", __func__, val);
   3926   } else {
   3927     val = mZslInterval;
   3928   }
   3929   return val;
   3930 }
   3931 
   3932 
   3933 int QCameraHardwareInterface::getZSLQueueDepth(void) const
   3934 {
   3935     char prop[PROPERTY_VALUE_MAX];
   3936     memset(prop, 0, sizeof(prop));
   3937     property_get("persist.camera.zsl.queuedepth", prop, "2");
   3938     ALOGV("%s: prop = %d", __func__, atoi(prop));
   3939     return atoi(prop);
   3940 }
   3941 
   3942 int QCameraHardwareInterface::getZSLBackLookCount(void) const
   3943 {
   3944     int look_back;
   3945     char prop[PROPERTY_VALUE_MAX];
   3946     memset(prop, 0, sizeof(prop));
   3947     property_get("persist.camera.zsl.backlookcnt", prop, "0");
   3948     ALOGV("%s: prop = %d", __func__, atoi(prop));
   3949     look_back = atoi(prop);
   3950     if (look_back == 0 ) {
   3951       look_back = mParameters.getInt("capture-burst-retroactive");
   3952       ALOGV("%s: look_back = %d", __func__, look_back);
   3953     }
   3954     return look_back;
   3955 }
   3956 
   3957 bool QCameraHardwareInterface::getFlashCondition(void)
   3958 {
   3959     int32_t rc = 0;
   3960     bool flash_cond = false;
   3961     aec_info_for_flash_t lowLightForZSL;
   3962 
   3963     lowLightForZSL.aec_index_for_zsl = 0;
   3964     lowLightForZSL.zsl_flash_enable = 0;
   3965 
   3966     if(myMode & CAMERA_ZSL_MODE){
   3967         switch(mLedStatusForZsl) {
   3968             case LED_MODE_ON:
   3969                 flash_cond = true;
   3970                 break;
   3971             case LED_MODE_AUTO:
   3972                 rc = cam_config_get_parm(mCameraId,
   3973                         MM_CAMERA_GET_PARM_LOW_LIGHT_FOR_ZSL, &lowLightForZSL);
   3974                 if(MM_CAMERA_OK == rc) {
   3975                     if(lowLightForZSL.zsl_flash_enable != 0)
   3976                         flash_cond = true;
   3977                     else
   3978                         flash_cond = false;
   3979                 }
   3980                 else
   3981                     ALOGE("%s: Failed to get lowLightForZSL, rc %d", __func__, rc);
   3982                 break;
   3983              default:
   3984                 break;
   3985         }
   3986     }
   3987 
   3988     ALOGV("%s: myMode %d, flash mode %d, flash condition %d",
   3989         __func__, myMode, mLedStatusForZsl, flash_cond);
   3990     return flash_cond;
   3991 }
   3992 
   3993 //EXIF functions
   3994 void QCameraHardwareInterface::deinitExifData()
   3995 {
   3996     ALOGV("Clearing EXIF data");
   3997     for(int i=0; i<MAX_EXIF_TABLE_ENTRIES; i++)
   3998     {
   3999         //clear all data
   4000         memset(&mExifData[i], 0x00, sizeof(exif_tags_info_t));
   4001     }
   4002     mExifTableNumEntries = 0;
   4003 }
   4004 
   4005 void QCameraHardwareInterface::addExifTag(exif_tag_id_t tagid, exif_tag_type_t type,
   4006                         uint32_t count, uint8_t copy, void *data) {
   4007 
   4008     if(mExifTableNumEntries >= MAX_EXIF_TABLE_ENTRIES) {
   4009         ALOGE("%s: Number of entries exceeded limit", __func__);
   4010         return;
   4011     }
   4012     int index = mExifTableNumEntries;
   4013     mExifData[index].tag_id = tagid;
   4014     mExifData[index].tag_entry.type = type;
   4015     mExifData[index].tag_entry.count = count;
   4016     mExifData[index].tag_entry.copy = copy;
   4017     if((type == EXIF_RATIONAL) && (count > 1))
   4018         mExifData[index].tag_entry.data._rats = (rat_t *)data;
   4019     if((type == EXIF_RATIONAL) && (count == 1))
   4020         mExifData[index].tag_entry.data._rat = *(rat_t *)data;
   4021     else if(type == EXIF_ASCII)
   4022         mExifData[index].tag_entry.data._ascii = (char *)data;
   4023     else if(type == EXIF_BYTE)
   4024         mExifData[index].tag_entry.data._byte = *(uint8_t *)data;
   4025     else if((type == EXIF_SHORT) && (count > 1))
   4026         mExifData[index].tag_entry.data._shorts = (uint16_t *)data;
   4027     else if((type == EXIF_SHORT) && (count == 1))
   4028         mExifData[index].tag_entry.data._short = *(uint16_t *)data;
   4029     // Increase number of entries
   4030     mExifTableNumEntries++;
   4031 }
   4032 
   4033 void QCameraHardwareInterface::initExifData(){
   4034     short val_short;
   4035     char value[PROPERTY_VALUE_MAX];
   4036     if (property_get("ro.product.manufacturer", value, "QCOM-AA") > 0) {
   4037         strncpy(mExifValues.make, value, 19);
   4038         mExifValues.make[19] = '\0';
   4039         addExifTag(EXIFTAGID_MAKE, EXIF_ASCII, strlen(value) + 1, 1, (void *)mExifValues.make);
   4040     } else {
   4041         ALOGE("%s: getExifMaker failed", __func__);
   4042     }
   4043 
   4044     if (property_get("ro.product.model", value, "QCAM-AA") > 0) {
   4045         strncpy(mExifValues.model, value, 19);
   4046         mExifValues.model[19] = '\0';
   4047         addExifTag(EXIFTAGID_MODEL, EXIF_ASCII, strlen(value) + 1, 1, (void *)mExifValues.model);
   4048     } else {
   4049         ALOGE("%s: getExifModel failed", __func__);
   4050     }
   4051 
   4052     if(mExifValues.dateTime) {
   4053         addExifTag(EXIFTAGID_EXIF_DATE_TIME_ORIGINAL, EXIF_ASCII,
   4054                 20, 1, (void *)mExifValues.dateTime);
   4055         addExifTag(EXIFTAGID_EXIF_DATE_TIME_DIGITIZED, EXIF_ASCII,
   4056                 20, 1, (void *)mExifValues.dateTime);
   4057     }
   4058     addExifTag(EXIFTAGID_FOCAL_LENGTH, EXIF_RATIONAL, 1, 1, (void *)&(mExifValues.focalLength));
   4059     addExifTag(EXIFTAGID_ISO_SPEED_RATING,EXIF_SHORT,1,1,(void *)&(mExifValues.isoSpeed));
   4060 
   4061     // normal f_number is from 1.2 to 22, but I'd like to put some margin.
   4062     if(mExifValues.f_number.num>0 && mExifValues.f_number.num<3200) {
   4063         addExifTag(EXIFTAGID_F_NUMBER,EXIF_RATIONAL,1,1,(void *)&(mExifValues.f_number));
   4064         addExifTag(EXIFTAGID_APERTURE,EXIF_RATIONAL,1,1,(void *)&(mExifValues.f_number));
   4065     }
   4066 
   4067 
   4068     if(mExifValues.mGpsProcess) {
   4069         addExifTag(EXIFTAGID_GPS_PROCESSINGMETHOD, EXIF_ASCII,
   4070                 EXIF_ASCII_PREFIX_SIZE + strlen(mExifValues.gpsProcessingMethod + EXIF_ASCII_PREFIX_SIZE) + 1,
   4071                 1, (void *)mExifValues.gpsProcessingMethod);
   4072     }
   4073 
   4074     if(mExifValues.mLatitude) {
   4075         addExifTag(EXIFTAGID_GPS_LATITUDE, EXIF_RATIONAL, 3, 1, (void *)mExifValues.latitude);
   4076 
   4077         if(mExifValues.latRef) {
   4078             addExifTag(EXIFTAGID_GPS_LATITUDE_REF, EXIF_ASCII, 2,
   4079                     1, (void *)mExifValues.latRef);
   4080         }
   4081     }
   4082 
   4083     if(mExifValues.mLongitude) {
   4084         addExifTag(EXIFTAGID_GPS_LONGITUDE, EXIF_RATIONAL, 3, 1, (void *)mExifValues.longitude);
   4085 
   4086         if(mExifValues.lonRef) {
   4087             addExifTag(EXIFTAGID_GPS_LONGITUDE_REF, EXIF_ASCII, 2,
   4088                     1, (void *)mExifValues.lonRef);
   4089         }
   4090     }
   4091 
   4092     if(mExifValues.mAltitude) {
   4093         addExifTag(EXIFTAGID_GPS_ALTITUDE, EXIF_RATIONAL, 1,
   4094                 1, (void *)&(mExifValues.altitude));
   4095 
   4096         addExifTag(EXIFTAGID_GPS_ALTITUDE_REF, EXIF_BYTE, 1, 1, (void *)&mExifValues.mAltitude_ref);
   4097     }
   4098 
   4099     if(mExifValues.mTimeStamp) {
   4100         time_t unixTime;
   4101         struct tm *UTCTimestamp;
   4102 
   4103         unixTime = (time_t)mExifValues.mGPSTimestamp;
   4104         UTCTimestamp = gmtime(&unixTime);
   4105 
   4106         strftime(mExifValues.gpsDateStamp, sizeof(mExifValues.gpsDateStamp), "%Y:%m:%d", UTCTimestamp);
   4107         addExifTag(EXIFTAGID_GPS_DATESTAMP, EXIF_ASCII,
   4108                 strlen(mExifValues.gpsDateStamp)+1 , 1, (void *)mExifValues.gpsDateStamp);
   4109 
   4110         mExifValues.gpsTimeStamp[0] = getRational(UTCTimestamp->tm_hour, 1);
   4111         mExifValues.gpsTimeStamp[1] = getRational(UTCTimestamp->tm_min, 1);
   4112         mExifValues.gpsTimeStamp[2] = getRational(UTCTimestamp->tm_sec, 1);
   4113 
   4114         addExifTag(EXIFTAGID_GPS_TIMESTAMP, EXIF_RATIONAL,
   4115                 3, 1, (void *)mExifValues.gpsTimeStamp);
   4116         ALOGV("EXIFTAGID_GPS_TIMESTAMP set");
   4117     }
   4118     if(mExifValues.exposure_time.num || mExifValues.exposure_time.denom)
   4119         addExifTag(EXIFTAGID_EXPOSURE_TIME, EXIF_RATIONAL, 1, 1, (void *)&mExifValues.exposure_time);
   4120 
   4121     bool flashCondition = getFlashCondition();
   4122     addExifTag(EXIFTAGID_FLASH, EXIF_SHORT, 1, 1, &flashCondition);
   4123     if (mExifValues.mWbMode == CAMERA_WB_AUTO)
   4124         val_short = 0;
   4125     else
   4126         val_short = 1;
   4127     addExifTag(EXIFTAGID_WHITE_BALANCE, EXIF_SHORT, 1, 1, &val_short);
   4128 
   4129     addExifTag(EXIFTAGID_SUBSEC_TIME, EXIF_ASCII, 7, 1, (void *)mExifValues.subsecTime);
   4130 
   4131     addExifTag(EXIFTAGID_SUBSEC_TIME_ORIGINAL, EXIF_ASCII, 7, 1, (void *)mExifValues.subsecTime);
   4132 
   4133     addExifTag(EXIFTAGID_SUBSEC_TIME_DIGITIZED, EXIF_ASCII, 7, 1, (void *)mExifValues.subsecTime);
   4134 }
   4135 
   4136 //Add all exif tags in this function
   4137 void QCameraHardwareInterface::setExifTags()
   4138 {
   4139     const char *str;
   4140 
   4141     //set TimeStamp
   4142     str = mParameters.get(QCameraParameters::KEY_EXIF_DATETIME);
   4143     if(str != NULL) {
   4144         strncpy(mExifValues.dateTime, str, 19);
   4145         mExifValues.dateTime[19] = '\0';
   4146     }
   4147 
   4148     //Set focal length
   4149     int focalLengthValue = (int) (mParameters.getFloat(
   4150             QCameraParameters::KEY_FOCAL_LENGTH) * FOCAL_LENGTH_DECIMAL_PRECISION);
   4151 
   4152     mExifValues.focalLength = getRational(focalLengthValue, FOCAL_LENGTH_DECIMAL_PRECISION);
   4153 
   4154     focus_distances_info_t focusDistances;
   4155     status_t rc = NO_ERROR;
   4156     rc = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_FOCAL_LENGTH,(void *)&focusDistances);
   4157     if (rc == MM_CAMERA_OK){
   4158         uint16_t temp1;
   4159         rat_t temp;
   4160         if(mIsoValue == 0) // ISO is auto
   4161         {
   4162             temp1 = (uint16_t)(focusDistances.real_gain + 0.5)*100;
   4163             mExifValues.isoSpeed = temp1;
   4164             ALOGV("The new ISO value is %d", temp1);
   4165         }
   4166         else{
   4167             temp1 = iso_speed_values[mIsoValue];
   4168             mExifValues.isoSpeed = temp1;
   4169             ALOGV("else The new ISO value is %d", temp1);
   4170         }
   4171 
   4172         if(focusDistances.exp_time <= 0) // avoid zero-divide problem
   4173             focusDistances.exp_time = 0.01668; // expoure time will be 1/60 s
   4174 
   4175         uint16_t temp2 = (uint16_t)(focusDistances.exp_time * 100000);
   4176         temp2 = (uint16_t)(100000 / temp2);
   4177         temp.num = 1;
   4178         temp.denom = temp2;
   4179         memcpy(&mExifValues.exposure_time, &temp, sizeof(mExifValues.exposure_time));
   4180         ALOGV(" The exposure value is %f", temp2);
   4181     }
   4182     //get time and date from system
   4183     time_t rawtime;
   4184     struct tm * timeinfo;
   4185     time(&rawtime);
   4186     timeinfo = localtime (&rawtime);
   4187     //Write datetime according to EXIF Spec
   4188     //"YYYY:MM:DD HH:MM:SS" (20 chars including \0)
   4189     snprintf(mExifValues.dateTime, 20, "%04d:%02d:%02d %02d:%02d:%02d",
   4190             timeinfo->tm_year + 1900, timeinfo->tm_mon + 1,
   4191             timeinfo->tm_mday, timeinfo->tm_hour,
   4192             timeinfo->tm_min, timeinfo->tm_sec);
   4193     //set gps tags
   4194 
   4195     struct timeval tv;
   4196     gettimeofday(&tv, NULL);
   4197     snprintf(mExifValues.subsecTime, 7, "%06ld", tv.tv_usec);
   4198 
   4199     mExifValues.mWbMode = mParameters.getInt(QCameraParameters::KEY_WHITE_BALANCE);
   4200     setExifTagsGPS();
   4201 }
   4202 
   4203 void QCameraHardwareInterface::setExifTagsGPS()
   4204 {
   4205     const char *str = NULL;
   4206 
   4207     //Set GPS processing method
   4208     str = mParameters.get(QCameraParameters::KEY_GPS_PROCESSING_METHOD);
   4209     if(str != NULL) {
   4210         memcpy(mExifValues.gpsProcessingMethod, ExifAsciiPrefix, EXIF_ASCII_PREFIX_SIZE);
   4211         strncpy(mExifValues.gpsProcessingMethod + EXIF_ASCII_PREFIX_SIZE, str,
   4212                 GPS_PROCESSING_METHOD_SIZE - 1);
   4213         mExifValues.gpsProcessingMethod[EXIF_ASCII_PREFIX_SIZE + GPS_PROCESSING_METHOD_SIZE-1] = '\0';
   4214         ALOGV("EXIFTAGID_GPS_PROCESSINGMETHOD = %s %s", mExifValues.gpsProcessingMethod,
   4215                 mExifValues.gpsProcessingMethod+8);
   4216         mExifValues.mGpsProcess  = true;
   4217     }else{
   4218         mExifValues.mGpsProcess = false;
   4219     }
   4220     str = NULL;
   4221 
   4222     //Set Latitude
   4223     str = mParameters.get(QCameraParameters::KEY_GPS_LATITUDE);
   4224     if(str != NULL) {
   4225         parseGPSCoordinate(str, mExifValues.latitude);
   4226         ALOGV("EXIFTAGID_GPS_LATITUDE = %s", str);
   4227 
   4228         //set Latitude Ref
   4229         float latitudeValue = mParameters.getFloat(QCameraParameters::KEY_GPS_LATITUDE);
   4230         if(latitudeValue < 0.0f) {
   4231             mExifValues.latRef[0] = 'S';
   4232         } else {
   4233             mExifValues.latRef[0] = 'N';
   4234         }
   4235         mExifValues.latRef[1] = '\0';
   4236         mExifValues.mLatitude = true;
   4237         mParameters.set(QCameraParameters::KEY_GPS_LATITUDE_REF,mExifValues.latRef);
   4238         ALOGV("EXIFTAGID_GPS_LATITUDE_REF = %s", mExifValues.latRef);
   4239     }else{
   4240         mExifValues.mLatitude = false;
   4241     }
   4242 
   4243     //set Longitude
   4244     str = NULL;
   4245     str = mParameters.get(QCameraParameters::KEY_GPS_LONGITUDE);
   4246     if(str != NULL) {
   4247         parseGPSCoordinate(str, mExifValues.longitude);
   4248         ALOGV("EXIFTAGID_GPS_LONGITUDE = %s", str);
   4249 
   4250         //set Longitude Ref
   4251         float longitudeValue = mParameters.getFloat(QCameraParameters::KEY_GPS_LONGITUDE);
   4252         if(longitudeValue < 0.0f) {
   4253             mExifValues.lonRef[0] = 'W';
   4254         } else {
   4255             mExifValues.lonRef[0] = 'E';
   4256         }
   4257         mExifValues.lonRef[1] = '\0';
   4258         mExifValues.mLongitude = true;
   4259         ALOGV("EXIFTAGID_GPS_LONGITUDE_REF = %s", mExifValues.lonRef);
   4260         mParameters.set(QCameraParameters::KEY_GPS_LONGITUDE_REF, mExifValues.lonRef);
   4261     }else{
   4262         mExifValues.mLongitude = false;
   4263     }
   4264 
   4265     //set Altitude
   4266     str = mParameters.get(QCameraParameters::KEY_GPS_ALTITUDE);
   4267     if(str != NULL) {
   4268         double value = atof(str);
   4269         mExifValues.mAltitude_ref = 0;
   4270         if(value < 0){
   4271             mExifValues.mAltitude_ref = 1;
   4272             value = -value;
   4273         }
   4274         mExifValues.altitude = getRational(value*1000, 1000);
   4275         mExifValues.mAltitude = true;
   4276         //set AltitudeRef
   4277         mParameters.set(QCameraParameters::KEY_GPS_ALTITUDE_REF, mExifValues.mAltitude_ref);
   4278         ALOGV("EXIFTAGID_GPS_ALTITUDE = %f", value);
   4279     }else{
   4280         mExifValues.mAltitude = false;
   4281     }
   4282 
   4283     //set Gps TimeStamp
   4284     str = NULL;
   4285     str = mParameters.get(QCameraParameters::KEY_GPS_TIMESTAMP);
   4286     if(str != NULL) {
   4287         mExifValues.mTimeStamp = true;
   4288         mExifValues.mGPSTimestamp = atol(str);
   4289     }else{
   4290         mExifValues.mTimeStamp = false;
   4291     }
   4292 }
   4293 
   4294 //latlonString is string formatted coordinate
   4295 //coord is rat_t[3]
   4296 void QCameraHardwareInterface::parseGPSCoordinate(const char *latlonString, rat_t* coord)
   4297 {
   4298     if(coord == NULL) {
   4299         ALOGE("%s: error, invalid argument coord == NULL", __func__);
   4300         return;
   4301     }
   4302     float degF = fabs(atof(latlonString));
   4303     float minF = (degF- (int) degF) * 60;
   4304     float secF = (minF - (int) minF) * 60;
   4305 
   4306     coord[0] = getRational((int) degF, 1);
   4307     coord[1] = getRational((int) minF, 1);
   4308     coord[2] = getRational((int) (secF * 10000), 10000);
   4309 }
   4310 
   4311 bool QCameraHardwareInterface::isLowPowerCamcorder() {
   4312 
   4313     if (mPowerMode == LOW_POWER)
   4314         return true;
   4315 
   4316     if(mHFRLevel > 1) /* hard code the value now. Need to move tgtcommon to camear.h */
   4317         return true;
   4318 
   4319     return false;
   4320 }
   4321 
   4322 status_t QCameraHardwareInterface::setNoDisplayMode(const QCameraParameters& params)
   4323 {
   4324     char prop[PROPERTY_VALUE_MAX];
   4325     memset(prop, 0, sizeof(prop));
   4326     property_get("persist.camera.nodisplay", prop, "0");
   4327     int prop_val = atoi(prop);
   4328 
   4329     if (prop_val == 0) {
   4330         const char *str_val  = params.get("no-display-mode");
   4331         if(str_val && strlen(str_val) > 0) {
   4332             mNoDisplayMode = atoi(str_val);
   4333         } else {
   4334             mNoDisplayMode = 0;
   4335         }
   4336         ALOGV("Param mNoDisplayMode =%d", mNoDisplayMode);
   4337     } else {
   4338         mNoDisplayMode = prop_val;
   4339         ALOGV("prop mNoDisplayMode =%d", mNoDisplayMode);
   4340     }
   4341     return NO_ERROR;
   4342 }
   4343 
   4344 status_t QCameraHardwareInterface::setCAFLockCancel(void)
   4345 {
   4346     ALOGV("%s : E", __func__);
   4347 
   4348     //for CAF unlock
   4349     if(MM_CAMERA_OK!=cam_ops_action(mCameraId,false,MM_CAMERA_OPS_FOCUS,NULL )) {
   4350         ALOGE("%s: AF command failed err:%d error %s",__func__, errno,strerror(errno));
   4351         return -1;
   4352     }
   4353 
   4354     ALOGV("%s : X", __func__);
   4355     return NO_ERROR;
   4356 }
   4357 
   4358 void QCameraHardwareInterface::prepareVideoPicture(bool disable){
   4359     String8 str;
   4360     char buffer[32];
   4361 
   4362     if(disable) {
   4363         sprintf(buffer, "%dx%d", mDimension.video_width, mDimension.video_height);
   4364         str.append(buffer);
   4365 
   4366         mParameters.setPictureSize(mDimension.video_width, mDimension.video_height);
   4367         mParameters.set(QCameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
   4368                 str.string());
   4369         ALOGV("%s: Video Picture size supported = %d X %d",
   4370                 __func__,mDimension.video_width,mDimension.video_height);
   4371     }else{
   4372         //Set Picture Size
   4373         mParameters.setPictureSize(mDimension.picture_width, mDimension.picture_height);
   4374         mParameters.set(QCameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
   4375                 mPictureSizeValues.string());
   4376     }
   4377 }
   4378 
   4379 }; /*namespace android */
   4380