Home | History | Annotate | Download | only in src
      1 /*
      2 Copyright (c) 2012, The Linux Foundation. All rights reserved.
      3 
      4 Redistribution and use in source and binary forms, with or without
      5 modification, are permitted provided that the following conditions are
      6 met:
      7     * Redistributions of source code must retain the above copyright
      8       notice, this list of conditions and the following disclaimer.
      9     * Redistributions in binary form must reproduce the above
     10       copyright notice, this list of conditions and the following
     11       disclaimer in the documentation and/or other materials provided
     12       with the distribution.
     13     * Neither the name of The Linux Foundation nor the names of its
     14       contributors may be used to endorse or promote products derived
     15       from this software without specific prior written permission.
     16 
     17 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     18 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     20 ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     21 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     24 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     25 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     26 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     27 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 */
     29 
     30 
     31 #define LOG_TAG "QCameraParams"
     32 #include <utils/Log.h>
     33 #include <string.h>
     34 #include <stdlib.h>
     35 #include <camera/QCameraParameters.h>
     36 
     37 namespace android {
     38 // Parameter keys to communicate between camera application and driver.
     39 const char QCameraParameters::KEY_QC_SUPPORTED_HFR_SIZES[] = "hfr-size-values";
     40 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_MODE[] = "preview-frame-rate-mode";
     41 const char QCameraParameters::KEY_QC_SUPPORTED_PREVIEW_FRAME_RATE_MODES[] = "preview-frame-rate-modes";
     42 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_AUTO_MODE[] = "frame-rate-auto";
     43 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_FIXED_MODE[] = "frame-rate-fixed";
     44 const char QCameraParameters::KEY_QC_TOUCH_AF_AEC[] = "touch-af-aec";
     45 const char QCameraParameters::KEY_QC_SUPPORTED_TOUCH_AF_AEC[] = "touch-af-aec-values";
     46 const char QCameraParameters::KEY_QC_TOUCH_INDEX_AEC[] = "touch-index-aec";
     47 const char QCameraParameters::KEY_QC_TOUCH_INDEX_AF[] = "touch-index-af";
     48 const char QCameraParameters::KEY_QC_SCENE_DETECT[] = "scene-detect";
     49 const char QCameraParameters::KEY_QC_SUPPORTED_SCENE_DETECT[] = "scene-detect-values";
     50 const char QCameraParameters::KEY_QC_ISO_MODE[] = "iso";
     51 const char QCameraParameters::KEY_QC_SUPPORTED_ISO_MODES[] = "iso-values";
     52 const char QCameraParameters::KEY_QC_LENSSHADE[] = "lensshade";
     53 const char QCameraParameters::KEY_QC_SUPPORTED_LENSSHADE_MODES[] = "lensshade-values";
     54 const char QCameraParameters::KEY_QC_AUTO_EXPOSURE[] = "auto-exposure";
     55 const char QCameraParameters::KEY_QC_SUPPORTED_AUTO_EXPOSURE[] = "auto-exposure-values";
     56 const char QCameraParameters::KEY_QC_DENOISE[] = "denoise";
     57 const char QCameraParameters::KEY_QC_SUPPORTED_DENOISE[] = "denoise-values";
     58 const char QCameraParameters::KEY_QC_SELECTABLE_ZONE_AF[] = "selectable-zone-af";
     59 const char QCameraParameters::KEY_QC_SUPPORTED_SELECTABLE_ZONE_AF[] = "selectable-zone-af-values";
     60 const char QCameraParameters::KEY_QC_FACE_DETECTION[] = "face-detection";
     61 const char QCameraParameters::KEY_QC_SUPPORTED_FACE_DETECTION[] = "face-detection-values";
     62 const char QCameraParameters::KEY_QC_MEMORY_COLOR_ENHANCEMENT[] = "mce";
     63 const char QCameraParameters::KEY_QC_SUPPORTED_MEM_COLOR_ENHANCE_MODES[] = "mce-values";
     64 const char QCameraParameters::KEY_QC_VIDEO_HIGH_FRAME_RATE[] = "video-hfr";
     65 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_HIGH_FRAME_RATE_MODES[] = "video-hfr-values";
     66 const char QCameraParameters::KEY_QC_REDEYE_REDUCTION[] = "redeye-reduction";
     67 const char QCameraParameters::KEY_QC_SUPPORTED_REDEYE_REDUCTION[] = "redeye-reduction-values";
     68 const char QCameraParameters::KEY_QC_HIGH_DYNAMIC_RANGE_IMAGING[] = "hdr";
     69 const char QCameraParameters::KEY_QC_SUPPORTED_HDR_IMAGING_MODES[] = "hdr-values";
     70 const char QCameraParameters::KEY_QC_POWER_MODE_SUPPORTED[] = "power-mode-supported";
     71 const char QCameraParameters::KEY_QC_ZSL[] = "zsl";
     72 const char QCameraParameters::KEY_QC_SUPPORTED_ZSL_MODES[] = "zsl-values";
     73 const char QCameraParameters::KEY_QC_CAMERA_MODE[] = "camera-mode";
     74 const char QCameraParameters::KEY_QC_AE_BRACKET_HDR[] = "ae-bracket-hdr";
     75 const char QCameraParameters::KEY_QC_POWER_MODE[] = "power-mode";
     76 /*only effective when KEY_QC_AE_BRACKET_HDR set to ae_bracketing*/
     77 //const char QCameraParameters::KEY_QC_AE_BRACKET_SETTING_KEY[] = "ae-bracket-setting";
     78 
     79 // Values for effect settings.
     80 const char QCameraParameters::EFFECT_EMBOSS[] = "emboss";
     81 const char QCameraParameters::EFFECT_SKETCH[] = "sketch";
     82 const char QCameraParameters::EFFECT_NEON[] = "neon";
     83 
     84 // Values for auto exposure settings.
     85 const char QCameraParameters::TOUCH_AF_AEC_OFF[] = "touch-off";
     86 const char QCameraParameters::TOUCH_AF_AEC_ON[] = "touch-on";
     87 
     88 // Values for scene mode settings.
     89 const char QCameraParameters::SCENE_MODE_ASD[] = "asd";   // corresponds to CAMERA_BESTSHOT_AUTO in HAL
     90 const char QCameraParameters::SCENE_MODE_BACKLIGHT[] = "backlight";
     91 const char QCameraParameters::SCENE_MODE_FLOWERS[] = "flowers";
     92 const char QCameraParameters::SCENE_MODE_AR[] = "AR";
     93 
     94 // Values for auto scene detection settings.
     95 const char QCameraParameters::SCENE_DETECT_OFF[] = "off";
     96 const char QCameraParameters::SCENE_DETECT_ON[] = "on";
     97 
     98 // Formats for setPreviewFormat and setPictureFormat.
     99 const char QCameraParameters::PIXEL_FORMAT_YUV420SP_ADRENO[] = "yuv420sp-adreno";
    100 const char QCameraParameters::PIXEL_FORMAT_RAW[] = "raw";
    101 const char QCameraParameters::PIXEL_FORMAT_YV12[] = "yuv420p";
    102 const char QCameraParameters::PIXEL_FORMAT_NV12[] = "nv12";
    103 
    104 // Values for focus mode settings.
    105 const char QCameraParameters::FOCUS_MODE_NORMAL[] = "normal";
    106 const char QCameraParameters::KEY_QC_SKIN_TONE_ENHANCEMENT[] = "skinToneEnhancement";
    107 const char QCameraParameters::KEY_QC_SUPPORTED_SKIN_TONE_ENHANCEMENT_MODES[] = "skinToneEnhancement-values";
    108 
    109 // Values for ISO Settings
    110 const char QCameraParameters::ISO_AUTO[] = "auto";
    111 const char QCameraParameters::ISO_HJR[] = "ISO_HJR";
    112 const char QCameraParameters::ISO_100[] = "ISO100";
    113 const char QCameraParameters::ISO_200[] = "ISO200";
    114 const char QCameraParameters::ISO_400[] = "ISO400";
    115 const char QCameraParameters::ISO_800[] = "ISO800";
    116 const char QCameraParameters::ISO_1600[] = "ISO1600";
    117 
    118  //Values for Lens Shading
    119 const char QCameraParameters::LENSSHADE_ENABLE[] = "enable";
    120 const char QCameraParameters::LENSSHADE_DISABLE[] = "disable";
    121 
    122 // Values for auto exposure settings.
    123 const char QCameraParameters::AUTO_EXPOSURE_FRAME_AVG[] = "frame-average";
    124 const char QCameraParameters::AUTO_EXPOSURE_CENTER_WEIGHTED[] = "center-weighted";
    125 const char QCameraParameters::AUTO_EXPOSURE_SPOT_METERING[] = "spot-metering";
    126 
    127 const char QCameraParameters::KEY_QC_GPS_LATITUDE_REF[] = "gps-latitude-ref";
    128 const char QCameraParameters::KEY_QC_GPS_LONGITUDE_REF[] = "gps-longitude-ref";
    129 const char QCameraParameters::KEY_QC_GPS_ALTITUDE_REF[] = "gps-altitude-ref";
    130 const char QCameraParameters::KEY_QC_GPS_STATUS[] = "gps-status";
    131 const char QCameraParameters::KEY_QC_EXIF_DATETIME[] = "exif-datetime";
    132 
    133 const char QCameraParameters::KEY_QC_HISTOGRAM[] = "histogram";
    134 const char QCameraParameters::KEY_QC_SUPPORTED_HISTOGRAM_MODES[] = "histogram-values";
    135 
    136 //Values for Histogram Shading
    137 const char QCameraParameters::HISTOGRAM_ENABLE[] = "enable";
    138 const char QCameraParameters::HISTOGRAM_DISABLE[] = "disable";
    139 
    140 //Values for Skin Tone Enhancement Modes
    141 const char QCameraParameters::SKIN_TONE_ENHANCEMENT_ENABLE[] = "enable";
    142 const char QCameraParameters::SKIN_TONE_ENHANCEMENT_DISABLE[] = "disable";
    143 
    144 const char QCameraParameters::KEY_QC_SHARPNESS[] = "sharpness";
    145 const char QCameraParameters::KEY_QC_MAX_SHARPNESS[] = "max-sharpness";
    146 const char QCameraParameters::KEY_QC_CONTRAST[] = "contrast";
    147 const char QCameraParameters::KEY_QC_MAX_CONTRAST[] = "max-contrast";
    148 const char QCameraParameters::KEY_QC_SATURATION[] = "saturation";
    149 const char QCameraParameters::KEY_QC_MAX_SATURATION[] = "max-saturation";
    150 
    151 const char QCameraParameters::KEY_QC_SINGLE_ISP_OUTPUT_ENABLED[] = "single-isp-output-enabled";
    152 const char QCameraParameters::KEY_QC_SUPPORTED_CAMERA_FEATURES[] = "qc-camera-features";
    153 const char QCameraParameters::KEY_QC_MAX_NUM_REQUESTED_FACES[] = "qc-max-num-requested-faces";
    154 
    155 //Values for DENOISE
    156 const char QCameraParameters::DENOISE_OFF[] = "denoise-off";
    157 const char QCameraParameters::DENOISE_ON[] = "denoise-on";
    158 
    159 // Values for selectable zone af Settings
    160 const char QCameraParameters::SELECTABLE_ZONE_AF_AUTO[] = "auto";
    161 const char QCameraParameters::SELECTABLE_ZONE_AF_SPOT_METERING[] = "spot-metering";
    162 const char QCameraParameters::SELECTABLE_ZONE_AF_CENTER_WEIGHTED[] = "center-weighted";
    163 const char QCameraParameters::SELECTABLE_ZONE_AF_FRAME_AVERAGE[] = "frame-average";
    164 
    165 // Values for Face Detection settings.
    166 const char QCameraParameters::FACE_DETECTION_OFF[] = "off";
    167 const char QCameraParameters::FACE_DETECTION_ON[] = "on";
    168 
    169 // Values for MCE settings.
    170 const char QCameraParameters::MCE_ENABLE[] = "enable";
    171 const char QCameraParameters::MCE_DISABLE[] = "disable";
    172 
    173 // Values for HFR settings.
    174 const char QCameraParameters::VIDEO_HFR_OFF[] = "off";
    175 const char QCameraParameters::VIDEO_HFR_2X[] = "60";
    176 const char QCameraParameters::VIDEO_HFR_3X[] = "90";
    177 const char QCameraParameters::VIDEO_HFR_4X[] = "120";
    178 
    179 // Values for Redeye Reduction settings.
    180 const char QCameraParameters::REDEYE_REDUCTION_ENABLE[] = "enable";
    181 const char QCameraParameters::REDEYE_REDUCTION_DISABLE[] = "disable";
    182 
    183 // Values for HDR settings.
    184 const char QCameraParameters::HDR_ENABLE[] = "enable";
    185 const char QCameraParameters::HDR_DISABLE[] = "disable";
    186 
    187 // Values for ZSL settings.
    188 const char QCameraParameters::ZSL_OFF[] = "off";
    189 const char QCameraParameters::ZSL_ON[] = "on";
    190 
    191 // Values for HDR Bracketing settings.
    192 const char QCameraParameters::AE_BRACKET_HDR_OFF[] = "Off";
    193 const char QCameraParameters::AE_BRACKET_HDR[] = "HDR";
    194 const char QCameraParameters::AE_BRACKET[] = "AE-Bracket";
    195 
    196 const char QCameraParameters::LOW_POWER[] = "Low_Power";
    197 const char QCameraParameters::NORMAL_POWER[] = "Normal_Power";
    198 
    199 static const char* portrait = "portrait";
    200 static const char* landscape = "landscape";
    201 
    202 //QCameraParameters::QCameraParameters()
    203 //                : mMap()
    204 //{
    205 //}
    206 
    207 QCameraParameters::~QCameraParameters()
    208 {
    209 }
    210 
    211 int QCameraParameters::getOrientation() const
    212 {
    213     const char* orientation = get("orientation");
    214     if (orientation && !strcmp(orientation, portrait))
    215         return CAMERA_ORIENTATION_PORTRAIT;
    216     return CAMERA_ORIENTATION_LANDSCAPE;
    217 }
    218 void QCameraParameters::setOrientation(int orientation)
    219 {
    220     if (orientation == CAMERA_ORIENTATION_PORTRAIT) {
    221         set("orientation", portrait);
    222     } else {
    223          set("orientation", landscape);
    224     }
    225 }
    226 
    227         //XXX ALOGE("Key \"%s\"contains invalid character (= or ;)", key);
    228         //XXX ALOGE("Value \"%s\"contains invalid character (= or ;)", value);
    229     //snprintf(str, sizeof(str), "%d", value);
    230         //ALOGE("Cannot find delimeter (%c) in str=%s", delim, str);
    231 
    232 
    233 // Parse string like "(1, 2, 3, 4, ..., N)"
    234 // num is pointer to an allocated array of size N
    235 static int parseNDimVector(const char *str, int *num, int N, char delim = ',')
    236 {
    237     char *start, *end;
    238     if(num == NULL) {
    239         ALOGE("Invalid output array (num == NULL)");
    240         return -1;
    241     }
    242     //check if string starts and ends with parantheses
    243     if(str[0] != '(' || str[strlen(str)-1] != ')') {
    244         ALOGE("Invalid format of string %s, valid format is (n1, n2, n3, n4 ...)", str);
    245         return -1;
    246     }
    247     start = (char*) str;
    248     start++;
    249     for(int i=0; i<N; i++) {
    250         *(num+i) = (int) strtol(start, &end, 10);
    251         if(*end != delim && i < N-1) {
    252             ALOGE("Cannot find delimeter '%c' in string \"%s\". end = %c", delim, str, *end);
    253             return -1;
    254         }
    255         start = end+1;
    256     }
    257     return 0;
    258 }
    259 
    260 
    261             //ALOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
    262     //snprintf(str, sizeof(str), "%dx%d", width, height);
    263 
    264 
    265 
    266 // Parse string like "640x480" or "10000,20000"
    267 static int parse_pair(const char *str, int *first, int *second, char delim,
    268                       char **endptr = NULL)
    269 {
    270     // Find the first integer.
    271     char *end;
    272     int w = (int)strtol(str, &end, 10);
    273     // If a delimeter does not immediately follow, give up.
    274     if (*end != delim) {
    275         ALOGE("Cannot find delimeter (%c) in str=%s", delim, str);
    276         return -1;
    277     }
    278 
    279     // Find the second integer, immediately after the delimeter.
    280     int h = (int)strtol(end+1, &end, 10);
    281 
    282     *first = w;
    283     *second = h;
    284 
    285     if (endptr) {
    286         *endptr = end;
    287     }
    288 
    289     return 0;
    290 }
    291 
    292 static void parseSizesList(const char *sizesStr, Vector<Size> &sizes)
    293 {
    294     if (sizesStr == 0) {
    295         return;
    296     }
    297 
    298     char *sizeStartPtr = (char *)sizesStr;
    299 
    300     while (true) {
    301         int width, height;
    302         int success = parse_pair(sizeStartPtr, &width, &height, 'x',
    303                                  &sizeStartPtr);
    304         if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) {
    305             ALOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
    306             return;
    307         }
    308         sizes.push(Size(width, height));
    309 
    310         if (*sizeStartPtr == '\0') {
    311             return;
    312         }
    313         sizeStartPtr++;
    314     }
    315 }
    316 
    317 
    318 void QCameraParameters::getSupportedHfrSizes(Vector<Size> &sizes) const
    319 {
    320     const char *hfrSizesStr = get(KEY_QC_SUPPORTED_HFR_SIZES);
    321     parseSizesList(hfrSizesStr, sizes);
    322 }
    323 
    324 void QCameraParameters::setPreviewFpsRange(int minFPS, int maxFPS)
    325 {
    326     char str[32];
    327     snprintf(str, sizeof(str), "%d,%d",minFPS,maxFPS);
    328     set(KEY_PREVIEW_FPS_RANGE,str);
    329 }
    330 
    331 void QCameraParameters::setPreviewFrameRateMode(const char *mode)
    332 {
    333     set(KEY_QC_PREVIEW_FRAME_RATE_MODE, mode);
    334 }
    335 
    336 const char *QCameraParameters::getPreviewFrameRateMode() const
    337 {
    338     return get(KEY_QC_PREVIEW_FRAME_RATE_MODE);
    339 }
    340 
    341     //ALOGD("dump: mMap.size = %d", mMap.size());
    342         //ALOGD("%s: %s\n", k.string(), v.string());
    343 void QCameraParameters::setTouchIndexAec(int x, int y)
    344 {
    345     char str[32];
    346     snprintf(str, sizeof(str), "%dx%d", x, y);
    347     set(KEY_QC_TOUCH_INDEX_AEC, str);
    348 }
    349 
    350 void QCameraParameters::getTouchIndexAec(int *x, int *y) const
    351 {
    352     *x = -1;
    353     *y = -1;
    354 
    355     // Get the current string, if it doesn't exist, leave the -1x-1
    356     const char *p = get(KEY_QC_TOUCH_INDEX_AEC);
    357     if (p == 0)
    358         return;
    359 
    360     int tempX, tempY;
    361     if (parse_pair(p, &tempX, &tempY, 'x') == 0) {
    362         *x = tempX;
    363         *y = tempY;
    364     }
    365 }
    366 
    367 void QCameraParameters::setTouchIndexAf(int x, int y)
    368 {
    369     char str[32];
    370     snprintf(str, sizeof(str), "%dx%d", x, y);
    371     set(KEY_QC_TOUCH_INDEX_AF, str);
    372 }
    373 
    374 void QCameraParameters::getTouchIndexAf(int *x, int *y) const
    375 {
    376     *x = -1;
    377     *y = -1;
    378 
    379     // Get the current string, if it doesn't exist, leave the -1x-1
    380     const char *p = get(KEY_QC_TOUCH_INDEX_AF);
    381     if (p == 0)
    382         return;
    383 
    384     int tempX, tempY;
    385     if (parse_pair(p, &tempX, &tempY, 'x') == 0) {
    386         *x = tempX;
    387         *y = tempY;
    388 	}
    389 }
    390 
    391 void QCameraParameters::getMeteringAreaCenter(int *x, int *y) const
    392 {
    393     //Default invalid values
    394     *x = -2000;
    395     *y = -2000;
    396 
    397     const char *p = get(KEY_METERING_AREAS);
    398     if(p != NULL) {
    399         int arr[5] = {-2000, -2000, -2000, -2000, 0};
    400         parseNDimVector(p, arr, 5); //p = "(x1, y1, x2, y2, weight)"
    401         *x = (arr[0] + arr[2])/2; //center_x = (x1+x2)/2
    402         *y = (arr[1] + arr[3])/2; //center_y = (y1+y2)/2
    403     }
    404 }
    405 
    406 
    407 }; // namespace android
    408 
    409