Home | History | Annotate | Download | only in HAL
      1 /* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
      2  *
      3  * Redistribution and use in source and binary forms, with or without
      4  * modification, are permitted provided that the following conditions are
      5  * met:
      6  *     * Redistributions of source code must retain the above copyright
      7  *       notice, this list of conditions and the following disclaimer.
      8  *     * Redistributions in binary form must reproduce the above
      9  *       copyright notice, this list of conditions and the following
     10  *       disclaimer in the documentation and/or other materials provided
     11  *       with the distribution.
     12  *     * Neither the name of The Linux Foundation nor the names of its
     13  *       contributors may be used to endorse or promote products derived
     14  *       from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  *
     28  */
     29 
     30 #define LOG_TAG "QCameraParameters"
     31 
     32 #include <cutils/properties.h>
     33 #include <math.h>
     34 #include <utils/Errors.h>
     35 #include <string.h>
     36 #include <stdlib.h>
     37 #include <gralloc_priv.h>
     38 #include "QCamera2HWI.h"
     39 #include "QCameraParameters.h"
     40 
     41 #define ASPECT_TOLERANCE 0.001
     42 #define FLIP_V_H (FLIP_H | FLIP_V)
     43 
     44 namespace qcamera {
     45 // Parameter keys to communicate between camera application and driver.
     46 const char QCameraParameters::KEY_QC_SUPPORTED_HFR_SIZES[] = "hfr-size-values";
     47 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_MODE[] = "preview-frame-rate-mode";
     48 const char QCameraParameters::KEY_QC_SUPPORTED_PREVIEW_FRAME_RATE_MODES[] = "preview-frame-rate-modes";
     49 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_AUTO_MODE[] = "frame-rate-auto";
     50 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_FIXED_MODE[] = "frame-rate-fixed";
     51 const char QCameraParameters::KEY_QC_TOUCH_AF_AEC[] = "touch-af-aec";
     52 const char QCameraParameters::KEY_QC_SUPPORTED_TOUCH_AF_AEC[] = "touch-af-aec-values";
     53 const char QCameraParameters::KEY_QC_TOUCH_INDEX_AEC[] = "touch-index-aec";
     54 const char QCameraParameters::KEY_QC_TOUCH_INDEX_AF[] = "touch-index-af";
     55 const char QCameraParameters::KEY_QC_SCENE_DETECT[] = "scene-detect";
     56 const char QCameraParameters::KEY_QC_SUPPORTED_SCENE_DETECT[] = "scene-detect-values";
     57 const char QCameraParameters::KEY_QC_ISO_MODE[] = "iso";
     58 const char QCameraParameters::KEY_QC_SUPPORTED_ISO_MODES[] = "iso-values";
     59 const char QCameraParameters::KEY_QC_LENSSHADE[] = "lensshade";
     60 const char QCameraParameters::KEY_QC_SUPPORTED_LENSSHADE_MODES[] = "lensshade-values";
     61 const char QCameraParameters::KEY_QC_AUTO_EXPOSURE[] = "auto-exposure";
     62 const char QCameraParameters::KEY_QC_SUPPORTED_AUTO_EXPOSURE[] = "auto-exposure-values";
     63 const char QCameraParameters::KEY_QC_DENOISE[] = "denoise";
     64 const char QCameraParameters::KEY_QC_SUPPORTED_DENOISE[] = "denoise-values";
     65 const char QCameraParameters::KEY_QC_FOCUS_ALGO[] = "selectable-zone-af";
     66 const char QCameraParameters::KEY_QC_SUPPORTED_FOCUS_ALGOS[] = "selectable-zone-af-values";
     67 const char QCameraParameters::KEY_QC_FACE_DETECTION[] = "face-detection";
     68 const char QCameraParameters::KEY_QC_SUPPORTED_FACE_DETECTION[] = "face-detection-values";
     69 const char QCameraParameters::KEY_QC_FACE_RECOGNITION[] = "face-recognition";
     70 const char QCameraParameters::KEY_QC_SUPPORTED_FACE_RECOGNITION[] = "face-recognition-values";
     71 const char QCameraParameters::KEY_QC_MEMORY_COLOR_ENHANCEMENT[] = "mce";
     72 const char QCameraParameters::KEY_QC_SUPPORTED_MEM_COLOR_ENHANCE_MODES[] = "mce-values";
     73 const char QCameraParameters::KEY_QC_DIS[] = "dis";
     74 const char QCameraParameters::KEY_QC_SUPPORTED_DIS_MODES[] = "dis-values";
     75 const char QCameraParameters::KEY_QC_VIDEO_HIGH_FRAME_RATE[] = "video-hfr";
     76 const char QCameraParameters::KEY_QC_VIDEO_HIGH_SPEED_RECORDING[] = "video-hsr";
     77 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_HIGH_FRAME_RATE_MODES[] = "video-hfr-values";
     78 const char QCameraParameters::KEY_QC_REDEYE_REDUCTION[] = "redeye-reduction";
     79 const char QCameraParameters::KEY_QC_SUPPORTED_REDEYE_REDUCTION[] = "redeye-reduction-values";
     80 const char QCameraParameters::KEY_QC_HIGH_DYNAMIC_RANGE_IMAGING[] = "hdr";
     81 const char QCameraParameters::KEY_QC_SUPPORTED_HDR_IMAGING_MODES[] = "hdr-values";
     82 const char QCameraParameters::KEY_QC_ZSL[] = "zsl";
     83 const char QCameraParameters::KEY_QC_SUPPORTED_ZSL_MODES[] = "zsl-values";
     84 const char QCameraParameters::KEY_QC_ZSL_BURST_INTERVAL[] = "capture-burst-interval";
     85 const char QCameraParameters::KEY_QC_ZSL_BURST_LOOKBACK[] = "capture-burst-retroactive";
     86 const char QCameraParameters::KEY_QC_ZSL_QUEUE_DEPTH[] = "capture-burst-queue-depth";
     87 const char QCameraParameters::KEY_QC_CAMERA_MODE[] = "camera-mode";
     88 const char QCameraParameters::KEY_QC_AE_BRACKET_HDR[] = "ae-bracket-hdr";
     89 const char QCameraParameters::KEY_QC_SUPPORTED_AE_BRACKET_MODES[] = "ae-bracket-hdr-values";
     90 const char QCameraParameters::KEY_QC_SUPPORTED_RAW_FORMATS[] = "raw-format-values";
     91 const char QCameraParameters::KEY_QC_RAW_FORMAT[] = "raw-format";
     92 const char QCameraParameters::KEY_QC_ORIENTATION[] = "orientation";
     93 const char QCameraParameters::KEY_QC_SELECTABLE_ZONE_AF[] = "selectable-zone-af";
     94 const char QCameraParameters::KEY_QC_CAPTURE_BURST_EXPOSURE[] = "capture-burst-exposures";
     95 const char QCameraParameters::KEY_QC_NUM_SNAPSHOT_PER_SHUTTER[] = "num-snaps-per-shutter";
     96 const char QCameraParameters::KEY_QC_NUM_RETRO_BURST_PER_SHUTTER[] = "num-retro-burst-per-shutter";
     97 const char QCameraParameters::KEY_QC_SNAPSHOT_BURST_LED_ON_PERIOD[] = "zsl-burst-led-on-period";
     98 const char QCameraParameters::KEY_QC_NO_DISPLAY_MODE[] = "no-display-mode";
     99 const char QCameraParameters::KEY_QC_RAW_PICUTRE_SIZE[] = "raw-size";
    100 const char QCameraParameters::KEY_QC_SUPPORTED_SKIN_TONE_ENHANCEMENT_MODES[] = "skinToneEnhancement-values";
    101 const char QCameraParameters::KEY_QC_SUPPORTED_LIVESNAPSHOT_SIZES[] = "supported-live-snapshot-sizes";
    102 const char QCameraParameters::KEY_QC_HDR_NEED_1X[] = "hdr-need-1x";
    103 const char QCameraParameters::KEY_QC_PREVIEW_FLIP[] = "preview-flip";
    104 const char QCameraParameters::KEY_QC_VIDEO_FLIP[] = "video-flip";
    105 const char QCameraParameters::KEY_QC_SNAPSHOT_PICTURE_FLIP[] = "snapshot-picture-flip";
    106 const char QCameraParameters::KEY_QC_SUPPORTED_FLIP_MODES[] = "flip-mode-values";
    107 const char QCameraParameters::KEY_QC_VIDEO_HDR[] = "video-hdr";
    108 const char QCameraParameters::KEY_QC_SENSOR_HDR[] = "sensor-hdr";
    109 const char QCameraParameters::KEY_QC_VT_ENABLE[] = "avtimer";
    110 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_HDR_MODES[] = "video-hdr-values";
    111 const char QCameraParameters::KEY_QC_SUPPORTED_SENSOR_HDR_MODES[] = "sensor-hdr-values";
    112 const char QCameraParameters::KEY_QC_AUTO_HDR_ENABLE [] = "auto-hdr-enable";
    113 const char QCameraParameters::KEY_QC_SNAPSHOT_BURST_NUM[] = "snapshot-burst-num";
    114 const char QCameraParameters::KEY_QC_SNAPSHOT_FD_DATA[] = "snapshot-fd-data-enable";
    115 const char QCameraParameters::KEY_QC_TINTLESS_ENABLE[] = "tintless";
    116 const char QCameraParameters::KEY_QC_SCENE_SELECTION[] = "scene-selection";
    117 const char QCameraParameters::KEY_QC_CDS_MODE[] = "cds-mode";
    118 const char QCameraParameters::KEY_QC_VIDEO_ROTATION[] = "video-rotation";
    119 const char QCameraParameters::KEY_QC_AF_BRACKET[] = "af-bracket";
    120 const char QCameraParameters::KEY_QC_SUPPORTED_AF_BRACKET_MODES[] = "af-bracket-values";
    121 const char QCameraParameters::KEY_QC_RE_FOCUS[] = "re-focus";
    122 const char QCameraParameters::KEY_QC_SUPPORTED_RE_FOCUS_MODES[] = "re-focus-values";
    123 const char QCameraParameters::KEY_QC_CHROMA_FLASH[] = "chroma-flash";
    124 const char QCameraParameters::KEY_QC_SUPPORTED_CHROMA_FLASH_MODES[] = "chroma-flash-values";
    125 const char QCameraParameters::KEY_QC_OPTI_ZOOM[] = "opti-zoom";
    126 const char QCameraParameters::KEY_QC_SUPPORTED_OPTI_ZOOM_MODES[] = "opti-zoom-values";
    127 const char QCameraParameters::KEY_INTERNAL_PERVIEW_RESTART[] = "internal-restart";
    128 const char QCameraParameters::KEY_QC_RDI_MODE[] = "rdi-mode";
    129 const char QCameraParameters::KEY_QC_SUPPORTED_RDI_MODES[] = "rdi-mode-values";
    130 const char QCameraParameters::KEY_QC_SECURE_MODE[] = "secure-mode";
    131 const char QCameraParameters::KEY_QC_SUPPORTED_SECURE_MODES[] = "secure-mode-values";
    132 const char QCameraParameters::KEY_QC_AUTO_HDR_SUPPORTED[] = "auto-hdr-supported";
    133 
    134 // Values for effect settings.
    135 const char QCameraParameters::EFFECT_EMBOSS[] = "emboss";
    136 const char QCameraParameters::EFFECT_SKETCH[] = "sketch";
    137 const char QCameraParameters::EFFECT_NEON[] = "neon";
    138 
    139 // Values for auto exposure settings.
    140 const char QCameraParameters::TOUCH_AF_AEC_OFF[] = "touch-off";
    141 const char QCameraParameters::TOUCH_AF_AEC_ON[] = "touch-on";
    142 
    143 // Values for scene mode settings.
    144 const char QCameraParameters::SCENE_MODE_ASD[] = "asd";   // corresponds to CAMERA_BESTSHOT_AUTO in HAL
    145 const char QCameraParameters::SCENE_MODE_BACKLIGHT[] = "backlight";
    146 const char QCameraParameters::SCENE_MODE_FLOWERS[] = "flowers";
    147 const char QCameraParameters::SCENE_MODE_AR[] = "AR";
    148 const char QCameraParameters::SCENE_MODE_HDR[] = "hdr";
    149 
    150 // Formats for setPreviewFormat and setPictureFormat.
    151 const char QCameraParameters::PIXEL_FORMAT_YUV420SP_ADRENO[] = "yuv420sp-adreno";
    152 const char QCameraParameters::PIXEL_FORMAT_YV12[] = "yuv420p";
    153 const char QCameraParameters::PIXEL_FORMAT_NV12[] = "nv12";
    154 const char QCameraParameters::QC_PIXEL_FORMAT_NV12_VENUS[] = "nv12-venus";
    155 
    156 // Values for raw image formats
    157 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_YUYV[] = "yuv-raw8-yuyv";
    158 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_YVYU[] = "yuv-raw8-yvyu";
    159 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_UYVY[] = "yuv-raw8-uyvy";
    160 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_VYUY[] = "yuv-raw8-vyuy";
    161 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GBRG[] = "bayer-qcom-8gbrg";
    162 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GRBG[] = "bayer-qcom-8grbg";
    163 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8RGGB[] = "bayer-qcom-8rggb";
    164 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8BGGR[] = "bayer-qcom-8bggr";
    165 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GBRG[] = "bayer-qcom-10gbrg";
    166 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GRBG[] = "bayer-qcom-10grbg";
    167 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10RGGB[] = "bayer-qcom-10rggb";
    168 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10BGGR[] = "bayer-qcom-10bggr";
    169 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GBRG[] = "bayer-qcom-12gbrg";
    170 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GRBG[] = "bayer-qcom-12grbg";
    171 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12RGGB[] = "bayer-qcom-12rggb";
    172 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12BGGR[] = "bayer-qcom-12bggr";
    173 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GBRG[] = "bayer-mipi-8gbrg";
    174 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GRBG[] = "bayer-mipi-8grbg";
    175 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8RGGB[] = "bayer-mipi-8rggb";
    176 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8BGGR[] = "bayer-mipi-8bggr";
    177 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GBRG[] = "bayer-mipi-10gbrg";
    178 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GRBG[] = "bayer-mipi-10grbg";
    179 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10RGGB[] = "bayer-mipi-10rggb";
    180 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10BGGR[] = "bayer-mipi-10bggr";
    181 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GBRG[] = "bayer-mipi-12gbrg";
    182 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GRBG[] = "bayer-mipi-12grbg";
    183 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12RGGB[] = "bayer-mipi-12rggb";
    184 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12BGGR[] = "bayer-mipi-12bggr";
    185 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GBRG[] = "bayer-ideal-qcom-8gbrg";
    186 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GRBG[] = "bayer-ideal-qcom-8grbg";
    187 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8RGGB[] = "bayer-ideal-qcom-8rggb";
    188 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8BGGR[] = "bayer-ideal-qcom-8bggr";
    189 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GBRG[] = "bayer-ideal-qcom-10gbrg";
    190 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GRBG[] = "bayer-ideal-qcom-10grbg";
    191 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10RGGB[] = "bayer-ideal-qcom-10rggb";
    192 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10BGGR[] = "bayer-ideal-qcom-10bggr";
    193 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GBRG[] = "bayer-ideal-qcom-12gbrg";
    194 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GRBG[] = "bayer-ideal-qcom-12grbg";
    195 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12RGGB[] = "bayer-ideal-qcom-12rggb";
    196 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12BGGR[] = "bayer-ideal-qcom-12bggr";
    197 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GBRG[] = "bayer-ideal-mipi-8gbrg";
    198 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GRBG[] = "bayer-ideal-mipi-8grbg";
    199 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8RGGB[] = "bayer-ideal-mipi-8rggb";
    200 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8BGGR[] = "bayer-ideal-mipi-8bggr";
    201 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GBRG[] = "bayer-ideal-mipi-10gbrg";
    202 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GRBG[] = "bayer-ideal-mipi-10grbg";
    203 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10RGGB[] = "bayer-ideal-mipi-10rggb";
    204 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10BGGR[] = "bayer-ideal-mipi-10bggr";
    205 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GBRG[] = "bayer-ideal-mipi-12gbrg";
    206 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GRBG[] = "bayer-ideal-mipi-12grbg";
    207 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12RGGB[] = "bayer-ideal-mipi-12rggb";
    208 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12BGGR[] = "bayer-ideal-mipi-12bggr";
    209 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GBRG[] = "bayer-ideal-plain8-8gbrg";
    210 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GRBG[] = "bayer-ideal-plain8-8grbg";
    211 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8RGGB[] = "bayer-ideal-plain8-8rggb";
    212 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8BGGR[] = "bayer-ideal-plain8-8bggr";
    213 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GBRG[] = "bayer-ideal-plain16-8gbrg";
    214 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GRBG[] = "bayer-ideal-plain16-8grbg";
    215 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8RGGB[] = "bayer-ideal-plain16-8rggb";
    216 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8BGGR[] = "bayer-ideal-plain16-8bggr";
    217 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GBRG[] = "bayer-ideal-plain16-10gbrg";
    218 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GRBG[] = "bayer-ideal-plain16-10grbg";
    219 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10RGGB[] = "bayer-ideal-plain16-10rggb";
    220 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10BGGR[] = "bayer-ideal-plain16-10bggr";
    221 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GBRG[] = "bayer-ideal-plain16-12gbrg";
    222 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GRBG[] = "bayer-ideal-plain16-12grbg";
    223 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12RGGB[] = "bayer-ideal-plain16-12rggb";
    224 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12BGGR[] = "bayer-ideal-plain16-12bggr";
    225 
    226 // Values for ISO Settings
    227 const char QCameraParameters::ISO_AUTO[] = "auto";
    228 const char QCameraParameters::ISO_HJR[] = "ISO_HJR";
    229 const char QCameraParameters::ISO_100[] = "ISO100";
    230 const char QCameraParameters::ISO_200[] = "ISO200";
    231 const char QCameraParameters::ISO_400[] = "ISO400";
    232 const char QCameraParameters::ISO_800[] = "ISO800";
    233 const char QCameraParameters::ISO_1600[] = "ISO1600";
    234 
    235 // Values for auto exposure settings.
    236 const char QCameraParameters::AUTO_EXPOSURE_FRAME_AVG[] = "frame-average";
    237 const char QCameraParameters::AUTO_EXPOSURE_CENTER_WEIGHTED[] = "center-weighted";
    238 const char QCameraParameters::AUTO_EXPOSURE_SPOT_METERING[] = "spot-metering";
    239 const char QCameraParameters::AUTO_EXPOSURE_SMART_METERING[] = "smart-metering";
    240 const char QCameraParameters::AUTO_EXPOSURE_USER_METERING[] = "user-metering";
    241 const char QCameraParameters::AUTO_EXPOSURE_SPOT_METERING_ADV[] = "spot-metering-adv";
    242 const char QCameraParameters::AUTO_EXPOSURE_CENTER_WEIGHTED_ADV[] = "center-weighted-adv";
    243 
    244 const char QCameraParameters::KEY_QC_GPS_LATITUDE_REF[] = "gps-latitude-ref";
    245 const char QCameraParameters::KEY_QC_GPS_LONGITUDE_REF[] = "gps-longitude-ref";
    246 const char QCameraParameters::KEY_QC_GPS_ALTITUDE_REF[] = "gps-altitude-ref";
    247 const char QCameraParameters::KEY_QC_GPS_STATUS[] = "gps-status";
    248 
    249 const char QCameraParameters::KEY_QC_HISTOGRAM[] = "histogram";
    250 const char QCameraParameters::KEY_QC_SUPPORTED_HISTOGRAM_MODES[] = "histogram-values";
    251 
    252 const char QCameraParameters::VALUE_ENABLE[] = "enable";
    253 const char QCameraParameters::VALUE_DISABLE[] = "disable";
    254 const char QCameraParameters::VALUE_OFF[] = "off";
    255 const char QCameraParameters::VALUE_ON[] = "on";
    256 const char QCameraParameters::VALUE_TRUE[] = "true";
    257 const char QCameraParameters::VALUE_FALSE[] = "false";
    258 
    259 const char QCameraParameters::KEY_QC_SHARPNESS[] = "sharpness";
    260 const char QCameraParameters::KEY_QC_MIN_SHARPNESS[] = "min-sharpness";
    261 const char QCameraParameters::KEY_QC_MAX_SHARPNESS[] = "max-sharpness";
    262 const char QCameraParameters::KEY_QC_SHARPNESS_STEP[] = "sharpness-step";
    263 const char QCameraParameters::KEY_QC_CONTRAST[] = "contrast";
    264 const char QCameraParameters::KEY_QC_MIN_CONTRAST[] = "min-contrast";
    265 const char QCameraParameters::KEY_QC_MAX_CONTRAST[] = "max-contrast";
    266 const char QCameraParameters::KEY_QC_CONTRAST_STEP[] = "contrast-step";
    267 const char QCameraParameters::KEY_QC_SATURATION[] = "saturation";
    268 const char QCameraParameters::KEY_QC_MIN_SATURATION[] = "min-saturation";
    269 const char QCameraParameters::KEY_QC_MAX_SATURATION[] = "max-saturation";
    270 const char QCameraParameters::KEY_QC_SATURATION_STEP[] = "saturation-step";
    271 const char QCameraParameters::KEY_QC_BRIGHTNESS[] = "luma-adaptation";
    272 const char QCameraParameters::KEY_QC_MIN_BRIGHTNESS[] = "min-brightness";
    273 const char QCameraParameters::KEY_QC_MAX_BRIGHTNESS[] = "max-brightness";
    274 const char QCameraParameters::KEY_QC_BRIGHTNESS_STEP[] = "brightness-step";
    275 const char QCameraParameters::KEY_QC_SCE_FACTOR[] = "skinToneEnhancement";
    276 const char QCameraParameters::KEY_QC_MIN_SCE_FACTOR[] = "min-sce-factor";
    277 const char QCameraParameters::KEY_QC_MAX_SCE_FACTOR[] = "max-sce-factor";
    278 const char QCameraParameters::KEY_QC_SCE_FACTOR_STEP[] = "sce-factor-step";
    279 
    280 const char QCameraParameters::KEY_QC_SUPPORTED_CAMERA_FEATURES[] = "qc-camera-features";
    281 const char QCameraParameters::KEY_QC_MAX_NUM_REQUESTED_FACES[] = "qc-max-num-requested-faces";
    282 
    283 //Values for DENOISE
    284 const char QCameraParameters::DENOISE_OFF[] = "denoise-off";
    285 const char QCameraParameters::DENOISE_ON[] = "denoise-on";
    286 
    287 // Values for selectable zone af Settings
    288 const char QCameraParameters::FOCUS_ALGO_AUTO[] = "auto";
    289 const char QCameraParameters::FOCUS_ALGO_SPOT_METERING[] = "spot-metering";
    290 const char QCameraParameters::FOCUS_ALGO_CENTER_WEIGHTED[] = "center-weighted";
    291 const char QCameraParameters::FOCUS_ALGO_FRAME_AVERAGE[] = "frame-average";
    292 
    293 // Values for HFR settings.
    294 const char QCameraParameters::VIDEO_HFR_OFF[] = "off";
    295 const char QCameraParameters::VIDEO_HFR_2X[] = "60";
    296 const char QCameraParameters::VIDEO_HFR_3X[] = "90";
    297 const char QCameraParameters::VIDEO_HFR_4X[] = "120";
    298 const char QCameraParameters::VIDEO_HFR_5X[] = "150";
    299 
    300 // Values for HDR Bracketing settings.
    301 const char QCameraParameters::AE_BRACKET_OFF[] = "Off";
    302 const char QCameraParameters::AE_BRACKET[] = "AE-Bracket";
    303 
    304 // Values for AF Bracketing setting.
    305 const char QCameraParameters::AF_BRACKET_OFF[] = "af-bracket-off";
    306 const char QCameraParameters::AF_BRACKET_ON[] = "af-bracket-on";
    307 
    308 // Values for Refocus setting.
    309 const char QCameraParameters::RE_FOCUS_OFF[] = "re-focus-off";
    310 const char QCameraParameters::RE_FOCUS_ON[] = "re-focus-on";
    311 
    312 // Values for Chroma Flash setting.
    313 const char QCameraParameters::CHROMA_FLASH_OFF[] = "chroma-flash-off";
    314 const char QCameraParameters::CHROMA_FLASH_ON[] = "chroma-flash-on";
    315 
    316 // Values for Opti Zoom setting.
    317 const char QCameraParameters::OPTI_ZOOM_OFF[] = "opti-zoom-off";
    318 const char QCameraParameters::OPTI_ZOOM_ON[] = "opti-zoom-on";
    319 
    320 // Values for FLIP settings.
    321 const char QCameraParameters::FLIP_MODE_OFF[] = "off";
    322 const char QCameraParameters::FLIP_MODE_V[] = "flip-v";
    323 const char QCameraParameters::FLIP_MODE_H[] = "flip-h";
    324 const char QCameraParameters::FLIP_MODE_VH[] = "flip-vh";
    325 
    326 const char QCameraParameters::CDS_MODE_OFF[] = "off";
    327 const char QCameraParameters::CDS_MODE_ON[] = "on";
    328 const char QCameraParameters::CDS_MODE_AUTO[] = "auto";
    329 
    330 const char QCameraParameters::KEY_SELECTED_AUTO_SCENE[] = "selected-auto-scene";
    331 
    332 static const char* portrait = "portrait";
    333 static const char* landscape = "landscape";
    334 
    335 const cam_dimension_t QCameraParameters::THUMBNAIL_SIZES_MAP[] = {
    336     { 512, 288 }, //1.777778
    337     { 480, 288 }, //1.666667
    338     { 256, 154 }, //1.66233
    339     { 432, 288 }, //1.5
    340     { 320, 240 }, //1.33333
    341     { 176, 144 }, //1.222222
    342     { 0, 0 }      // required by Android SDK
    343 };
    344 
    345 const QCameraParameters::QCameraMap QCameraParameters::AUTO_EXPOSURE_MAP[] = {
    346     { AUTO_EXPOSURE_FRAME_AVG,           CAM_AEC_MODE_FRAME_AVERAGE },
    347     { AUTO_EXPOSURE_CENTER_WEIGHTED,     CAM_AEC_MODE_CENTER_WEIGHTED },
    348     { AUTO_EXPOSURE_SPOT_METERING,       CAM_AEC_MODE_SPOT_METERING },
    349     { AUTO_EXPOSURE_SMART_METERING,      CAM_AEC_MODE_SMART_METERING },
    350     { AUTO_EXPOSURE_USER_METERING,       CAM_AEC_MODE_USER_METERING },
    351     { AUTO_EXPOSURE_SPOT_METERING_ADV,   CAM_AEC_MODE_SPOT_METERING_ADV },
    352     { AUTO_EXPOSURE_CENTER_WEIGHTED_ADV, CAM_AEC_MODE_CENTER_WEIGHTED_ADV },
    353 };
    354 
    355 const QCameraParameters::QCameraMap QCameraParameters::PREVIEW_FORMATS_MAP[] = {
    356     {PIXEL_FORMAT_YUV420SP,        CAM_FORMAT_YUV_420_NV21},
    357     {PIXEL_FORMAT_YUV420P,         CAM_FORMAT_YUV_420_YV12},
    358     {PIXEL_FORMAT_YUV420SP_ADRENO, CAM_FORMAT_YUV_420_NV21_ADRENO},
    359     {PIXEL_FORMAT_YV12,            CAM_FORMAT_YUV_420_YV12},
    360     {PIXEL_FORMAT_NV12,            CAM_FORMAT_YUV_420_NV12},
    361     {QC_PIXEL_FORMAT_NV12_VENUS,   CAM_FORMAT_YUV_420_NV12_VENUS}
    362 };
    363 
    364 const QCameraParameters::QCameraMap QCameraParameters::PICTURE_TYPES_MAP[] = {
    365     {PIXEL_FORMAT_JPEG,                          CAM_FORMAT_JPEG},
    366     {PIXEL_FORMAT_YUV420SP,                      CAM_FORMAT_YUV_420_NV21},
    367     {PIXEL_FORMAT_YUV422SP,                      CAM_FORMAT_YUV_422_NV16},
    368     {QC_PIXEL_FORMAT_YUV_RAW_8BIT_YUYV,          CAM_FORMAT_YUV_RAW_8BIT_YUYV},
    369     {QC_PIXEL_FORMAT_YUV_RAW_8BIT_YVYU,          CAM_FORMAT_YUV_RAW_8BIT_YVYU},
    370     {QC_PIXEL_FORMAT_YUV_RAW_8BIT_UYVY,          CAM_FORMAT_YUV_RAW_8BIT_UYVY},
    371     {QC_PIXEL_FORMAT_YUV_RAW_8BIT_VYUY,          CAM_FORMAT_YUV_RAW_8BIT_VYUY},
    372     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GBRG,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_GBRG},
    373     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GRBG,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_GRBG},
    374     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8RGGB,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_RGGB},
    375     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8BGGR,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_BGGR},
    376     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GBRG,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GBRG},
    377     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GRBG,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GRBG},
    378     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10RGGB,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_RGGB},
    379     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10BGGR,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_BGGR},
    380     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GBRG,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_GBRG},
    381     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GRBG,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_GRBG},
    382     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12RGGB,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_RGGB},
    383     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12BGGR,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_BGGR},
    384     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GBRG,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_GBRG},
    385     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GRBG,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_GRBG},
    386     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8RGGB,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_RGGB},
    387     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8BGGR,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_BGGR},
    388     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GBRG,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG},
    389     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GRBG,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GRBG},
    390     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10RGGB,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_RGGB},
    391     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10BGGR,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_BGGR},
    392     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GBRG,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_GBRG},
    393     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GRBG,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_GRBG},
    394     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12RGGB,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_RGGB},
    395     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12BGGR,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_BGGR},
    396     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GBRG,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_GBRG},
    397     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GRBG,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_GRBG},
    398     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8RGGB,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_RGGB},
    399     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8BGGR,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_BGGR},
    400     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_GBRG},
    401     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_GRBG},
    402     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_RGGB},
    403     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_BGGR},
    404     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_GBRG},
    405     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_GRBG},
    406     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_RGGB},
    407     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_BGGR},
    408     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GBRG,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_GBRG},
    409     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GRBG,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_GRBG},
    410     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8RGGB,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_RGGB},
    411     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8BGGR,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_BGGR},
    412     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_GBRG},
    413     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_GRBG},
    414     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_RGGB},
    415     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_BGGR},
    416     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_GBRG},
    417     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_GRBG},
    418     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_RGGB},
    419     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_BGGR},
    420     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GBRG,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_GBRG},
    421     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GRBG,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_GRBG},
    422     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8RGGB,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_RGGB},
    423     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8BGGR,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_BGGR},
    424     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GBRG,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_GBRG},
    425     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GRBG,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_GRBG},
    426     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8RGGB,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_RGGB},
    427     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8BGGR,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_BGGR},
    428     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_GBRG},
    429     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_GRBG},
    430     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_RGGB},
    431     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_BGGR},
    432     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_GBRG},
    433     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_GRBG},
    434     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_RGGB},
    435     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_BGGR}
    436 };
    437 
    438 const QCameraParameters::QCameraMap QCameraParameters::RAW_FORMATS_MAP[] = {
    439 };
    440 
    441 const QCameraParameters::QCameraMap QCameraParameters::FOCUS_MODES_MAP[] = {
    442     { FOCUS_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
    443     { FOCUS_MODE_INFINITY,           CAM_FOCUS_MODE_INFINITY },
    444     { FOCUS_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
    445     { FOCUS_MODE_FIXED,              CAM_FOCUS_MODE_FIXED },
    446     { FOCUS_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
    447     { FOCUS_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
    448     { FOCUS_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO }
    449 };
    450 
    451 const QCameraParameters::QCameraMap QCameraParameters::EFFECT_MODES_MAP[] = {
    452     { EFFECT_NONE,       CAM_EFFECT_MODE_OFF },
    453     { EFFECT_MONO,       CAM_EFFECT_MODE_MONO },
    454     { EFFECT_NEGATIVE,   CAM_EFFECT_MODE_NEGATIVE },
    455     { EFFECT_SOLARIZE,   CAM_EFFECT_MODE_SOLARIZE },
    456     { EFFECT_SEPIA,      CAM_EFFECT_MODE_SEPIA },
    457     { EFFECT_POSTERIZE,  CAM_EFFECT_MODE_POSTERIZE },
    458     { EFFECT_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
    459     { EFFECT_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
    460     { EFFECT_AQUA,       CAM_EFFECT_MODE_AQUA },
    461     { EFFECT_EMBOSS,     CAM_EFFECT_MODE_EMBOSS },
    462     { EFFECT_SKETCH,     CAM_EFFECT_MODE_SKETCH },
    463     { EFFECT_NEON,       CAM_EFFECT_MODE_NEON }
    464 };
    465 
    466 const QCameraParameters::QCameraMap QCameraParameters::SCENE_MODES_MAP[] = {
    467     { SCENE_MODE_AUTO,           CAM_SCENE_MODE_OFF },
    468     { SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
    469     { SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
    470     { SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
    471     { SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
    472     { SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
    473     { SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
    474     { SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
    475     { SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
    476     { SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
    477     { SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
    478     { SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
    479     { SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
    480     { SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
    481     { SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
    482     { SCENE_MODE_ASD,            CAM_SCENE_MODE_AUTO },
    483     { SCENE_MODE_BACKLIGHT,      CAM_SCENE_MODE_BACKLIGHT },
    484     { SCENE_MODE_FLOWERS,        CAM_SCENE_MODE_FLOWERS },
    485     { SCENE_MODE_AR,             CAM_SCENE_MODE_AR },
    486     { SCENE_MODE_HDR,            CAM_SCENE_MODE_HDR },
    487 };
    488 
    489 const QCameraParameters::QCameraMap QCameraParameters::FLASH_MODES_MAP[] = {
    490     { FLASH_MODE_OFF,   CAM_FLASH_MODE_OFF },
    491     { FLASH_MODE_AUTO,  CAM_FLASH_MODE_AUTO },
    492     { FLASH_MODE_ON,    CAM_FLASH_MODE_ON },
    493     { FLASH_MODE_TORCH, CAM_FLASH_MODE_TORCH }
    494 };
    495 
    496 const QCameraParameters::QCameraMap QCameraParameters::FOCUS_ALGO_MAP[] = {
    497     { FOCUS_ALGO_AUTO,            CAM_FOCUS_ALGO_AUTO },
    498     { FOCUS_ALGO_SPOT_METERING,   CAM_FOCUS_ALGO_SPOT },
    499     { FOCUS_ALGO_CENTER_WEIGHTED, CAM_FOCUS_ALGO_CENTER_WEIGHTED },
    500     { FOCUS_ALGO_FRAME_AVERAGE,   CAM_FOCUS_ALGO_AVERAGE }
    501 };
    502 
    503 const QCameraParameters::QCameraMap QCameraParameters::WHITE_BALANCE_MODES_MAP[] = {
    504     { WHITE_BALANCE_AUTO,            CAM_WB_MODE_AUTO },
    505     { WHITE_BALANCE_INCANDESCENT,    CAM_WB_MODE_INCANDESCENT },
    506     { WHITE_BALANCE_FLUORESCENT,     CAM_WB_MODE_FLUORESCENT },
    507     { WHITE_BALANCE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
    508     { WHITE_BALANCE_DAYLIGHT,        CAM_WB_MODE_DAYLIGHT },
    509     { WHITE_BALANCE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
    510     { WHITE_BALANCE_TWILIGHT,        CAM_WB_MODE_TWILIGHT },
    511     { WHITE_BALANCE_SHADE,           CAM_WB_MODE_SHADE }
    512 };
    513 
    514 const QCameraParameters::QCameraMap QCameraParameters::ANTIBANDING_MODES_MAP[] = {
    515     { ANTIBANDING_OFF,  CAM_ANTIBANDING_MODE_OFF },
    516     { ANTIBANDING_50HZ, CAM_ANTIBANDING_MODE_50HZ },
    517     { ANTIBANDING_60HZ, CAM_ANTIBANDING_MODE_60HZ },
    518     { ANTIBANDING_AUTO, CAM_ANTIBANDING_MODE_AUTO }
    519 };
    520 
    521 const QCameraParameters::QCameraMap QCameraParameters::ISO_MODES_MAP[] = {
    522     { ISO_AUTO,  CAM_ISO_MODE_AUTO },
    523     { ISO_HJR,   CAM_ISO_MODE_DEBLUR },
    524     { ISO_100,   CAM_ISO_MODE_100 },
    525     { ISO_200,   CAM_ISO_MODE_200 },
    526     { ISO_400,   CAM_ISO_MODE_400 },
    527     { ISO_800,   CAM_ISO_MODE_800 },
    528     { ISO_1600,  CAM_ISO_MODE_1600 }
    529 };
    530 
    531 const QCameraParameters::QCameraMap QCameraParameters::HFR_MODES_MAP[] = {
    532     { VIDEO_HFR_OFF, CAM_HFR_MODE_OFF },
    533     { VIDEO_HFR_2X,  CAM_HFR_MODE_60FPS },
    534     { VIDEO_HFR_3X,  CAM_HFR_MODE_90FPS },
    535     { VIDEO_HFR_4X,  CAM_HFR_MODE_120FPS },
    536     { VIDEO_HFR_5X,  CAM_HFR_MODE_150FPS }
    537 };
    538 
    539 const QCameraParameters::QCameraMap QCameraParameters::BRACKETING_MODES_MAP[] = {
    540     { AE_BRACKET_OFF, CAM_EXP_BRACKETING_OFF },
    541     { AE_BRACKET,     CAM_EXP_BRACKETING_ON }
    542 };
    543 
    544 const QCameraParameters::QCameraMap QCameraParameters::ON_OFF_MODES_MAP[] = {
    545     { VALUE_OFF, 0 },
    546     { VALUE_ON,  1 }
    547 };
    548 
    549 const QCameraParameters::QCameraMap QCameraParameters::TOUCH_AF_AEC_MODES_MAP[] = {
    550     { QCameraParameters::TOUCH_AF_AEC_OFF, 0 },
    551     { QCameraParameters::TOUCH_AF_AEC_ON, 1 }
    552 };
    553 
    554 const QCameraParameters::QCameraMap QCameraParameters::ENABLE_DISABLE_MODES_MAP[] = {
    555     { VALUE_ENABLE,  1 },
    556     { VALUE_DISABLE, 0 }
    557 };
    558 
    559 const QCameraParameters::QCameraMap QCameraParameters::DENOISE_ON_OFF_MODES_MAP[] = {
    560     { DENOISE_OFF, 0 },
    561     { DENOISE_ON,  1 }
    562 };
    563 
    564 const QCameraParameters::QCameraMap QCameraParameters::TRUE_FALSE_MODES_MAP[] = {
    565     { VALUE_FALSE, 0},
    566     { VALUE_TRUE,  1}
    567 };
    568 
    569 const QCameraParameters::QCameraMap QCameraParameters::FLIP_MODES_MAP[] = {
    570     {FLIP_MODE_OFF, 0},
    571     {FLIP_MODE_V, FLIP_V},
    572     {FLIP_MODE_H, FLIP_H},
    573     {FLIP_MODE_VH, FLIP_V_H}
    574 };
    575 
    576 const QCameraParameters::QCameraMap QCameraParameters::AF_BRACKETING_MODES_MAP[] = {
    577     { AF_BRACKET_OFF, 0 },
    578     { AF_BRACKET_ON,  1 }
    579 };
    580 
    581 const QCameraParameters::QCameraMap QCameraParameters::RE_FOCUS_MODES_MAP[] = {
    582     { RE_FOCUS_OFF, 0 },
    583     { RE_FOCUS_ON,  1 }
    584 };
    585 
    586 const QCameraParameters::QCameraMap QCameraParameters::CHROMA_FLASH_MODES_MAP[] = {
    587     { CHROMA_FLASH_OFF, 0 },
    588     { CHROMA_FLASH_ON,  1 }
    589 };
    590 
    591 const QCameraParameters::QCameraMap QCameraParameters::OPTI_ZOOM_MODES_MAP[] = {
    592     { OPTI_ZOOM_OFF, 0 },
    593     { OPTI_ZOOM_ON,  1 }
    594 };
    595 
    596 const QCameraParameters::QCameraMap QCameraParameters::CDS_MODES_MAP[] = {
    597     { CDS_MODE_OFF, CAM_CDS_MODE_OFF },
    598     { CDS_MODE_ON, CAM_CDS_MODE_ON },
    599     { CDS_MODE_AUTO, CAM_CDS_MODE_AUTO}
    600 };
    601 
    602 #define DEFAULT_CAMERA_AREA "(0, 0, 0, 0, 0)"
    603 #define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
    604 
    605 /*===========================================================================
    606  * FUNCTION   : QCameraParameters
    607  *
    608  * DESCRIPTION: default constructor of QCameraParameters
    609  *
    610  * PARAMETERS : none
    611  *
    612  * RETURN     : None
    613  *==========================================================================*/
    614 QCameraParameters::QCameraParameters()
    615     : CameraParameters(),
    616       m_reprocScaleParam(this),
    617       m_pCapability(NULL),
    618       m_pCamOpsTbl(NULL),
    619       m_pParamHeap(NULL),
    620       m_pParamBuf(NULL),
    621       m_bZslMode(false),
    622       m_bZslMode_new(false),
    623       m_bRecordingHint(false),
    624       m_bRecordingHint_new(false),
    625       m_bHistogramEnabled(false),
    626       m_nFaceProcMask(0),
    627       m_bFaceDetectionOn(0),
    628       m_bDebugFps(false),
    629       mFocusMode(CAM_FOCUS_MODE_MAX),
    630       mPreviewFormat(CAM_FORMAT_YUV_420_NV21),
    631       mPictureFormat(CAM_FORMAT_JPEG),
    632       m_bNeedRestart(false),
    633       m_bNoDisplayMode(false),
    634       m_bWNROn(false),
    635       m_bInited(false),
    636       m_nBurstNum(1),
    637       m_nRetroBurstNum(0),
    638       m_nBurstLEDOnPeriod(100),
    639       m_bUpdateEffects(false),
    640       m_bSceneTransitionAuto(false),
    641       m_bPreviewFlipChanged(false),
    642       m_bVideoFlipChanged(false),
    643       m_bSnapshotFlipChanged(false),
    644       m_bFixedFrameRateSet(false),
    645       m_bHDREnabled(false),
    646       m_bAVTimerEnabled(false),
    647       m_bDISEnabled(false),
    648       m_AdjustFPS(NULL),
    649       m_bHDR1xFrameEnabled(true),
    650       m_HDRSceneEnabled(false),
    651       m_bHDRThumbnailProcessNeeded(false),
    652       m_bHDR1xExtraBufferNeeded(true),
    653       m_bHDROutputCropEnabled(false),
    654       m_tempMap(),
    655       m_bAFBracketingOn(false),
    656       m_bChromaFlashOn(false),
    657       m_bOptiZoomOn(false),
    658       m_bSceneSelection(false),
    659       m_SelectedScene(CAM_SCENE_MODE_MAX),
    660       m_bHfrMode(false),
    661       m_bSensorHDREnabled(false),
    662       m_bRdiMode(false),
    663       m_bDisplayFrame(true),
    664       m_bSecureMode(false),
    665       m_bAeBracketingEnabled(false),
    666       mFlashValue(CAM_FLASH_MODE_OFF),
    667       mFlashDaemonValue(CAM_FLASH_MODE_OFF)
    668 {
    669     char value[PROPERTY_VALUE_MAX];
    670     // TODO: may move to parameter instead of sysprop
    671     property_get("persist.debug.sf.showfps", value, "0");
    672     m_bDebugFps = atoi(value) > 0 ? true : false;
    673     m_bReleaseTorchCamera = false;
    674     m_pTorch = NULL;
    675 
    676     // For thermal mode, it should be set as system property
    677     // because system property applies to all applications, while
    678     // parameters only apply to specific app.
    679     property_get("persist.camera.thermal.mode", value, "fps");
    680     if (!strcmp(value, "frameskip")) {
    681         m_ThermalMode = QCAMERA_THERMAL_ADJUST_FRAMESKIP;
    682     } else {
    683         if (strcmp(value, "fps"))
    684             ALOGE("%s: Invalid camera thermal mode %s", __func__, value);
    685         m_ThermalMode = QCAMERA_THERMAL_ADJUST_FPS;
    686     }
    687 
    688     memset(&m_LiveSnapshotSize, 0, sizeof(m_LiveSnapshotSize));
    689     memset(&m_default_fps_range, 0, sizeof(m_default_fps_range));
    690     memset(&m_hfrFpsRange, 0, sizeof(m_hfrFpsRange));
    691 }
    692 
    693 /*===========================================================================
    694  * FUNCTION   : QCameraParameters
    695  *
    696  * DESCRIPTION: constructor of QCameraParameters
    697  *
    698  * PARAMETERS :
    699  *   @params  : parameters in string
    700  *
    701  * RETURN     : None
    702  *==========================================================================*/
    703 QCameraParameters::QCameraParameters(const String8 &params)
    704     : CameraParameters(params),
    705     m_reprocScaleParam(this),
    706     m_pCapability(NULL),
    707     m_pCamOpsTbl(NULL),
    708     m_pParamHeap(NULL),
    709     m_pParamBuf(NULL),
    710     m_bZslMode(false),
    711     m_bZslMode_new(false),
    712     m_bRecordingHint(false),
    713     m_bRecordingHint_new(false),
    714     m_bHistogramEnabled(false),
    715     m_nFaceProcMask(0),
    716     m_bDebugFps(false),
    717     mFocusMode(CAM_FOCUS_MODE_MAX),
    718     mPreviewFormat(CAM_FORMAT_YUV_420_NV21),
    719     mPictureFormat(CAM_FORMAT_JPEG),
    720     m_bNeedRestart(false),
    721     m_bNoDisplayMode(false),
    722     m_bWNROn(false),
    723     m_bInited(false),
    724     m_nBurstNum(1),
    725     m_nRetroBurstNum(0),
    726     m_nBurstLEDOnPeriod(100),
    727     m_bPreviewFlipChanged(false),
    728     m_bVideoFlipChanged(false),
    729     m_bSnapshotFlipChanged(false),
    730     m_bFixedFrameRateSet(false),
    731     m_bHDREnabled(false),
    732     m_bAVTimerEnabled(false),
    733     m_AdjustFPS(NULL),
    734     m_bHDR1xFrameEnabled(true),
    735     m_HDRSceneEnabled(false),
    736     m_bHDRThumbnailProcessNeeded(false),
    737     m_bHDR1xExtraBufferNeeded(true),
    738     m_bHDROutputCropEnabled(false),
    739     m_tempMap(),
    740     m_bAFBracketingOn(false),
    741     m_bChromaFlashOn(false),
    742     m_bOptiZoomOn(false),
    743     m_bSceneSelection(false),
    744     m_SelectedScene(CAM_SCENE_MODE_MAX),
    745     m_bHfrMode(false),
    746     m_bSensorHDREnabled(false),
    747     m_bRdiMode(false),
    748     m_bSecureMode(false),
    749     m_bAeBracketingEnabled(false),
    750     mFlashValue(CAM_FLASH_MODE_OFF),
    751     mFlashDaemonValue(CAM_FLASH_MODE_OFF)
    752 {
    753     memset(&m_LiveSnapshotSize, 0, sizeof(m_LiveSnapshotSize));
    754     memset(&m_default_fps_range, 0, sizeof(m_default_fps_range));
    755     memset(&m_hfrFpsRange, 0, sizeof(m_hfrFpsRange));
    756     m_pTorch = NULL;
    757     m_bReleaseTorchCamera = false;
    758 }
    759 
    760 /*===========================================================================
    761  * FUNCTION   : ~QCameraParameters
    762  *
    763  * DESCRIPTION: deconstructor of QCameraParameters
    764  *
    765  * PARAMETERS : none
    766  *
    767  * RETURN     : None
    768  *==========================================================================*/
    769 QCameraParameters::~QCameraParameters()
    770 {
    771     deinit();
    772 }
    773 
    774 /*===========================================================================
    775  * FUNCTION   : createSizesString
    776  *
    777  * DESCRIPTION: create string obj contains array of dimensions
    778  *
    779  * PARAMETERS :
    780  *   @sizes   : array of dimensions
    781  *   @len     : size of dimension array
    782  *
    783  * RETURN     : string obj
    784  *==========================================================================*/
    785 String8 QCameraParameters::createSizesString(const cam_dimension_t *sizes, int len)
    786 {
    787     String8 str;
    788     char buffer[32];
    789 
    790     if (len > 0) {
    791         snprintf(buffer, sizeof(buffer), "%dx%d", sizes[0].width, sizes[0].height);
    792         str.append(buffer);
    793     }
    794     for (int i = 1; i < len; i++) {
    795         snprintf(buffer, sizeof(buffer), ",%dx%d", sizes[i].width, sizes[i].height);
    796         str.append(buffer);
    797     }
    798     return str;
    799 }
    800 
    801 /*===========================================================================
    802  * FUNCTION   : createValuesString
    803  *
    804  * DESCRIPTION: create string obj contains array of values from map when matched
    805  *              from input values array
    806  *
    807  * PARAMETERS :
    808  *   @values  : array of values
    809  *   @len     : size of values array
    810  *   @map     : map contains the mapping between values and enums
    811  *   @map_len : size of the map
    812  *
    813  * RETURN     : string obj
    814  *==========================================================================*/
    815 String8 QCameraParameters::createValuesString(const int *values,
    816                                               int len,
    817                                               const QCameraMap* map,
    818                                               int map_len)
    819 {
    820     String8 str;
    821     int count = 0;
    822 
    823     for (int i = 0; i < len; i++ ) {
    824         for (int j = 0; j < map_len; j ++)
    825             if (map[j].val == values[i]) {
    826                 if (NULL != map[j].desc) {
    827                     if (count > 0) {
    828                         str.append(",");
    829                     }
    830                     str.append(map[j].desc);
    831                     count++;
    832                     break; //loop j
    833                 }
    834             }
    835     }
    836     return str;
    837 }
    838 
    839 /*===========================================================================
    840  * FUNCTION   : createValuesStringFromMap
    841  *
    842  * DESCRIPTION: create string obj contains array of values directly from map
    843  *
    844  * PARAMETERS :
    845  *   @map     : map contains the mapping between values and enums
    846  *   @map_len : size of the map
    847  *
    848  * RETURN     : string obj
    849  *==========================================================================*/
    850 String8 QCameraParameters::createValuesStringFromMap(const QCameraMap* map,
    851                                                      int map_len)
    852 {
    853     String8 str;
    854 
    855     for (int i = 0; i < map_len; i++) {
    856         if (NULL != map[i].desc) {
    857             if (i > 0) {
    858                 str.append(",");
    859             }
    860             str.append(map[i].desc);
    861         }
    862     }
    863     return str;
    864 }
    865 
    866 /*===========================================================================
    867  * FUNCTION   : createZoomRatioValuesString
    868  *
    869  * DESCRIPTION: create string obj contains array of zoom ratio values
    870  *
    871  * PARAMETERS :
    872  *   @zoomRaios  : array of zoom ratios
    873  *   @length     : size of the array
    874  *
    875  * RETURN     : string obj
    876  *==========================================================================*/
    877 String8 QCameraParameters::createZoomRatioValuesString(int *zoomRatios, int length)
    878 {
    879     String8 str;
    880     char buffer[32] = {0};
    881 
    882     if(length > 0){
    883         snprintf(buffer, sizeof(buffer), "%d", zoomRatios[0]);
    884         str.append(buffer);
    885     }
    886 
    887     for (int i =1;i<length;i++){
    888         memset(buffer, 0, sizeof(buffer));
    889         snprintf(buffer, sizeof(buffer), ",%d", zoomRatios[i]);
    890         str.append(buffer);
    891     }
    892     return str;
    893 }
    894 
    895 /*===========================================================================
    896  * FUNCTION   : createHfrValuesString
    897  *
    898  * DESCRIPTION: create string obj contains array of hfr values from map when
    899  *              matched from input hfr values
    900  *
    901  * PARAMETERS :
    902  *   @values  : array of hfr info
    903  *   @len     : size of the array
    904  *   @map     : map of hfr string value and enum
    905  *   map_len  : size of map
    906  *
    907  * RETURN     : string obj
    908  *==========================================================================*/
    909 String8 QCameraParameters::createHfrValuesString(
    910                                 const cam_hfr_info_t *values,
    911                                 int len,
    912                                 const QCameraMap* map,
    913                                 int map_len)
    914 {
    915     String8 str;
    916     int count = 0;
    917 
    918     for (int i = 0; i < len; i++ ) {
    919         for (int j = 0; j < map_len; j ++)
    920             if (map[j].val == (int)values[i].mode) {
    921                 if (NULL != map[j].desc) {
    922                     if (count > 0) {
    923                         str.append(",");
    924                     }
    925                      str.append(map[j].desc);
    926                      count++;
    927                      break; //loop j
    928                 }
    929             }
    930     }
    931     if (count > 0) {
    932         str.append(",");
    933     }
    934     str.append(VIDEO_HFR_OFF);
    935     return str;
    936 }
    937 
    938 /*===========================================================================
    939  * FUNCTION   : createHfrSizesString
    940  *
    941  * DESCRIPTION: create string obj contains array of hfr sizes
    942  *
    943  * PARAMETERS :
    944  *   @values  : array of hfr info
    945  *   @len     : size of the array
    946  *
    947  * RETURN     : string obj
    948  *==========================================================================*/
    949 String8 QCameraParameters::createHfrSizesString(
    950                                 const cam_hfr_info_t *values,
    951                                 int len)
    952 {
    953     String8 str;
    954     char buffer[32];
    955 
    956     if (len > 0) {
    957         snprintf(buffer, sizeof(buffer), "%dx%d",
    958                  values[0].dim.width, values[0].dim.height);
    959         str.append(buffer);
    960     }
    961     for (int i = 1; i < len; i++) {
    962         snprintf(buffer, sizeof(buffer), ",%dx%d",
    963                  values[i].dim.width, values[i].dim.height);
    964         str.append(buffer);
    965     }
    966     return str;
    967 }
    968 
    969 /*===========================================================================
    970  * FUNCTION   : createFpsString
    971  *
    972  * DESCRIPTION: create string obj contains array of FPS rates
    973  *
    974  * PARAMETERS :
    975  *   @fps     : default fps range
    976  *
    977  * RETURN     : string obj
    978  *==========================================================================*/
    979 String8 QCameraParameters::createFpsString(cam_fps_range_t &fps)
    980 {
    981     char buffer[32];
    982     String8 fpsValues;
    983 
    984     int min_fps = int(fps.min_fps);
    985     int max_fps = int(fps.max_fps);
    986 
    987     if (min_fps < fps.min_fps){
    988         min_fps++;
    989     }
    990     if (max_fps > fps.max_fps) {
    991         max_fps--;
    992     }
    993     if (min_fps <= max_fps) {
    994         snprintf(buffer, sizeof(buffer), "%d", min_fps);
    995         fpsValues.append(buffer);
    996     }
    997 
    998     for (int i = min_fps+1; i <= max_fps; i++) {
    999         snprintf(buffer, sizeof(buffer), ",%d", i);
   1000         fpsValues.append(buffer);
   1001     }
   1002 
   1003     return fpsValues;
   1004 }
   1005 
   1006 /*===========================================================================
   1007  * FUNCTION   : createFpsRangeString
   1008  *
   1009  * DESCRIPTION: create string obj contains array of FPS ranges
   1010  *
   1011  * PARAMETERS :
   1012  *   @fps     : array of fps ranges
   1013  *   @len     : size of the array
   1014  *   @default_fps_index : reference to index of default fps range
   1015  *
   1016  * RETURN     : string obj
   1017  *==========================================================================*/
   1018 String8 QCameraParameters::createFpsRangeString(const cam_fps_range_t* fps,
   1019                                                 int len,
   1020                                                 int &default_fps_index)
   1021 {
   1022     String8 str;
   1023     char buffer[32];
   1024     int max_range = 0;
   1025     int min_fps, max_fps;
   1026 
   1027     if (len > 0) {
   1028         min_fps = int(fps[0].min_fps * 1000);
   1029         max_fps = int(fps[0].max_fps * 1000);
   1030         max_range = max_fps - min_fps;
   1031         default_fps_index = 0;
   1032         snprintf(buffer, sizeof(buffer), "(%d,%d)", min_fps, max_fps);
   1033         str.append(buffer);
   1034     }
   1035     for (int i = 1; i < len; i++) {
   1036         min_fps = int(fps[i].min_fps * 1000);
   1037         max_fps = int(fps[i].max_fps * 1000);
   1038         if (max_range < (max_fps - min_fps)) {
   1039             max_range = max_fps - min_fps;
   1040             default_fps_index = i;
   1041         }
   1042         snprintf(buffer, sizeof(buffer), ",(%d,%d)", min_fps, max_fps);
   1043         str.append(buffer);
   1044     }
   1045     return str;
   1046 }
   1047 
   1048 /*===========================================================================
   1049  * FUNCTION   : lookupAttr
   1050  *
   1051  * DESCRIPTION: lookup a value by its name
   1052  *
   1053  * PARAMETERS :
   1054  *   @attr    : map contains <name, value>
   1055  *   @len     : size of the map
   1056  *   @name    : name to be looked up
   1057  *
   1058  * RETURN     : valid value if found
   1059  *              NAME_NOT_FOUND if not found
   1060  *==========================================================================*/
   1061 int QCameraParameters::lookupAttr(const QCameraMap arr[], int len, const char *name)
   1062 {
   1063     if (name) {
   1064         for (int i = 0; i < len; i++) {
   1065             if (!strcmp(arr[i].desc, name))
   1066                 return arr[i].val;
   1067         }
   1068     }
   1069     return NAME_NOT_FOUND;
   1070 }
   1071 
   1072 /*===========================================================================
   1073  * FUNCTION   : lookupNameByValue
   1074  *
   1075  * DESCRIPTION: lookup a name by its value
   1076  *
   1077  * PARAMETERS :
   1078  *   @attr    : map contains <name, value>
   1079  *   @len     : size of the map
   1080  *   @value   : value to be looked up
   1081  *
   1082  * RETURN     : name str or NULL if not found
   1083  *==========================================================================*/
   1084 const char *QCameraParameters::lookupNameByValue(const QCameraMap arr[], int len, int value)
   1085 {
   1086     for (int i = 0; i < len; i++) {
   1087         if (arr[i].val == value) {
   1088             return arr[i].desc;
   1089         }
   1090     }
   1091     return NULL;
   1092 }
   1093 
   1094 /*===========================================================================
   1095  * FUNCTION   : setPreviewSize
   1096  *
   1097  * DESCRIPTION: set preview size from user setting
   1098  *
   1099  * PARAMETERS :
   1100  *   @params  : user setting parameters
   1101  *
   1102  * RETURN     : int32_t type of status
   1103  *              NO_ERROR  -- success
   1104  *              none-zero failure code
   1105  *==========================================================================*/
   1106 int32_t QCameraParameters::setPreviewSize(const QCameraParameters& params)
   1107 {
   1108     int width, height;
   1109     params.getPreviewSize(&width, &height);
   1110     CDBG("Requested preview size %d x %d", width, height);
   1111 
   1112     // Validate the preview size
   1113     for (size_t i = 0; i < m_pCapability->preview_sizes_tbl_cnt; ++i) {
   1114         if (width ==  m_pCapability->preview_sizes_tbl[i].width
   1115            && height ==  m_pCapability->preview_sizes_tbl[i].height) {
   1116             // check if need to restart preview in case of preview size change
   1117             int old_width, old_height;
   1118             CameraParameters::getPreviewSize(&old_width, &old_height);
   1119             if (width != old_width || height != old_height) {
   1120                 m_bNeedRestart = true;
   1121             }
   1122 
   1123             // set the new value
   1124             CameraParameters::setPreviewSize(width, height);
   1125             return NO_ERROR;
   1126         }
   1127     }
   1128     ALOGE("Invalid preview size requested: %dx%d", width, height);
   1129     return BAD_VALUE;
   1130 }
   1131 
   1132 /*===========================================================================
   1133  * FUNCTION   : setPictureSize
   1134  *
   1135  * DESCRIPTION: set picture size from user setting
   1136  *
   1137  * PARAMETERS :
   1138  *   @params  : user setting parameters
   1139  *
   1140  * RETURN     : int32_t type of status
   1141  *              NO_ERROR  -- success
   1142  *              none-zero failure code
   1143  *==========================================================================*/
   1144 int32_t QCameraParameters::setPictureSize(const QCameraParameters& params)
   1145 {
   1146     int width, height;
   1147     params.getPictureSize(&width, &height);
   1148     CDBG("Requested picture size %d x %d", width, height);
   1149 
   1150     // Validate the picture size
   1151     if(!m_reprocScaleParam.isScaleEnabled()){
   1152         for (size_t i = 0; i < m_pCapability->picture_sizes_tbl_cnt; ++i) {
   1153             if (width ==  m_pCapability->picture_sizes_tbl[i].width
   1154                && height ==  m_pCapability->picture_sizes_tbl[i].height) {
   1155                 // check if need to restart preview in case of picture size change
   1156                 int old_width, old_height;
   1157                 CameraParameters::getPictureSize(&old_width, &old_height);
   1158                 if ((m_bZslMode || m_bRecordingHint) &&
   1159                     (width != old_width || height != old_height)) {
   1160                     m_bNeedRestart = true;
   1161                 }
   1162 
   1163                 // set the new value
   1164                 CameraParameters::setPictureSize(width, height);
   1165                 return NO_ERROR;
   1166             }
   1167         }
   1168     }else{
   1169         //should use scaled picture size table to validate
   1170         if(m_reprocScaleParam.setValidatePicSize(width, height) == NO_ERROR){
   1171             // check if need to restart preview in case of picture size change
   1172             int old_width, old_height;
   1173             CameraParameters::getPictureSize(&old_width, &old_height);
   1174             if ((m_bZslMode || m_bRecordingHint) &&
   1175                 (width != old_width || height != old_height)) {
   1176                 m_bNeedRestart = true;
   1177             }
   1178 
   1179             // set the new value
   1180             char val[32];
   1181             sprintf(val, "%dx%d", width, height);
   1182             updateParamEntry(KEY_PICTURE_SIZE, val);
   1183             CDBG("%s: %s", __func__, val);
   1184             return NO_ERROR;
   1185         }
   1186     }
   1187     ALOGE("Invalid picture size requested: %dx%d", width, height);
   1188     return BAD_VALUE;
   1189 }
   1190 
   1191 /*===========================================================================
   1192  * FUNCTION   : setVideoSize
   1193  *
   1194  * DESCRIPTION: set video size from user setting
   1195  *
   1196  * PARAMETERS :
   1197  *   @params  : user setting parameters
   1198  *
   1199  * RETURN     : int32_t type of status
   1200  *              NO_ERROR  -- success
   1201  *              none-zero failure code
   1202  *==========================================================================*/
   1203 int32_t QCameraParameters::setVideoSize(const QCameraParameters& params)
   1204 {
   1205     const char *str= NULL;
   1206     int width, height;
   1207     str = params.get(KEY_VIDEO_SIZE);
   1208     if(!str) {
   1209         //If application didn't set this parameter string, use the values from
   1210         //getPreviewSize() as video dimensions.
   1211         params.getPreviewSize(&width, &height);
   1212         ALOGE("No Record Size requested, use the preview dimensions");
   1213     } else {
   1214         params.getVideoSize(&width, &height);
   1215     }
   1216 
   1217     // Validate the video size
   1218     for (size_t i = 0; i < m_pCapability->video_sizes_tbl_cnt; ++i) {
   1219         if (width ==  m_pCapability->video_sizes_tbl[i].width
   1220                 && height ==  m_pCapability->video_sizes_tbl[i].height) {
   1221             // check if need to restart preview in case of video size change
   1222             int old_width, old_height;
   1223             CameraParameters::getVideoSize(&old_width, &old_height);
   1224             if (m_bRecordingHint &&
   1225                (width != old_width || height != old_height)) {
   1226                 m_bNeedRestart = true;
   1227             }
   1228 
   1229             // set the new value
   1230             CameraParameters::setVideoSize(width, height);
   1231             return NO_ERROR;
   1232         }
   1233     }
   1234 
   1235     ALOGE("Invalid video size requested: %dx%d", width, height);
   1236     return BAD_VALUE;
   1237 }
   1238 
   1239 /*===========================================================================
   1240  * FUNCTION   : setLiveSnapshotSize
   1241  *
   1242  * DESCRIPTION: set live snapshot size
   1243  *
   1244  * PARAMETERS :
   1245  *   @params  : user setting parameters
   1246  *
   1247  * RETURN     : int32_t type of status
   1248  *              NO_ERROR  -- success
   1249  *              none-zero failure code
   1250  *==========================================================================*/
   1251 int32_t QCameraParameters::setLiveSnapshotSize(const QCameraParameters& params)
   1252 {
   1253     char value[PROPERTY_VALUE_MAX];
   1254     property_get("persist.camera.opt.livepic", value, "1");
   1255     bool useOptimal = atoi(value) > 0 ? true : false;
   1256 
   1257     // use picture size from user setting
   1258     params.getPictureSize(&m_LiveSnapshotSize.width, &m_LiveSnapshotSize.height);
   1259 
   1260     uint8_t livesnapshot_sizes_tbl_cnt = m_pCapability->livesnapshot_sizes_tbl_cnt;
   1261     cam_dimension_t *livesnapshot_sizes_tbl = &m_pCapability->livesnapshot_sizes_tbl[0];
   1262 
   1263     // check if HFR is enabled
   1264     const char *hfrStr = params.get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
   1265     cam_hfr_mode_t hfrMode = CAM_HFR_MODE_OFF;
   1266     const char *hsrStr = params.get(KEY_QC_VIDEO_HIGH_SPEED_RECORDING);
   1267 
   1268     if (hsrStr != NULL && !strcmp(hsrStr, "on")) {
   1269         for (int i = 0; i < m_pCapability->hfr_tbl_cnt; i++) {
   1270             if (m_pCapability->hfr_tbl[i].mode == CAM_HFR_MODE_120FPS) {
   1271                 livesnapshot_sizes_tbl_cnt =
   1272                     m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl_cnt;
   1273                 livesnapshot_sizes_tbl =
   1274                     &m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl[0];
   1275                 hfrMode = m_pCapability->hfr_tbl[i].mode;
   1276                 break;
   1277             }
   1278         }
   1279     }
   1280     else if (hfrStr != NULL) {
   1281         int32_t value = lookupAttr(HFR_MODES_MAP,
   1282                                    sizeof(HFR_MODES_MAP)/sizeof(QCameraMap),
   1283                                    hfrStr);
   1284         if (value != NAME_NOT_FOUND) {
   1285             // if HFR is enabled, change live snapshot size
   1286             if (value > CAM_HFR_MODE_OFF) {
   1287                 for (int i = 0; i < m_pCapability->hfr_tbl_cnt; i++) {
   1288                     if (m_pCapability->hfr_tbl[i].mode == value) {
   1289                         livesnapshot_sizes_tbl_cnt =
   1290                             m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl_cnt;
   1291                         livesnapshot_sizes_tbl =
   1292                             &m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl[0];
   1293                         hfrMode = m_pCapability->hfr_tbl[i].mode;
   1294                         break;
   1295                     }
   1296                 }
   1297             }
   1298         }
   1299     }
   1300 
   1301     if (useOptimal || hfrMode != CAM_HFR_MODE_OFF) {
   1302         bool found = false;
   1303 
   1304         // first check if picture size is within the list of supported sizes
   1305         for (int i = 0; i < livesnapshot_sizes_tbl_cnt; ++i) {
   1306             if (m_LiveSnapshotSize.width == livesnapshot_sizes_tbl[i].width &&
   1307                 m_LiveSnapshotSize.height == livesnapshot_sizes_tbl[i].height) {
   1308                 found = true;
   1309                 break;
   1310             }
   1311         }
   1312 
   1313         if (!found) {
   1314             // use optimal live snapshot size from supported list,
   1315             // that has same preview aspect ratio
   1316             int width = 0, height = 0;
   1317             params.getPreviewSize(&width, &height);
   1318 
   1319             double previewAspectRatio = (double)width / height;
   1320             for (int i = 0; i < livesnapshot_sizes_tbl_cnt; ++i) {
   1321                 double ratio = (double)livesnapshot_sizes_tbl[i].width /
   1322                                 livesnapshot_sizes_tbl[i].height;
   1323                 if (fabs(previewAspectRatio - ratio) <= ASPECT_TOLERANCE) {
   1324                     m_LiveSnapshotSize = livesnapshot_sizes_tbl[i];
   1325                     found = true;
   1326                     break;
   1327                 }
   1328             }
   1329 
   1330             if (!found && hfrMode != CAM_HFR_MODE_OFF) {
   1331                 // Cannot find matching aspect ration from supported live snapshot list
   1332                 // choose the max dim from preview and video size
   1333                 CDBG("%s: Cannot find matching aspect ratio, choose max of preview or video size", __func__);
   1334                 params.getVideoSize(&m_LiveSnapshotSize.width, &m_LiveSnapshotSize.height);
   1335                 if (m_LiveSnapshotSize.width < width && m_LiveSnapshotSize.height < height) {
   1336                     m_LiveSnapshotSize.width = width;
   1337                     m_LiveSnapshotSize.height = height;
   1338                 }
   1339             }
   1340         }
   1341     }
   1342     CDBG("%s: live snapshot size %d x %d", __func__,
   1343           m_LiveSnapshotSize.width, m_LiveSnapshotSize.height);
   1344 
   1345     return NO_ERROR;
   1346 }
   1347 
   1348 
   1349 /*===========================================================================
   1350  * FUNCTION   : setRawSize
   1351  *
   1352  * DESCRIPTION: set live snapshot size
   1353  *
   1354  * PARAMETERS :
   1355  *   @params  : user setting parameters
   1356  *
   1357  * RETURN     : int32_t type of status
   1358  *              NO_ERROR  -- success
   1359  *              none-zero failure code
   1360  *==========================================================================*/
   1361 int32_t QCameraParameters::setRawSize(cam_dimension_t &dim)
   1362 {
   1363     m_rawSize = dim;
   1364     return NO_ERROR;
   1365 }
   1366 /*===========================================================================
   1367  * FUNCTION   : setPreviewFormat
   1368  *
   1369  * DESCRIPTION: set preview format from user setting
   1370  *
   1371  * PARAMETERS :
   1372  *   @params  : user setting parameters
   1373  *
   1374  * RETURN     : int32_t type of status
   1375  *              NO_ERROR  -- success
   1376  *              none-zero failure code
   1377  *==========================================================================*/
   1378 int32_t QCameraParameters::setPreviewFormat(const QCameraParameters& params)
   1379 {
   1380     const char *str = params.getPreviewFormat();
   1381     int32_t previewFormat =
   1382         lookupAttr(PREVIEW_FORMATS_MAP,
   1383                    sizeof(PREVIEW_FORMATS_MAP) / sizeof(QCameraMap),
   1384                    str);
   1385     if (previewFormat != NAME_NOT_FOUND) {
   1386         mPreviewFormat = (cam_format_t)previewFormat;
   1387 
   1388         CameraParameters::setPreviewFormat(str);
   1389         CDBG_HIGH("%s: format %d\n", __func__, mPreviewFormat);
   1390         return NO_ERROR;
   1391     }
   1392     ALOGE("Invalid preview format value: %s", (str == NULL) ? "NULL" : str);
   1393     return BAD_VALUE;
   1394 }
   1395 
   1396 /*===========================================================================
   1397  * FUNCTION   : setPictureFormat
   1398  *
   1399  * DESCRIPTION: set picture format from user setting
   1400  *
   1401  * PARAMETERS :
   1402  *   @params  : user setting parameters
   1403  *
   1404  * RETURN     : int32_t type of status
   1405  *              NO_ERROR  -- success
   1406  *              none-zero failure code
   1407  *==========================================================================*/
   1408 int32_t QCameraParameters::setPictureFormat(const QCameraParameters& params)
   1409 {
   1410     const char *str = params.getPictureFormat();
   1411     int32_t pictureFormat =
   1412         lookupAttr(PICTURE_TYPES_MAP,
   1413                    sizeof(PICTURE_TYPES_MAP) / sizeof(QCameraMap),
   1414                    str);
   1415     if (pictureFormat != NAME_NOT_FOUND) {
   1416         mPictureFormat = pictureFormat;
   1417 
   1418         CameraParameters::setPictureFormat(str);
   1419         CDBG_HIGH("%s: format %d\n", __func__, mPictureFormat);
   1420         return NO_ERROR;
   1421     }
   1422     ALOGE("%s: Invalid picture format value: %s", __func__, (str == NULL) ? "NULL" : str);
   1423     return BAD_VALUE;
   1424 }
   1425 
   1426 /*===========================================================================
   1427  * FUNCTION   : setJpegThumbnailSize
   1428  *
   1429  * DESCRIPTION: set jpeg thumbnail size from user setting
   1430  *
   1431  * PARAMETERS :
   1432  *   @params  : user setting parameters
   1433  *
   1434  * RETURN     : int32_t type of status
   1435  *              NO_ERROR  -- success
   1436  *              none-zero failure code
   1437  *==========================================================================*/
   1438 int32_t QCameraParameters::setJpegThumbnailSize(const QCameraParameters& params)
   1439 {
   1440     int width = params.getInt(KEY_JPEG_THUMBNAIL_WIDTH);
   1441     int height = params.getInt(KEY_JPEG_THUMBNAIL_HEIGHT);
   1442 
   1443     CDBG("requested jpeg thumbnail size %d x %d", width, height);
   1444 
   1445     int sizes_cnt = sizeof(THUMBNAIL_SIZES_MAP) / sizeof(cam_dimension_t);
   1446 
   1447     cam_dimension_t dim;
   1448 
   1449     // While taking livesnaphot match jpeg thumbnail size aspect
   1450     // ratio to liveshot size. For normal snapshot match thumbnail
   1451     // aspect ratio to picture size.
   1452     if (m_bRecordingHint) {
   1453         getLiveSnapshotSize(dim);
   1454     } else {
   1455         params.getPictureSize(&dim.width, &dim.height);
   1456     }
   1457 
   1458     if (0 == dim.height) {
   1459         ALOGE("%s: picture size is invalid (%d x %d)", __func__, dim.width, dim.height);
   1460         return BAD_VALUE;
   1461     }
   1462     double picAspectRatio = (double)dim.width / (double)dim.height;
   1463 
   1464     int optimalWidth = 0, optimalHeight = 0;
   1465     if (width != 0 || height != 0) {
   1466         // If input jpeg thumnmail size is (0,0), meaning no thumbnail needed
   1467         // hornor this setting.
   1468         // Otherwise, search for optimal jpeg thumbnail size that has the same
   1469         // aspect ratio as picture size.
   1470         // If missign jpeg thumbnail size with appropriate aspect ratio,
   1471         // just honor setting supplied by application.
   1472 
   1473         // Try to find a size matches aspect ratio and has the largest width
   1474         for (int i = 0; i < sizes_cnt; i++) {
   1475             if (THUMBNAIL_SIZES_MAP[i].height == 0) {
   1476                 // No thumbnail case, just skip
   1477                 continue;
   1478             }
   1479             double ratio =
   1480                 (double)THUMBNAIL_SIZES_MAP[i].width / THUMBNAIL_SIZES_MAP[i].height;
   1481             if (fabs(ratio - picAspectRatio) > ASPECT_TOLERANCE)  {
   1482                 continue;
   1483             }
   1484             if (THUMBNAIL_SIZES_MAP[i].width > optimalWidth) {
   1485                 optimalWidth = THUMBNAIL_SIZES_MAP[i].width;
   1486                 optimalHeight = THUMBNAIL_SIZES_MAP[i].height;
   1487             }
   1488         }
   1489 
   1490         if ((0 == optimalWidth) || (0 == optimalHeight)) {
   1491             // Optimal size not found
   1492             // Validate thumbnail size
   1493             for (int i = 0; i < sizes_cnt; i++) {
   1494                 if (width == THUMBNAIL_SIZES_MAP[i].width &&
   1495                     height == THUMBNAIL_SIZES_MAP[i].height) {
   1496                     optimalWidth = width;
   1497                     optimalHeight = height;
   1498                     break;
   1499                 }
   1500             }
   1501         }
   1502     }
   1503 
   1504     set(KEY_JPEG_THUMBNAIL_WIDTH, optimalWidth);
   1505     set(KEY_JPEG_THUMBNAIL_HEIGHT, optimalHeight);
   1506     return NO_ERROR;
   1507 }
   1508 
   1509 /*===========================================================================
   1510 
   1511  * FUNCTION   : setBurstLEDOnPeriod
   1512  *
   1513  * DESCRIPTION: set burst LED on period
   1514  *
   1515  * PARAMETERS :
   1516  *   @params  : user setting parameters
   1517  *
   1518  * RETURN     : int32_t type of status
   1519  *              NO_ERROR  -- success
   1520  *              none-zero failure code
   1521  *==========================================================================*/
   1522 int32_t QCameraParameters::setBurstLEDOnPeriod(const QCameraParameters& params)
   1523 {
   1524     uint32_t nBurstLEDOnPeriod =
   1525       params.getInt(KEY_QC_SNAPSHOT_BURST_LED_ON_PERIOD);
   1526     //Check if the LED ON period is within limits
   1527     if ((nBurstLEDOnPeriod <= 0) || (nBurstLEDOnPeriod > 800)) {
   1528         // if burst led on period is not set in parameters,
   1529         // read from sys prop
   1530         char prop[PROPERTY_VALUE_MAX];
   1531         memset(prop, 0, sizeof(prop));
   1532         property_get("persist.camera.led.on.period", prop, "0");
   1533         nBurstLEDOnPeriod = atoi(prop);
   1534         if (nBurstLEDOnPeriod <= 0) {
   1535             nBurstLEDOnPeriod = 100;
   1536         }
   1537     }
   1538 
   1539     set(KEY_QC_SNAPSHOT_BURST_LED_ON_PERIOD, nBurstLEDOnPeriod);
   1540     m_nBurstLEDOnPeriod = nBurstLEDOnPeriod;
   1541     CDBG_HIGH("%s: Burst LED on period  %d", __func__, nBurstLEDOnPeriod);
   1542     return AddSetParmEntryToBatch(m_pParamBuf,
   1543                                   CAM_INTF_PARM_BURST_LED_ON_PERIOD,
   1544                                   sizeof(nBurstLEDOnPeriod),
   1545                                   &nBurstLEDOnPeriod);
   1546 }
   1547 
   1548 
   1549 
   1550 /*===========================================================================
   1551  * FUNCTION   : setRetroActiveBurstNum
   1552  *
   1553  * DESCRIPTION: set retro active burst num
   1554  *
   1555  * PARAMETERS :
   1556  *   @params  : user setting parameters
   1557  *
   1558  * RETURN     : int32_t type of status
   1559  *              NO_ERROR  -- success
   1560  *              none-zero failure code
   1561  *==========================================================================*/
   1562 int32_t QCameraParameters::setRetroActiveBurstNum(
   1563     const QCameraParameters& params)
   1564 {
   1565     int32_t nBurstNum = params.getInt(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER);
   1566     CDBG_HIGH("%s:[ZSL Retro] m_nRetroBurstNum = %d", __func__, m_nRetroBurstNum);
   1567     if (nBurstNum <= 0) {
   1568         // if burst number is not set in parameters,
   1569         // read from sys prop
   1570         char prop[PROPERTY_VALUE_MAX];
   1571         memset(prop, 0, sizeof(prop));
   1572         property_get("persist.camera.retro.number", prop, "0");
   1573         nBurstNum = atoi(prop);
   1574         if (nBurstNum < 0) {
   1575             nBurstNum = 0;
   1576         }
   1577     }
   1578 
   1579     set(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER, nBurstNum);
   1580 
   1581     m_nRetroBurstNum = nBurstNum;
   1582     CDBG_HIGH("%s: [ZSL Retro] m_nRetroBurstNum = %d", __func__, m_nRetroBurstNum);
   1583     return NO_ERROR;
   1584 }
   1585 
   1586 /*===========================================================================
   1587  * FUNCTION   : setJpegQuality
   1588  *
   1589  * DESCRIPTION: set jpeg encpding quality from user setting
   1590  *
   1591  * PARAMETERS :
   1592  *   @params  : user setting parameters
   1593  *
   1594  * RETURN     : int32_t type of status
   1595  *              NO_ERROR  -- success
   1596  *              none-zero failure code
   1597  *==========================================================================*/
   1598 int32_t QCameraParameters::setJpegQuality(const QCameraParameters& params)
   1599 {
   1600     int32_t rc = NO_ERROR;
   1601     int quality = params.getInt(KEY_JPEG_QUALITY);
   1602     if (quality >= 0 && quality <= 100) {
   1603         set(KEY_JPEG_QUALITY, quality);
   1604     } else {
   1605         ALOGE("%s: Invalid jpeg quality=%d", __func__, quality);
   1606         rc = BAD_VALUE;
   1607     }
   1608 
   1609     quality = params.getInt(KEY_JPEG_THUMBNAIL_QUALITY);
   1610     if (quality >= 0 && quality <= 100) {
   1611         set(KEY_JPEG_THUMBNAIL_QUALITY, quality);
   1612     } else {
   1613         ALOGE("%s: Invalid jpeg thumbnail quality=%d", __func__, quality);
   1614         rc = BAD_VALUE;
   1615     }
   1616     return rc;
   1617 }
   1618 
   1619 /*===========================================================================
   1620  * FUNCTION   : setOrientaion
   1621  *
   1622  * DESCRIPTION: set orientaion from user setting
   1623  *
   1624  * PARAMETERS :
   1625  *   @params  : user setting parameters
   1626  *
   1627  * RETURN     : int32_t type of status
   1628  *              NO_ERROR  -- success
   1629  *              none-zero failure code
   1630  *==========================================================================*/
   1631 int32_t QCameraParameters::setOrientation(const QCameraParameters& params)
   1632 {
   1633     const char *str = params.get(KEY_QC_ORIENTATION);
   1634 
   1635     if (str != NULL) {
   1636         if (strcmp(str, portrait) == 0 || strcmp(str, landscape) == 0) {
   1637             // Camera service needs this to decide if the preview frames and raw
   1638             // pictures should be rotated.
   1639             set(KEY_QC_ORIENTATION, str);
   1640         } else {
   1641             ALOGE("%s: Invalid orientation value: %s", __func__, str);
   1642             return BAD_VALUE;
   1643         }
   1644     }
   1645     return NO_ERROR;
   1646 }
   1647 
   1648 /*===========================================================================
   1649  * FUNCTION   : setAutoExposure
   1650  *
   1651  * DESCRIPTION: set auto exposure value from user setting
   1652  *
   1653  * PARAMETERS :
   1654  *   @params  : user setting parameters
   1655  *
   1656  * RETURN     : int32_t type of status
   1657  *              NO_ERROR  -- success
   1658  *              none-zero failure code
   1659  *==========================================================================*/
   1660 int32_t QCameraParameters::setAutoExposure(const QCameraParameters& params)
   1661 {
   1662     const char *str = params.get(KEY_QC_AUTO_EXPOSURE);
   1663     const char *prev_str = get(KEY_QC_AUTO_EXPOSURE);
   1664     if (str != NULL) {
   1665         if (prev_str == NULL ||
   1666             strcmp(str, prev_str) != 0) {
   1667             return setAutoExposure(str);
   1668         }
   1669     }
   1670     return NO_ERROR;
   1671 }
   1672 
   1673 /*===========================================================================
   1674  * FUNCTION   : setPreviewFpsRange
   1675  *
   1676  * DESCRIPTION: set preview FPS range from user setting
   1677  *
   1678  * PARAMETERS :
   1679  *   @params  : user setting parameters
   1680  *
   1681  * RETURN     : int32_t type of status
   1682  *              NO_ERROR  -- success
   1683  *              none-zero failure code
   1684  *==========================================================================*/
   1685 int32_t QCameraParameters::setPreviewFpsRange(const QCameraParameters& params)
   1686 {
   1687     int minFps,maxFps;
   1688     int prevMinFps, prevMaxFps, vidMinFps, vidMaxFps;
   1689     int rc = NO_ERROR;
   1690     bool found = false, updateNeeded = false;
   1691 
   1692     CameraParameters::getPreviewFpsRange(&prevMinFps, &prevMaxFps);
   1693     params.getPreviewFpsRange(&minFps, &maxFps);
   1694 
   1695     CDBG_HIGH("%s: FpsRange Values:(%d, %d)", __func__, prevMinFps, prevMaxFps);
   1696     CDBG_HIGH("%s: Requested FpsRange Values:(%d, %d)", __func__, minFps, maxFps);
   1697 
   1698     //first check if we need to change fps because of HFR mode change
   1699     updateNeeded = UpdateHFRFrameRate(params);
   1700     CDBG_HIGH("%s: UpdateHFRFrameRate %d", __func__, updateNeeded);
   1701 
   1702     vidMinFps = m_hfrFpsRange.video_min_fps;
   1703     vidMaxFps = m_hfrFpsRange.video_max_fps;
   1704 
   1705     if(minFps == prevMinFps && maxFps == prevMaxFps) {
   1706         if ( m_bFixedFrameRateSet ) {
   1707             minFps = params.getPreviewFrameRate() * 1000;
   1708             maxFps = params.getPreviewFrameRate() * 1000;
   1709             m_bFixedFrameRateSet = false;
   1710         } else if (!updateNeeded) {
   1711             CDBG_HIGH("%s: No change in FpsRange", __func__);
   1712             rc = NO_ERROR;
   1713             goto end;
   1714         }
   1715     }
   1716     for(int i = 0; i < m_pCapability->fps_ranges_tbl_cnt; i++) {
   1717         // if the value is in the supported list
   1718         if(minFps >= m_pCapability->fps_ranges_tbl[i].min_fps * 1000 &&
   1719            maxFps <= m_pCapability->fps_ranges_tbl[i].max_fps * 1000) {
   1720             found = true;
   1721             CDBG_HIGH("%s: FPS i=%d : minFps = %d, maxFps = %d"
   1722                     " vidMinFps = %d, vidMaxFps = %d",
   1723                     __func__, i, minFps, maxFps,
   1724                     (int)m_hfrFpsRange.video_min_fps,
   1725                     (int)m_hfrFpsRange.video_max_fps);
   1726             if ((m_hfrFpsRange.video_min_fps == 0) ||
   1727                     (m_hfrFpsRange.video_max_fps == 0)) {
   1728                 vidMinFps = minFps;
   1729                 vidMaxFps = maxFps;
   1730             }
   1731             else {
   1732                 vidMinFps = m_hfrFpsRange.video_min_fps;
   1733                 vidMaxFps = m_hfrFpsRange.video_max_fps;
   1734             }
   1735 
   1736             setPreviewFpsRange(minFps, maxFps, vidMinFps, vidMaxFps);
   1737             break;
   1738         }
   1739     }
   1740     if(found == false){
   1741         ALOGE("%s: error: FPS range value not supported", __func__);
   1742         rc = BAD_VALUE;
   1743     }
   1744 end:
   1745     return rc;
   1746 }
   1747 
   1748 /*===========================================================================
   1749  * FUNCTION   : UpdateHFRFrameRate
   1750  *
   1751  * DESCRIPTION: set preview FPS range based on HFR setting
   1752  *
   1753  * PARAMETERS :
   1754  *   @params  : user setting parameters
   1755  *
   1756  * RETURN     : bool true/false
   1757  *                  true -if HAL needs to overwrite FPS range set by app, false otherwise.
   1758  *==========================================================================*/
   1759 
   1760 bool QCameraParameters::UpdateHFRFrameRate(const QCameraParameters& params)
   1761 {
   1762     bool updateNeeded = false;
   1763     int min_fps, max_fps;
   1764     int32_t hfrMode = CAM_HFR_MODE_OFF;
   1765 
   1766     int parm_minfps,parm_maxfps;
   1767     int prevMinFps, prevMaxFps;
   1768     CameraParameters::getPreviewFpsRange(&prevMinFps, &prevMaxFps);
   1769     params.getPreviewFpsRange(&parm_minfps, &parm_maxfps);
   1770     CDBG_HIGH("%s: CameraParameters - : minFps = %d, maxFps = %d ",
   1771                 __func__, prevMinFps, prevMaxFps);
   1772     CDBG_HIGH("%s: Requested params - : minFps = %d, maxFps = %d ",
   1773                 __func__, parm_minfps, parm_maxfps);
   1774 
   1775     // check if HFR is enabled
   1776     const char *hfrStr = params.get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
   1777     const char *prev_hfrStr = get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
   1778     CDBG_HIGH("%s: prevHfrStr - %s, hfrStr = %s ",
   1779                 __func__, prev_hfrStr, hfrStr);
   1780     if(hfrStr != NULL){
   1781         hfrMode = lookupAttr(HFR_MODES_MAP,
   1782                                sizeof(HFR_MODES_MAP)/sizeof(QCameraMap),
   1783                                hfrStr);
   1784     }
   1785     // check if HSR is enabled
   1786     const char *hsrStr = params.get(KEY_QC_VIDEO_HIGH_SPEED_RECORDING);
   1787     const char *prev_hsrStr = get(KEY_QC_VIDEO_HIGH_SPEED_RECORDING);
   1788 
   1789     if (hsrStr != NULL && !strcmp(hsrStr, "on")) {
   1790         CDBG_HIGH("%s: HSR mode enabled ", __func__);
   1791         hfrMode = CAM_HFR_MODE_120FPS;
   1792     }
   1793 
   1794     // if HSR is made ON just now
   1795     if(hsrStr != NULL && (prev_hsrStr == NULL || (strcmp(hsrStr, prev_hsrStr))) &&
   1796         !strcmp(hsrStr, "on")) {
   1797         min_fps = 120000;
   1798         max_fps = 120000;
   1799         m_hfrFpsRange.video_min_fps = min_fps;
   1800         m_hfrFpsRange.video_max_fps = max_fps;
   1801 
   1802         CDBG_HIGH("%s: HFR mode change - Set FPS : minFps = %d, maxFps = %d ",
   1803                __func__,min_fps,max_fps);
   1804         updateNeeded = true;
   1805     }
   1806 
   1807     // else if HSR is made OFF just now or HSR is OFF for some time
   1808     // and HFR is changed just now
   1809     else if (hfrStr != NULL && ((prev_hfrStr == NULL || strcmp(hfrStr,prev_hfrStr)) ||
   1810         (hsrStr != NULL && (prev_hsrStr == NULL || strcmp(hsrStr, prev_hsrStr)))) &&
   1811         ((hsrStr != NULL && strcmp(hsrStr, "on"))|| hsrStr == NULL)) {
   1812         if (hfrMode != NAME_NOT_FOUND) {
   1813             // if HFR is enabled, change fps range
   1814             switch(hfrMode){
   1815                 case CAM_HFR_MODE_60FPS:
   1816                     min_fps = 60000;
   1817                     max_fps = 60000;
   1818                     break;
   1819                 case CAM_HFR_MODE_90FPS:
   1820                     min_fps = 90000;
   1821                     max_fps = 90000;
   1822                     break;
   1823                 case CAM_HFR_MODE_120FPS:
   1824                     min_fps = 120000;
   1825                     max_fps = 120000;
   1826                     break;
   1827                 case CAM_HFR_MODE_150FPS:
   1828                     min_fps = 150000;
   1829                     max_fps = 150000;
   1830                     break;
   1831                 case CAM_HFR_MODE_OFF:
   1832                 default:
   1833                     // Set Video Fps to zero
   1834                     min_fps = 0;
   1835                     max_fps = 0;
   1836                     break;
   1837             }
   1838             m_hfrFpsRange.video_min_fps = min_fps;
   1839             m_hfrFpsRange.video_max_fps = max_fps;
   1840 
   1841             CDBG_HIGH("%s: HFR mode (%d) Set video FPS : minFps = %d, maxFps = %d ",
   1842                    __func__, hfrMode, min_fps, max_fps);
   1843             // Signifies that there is a change in video FPS and need to set Fps
   1844             updateNeeded = true;
   1845         }
   1846     }
   1847     // Remember if HFR mode is ON
   1848     if ((hfrMode > CAM_HFR_MODE_OFF) && (hfrMode < CAM_HFR_MODE_MAX)){
   1849         CDBG_HIGH("HFR mode is ON");
   1850         m_bHfrMode = true;
   1851     }
   1852     else {
   1853         m_hfrFpsRange.video_min_fps = 0;
   1854         m_hfrFpsRange.video_max_fps = 0;
   1855         m_bHfrMode = false;
   1856         CDBG_HIGH("HFR mode is OFF");
   1857     }
   1858     return updateNeeded;
   1859 }
   1860 
   1861 /*===========================================================================
   1862  * FUNCTION   : setPreviewFrameRate
   1863  *
   1864  * DESCRIPTION: set preview frame rate from user setting
   1865  *
   1866  * PARAMETERS :
   1867  *   @params  : user setting parameters
   1868  *
   1869  * RETURN     : int32_t type of status
   1870  *              NO_ERROR  -- success
   1871  *              none-zero failure code
   1872  *==========================================================================*/
   1873 int32_t QCameraParameters::setPreviewFrameRate(const QCameraParameters& params)
   1874 {
   1875     const char *str = params.get(KEY_PREVIEW_FRAME_RATE);
   1876     const char *prev_str = get(KEY_PREVIEW_FRAME_RATE);
   1877 
   1878     if ( str ) {
   1879         if ( prev_str &&
   1880              strcmp(str, prev_str)) {
   1881             CDBG("%s: Requested Fixed Frame Rate %s", __func__, str);
   1882             updateParamEntry(KEY_PREVIEW_FRAME_RATE, str);
   1883             m_bFixedFrameRateSet = true;
   1884         }
   1885     }
   1886     return NO_ERROR;
   1887 }
   1888 
   1889 /*===========================================================================
   1890  * FUNCTION   : setEffect
   1891  *
   1892  * DESCRIPTION: set effect value from user setting
   1893  *
   1894  * PARAMETERS :
   1895  *   @params  : user setting parameters
   1896  *
   1897  * RETURN     : int32_t type of status
   1898  *              NO_ERROR  -- success
   1899  *              none-zero failure code
   1900  *==========================================================================*/
   1901 int32_t QCameraParameters::setEffect(const QCameraParameters& params)
   1902 {
   1903     const char *str = params.get(KEY_EFFECT);
   1904     const char *prev_str = get(KEY_EFFECT);
   1905     if (str != NULL) {
   1906         if (prev_str == NULL ||
   1907             strcmp(str, prev_str) != 0 ||
   1908             m_bUpdateEffects == true ) {
   1909             m_bUpdateEffects = false;
   1910             return setEffect(str);
   1911         }
   1912     }
   1913     return NO_ERROR;
   1914 }
   1915 
   1916 /*===========================================================================
   1917  * FUNCTION   : setFocusMode
   1918  *
   1919  * DESCRIPTION: set focus mode from user setting
   1920  *
   1921  * PARAMETERS :
   1922  *   @params  : user setting parameters
   1923  *
   1924  * RETURN     : int32_t type of status
   1925  *              NO_ERROR  -- success
   1926  *              none-zero failure code
   1927  *==========================================================================*/
   1928 int32_t QCameraParameters::setFocusMode(const QCameraParameters& params)
   1929 {
   1930     const char *str = params.get(KEY_FOCUS_MODE);
   1931     const char *prev_str = get(KEY_FOCUS_MODE);
   1932     if (str != NULL) {
   1933         if (prev_str == NULL ||
   1934             strcmp(str, prev_str) != 0) {
   1935             return setFocusMode(str);
   1936         }
   1937     }
   1938     return NO_ERROR;
   1939 }
   1940 
   1941 /*===========================================================================
   1942  * FUNCTION   : setBrightness
   1943  *
   1944  * DESCRIPTION: set brightness control value from user setting
   1945  *
   1946  * PARAMETERS :
   1947  *   @params  : user setting parameters
   1948  *
   1949  * RETURN     : int32_t type of status
   1950  *              NO_ERROR  -- success
   1951  *              none-zero failure code
   1952  *==========================================================================*/
   1953 int32_t QCameraParameters::setBrightness(const QCameraParameters& params)
   1954 {
   1955     int currentBrightness = getInt(KEY_QC_BRIGHTNESS);
   1956     int brightness = params.getInt(KEY_QC_BRIGHTNESS);
   1957 
   1958     if(params.get(KEY_QC_BRIGHTNESS) == NULL) {
   1959        CDBG_HIGH("%s: Brigtness not set by App ",__func__);
   1960        return NO_ERROR;
   1961     }
   1962     if (currentBrightness !=  brightness) {
   1963         if (brightness >= m_pCapability->brightness_ctrl.min_value &&
   1964             brightness <= m_pCapability->brightness_ctrl.max_value) {
   1965             CDBG(" new brightness value : %d ", brightness);
   1966             return setBrightness(brightness);
   1967         } else {
   1968             ALOGE("%s: invalid value %d out of (%d, %d)",
   1969                   __func__, brightness,
   1970                   m_pCapability->brightness_ctrl.min_value,
   1971                   m_pCapability->brightness_ctrl.max_value);
   1972             return BAD_VALUE;
   1973         }
   1974     } else {
   1975         CDBG("%s: No brightness value changed.", __func__);
   1976         return NO_ERROR;
   1977     }
   1978 }
   1979 
   1980 /*===========================================================================
   1981  * FUNCTION   : setSharpness
   1982  *
   1983  * DESCRIPTION: set sharpness control value from user setting
   1984  *
   1985  * PARAMETERS :
   1986  *   @params  : user setting parameters
   1987  *
   1988  * RETURN     : int32_t type of status
   1989  *              NO_ERROR  -- success
   1990  *              none-zero failure code
   1991  *==========================================================================*/
   1992 int32_t QCameraParameters::setSharpness(const QCameraParameters& params)
   1993 {
   1994     int shaprness = params.getInt(KEY_QC_SHARPNESS);
   1995     int prev_sharp = getInt(KEY_QC_SHARPNESS);
   1996 
   1997     if(params.get(KEY_QC_SHARPNESS) == NULL) {
   1998        CDBG_HIGH("%s: Sharpness not set by App ",__func__);
   1999        return NO_ERROR;
   2000     }
   2001     if (prev_sharp !=  shaprness) {
   2002         if((shaprness >= m_pCapability->sharpness_ctrl.min_value) &&
   2003            (shaprness <= m_pCapability->sharpness_ctrl.max_value)) {
   2004             CDBG(" new sharpness value : %d ", shaprness);
   2005             return setSharpness(shaprness);
   2006         } else {
   2007             ALOGE("%s: invalid value %d out of (%d, %d)",
   2008                   __func__, shaprness,
   2009                   m_pCapability->sharpness_ctrl.min_value,
   2010                   m_pCapability->sharpness_ctrl.max_value);
   2011             return BAD_VALUE;
   2012         }
   2013     } else {
   2014         CDBG("%s: No value change in shaprness", __func__);
   2015         return NO_ERROR;
   2016     }
   2017 }
   2018 
   2019 /*===========================================================================
   2020  * FUNCTION   : setSkintoneEnahancement
   2021  *
   2022  * DESCRIPTION: set skin tone enhancement factor from user setting
   2023  *
   2024  * PARAMETERS :
   2025  *   @params  : user setting parameters
   2026  *
   2027  * RETURN     : int32_t type of status
   2028  *              NO_ERROR  -- success
   2029  *              none-zero failure code
   2030  *==========================================================================*/
   2031 int32_t QCameraParameters::setSkinToneEnhancement(const QCameraParameters& params)
   2032 {
   2033     int sceFactor = params.getInt(KEY_QC_SCE_FACTOR);
   2034     int prev_sceFactor = getInt(KEY_QC_SCE_FACTOR);
   2035 
   2036     if(params.get(KEY_QC_SCE_FACTOR) == NULL) {
   2037        CDBG_HIGH("%s: Skintone enhancement not set by App ",__func__);
   2038        return NO_ERROR;
   2039     }
   2040     if (prev_sceFactor != sceFactor) {
   2041         if((sceFactor >= m_pCapability->sce_ctrl.min_value) &&
   2042            (sceFactor <= m_pCapability->sce_ctrl.max_value)) {
   2043             CDBG(" new Skintone Enhancement value : %d ", sceFactor);
   2044             return setSkinToneEnhancement(sceFactor);
   2045         } else {
   2046             ALOGE("%s: invalid value %d out of (%d, %d)",
   2047                   __func__, sceFactor,
   2048                   m_pCapability->sce_ctrl.min_value,
   2049                   m_pCapability->sce_ctrl.max_value);
   2050             return BAD_VALUE;
   2051         }
   2052     } else {
   2053         CDBG("%s: No value change in skintone enhancement factor", __func__);
   2054         return NO_ERROR;
   2055     }
   2056 }
   2057 
   2058 /*===========================================================================
   2059  * FUNCTION   : setSaturation
   2060  *
   2061  * DESCRIPTION: set saturation control value from user setting
   2062  *
   2063  * PARAMETERS :
   2064  *   @params  : user setting parameters
   2065  *
   2066  * RETURN     : int32_t type of status
   2067  *              NO_ERROR  -- success
   2068  *              none-zero failure code
   2069  *==========================================================================*/
   2070 int32_t QCameraParameters::setSaturation(const QCameraParameters& params)
   2071 {
   2072     int saturation = params.getInt(KEY_QC_SATURATION);
   2073     int prev_sat = getInt(KEY_QC_SATURATION);
   2074 
   2075     if(params.get(KEY_QC_SATURATION) == NULL) {
   2076        CDBG_HIGH("%s: Saturation not set by App ",__func__);
   2077        return NO_ERROR;
   2078     }
   2079     if (prev_sat !=  saturation) {
   2080         if((saturation >= m_pCapability->saturation_ctrl.min_value) &&
   2081            (saturation <= m_pCapability->saturation_ctrl.max_value)) {
   2082             CDBG(" new saturation value : %d ", saturation);
   2083             return setSaturation(saturation);
   2084         } else {
   2085             ALOGE("%s: invalid value %d out of (%d, %d)",
   2086                   __func__, saturation,
   2087                   m_pCapability->saturation_ctrl.min_value,
   2088                   m_pCapability->saturation_ctrl.max_value);
   2089             return BAD_VALUE;
   2090         }
   2091     } else {
   2092         CDBG("%s: No value change in saturation factor", __func__);
   2093         return NO_ERROR;
   2094     }
   2095 }
   2096 
   2097 /*===========================================================================
   2098  * FUNCTION   : setContrast
   2099  *
   2100  * DESCRIPTION: set contrast control value from user setting
   2101  *
   2102  * PARAMETERS :
   2103  *   @params  : user setting parameters
   2104  *
   2105  * RETURN     : int32_t type of status
   2106  *              NO_ERROR  -- success
   2107  *              none-zero failure code
   2108  *==========================================================================*/
   2109 int32_t QCameraParameters::setContrast(const QCameraParameters& params)
   2110 {
   2111     int contrast = params.getInt(KEY_QC_CONTRAST);
   2112     int prev_contrast = getInt(KEY_QC_CONTRAST);
   2113 
   2114     if(params.get(KEY_QC_CONTRAST) == NULL) {
   2115        CDBG_HIGH("%s: Contrast not set by App ",__func__);
   2116        return NO_ERROR;
   2117     }
   2118     if (prev_contrast !=  contrast) {
   2119         if((contrast >= m_pCapability->contrast_ctrl.min_value) &&
   2120            (contrast <= m_pCapability->contrast_ctrl.max_value)) {
   2121             CDBG(" new contrast value : %d ", contrast);
   2122             int32_t rc = setContrast(contrast);
   2123             return rc;
   2124         } else {
   2125             ALOGE("%s: invalid value %d out of (%d, %d)",
   2126                   __func__, contrast,
   2127                   m_pCapability->contrast_ctrl.min_value,
   2128                   m_pCapability->contrast_ctrl.max_value);
   2129             return BAD_VALUE;
   2130         }
   2131     } else {
   2132         CDBG("%s: No value change in contrast", __func__);
   2133         return NO_ERROR;
   2134     }
   2135 }
   2136 
   2137 /*===========================================================================
   2138  * FUNCTION   : setExposureCompensation
   2139  *
   2140  * DESCRIPTION: set exposure compensation value from user setting
   2141  *
   2142  * PARAMETERS :
   2143  *   @params  : user setting parameters
   2144  *
   2145  * RETURN     : int32_t type of status
   2146  *              NO_ERROR  -- success
   2147  *              none-zero failure code
   2148  *==========================================================================*/
   2149 int32_t QCameraParameters::setExposureCompensation(const QCameraParameters & params)
   2150 {
   2151     int expComp = params.getInt(KEY_EXPOSURE_COMPENSATION);
   2152     int prev_expComp = getInt(KEY_EXPOSURE_COMPENSATION);
   2153 
   2154     if(params.get(KEY_EXPOSURE_COMPENSATION) == NULL) {
   2155        CDBG_HIGH("%s: Exposure compensation not set by App ",__func__);
   2156        return NO_ERROR;
   2157     }
   2158     if (prev_expComp != expComp) {
   2159         if((expComp >= m_pCapability->exposure_compensation_min) &&
   2160            (expComp <= m_pCapability->exposure_compensation_max)) {
   2161             CDBG(" new Exposure Compensation value : %d ", expComp);
   2162             return setExposureCompensation(expComp);
   2163         } else {
   2164             ALOGE("%s: invalid value %d out of (%d, %d)",
   2165                   __func__, expComp,
   2166                   m_pCapability->exposure_compensation_min,
   2167                   m_pCapability->exposure_compensation_max);
   2168             return BAD_VALUE;
   2169         }
   2170     } else {
   2171         CDBG("%s: No value change in Exposure Compensation", __func__);
   2172         return NO_ERROR;
   2173     }
   2174 }
   2175 
   2176 /*===========================================================================
   2177  * FUNCTION   : setWhiteBalance
   2178  *
   2179  * DESCRIPTION: set white balance value from user setting
   2180  *
   2181  * PARAMETERS :
   2182  *   @params  : user setting parameters
   2183  *
   2184  * RETURN     : int32_t type of status
   2185  *              NO_ERROR  -- success
   2186  *              none-zero failure code
   2187  *==========================================================================*/
   2188 int32_t QCameraParameters::setWhiteBalance(const QCameraParameters& params)
   2189 {
   2190     const char *str = params.get(KEY_WHITE_BALANCE);
   2191     const char *prev_str = get(KEY_WHITE_BALANCE);
   2192     if (str != NULL) {
   2193         if (prev_str == NULL ||
   2194             strcmp(str, prev_str) != 0) {
   2195             return setWhiteBalance(str);
   2196         }
   2197     }
   2198     return NO_ERROR;
   2199 }
   2200 
   2201 /*===========================================================================
   2202  * FUNCTION   : setAntibanding
   2203  *
   2204  * DESCRIPTION: set antibanding value from user setting
   2205  *
   2206  * PARAMETERS :
   2207  *   @params  : user setting parameters
   2208  *
   2209  * RETURN     : int32_t type of status
   2210  *              NO_ERROR  -- success
   2211  *              none-zero failure code
   2212  *==========================================================================*/
   2213 int32_t QCameraParameters::setAntibanding(const QCameraParameters& params)
   2214 {
   2215     const char *str = params.get(KEY_ANTIBANDING);
   2216     const char *prev_str = get(KEY_ANTIBANDING);
   2217     if (str != NULL) {
   2218         if (prev_str == NULL ||
   2219             strcmp(str, prev_str) != 0) {
   2220             return setAntibanding(str);
   2221         }
   2222     }
   2223     return NO_ERROR;
   2224 }
   2225 
   2226 /*===========================================================================
   2227  * FUNCTION   : setStatsDebugMask
   2228  *
   2229  * DESCRIPTION: get the value from persist file in Stats module that will
   2230  *              control funtionality in the module
   2231  *
   2232  * PARAMETERS : none
   2233  *
   2234  * RETURN     : int32_t type of status
   2235  *              NO_ERROR  -- success
   2236  *              none-zero failure code
   2237  *==========================================================================*/
   2238 int32_t QCameraParameters::setStatsDebugMask()
   2239 {
   2240     uint32_t mask = 0;
   2241     char value[PROPERTY_VALUE_MAX];
   2242 
   2243     property_get("persist.camera.stats.debug.mask", value, "0");
   2244     mask = (uint32_t)atoi(value);
   2245 
   2246     CDBG_HIGH("%s: ctrl mask :%d", __func__, mask);
   2247 
   2248     return AddSetParmEntryToBatch(m_pParamBuf,
   2249                                   CAM_INTF_PARM_STATS_DEBUG_MASK,
   2250                                   sizeof(mask),
   2251                                   &mask);
   2252 }
   2253 
   2254 /*===========================================================================
   2255  * FUNCTION   : setPAAF
   2256  *
   2257  * DESCRIPTION: get the value from persist file in Stats module that will
   2258  *              control the preview assisted AF in the module
   2259  *
   2260  * PARAMETERS : none
   2261  *
   2262  * RETURN     : int32_t type of status
   2263  *              NO_ERROR  -- success
   2264  *              none-zero failure code
   2265  *==========================================================================*/
   2266 int32_t QCameraParameters::setPAAF()
   2267 {
   2268     uint32_t paaf = 0;
   2269     char value[PROPERTY_VALUE_MAX];
   2270 
   2271     property_get("persist.camera.stats.af.paaf", value, "1");
   2272     paaf = (uint32_t)atoi(value);
   2273 
   2274     ALOGE("%s: PAAF is: %s", __func__, paaf ? "ON": "OFF");
   2275 
   2276     return AddSetParmEntryToBatch(m_pParamBuf,
   2277                                   CAM_INTF_PARM_STATS_AF_PAAF,
   2278                                   sizeof(paaf),
   2279                                   &paaf);
   2280 }
   2281 
   2282 /*===========================================================================
   2283  * FUNCTION   : setSceneDetect
   2284  *
   2285  * DESCRIPTION: set scenen detect value from user setting
   2286  *
   2287  * PARAMETERS :
   2288  *   @params  : user setting parameters
   2289  *
   2290  * RETURN     : int32_t type of status
   2291  *              NO_ERROR  -- success
   2292  *              none-zero failure code
   2293  *==========================================================================*/
   2294 int32_t QCameraParameters::setSceneDetect(const QCameraParameters& params)
   2295 {
   2296     const char *str = params.get(KEY_QC_SCENE_DETECT);
   2297     const char *prev_str = get(KEY_QC_SCENE_DETECT);
   2298     if (str != NULL) {
   2299         if (prev_str == NULL ||
   2300             strcmp(str, prev_str) != 0) {
   2301             return setSceneDetect(str);
   2302         }
   2303     }
   2304     return NO_ERROR;
   2305 }
   2306 
   2307 /*===========================================================================
   2308  * FUNCTION   : setVideoHDR
   2309  *
   2310  * DESCRIPTION: set video HDR value from user setting
   2311  *
   2312  * PARAMETERS :
   2313  *   @params  : user setting parameters
   2314  *
   2315  * RETURN     : int32_t type of status
   2316  *              NO_ERROR  -- success
   2317  *              none-zero failure code
   2318  *==========================================================================*/
   2319 int32_t QCameraParameters::setVideoHDR(const QCameraParameters& params)
   2320 {
   2321     const char *str = params.get(KEY_QC_VIDEO_HDR);
   2322     const char *prev_str = get(KEY_QC_VIDEO_HDR);
   2323     if (str != NULL) {
   2324         if (prev_str == NULL ||
   2325             strcmp(str, prev_str) != 0) {
   2326             return setVideoHDR(str);
   2327         }
   2328     }
   2329     return NO_ERROR;
   2330 }
   2331 
   2332 /*===========================================================================
   2333  * FUNCTION   : setVtEnable
   2334  *
   2335  * DESCRIPTION: set vt Time Stamp enable from user setting
   2336  *
   2337  * PARAMETERS :
   2338  *   @params  : user setting parameters
   2339  *
   2340  * RETURN     : int32_t type of status
   2341  *              NO_ERROR  -- success
   2342  *              none-zero failure code
   2343  *==========================================================================*/
   2344 int32_t QCameraParameters::setVtEnable(const QCameraParameters& params)
   2345 {
   2346     const char *str = params.get(KEY_QC_VT_ENABLE);
   2347     const char *prev_str = get(KEY_QC_VT_ENABLE);
   2348     if (str != NULL) {
   2349         if (prev_str == NULL ||
   2350             strcmp(str, prev_str) != 0) {
   2351             return setVtEnable(str);
   2352         }
   2353     }
   2354     return NO_ERROR;
   2355 }
   2356 
   2357 /*===========================================================================
   2358  * FUNCTION   : setFaceRecognition
   2359  *
   2360  * DESCRIPTION: set face recognition mode from user setting
   2361  *
   2362  * PARAMETERS :
   2363  *   @params  : user setting parameters
   2364  *
   2365  * RETURN     : int32_t type of status
   2366  *              NO_ERROR  -- success
   2367  *              none-zero failure code
   2368  *==========================================================================*/
   2369 int32_t QCameraParameters::setFaceRecognition(const QCameraParameters& params)
   2370 {
   2371     const char *str = params.get(KEY_QC_FACE_RECOGNITION);
   2372     const char *prev_str = get(KEY_QC_FACE_RECOGNITION);
   2373     if (str != NULL) {
   2374         if (prev_str == NULL ||
   2375             strcmp(str, prev_str) != 0) {
   2376             int maxFaces = params.getInt(KEY_QC_MAX_NUM_REQUESTED_FACES);
   2377             return setFaceRecognition(str, maxFaces);
   2378         }
   2379     }
   2380     return NO_ERROR;
   2381 }
   2382 
   2383 /*===========================================================================
   2384  * FUNCTION   : setZoom
   2385  *
   2386  * DESCRIPTION: set zoom value from user setting
   2387  *
   2388  * PARAMETERS :
   2389  *   @params  : user setting parameters
   2390  *
   2391  * RETURN     : int32_t type of status
   2392  *              NO_ERROR  -- success
   2393  *              none-zero failure code
   2394  *==========================================================================*/
   2395 int32_t QCameraParameters::setZoom(const QCameraParameters& params)
   2396 {
   2397     if ((m_pCapability->zoom_supported == 0 ||
   2398          m_pCapability->zoom_ratio_tbl_cnt == 0)) {
   2399         CDBG_HIGH("%s: no zoom support", __func__);
   2400         return NO_ERROR;
   2401     }
   2402 
   2403     int zoomLevel = params.getInt(KEY_ZOOM);
   2404     if((zoomLevel < 0) ||
   2405        (zoomLevel >= m_pCapability->zoom_ratio_tbl_cnt)) {
   2406         ALOGE("%s: invalid value %d out of (%d, %d)",
   2407               __func__, zoomLevel,
   2408               0, m_pCapability->zoom_ratio_tbl_cnt-1);
   2409         return BAD_VALUE;
   2410     }
   2411 
   2412     int prevZoomLevel = getInt(KEY_ZOOM);
   2413     if (prevZoomLevel == zoomLevel) {
   2414         CDBG("%s: No value change in contrast", __func__);
   2415         return NO_ERROR;
   2416     }
   2417 
   2418     return setZoom(zoomLevel);
   2419 }
   2420 
   2421 /*===========================================================================
   2422  * FUNCTION   : setISOValue
   2423  *
   2424  * DESCRIPTION: set ISO value from user setting
   2425  *
   2426  * PARAMETERS :
   2427  *   @params  : user setting parameters
   2428  *
   2429  * RETURN     : int32_t type of status
   2430  *              NO_ERROR  -- success
   2431  *              none-zero failure code
   2432  *==========================================================================*/
   2433 int32_t  QCameraParameters::setISOValue(const QCameraParameters& params)
   2434 {
   2435     const char *str = params.get(KEY_QC_ISO_MODE);
   2436     const char *prev_str = get(KEY_QC_ISO_MODE);
   2437     if (str != NULL) {
   2438         if (prev_str == NULL ||
   2439             strcmp(str, prev_str) != 0) {
   2440             return setISOValue(str);
   2441         }
   2442     }
   2443     return NO_ERROR;
   2444 }
   2445 
   2446 /*===========================================================================
   2447  * FUNCTION   : setVideoRotation
   2448  *
   2449  * DESCRIPTION: set rotation value from user setting
   2450  *
   2451  * PARAMETERS :
   2452  *   @params  : user setting parameters
   2453  *
   2454  * RETURN     : int32_t type of status
   2455  *              NO_ERROR  -- success
   2456  *              none-zero failure code
   2457  *==========================================================================*/
   2458 int32_t QCameraParameters::setVideoRotation(const QCameraParameters& params)
   2459 {
   2460     int rotation = params.getInt(KEY_QC_VIDEO_ROTATION);
   2461     if (rotation != -1) {
   2462         if (rotation == 0 || rotation == 90 ||
   2463             rotation == 180 || rotation == 270) {
   2464             set(KEY_QC_VIDEO_ROTATION, rotation);
   2465         } else {
   2466             ALOGE("Invalid rotation value: %d", rotation);
   2467             return BAD_VALUE;
   2468         }
   2469     }
   2470     return NO_ERROR;
   2471 }
   2472 
   2473 /*===========================================================================
   2474  * FUNCTION   : setRotation
   2475  *
   2476  * DESCRIPTION: set rotation value from user setting
   2477  *
   2478  * PARAMETERS :
   2479  *   @params  : user setting parameters
   2480  *
   2481  * RETURN     : int32_t type of status
   2482  *              NO_ERROR  -- success
   2483  *              none-zero failure code
   2484  *==========================================================================*/
   2485 int32_t QCameraParameters::setRotation(const QCameraParameters& params)
   2486 {
   2487     int rotation = params.getInt(KEY_ROTATION);
   2488     if (rotation != -1) {
   2489         if (rotation == 0 || rotation == 90 ||
   2490             rotation == 180 || rotation == 270) {
   2491             set(KEY_ROTATION, rotation);
   2492         } else {
   2493             ALOGE("Invalid rotation value: %d", rotation);
   2494             return BAD_VALUE;
   2495         }
   2496     }
   2497     return NO_ERROR;
   2498 }
   2499 
   2500 /*===========================================================================
   2501  * FUNCTION   : setFlash
   2502  *
   2503  * DESCRIPTION: set flash mode from user setting
   2504  *
   2505  * PARAMETERS :
   2506  *   @params  : user setting parameters
   2507  *
   2508  * RETURN     : int32_t type of status
   2509  *              NO_ERROR  -- success
   2510  *              none-zero failure code
   2511  *==========================================================================*/
   2512 int32_t QCameraParameters::setFlash(const QCameraParameters& params)
   2513 {
   2514     const char *str = params.get(KEY_FLASH_MODE);
   2515     const char *prev_str = get(KEY_FLASH_MODE);
   2516     if (str != NULL) {
   2517         if (prev_str == NULL ||
   2518             strcmp(str, prev_str) != 0) {
   2519             return setFlash(str);
   2520         }
   2521     }
   2522     return NO_ERROR;
   2523 }
   2524 
   2525 /*===========================================================================
   2526  * FUNCTION   : setAecLock
   2527  *
   2528  * DESCRIPTION: set AEC lock value from user setting
   2529  *
   2530  * PARAMETERS :
   2531  *   @params  : user setting parameters
   2532  *
   2533  * RETURN     : int32_t type of status
   2534  *              NO_ERROR  -- success
   2535  *              none-zero failure code
   2536  *==========================================================================*/
   2537 int32_t QCameraParameters::setAecLock(const QCameraParameters& params)
   2538 {
   2539     const char *str = params.get(KEY_AUTO_EXPOSURE_LOCK);
   2540     const char *prev_str = get(KEY_AUTO_EXPOSURE_LOCK);
   2541     if (str != NULL) {
   2542         if (prev_str == NULL ||
   2543             strcmp(str, prev_str) != 0) {
   2544             return setAecLock(str);
   2545         }
   2546     }
   2547     return NO_ERROR;
   2548 }
   2549 
   2550 /*===========================================================================
   2551  * FUNCTION   : setAwbLock
   2552  *
   2553  * DESCRIPTION: set AWB lock from user setting
   2554  *
   2555  * PARAMETERS :
   2556  *   @params  : user setting parameters
   2557  *
   2558  * RETURN     : int32_t type of status
   2559  *              NO_ERROR  -- success
   2560  *              none-zero failure code
   2561  *==========================================================================*/
   2562 int32_t QCameraParameters::setAwbLock(const QCameraParameters& params)
   2563 {
   2564     const char *str = params.get(KEY_AUTO_WHITEBALANCE_LOCK);
   2565     const char *prev_str = get(KEY_AUTO_WHITEBALANCE_LOCK);
   2566     if (str != NULL) {
   2567         if (prev_str == NULL ||
   2568             strcmp(str, prev_str) != 0) {
   2569             return setAwbLock(str);
   2570         }
   2571     }
   2572     return NO_ERROR;
   2573 }
   2574 
   2575 /*===========================================================================
   2576  * FUNCTION   : setAutoHDR
   2577  *
   2578  * DESCRIPTION: Enable/disable auto HDR
   2579  *
   2580  * PARAMETERS :
   2581  *   @params  : user setting parameters
   2582  *
   2583  * RETURN     : int32_t type of status
   2584  *              NO_ERROR  -- success
   2585  *              none-zero failure code
   2586  *==========================================================================*/
   2587 int32_t QCameraParameters::setAutoHDR(const QCameraParameters& params)
   2588 {
   2589     const char *str = params.get(KEY_QC_AUTO_HDR_ENABLE);
   2590     const char *prev_str = get(KEY_QC_AUTO_HDR_ENABLE);
   2591     char prop[PROPERTY_VALUE_MAX];
   2592 
   2593     memset(prop, 0, sizeof(prop));
   2594     property_get("persist.camera.auto.hdr.enable", prop, VALUE_DISABLE);
   2595     if (str != NULL) {
   2596        if (prev_str == NULL ||
   2597            strcmp(str, prev_str) != 0) {
   2598            CDBG_HIGH("%s : Auto HDR set to: %s", __func__, str);
   2599            return updateParamEntry(KEY_QC_AUTO_HDR_ENABLE, str);
   2600        }
   2601     } else {
   2602        if (prev_str == NULL ||
   2603            strcmp(prev_str, prop) != 0 ) {
   2604            CDBG_HIGH("%s : Auto HDR set to: %s", __func__, prop);
   2605            updateParamEntry(KEY_QC_AUTO_HDR_ENABLE, prop);
   2606        }
   2607     }
   2608 
   2609        return NO_ERROR;
   2610 }
   2611 
   2612 /*===========================================================================
   2613 * FUNCTION   : isAutoHDREnabled
   2614 *
   2615 * DESCRIPTION: Query auto HDR status
   2616 *
   2617 * PARAMETERS : None
   2618 *
   2619 * RETURN     : bool true/false
   2620 *==========================================================================*/
   2621 bool QCameraParameters::isAutoHDREnabled()
   2622 {
   2623     const char *str = get(KEY_QC_AUTO_HDR_ENABLE);
   2624     if (str != NULL) {
   2625         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   2626                                    sizeof(ENABLE_DISABLE_MODES_MAP)/sizeof(QCameraMap),
   2627                                    str);
   2628         if (value == NAME_NOT_FOUND) {
   2629             ALOGE("%s: Invalid Auto HDR value %s", __func__, str);
   2630             return false;
   2631         }
   2632 
   2633         CDBG_HIGH("%s : Auto HDR status is: %d", __func__, value);
   2634         return value ? true : false;
   2635     }
   2636 
   2637     CDBG_HIGH("%s : Auto HDR status not set!", __func__);
   2638     return false;
   2639 }
   2640 
   2641 /*===========================================================================
   2642  * FUNCTION   : setMCEValue
   2643  *
   2644  * DESCRIPTION: set memory color enhancement value from user setting
   2645  *
   2646  * PARAMETERS :
   2647  *   @params  : user setting parameters
   2648  *
   2649  * RETURN     : int32_t type of status
   2650  *              NO_ERROR  -- success
   2651  *              none-zero failure code
   2652  *==========================================================================*/
   2653 int32_t QCameraParameters::setMCEValue(const QCameraParameters& params)
   2654 {
   2655     const char *str = params.get(KEY_QC_MEMORY_COLOR_ENHANCEMENT);
   2656     const char *prev_str = get(KEY_QC_MEMORY_COLOR_ENHANCEMENT);
   2657     if (str != NULL) {
   2658         if (prev_str == NULL ||
   2659             strcmp(str, prev_str) != 0) {
   2660             return setMCEValue(str);
   2661         }
   2662     }
   2663     return NO_ERROR;
   2664 }
   2665 
   2666 /*===========================================================================
   2667  * FUNCTION   : setDISValue
   2668  *
   2669  * DESCRIPTION: enable/disable DIS from user setting
   2670  *
   2671  * PARAMETERS :
   2672  *   @params  : user setting parameters
   2673  *
   2674  * RETURN     : int32_t type of status
   2675  *              NO_ERROR  -- success
   2676  *              none-zero failure code
   2677  *==========================================================================*/
   2678 int32_t QCameraParameters::setDISValue(const QCameraParameters& params)
   2679 {
   2680     const char *str = params.get(KEY_QC_DIS);
   2681     const char *prev_str = get(KEY_QC_DIS);
   2682     if (str != NULL) {
   2683         if (prev_str == NULL ||
   2684             strcmp(str, prev_str) != 0) {
   2685             return setDISValue(str);
   2686         }
   2687     }
   2688     return NO_ERROR;
   2689 }
   2690 
   2691 /*===========================================================================
   2692  * FUNCTION   : setHighFrameRate
   2693  *
   2694  * DESCRIPTION: set hight frame rate value from user setting
   2695  *
   2696  * PARAMETERS :
   2697  *   @params  : user setting parameters
   2698  *
   2699  * RETURN     : int32_t type of status
   2700  *              NO_ERROR  -- success
   2701  *              none-zero failure code
   2702  *==========================================================================*/
   2703 int32_t QCameraParameters::setHighFrameRate(const QCameraParameters& params)
   2704 {
   2705     const char *str = params.get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
   2706     const char *prev_str = get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
   2707     if (str != NULL) {
   2708         if (prev_str == NULL ||
   2709             strcmp(str, prev_str) != 0) {
   2710             return setHighFrameRate(str);
   2711         }
   2712     }
   2713     return NO_ERROR;
   2714 }
   2715 
   2716 /*===========================================================================
   2717  * FUNCTION   : setHighSpeedRecording
   2718  *
   2719  * DESCRIPTION: set high speed recording value from user setting
   2720  *
   2721  * PARAMETERS :
   2722  *   @params  : user setting parameters
   2723  *
   2724  * RETURN     : int32_t type of status
   2725  *              NO_ERROR  -- success
   2726  *              none-zero failure code
   2727  *==========================================================================*/
   2728 int32_t QCameraParameters::setHighSpeedRecording(const QCameraParameters& params)
   2729 {
   2730     const char *str = params.get(KEY_QC_VIDEO_HIGH_SPEED_RECORDING);
   2731     const char *prev_str = get(KEY_QC_VIDEO_HIGH_SPEED_RECORDING);
   2732     const char *hfr_str = params.get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
   2733     int32_t hfr_mode = CAM_HFR_MODE_OFF;
   2734     if (hfr_str != NULL) {
   2735         hfr_mode = lookupAttr(HFR_MODES_MAP,
   2736                 sizeof(HFR_MODES_MAP)/sizeof(QCameraMap),
   2737                 hfr_str);
   2738     }
   2739     if (str != NULL) {
   2740         if (prev_str == NULL ||
   2741             strcmp(str, prev_str) != 0) {
   2742             int32_t value;
   2743             // if HSR is off, take HFR fps value
   2744             if (!strcmp(str,"on")) value = CAM_HFR_MODE_120FPS;
   2745             else value = hfr_mode;
   2746             // HFR value changed, need to restart preview
   2747             m_bNeedRestart = true;
   2748             // Set HFR value
   2749             updateParamEntry(KEY_QC_VIDEO_HIGH_SPEED_RECORDING, str);
   2750             return AddSetParmEntryToBatch(m_pParamBuf,
   2751                                           CAM_INTF_PARM_HFR,
   2752                                           sizeof(value),
   2753                                           &value);
   2754         }
   2755     }
   2756     return NO_ERROR;
   2757 }
   2758 
   2759 /*===========================================================================
   2760  * FUNCTION   : setLensShadeValue
   2761  *
   2762  * DESCRIPTION: set lens shade value from user setting
   2763  *
   2764  * PARAMETERS :
   2765  *   @params  : user setting parameters
   2766  *
   2767  * RETURN     : int32_t type of status
   2768  *              NO_ERROR  -- success
   2769  *              none-zero failure code
   2770  *==========================================================================*/
   2771 int32_t QCameraParameters::setLensShadeValue(const QCameraParameters& params)
   2772 {
   2773     const char *str = params.get(KEY_QC_LENSSHADE);
   2774     const char *prev_str = get(KEY_QC_LENSSHADE);
   2775     if (str != NULL) {
   2776         if (prev_str == NULL ||
   2777             strcmp(str, prev_str) != 0) {
   2778             return setLensShadeValue(str);
   2779         }
   2780     }
   2781     return NO_ERROR;
   2782 }
   2783 
   2784 /*===========================================================================
   2785  * FUNCTION   : setFocusAreas
   2786  *
   2787  * DESCRIPTION: set focus areas from user setting
   2788  *
   2789  * PARAMETERS :
   2790  *   @params  : user setting parameters
   2791  *
   2792  * RETURN     : int32_t type of status
   2793  *              NO_ERROR  -- success
   2794  *              none-zero failure code
   2795  *==========================================================================*/
   2796 int32_t QCameraParameters::setFocusAreas(const QCameraParameters& params)
   2797 {
   2798     const char *str = params.get(KEY_FOCUS_AREAS);
   2799     if (str != NULL) {
   2800         int max_num_af_areas = getInt(KEY_MAX_NUM_FOCUS_AREAS);
   2801         if(max_num_af_areas == 0) {
   2802             ALOGE("%s: max num of AF area is 0, cannot set focus areas", __func__);
   2803             return BAD_VALUE;
   2804         }
   2805 
   2806         const char *prev_str = get(KEY_FOCUS_AREAS);
   2807         if (prev_str == NULL ||
   2808             strcmp(str, prev_str) != 0) {
   2809             return setFocusAreas(str);
   2810         }
   2811     }
   2812     return NO_ERROR;
   2813 }
   2814 
   2815 /*===========================================================================
   2816  * FUNCTION   : setMeteringAreas
   2817  *
   2818  * DESCRIPTION: set metering areas from user setting
   2819  *
   2820  * PARAMETERS :
   2821  *   @params  : user setting parameters
   2822  *
   2823  * RETURN     : int32_t type of status
   2824  *              NO_ERROR  -- success
   2825  *              none-zero failure code
   2826  *==========================================================================*/
   2827 int32_t QCameraParameters::setMeteringAreas(const QCameraParameters& params)
   2828 {
   2829     const char *str = params.get(KEY_METERING_AREAS);
   2830     if (str != NULL) {
   2831         int max_num_mtr_areas = getInt(KEY_MAX_NUM_METERING_AREAS);
   2832         if(max_num_mtr_areas == 0) {
   2833             ALOGE("%s: max num of metering areas is 0, cannot set focus areas", __func__);
   2834             return BAD_VALUE;
   2835         }
   2836 
   2837         const char *prev_str = get(KEY_METERING_AREAS);
   2838         if (prev_str == NULL ||
   2839             strcmp(str, prev_str) != 0) {
   2840             return setMeteringAreas(str);
   2841         }
   2842     }
   2843     return NO_ERROR;
   2844 }
   2845 
   2846 /*===========================================================================
   2847  * FUNCTION   : setSceneMode
   2848  *
   2849  * DESCRIPTION: set scenen mode from user setting
   2850  *
   2851  * PARAMETERS :
   2852  *   @params  : user setting parameters
   2853  *
   2854  * RETURN     : int32_t type of status
   2855  *              NO_ERROR  -- success
   2856  *              none-zero failure code
   2857  *==========================================================================*/
   2858 int32_t QCameraParameters::setSceneMode(const QCameraParameters& params)
   2859 {
   2860     const char *str = params.get(KEY_SCENE_MODE);
   2861     const char *prev_str = get(KEY_SCENE_MODE);
   2862     CDBG_HIGH("%s: str - %s, prev_str - %s",__func__, str, prev_str);
   2863 
   2864     if (str != NULL) {
   2865         if (prev_str == NULL ||
   2866             strcmp(str, prev_str) != 0) {
   2867 
   2868             if(strcmp(str, SCENE_MODE_AUTO) == 0) {
   2869                 m_bSceneTransitionAuto = true;
   2870             }
   2871             if (strcmp(str, SCENE_MODE_HDR) == 0) {
   2872                 // If HDR is set from client  and the feature is not enabled in the backend, ignore it.
   2873                 if (m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_SENSOR_HDR) {
   2874                     m_bSensorHDREnabled = true;
   2875                     CDBG_HIGH("%s: Sensor HDR mode Enabled",__func__);
   2876 
   2877                 }
   2878                 else if (m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_HDR) {
   2879                     m_bHDREnabled = true;
   2880                     CDBG_HIGH("%s: S/W HDR Enabled",__func__);
   2881                 }
   2882                 else {
   2883                     return NO_ERROR;
   2884                 }
   2885             } else {
   2886                 m_bHDREnabled = false;
   2887                 if (m_bSensorHDREnabled) {
   2888                     m_bSensorHDREnabled = false;
   2889                     m_bNeedRestart = true;
   2890                     setSensorSnapshotHDR("off");
   2891                 }
   2892             }
   2893 
   2894             if (m_bSensorHDREnabled) {
   2895                 setSensorSnapshotHDR("on");
   2896                 m_bNeedRestart = true;
   2897             } else if ((m_bHDREnabled) ||
   2898                 ((prev_str != NULL) && (strcmp(prev_str, SCENE_MODE_HDR) == 0))) {
   2899                 CDBG_HIGH("%s: scene mode changed between HDR and non-HDR, need restart", __func__);
   2900 
   2901                 m_bNeedRestart = true;
   2902                 // set if hdr 1x image is needed
   2903                 const char *need_hdr_1x = params.get(KEY_QC_HDR_NEED_1X);
   2904                 if (need_hdr_1x != NULL) {
   2905                     if (strcmp(need_hdr_1x, VALUE_TRUE) == 0) {
   2906                         m_bHDR1xFrameEnabled = true;
   2907                     } else {
   2908                         m_bHDR1xFrameEnabled = false;
   2909                     }
   2910 
   2911                     updateParamEntry(KEY_QC_HDR_NEED_1X, need_hdr_1x);
   2912                 }
   2913 
   2914                 AddSetParmEntryToBatch(m_pParamBuf,
   2915                                        CAM_INTF_PARM_HDR_NEED_1X,
   2916                                        sizeof(m_bHDR1xFrameEnabled),
   2917                                        &m_bHDR1xFrameEnabled);
   2918             }
   2919 
   2920             return setSceneMode(str);
   2921         }
   2922     }
   2923     return NO_ERROR;
   2924 }
   2925 
   2926 /*===========================================================================
   2927  * FUNCTION   : setSelectableZoneAf
   2928  *
   2929  * DESCRIPTION: set selectable zone auto focus value from user setting
   2930  *
   2931  * PARAMETERS :
   2932  *   @params  : user setting parameters
   2933  *
   2934  * RETURN     : int32_t type of status
   2935  *              NO_ERROR  -- success
   2936  *              none-zero failure code
   2937  *==========================================================================*/
   2938 int32_t QCameraParameters::setSelectableZoneAf(const QCameraParameters& params)
   2939 {
   2940     const char *str = params.get(KEY_QC_SELECTABLE_ZONE_AF);
   2941     const char *prev_str = get(KEY_QC_SELECTABLE_ZONE_AF);
   2942     if (str != NULL) {
   2943         if (prev_str == NULL ||
   2944             strcmp(str, prev_str) != 0) {
   2945             return setSelectableZoneAf(str);
   2946         }
   2947     }
   2948     return NO_ERROR;
   2949 }
   2950 
   2951 /*===========================================================================
   2952  * FUNCTION   : setAEBracket
   2953  *
   2954  * DESCRIPTION: set AE bracket from user setting
   2955  *
   2956  * PARAMETERS :
   2957  *   @params  : user setting parameters
   2958  *
   2959  * RETURN     : int32_t type of status
   2960  *              NO_ERROR  -- success
   2961  *              none-zero failure code
   2962  *==========================================================================*/
   2963 int32_t QCameraParameters::setAEBracket(const QCameraParameters& params)
   2964 {
   2965     if (isHDREnabled()) {
   2966         CDBG_HIGH("%s: scene mode is HDR, overwrite AE bracket setting to off", __func__);
   2967         return setAEBracket(AE_BRACKET_OFF);
   2968     }
   2969 
   2970     const char *expStr = params.get(KEY_QC_CAPTURE_BURST_EXPOSURE);
   2971     if (NULL != expStr && strlen(expStr) > 0) {
   2972         set(KEY_QC_CAPTURE_BURST_EXPOSURE, expStr);
   2973     } else {
   2974         char prop[PROPERTY_VALUE_MAX];
   2975         memset(prop, 0, sizeof(prop));
   2976         property_get("persist.capture.burst.exposures", prop, "");
   2977         if (strlen(prop) > 0) {
   2978             set(KEY_QC_CAPTURE_BURST_EXPOSURE, prop);
   2979         } else {
   2980             remove(KEY_QC_CAPTURE_BURST_EXPOSURE);
   2981         }
   2982     }
   2983 
   2984     const char *str = params.get(KEY_QC_AE_BRACKET_HDR);
   2985     const char *prev_str = get(KEY_QC_AE_BRACKET_HDR);
   2986     if (str != NULL) {
   2987         if (prev_str == NULL ||
   2988             strcmp(str, prev_str) != 0) {
   2989             return setAEBracket(str);
   2990         }
   2991     }
   2992     return NO_ERROR;
   2993 }
   2994 
   2995 /*===========================================================================
   2996  * FUNCTION   : setAFBracket
   2997  *
   2998  * DESCRIPTION: set AF bracket from user setting
   2999  *
   3000  * PARAMETERS :
   3001  *   @params  : user setting parameters
   3002  *
   3003  * RETURN     : int32_t type of status
   3004  *              NO_ERROR  -- success
   3005  *              none-zero failure code
   3006  *==========================================================================*/
   3007 int32_t QCameraParameters::setAFBracket(const QCameraParameters& params)
   3008 {
   3009     if ((m_pCapability->qcom_supported_feature_mask &
   3010         CAM_QCOM_FEATURE_UBIFOCUS) == 0){
   3011         CDBG_HIGH("%s: AF Bracketing is not supported",__func__);
   3012         return NO_ERROR;
   3013     }
   3014     const char *str = params.get(KEY_QC_AF_BRACKET);
   3015     const char *prev_str = get(KEY_QC_AF_BRACKET);
   3016     CDBG_HIGH("%s: str =%s & prev_str =%s",__func__, str, prev_str);
   3017     if (str != NULL) {
   3018         if (prev_str == NULL ||
   3019             strcmp(str, prev_str) != 0) {
   3020             m_bNeedRestart = true;
   3021             return setAFBracket(str);
   3022         }
   3023     }
   3024     return NO_ERROR;
   3025 }
   3026 
   3027 /*===========================================================================
   3028  * FUNCTION   : setChromaFlash
   3029  *
   3030  * DESCRIPTION: set chroma flash from user setting
   3031  *
   3032  * PARAMETERS :
   3033  *   @params  : user setting parameters
   3034  *
   3035  * RETURN     : int32_t type of status
   3036  *              NO_ERROR  -- success
   3037  *              none-zero failure code
   3038  *==========================================================================*/
   3039 int32_t QCameraParameters::setChromaFlash(const QCameraParameters& params)
   3040 {
   3041     if ((m_pCapability->qcom_supported_feature_mask &
   3042         CAM_QCOM_FEATURE_CHROMA_FLASH) == 0) {
   3043         CDBG_HIGH("%s: Chroma Flash is not supported",__func__);
   3044         return NO_ERROR;
   3045     }
   3046     const char *str = params.get(KEY_QC_CHROMA_FLASH);
   3047     const char *prev_str = get(KEY_QC_CHROMA_FLASH);
   3048     CDBG_HIGH("%s: str =%s & prev_str =%s",__func__, str, prev_str);
   3049     if (str != NULL) {
   3050         if (prev_str == NULL ||
   3051             strcmp(str, prev_str) != 0) {
   3052             m_bNeedRestart = true;
   3053             return setChromaFlash(str);
   3054         }
   3055     }
   3056     return NO_ERROR;
   3057 }
   3058 
   3059 /*===========================================================================
   3060  * FUNCTION   : setOptiZoom
   3061  *
   3062  * DESCRIPTION: set opti zoom from user setting
   3063  *
   3064  * PARAMETERS :
   3065  *   @params  : user setting parameters
   3066  *
   3067  * RETURN     : int32_t type of status
   3068  *              NO_ERROR  -- success
   3069  *              none-zero failure code
   3070  *==========================================================================*/
   3071 int32_t QCameraParameters::setOptiZoom(const QCameraParameters& params)
   3072 {
   3073     if ((m_pCapability->qcom_supported_feature_mask &
   3074         CAM_QCOM_FEATURE_OPTIZOOM) == 0){
   3075         CDBG_HIGH("%s: Opti Zoom is not supported",__func__);
   3076         return NO_ERROR;
   3077     }
   3078     const char *str = params.get(KEY_QC_OPTI_ZOOM);
   3079     const char *prev_str = get(KEY_QC_OPTI_ZOOM);
   3080     CDBG_HIGH("%s: str =%s & prev_str =%s",__func__, str, prev_str);
   3081     if (str != NULL) {
   3082         if (prev_str == NULL ||
   3083             strcmp(str, prev_str) != 0) {
   3084             m_bNeedRestart = true;
   3085             return setOptiZoom(str);
   3086         }
   3087     }
   3088     return NO_ERROR;
   3089 }
   3090 
   3091 
   3092 /*===========================================================================
   3093  * FUNCTION   : setRedeyeReduction
   3094  *
   3095  * DESCRIPTION: set red eye reduction setting from user setting
   3096  *
   3097  * PARAMETERS :
   3098  *   @params  : user setting parameters
   3099  *
   3100  * RETURN     : int32_t type of status
   3101  *              NO_ERROR  -- success
   3102  *              none-zero failure code
   3103  *==========================================================================*/
   3104 int32_t QCameraParameters::setRedeyeReduction(const QCameraParameters& params)
   3105 {
   3106     const char *str = params.get(KEY_QC_REDEYE_REDUCTION);
   3107     const char *prev_str = get(KEY_QC_REDEYE_REDUCTION);
   3108     if (str != NULL) {
   3109         if (prev_str == NULL ||
   3110             strcmp(str, prev_str) != 0) {
   3111             return setRedeyeReduction(str);
   3112         }
   3113     }
   3114     return NO_ERROR;
   3115 }
   3116 
   3117 /*===========================================================================
   3118  * FUNCTION   : setGpsLocation
   3119  *
   3120  * DESCRIPTION: set GPS location information from user setting
   3121  *
   3122  * PARAMETERS :
   3123  *   @params  : user setting parameters
   3124  *
   3125  * RETURN     : int32_t type of status
   3126  *              NO_ERROR  -- success
   3127  *              none-zero failure code
   3128  *==========================================================================*/
   3129 int32_t QCameraParameters::setGpsLocation(const QCameraParameters& params)
   3130 {
   3131     const char *method = params.get(KEY_GPS_PROCESSING_METHOD);
   3132     if (method) {
   3133         set(KEY_GPS_PROCESSING_METHOD, method);
   3134     }else {
   3135         remove(KEY_GPS_PROCESSING_METHOD);
   3136     }
   3137 
   3138     const char *latitude = params.get(KEY_GPS_LATITUDE);
   3139     if (latitude) {
   3140         set(KEY_GPS_LATITUDE, latitude);
   3141     }else {
   3142         remove(KEY_GPS_LATITUDE);
   3143     }
   3144 
   3145     const char *latitudeRef = params.get(KEY_QC_GPS_LATITUDE_REF);
   3146     if (latitudeRef) {
   3147         set(KEY_QC_GPS_LATITUDE_REF, latitudeRef);
   3148     }else {
   3149         remove(KEY_QC_GPS_LATITUDE_REF);
   3150     }
   3151 
   3152     const char *longitude = params.get(KEY_GPS_LONGITUDE);
   3153     if (longitude) {
   3154         set(KEY_GPS_LONGITUDE, longitude);
   3155     }else {
   3156         remove(KEY_GPS_LONGITUDE);
   3157     }
   3158 
   3159     const char *longitudeRef = params.get(KEY_QC_GPS_LONGITUDE_REF);
   3160     if (longitudeRef) {
   3161         set(KEY_QC_GPS_LONGITUDE_REF, longitudeRef);
   3162     }else {
   3163         remove(KEY_QC_GPS_LONGITUDE_REF);
   3164     }
   3165 
   3166     const char *altitudeRef = params.get(KEY_QC_GPS_ALTITUDE_REF);
   3167     if (altitudeRef) {
   3168         set(KEY_QC_GPS_ALTITUDE_REF, altitudeRef);
   3169     }else {
   3170         remove(KEY_QC_GPS_ALTITUDE_REF);
   3171     }
   3172 
   3173     const char *altitude = params.get(KEY_GPS_ALTITUDE);
   3174     if (altitude) {
   3175         set(KEY_GPS_ALTITUDE, altitude);
   3176     }else {
   3177         remove(KEY_GPS_ALTITUDE);
   3178     }
   3179 
   3180     const char *status = params.get(KEY_QC_GPS_STATUS);
   3181     if (status) {
   3182         set(KEY_QC_GPS_STATUS, status);
   3183     } else {
   3184         remove(KEY_QC_GPS_STATUS);
   3185     }
   3186 
   3187     const char *timestamp = params.get(KEY_GPS_TIMESTAMP);
   3188     if (timestamp) {
   3189         set(KEY_GPS_TIMESTAMP, timestamp);
   3190     }else {
   3191         remove(KEY_GPS_TIMESTAMP);
   3192     }
   3193     return NO_ERROR;
   3194 }
   3195 
   3196 /*===========================================================================
   3197  * FUNCTION   : setNumOfSnapshot
   3198  *
   3199  * DESCRIPTION: set number of snapshot per shutter from user setting
   3200  *
   3201  * PARAMETERS : none
   3202  *
   3203  * RETURN     : int32_t type of status
   3204  *              NO_ERROR  -- success
   3205  *              none-zero failure code
   3206  *==========================================================================*/
   3207 int32_t QCameraParameters::setNumOfSnapshot()
   3208 {
   3209     int nBurstNum = getBurstNum();
   3210     uint8_t nExpnum = 0;
   3211 
   3212     const char *bracket_str = get(KEY_QC_AE_BRACKET_HDR);
   3213     if (bracket_str != NULL && strlen(bracket_str) > 0) {
   3214         int value = lookupAttr(BRACKETING_MODES_MAP,
   3215                                sizeof(BRACKETING_MODES_MAP)/sizeof(QCameraMap),
   3216                                bracket_str);
   3217         switch (value) {
   3218         case CAM_EXP_BRACKETING_ON:
   3219             {
   3220                 nExpnum = 0;
   3221                 const char *str_val = get(KEY_QC_CAPTURE_BURST_EXPOSURE);
   3222                 if ((str_val != NULL) && (strlen(str_val) > 0)) {
   3223                     char prop[PROPERTY_VALUE_MAX];
   3224                     memset(prop, 0, sizeof(prop));
   3225                     strcpy(prop, str_val);
   3226                     char *saveptr = NULL;
   3227                     char *token = strtok_r(prop, ",", &saveptr);
   3228                     while (token != NULL) {
   3229                         token = strtok_r(NULL, ",", &saveptr);
   3230                         nExpnum++;
   3231                     }
   3232                 }
   3233                 if (nExpnum == 0) {
   3234                     nExpnum = 1;
   3235                 }
   3236             }
   3237             break;
   3238         default:
   3239             nExpnum = 1 + getNumOfExtraHDROutBufsIfNeeded();
   3240             break;
   3241         }
   3242     }
   3243 
   3244     CDBG_HIGH("%s: nBurstNum = %d, nExpnum = %d", __func__, nBurstNum, nExpnum);
   3245     set(KEY_QC_NUM_SNAPSHOT_PER_SHUTTER, nBurstNum * nExpnum);
   3246     return NO_ERROR;
   3247 }
   3248 
   3249 /*===========================================================================
   3250  * FUNCTION   : setRecordingHint
   3251  *
   3252  * DESCRIPTION: set recording hint value from user setting
   3253  *
   3254  * PARAMETERS :
   3255  *   @params  : user setting parameters
   3256  *
   3257  * RETURN     : int32_t type of status
   3258  *              NO_ERROR  -- success
   3259  *              none-zero failure code
   3260  *==========================================================================*/
   3261 int32_t QCameraParameters::setRecordingHint(const QCameraParameters& params)
   3262 {
   3263     const char * str = params.get(KEY_RECORDING_HINT);
   3264     const char *prev_str = get(KEY_RECORDING_HINT);
   3265     if (str != NULL) {
   3266         if (prev_str == NULL || strcmp(str, prev_str) != 0) {
   3267             int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP,
   3268                                        sizeof(TRUE_FALSE_MODES_MAP)/sizeof(QCameraMap),
   3269                                        str);
   3270             if(value != NAME_NOT_FOUND){
   3271                 updateParamEntry(KEY_RECORDING_HINT, str);
   3272                 setRecordingHintValue(value);
   3273                 if (getFaceDetectionOption() == true) {
   3274                     setFaceDetection(value > 0 ? false : true, false);
   3275                 }
   3276                 return NO_ERROR;
   3277             } else {
   3278                 ALOGE("Invalid recording hint value: %s", str);
   3279                 return BAD_VALUE;
   3280             }
   3281         }
   3282     }
   3283     return NO_ERROR;
   3284 }
   3285 
   3286 /*===========================================================================
   3287  * FUNCTION   : setNoDisplayMode
   3288  *
   3289  * DESCRIPTION: set no display mode from user setting
   3290  *
   3291  * PARAMETERS :
   3292  *   @params  : user setting parameters
   3293  *
   3294  * RETURN     : int32_t type of status
   3295  *              NO_ERROR  -- success
   3296  *              none-zero failure code
   3297  *==========================================================================*/
   3298 int32_t QCameraParameters::setNoDisplayMode(const QCameraParameters& params)
   3299 {
   3300     const char *str_val  = params.get(KEY_QC_NO_DISPLAY_MODE);
   3301     const char *prev_str = get(KEY_QC_NO_DISPLAY_MODE);
   3302     if(str_val && strlen(str_val) > 0) {
   3303         if (prev_str == NULL || strcmp(str_val, prev_str) != 0) {
   3304             m_bNoDisplayMode = atoi(str_val);
   3305             set(KEY_QC_NO_DISPLAY_MODE, str_val);
   3306             m_bNeedRestart = true;
   3307         }
   3308     } else {
   3309         m_bNoDisplayMode = false;
   3310     }
   3311     CDBG_HIGH("Param m_bNoDisplayMode = %d", m_bNoDisplayMode);
   3312     return NO_ERROR;
   3313 }
   3314 
   3315 /*===========================================================================
   3316  * FUNCTION   : setZslMode
   3317  *
   3318  * DESCRIPTION: set ZSL mode from user setting
   3319  *
   3320  * PARAMETERS :
   3321  *   @params  : user setting parameters
   3322  *
   3323  * RETURN     : int32_t type of status
   3324  *              NO_ERROR  -- success
   3325  *              none-zero failure code
   3326  *==========================================================================*/
   3327 int32_t QCameraParameters::setZslMode(const QCameraParameters& params)
   3328 {
   3329     const char *str_val  = params.get(KEY_QC_ZSL);
   3330     const char *prev_val  = get(KEY_QC_ZSL);
   3331 
   3332     if (str_val != NULL) {
   3333         if (prev_val == NULL || strcmp(str_val, prev_val) != 0) {
   3334             int32_t value = lookupAttr(ON_OFF_MODES_MAP,
   3335                                        sizeof(ON_OFF_MODES_MAP)/sizeof(QCameraMap),
   3336                                        str_val);
   3337             if (value != NAME_NOT_FOUND) {
   3338                 set(KEY_QC_ZSL, str_val);
   3339                 m_bZslMode_new = (value > 0)? true : false;
   3340 
   3341                 // ZSL mode changed, need restart preview
   3342                 m_bNeedRestart = true;
   3343 
   3344                 return AddSetParmEntryToBatch(m_pParamBuf,
   3345                                               CAM_INTF_PARM_ZSL_MODE,
   3346                                               sizeof(value),
   3347                                               &value);
   3348             } else {
   3349                 ALOGE("Invalid ZSL mode value: %s", str_val);
   3350                 return BAD_VALUE;
   3351             }
   3352         }
   3353     }
   3354     return NO_ERROR;
   3355 }
   3356 
   3357 /*===========================================================================
   3358  * FUNCTION   : setWaveletDenoise
   3359  *
   3360  * DESCRIPTION: set wavelet denoise value from user setting
   3361  *
   3362  * PARAMETERS :
   3363  *   @params  : user setting parameters
   3364  *
   3365  * RETURN     : int32_t type of status
   3366  *              NO_ERROR  -- success
   3367  *              none-zero failure code
   3368  *==========================================================================*/
   3369 int32_t QCameraParameters::setWaveletDenoise(const QCameraParameters& params)
   3370 {
   3371     const char *str_pf = params.getPictureFormat();
   3372     int32_t pictureFormat =
   3373         lookupAttr(PICTURE_TYPES_MAP,
   3374                    sizeof(PICTURE_TYPES_MAP) / sizeof(QCameraMap),
   3375                    str_pf);
   3376     if (pictureFormat != NAME_NOT_FOUND) {
   3377         if (CAM_FORMAT_YUV_422_NV16 == pictureFormat) {
   3378             ALOGE("NV16 format isn't supported in denoise lib!");
   3379             return setWaveletDenoise(DENOISE_OFF);
   3380         }
   3381     }
   3382     const char *str = params.get(KEY_QC_DENOISE);
   3383     const char *prev_str = get(KEY_QC_DENOISE);
   3384     if (str != NULL) {
   3385         if (prev_str == NULL ||
   3386             strcmp(str, prev_str) != 0) {
   3387             return setWaveletDenoise(str);
   3388         }
   3389     }
   3390     return NO_ERROR;
   3391 }
   3392 
   3393 /*===========================================================================
   3394  * FUNCTION   : setCameraMode
   3395  *
   3396  * DESCRIPTION: set camera mode from user setting
   3397  *
   3398  * PARAMETERS :
   3399  *   @params  : user setting parameters
   3400  *
   3401  * RETURN     : int32_t type of status
   3402  *              NO_ERROR  -- success
   3403  *              none-zero failure code
   3404  *==========================================================================*/
   3405 int32_t QCameraParameters::setCameraMode(const QCameraParameters& params)
   3406 {
   3407     const char *str = params.get(KEY_QC_CAMERA_MODE);
   3408     if (str != NULL) {
   3409         set(KEY_QC_CAMERA_MODE, str);
   3410     } else {
   3411         remove(KEY_QC_CAMERA_MODE);
   3412     }
   3413     return NO_ERROR;
   3414 }
   3415 
   3416 /*===========================================================================
   3417  * FUNCTION   : setSceneSelectionMode
   3418  *
   3419  * DESCRIPTION: set scene selection mode from user setting
   3420  *
   3421  * PARAMETERS :
   3422  *   @params  : user setting parameters
   3423  *
   3424  * RETURN     : int32_t type of status
   3425  *              NO_ERROR  -- success
   3426  *              none-zero failure code
   3427  *==========================================================================*/
   3428 int32_t QCameraParameters::setSceneSelectionMode(const QCameraParameters& params)
   3429 {
   3430     const char *str = params.get(KEY_QC_SCENE_SELECTION);
   3431     const char *prev_str = get(KEY_QC_SCENE_SELECTION);
   3432     if (NULL != str) {
   3433         if ((NULL == prev_str) || (strcmp(str, prev_str) != 0)) {
   3434             int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   3435                     sizeof(ENABLE_DISABLE_MODES_MAP)/sizeof(QCameraMap),
   3436                     str);
   3437             if (value != NAME_NOT_FOUND) {
   3438                 ALOGD("%s: Setting selection value %s", __func__, str);
   3439                 if (value && m_bZslMode_new) {
   3440                     updateParamEntry(KEY_QC_SCENE_SELECTION, str);
   3441                     m_bNeedRestart = true;
   3442                     m_bSceneSelection = true;
   3443                 } else if (!value) {
   3444                     updateParamEntry(KEY_QC_SCENE_SELECTION, str);
   3445                     m_bNeedRestart = true;
   3446                     m_bSceneSelection = false;
   3447                 } else {
   3448                     ALOGE("%s: Trying to enable scene selection in non ZSL mode!!!",
   3449                             __func__);
   3450                     return BAD_VALUE;
   3451                 }
   3452             } else {
   3453                 ALOGE("%s: Trying to configure invalid scene selection value: %s",
   3454                         __func__,
   3455                         str);
   3456                 return BAD_VALUE;
   3457             }
   3458         }
   3459     }
   3460 
   3461     return NO_ERROR;
   3462 }
   3463 
   3464 /*===========================================================================
   3465  * FUNCTION   : setSelectedScene
   3466  *
   3467  * DESCRIPTION: select specific scene
   3468  *
   3469  * PARAMETERS :
   3470  *   @scene   : scene mode
   3471  *
   3472  * RETURN     : int32_t type of status
   3473  *              NO_ERROR  -- success
   3474  *              none-zero failure code
   3475  *==========================================================================*/
   3476 int32_t QCameraParameters::setSelectedScene(cam_scene_mode_type scene)
   3477 {
   3478     Mutex::Autolock l(m_SceneSelectLock);
   3479     m_SelectedScene = scene;
   3480     return NO_ERROR;
   3481 }
   3482 
   3483 /*===========================================================================
   3484  * FUNCTION   : getSelectedScene
   3485  *
   3486  * DESCRIPTION: get selected scene
   3487  *
   3488  * PARAMETERS :
   3489  *
   3490  * RETURN     : currently selected scene
   3491  *==========================================================================*/
   3492 cam_scene_mode_type QCameraParameters::getSelectedScene()
   3493 {
   3494     Mutex::Autolock l(m_SceneSelectLock);
   3495     return m_SelectedScene;
   3496 }
   3497 
   3498 /*==========================================================
   3499  * FUNCTION   : setRdiMode
   3500  *
   3501  * DESCRIPTION: set Rdi mode from user setting
   3502  *
   3503  * PARAMETERS :
   3504  *   @params  : user setting parameters
   3505  *
   3506  * RETURN     : int32_t type of status
   3507  *              NO_ERROR  -- success
   3508  *              none-zero failure code
   3509  *===========================================================*/
   3510 int32_t QCameraParameters::setRdiMode(const QCameraParameters& params)
   3511 {
   3512     const char *str = params.get(KEY_QC_RDI_MODE);
   3513     const char *prev_str = get(KEY_QC_RDI_MODE);
   3514     char prop[PROPERTY_VALUE_MAX];
   3515     memset(prop, 0, sizeof(prop));
   3516 
   3517     property_get("persist.camera.rdi.mode", prop, VALUE_DISABLE);
   3518     if ((str != NULL) && (prev_str == NULL || strcmp(str, prev_str) != 0)) {
   3519         ALOGD("%s:%d : RDI mode set to %s", __func__, __LINE__, str);
   3520         setRdiMode(str);
   3521     } else if (prev_str == NULL || strcmp(prev_str, prop) != 0 ) {
   3522         ALOGD("%s:%d : RDI mode set to prop: %s", __func__, __LINE__, prop);
   3523         setRdiMode(prop);
   3524     }
   3525     return NO_ERROR;
   3526 }
   3527 
   3528 /*==========================================================
   3529  * FUNCTION   : setSecureMode
   3530  *
   3531  * DESCRIPTION: set secure mode from user setting
   3532  *
   3533  * PARAMETERS :
   3534  *   @params  : user setting parameters
   3535  *
   3536  * RETURN     : int32_t type of status
   3537  *              NO_ERROR  -- success
   3538  *              none-zero failure code
   3539  *===========================================================*/
   3540 
   3541 int32_t QCameraParameters::setSecureMode(
   3542   const QCameraParameters& params)
   3543 {
   3544     const char *str = params.get(KEY_QC_SECURE_MODE);
   3545     const char *prev_str = get(KEY_QC_SECURE_MODE);
   3546     char prop[PROPERTY_VALUE_MAX];
   3547     memset(prop, 0, sizeof(prop));
   3548 
   3549     property_get("persist.camera.secure.mode", prop, VALUE_DISABLE);
   3550     if ((str != NULL) && (prev_str == NULL || strcmp(str, prev_str) != 0)) {
   3551         ALOGD("%s : Secure mode set to KEY: %s", __func__, str);
   3552         setSecureMode(str);
   3553     } else if (prev_str == NULL || strcmp(prev_str, prop) != 0 ) {
   3554         ALOGD("%s : Secure mode set to prop: %s", __func__, prop);
   3555         setSecureMode(prop);
   3556     }
   3557     return NO_ERROR;
   3558 }
   3559 
   3560 /*===========================================================================
   3561  * FUNCTION   : setZslAttributes
   3562  *
   3563  * DESCRIPTION: set ZSL related attributes from user setting
   3564  *
   3565  * PARAMETERS :
   3566  *   @params  : user setting parameters
   3567  *
   3568  * RETURN     : int32_t type of status
   3569  *              NO_ERROR  -- success
   3570  *              none-zero failure code
   3571  *==========================================================================*/
   3572 int32_t QCameraParameters::setZslAttributes(const QCameraParameters& params)
   3573 {
   3574     // TODO: may switch to pure param instead of sysprop
   3575     char prop[PROPERTY_VALUE_MAX];
   3576 
   3577     const char *str = params.get(KEY_QC_ZSL_BURST_INTERVAL);
   3578     if (str != NULL) {
   3579         set(KEY_QC_ZSL_BURST_INTERVAL, str);
   3580     } else {
   3581         memset(prop, 0, sizeof(prop));
   3582         property_get("persist.camera.zsl.interval", prop, "1");
   3583         set(KEY_QC_ZSL_BURST_INTERVAL, prop);
   3584         CDBG_HIGH("%s: [ZSL Retro] burst interval: %s", __func__, prop);
   3585     }
   3586 
   3587     str = params.get(KEY_QC_ZSL_BURST_LOOKBACK);
   3588     if (str != NULL) {
   3589         set(KEY_QC_ZSL_BURST_LOOKBACK, str);
   3590     } else {
   3591         memset(prop, 0, sizeof(prop));
   3592         property_get("persist.camera.zsl.backlookcnt", prop, "2");
   3593         set(KEY_QC_ZSL_BURST_LOOKBACK, prop);
   3594         CDBG_HIGH("%s: [ZSL Retro] look back count: %s", __func__, prop);
   3595     }
   3596 
   3597     str = params.get(KEY_QC_ZSL_QUEUE_DEPTH);
   3598     if (str != NULL) {
   3599         set(KEY_QC_ZSL_QUEUE_DEPTH, str);
   3600     } else {
   3601         memset(prop, 0, sizeof(prop));
   3602         property_get("persist.camera.zsl.queuedepth", prop, "2");
   3603         set(KEY_QC_ZSL_QUEUE_DEPTH, prop);
   3604         CDBG_HIGH("%s: [ZSL Retro] queue depth: %s", __func__, prop);
   3605     }
   3606 
   3607     return NO_ERROR;
   3608 }
   3609 
   3610 /*===========================================================================
   3611  * FUNCTION   : setFlip
   3612  *
   3613  * DESCRIPTION: set preview/ video/ picture flip mode from user setting
   3614  *
   3615  * PARAMETERS :
   3616  *   @params  : user setting parameters
   3617  *
   3618  * RETURN     : int32_t type of status
   3619  *              NO_ERROR  -- success
   3620  *              none-zero failure code
   3621  *==========================================================================*/
   3622 int32_t QCameraParameters::setFlip(const QCameraParameters& params)
   3623 {
   3624     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_FLIP) == 0) {
   3625         CDBG_HIGH("%s: flip is not supported.", __func__);
   3626         return NO_ERROR;
   3627     }
   3628 
   3629     //check preview flip setting
   3630     const char *str = params.get(KEY_QC_PREVIEW_FLIP);
   3631     const char *prev_val = get(KEY_QC_PREVIEW_FLIP);
   3632     if(str != NULL){
   3633         if (prev_val == NULL || strcmp(str, prev_val) != 0) {
   3634             int32_t value = lookupAttr(FLIP_MODES_MAP,
   3635                                        sizeof(FLIP_MODES_MAP)/sizeof(QCameraMap),
   3636                                        str);
   3637             if(value != NAME_NOT_FOUND){
   3638                 set(KEY_QC_PREVIEW_FLIP, str);
   3639                 m_bPreviewFlipChanged = true;
   3640             }
   3641         }
   3642     }
   3643 
   3644     // check video filp setting
   3645     str = params.get(KEY_QC_VIDEO_FLIP);
   3646     prev_val = get(KEY_QC_VIDEO_FLIP);
   3647     if(str != NULL){
   3648         if (prev_val == NULL || strcmp(str, prev_val) != 0) {
   3649             int32_t value = lookupAttr(FLIP_MODES_MAP,
   3650                                        sizeof(FLIP_MODES_MAP)/sizeof(QCameraMap),
   3651                                        str);
   3652             if(value != NAME_NOT_FOUND){
   3653                 set(KEY_QC_VIDEO_FLIP, str);
   3654                 m_bVideoFlipChanged = true;
   3655             }
   3656         }
   3657     }
   3658 
   3659     // check picture filp setting
   3660     str = params.get(KEY_QC_SNAPSHOT_PICTURE_FLIP);
   3661     prev_val = get(KEY_QC_SNAPSHOT_PICTURE_FLIP);
   3662     if(str != NULL){
   3663         if (prev_val == NULL || strcmp(str, prev_val) != 0) {
   3664             int32_t value = lookupAttr(FLIP_MODES_MAP,
   3665                                        sizeof(FLIP_MODES_MAP)/sizeof(QCameraMap),
   3666                                        str);
   3667             if(value != NAME_NOT_FOUND){
   3668                 set(KEY_QC_SNAPSHOT_PICTURE_FLIP, str);
   3669                 m_bSnapshotFlipChanged = true;
   3670             }
   3671         }
   3672     }
   3673 
   3674     return NO_ERROR;
   3675 }
   3676 
   3677 /*===========================================================================
   3678  * FUNCTION   : setBurstNum
   3679  *
   3680  * DESCRIPTION: set burst number of snapshot
   3681  *
   3682  * PARAMETERS :
   3683  *   @params  : user setting parameters
   3684  *
   3685  * RETURN     : int32_t type of status
   3686  *              NO_ERROR  -- success
   3687  *              none-zero failure code
   3688  *==========================================================================*/
   3689 int32_t QCameraParameters::setBurstNum(const QCameraParameters& params)
   3690 {
   3691     int nBurstNum = params.getInt(KEY_QC_SNAPSHOT_BURST_NUM);
   3692     if (isAdvCamFeaturesEnabled()) {
   3693         nBurstNum = 1;
   3694     }
   3695     if (nBurstNum <= 0) {
   3696         // if burst number is not set in parameters,
   3697         // read from sys prop
   3698         char prop[PROPERTY_VALUE_MAX];
   3699         memset(prop, 0, sizeof(prop));
   3700         property_get("persist.camera.snapshot.number", prop, "0");
   3701         nBurstNum = atoi(prop);
   3702         if (nBurstNum <= 0) {
   3703             nBurstNum = 1;
   3704         }
   3705     }
   3706     set(KEY_QC_SNAPSHOT_BURST_NUM, nBurstNum);
   3707     m_nBurstNum = nBurstNum;
   3708     CDBG_HIGH("%s: [ZSL Retro] m_nBurstNum = %d", __func__, m_nBurstNum);
   3709     return AddSetParmEntryToBatch(m_pParamBuf,
   3710                                   CAM_INTF_PARM_BURST_NUM,
   3711                                   sizeof(nBurstNum),
   3712                                   &nBurstNum);
   3713 }
   3714 
   3715 /*===========================================================================
   3716  * FUNCTION   : setSnapshotFDReq
   3717  *
   3718  * DESCRIPTION: set requirement of Face Detection Metadata in Snapshot mode.
   3719  *
   3720  * PARAMETERS :
   3721  *   @params  : user setting parameters
   3722  *
   3723  * RETURN     : int32_t type of status
   3724  *              NO_ERROR  -- success
   3725  *              none-zero failure code
   3726  *==========================================================================*/
   3727 int32_t QCameraParameters::setSnapshotFDReq(const QCameraParameters& params)
   3728 {
   3729     char prop[PROPERTY_VALUE_MAX];
   3730     const char *str = params.get(KEY_QC_SNAPSHOT_FD_DATA);
   3731 
   3732     if(str != NULL){
   3733         set(KEY_QC_SNAPSHOT_FD_DATA, str);
   3734     }else{
   3735         memset(prop, 0, sizeof(prop));
   3736         property_get("persist.camera.snapshot.fd", prop, "0");
   3737         set(KEY_QC_SNAPSHOT_FD_DATA, prop);
   3738     }
   3739     return NO_ERROR;
   3740 }
   3741 
   3742 /*===========================================================================
   3743  * FUNCTION   : setMobicat
   3744  *
   3745  * DESCRIPTION: set Mobicat on/off.
   3746  *
   3747  * PARAMETERS :
   3748  *   @params  : user setting parameters
   3749  *
   3750  * RETURN     : int32_t type of status
   3751  *              NO_ERROR  -- success
   3752  *              none-zero failure code
   3753  *==========================================================================*/
   3754 int32_t QCameraParameters::setMobicat(const QCameraParameters& )
   3755 {
   3756     char value [PROPERTY_VALUE_MAX];
   3757     property_get("persist.camera.mobicat", value, "0");
   3758     bool enableMobi = atoi(value) > 0 ? true : false;
   3759     int32_t ret = NO_ERROR;;
   3760 
   3761     if (enableMobi) {
   3762         tune_cmd_t tune_cmd;
   3763         tune_cmd.type = 2;
   3764         tune_cmd.module = 0;
   3765         tune_cmd.value = 1;
   3766 
   3767         ret = AddSetParmEntryToBatch(m_pParamBuf,
   3768                                 CAM_INTF_PARM_SET_VFE_COMMAND,
   3769                                 sizeof(tune_cmd_t),
   3770                                 &tune_cmd);
   3771         if (NO_ERROR != ret) {
   3772             return ret;
   3773         }
   3774         tune_cmd.module = 0;
   3775 
   3776         ret = AddSetParmEntryToBatch(m_pParamBuf,
   3777                                 CAM_INTF_PARM_SET_PP_COMMAND,
   3778                                 sizeof(tune_cmd_t),
   3779                                 &tune_cmd);
   3780     }
   3781 
   3782     return ret;
   3783 }
   3784 
   3785 /*===========================================================================
   3786  * FUNCTION   : updateParameters
   3787  *
   3788  * DESCRIPTION: update parameters from user setting
   3789  *
   3790  * PARAMETERS :
   3791  *   @params  : user setting parameters
   3792  *   @needRestart : [output] if preview need restart upon setting changes
   3793  *
   3794  * RETURN     : int32_t type of status
   3795  *              NO_ERROR  -- success
   3796  *              none-zero failure code
   3797  *==========================================================================*/
   3798 int32_t QCameraParameters::updateParameters(QCameraParameters& params,
   3799                                             bool &needRestart)
   3800 {
   3801     int32_t final_rc = NO_ERROR;
   3802     int32_t rc;
   3803     m_bNeedRestart = false;
   3804 
   3805     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   3806         ALOGE("%s:Failed to initialize group update table",__func__);
   3807         rc = BAD_TYPE;
   3808         goto UPDATE_PARAM_DONE;
   3809     }
   3810 
   3811     if ((rc = setPreviewSize(params)))                  final_rc = rc;
   3812     if ((rc = setVideoSize(params)))                    final_rc = rc;
   3813     if ((rc = setPictureSize(params)))                  final_rc = rc;
   3814     if ((rc = setPreviewFormat(params)))                final_rc = rc;
   3815     if ((rc = setPictureFormat(params)))                final_rc = rc;
   3816     if ((rc = setJpegQuality(params)))                  final_rc = rc;
   3817     if ((rc = setOrientation(params)))                  final_rc = rc;
   3818     if ((rc = setRotation(params)))                     final_rc = rc;
   3819     if ((rc = setVideoRotation(params)))                final_rc = rc;
   3820     if ((rc = setNoDisplayMode(params)))                final_rc = rc;
   3821     if ((rc = setZslMode(params)))                      final_rc = rc;
   3822     if ((rc = setZslAttributes(params)))                final_rc = rc;
   3823     if ((rc = setCameraMode(params)))                   final_rc = rc;
   3824     if ((rc = setSceneSelectionMode(params)))           final_rc = rc;
   3825     if ((rc = setRecordingHint(params)))                final_rc = rc;
   3826     if ((rc = setRdiMode(params)))                      final_rc = rc;
   3827     if ((rc = setSecureMode(params)))                   final_rc = rc;
   3828     if ((rc = setPreviewFrameRate(params)))             final_rc = rc;
   3829     if ((rc = setPreviewFpsRange(params)))              final_rc = rc;
   3830     if ((rc = setAutoExposure(params)))                 final_rc = rc;
   3831     if ((rc = setEffect(params)))                       final_rc = rc;
   3832     if ((rc = setBrightness(params)))                   final_rc = rc;
   3833     if ((rc = setZoom(params)))                         final_rc = rc;
   3834     if ((rc = setSharpness(params)))                    final_rc = rc;
   3835     if ((rc = setSaturation(params)))                   final_rc = rc;
   3836     if ((rc = setContrast(params)))                     final_rc = rc;
   3837     if ((rc = setFocusMode(params)))                    final_rc = rc;
   3838     if ((rc = setISOValue(params)))                     final_rc = rc;
   3839     if ((rc = setSkinToneEnhancement(params)))          final_rc = rc;
   3840     if ((rc = setFlash(params)))                        final_rc = rc;
   3841     if ((rc = setAecLock(params)))                      final_rc = rc;
   3842     if ((rc = setAwbLock(params)))                      final_rc = rc;
   3843     if ((rc = setLensShadeValue(params)))               final_rc = rc;
   3844     if ((rc = setMCEValue(params)))                     final_rc = rc;
   3845     if ((rc = setDISValue(params)))                     final_rc = rc;
   3846     if ((rc = setHighFrameRate(params)))                final_rc = rc;
   3847     if ((rc = setHighSpeedRecording(params)))           final_rc = rc;
   3848     if ((rc = setAntibanding(params)))                  final_rc = rc;
   3849     if ((rc = setExposureCompensation(params)))         final_rc = rc;
   3850     if ((rc = setWhiteBalance(params)))                 final_rc = rc;
   3851     if ((rc = setSceneMode(params)))                    final_rc = rc;
   3852     if ((rc = setFocusAreas(params)))                   final_rc = rc;
   3853     if ((rc = setMeteringAreas(params)))                final_rc = rc;
   3854     if ((rc = setSelectableZoneAf(params)))             final_rc = rc;
   3855     if ((rc = setRedeyeReduction(params)))              final_rc = rc;
   3856     if ((rc = setAEBracket(params)))                    final_rc = rc;
   3857     if ((rc = setAutoHDR(params)))                      final_rc = rc;
   3858     if ((rc = setGpsLocation(params)))                  final_rc = rc;
   3859     if ((rc = setWaveletDenoise(params)))               final_rc = rc;
   3860     if ((rc = setFaceRecognition(params)))              final_rc = rc;
   3861     if ((rc = setFlip(params)))                         final_rc = rc;
   3862     if ((rc = setVideoHDR(params)))                     final_rc = rc;
   3863     if ((rc = setVtEnable(params)))                     final_rc = rc;
   3864     if ((rc = setAFBracket(params)))                    final_rc = rc;
   3865     if ((rc = setChromaFlash(params)))                  final_rc = rc;
   3866     if ((rc = setOptiZoom(params)))                     final_rc = rc;
   3867     if ((rc = setBurstNum(params)))                     final_rc = rc;
   3868     if ((rc = setBurstLEDOnPeriod(params)))             final_rc = rc;
   3869     if ((rc = setRetroActiveBurstNum(params)))          final_rc = rc;
   3870     if ((rc = setSnapshotFDReq(params)))                final_rc = rc;
   3871     if ((rc = setTintlessValue(params)))                final_rc = rc;
   3872     if ((rc = setCDSMode(params)))                      final_rc = rc;
   3873 
   3874     // update live snapshot size after all other parameters are set
   3875     if ((rc = setLiveSnapshotSize(params)))             final_rc = rc;
   3876     if ((rc = setJpegThumbnailSize(params)))            final_rc = rc;
   3877     if ((rc = setStatsDebugMask()))                     final_rc = rc;
   3878     if ((rc = setPAAF()))                               final_rc = rc;
   3879     if ((rc = setMobicat(params)))                      final_rc = rc;
   3880 
   3881     if ((rc = updateFlash(false)))                      final_rc = rc;
   3882 
   3883 UPDATE_PARAM_DONE:
   3884     needRestart = m_bNeedRestart;
   3885     return final_rc;
   3886 }
   3887 
   3888 /*===========================================================================
   3889  * FUNCTION   : commitParameters
   3890  *
   3891  * DESCRIPTION: commit parameter changes to backend
   3892  *
   3893  * PARAMETERS : none
   3894  *
   3895  * RETURN     : int32_t type of status
   3896  *              NO_ERROR  -- success
   3897  *              none-zero failure code
   3898  *==========================================================================*/
   3899 int32_t QCameraParameters::commitParameters()
   3900 {
   3901     return commitSetBatch();
   3902 }
   3903 
   3904 /*===========================================================================
   3905  * FUNCTION   : initDefaultParameters
   3906  *
   3907  * DESCRIPTION: initialize default parameters for the first time
   3908  *
   3909  * PARAMETERS : none
   3910  *
   3911  * RETURN     : int32_t type of status
   3912  *              NO_ERROR  -- success
   3913  *              none-zero failure code
   3914  *==========================================================================*/
   3915 int32_t QCameraParameters::initDefaultParameters()
   3916 {
   3917     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   3918         ALOGE("%s:Failed to initialize group update table", __func__);
   3919         return BAD_TYPE;
   3920     }
   3921     int32_t hal_version = CAM_HAL_V1;
   3922     AddSetParmEntryToBatch(m_pParamBuf,
   3923                            CAM_INTF_PARM_HAL_VERSION,
   3924                            sizeof(hal_version),
   3925                            &hal_version);
   3926 
   3927     /*************************Initialize Values******************************/
   3928     // Set read only parameters from camera capability
   3929     set(KEY_SMOOTH_ZOOM_SUPPORTED,
   3930         m_pCapability->smooth_zoom_supported? VALUE_TRUE : VALUE_FALSE);
   3931     set(KEY_ZOOM_SUPPORTED,
   3932         m_pCapability->zoom_supported? VALUE_TRUE : VALUE_FALSE);
   3933     set(KEY_VIDEO_SNAPSHOT_SUPPORTED,
   3934         m_pCapability->video_snapshot_supported? VALUE_TRUE : VALUE_FALSE);
   3935     set(KEY_VIDEO_STABILIZATION_SUPPORTED,
   3936         m_pCapability->video_stablization_supported? VALUE_TRUE : VALUE_FALSE);
   3937     set(KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
   3938         m_pCapability->auto_exposure_lock_supported? VALUE_TRUE : VALUE_FALSE);
   3939     set(KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
   3940         m_pCapability->auto_wb_lock_supported? VALUE_TRUE : VALUE_FALSE);
   3941     set(KEY_QC_SUPPORTED_CAMERA_FEATURES,
   3942         m_pCapability->qcom_supported_feature_mask);
   3943     set(KEY_MAX_NUM_DETECTED_FACES_HW, m_pCapability->max_num_roi);
   3944     set(KEY_MAX_NUM_DETECTED_FACES_SW, m_pCapability->max_num_roi);
   3945     set(KEY_QC_MAX_NUM_REQUESTED_FACES, m_pCapability->max_num_roi);
   3946     // Set focal length, horizontal view angle, and vertical view angle
   3947     setFloat(KEY_FOCAL_LENGTH, m_pCapability->focal_length);
   3948     setFloat(KEY_HORIZONTAL_VIEW_ANGLE, m_pCapability->hor_view_angle);
   3949     setFloat(KEY_VERTICAL_VIEW_ANGLE, m_pCapability->ver_view_angle);
   3950     set(QCameraParameters::KEY_FOCUS_DISTANCES, "Infinity,Infinity,Infinity");
   3951     set(KEY_QC_AUTO_HDR_SUPPORTED,
   3952         (m_pCapability->auto_hdr_supported)? VALUE_TRUE : VALUE_FALSE);
   3953     // Set supported preview sizes
   3954     if (m_pCapability->preview_sizes_tbl_cnt > 0 &&
   3955         m_pCapability->preview_sizes_tbl_cnt <= MAX_SIZES_CNT) {
   3956         String8 previewSizeValues = createSizesString(
   3957                 m_pCapability->preview_sizes_tbl, m_pCapability->preview_sizes_tbl_cnt);
   3958         set(KEY_SUPPORTED_PREVIEW_SIZES, previewSizeValues.string());
   3959         CDBG_HIGH("%s: supported preview sizes: %s", __func__, previewSizeValues.string());
   3960         // Set default preview size
   3961         CameraParameters::setPreviewSize(m_pCapability->preview_sizes_tbl[0].width,
   3962                                          m_pCapability->preview_sizes_tbl[0].height);
   3963     } else {
   3964         ALOGE("%s: supported preview sizes cnt is 0 or exceeds max!!!", __func__);
   3965     }
   3966 
   3967     // Set supported video sizes
   3968     if (m_pCapability->video_sizes_tbl_cnt > 0 &&
   3969         m_pCapability->video_sizes_tbl_cnt <= MAX_SIZES_CNT) {
   3970         String8 videoSizeValues = createSizesString(
   3971                 m_pCapability->video_sizes_tbl, m_pCapability->video_sizes_tbl_cnt);
   3972         set(KEY_SUPPORTED_VIDEO_SIZES, videoSizeValues.string());
   3973         CDBG_HIGH("%s: supported video sizes: %s", __func__, videoSizeValues.string());
   3974         // Set default video size
   3975         CameraParameters::setVideoSize(m_pCapability->video_sizes_tbl[0].width,
   3976                                        m_pCapability->video_sizes_tbl[0].height);
   3977 
   3978         //Set preferred Preview size for video
   3979         String8 vSize = createSizesString(&m_pCapability->preview_sizes_tbl[0], 1);
   3980         set(KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, vSize.string());
   3981     } else {
   3982         ALOGE("%s: supported video sizes cnt is 0 or exceeds max!!!", __func__);
   3983     }
   3984 
   3985     // Set supported picture sizes
   3986     if (m_pCapability->picture_sizes_tbl_cnt > 0 &&
   3987         m_pCapability->picture_sizes_tbl_cnt <= MAX_SIZES_CNT) {
   3988         String8 pictureSizeValues = createSizesString(
   3989                 m_pCapability->picture_sizes_tbl, m_pCapability->picture_sizes_tbl_cnt);
   3990         set(KEY_SUPPORTED_PICTURE_SIZES, pictureSizeValues.string());
   3991         CDBG_HIGH("%s: supported pic sizes: %s", __func__, pictureSizeValues.string());
   3992         // Set default picture size to the smallest resolution
   3993         CameraParameters::setPictureSize(
   3994            m_pCapability->picture_sizes_tbl[m_pCapability->picture_sizes_tbl_cnt-1].width,
   3995            m_pCapability->picture_sizes_tbl[m_pCapability->picture_sizes_tbl_cnt-1].height);
   3996     } else {
   3997         ALOGE("%s: supported picture sizes cnt is 0 or exceeds max!!!", __func__);
   3998     }
   3999 
   4000     // Need check if scale should be enabled
   4001     if (m_pCapability->scale_picture_sizes_cnt > 0 &&
   4002         m_pCapability->scale_picture_sizes_cnt <= MAX_SCALE_SIZES_CNT){
   4003         //get scale size, enable scaling. And re-set picture size table with scale sizes
   4004         m_reprocScaleParam.setScaleEnable(true);
   4005         int rc_s = m_reprocScaleParam.setScaleSizeTbl(
   4006             m_pCapability->scale_picture_sizes_cnt, m_pCapability->scale_picture_sizes,
   4007             m_pCapability->picture_sizes_tbl_cnt, m_pCapability->picture_sizes_tbl);
   4008         if(rc_s == NO_ERROR){
   4009             cam_dimension_t *totalSizeTbl = m_reprocScaleParam.getTotalSizeTbl();
   4010             uint8_t totalSizeCnt = m_reprocScaleParam.getTotalSizeTblCnt();
   4011             String8 pictureSizeValues = createSizesString(totalSizeTbl, totalSizeCnt);
   4012             set(KEY_SUPPORTED_PICTURE_SIZES, pictureSizeValues.string());
   4013             CDBG_HIGH("%s: scaled supported pic sizes: %s", __func__, pictureSizeValues.string());
   4014         }else{
   4015             m_reprocScaleParam.setScaleEnable(false);
   4016             ALOGE("%s: reset scaled picture size table failed.", __func__);
   4017         }
   4018     }else{
   4019         m_reprocScaleParam.setScaleEnable(false);
   4020     }
   4021 
   4022     // Set supported thumbnail sizes
   4023     String8 thumbnailSizeValues = createSizesString(
   4024             THUMBNAIL_SIZES_MAP,
   4025             sizeof(THUMBNAIL_SIZES_MAP)/sizeof(cam_dimension_t));
   4026     set(KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, thumbnailSizeValues.string());
   4027     // Set default thumnail size
   4028     set(KEY_JPEG_THUMBNAIL_WIDTH, THUMBNAIL_SIZES_MAP[0].width);
   4029     set(KEY_JPEG_THUMBNAIL_HEIGHT, THUMBNAIL_SIZES_MAP[0].height);
   4030 
   4031     // Set supported livesnapshot sizes
   4032     if (m_pCapability->livesnapshot_sizes_tbl_cnt > 0 &&
   4033         m_pCapability->livesnapshot_sizes_tbl_cnt <= MAX_SIZES_CNT) {
   4034         String8 liveSnpashotSizeValues = createSizesString(
   4035                 m_pCapability->livesnapshot_sizes_tbl,
   4036                 m_pCapability->livesnapshot_sizes_tbl_cnt);
   4037         set(KEY_QC_SUPPORTED_LIVESNAPSHOT_SIZES, liveSnpashotSizeValues.string());
   4038         CDBG("%s: supported live snapshot sizes: %s", __func__, liveSnpashotSizeValues.string());
   4039         m_LiveSnapshotSize =
   4040             m_pCapability->livesnapshot_sizes_tbl[m_pCapability->livesnapshot_sizes_tbl_cnt-1];
   4041     }
   4042 
   4043     // Set supported preview formats
   4044     String8 previewFormatValues = createValuesString(
   4045             (int *)m_pCapability->supported_preview_fmts,
   4046             m_pCapability->supported_preview_fmt_cnt,
   4047             PREVIEW_FORMATS_MAP,
   4048             sizeof(PREVIEW_FORMATS_MAP)/sizeof(QCameraMap));
   4049     set(KEY_SUPPORTED_PREVIEW_FORMATS, previewFormatValues.string());
   4050     // Set default preview format
   4051     CameraParameters::setPreviewFormat(PIXEL_FORMAT_YUV420SP);
   4052 
   4053     // Set default Video Format
   4054     set(KEY_VIDEO_FRAME_FORMAT, PIXEL_FORMAT_YUV420SP);
   4055 
   4056     // Set supported picture formats
   4057     String8 pictureTypeValues(PIXEL_FORMAT_JPEG);
   4058     String8 str = createValuesString(
   4059             (int *)m_pCapability->supported_raw_fmts,
   4060             m_pCapability->supported_raw_fmt_cnt,
   4061             PICTURE_TYPES_MAP,
   4062             sizeof(PICTURE_TYPES_MAP)/sizeof(QCameraMap));
   4063     if (str.string() != NULL) {
   4064         pictureTypeValues.append(",");
   4065         pictureTypeValues.append(str);
   4066     }
   4067 
   4068     set(KEY_SUPPORTED_PICTURE_FORMATS, pictureTypeValues.string());
   4069     // Set default picture Format
   4070     CameraParameters::setPictureFormat(PIXEL_FORMAT_JPEG);
   4071     // Set raw image size
   4072     char raw_size_str[32];
   4073     snprintf(raw_size_str, sizeof(raw_size_str), "%dx%d",
   4074              m_pCapability->raw_dim[0].width, m_pCapability->raw_dim[0].height);
   4075     set(KEY_QC_RAW_PICUTRE_SIZE, raw_size_str);
   4076     CDBG("%s: KEY_QC_RAW_PICUTRE_SIZE: w: %d, h: %d ", __func__,
   4077        m_pCapability->raw_dim[0].width, m_pCapability->raw_dim[0].height);
   4078 
   4079     //set default jpeg quality and thumbnail quality
   4080     set(KEY_JPEG_QUALITY, 85);
   4081     set(KEY_JPEG_THUMBNAIL_QUALITY, 85);
   4082 
   4083     // Set FPS ranges
   4084     if (m_pCapability->fps_ranges_tbl_cnt > 0 &&
   4085         m_pCapability->fps_ranges_tbl_cnt <= MAX_SIZES_CNT) {
   4086         int default_fps_index = 0;
   4087         String8 fpsRangeValues = createFpsRangeString(m_pCapability->fps_ranges_tbl,
   4088                                                       m_pCapability->fps_ranges_tbl_cnt,
   4089                                                       default_fps_index);
   4090         set(KEY_SUPPORTED_PREVIEW_FPS_RANGE, fpsRangeValues.string());
   4091 
   4092         int min_fps =
   4093             int(m_pCapability->fps_ranges_tbl[default_fps_index].min_fps * 1000);
   4094         int max_fps =
   4095             int(m_pCapability->fps_ranges_tbl[default_fps_index].max_fps * 1000);
   4096         m_default_fps_range = m_pCapability->fps_ranges_tbl[default_fps_index];
   4097         //Set video fps same as preview fps
   4098         setPreviewFpsRange(min_fps, max_fps, min_fps, max_fps);
   4099 
   4100         // Set legacy preview fps
   4101         String8 fpsValues = createFpsString(m_pCapability->fps_ranges_tbl[default_fps_index]);
   4102         set(KEY_SUPPORTED_PREVIEW_FRAME_RATES, fpsValues.string());
   4103         CDBG_HIGH("%s: supported fps rates: %s", __func__, fpsValues.string());
   4104         CameraParameters::setPreviewFrameRate(int(m_pCapability->fps_ranges_tbl[default_fps_index].max_fps));
   4105     } else {
   4106         ALOGE("%s: supported fps ranges cnt is 0 or exceeds max!!!", __func__);
   4107     }
   4108 
   4109     // Set supported focus modes
   4110     if (m_pCapability->supported_focus_modes_cnt > 0) {
   4111         String8 focusModeValues = createValuesString(
   4112                 (int *)m_pCapability->supported_focus_modes,
   4113                 m_pCapability->supported_focus_modes_cnt,
   4114                 FOCUS_MODES_MAP,
   4115                 sizeof(FOCUS_MODES_MAP)/sizeof(QCameraMap));
   4116         set(KEY_SUPPORTED_FOCUS_MODES, focusModeValues);
   4117 
   4118         // Set default focus mode and update corresponding parameter buf
   4119         const char *focusMode = lookupNameByValue(FOCUS_MODES_MAP,
   4120                                              sizeof(FOCUS_MODES_MAP)/sizeof(QCameraMap),
   4121                                              m_pCapability->supported_focus_modes[0]);
   4122         if (focusMode != NULL) {
   4123             setFocusMode(focusMode);
   4124         } else {
   4125             setFocusMode(FOCUS_MODE_FIXED);
   4126         }
   4127     } else {
   4128         ALOGE("%s: supported focus modes cnt is 0!!!", __func__);
   4129     }
   4130 
   4131     // Set focus areas
   4132     if (m_pCapability->max_num_focus_areas > MAX_ROI) {
   4133         m_pCapability->max_num_focus_areas = MAX_ROI;
   4134     }
   4135     set(KEY_MAX_NUM_FOCUS_AREAS, m_pCapability->max_num_focus_areas);
   4136     if (m_pCapability->max_num_focus_areas > 0) {
   4137         setFocusAreas(DEFAULT_CAMERA_AREA);
   4138     }
   4139 
   4140     // Set metering areas
   4141     if (m_pCapability->max_num_metering_areas > MAX_ROI) {
   4142         m_pCapability->max_num_metering_areas = MAX_ROI;
   4143     }
   4144     set(KEY_MAX_NUM_METERING_AREAS, m_pCapability->max_num_metering_areas);
   4145     if (m_pCapability->max_num_metering_areas > 0) {
   4146         setMeteringAreas(DEFAULT_CAMERA_AREA);
   4147     }
   4148 
   4149     // Set Saturation
   4150     set(KEY_QC_MIN_SATURATION, m_pCapability->saturation_ctrl.min_value);
   4151     set(KEY_QC_MAX_SATURATION, m_pCapability->saturation_ctrl.max_value);
   4152     set(KEY_QC_SATURATION_STEP, m_pCapability->saturation_ctrl.step);
   4153     setSaturation(m_pCapability->saturation_ctrl.def_value);
   4154 
   4155     // Set Sharpness
   4156     set(KEY_QC_MIN_SHARPNESS, m_pCapability->sharpness_ctrl.min_value);
   4157     set(KEY_QC_MAX_SHARPNESS, m_pCapability->sharpness_ctrl.max_value);
   4158     set(KEY_QC_SHARPNESS_STEP, m_pCapability->sharpness_ctrl.step);
   4159     setSharpness(m_pCapability->sharpness_ctrl.def_value);
   4160 
   4161     // Set Contrast
   4162     set(KEY_QC_MIN_CONTRAST, m_pCapability->contrast_ctrl.min_value);
   4163     set(KEY_QC_MAX_CONTRAST, m_pCapability->contrast_ctrl.max_value);
   4164     set(KEY_QC_CONTRAST_STEP, m_pCapability->contrast_ctrl.step);
   4165     setContrast(m_pCapability->contrast_ctrl.def_value);
   4166 
   4167     // Set SCE factor
   4168     set(KEY_QC_MIN_SCE_FACTOR, m_pCapability->sce_ctrl.min_value); // -100
   4169     set(KEY_QC_MAX_SCE_FACTOR, m_pCapability->sce_ctrl.max_value); // 100
   4170     set(KEY_QC_SCE_FACTOR_STEP, m_pCapability->sce_ctrl.step);     // 10
   4171     setSkinToneEnhancement(m_pCapability->sce_ctrl.def_value);     // 0
   4172 
   4173     // Set Brightness
   4174     set(KEY_QC_MIN_BRIGHTNESS, m_pCapability->brightness_ctrl.min_value); // 0
   4175     set(KEY_QC_MAX_BRIGHTNESS, m_pCapability->brightness_ctrl.max_value); // 6
   4176     set(KEY_QC_BRIGHTNESS_STEP, m_pCapability->brightness_ctrl.step);     // 1
   4177     setBrightness(m_pCapability->brightness_ctrl.def_value);
   4178 
   4179     // Set Auto exposure
   4180     String8 autoExposureValues = createValuesString(
   4181             (int *)m_pCapability->supported_aec_modes,
   4182             m_pCapability->supported_aec_modes_cnt,
   4183             AUTO_EXPOSURE_MAP,
   4184             sizeof(AUTO_EXPOSURE_MAP) / sizeof(QCameraMap));
   4185     set(KEY_QC_SUPPORTED_AUTO_EXPOSURE, autoExposureValues.string());
   4186     setAutoExposure(AUTO_EXPOSURE_FRAME_AVG);
   4187 
   4188     // Set Exposure Compensation
   4189     set(KEY_MAX_EXPOSURE_COMPENSATION, m_pCapability->exposure_compensation_max); // 12
   4190     set(KEY_MIN_EXPOSURE_COMPENSATION, m_pCapability->exposure_compensation_min); // -12
   4191     setFloat(KEY_EXPOSURE_COMPENSATION_STEP, m_pCapability->exposure_compensation_step); // 1/6
   4192     setExposureCompensation(m_pCapability->exposure_compensation_default); // 0
   4193 
   4194     // Set Antibanding
   4195     String8 antibandingValues = createValuesString(
   4196             (int *)m_pCapability->supported_antibandings,
   4197             m_pCapability->supported_antibandings_cnt,
   4198             ANTIBANDING_MODES_MAP,
   4199             sizeof(ANTIBANDING_MODES_MAP) / sizeof(QCameraMap));
   4200     set(KEY_SUPPORTED_ANTIBANDING, antibandingValues);
   4201     setAntibanding(ANTIBANDING_OFF);
   4202 
   4203     // Set Effect
   4204     String8 effectValues = createValuesString(
   4205             (int *)m_pCapability->supported_effects,
   4206             m_pCapability->supported_effects_cnt,
   4207             EFFECT_MODES_MAP,
   4208             sizeof(EFFECT_MODES_MAP) / sizeof(QCameraMap));
   4209     set(KEY_SUPPORTED_EFFECTS, effectValues);
   4210     setEffect(EFFECT_NONE);
   4211 
   4212     // Set WhiteBalance
   4213     String8 whitebalanceValues = createValuesString(
   4214             (int *)m_pCapability->supported_white_balances,
   4215             m_pCapability->supported_white_balances_cnt,
   4216             WHITE_BALANCE_MODES_MAP,
   4217             sizeof(WHITE_BALANCE_MODES_MAP) / sizeof(QCameraMap));
   4218     set(KEY_SUPPORTED_WHITE_BALANCE, whitebalanceValues);
   4219     setWhiteBalance(WHITE_BALANCE_AUTO);
   4220 
   4221     // Set Flash mode
   4222     if(m_pCapability->supported_flash_modes_cnt > 0) {
   4223        String8 flashValues = createValuesString(
   4224                (int *)m_pCapability->supported_flash_modes,
   4225                m_pCapability->supported_flash_modes_cnt,
   4226                FLASH_MODES_MAP,
   4227                sizeof(FLASH_MODES_MAP) / sizeof(QCameraMap));
   4228        set(KEY_SUPPORTED_FLASH_MODES, flashValues);
   4229        setFlash(FLASH_MODE_OFF);
   4230     } else {
   4231         ALOGE("%s: supported flash modes cnt is 0!!!", __func__);
   4232     }
   4233 
   4234     // Set Scene Mode
   4235     String8 sceneModeValues = createValuesString(
   4236             (int *)m_pCapability->supported_scene_modes,
   4237             m_pCapability->supported_scene_modes_cnt,
   4238             SCENE_MODES_MAP,
   4239             sizeof(SCENE_MODES_MAP) / sizeof(QCameraMap));
   4240     set(KEY_SUPPORTED_SCENE_MODES, sceneModeValues);
   4241     setSceneMode(SCENE_MODE_AUTO);
   4242 
   4243     // Set ISO Mode
   4244     String8 isoValues = createValuesString(
   4245             (int *)m_pCapability->supported_iso_modes,
   4246             m_pCapability->supported_iso_modes_cnt,
   4247             ISO_MODES_MAP,
   4248             sizeof(ISO_MODES_MAP) / sizeof(QCameraMap));
   4249     set(KEY_QC_SUPPORTED_ISO_MODES, isoValues);
   4250     setISOValue(ISO_AUTO);
   4251 
   4252     // Set HFR
   4253     String8 hfrValues = createHfrValuesString(
   4254             m_pCapability->hfr_tbl,
   4255             m_pCapability->hfr_tbl_cnt,
   4256             HFR_MODES_MAP,
   4257             sizeof(HFR_MODES_MAP) / sizeof(QCameraMap));
   4258     set(KEY_QC_SUPPORTED_VIDEO_HIGH_FRAME_RATE_MODES, hfrValues.string());
   4259     set(KEY_QC_VIDEO_HIGH_SPEED_RECORDING, "off");
   4260     String8 hfrSizeValues = createHfrSizesString(
   4261             m_pCapability->hfr_tbl,
   4262             m_pCapability->hfr_tbl_cnt);
   4263     set(KEY_QC_SUPPORTED_HFR_SIZES, hfrSizeValues.string());
   4264     setHighFrameRate(VIDEO_HFR_OFF);
   4265 
   4266     // Set Focus algorithms
   4267     String8 focusAlgoValues = createValuesString(
   4268             (int *)m_pCapability->supported_focus_algos,
   4269             m_pCapability->supported_focus_algos_cnt,
   4270             FOCUS_ALGO_MAP,
   4271             sizeof(FOCUS_ALGO_MAP) / sizeof(QCameraMap));
   4272     set(KEY_QC_SUPPORTED_FOCUS_ALGOS, focusAlgoValues);
   4273     setSelectableZoneAf(FOCUS_ALGO_AUTO);
   4274 
   4275     // Set Zoom Ratios
   4276     if (m_pCapability->zoom_supported > 0) {
   4277         String8 zoomRatioValues = createZoomRatioValuesString(
   4278                 m_pCapability->zoom_ratio_tbl,
   4279                 m_pCapability->zoom_ratio_tbl_cnt);
   4280         set(KEY_ZOOM_RATIOS, zoomRatioValues);
   4281         set(KEY_MAX_ZOOM, m_pCapability->zoom_ratio_tbl_cnt - 1);
   4282         setZoom(0);
   4283     }
   4284 
   4285     // Set Bracketing/HDR
   4286     char prop[PROPERTY_VALUE_MAX];
   4287     memset(prop, 0, sizeof(prop));
   4288     property_get("persist.capture.burst.exposures", prop, "");
   4289     if (strlen(prop) > 0) {
   4290         set(KEY_QC_CAPTURE_BURST_EXPOSURE, prop);
   4291     }
   4292     String8 bracketingValues = createValuesStringFromMap(
   4293             BRACKETING_MODES_MAP,
   4294             sizeof(BRACKETING_MODES_MAP) / sizeof(QCameraMap));
   4295     set(KEY_QC_SUPPORTED_AE_BRACKET_MODES, bracketingValues);
   4296     setAEBracket(AE_BRACKET_OFF);
   4297 
   4298     //Set AF Bracketing.
   4299     for(int i = 0; i < m_pCapability->supported_focus_modes_cnt; i++) {
   4300         if ((CAM_FOCUS_MODE_AUTO == m_pCapability->supported_focus_modes[i]) &&
   4301                 ((m_pCapability->qcom_supported_feature_mask &
   4302                         CAM_QCOM_FEATURE_UBIFOCUS) > 0)) {
   4303             String8 afBracketingValues = createValuesStringFromMap(
   4304                     AF_BRACKETING_MODES_MAP,
   4305                     sizeof(AF_BRACKETING_MODES_MAP) / sizeof(QCameraMap));
   4306             set(KEY_QC_SUPPORTED_AF_BRACKET_MODES, afBracketingValues);
   4307             setAFBracket(AF_BRACKET_OFF);
   4308             break;
   4309          }
   4310     }
   4311 
   4312     //Set Refocus.
   4313     //Re-use ubifocus flag for now.
   4314     if ((m_pCapability->qcom_supported_feature_mask &
   4315         CAM_QCOM_FEATURE_UBIFOCUS) > 0){
   4316             String8 reFocusValues = createValuesStringFromMap(
   4317                 RE_FOCUS_MODES_MAP,
   4318                 sizeof(RE_FOCUS_MODES_MAP) / sizeof(QCameraMap));
   4319             set(KEY_QC_SUPPORTED_RE_FOCUS_MODES, reFocusValues);
   4320     }
   4321 
   4322     //Set Chroma Flash.
   4323     if ((m_pCapability->supported_flash_modes_cnt > 0) &&
   4324             (m_pCapability->qcom_supported_feature_mask &
   4325             CAM_QCOM_FEATURE_CHROMA_FLASH) > 0) {
   4326         String8 chromaFlashValues = createValuesStringFromMap(
   4327                 CHROMA_FLASH_MODES_MAP,
   4328                 sizeof(CHROMA_FLASH_MODES_MAP) / sizeof(QCameraMap));
   4329         set(KEY_QC_SUPPORTED_CHROMA_FLASH_MODES, chromaFlashValues);
   4330         setChromaFlash(CHROMA_FLASH_OFF);
   4331     }
   4332 
   4333     //Set Opti Zoom.
   4334     if (m_pCapability->zoom_supported &&
   4335             (m_pCapability->qcom_supported_feature_mask &
   4336             CAM_QCOM_FEATURE_OPTIZOOM) > 0){
   4337         String8 optiZoomValues = createValuesStringFromMap(
   4338                 OPTI_ZOOM_MODES_MAP,
   4339                 sizeof(OPTI_ZOOM_MODES_MAP) / sizeof(QCameraMap));
   4340         set(KEY_QC_SUPPORTED_OPTI_ZOOM_MODES, optiZoomValues);
   4341         setOptiZoom(OPTI_ZOOM_OFF);
   4342     }
   4343 
   4344     // Set Denoise
   4345     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_DENOISE2D) > 0){
   4346     String8 denoiseValues = createValuesStringFromMap(
   4347        DENOISE_ON_OFF_MODES_MAP, sizeof(DENOISE_ON_OFF_MODES_MAP) / sizeof(QCameraMap));
   4348     set(KEY_QC_SUPPORTED_DENOISE, denoiseValues.string());
   4349 #ifdef DEFAULT_DENOISE_MODE_ON
   4350     setWaveletDenoise(DENOISE_ON);
   4351 #else
   4352     setWaveletDenoise(DENOISE_OFF);
   4353 #endif
   4354     }
   4355 
   4356     // Set feature enable/disable
   4357     String8 enableDisableValues = createValuesStringFromMap(
   4358         ENABLE_DISABLE_MODES_MAP, sizeof(ENABLE_DISABLE_MODES_MAP) / sizeof(QCameraMap));
   4359 
   4360     // Set Lens Shading
   4361     set(KEY_QC_SUPPORTED_LENSSHADE_MODES, enableDisableValues);
   4362     setLensShadeValue(VALUE_ENABLE);
   4363 
   4364     // Set MCE
   4365     set(KEY_QC_SUPPORTED_MEM_COLOR_ENHANCE_MODES, enableDisableValues);
   4366     setMCEValue(VALUE_ENABLE);
   4367 
   4368     // Set DIS
   4369     set(KEY_QC_SUPPORTED_DIS_MODES, enableDisableValues);
   4370     setDISValue(VALUE_DISABLE);
   4371 
   4372     // Set Histogram
   4373     set(KEY_QC_SUPPORTED_HISTOGRAM_MODES,
   4374         m_pCapability->histogram_supported ? enableDisableValues : "");
   4375     set(KEY_QC_HISTOGRAM, VALUE_DISABLE);
   4376 
   4377     //Set Red Eye Reduction
   4378     set(KEY_QC_SUPPORTED_REDEYE_REDUCTION, enableDisableValues);
   4379     setRedeyeReduction(VALUE_DISABLE);
   4380 
   4381     //Set SkinTone Enhancement
   4382     set(KEY_QC_SUPPORTED_SKIN_TONE_ENHANCEMENT_MODES, enableDisableValues);
   4383 
   4384     // Set feature on/off
   4385     String8 onOffValues = createValuesStringFromMap(
   4386         ON_OFF_MODES_MAP, sizeof(ON_OFF_MODES_MAP) / sizeof(QCameraMap));
   4387 
   4388     //Set Scene Detection
   4389     set(KEY_QC_SUPPORTED_SCENE_DETECT, onOffValues);
   4390     setSceneDetect(VALUE_OFF);
   4391     m_bHDREnabled = false;
   4392     m_bHDR1xFrameEnabled = true;
   4393 
   4394     m_bHDRThumbnailProcessNeeded = false;
   4395     m_bHDR1xExtraBufferNeeded = true;
   4396     for (uint32_t i=0; i<m_pCapability->hdr_bracketing_setting.num_frames; i++) {
   4397         if (0 == m_pCapability->hdr_bracketing_setting.exp_val.values[i]) {
   4398             m_bHDR1xExtraBufferNeeded = false;
   4399             break;
   4400         }
   4401     }
   4402 
   4403     // Set HDR output scaling
   4404     char value[PROPERTY_VALUE_MAX];
   4405 
   4406     property_get("persist.camera.hdr.outcrop", value, VALUE_DISABLE);
   4407     if (strncmp(VALUE_ENABLE, value, sizeof(VALUE_ENABLE))) {
   4408       m_bHDROutputCropEnabled = false;
   4409     } else {
   4410       m_bHDROutputCropEnabled = true;
   4411     }
   4412 
   4413     //Set Face Detection
   4414     set(KEY_QC_SUPPORTED_FACE_DETECTION, onOffValues);
   4415     set(KEY_QC_FACE_DETECTION, VALUE_OFF);
   4416 
   4417     //Set Face Recognition
   4418     //set(KEY_QC_SUPPORTED_FACE_RECOGNITION, onOffValues);
   4419     //set(KEY_QC_FACE_RECOGNITION, VALUE_OFF);
   4420 
   4421     //Set ZSL
   4422     set(KEY_QC_SUPPORTED_ZSL_MODES, onOffValues);
   4423 #ifdef DEFAULT_ZSL_MODE_ON
   4424     set(KEY_QC_ZSL, VALUE_ON);
   4425     m_bZslMode = true;
   4426 #else
   4427     set(KEY_QC_ZSL, VALUE_OFF);
   4428     m_bZslMode = false;
   4429 #endif
   4430     m_bZslMode_new = m_bZslMode;
   4431 
   4432     set(KEY_QC_SCENE_SELECTION, VALUE_DISABLE);
   4433 
   4434     // Rdi mode
   4435     set(KEY_QC_SUPPORTED_RDI_MODES, enableDisableValues);
   4436     setRdiMode(VALUE_DISABLE);
   4437 
   4438     // Secure mode
   4439     set(KEY_QC_SUPPORTED_SECURE_MODES, enableDisableValues);
   4440     setSecureMode(VALUE_DISABLE);
   4441 
   4442     //Set video HDR
   4443     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_VIDEO_HDR) > 0) {
   4444         set(KEY_QC_SUPPORTED_VIDEO_HDR_MODES, onOffValues);
   4445         set(KEY_QC_VIDEO_HDR, VALUE_OFF);
   4446     }
   4447 
   4448     //Set HW Sensor Snapshot HDR
   4449     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_SENSOR_HDR)> 0) {
   4450         set(KEY_QC_SUPPORTED_SENSOR_HDR_MODES, onOffValues);
   4451         set(KEY_QC_SENSOR_HDR, VALUE_OFF);
   4452         m_bSensorHDREnabled = false;
   4453     }
   4454 
   4455     // Set VT TimeStamp
   4456     set(KEY_QC_VT_ENABLE, VALUE_DISABLE);
   4457     //Set Touch AF/AEC
   4458     String8 touchValues = createValuesStringFromMap(
   4459        TOUCH_AF_AEC_MODES_MAP, sizeof(TOUCH_AF_AEC_MODES_MAP) / sizeof(QCameraMap));
   4460 
   4461     set(KEY_QC_SUPPORTED_TOUCH_AF_AEC, touchValues);
   4462     set(KEY_QC_TOUCH_AF_AEC, TOUCH_AF_AEC_OFF);
   4463 
   4464     //set flip mode
   4465     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_FLIP) > 0) {
   4466         String8 flipModes = createValuesStringFromMap(
   4467            FLIP_MODES_MAP, sizeof(FLIP_MODES_MAP) / sizeof(QCameraMap));
   4468         set(KEY_QC_SUPPORTED_FLIP_MODES, flipModes);
   4469         set(KEY_QC_PREVIEW_FLIP, FLIP_MODE_OFF);
   4470         set(KEY_QC_VIDEO_FLIP, FLIP_MODE_OFF);
   4471         set(KEY_QC_SNAPSHOT_PICTURE_FLIP, FLIP_MODE_OFF);
   4472     }
   4473 
   4474     // Set default Auto Exposure lock value
   4475     setAecLock(VALUE_FALSE);
   4476 
   4477     // Set default AWB_LOCK lock value
   4478     setAwbLock(VALUE_FALSE);
   4479 
   4480     // Set default Camera mode
   4481     set(KEY_QC_CAMERA_MODE, 0);
   4482 
   4483     // Add support for internal preview restart
   4484     set(KEY_INTERNAL_PERVIEW_RESTART, VALUE_TRUE);
   4485     // Set default burst number
   4486     set(KEY_QC_SNAPSHOT_BURST_NUM, 0);
   4487     set(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER, 0);
   4488 
   4489     int32_t rc = commitParameters();
   4490     if (rc == NO_ERROR) {
   4491         rc = setNumOfSnapshot();
   4492     }
   4493     return rc;
   4494 }
   4495 
   4496 /*===========================================================================
   4497  * FUNCTION   : init
   4498  *
   4499  * DESCRIPTION: initialize parameter obj
   4500  *
   4501  * PARAMETERS :
   4502  *   @capabilities  : ptr to camera capabilities
   4503  *   @mmops         : ptr to memory ops table for mapping/unmapping
   4504  *
   4505  * RETURN     : int32_t type of status
   4506  *              NO_ERROR  -- success
   4507  *              none-zero failure code
   4508  *==========================================================================*/
   4509 int32_t QCameraParameters::init(cam_capability_t *capabilities,
   4510                                 mm_camera_vtbl_t *mmOps,
   4511                                 QCameraAdjustFPS *adjustFPS,
   4512                                 QCameraTorchInterface *torch)
   4513 {
   4514     int32_t rc = NO_ERROR;
   4515 
   4516     m_pCapability = capabilities;
   4517     m_pCamOpsTbl = mmOps;
   4518     m_AdjustFPS = adjustFPS;
   4519     m_pTorch = torch;
   4520 
   4521     //Allocate Set Param Buffer
   4522     m_pParamHeap = new QCameraHeapMemory(QCAMERA_ION_USE_CACHE);
   4523     rc = m_pParamHeap->allocate(1, sizeof(parm_buffer_t), NON_SECURE);
   4524     if(rc != OK) {
   4525         rc = NO_MEMORY;
   4526         ALOGE("Failed to allocate SETPARM Heap memory");
   4527         goto TRANS_INIT_ERROR1;
   4528     }
   4529 
   4530     //Map memory for parameters buffer
   4531     rc = m_pCamOpsTbl->ops->map_buf(m_pCamOpsTbl->camera_handle,
   4532                              CAM_MAPPING_BUF_TYPE_PARM_BUF,
   4533                              m_pParamHeap->getFd(0),
   4534                              sizeof(parm_buffer_t));
   4535     if(rc < 0) {
   4536         ALOGE("%s:failed to map SETPARM buffer",__func__);
   4537         rc = FAILED_TRANSACTION;
   4538         goto TRANS_INIT_ERROR2;
   4539     }
   4540     m_pParamBuf = (parm_buffer_t*) DATA_PTR(m_pParamHeap,0);
   4541 
   4542     initDefaultParameters();
   4543 
   4544     m_bInited = true;
   4545 
   4546     goto TRANS_INIT_DONE;
   4547 
   4548 TRANS_INIT_ERROR2:
   4549     m_pParamHeap->deallocate();
   4550 
   4551 TRANS_INIT_ERROR1:
   4552     delete m_pParamHeap;
   4553     m_pParamHeap = NULL;
   4554 
   4555 TRANS_INIT_DONE:
   4556     return rc;
   4557 }
   4558 
   4559 /*===========================================================================
   4560  * FUNCTION   : deinit
   4561  *
   4562  * DESCRIPTION: deinitialize
   4563  *
   4564  * PARAMETERS : none
   4565  *
   4566  * RETURN     : none
   4567  *==========================================================================*/
   4568 void QCameraParameters::deinit()
   4569 {
   4570     if (!m_bInited) {
   4571         return;
   4572     }
   4573 
   4574     //clear all entries in the map
   4575     String8 emptyStr;
   4576     QCameraParameters::unflatten(emptyStr);
   4577 
   4578     if (NULL != m_pCamOpsTbl) {
   4579         m_pCamOpsTbl->ops->unmap_buf(
   4580                              m_pCamOpsTbl->camera_handle,
   4581                              CAM_MAPPING_BUF_TYPE_PARM_BUF);
   4582         m_pCamOpsTbl = NULL;
   4583     }
   4584     m_pCapability = NULL;
   4585     if (NULL != m_pParamHeap) {
   4586         m_pParamHeap->deallocate();
   4587         delete m_pParamHeap;
   4588         m_pParamHeap = NULL;
   4589         m_pParamBuf = NULL;
   4590     }
   4591 
   4592     m_AdjustFPS = NULL;
   4593 
   4594     m_tempMap.clear();
   4595 
   4596     m_bInited = false;
   4597 }
   4598 
   4599 /*===========================================================================
   4600  * FUNCTION   : parse_pair
   4601  *
   4602  * DESCRIPTION: helper function to parse string like "640x480" or "10000,20000"
   4603  *
   4604  * PARAMETERS :
   4605  *   @str     : input string to be parse
   4606  *   @first   : [output] first value of the pair
   4607  *   @second  : [output]  second value of the pair
   4608  *   @delim   : [input] delimeter to seperate the pair
   4609  *   @endptr  : [output] ptr to the end of the pair string
   4610  *
   4611  * RETURN     : int32_t type of status
   4612  *              NO_ERROR  -- success
   4613  *              none-zero failure code
   4614  *==========================================================================*/
   4615 int32_t QCameraParameters::parse_pair(const char *str,
   4616                                       int *first,
   4617                                       int *second,
   4618                                       char delim,
   4619                                       char **endptr = NULL)
   4620 {
   4621     // Find the first integer.
   4622     char *end;
   4623     int w = (int)strtol(str, &end, 10);
   4624     // If a delimeter does not immediately follow, give up.
   4625     if (*end != delim) {
   4626         ALOGE("Cannot find delimeter (%c) in str=%s", delim, str);
   4627         return BAD_VALUE;
   4628     }
   4629 
   4630     // Find the second integer, immediately after the delimeter.
   4631     int h = (int)strtol(end+1, &end, 10);
   4632 
   4633     *first = w;
   4634     *second = h;
   4635 
   4636     if (endptr) {
   4637         *endptr = end;
   4638     }
   4639 
   4640     return NO_ERROR;
   4641 }
   4642 
   4643 /*===========================================================================
   4644  * FUNCTION   : parseSizesList
   4645  *
   4646  * DESCRIPTION: helper function to parse string containing sizes
   4647  *
   4648  * PARAMETERS :
   4649  *   @sizesStr: [input] input string to be parse
   4650  *   @sizes   : [output] reference to store parsed sizes
   4651  *
   4652  * RETURN     : none
   4653  *==========================================================================*/
   4654 void QCameraParameters::parseSizesList(const char *sizesStr, Vector<Size> &sizes)
   4655 {
   4656     if (sizesStr == 0) {
   4657         return;
   4658     }
   4659 
   4660     char *sizeStartPtr = (char *)sizesStr;
   4661 
   4662     while (true) {
   4663         int width, height;
   4664         int success = parse_pair(sizeStartPtr, &width, &height, 'x',
   4665                                  &sizeStartPtr);
   4666         if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) {
   4667             ALOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
   4668             return;
   4669         }
   4670         sizes.push(Size(width, height));
   4671 
   4672         if (*sizeStartPtr == '\0') {
   4673             return;
   4674         }
   4675         sizeStartPtr++;
   4676     }
   4677 }
   4678 
   4679 /*===========================================================================
   4680  * FUNCTION   : getSupportedHfrSizes
   4681  *
   4682  * DESCRIPTION: return supported HFR sizes
   4683  *
   4684  * PARAMETERS :
   4685  *   @sizes  : [output] reference to a vector storing supported HFR sizes
   4686  *
   4687  * RETURN     : none
   4688  *==========================================================================*/
   4689 void QCameraParameters::getSupportedHfrSizes(Vector<Size> &sizes)
   4690 {
   4691     const char *hfrSizesStr = get(KEY_QC_SUPPORTED_HFR_SIZES);
   4692     parseSizesList(hfrSizesStr, sizes);
   4693 }
   4694 
   4695 /*===========================================================================
   4696  * FUNCTION   : adjustPreviewFpsRanges
   4697  *
   4698  * DESCRIPTION: adjust preview FPS ranges
   4699  *              according to external events
   4700  *
   4701  * PARAMETERS :
   4702  *   @minFPS  : min FPS value
   4703  *   @maxFPS  : max FPS value
   4704  *
   4705  * RETURN     : int32_t type of status
   4706  *              NO_ERROR  -- success
   4707  *              none-zero failure code
   4708  *==========================================================================*/
   4709 int32_t QCameraParameters::adjustPreviewFpsRange(cam_fps_range_t *fpsRange)
   4710 {
   4711     if ( fpsRange == NULL ) {
   4712         return BAD_VALUE;
   4713     }
   4714 
   4715     if ( m_pParamBuf == NULL ) {
   4716         return NO_INIT;
   4717     }
   4718 
   4719     int32_t rc = initBatchUpdate(m_pParamBuf);
   4720     if ( rc != NO_ERROR ) {
   4721         ALOGE("%s:Failed to initialize group update table", __func__);
   4722         return rc;
   4723     }
   4724 
   4725     rc = AddSetParmEntryToBatch(m_pParamBuf,
   4726                                   CAM_INTF_PARM_FPS_RANGE,
   4727                                   sizeof(cam_fps_range_t),
   4728                                   fpsRange);
   4729     if ( rc != NO_ERROR ) {
   4730         ALOGE("%s: Parameters batch failed",__func__);
   4731         return rc;
   4732     }
   4733 
   4734     rc = commitSetBatch();
   4735     if ( rc != NO_ERROR ) {
   4736         ALOGE("%s:Failed to commit batch parameters", __func__);
   4737         return rc;
   4738     }
   4739 
   4740     return rc;
   4741 }
   4742 
   4743 /*===========================================================================
   4744  * FUNCTION   : setPreviewFpsRanges
   4745  *
   4746  * DESCRIPTION: set preview FPS ranges
   4747  *
   4748  * PARAMETERS :
   4749  *   @minFPS  : min FPS value
   4750  *   @maxFPS  : max FPS value
   4751  *
   4752  * RETURN     : int32_t type of status
   4753  *              NO_ERROR  -- success
   4754  *              none-zero failure code
   4755  *==========================================================================*/
   4756 int32_t QCameraParameters::setPreviewFpsRange(int min_fps,
   4757         int max_fps, int vid_min_fps,int vid_max_fps)
   4758 {
   4759     char str[32];
   4760     char value[PROPERTY_VALUE_MAX];
   4761     int fixedFpsValue;
   4762     /*This property get value should be the fps that user needs*/
   4763     property_get("persist.debug.set.fixedfps", value, "0");
   4764     fixedFpsValue = atoi(value);
   4765 
   4766     CDBG_HIGH("%s: E minFps = %d, maxFps = %d , vid minFps = %d, vid maxFps = %d",
   4767                 __func__, min_fps, max_fps, vid_min_fps, vid_max_fps);
   4768 
   4769     if(fixedFpsValue != 0) {
   4770       min_fps = (int)fixedFpsValue*1000;
   4771       max_fps = (int)fixedFpsValue*1000;
   4772     }
   4773     snprintf(str, sizeof(str), "%d,%d", min_fps, max_fps);
   4774     CDBG_HIGH("%s: Setting preview fps range %s", __func__, str);
   4775     updateParamEntry(KEY_PREVIEW_FPS_RANGE, str);
   4776     cam_fps_range_t fps_range;
   4777     memset(&fps_range, 0x00, sizeof(cam_fps_range_t));
   4778     fps_range.min_fps = min_fps / float (1000.0);
   4779     fps_range.max_fps = max_fps / float (1000.0);
   4780     fps_range.video_min_fps = vid_min_fps / float (1000.0);
   4781     fps_range.video_max_fps = vid_max_fps / float (1000.0);
   4782 
   4783 
   4784     CDBG_HIGH("%s: Updated: minFps = %d, maxFps = %d ,"
   4785             " vid minFps = %d, vid maxFps = %d",
   4786             __func__, min_fps, max_fps, vid_min_fps, vid_max_fps);
   4787 
   4788     if ( NULL != m_AdjustFPS ) {
   4789         m_AdjustFPS->recalcFPSRange(min_fps, max_fps, vid_min_fps, vid_max_fps);
   4790         CDBG_HIGH("%s: Thermal adjusted preview fps range %d,%d, %d, %d",
   4791               __func__,
   4792               min_fps,
   4793               max_fps, vid_min_fps, vid_max_fps);
   4794         fps_range.min_fps = min_fps;
   4795         fps_range.max_fps = max_fps;
   4796         fps_range.video_min_fps = vid_min_fps;
   4797         fps_range.video_max_fps = vid_max_fps;
   4798 
   4799     }
   4800 
   4801     return AddSetParmEntryToBatch(m_pParamBuf,
   4802                                   CAM_INTF_PARM_FPS_RANGE,
   4803                                   sizeof(cam_fps_range_t),
   4804                                   &fps_range);
   4805 }
   4806 
   4807 
   4808 
   4809 /*===========================================================================
   4810  * FUNCTION   : setAutoExposure
   4811  *
   4812  * DESCRIPTION: set auto exposure
   4813  *
   4814  * PARAMETERS :
   4815  *   @autoExp : auto exposure value string
   4816  *
   4817  * RETURN     : int32_t type of status
   4818  *              NO_ERROR  -- success
   4819  *              none-zero failure code
   4820  *==========================================================================*/
   4821 int32_t QCameraParameters::setAutoExposure(const char *autoExp)
   4822 {
   4823     if (autoExp != NULL) {
   4824         int32_t value = lookupAttr(AUTO_EXPOSURE_MAP,
   4825                                    sizeof(AUTO_EXPOSURE_MAP)/sizeof(AUTO_EXPOSURE_MAP[0]),
   4826                                    autoExp);
   4827         if (value != NAME_NOT_FOUND) {
   4828             CDBG_HIGH("%s: Setting auto exposure %s", __func__, autoExp);
   4829             updateParamEntry(KEY_QC_AUTO_EXPOSURE, autoExp);
   4830             return AddSetParmEntryToBatch(m_pParamBuf,
   4831                                           CAM_INTF_PARM_AEC_ALGO_TYPE,
   4832                                           sizeof(value),
   4833                                           &value);
   4834         }
   4835     }
   4836     ALOGE("Invalid auto exposure value: %s", (autoExp == NULL) ? "NULL" : autoExp);
   4837     return BAD_VALUE;
   4838 }
   4839 
   4840 /*===========================================================================
   4841  * FUNCTION   : setEffect
   4842  *
   4843  * DESCRIPTION: set effect
   4844  *
   4845  * PARAMETERS :
   4846  *   @effect  : effect value string
   4847  *
   4848  * RETURN     : int32_t type of status
   4849  *              NO_ERROR  -- success
   4850  *              none-zero failure code
   4851  *==========================================================================*/
   4852 int32_t QCameraParameters::setEffect(const char *effect)
   4853 {
   4854     if (effect != NULL) {
   4855         int32_t value = lookupAttr(EFFECT_MODES_MAP,
   4856                                    sizeof(EFFECT_MODES_MAP)/sizeof(QCameraMap),
   4857                                    effect);
   4858         if (value != NAME_NOT_FOUND) {
   4859             CDBG_HIGH("%s: Setting effect %s", __func__, effect);
   4860             updateParamEntry(KEY_EFFECT, effect);
   4861             uint8_t prmEffect = static_cast<uint8_t>(value);
   4862             return AddSetParmEntryToBatch(m_pParamBuf,
   4863                                           CAM_INTF_PARM_EFFECT,
   4864                                           sizeof(prmEffect),
   4865                                           &prmEffect);
   4866         }
   4867     }
   4868     ALOGE("Invalid effect value: %s", (effect == NULL) ? "NULL" : effect);
   4869     return BAD_VALUE;
   4870 }
   4871 
   4872 /*===========================================================================
   4873  * FUNCTION   : setBrightness
   4874  *
   4875  * DESCRIPTION: set brightness control value
   4876  *
   4877  * PARAMETERS :
   4878  *   @brightness  : brightness control value
   4879  *
   4880  * RETURN     : int32_t type of status
   4881  *              NO_ERROR  -- success
   4882  *              none-zero failure code
   4883  *==========================================================================*/
   4884 int32_t QCameraParameters::setBrightness(int brightness)
   4885 {
   4886     char val[16];
   4887     sprintf(val, "%d", brightness);
   4888     updateParamEntry(KEY_QC_BRIGHTNESS, val);
   4889 
   4890     int32_t value = brightness;
   4891     CDBG_HIGH("%s: Setting brightness %s", __func__, val);
   4892     return AddSetParmEntryToBatch(m_pParamBuf,
   4893                                   CAM_INTF_PARM_BRIGHTNESS,
   4894                                   sizeof(value),
   4895                                   &value);
   4896 }
   4897 
   4898 /*===========================================================================
   4899  * FUNCTION   : setFocusMode
   4900  *
   4901  * DESCRIPTION: set focus mode
   4902  *
   4903  * PARAMETERS :
   4904  *   @focusMode  : focus mode value string
   4905  *
   4906  * RETURN     : int32_t type of status
   4907  *              NO_ERROR  -- success
   4908  *              none-zero failure code
   4909  *==========================================================================*/
   4910 int32_t QCameraParameters::setFocusMode(const char *focusMode)
   4911 {
   4912     int32_t rc;
   4913     if (focusMode != NULL) {
   4914         int32_t value = lookupAttr(FOCUS_MODES_MAP,
   4915                                    sizeof(FOCUS_MODES_MAP)/sizeof(QCameraMap),
   4916                                    focusMode);
   4917         if (value != NAME_NOT_FOUND) {
   4918             CDBG_HIGH("%s: Setting focus mode %s", __func__, focusMode);
   4919             uint8_t fm = (uint8_t)value;
   4920             mFocusMode = (cam_focus_mode_type)value;
   4921 
   4922             updateParamEntry(KEY_FOCUS_MODE, focusMode);
   4923             rc = AddSetParmEntryToBatch(m_pParamBuf,
   4924                                           CAM_INTF_PARM_FOCUS_MODE,
   4925                                           sizeof(fm),
   4926                                           &fm);
   4927             if (strcmp(focusMode,"infinity")==0){
   4928                 set(QCameraParameters::KEY_FOCUS_DISTANCES, "Infinity,Infinity,Infinity");
   4929             }
   4930             return rc;
   4931         }
   4932     }
   4933     ALOGE("Invalid focus mode value: %s", (focusMode == NULL) ? "NULL" : focusMode);
   4934     return BAD_VALUE;
   4935 }
   4936 
   4937 /*===========================================================================
   4938  * FUNCTION   : setSharpness
   4939  *
   4940  * DESCRIPTION: set sharpness control value
   4941  *
   4942  * PARAMETERS :
   4943  *   @sharpness  : sharpness control value
   4944  *
   4945  * RETURN     : int32_t type of status
   4946  *              NO_ERROR  -- success
   4947  *              none-zero failure code
   4948  *==========================================================================*/
   4949 int32_t QCameraParameters::setSharpness(int sharpness)
   4950 {
   4951     char val[16];
   4952     sprintf(val, "%d", sharpness);
   4953     updateParamEntry(KEY_QC_SHARPNESS, val);
   4954     CDBG_HIGH("%s: Setting sharpness %s", __func__, val);
   4955 
   4956     int32_t value = sharpness;
   4957     return AddSetParmEntryToBatch(m_pParamBuf,
   4958                                   CAM_INTF_PARM_SHARPNESS,
   4959                                   sizeof(value),
   4960                                   &value);
   4961 }
   4962 
   4963 /*===========================================================================
   4964  * FUNCTION   : setSkinToneEnhancement
   4965  *
   4966  * DESCRIPTION: set skin tone enhancement value
   4967  *
   4968  * PARAMETERS :
   4969  *   @sceFactore  : skin tone enhancement factor value
   4970  *
   4971  * RETURN     : int32_t type of status
   4972  *              NO_ERROR  -- success
   4973  *              none-zero failure code
   4974  *==========================================================================*/
   4975 int32_t QCameraParameters::setSkinToneEnhancement(int sceFactor)
   4976 {
   4977     char val[16];
   4978     sprintf(val, "%d", sceFactor);
   4979     updateParamEntry(KEY_QC_SCE_FACTOR, val);
   4980     CDBG_HIGH("%s: Setting skintone enhancement %s", __func__, val);
   4981 
   4982     int32_t value = sceFactor;
   4983     return AddSetParmEntryToBatch(m_pParamBuf,
   4984                                   CAM_INTF_PARM_SCE_FACTOR,
   4985                                   sizeof(value),
   4986                                   &value);
   4987 }
   4988 
   4989 /*===========================================================================
   4990  * FUNCTION   : setSaturation
   4991  *
   4992  * DESCRIPTION: set saturation control value
   4993  *
   4994  * PARAMETERS :
   4995  *   @saturation : saturation control value
   4996  *
   4997  * RETURN     : int32_t type of status
   4998  *              NO_ERROR  -- success
   4999  *              none-zero failure code
   5000  *==========================================================================*/
   5001 int32_t QCameraParameters::setSaturation(int saturation)
   5002 {
   5003     char val[16];
   5004     sprintf(val, "%d", saturation);
   5005     updateParamEntry(KEY_QC_SATURATION, val);
   5006     CDBG_HIGH("%s: Setting saturation %s", __func__, val);
   5007 
   5008     int32_t value = saturation;
   5009     return AddSetParmEntryToBatch(m_pParamBuf,
   5010                                   CAM_INTF_PARM_SATURATION,
   5011                                   sizeof(value),
   5012                                   &value);
   5013 }
   5014 
   5015 /*===========================================================================
   5016  * FUNCTION   : setContrast
   5017  *
   5018  * DESCRIPTION: set contrast control value
   5019  *
   5020  * PARAMETERS :
   5021  *   @contrast : contrast control value
   5022  *
   5023  * RETURN     : int32_t type of status
   5024  *              NO_ERROR  -- success
   5025  *              none-zero failure code
   5026  *==========================================================================*/
   5027 int32_t QCameraParameters::setContrast(int contrast)
   5028 {
   5029     char val[16];
   5030     sprintf(val, "%d", contrast);
   5031     updateParamEntry(KEY_QC_CONTRAST, val);
   5032     CDBG_HIGH("%s: Setting contrast %s", __func__, val);
   5033 
   5034     int32_t value = contrast;
   5035     return AddSetParmEntryToBatch(m_pParamBuf,
   5036                                   CAM_INTF_PARM_CONTRAST,
   5037                                   sizeof(value),
   5038                                   &value);
   5039 }
   5040 
   5041 /*===========================================================================
   5042  * FUNCTION   : setSceneDetect
   5043  *
   5044  * DESCRIPTION: set scenen detect value
   5045  *
   5046  * PARAMETERS :
   5047  *   @sceneDetect  : scene detect value string
   5048  *
   5049  * RETURN     : int32_t type of status
   5050  *              NO_ERROR  -- success
   5051  *              none-zero failure code
   5052  *==========================================================================*/
   5053 int32_t QCameraParameters::setSceneDetect(const char *sceneDetect)
   5054 {
   5055     if (sceneDetect != NULL) {
   5056         int32_t value = lookupAttr(ON_OFF_MODES_MAP,
   5057                                    sizeof(ON_OFF_MODES_MAP)/sizeof(QCameraMap),
   5058                                    sceneDetect);
   5059         if (value != NAME_NOT_FOUND) {
   5060             CDBG_HIGH("%s: Setting Scene Detect %s", __func__, sceneDetect);
   5061             updateParamEntry(KEY_QC_SCENE_DETECT, sceneDetect);
   5062             return AddSetParmEntryToBatch(m_pParamBuf,
   5063                                           CAM_INTF_PARM_ASD_ENABLE,
   5064                                           sizeof(value),
   5065                                           &value);
   5066         }
   5067     }
   5068     ALOGE("Invalid Scene Detect value: %s",
   5069           (sceneDetect == NULL) ? "NULL" : sceneDetect);
   5070     return BAD_VALUE;
   5071 }
   5072 
   5073 /*===========================================================================
   5074  * FUNCTION   : setSensorSnapshotHDR
   5075  *
   5076  * DESCRIPTION: set snapshot HDR value
   5077  *
   5078  * PARAMETERS :
   5079  *   @snapshotHDR  : snapshot HDR value string
   5080  *
   5081  * RETURN     : int32_t type of status
   5082  *              NO_ERROR  -- success
   5083  *              none-zero failure code
   5084  *==========================================================================*/
   5085 int32_t QCameraParameters::setSensorSnapshotHDR(const char *snapshotHDR)
   5086 {
   5087     if (snapshotHDR != NULL) {
   5088         int32_t value = lookupAttr(ON_OFF_MODES_MAP,
   5089                                    sizeof(ON_OFF_MODES_MAP)/sizeof(QCameraMap),
   5090                                    snapshotHDR);
   5091         if (value != NAME_NOT_FOUND) {
   5092             CDBG_HIGH("%s: Setting Sensor Snapshot HDR %s", __func__, snapshotHDR);
   5093             updateParamEntry(KEY_QC_SENSOR_HDR, snapshotHDR);
   5094             return AddSetParmEntryToBatch(m_pParamBuf,
   5095                                           CAM_INTF_PARM_SENSOR_HDR,
   5096                                           sizeof(value),
   5097                                           &value);
   5098         }
   5099     }
   5100     ALOGE("Invalid Snapshot HDR value: %s",
   5101           (snapshotHDR == NULL) ? "NULL" : snapshotHDR);
   5102     return BAD_VALUE;
   5103 
   5104 }
   5105 
   5106 
   5107 /*===========================================================================
   5108  * FUNCTION   : setVideoHDR
   5109  *
   5110  * DESCRIPTION: set video HDR value
   5111  *
   5112  * PARAMETERS :
   5113  *   @videoHDR  : svideo HDR value string
   5114  *
   5115  * RETURN     : int32_t type of status
   5116  *              NO_ERROR  -- success
   5117  *              none-zero failure code
   5118  *==========================================================================*/
   5119 int32_t QCameraParameters::setVideoHDR(const char *videoHDR)
   5120 {
   5121     if (videoHDR != NULL) {
   5122         int32_t value = lookupAttr(ON_OFF_MODES_MAP,
   5123                                    sizeof(ON_OFF_MODES_MAP)/sizeof(QCameraMap),
   5124                                    videoHDR);
   5125         if (value != NAME_NOT_FOUND) {
   5126             CDBG_HIGH("%s: Setting Video HDR %s", __func__, videoHDR);
   5127             updateParamEntry(KEY_QC_VIDEO_HDR, videoHDR);
   5128             return AddSetParmEntryToBatch(m_pParamBuf,
   5129                                           CAM_INTF_PARM_VIDEO_HDR,
   5130                                           sizeof(value),
   5131                                           &value);
   5132         }
   5133     }
   5134     ALOGE("Invalid Video HDR value: %s",
   5135           (videoHDR == NULL) ? "NULL" : videoHDR);
   5136     return BAD_VALUE;
   5137 }
   5138 
   5139 
   5140 
   5141 /*===========================================================================
   5142  * FUNCTION   : setVtEnable
   5143  *
   5144  * DESCRIPTION: set vt Enable value
   5145  *
   5146  * PARAMETERS :
   5147  *   @videoHDR  : svtEnable value string
   5148  *
   5149  * RETURN     : int32_t type of status
   5150  *              NO_ERROR  -- success
   5151  *              none-zero failure code
   5152  *==========================================================================*/
   5153 int32_t QCameraParameters::setVtEnable(const char *vtEnable)
   5154 {
   5155     if (vtEnable != NULL) {
   5156         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   5157                                    sizeof(ENABLE_DISABLE_MODES_MAP)/sizeof(QCameraMap),
   5158                                    vtEnable);
   5159         if (value != NAME_NOT_FOUND) {
   5160             CDBG_HIGH("%s: Setting Vt Enable %s", __func__, vtEnable);
   5161             m_bAVTimerEnabled = true;
   5162             updateParamEntry(KEY_QC_VT_ENABLE, vtEnable);
   5163             return AddSetParmEntryToBatch(m_pParamBuf,
   5164                                           CAM_INTF_PARM_VT,
   5165                                           sizeof(value),
   5166                                           &value);
   5167         }
   5168     }
   5169     ALOGE("Invalid Vt Enable value: %s",
   5170           (vtEnable == NULL) ? "NULL" : vtEnable);
   5171     m_bAVTimerEnabled = false;
   5172     return BAD_VALUE;
   5173 }
   5174 
   5175 /*===========================================================================
   5176  * FUNCTION   : setFaceRecognition
   5177  *
   5178  * DESCRIPTION: set face recognition value
   5179  *
   5180  * PARAMETERS :
   5181  *   @faceRecog  : face recognition value string
   5182  *   @maxFaces   : number of max faces to be detected/recognized
   5183  *
   5184  * RETURN     : int32_t type of status
   5185  *              NO_ERROR  -- success
   5186  *              none-zero failure code
   5187  *==========================================================================*/
   5188 int32_t QCameraParameters::setFaceRecognition(const char *faceRecog, int maxFaces)
   5189 {
   5190     if (faceRecog != NULL) {
   5191         int32_t value = lookupAttr(ON_OFF_MODES_MAP,
   5192                                    sizeof(ON_OFF_MODES_MAP)/sizeof(QCameraMap),
   5193                                    faceRecog);
   5194         if (value != NAME_NOT_FOUND) {
   5195             CDBG_HIGH("%s: Setting face recognition %s", __func__, faceRecog);
   5196             updateParamEntry(KEY_QC_FACE_RECOGNITION, faceRecog);
   5197 
   5198             int faceProcMask = m_nFaceProcMask;
   5199             if (value > 0) {
   5200                 faceProcMask |= CAM_FACE_PROCESS_MASK_RECOGNITION;
   5201             } else {
   5202                 faceProcMask &= ~CAM_FACE_PROCESS_MASK_RECOGNITION;
   5203             }
   5204 
   5205             if(m_nFaceProcMask == faceProcMask) {
   5206                 CDBG_HIGH("%s: face process mask not changed, no ops here", __func__);
   5207                 return NO_ERROR;
   5208             }
   5209             m_nFaceProcMask = faceProcMask;
   5210             CDBG_HIGH("%s: FaceProcMask -> %d", __func__, m_nFaceProcMask);
   5211 
   5212             // set parm for face process
   5213             cam_fd_set_parm_t fd_set_parm;
   5214             memset(&fd_set_parm, 0, sizeof(cam_fd_set_parm_t));
   5215             fd_set_parm.fd_mode = m_nFaceProcMask;
   5216             fd_set_parm.num_fd = maxFaces;
   5217 
   5218             return AddSetParmEntryToBatch(m_pParamBuf,
   5219                                         CAM_INTF_PARM_FD,
   5220                                         sizeof(fd_set_parm),
   5221                                         &fd_set_parm);
   5222         }
   5223     }
   5224     ALOGE("Invalid face recognition value: %s", (faceRecog == NULL) ? "NULL" : faceRecog);
   5225     return BAD_VALUE;
   5226 }
   5227 
   5228 /*===========================================================================
   5229  * FUNCTION   : setZoom
   5230  *
   5231  * DESCRIPTION: set zoom level
   5232  *
   5233  * PARAMETERS :
   5234  *   @zoom_level : zoom level
   5235  *
   5236  * RETURN     : int32_t type of status
   5237  *              NO_ERROR  -- success
   5238  *              none-zero failure code
   5239  *==========================================================================*/
   5240 int32_t QCameraParameters::setZoom(int zoom_level)
   5241 {
   5242     char val[16];
   5243     sprintf(val, "%d", zoom_level);
   5244     updateParamEntry(KEY_ZOOM, val);
   5245 
   5246     return AddSetParmEntryToBatch(m_pParamBuf,
   5247                                   CAM_INTF_PARM_ZOOM,
   5248                                   sizeof(zoom_level),
   5249                                   &zoom_level);
   5250 }
   5251 
   5252 /*===========================================================================
   5253  * FUNCTION   : setISOValue
   5254  *
   5255  * DESCRIPTION: set ISO value
   5256  *
   5257  * PARAMETERS :
   5258  *   @isoValue : ISO value string
   5259  *
   5260  * RETURN     : int32_t type of status
   5261  *              NO_ERROR  -- success
   5262  *              none-zero failure code
   5263  *==========================================================================*/
   5264 int32_t  QCameraParameters::setISOValue(const char *isoValue)
   5265 {
   5266     if (isoValue != NULL) {
   5267         int32_t value = lookupAttr(ISO_MODES_MAP,
   5268                                    sizeof(ISO_MODES_MAP)/sizeof(QCameraMap),
   5269                                    isoValue);
   5270         if (value != NAME_NOT_FOUND) {
   5271             CDBG_HIGH("%s: Setting ISO value %s", __func__, isoValue);
   5272             updateParamEntry(KEY_QC_ISO_MODE, isoValue);
   5273             return AddSetParmEntryToBatch(m_pParamBuf,
   5274                                           CAM_INTF_PARM_ISO,
   5275                                           sizeof(value),
   5276                                           &value);
   5277         }
   5278     }
   5279     ALOGE("Invalid ISO value: %s",
   5280           (isoValue == NULL) ? "NULL" : isoValue);
   5281     return BAD_VALUE;
   5282 }
   5283 
   5284 /*===========================================================================
   5285  * FUNCTION   : setLongshotEnable
   5286  *
   5287  * DESCRIPTION: set a flag indicating longshot mode
   5288  *
   5289  * PARAMETERS :
   5290  *   @enable  : true - Longshot enabled
   5291  *              false - Longshot disabled
   5292  *
   5293  * RETURN     : int32_t type of status
   5294  *              NO_ERROR  -- success
   5295  *              none-zero failure code
   5296  *==========================================================================*/
   5297 int32_t QCameraParameters::setLongshotEnable(bool enable)
   5298 {
   5299     int32_t rc = NO_ERROR;
   5300     int8_t value = enable;
   5301 
   5302     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   5303         ALOGE("%s:Failed to initialize group update table", __func__);
   5304         return BAD_TYPE;
   5305     }
   5306 
   5307     rc = AddSetParmEntryToBatch(m_pParamBuf,
   5308           CAM_INTF_PARM_LONGSHOT_ENABLE,
   5309           sizeof(value),
   5310           &value);
   5311     if (rc != NO_ERROR) {
   5312         ALOGE("%s:Failed to update table", __func__);
   5313         return rc;
   5314     }
   5315 
   5316     rc = commitSetBatch();
   5317     if (rc != NO_ERROR) {
   5318         ALOGE("%s:Failed to parameter changes", __func__);
   5319         return rc;
   5320     }
   5321 
   5322     return rc;
   5323 }
   5324 
   5325 /*===========================================================================
   5326  * FUNCTION   : setFlash
   5327  *
   5328  * DESCRIPTION: set flash mode
   5329  *
   5330  * PARAMETERS :
   5331  *   @flashStr : LED flash mode value string
   5332  *
   5333  * RETURN     : int32_t type of status
   5334  *              NO_ERROR  -- success
   5335  *              none-zero failure code
   5336  *==========================================================================*/
   5337 int32_t QCameraParameters::setFlash(const char *flashStr)
   5338 {
   5339     if (flashStr != NULL) {
   5340         int32_t value = lookupAttr(FLASH_MODES_MAP,
   5341                                    sizeof(FLASH_MODES_MAP)/sizeof(QCameraMap),
   5342                                    flashStr);
   5343         if (value != NAME_NOT_FOUND) {
   5344             CDBG_HIGH("%s: Setting Flash value %s", __func__, flashStr);
   5345 
   5346             if (NULL != m_pTorch && !m_bRecordingHint_new) {
   5347                 if ( value == CAM_FLASH_MODE_TORCH ) {
   5348                     m_pTorch->prepareTorchCamera();
   5349                 } else {
   5350                     m_bReleaseTorchCamera = true;
   5351                 }
   5352             }
   5353 
   5354             updateParamEntry(KEY_FLASH_MODE, flashStr);
   5355             mFlashValue = value;
   5356             return NO_ERROR;
   5357         }
   5358     }
   5359     ALOGE("Invalid flash value: %s", (flashStr == NULL) ? "NULL" : flashStr);
   5360     return BAD_VALUE;
   5361 }
   5362 
   5363 /*===========================================================================
   5364  * FUNCTION   : setAecLock
   5365  *
   5366  * DESCRIPTION: set AEC lock value
   5367  *
   5368  * PARAMETERS :
   5369  *   @aecLockStr : AEC lock value string
   5370  *
   5371  * RETURN     : int32_t type of status
   5372  *              NO_ERROR  -- success
   5373  *              none-zero failure code
   5374  *==========================================================================*/
   5375 int32_t QCameraParameters::setAecLock(const char *aecLockStr)
   5376 {
   5377     if (aecLockStr != NULL) {
   5378         int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP,
   5379                                   sizeof(TRUE_FALSE_MODES_MAP)/
   5380                                       sizeof(QCameraMap),
   5381                                   aecLockStr);
   5382         if (value != NAME_NOT_FOUND) {
   5383             CDBG_HIGH("%s: Setting AECLock value %s", __func__, aecLockStr);
   5384             updateParamEntry(KEY_AUTO_EXPOSURE_LOCK, aecLockStr);
   5385             return AddSetParmEntryToBatch(m_pParamBuf,
   5386                                           CAM_INTF_PARM_AEC_LOCK,
   5387                                           sizeof(value),
   5388                                           &value);
   5389         }
   5390     }
   5391     ALOGE("Invalid AECLock value: %s",
   5392         (aecLockStr == NULL) ? "NULL" : aecLockStr);
   5393     return BAD_VALUE;
   5394 }
   5395 
   5396 /*===========================================================================
   5397  * FUNCTION   : setAwbLock
   5398  *
   5399  * DESCRIPTION: set AWB lock value
   5400  *
   5401  * PARAMETERS :
   5402  *   @awbLockStr : AWB lock value string
   5403  *
   5404  * RETURN     : int32_t type of status
   5405  *              NO_ERROR  -- success
   5406  *              none-zero failure code
   5407  *==========================================================================*/
   5408 int32_t QCameraParameters::setAwbLock(const char *awbLockStr)
   5409 {
   5410     if (awbLockStr != NULL) {
   5411         int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP,
   5412                                    sizeof(TRUE_FALSE_MODES_MAP)/sizeof(QCameraMap),
   5413                                    awbLockStr);
   5414         if (value != NAME_NOT_FOUND) {
   5415             CDBG_HIGH("%s: Setting AWBLock value %s", __func__, awbLockStr);
   5416             updateParamEntry(KEY_AUTO_WHITEBALANCE_LOCK, awbLockStr);
   5417             return AddSetParmEntryToBatch(m_pParamBuf,
   5418                                           CAM_INTF_PARM_AWB_LOCK,
   5419                                           sizeof(value),
   5420                                           &value);
   5421         }
   5422     }
   5423     ALOGE("Invalid AWBLock value: %s", (awbLockStr == NULL) ? "NULL" : awbLockStr);
   5424     return BAD_VALUE;
   5425 }
   5426 
   5427 /*===========================================================================
   5428  * FUNCTION   : setMCEValue
   5429  *
   5430  * DESCRIPTION: set memory color enhancement value
   5431  *
   5432  * PARAMETERS :
   5433  *   @mceStr : MCE value string
   5434  *
   5435  * RETURN     : int32_t type of status
   5436  *              NO_ERROR  -- success
   5437  *              none-zero failure code
   5438  *==========================================================================*/
   5439 int32_t QCameraParameters::setMCEValue(const char *mceStr)
   5440 {
   5441     if (mceStr != NULL) {
   5442         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   5443                                    sizeof(ENABLE_DISABLE_MODES_MAP)/sizeof(QCameraMap),
   5444                                    mceStr);
   5445         if (value != NAME_NOT_FOUND) {
   5446             CDBG_HIGH("%s: Setting AWBLock value %s", __func__, mceStr);
   5447             updateParamEntry(KEY_QC_MEMORY_COLOR_ENHANCEMENT, mceStr);
   5448             return AddSetParmEntryToBatch(m_pParamBuf,
   5449                                           CAM_INTF_PARM_MCE,
   5450                                           sizeof(value),
   5451                                           &value);
   5452         }
   5453     }
   5454     ALOGE("Invalid MCE value: %s", (mceStr == NULL) ? "NULL" : mceStr);
   5455     return BAD_VALUE;
   5456 }
   5457 
   5458 /*===========================================================================
   5459  * FUNCTION   : setTintlessValue
   5460  *
   5461  * DESCRIPTION: enable/disable tintless from user setting
   5462  *
   5463  * PARAMETERS :
   5464  *   @params  : user setting parameters
   5465  *
   5466  * RETURN     : int32_t type of status
   5467  *              NO_ERROR  -- success
   5468  *              none-zero failure code
   5469  *==========================================================================*/
   5470 int32_t QCameraParameters::setTintlessValue(const QCameraParameters& params)
   5471 {
   5472     const char *str = params.get(KEY_QC_TINTLESS_ENABLE);
   5473     const char *prev_str = get(KEY_QC_TINTLESS_ENABLE);
   5474     char prop[PROPERTY_VALUE_MAX];
   5475 
   5476     memset(prop, 0, sizeof(prop));
   5477     property_get("persist.camera.tintless", prop, VALUE_DISABLE);
   5478     if (str != NULL) {
   5479         if (prev_str == NULL ||
   5480             strcmp(str, prev_str) != 0) {
   5481             return setTintlessValue(str);
   5482         }
   5483     } else {
   5484         if (prev_str == NULL ||
   5485             strcmp(prev_str, prop) != 0 ) {
   5486             setTintlessValue(prop);
   5487         }
   5488     }
   5489 
   5490     return NO_ERROR;
   5491 }
   5492 
   5493 /*===========================================================================
   5494  * FUNCTION   : setTintlessValue
   5495  *
   5496  * DESCRIPTION: set tintless value
   5497  *
   5498  * PARAMETERS :
   5499  *   @tintStr : Tintless value string
   5500  *
   5501  * RETURN     : int32_t type of status
   5502  *              NO_ERROR  -- success
   5503  *              none-zero failure code
   5504  *==========================================================================*/
   5505 int32_t QCameraParameters::setTintlessValue(const char *tintStr)
   5506 {
   5507     if (tintStr != NULL) {
   5508         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   5509                                    sizeof(ENABLE_DISABLE_MODES_MAP)/sizeof(QCameraMap),
   5510                                    tintStr);
   5511         if (value != NAME_NOT_FOUND) {
   5512             CDBG_HIGH("%s: Setting Tintless value %s", __func__, tintStr);
   5513             updateParamEntry(KEY_QC_TINTLESS_ENABLE, tintStr);
   5514             return AddSetParmEntryToBatch(m_pParamBuf,
   5515                                           CAM_INTF_PARM_TINTLESS,
   5516                                           sizeof(value),
   5517                                           &value);
   5518         }
   5519     }
   5520     ALOGE("Invalid Tintless value: %s", (tintStr == NULL) ? "NULL" : tintStr);
   5521     return BAD_VALUE;
   5522 }
   5523 
   5524 /*===========================================================================
   5525  * FUNCTION   : setCDSMode
   5526  *
   5527  * DESCRIPTION: Set CDS mode
   5528  *
   5529  * PARAMETERS :
   5530  *   @params  : user setting parameters
   5531  *
   5532  * RETURN     : int32_t type of status
   5533  *              NO_ERROR  -- success
   5534  *              none-zero failure code
   5535  *==========================================================================*/
   5536 int32_t QCameraParameters::setCDSMode(const QCameraParameters& params)
   5537 {
   5538     const char *str = params.get(KEY_QC_CDS_MODE);
   5539     const char *prev_str = get(KEY_QC_CDS_MODE);
   5540     char *cds_mode_str = NULL;
   5541     int32_t rc = NO_ERROR;
   5542 
   5543     if (str) {
   5544         if (!prev_str || !strcmp(str, prev_str)) {
   5545             cds_mode_str = (char *)str;
   5546         }
   5547     } else {
   5548         char prop[PROPERTY_VALUE_MAX];
   5549         memset(prop, 0, sizeof(prop));
   5550         property_get("persist.camera.CDS", prop, CDS_MODE_AUTO);
   5551         cds_mode_str = prop;
   5552     }
   5553 
   5554     if (cds_mode_str) {
   5555         ALOGV("%s: Set CDS mode = %s", __func__, cds_mode_str);
   5556 
   5557         int32_t cds_mode = lookupAttr(CDS_MODES_MAP,
   5558                                   sizeof(CDS_MODES_MAP) / sizeof(QCameraMap),
   5559                                   cds_mode_str);
   5560 
   5561         rc = AddSetParmEntryToBatch(m_pParamBuf,
   5562                                     CAM_INTF_PARM_CDS_MODE,
   5563                                     sizeof(cds_mode),
   5564                                     &cds_mode);
   5565         if (rc != NO_ERROR) {
   5566             ALOGE("%s:Failed CDS MODE to update table", __func__);
   5567         }
   5568     }
   5569     return rc;
   5570 }
   5571 
   5572 /*===========================================================================
   5573  * FUNCTION   : setDISValue
   5574  *
   5575  * DESCRIPTION: set DIS value
   5576  *
   5577  * PARAMETERS :
   5578  *   @disStr : DIS value string
   5579  *
   5580  * RETURN     : int32_t type of status
   5581  *              NO_ERROR  -- success
   5582  *              none-zero failure code
   5583  *==========================================================================*/
   5584 int32_t QCameraParameters::setDISValue(const char *disStr)
   5585 {
   5586     if (disStr != NULL) {
   5587         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   5588                                    sizeof(ENABLE_DISABLE_MODES_MAP)/sizeof(QCameraMap),
   5589                                    disStr);
   5590         if (value != NAME_NOT_FOUND) {
   5591             //For some IS types (like EIS 2.0), when DIS value is changed, we need to restart
   5592             //preview because of topology change in backend. But, for now, restart preview
   5593             //for all IS types.
   5594             m_bNeedRestart = true;
   5595             CDBG("%s: Setting DIS value %s", __func__, disStr);
   5596             updateParamEntry(KEY_QC_DIS, disStr);
   5597             if (!(strcmp(disStr,"enable"))) {
   5598                 m_bDISEnabled = true;
   5599             } else {
   5600                 m_bDISEnabled = false;
   5601             }
   5602             return AddSetParmEntryToBatch(m_pParamBuf,
   5603                                           CAM_INTF_PARM_DIS_ENABLE,
   5604                                           sizeof(value),
   5605                                           &value);
   5606         }
   5607     }
   5608     ALOGE("Invalid DIS value: %s", (disStr == NULL) ? "NULL" : disStr);
   5609     m_bDISEnabled = false;
   5610     return BAD_VALUE;
   5611 }
   5612 
   5613 /*===========================================================================
   5614  * FUNCTION   : setHighFrameRate
   5615  *
   5616  * DESCRIPTION: set high frame rate
   5617  *
   5618  * PARAMETERS :
   5619  *   @hfrStr : HFR value string
   5620  *
   5621  * RETURN     : int32_t type of status
   5622  *              NO_ERROR  -- success
   5623  *              none-zero failure code
   5624  *==========================================================================*/
   5625 int32_t QCameraParameters::setHighFrameRate(const char *hfrStr)
   5626 {
   5627     if (hfrStr != NULL) {
   5628         int32_t value = lookupAttr(HFR_MODES_MAP,
   5629                                    sizeof(HFR_MODES_MAP)/sizeof(QCameraMap),
   5630                                    hfrStr);
   5631         if (value != NAME_NOT_FOUND) {
   5632             // HFR value changed, need to restart preview
   5633             m_bNeedRestart = true;
   5634             // Set HFR value
   5635             CDBG_HIGH("%s: Setting HFR value %s", __func__, hfrStr);
   5636             updateParamEntry(KEY_QC_VIDEO_HIGH_FRAME_RATE, hfrStr);
   5637             return AddSetParmEntryToBatch(m_pParamBuf,
   5638                                           CAM_INTF_PARM_HFR,
   5639                                           sizeof(value),
   5640                                           &value);
   5641         }
   5642     }
   5643     ALOGE("Invalid HFR value: %s", (hfrStr == NULL) ? "NULL" : hfrStr);
   5644     return BAD_VALUE;
   5645 }
   5646 
   5647 /*===========================================================================
   5648  * FUNCTION   : setLensShadeValue
   5649  *
   5650  * DESCRIPTION: set lens shade value
   5651  *
   5652  * PARAMETERS :
   5653  *   @lensSahdeStr : lens shade value string
   5654  *
   5655  * RETURN     : int32_t type of status
   5656  *              NO_ERROR  -- success
   5657  *              none-zero failure code
   5658  *==========================================================================*/
   5659 int32_t QCameraParameters::setLensShadeValue(const char *lensShadeStr)
   5660 {
   5661     if (lensShadeStr != NULL) {
   5662         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   5663                                    sizeof(ENABLE_DISABLE_MODES_MAP)/sizeof(QCameraMap),
   5664                                    lensShadeStr);
   5665         if (value != NAME_NOT_FOUND) {
   5666             CDBG_HIGH("%s: Setting LensShade value %s", __func__, lensShadeStr);
   5667             updateParamEntry(KEY_QC_LENSSHADE, lensShadeStr);
   5668             return AddSetParmEntryToBatch(m_pParamBuf,
   5669                                           CAM_INTF_PARM_ROLLOFF,
   5670                                           sizeof(value),
   5671                                           &value);
   5672         }
   5673     }
   5674     ALOGE("Invalid LensShade value: %s",
   5675           (lensShadeStr == NULL) ? "NULL" : lensShadeStr);
   5676     return BAD_VALUE;
   5677 }
   5678 
   5679 /*===========================================================================
   5680  * FUNCTION   : setExposureCompensation
   5681  *
   5682  * DESCRIPTION: set exposure compensation value
   5683  *
   5684  * PARAMETERS :
   5685  *   @expComp : exposure compensation value
   5686  *
   5687  * RETURN     : int32_t type of status
   5688  *              NO_ERROR  -- success
   5689  *              none-zero failure code
   5690  *==========================================================================*/
   5691 int32_t QCameraParameters::setExposureCompensation(int expComp)
   5692 {
   5693     char val[16];
   5694     sprintf(val, "%d", expComp);
   5695     updateParamEntry(KEY_EXPOSURE_COMPENSATION, val);
   5696 
   5697     // Don't need to pass step as part of setParameter because
   5698     // camera daemon is already aware of it.
   5699     return AddSetParmEntryToBatch(m_pParamBuf,
   5700                                   CAM_INTF_PARM_EXPOSURE_COMPENSATION,
   5701                                   sizeof(expComp),
   5702                                   &expComp);
   5703 }
   5704 
   5705 /*===========================================================================
   5706  * FUNCTION   : setWhiteBalance
   5707  *
   5708  * DESCRIPTION: set white balance mode
   5709  *
   5710  * PARAMETERS :
   5711  *   @wbStr   : white balance mode value string
   5712  *
   5713  * RETURN     : int32_t type of status
   5714  *              NO_ERROR  -- success
   5715  *              none-zero failure code
   5716  *==========================================================================*/
   5717 int32_t QCameraParameters::setWhiteBalance(const char *wbStr)
   5718 {
   5719     if (wbStr != NULL) {
   5720         int32_t value = lookupAttr(WHITE_BALANCE_MODES_MAP,
   5721                                    sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(QCameraMap),
   5722                                    wbStr);
   5723         if (value != NAME_NOT_FOUND) {
   5724             CDBG_HIGH("%s: Setting WhiteBalance value %s", __func__, wbStr);
   5725             updateParamEntry(KEY_WHITE_BALANCE, wbStr);
   5726             return AddSetParmEntryToBatch(m_pParamBuf,
   5727                                           CAM_INTF_PARM_WHITE_BALANCE,
   5728                                           sizeof(value),
   5729                                           &value);
   5730         }
   5731     }
   5732     ALOGE("Invalid WhiteBalance value: %s", (wbStr == NULL) ? "NULL" : wbStr);
   5733     return BAD_VALUE;
   5734 }
   5735 int QCameraParameters::getAutoFlickerMode()
   5736 {
   5737     /* Enable Advanced Auto Antibanding where we can set
   5738        any of the following option
   5739        ie. CAM_ANTIBANDING_MODE_AUTO
   5740            CAM_ANTIBANDING_MODE_AUTO_50HZ
   5741            CAM_ANTIBANDING_MODE_AUTO_60HZ
   5742       Currently setting it to default    */
   5743     char prop[PROPERTY_VALUE_MAX];
   5744     memset(prop, 0, sizeof(prop));
   5745     property_get("persist.camera.set.afd", prop, "3");
   5746     return atoi(prop);
   5747 }
   5748 
   5749 /*===========================================================================
   5750  * FUNCTION   : setAntibanding
   5751  *
   5752  * DESCRIPTION: set antibanding value
   5753  *
   5754  * PARAMETERS :
   5755  *   @antiBandingStr : antibanding value string
   5756  *
   5757  * RETURN     : int32_t type of status
   5758  *              NO_ERROR  -- success
   5759  *              none-zero failure code
   5760  *==========================================================================*/
   5761 int32_t QCameraParameters::setAntibanding(const char *antiBandingStr)
   5762 {
   5763     if (antiBandingStr != NULL) {
   5764         int32_t value = lookupAttr(ANTIBANDING_MODES_MAP,
   5765                                    sizeof(ANTIBANDING_MODES_MAP)/sizeof(QCameraMap),
   5766                                    antiBandingStr);
   5767         if (value != NAME_NOT_FOUND) {
   5768             CDBG_HIGH("%s: Setting AntiBanding value %s", __func__, antiBandingStr);
   5769             updateParamEntry(KEY_ANTIBANDING, antiBandingStr);
   5770             if(value == CAM_ANTIBANDING_MODE_AUTO) {
   5771                value = getAutoFlickerMode();
   5772             }
   5773             return AddSetParmEntryToBatch(m_pParamBuf,
   5774                                           CAM_INTF_PARM_ANTIBANDING,
   5775                                           sizeof(value),
   5776                                           &value);
   5777         }
   5778     }
   5779     ALOGE("Invalid AntiBanding value: %s",
   5780           (antiBandingStr == NULL) ? "NULL" : antiBandingStr);
   5781     return BAD_VALUE;
   5782 }
   5783 
   5784 /*===========================================================================
   5785  * FUNCTION   : setFocusAreas
   5786  *
   5787  * DESCRIPTION: set focus areas
   5788  *
   5789  * PARAMETERS :
   5790  *   @focusAreasStr : focus areas value string
   5791  *
   5792  * RETURN     : int32_t type of status
   5793  *              NO_ERROR  -- success
   5794  *              none-zero failure code
   5795  *==========================================================================*/
   5796 int32_t QCameraParameters::setFocusAreas(const char *focusAreasStr)
   5797 {
   5798     if (m_pCapability->max_num_focus_areas == 0 ||
   5799         focusAreasStr == NULL) {
   5800         CDBG("%s: Parameter string is null", __func__);
   5801         return NO_ERROR;
   5802     }
   5803 
   5804     cam_area_t *areas = (cam_area_t *)malloc(sizeof(cam_area_t) * m_pCapability->max_num_focus_areas);
   5805     if (NULL == areas) {
   5806         ALOGE("%s: No memory for areas", __func__);
   5807         return NO_MEMORY;
   5808     }
   5809     memset(areas, 0, sizeof(cam_area_t) * m_pCapability->max_num_focus_areas);
   5810     int num_areas_found = 0;
   5811     if (parseCameraAreaString(focusAreasStr,
   5812                               m_pCapability->max_num_focus_areas,
   5813                               areas,
   5814                               num_areas_found) != NO_ERROR) {
   5815         ALOGE("%s: Failed to parse the string: %s", __func__, focusAreasStr);
   5816         free(areas);
   5817         return BAD_VALUE;
   5818     }
   5819 
   5820     if (validateCameraAreas(areas, num_areas_found) == false) {
   5821         ALOGE("%s: invalid areas specified : %s", __func__, focusAreasStr);
   5822         free(areas);
   5823         return BAD_VALUE;
   5824     }
   5825 
   5826     updateParamEntry(KEY_FOCUS_AREAS, focusAreasStr);
   5827 
   5828     //for special area string (0, 0, 0, 0, 0), set the num_areas_found to 0,
   5829     //so no action is takenby the lower layer
   5830     if (num_areas_found == 1 &&
   5831         areas[0].rect.left == 0 &&
   5832         areas[0].rect.top == 0 &&
   5833         areas[0].rect.width == 0 &&
   5834         areas[0].rect.height == 0 &&
   5835         areas[0].weight == 0) {
   5836         num_areas_found = 0;
   5837     }
   5838 
   5839     int previewWidth, previewHeight;
   5840     getPreviewSize(&previewWidth, &previewHeight);
   5841     cam_roi_info_t af_roi_value;
   5842     memset(&af_roi_value, 0, sizeof(cam_roi_info_t));
   5843     af_roi_value.num_roi = num_areas_found;
   5844     for (int i = 0; i < num_areas_found; i++) {
   5845         CDBG_HIGH("%s: FocusArea[%d] = (%d, %d, %d, %d)",
   5846               __func__, i, (areas[i].rect.top), (areas[i].rect.left),
   5847               (areas[i].rect.width), (areas[i].rect.height));
   5848 
   5849         //transform the coords from (-1000, 1000) to (0, previewWidth or previewHeight)
   5850         af_roi_value.roi[i].left = (int32_t)((areas[i].rect.left + 1000.0f) * (previewWidth / 2000.0f));
   5851         af_roi_value.roi[i].top = (int32_t)((areas[i].rect.top + 1000.0f) * (previewHeight / 2000.0f));
   5852         af_roi_value.roi[i].width = (int32_t)(areas[i].rect.width * previewWidth / 2000.0f);
   5853         af_roi_value.roi[i].height = (int32_t)(areas[i].rect.height * previewHeight / 2000.0f);
   5854         af_roi_value.weight[i] = areas[i].weight;
   5855     }
   5856     free(areas);
   5857     return AddSetParmEntryToBatch(m_pParamBuf,
   5858                                   CAM_INTF_PARM_AF_ROI,
   5859                                   sizeof(af_roi_value),
   5860                                   &af_roi_value);
   5861 }
   5862 
   5863 /*===========================================================================
   5864  * FUNCTION   : setMeteringAreas
   5865  *
   5866  * DESCRIPTION: set metering areas value
   5867  *
   5868  * PARAMETERS :
   5869  *   @meteringAreasStr : metering areas value string
   5870  *
   5871  * RETURN     : int32_t type of status
   5872  *              NO_ERROR  -- success
   5873  *              none-zero failure code
   5874  *==========================================================================*/
   5875 int32_t QCameraParameters::setMeteringAreas(const char *meteringAreasStr)
   5876 {
   5877     if (m_pCapability->max_num_metering_areas == 0 ||
   5878         meteringAreasStr == NULL) {
   5879         CDBG("%s: Parameter string is null", __func__);
   5880         return NO_ERROR;
   5881     }
   5882 
   5883     cam_area_t *areas = (cam_area_t *)malloc(sizeof(cam_area_t) * m_pCapability->max_num_metering_areas);
   5884     if (NULL == areas) {
   5885         ALOGE("%s: No memory for areas", __func__);
   5886         return NO_MEMORY;
   5887     }
   5888     memset(areas, 0, sizeof(cam_area_t) * m_pCapability->max_num_metering_areas);
   5889     int num_areas_found = 0;
   5890     if (parseCameraAreaString(meteringAreasStr,
   5891                               m_pCapability->max_num_metering_areas,
   5892                               areas,
   5893                               num_areas_found) < 0) {
   5894         ALOGE("%s: Failed to parse the string: %s", __func__, meteringAreasStr);
   5895         free(areas);
   5896         return BAD_VALUE;
   5897     }
   5898 
   5899     if (validateCameraAreas(areas, num_areas_found) == false) {
   5900         ALOGE("%s: invalid areas specified : %s", __func__, meteringAreasStr);
   5901         free(areas);
   5902         return BAD_VALUE;
   5903     }
   5904 
   5905     updateParamEntry(KEY_METERING_AREAS, meteringAreasStr);
   5906 
   5907     //for special area string (0, 0, 0, 0, 0), set the num_areas_found to 0,
   5908     //so no action is takenby the lower layer
   5909     if (num_areas_found == 1 &&
   5910         areas[0].rect.left == 0 &&
   5911         areas[0].rect.top == 0 &&
   5912         areas[0].rect.width == 0 &&
   5913         areas[0].rect.height == 0 &&
   5914         areas[0].weight == 0) {
   5915         num_areas_found = 0;
   5916     }
   5917     cam_set_aec_roi_t aec_roi_value;
   5918     int previewWidth, previewHeight;
   5919     getPreviewSize(&previewWidth, &previewHeight);
   5920 
   5921     memset(&aec_roi_value, 0, sizeof(cam_set_aec_roi_t));
   5922     if (num_areas_found > 0) {
   5923         aec_roi_value.aec_roi_enable = CAM_AEC_ROI_ON;
   5924         aec_roi_value.aec_roi_type = CAM_AEC_ROI_BY_COORDINATE;
   5925 
   5926         for (int i = 0; i < num_areas_found; i++) {
   5927             CDBG_HIGH("%s: MeteringArea[%d] = (%d, %d, %d, %d)",
   5928                   __func__, i, (areas[i].rect.top), (areas[i].rect.left),
   5929                   (areas[i].rect.width), (areas[i].rect.height));
   5930 
   5931             //transform the coords from (-1000, 1000) to (0, previewWidth or previewHeight)
   5932             aec_roi_value.cam_aec_roi_position.coordinate[i].x =
   5933                 (uint32_t)(((areas[i].rect.left + areas[i].rect.width / 2) + 1000.0f) * previewWidth / 2000.0f) ;
   5934             aec_roi_value.cam_aec_roi_position.coordinate[i].y =
   5935                 (uint32_t)(((areas[i].rect.top + areas[i].rect.height / 2) + 1000.0f) * previewHeight / 2000.0f) ;
   5936         }
   5937     } else {
   5938         aec_roi_value.aec_roi_enable = CAM_AEC_ROI_OFF;
   5939     }
   5940     free(areas);
   5941     return AddSetParmEntryToBatch(m_pParamBuf,
   5942                                   CAM_INTF_PARM_AEC_ROI,
   5943                                   sizeof(aec_roi_value),
   5944                                   &aec_roi_value);
   5945 }
   5946 
   5947 /*===========================================================================
   5948  * FUNCTION   : setSceneMode
   5949  *
   5950  * DESCRIPTION: set scene mode
   5951  *
   5952  * PARAMETERS :
   5953  *   @sceneModeStr : scene mode value string
   5954  *
   5955  * RETURN     : int32_t type of status
   5956  *              NO_ERROR  -- success
   5957  *              none-zero failure code
   5958  *==========================================================================*/
   5959 int32_t QCameraParameters::setSceneMode(const char *sceneModeStr)
   5960 {
   5961     if (sceneModeStr != NULL) {
   5962         int32_t value = lookupAttr(SCENE_MODES_MAP,
   5963                                    sizeof(SCENE_MODES_MAP)/sizeof(QCameraMap),
   5964                                    sceneModeStr);
   5965         if (value != NAME_NOT_FOUND) {
   5966             CDBG("%s: Setting SceneMode %s", __func__, sceneModeStr);
   5967             updateParamEntry(KEY_SCENE_MODE, sceneModeStr);
   5968             if (m_bSensorHDREnabled) {
   5969               // Incase of HW HDR mode, we do not update the same as Best shot mode.
   5970               CDBG_HIGH("%s: H/W HDR mode enabled. Do not set Best Shot Mode", __func__);
   5971               return NO_ERROR;
   5972             }
   5973             if (m_bSceneSelection) {
   5974                 setSelectedScene((cam_scene_mode_type) value);
   5975             }
   5976             int32_t rc = AddSetParmEntryToBatch(m_pParamBuf,
   5977                                                 CAM_INTF_PARM_BESTSHOT_MODE,
   5978                                                 sizeof(value),
   5979                                                 &value);
   5980             return rc;
   5981         }
   5982     }
   5983     ALOGE("%s: Invalid Secene Mode: %s",
   5984           __func__, (sceneModeStr == NULL) ? "NULL" : sceneModeStr);
   5985     return BAD_VALUE;
   5986 }
   5987 
   5988 /*===========================================================================
   5989  * FUNCTION   : setSelectableZoneAf
   5990  *
   5991  * DESCRIPTION: set selectable zone AF algorithm
   5992  *
   5993  * PARAMETERS :
   5994  *   @selZoneAFStr : selectable zone AF algorithm value string
   5995  *
   5996  * RETURN     : int32_t type of status
   5997  *              NO_ERROR  -- success
   5998  *              none-zero failure code
   5999  *==========================================================================*/
   6000 int32_t QCameraParameters::setSelectableZoneAf(const char *selZoneAFStr)
   6001 {
   6002     if (selZoneAFStr != NULL) {
   6003         int32_t value = lookupAttr(FOCUS_ALGO_MAP,
   6004                                    sizeof(FOCUS_ALGO_MAP)/sizeof(QCameraMap),
   6005                                    selZoneAFStr);
   6006         if (value != NAME_NOT_FOUND) {
   6007             CDBG("%s: Setting Selectable Zone AF value %s", __func__, selZoneAFStr);
   6008             updateParamEntry(KEY_QC_SELECTABLE_ZONE_AF, selZoneAFStr);
   6009             return AddSetParmEntryToBatch(m_pParamBuf,
   6010                                           CAM_INTF_PARM_FOCUS_ALGO_TYPE,
   6011                                           sizeof(value),
   6012                                           &value);
   6013         }
   6014     }
   6015     ALOGE("%s: Invalid selectable zone af value: %s",
   6016           __func__, (selZoneAFStr == NULL) ? "NULL" : selZoneAFStr);
   6017     return BAD_VALUE;
   6018 }
   6019 
   6020 /*===========================================================================
   6021  * FUNCTION   : isAEBracketEnabled
   6022  *
   6023  * DESCRIPTION: checks if AE bracketing is enabled
   6024  *
   6025  * PARAMETERS :
   6026  *
   6027  * RETURN     : TRUE/FALSE
   6028  *==========================================================================*/
   6029 bool QCameraParameters::isAEBracketEnabled()
   6030 {
   6031     const char *str = get(KEY_QC_AE_BRACKET_HDR);
   6032     if (str != NULL) {
   6033         if (strcmp(str, AE_BRACKET_OFF) != 0) {
   6034             return true;
   6035         }
   6036     }
   6037     return false;
   6038 }
   6039 
   6040 /*===========================================================================
   6041  * FUNCTION   : setAEBracket
   6042  *
   6043  * DESCRIPTION: set AE bracket value
   6044  *
   6045  * PARAMETERS :
   6046  *   @aecBracketStr : AE bracket value string
   6047  *
   6048  * RETURN     : int32_t type of status
   6049  *              NO_ERROR  -- success
   6050  *              none-zero failure code
   6051  *==========================================================================*/
   6052 int32_t QCameraParameters::setAEBracket(const char *aecBracketStr)
   6053 {
   6054     if (aecBracketStr == NULL) {
   6055         CDBG("%s: setAEBracket with NULL value", __func__);
   6056         return NO_ERROR;
   6057     }
   6058 
   6059     cam_exp_bracketing_t expBracket;
   6060     memset(&expBracket, 0, sizeof(expBracket));
   6061 
   6062     int value = lookupAttr(BRACKETING_MODES_MAP,
   6063                            sizeof(BRACKETING_MODES_MAP)/sizeof(QCameraMap),
   6064                            aecBracketStr);
   6065     switch (value) {
   6066     case CAM_EXP_BRACKETING_ON:
   6067         {
   6068             CDBG("%s, EXP_BRACKETING_ON", __func__);
   6069             const char *str_val = get(KEY_QC_CAPTURE_BURST_EXPOSURE);
   6070             if ((str_val != NULL) && (strlen(str_val)>0)) {
   6071                 expBracket.mode = CAM_EXP_BRACKETING_ON;
   6072                 m_bAeBracketingEnabled = true;
   6073                 strlcpy(expBracket.values, str_val, MAX_EXP_BRACKETING_LENGTH);
   6074                 CDBG("%s: setting Exposure Bracketing value of %s",
   6075                       __func__, expBracket.values);
   6076             }
   6077             else {
   6078                 /* Apps not set capture-burst-exposures, error case fall into bracketing off mode */
   6079                 CDBG("%s: capture-burst-exposures not set, back to HDR OFF mode", __func__);
   6080                 m_bAeBracketingEnabled = false;
   6081                 expBracket.mode = CAM_EXP_BRACKETING_OFF;
   6082             }
   6083         }
   6084         break;
   6085     default:
   6086         {
   6087             m_bAeBracketingEnabled = false;
   6088             CDBG_HIGH("%s, EXP_BRACKETING_OFF", __func__);
   6089             expBracket.mode = CAM_EXP_BRACKETING_OFF;
   6090         }
   6091         break;
   6092     }
   6093 
   6094     // Cache client AE bracketing configuration
   6095     memcpy(&m_AEBracketingClient, &expBracket, sizeof(cam_exp_bracketing_t));
   6096 
   6097     /* save the value*/
   6098     updateParamEntry(KEY_QC_AE_BRACKET_HDR, aecBracketStr);
   6099     return NO_ERROR;
   6100 }
   6101 
   6102 /*===========================================================================
   6103  * FUNCTION   : set3ALock
   6104  *
   6105  * DESCRIPTION: enable/disable 3A lock.
   6106  *
   6107  * PARAMETERS :
   6108  *   @lockStr : lock value string.
   6109  *
   6110  * RETURN     : int32_t type of status
   6111  *              NO_ERROR  -- success
   6112  *              none-zero failure code
   6113  *==========================================================================*/
   6114 int32_t QCameraParameters::set3ALock(const char *lockStr)
   6115 {
   6116     int32_t rc = NO_ERROR;
   6117     if (lockStr != NULL) {
   6118         int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP,
   6119                                    sizeof(TRUE_FALSE_MODES_MAP)/sizeof(QCameraMap),
   6120                                    lockStr);
   6121         if (value != NAME_NOT_FOUND) {
   6122             CDBG_HIGH("%s: Setting Lock lockStr =%s", __func__, lockStr);
   6123             if(initBatchUpdate(m_pParamBuf) < 0 ) {
   6124                 ALOGE("%s:Failed to initialize group update table", __func__);
   6125                 return BAD_TYPE;
   6126             }
   6127             int32_t focus_mode;
   6128             if (value == 1) {
   6129                 if (isUbiFocusEnabled()) {
   6130                     //For Ubi focus move focus to infinity.
   6131                     focus_mode = CAM_FOCUS_MODE_INFINITY;
   6132                 } else if (isOptiZoomEnabled()){
   6133                     //For optizoom set focus as fixed.
   6134                     focus_mode = CAM_FOCUS_MODE_FIXED;
   6135                 }
   6136             } else {
   6137                // retrieve previous focus value.
   6138                const char *focus = get(KEY_FOCUS_MODE);
   6139                focus_mode = lookupAttr(FOCUS_MODES_MAP,
   6140                                sizeof(FOCUS_MODES_MAP)/sizeof(QCameraMap),
   6141                                focus);
   6142                CDBG("%s: focus mode %s", __func__, focus);
   6143             }
   6144             //Lock AWB
   6145             rc = AddSetParmEntryToBatch(m_pParamBuf,
   6146                                     CAM_INTF_PARM_AWB_LOCK,
   6147                                     sizeof(value),
   6148                                     &value);
   6149             if (NO_ERROR != rc) {
   6150                 return rc;
   6151             }
   6152             //Lock AEC
   6153             rc = AddSetParmEntryToBatch(m_pParamBuf,
   6154                                     CAM_INTF_PARM_AEC_LOCK,
   6155                                     sizeof(value),
   6156                                     &value);
   6157             if (NO_ERROR != rc) {
   6158                 return rc;
   6159             }
   6160             rc = AddSetParmEntryToBatch(m_pParamBuf,
   6161                                     CAM_INTF_PARM_FOCUS_MODE,
   6162                                     sizeof(focus_mode),
   6163                                     &focus_mode);
   6164             if (NO_ERROR != rc) {
   6165                 return rc;
   6166             }
   6167 
   6168             rc = commitSetBatch();
   6169             if (rc != NO_ERROR) {
   6170                 ALOGE("%s:Failed to commit batch", __func__);
   6171             }
   6172         }
   6173     }
   6174     return rc;
   6175 }
   6176 
   6177 /*===========================================================================
   6178  * FUNCTION   : setAndCommitZoom
   6179  *
   6180  * DESCRIPTION: set zoom.
   6181  *
   6182  * PARAMETERS :
   6183  *     @zoom_level : zoom level to set.
   6184  *
   6185  * RETURN     : int32_t type of status
   6186  *              NO_ERROR  -- success
   6187  *              none-zero failure code
   6188  *==========================================================================*/
   6189 int32_t QCameraParameters::setAndCommitZoom(int zoom_level)
   6190 {
   6191     CDBG_HIGH("%s: E",__func__);
   6192     int32_t rc = NO_ERROR;
   6193         if(initBatchUpdate(m_pParamBuf) < 0 ) {
   6194             ALOGE("%s:Failed to initialize group update table", __func__);
   6195             return BAD_TYPE;
   6196         }
   6197         rc = AddSetParmEntryToBatch(m_pParamBuf,
   6198                               CAM_INTF_PARM_ZOOM,
   6199                               sizeof(zoom_level),
   6200                               &zoom_level);
   6201 
   6202         if (rc != NO_ERROR) {
   6203              ALOGE("%s:Failed to update table", __func__);
   6204              return rc;
   6205         }
   6206     rc = commitSetBatch();
   6207     if (rc != NO_ERROR) {
   6208         ALOGE("%s:Failed to set Flash value", __func__);
   6209     }
   6210     CDBG_HIGH("%s: X",__func__);
   6211     return rc;
   6212 }
   6213 
   6214 /*===========================================================================
   6215  * FUNCTION   : isOptiZoomEnabled
   6216  *
   6217  * DESCRIPTION: checks whether optizoom is enabled
   6218  *
   6219  * PARAMETERS :
   6220  *
   6221  * RETURN     : true - enabled, false - disabled
   6222  *
   6223  *==========================================================================*/
   6224 bool QCameraParameters::isOptiZoomEnabled()
   6225 {
   6226     if (m_bOptiZoomOn) {
   6227         uint8_t zoom_level = (uint8_t) getInt(CameraParameters::KEY_ZOOM);
   6228         cam_opti_zoom_t *opti_zoom_settings_need =
   6229                 &(m_pCapability->opti_zoom_settings_need);
   6230         uint8_t zoom_threshold = opti_zoom_settings_need->zoom_threshold;
   6231         CDBG_HIGH("%s: current zoom level =%d & zoom_threshold =%d",
   6232                 __func__, zoom_level, zoom_threshold);
   6233 
   6234         if (zoom_level >= zoom_threshold) {
   6235             return true;
   6236         }
   6237     }
   6238 
   6239     return false;
   6240 }
   6241 
   6242 /*===========================================================================
   6243  * FUNCTION   : commitAFBracket
   6244  *
   6245  * DESCRIPTION: commit AF Bracket.
   6246  *
   6247  * PARAMETERS :
   6248  *   @AFBracket : AF bracketing configuration
   6249  *
   6250  * RETURN     : int32_t type of status
   6251  *              NO_ERROR  -- success
   6252  *              none-zero failure code
   6253  *==========================================================================*/
   6254 int32_t QCameraParameters::commitAFBracket(cam_af_bracketing_t afBracket)
   6255 {
   6256 
   6257     int32_t rc = NO_ERROR;
   6258     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   6259         ALOGE("%s:Failed to initialize group update table", __func__);
   6260         return BAD_TYPE;
   6261     }
   6262 
   6263     rc = AddSetParmEntryToBatch(m_pParamBuf,
   6264             CAM_INTF_PARM_FOCUS_BRACKETING,
   6265             sizeof(afBracket),
   6266             &afBracket);
   6267     if (rc != NO_ERROR) {
   6268         ALOGE("%s:Failed to update table", __func__);
   6269         return rc;
   6270     }
   6271 
   6272     rc = commitSetBatch();
   6273     if (rc != NO_ERROR) {
   6274         ALOGE("%s:Failed to commit batch", __func__);
   6275     }
   6276 
   6277     return rc;
   6278 }
   6279 
   6280 /*===========================================================================
   6281  * FUNCTION   : commitFlashBracket
   6282  *
   6283  * DESCRIPTION: commit Flash Bracket.
   6284  *
   6285  * PARAMETERS :
   6286  *   @AFBracket : Flash bracketing configuration
   6287  *
   6288  * RETURN     : int32_t type of status
   6289  *              NO_ERROR  -- success
   6290  *              none-zero failure code
   6291  *==========================================================================*/
   6292 int32_t QCameraParameters::commitFlashBracket(
   6293     cam_flash_bracketing_t flashBracket)
   6294 {
   6295     CDBG_HIGH("%s: E",__func__);
   6296     int32_t rc = NO_ERROR;
   6297     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   6298         ALOGE("%s:Failed to initialize group update table", __func__);
   6299         return BAD_TYPE;
   6300     }
   6301 
   6302     rc = AddSetParmEntryToBatch(m_pParamBuf,
   6303             CAM_INTF_PARM_FLASH_BRACKETING,
   6304             sizeof(flashBracket),
   6305             &flashBracket);
   6306     if (rc != NO_ERROR) {
   6307         ALOGE("%s:Failed to update table", __func__);
   6308         return rc;
   6309     }
   6310 
   6311     rc = commitSetBatch();
   6312     if (rc != NO_ERROR) {
   6313         ALOGE("%s:Failed to commit batch", __func__);
   6314     }
   6315 
   6316     CDBG_HIGH("%s: X",__func__);
   6317     return rc;
   6318 }
   6319 
   6320 /*===========================================================================
   6321  * FUNCTION   : setAFBracket
   6322  *
   6323  * DESCRIPTION: set AF bracket value
   6324  *
   6325  * PARAMETERS :
   6326  *   @afBracketStr : AF bracket value string
   6327  *
   6328  * RETURN     : int32_t type of status
   6329  *              NO_ERROR  -- success
   6330  *              none-zero failure code
   6331  *==========================================================================*/
   6332 int32_t QCameraParameters::setAFBracket(const char *afBracketStr)
   6333 {
   6334     CDBG_HIGH("%s: afBracketStr =%s",__func__,afBracketStr);
   6335 
   6336     if(afBracketStr != NULL) {
   6337         int value = lookupAttr(AF_BRACKETING_MODES_MAP,
   6338                               sizeof(AF_BRACKETING_MODES_MAP)/
   6339                                   sizeof(QCameraMap),
   6340                               afBracketStr);
   6341         if (value != NAME_NOT_FOUND) {
   6342             m_bAFBracketingOn = (value != 0);
   6343             updateParamEntry(KEY_QC_AF_BRACKET, afBracketStr);
   6344 
   6345             return NO_ERROR;
   6346         }
   6347     }
   6348 
   6349     ALOGE("Invalid af bracket value: %s",
   6350         (afBracketStr == NULL) ? "NULL" : afBracketStr);
   6351     return BAD_VALUE;
   6352 }
   6353 
   6354 /*===========================================================================
   6355  * FUNCTION   : setChromaFlash
   6356  *
   6357  * DESCRIPTION: set chroma flash value
   6358  *
   6359  * PARAMETERS :
   6360  *   @aecBracketStr : chroma flash value string
   6361  *
   6362  * RETURN     : int32_t type of status
   6363  *              NO_ERROR  -- success
   6364  *              none-zero failure code
   6365  *==========================================================================*/
   6366 int32_t QCameraParameters::setChromaFlash(const char *chromaFlashStr)
   6367 {
   6368     CDBG_HIGH("%s: chromaFlashStr =%s",__func__,chromaFlashStr);
   6369     if(chromaFlashStr != NULL) {
   6370         int value = lookupAttr(CHROMA_FLASH_MODES_MAP,
   6371                               sizeof(CHROMA_FLASH_MODES_MAP)/sizeof(QCameraMap),
   6372                               chromaFlashStr);
   6373         if(value != NAME_NOT_FOUND) {
   6374             m_bChromaFlashOn = (value != 0);
   6375             updateParamEntry(KEY_QC_CHROMA_FLASH, chromaFlashStr);
   6376 
   6377             return NO_ERROR;
   6378         }
   6379     }
   6380 
   6381     ALOGE("Invalid chroma flash value: %s",
   6382         (chromaFlashStr == NULL) ? "NULL" : chromaFlashStr);
   6383     return BAD_VALUE;
   6384 }
   6385 
   6386 /*===========================================================================
   6387  * FUNCTION   : setOptiZoom
   6388  *
   6389  * DESCRIPTION: set opti zoom value
   6390  *
   6391  * PARAMETERS :
   6392  *   @aecBracketStr : opti zoom value string
   6393  *
   6394  * RETURN     : int32_t type of status
   6395  *              NO_ERROR  -- success
   6396  *              none-zero failure code
   6397  *==========================================================================*/
   6398 int32_t QCameraParameters::setOptiZoom(const char *optiZoomStr)
   6399 {
   6400     CDBG_HIGH("%s: optiZoomStr =%s",__func__,optiZoomStr);
   6401     if(optiZoomStr != NULL) {
   6402         int value = lookupAttr(OPTI_ZOOM_MODES_MAP,
   6403                                sizeof(OPTI_ZOOM_MODES_MAP)/sizeof(QCameraMap),
   6404                                optiZoomStr);
   6405         if(value != NAME_NOT_FOUND) {
   6406             m_bOptiZoomOn = (value != 0);
   6407             updateParamEntry(KEY_QC_OPTI_ZOOM, optiZoomStr);
   6408 
   6409             return NO_ERROR;
   6410         }
   6411     }
   6412     ALOGE("Invalid opti zoom value: %s",
   6413         (optiZoomStr == NULL) ? "NULL" : optiZoomStr);
   6414     return BAD_VALUE;
   6415 }
   6416 
   6417 /*===========================================================================
   6418  * FUNCTION   : setAEBracketing
   6419  *
   6420  * DESCRIPTION: enables AE bracketing
   6421  *
   6422  * PARAMETERS :
   6423  *
   6424  * RETURN     : int32_t type of status
   6425  *              NO_ERROR  -- success
   6426  *              none-zero failure code
   6427  *==========================================================================*/
   6428 int32_t QCameraParameters::setAEBracketing()
   6429 {
   6430     int32_t rc = NO_ERROR;
   6431     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   6432         ALOGE("%s:Failed to initialize group update table", __func__);
   6433         return BAD_TYPE;
   6434     }
   6435 
   6436     rc = AddSetParmEntryToBatch(m_pParamBuf,
   6437             CAM_INTF_PARM_HDR,
   6438             sizeof(m_AEBracketingClient),
   6439             &m_AEBracketingClient);
   6440     if (rc != NO_ERROR) {
   6441         ALOGE("%s:Failed to update AE bracketing", __func__);
   6442         return rc;
   6443     }
   6444 
   6445     rc = commitSetBatch();
   6446     if (rc != NO_ERROR) {
   6447         ALOGE("%s:Failed to configure AE bracketing", __func__);
   6448         return rc;
   6449     }
   6450 
   6451     return rc;
   6452 }
   6453 
   6454 /*===========================================================================
   6455  * FUNCTION   : setHDRAEBracket
   6456  *
   6457  * DESCRIPTION: enables AE bracketing for HDR
   6458  *
   6459  * PARAMETERS :
   6460  *   @hdrBracket : HDR bracketing configuration
   6461  *
   6462  * RETURN     : int32_t type of status
   6463  *              NO_ERROR  -- success
   6464  *              none-zero failure code
   6465  *==========================================================================*/
   6466 int32_t QCameraParameters::setHDRAEBracket(cam_exp_bracketing_t hdrBracket)
   6467 {
   6468     int32_t rc = NO_ERROR;
   6469     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   6470         ALOGE("%s:Failed to initialize group update table", __func__);
   6471         return BAD_TYPE;
   6472     }
   6473 
   6474     rc = AddSetParmEntryToBatch(m_pParamBuf,
   6475             CAM_INTF_PARM_HDR,
   6476             sizeof(hdrBracket),
   6477             &hdrBracket);
   6478     if (rc != NO_ERROR) {
   6479         ALOGE("%s:Failed to update table", __func__);
   6480         return rc;
   6481     }
   6482 
   6483     rc = commitSetBatch();
   6484     if (rc != NO_ERROR) {
   6485         ALOGE("%s:Failed to configure HDR bracketing", __func__);
   6486         return rc;
   6487     }
   6488 
   6489     return rc;
   6490 }
   6491 
   6492 /*===========================================================================
   6493  * FUNCTION   : restoreAEBracket
   6494  *
   6495  * DESCRIPTION: restores client AE bracketing configuration after HDR is done
   6496  *
   6497  * PARAMETERS :
   6498  *
   6499  * RETURN     : int32_t type of status
   6500  *              NO_ERROR  -- success
   6501  *              none-zero failure code
   6502  *==========================================================================*/
   6503 int32_t QCameraParameters::stopAEBracket()
   6504 {
   6505   cam_exp_bracketing_t bracketing;
   6506 
   6507   bracketing.mode = CAM_EXP_BRACKETING_OFF;
   6508 
   6509   return setHDRAEBracket(bracketing);
   6510 }
   6511 
   6512 /*===========================================================================
   6513  * FUNCTION   : updateFlash
   6514  *
   6515  * DESCRIPTION: restores client flash configuration or disables flash
   6516  *
   6517  * PARAMETERS :
   6518  *   @commitSettings : flag indicating whether settings need to be commited
   6519  *
   6520  * RETURN     : int32_t type of status
   6521  *              NO_ERROR  -- success
   6522  *              none-zero failure code
   6523  *==========================================================================*/
   6524 int32_t QCameraParameters::updateFlash(bool commitSettings)
   6525 {
   6526     int32_t rc = NO_ERROR;
   6527     int32_t value;
   6528 
   6529     if (commitSettings) {
   6530       if(initBatchUpdate(m_pParamBuf) < 0 ) {
   6531           ALOGE("%s:Failed to initialize group update table", __func__);
   6532           return BAD_TYPE;
   6533       }
   6534     }
   6535 
   6536     if (isHDREnabled() || m_bAeBracketingEnabled || m_bAFBracketingOn ||
   6537           m_bOptiZoomOn) {
   6538         value = CAM_FLASH_MODE_OFF;
   6539     } else if (m_bChromaFlashOn) {
   6540         value = CAM_FLASH_MODE_ON;
   6541     } else {
   6542         value = mFlashValue;
   6543     }
   6544 
   6545     if (value != mFlashDaemonValue) {
   6546         CDBG("%s: Setting Flash value %d", __func__, value);
   6547         rc = AddSetParmEntryToBatch(m_pParamBuf,
   6548                                       CAM_INTF_PARM_LED_MODE,
   6549                                       sizeof(value),
   6550                                       &value);
   6551         if (rc != NO_ERROR) {
   6552             rc = BAD_VALUE;
   6553             ALOGE("%s:Failed to set led mode", __func__);
   6554             return rc;
   6555         }
   6556 
   6557         mFlashDaemonValue = value;
   6558     } else {
   6559         rc = NO_ERROR;
   6560     }
   6561 
   6562     if (commitSettings) {
   6563       rc = commitSetBatch();
   6564       if (rc != NO_ERROR) {
   6565           ALOGE("%s:Failed to configure HDR bracketing", __func__);
   6566           return rc;
   6567       }
   6568     }
   6569 
   6570     return rc;
   6571 }
   6572 
   6573 /*===========================================================================
   6574  * FUNCTION   : setRedeyeReduction
   6575  *
   6576  * DESCRIPTION: set red eye reduction value
   6577  *
   6578  * PARAMETERS :
   6579  *   @redeyeStr : red eye reduction value string
   6580  *
   6581  * RETURN     : int32_t type of status
   6582  *              NO_ERROR  -- success
   6583  *              none-zero failure code
   6584  *==========================================================================*/
   6585 int32_t QCameraParameters::setRedeyeReduction(const char *redeyeStr)
   6586 {
   6587     if (redeyeStr != NULL) {
   6588         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   6589                                    sizeof(ENABLE_DISABLE_MODES_MAP)/sizeof(QCameraMap),
   6590                                    redeyeStr);
   6591         if (value != NAME_NOT_FOUND) {
   6592             CDBG("%s: Setting RedEye Reduce value %s", __func__, redeyeStr);
   6593             updateParamEntry(KEY_QC_REDEYE_REDUCTION, redeyeStr);
   6594             return AddSetParmEntryToBatch(m_pParamBuf,
   6595                                           CAM_INTF_PARM_REDEYE_REDUCTION,
   6596                                           sizeof(value),
   6597                                           &value);
   6598         }
   6599     }
   6600     ALOGE("%s: Invalid RedEye Reduce value: %s",
   6601           __func__, (redeyeStr == NULL) ? "NULL" : redeyeStr);
   6602     return BAD_VALUE;
   6603 }
   6604 
   6605 /*===========================================================================
   6606  * FUNCTION   : getWaveletDenoiseProcessPlate
   6607  *
   6608  * DESCRIPTION: query wavelet denoise process plate
   6609  *
   6610  * PARAMETERS : None
   6611  *
   6612  * RETURN     : WNR prcocess plate vlaue
   6613  *==========================================================================*/
   6614 cam_denoise_process_type_t QCameraParameters::getWaveletDenoiseProcessPlate()
   6615 {
   6616     char prop[PROPERTY_VALUE_MAX];
   6617     memset(prop, 0, sizeof(prop));
   6618     cam_denoise_process_type_t processPlate = CAM_WAVELET_DENOISE_CBCR_ONLY;
   6619     property_get("persist.denoise.process.plates", prop, "");
   6620     if (strlen(prop) > 0) {
   6621         switch(atoi(prop)) {
   6622         case 0:
   6623             processPlate = CAM_WAVELET_DENOISE_YCBCR_PLANE;
   6624             break;
   6625         case 1:
   6626             processPlate = CAM_WAVELET_DENOISE_CBCR_ONLY;
   6627             break;
   6628         case 2:
   6629             processPlate = CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
   6630             break;
   6631         case 3:
   6632             processPlate = CAM_WAVELET_DENOISE_STREAMLINED_CBCR;
   6633             break;
   6634         default:
   6635             processPlate = CAM_WAVELET_DENOISE_CBCR_ONLY;
   6636             break;
   6637         }
   6638     }
   6639     return processPlate;
   6640 }
   6641 
   6642 /*===========================================================================
   6643  * FUNCTION   : setWaveletDenoise
   6644  *
   6645  * DESCRIPTION: set wavelet denoise value
   6646  *
   6647  * PARAMETERS :
   6648  *   @wnrStr : wavelet denoise value string
   6649  *
   6650  * RETURN     : int32_t type of status
   6651  *              NO_ERROR  -- success
   6652  *              none-zero failure code
   6653  *==========================================================================*/
   6654 int32_t QCameraParameters::setWaveletDenoise(const char *wnrStr)
   6655 {
   6656     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_DENOISE2D) == 0){
   6657         CDBG_HIGH("%s: WNR is not supported",__func__);
   6658         return NO_ERROR;
   6659     }
   6660 
   6661     if (wnrStr != NULL) {
   6662         int value = lookupAttr(DENOISE_ON_OFF_MODES_MAP,
   6663                                sizeof(DENOISE_ON_OFF_MODES_MAP)/sizeof(QCameraMap),
   6664                                wnrStr);
   6665         if (value != NAME_NOT_FOUND) {
   6666             updateParamEntry(KEY_QC_DENOISE, wnrStr);
   6667 
   6668             cam_denoise_param_t temp;
   6669             memset(&temp, 0, sizeof(temp));
   6670             temp.denoise_enable = value;
   6671             m_bWNROn = (value != 0);
   6672             if (m_bWNROn) {
   6673                 temp.process_plates = getWaveletDenoiseProcessPlate();
   6674             }
   6675             CDBG("%s: Denoise enable=%d, plates=%d",
   6676                   __func__, temp.denoise_enable, temp.process_plates);
   6677             return AddSetParmEntryToBatch(m_pParamBuf,
   6678                                           CAM_INTF_PARM_WAVELET_DENOISE,
   6679                                           sizeof(temp),
   6680                                           &temp);
   6681         }
   6682     }
   6683     ALOGE("%s: Invalid Denoise value: %s", __func__, (wnrStr == NULL) ? "NULL" : wnrStr);
   6684     return BAD_VALUE;
   6685 }
   6686 
   6687 /*===========================================================================
   6688  * FUNCTION   : setRdiMode
   6689  *
   6690  * DESCRIPTION: set rdi mode value
   6691  *
   6692  * PARAMETERS :
   6693  *   @str     : rdi mode value string
   6694  *
   6695  * RETURN     : int32_t type of status
   6696  *              NO_ERROR  -- success
   6697  *              none-zero failure code
   6698  *==========================================================================*/
   6699 int32_t QCameraParameters::setRdiMode(const char *str)
   6700 {
   6701   CDBG("RDI_DEBUG %s: rdi mode value: %s", __func__, str);
   6702 
   6703   if (str != NULL) {
   6704     int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   6705                            sizeof(ENABLE_DISABLE_MODES_MAP)/sizeof(QCameraMap),
   6706                            str);
   6707     if (value != NAME_NOT_FOUND) {
   6708       updateParamEntry(KEY_QC_RDI_MODE, str);
   6709       m_bRdiMode = (value == 0)? false : true;
   6710       return AddSetParmEntryToBatch(m_pParamBuf,
   6711                                     CAM_INTF_PARM_RDI_MODE,
   6712                                     sizeof(value),
   6713                                     &value);
   6714     }
   6715   }
   6716   ALOGE("%s: Invalid rdi mode value: %s",
   6717     __func__, (str == NULL) ? "NULL" : str);
   6718   return BAD_VALUE;
   6719 }
   6720 
   6721 
   6722 /*===========================================================================
   6723  * FUNCTION   : setSecureMode
   6724  *
   6725  * DESCRIPTION: set secure mode value
   6726  *
   6727  * PARAMETERS :
   6728  *   @str     : secure mode value string
   6729  *
   6730  * RETURN     : int32_t type of status
   6731  *              NO_ERROR  -- success
   6732  *              none-zero failure code
   6733  *==========================================================================*/
   6734 int32_t QCameraParameters::setSecureMode(const char *str)
   6735 {
   6736   ALOGD("%s: Secure mode value: %s", __func__, str);
   6737 
   6738   if (str != NULL) {
   6739     int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   6740             sizeof(ENABLE_DISABLE_MODES_MAP)/sizeof(QCameraMap),
   6741             str);
   6742     if (value != NAME_NOT_FOUND) {
   6743       updateParamEntry(KEY_QC_SECURE_MODE, str);
   6744       m_bSecureMode = (value == 0)? false : true;
   6745       return NO_ERROR;
   6746     }
   6747   }
   6748   ALOGE("%s: Invalid Secure mode value: %s",
   6749     __func__, (str == NULL) ? "NULL" : str);
   6750   return BAD_VALUE;
   6751 }
   6752 
   6753 /*===========================================================================
   6754  * FUNCTION   : setPreviewFrameRateMode
   6755  *
   6756  * DESCRIPTION: set preview frame rate mode
   6757  *
   6758  * PARAMETERS :
   6759  *   @mode    : preview frame rate mode
   6760  *
   6761  * RETURN     : none
   6762  *==========================================================================*/
   6763 void QCameraParameters::setPreviewFrameRateMode(const char *mode)
   6764 {
   6765     set(KEY_QC_PREVIEW_FRAME_RATE_MODE, mode);
   6766 }
   6767 
   6768 /*===========================================================================
   6769  * FUNCTION   : getPreviewFrameRateMode
   6770  *
   6771  * DESCRIPTION: get preview frame rate mode
   6772  *
   6773  * PARAMETERS : none
   6774  *
   6775  * RETURN     : preview frame rate mode string
   6776  *==========================================================================*/
   6777 const char *QCameraParameters::getPreviewFrameRateMode() const
   6778 {
   6779     return get(KEY_QC_PREVIEW_FRAME_RATE_MODE);
   6780 }
   6781 
   6782 /*===========================================================================
   6783  * FUNCTION   : setTouchIndexAec
   6784  *
   6785  * DESCRIPTION: set touch index AEC
   6786  *
   6787  * PARAMETERS :
   6788  *   @x,y     :
   6789  *
   6790  * RETURN     : none
   6791  *==========================================================================*/
   6792 void QCameraParameters::setTouchIndexAec(int x, int y)
   6793 {
   6794     char str[32];
   6795     snprintf(str, sizeof(str), "%dx%d", x, y);
   6796     set(KEY_QC_TOUCH_INDEX_AEC, str);
   6797 }
   6798 
   6799 /*===========================================================================
   6800  * FUNCTION   : getTouchIndexAec
   6801  *
   6802  * DESCRIPTION: get touch index AEC
   6803  *
   6804  * PARAMETERS :
   6805  *   @x,y     :
   6806  *
   6807  * RETURN     : none
   6808  *==========================================================================*/
   6809 void QCameraParameters::getTouchIndexAec(int *x, int *y)
   6810 {
   6811     *x = -1;
   6812     *y = -1;
   6813 
   6814     // Get the current string, if it doesn't exist, leave the -1x-1
   6815     const char *p = get(KEY_QC_TOUCH_INDEX_AEC);
   6816     if (p == 0)
   6817         return;
   6818 
   6819     int tempX, tempY;
   6820     if (parse_pair(p, &tempX, &tempY, 'x') == 0) {
   6821         *x = tempX;
   6822         *y = tempY;
   6823     }
   6824 }
   6825 
   6826 /*===========================================================================
   6827  * FUNCTION   : setTouchIndexAf
   6828  *
   6829  * DESCRIPTION: set touch index AF
   6830  *
   6831  * PARAMETERS :
   6832  *   @x,y     :
   6833  *
   6834  * RETURN     : none
   6835  *==========================================================================*/
   6836 void QCameraParameters::setTouchIndexAf(int x, int y)
   6837 {
   6838     char str[32];
   6839     snprintf(str, sizeof(str), "%dx%d", x, y);
   6840     set(KEY_QC_TOUCH_INDEX_AF, str);
   6841 }
   6842 
   6843 /*===========================================================================
   6844  * FUNCTION   : getTouchIndexAf
   6845  *
   6846  * DESCRIPTION: get touch index AF
   6847  *
   6848  * PARAMETERS :
   6849  *   @x,y     :
   6850  *
   6851  * RETURN     : none
   6852  *==========================================================================*/
   6853 void QCameraParameters::getTouchIndexAf(int *x, int *y)
   6854 {
   6855     *x = -1;
   6856     *y = -1;
   6857 
   6858     // Get the current string, if it doesn't exist, leave the -1x-1
   6859     const char *p = get(KEY_QC_TOUCH_INDEX_AF);
   6860     if (p == 0)
   6861         return;
   6862 
   6863     int tempX, tempY;
   6864     if (parse_pair(p, &tempX, &tempY, 'x') == 0) {
   6865         *x = tempX;
   6866         *y = tempY;
   6867     }
   6868 }
   6869 
   6870 /*===========================================================================
   6871  * FUNCTION   : getStreamFormat
   6872  *
   6873  * DESCRIPTION: get stream format by its type
   6874  *
   6875  * PARAMETERS :
   6876  *   @streamType : [input] stream type
   6877  *   @format     : [output] stream format
   6878  *
   6879  * RETURN     : int32_t type of status
   6880  *              NO_ERROR  -- success
   6881  *              none-zero failure code
   6882  *==========================================================================*/
   6883 int32_t QCameraParameters::getStreamRotation(cam_stream_type_t streamType,
   6884                                             cam_pp_feature_config_t &featureConfig,
   6885                                             cam_dimension_t &dim)
   6886 {
   6887     int32_t ret = NO_ERROR;
   6888     int rotationParam = getInt(KEY_QC_VIDEO_ROTATION);
   6889     featureConfig.rotation = ROTATE_0;
   6890     int swapDim = 0;
   6891     switch (streamType) {
   6892     case CAM_STREAM_TYPE_VIDEO:
   6893            switch(rotationParam) {
   6894             case 90:
   6895                featureConfig.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
   6896                featureConfig.rotation = ROTATE_90;
   6897                swapDim = 1;
   6898                break;
   6899             case 180:
   6900                featureConfig.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
   6901                featureConfig.rotation = ROTATE_180;
   6902                break;
   6903             case 270:
   6904                featureConfig.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
   6905                featureConfig.rotation = ROTATE_270;
   6906                swapDim = 1;
   6907               break;
   6908             default:
   6909                featureConfig.rotation = ROTATE_0;
   6910         }
   6911         break;
   6912     case CAM_STREAM_TYPE_PREVIEW:
   6913     case CAM_STREAM_TYPE_POSTVIEW:
   6914     case CAM_STREAM_TYPE_SNAPSHOT:
   6915     case CAM_STREAM_TYPE_RAW:
   6916     case CAM_STREAM_TYPE_METADATA:
   6917     case CAM_STREAM_TYPE_OFFLINE_PROC:
   6918     case CAM_STREAM_TYPE_DEFAULT:
   6919     default:
   6920         break;
   6921     }
   6922 
   6923     if (swapDim > 0) {
   6924         int w = 0;
   6925         w = dim.width;
   6926         dim.width = dim.height;
   6927         dim.height = w;
   6928     }
   6929     return ret;
   6930 }
   6931 
   6932 /*===========================================================================
   6933  * FUNCTION   : getStreamFormat
   6934  *
   6935  * DESCRIPTION: get stream format by its type
   6936  *
   6937  * PARAMETERS :
   6938  *   @streamType : [input] stream type
   6939  *   @format     : [output] stream format
   6940  *
   6941  * RETURN     : int32_t type of status
   6942  *              NO_ERROR  -- success
   6943  *              none-zero failure code
   6944  *==========================================================================*/
   6945 int32_t QCameraParameters::getStreamFormat(cam_stream_type_t streamType,
   6946                                             cam_format_t &format)
   6947 {
   6948     int32_t ret = NO_ERROR;
   6949 
   6950     format = CAM_FORMAT_MAX;
   6951     switch (streamType) {
   6952     case CAM_STREAM_TYPE_PREVIEW:
   6953     case CAM_STREAM_TYPE_POSTVIEW:
   6954         format = mPreviewFormat;
   6955         break;
   6956     case CAM_STREAM_TYPE_SNAPSHOT:
   6957         if ( mPictureFormat == CAM_FORMAT_YUV_422_NV16 ) {
   6958             format = CAM_FORMAT_YUV_422_NV16;
   6959         } else {
   6960             char prop[PROPERTY_VALUE_MAX];
   6961             int snapshotFormat;
   6962             memset(prop, 0, sizeof(prop));
   6963             property_get("persist.camera.snap.format", prop, "0");
   6964             snapshotFormat = atoi(prop);
   6965             if(snapshotFormat == 1) {
   6966                 format = CAM_FORMAT_YUV_422_NV61;
   6967             } else {
   6968                 format = CAM_FORMAT_YUV_420_NV21;
   6969             }
   6970         }
   6971         break;
   6972     case CAM_STREAM_TYPE_VIDEO:
   6973         format = CAM_FORMAT_YUV_420_NV12;
   6974         break;
   6975     case CAM_STREAM_TYPE_RAW:
   6976         if (isRdiMode()) {
   6977             format = m_pCapability->rdi_mode_stream_fmt;
   6978         } else if (mPictureFormat >= CAM_FORMAT_YUV_RAW_8BIT_YUYV) {
   6979             format = (cam_format_t)mPictureFormat;
   6980         } else {
   6981             char raw_format[PROPERTY_VALUE_MAX];
   6982             int rawFormat;
   6983             memset(raw_format, 0, sizeof(raw_format));
   6984             /*Default value is CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GBRG*/
   6985             property_get("persist.camera.raw.format", raw_format, "16");
   6986             rawFormat = atoi(raw_format);
   6987             format = (cam_format_t)rawFormat;
   6988             CDBG_HIGH("%s: Raw stream format %d bundled with snapshot",
   6989                    __func__, format);
   6990         }
   6991         break;
   6992     case CAM_STREAM_TYPE_METADATA:
   6993     case CAM_STREAM_TYPE_OFFLINE_PROC:
   6994     case CAM_STREAM_TYPE_DEFAULT:
   6995     default:
   6996         break;
   6997     }
   6998 
   6999     return ret;
   7000 }
   7001 
   7002 /*===========================================================================
   7003  * FUNCTION   : getFlipMode
   7004  *
   7005  * DESCRIPTION: get flip mode
   7006  *
   7007  * PARAMETERS :
   7008  *   @cam_intf_parm_type_t : [input] stream type
   7009  *
   7010  * RETURN     : int type of flip mode
   7011  *              0 - no filp
   7012  *              1 - FLIP_H
   7013  *              2 - FLIP_V
   7014  *              3 - FLIP_H | FLIP_V
   7015  *==========================================================================*/
   7016 int QCameraParameters::getFlipMode(cam_stream_type_t type)
   7017 {
   7018     const char *str = NULL;
   7019     int flipMode = 0; // no flip
   7020 
   7021     switch(type){
   7022     case CAM_STREAM_TYPE_PREVIEW:
   7023         if (!isRdiMode()) {
   7024             str = get(KEY_QC_PREVIEW_FLIP);
   7025         }
   7026         break;
   7027     case CAM_STREAM_TYPE_VIDEO:
   7028         str = get(KEY_QC_VIDEO_FLIP);
   7029         break;
   7030     case CAM_STREAM_TYPE_SNAPSHOT:
   7031     case CAM_STREAM_TYPE_POSTVIEW:
   7032         str = get(KEY_QC_SNAPSHOT_PICTURE_FLIP);
   7033         break;
   7034     default:
   7035         CDBG("%s: No flip mode for stream type %d", __func__, type);
   7036         break;
   7037     }
   7038 
   7039     if(str != NULL){
   7040         //Need give corresponding filp value based on flip mode strings
   7041         int value = lookupAttr(FLIP_MODES_MAP,
   7042                 sizeof(FLIP_MODES_MAP)/sizeof(QCameraMap), str);
   7043         if(value != NAME_NOT_FOUND)
   7044             flipMode = value;
   7045         }
   7046 
   7047     CDBG_HIGH("%s: the filp mode of stream type %d is %d .", __func__, type, flipMode);
   7048     return flipMode;
   7049 }
   7050 
   7051 /*===========================================================================
   7052  * FUNCTION   : isSnapshotFDNeeded
   7053  *
   7054  * DESCRIPTION: check whether Face Detection Metadata is needed
   7055  *
   7056  * PARAMETERS : none
   7057  *
   7058  * RETURN     : bool type of status
   7059  *              0 - need
   7060  *              1 - not need
   7061  *==========================================================================*/
   7062 bool QCameraParameters::isSnapshotFDNeeded()
   7063 {
   7064     return getInt(KEY_QC_SNAPSHOT_FD_DATA);
   7065 }
   7066 
   7067 /*===========================================================================
   7068  * FUNCTION   : getStreamDimension
   7069  *
   7070  * DESCRIPTION: get stream dimension by its type
   7071  *
   7072  * PARAMETERS :
   7073  *   @streamType : [input] stream type
   7074  *   @dim        : [output] stream dimension
   7075  *
   7076  * RETURN     : int32_t type of status
   7077  *              NO_ERROR  -- success
   7078  *              none-zero failure code
   7079  *==========================================================================*/
   7080 int32_t QCameraParameters::getStreamDimension(cam_stream_type_t streamType,
   7081                                                cam_dimension_t &dim)
   7082 {
   7083     int32_t ret = NO_ERROR;
   7084     memset(&dim, 0, sizeof(cam_dimension_t));
   7085 
   7086     switch (streamType) {
   7087     case CAM_STREAM_TYPE_PREVIEW:
   7088         getPreviewSize(&dim.width, &dim.height);
   7089         break;
   7090     case CAM_STREAM_TYPE_POSTVIEW:
   7091         getPreviewSize(&dim.width, &dim.height);
   7092         break;
   7093     case CAM_STREAM_TYPE_SNAPSHOT:
   7094         if (getRecordingHintValue() == true) {
   7095             // live snapshot
   7096             getLiveSnapshotSize(dim);
   7097         } else {
   7098             getPictureSize(&dim.width, &dim.height);
   7099         }
   7100         break;
   7101     case CAM_STREAM_TYPE_VIDEO:
   7102         getVideoSize(&dim.width, &dim.height);
   7103         break;
   7104     case CAM_STREAM_TYPE_RAW:
   7105         //dim = m_pCapability->raw_dim;
   7106         getRawSize(dim);
   7107         break;
   7108     case CAM_STREAM_TYPE_METADATA:
   7109         dim.width = sizeof(metadata_buffer_t);
   7110         dim.height = 1;
   7111         break;
   7112     case CAM_STREAM_TYPE_OFFLINE_PROC:
   7113         break;
   7114     case CAM_STREAM_TYPE_DEFAULT:
   7115     default:
   7116         ALOGE("%s: no dimension for unsupported stream type %d",
   7117               __func__, streamType);
   7118         ret = BAD_VALUE;
   7119         break;
   7120     }
   7121     return ret;
   7122 }
   7123 
   7124 /*===========================================================================
   7125  * FUNCTION   : getPreviewHalPixelFormat
   7126  *
   7127  * DESCRIPTION: get preview HAL pixel format
   7128  *
   7129  * PARAMETERS : none
   7130  *
   7131  * RETURN     : HAL pixel format
   7132  *==========================================================================*/
   7133 int QCameraParameters::getPreviewHalPixelFormat() const
   7134 {
   7135     int32_t halPixelFormat;
   7136 
   7137     switch (mPreviewFormat) {
   7138     case CAM_FORMAT_YUV_420_NV12:
   7139         halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
   7140         break;
   7141     case CAM_FORMAT_YUV_420_NV21:
   7142         halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
   7143         break;
   7144     case CAM_FORMAT_YUV_420_NV21_ADRENO:
   7145         halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
   7146         break;
   7147     case CAM_FORMAT_YUV_420_YV12:
   7148         halPixelFormat = HAL_PIXEL_FORMAT_YV12;
   7149         break;
   7150     case CAM_FORMAT_YUV_420_NV12_VENUS:
   7151         halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS;
   7152         break;
   7153     case CAM_FORMAT_YUV_422_NV16:
   7154     case CAM_FORMAT_YUV_422_NV61:
   7155     default:
   7156         halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
   7157         break;
   7158     }
   7159     CDBG_HIGH("%s: format %d\n", __func__, halPixelFormat);
   7160     return halPixelFormat;
   7161 }
   7162 
   7163 /*===========================================================================
   7164  * FUNCTION   : getthumbnailSize
   7165  *
   7166  * DESCRIPTION: get thumbnail size
   7167  *
   7168  * PARAMETERS :
   7169  *   @width, height : [output] thumbnail width and height
   7170  *
   7171  * RETURN     : none
   7172  *==========================================================================*/
   7173 void QCameraParameters::getThumbnailSize(int *width, int *height) const
   7174 {
   7175     *width = getInt(KEY_JPEG_THUMBNAIL_WIDTH);
   7176     *height = getInt(KEY_JPEG_THUMBNAIL_HEIGHT);
   7177 }
   7178 
   7179 /*===========================================================================
   7180  * FUNCTION   : getZSLBurstInterval
   7181  *
   7182  * DESCRIPTION: get ZSL burst interval setting
   7183  *
   7184  * PARAMETERS : none
   7185  *
   7186  * RETURN     : ZSL burst interval value
   7187  *==========================================================================*/
   7188 int QCameraParameters::getZSLBurstInterval()
   7189 {
   7190     int interval = getInt(KEY_QC_ZSL_BURST_INTERVAL);
   7191     if (interval < 0) {
   7192         interval = 1;
   7193     }
   7194     return interval;
   7195 }
   7196 
   7197 /*===========================================================================
   7198  * FUNCTION   : getZSLQueueDepth
   7199  *
   7200  * DESCRIPTION: get ZSL queue depth
   7201  *
   7202  * PARAMETERS : none
   7203  *
   7204  * RETURN     : ZSL queue depth value
   7205  *==========================================================================*/
   7206 int QCameraParameters::getZSLQueueDepth()
   7207 {
   7208     int qdepth = getInt(KEY_QC_ZSL_QUEUE_DEPTH);
   7209     if (qdepth < 0) {
   7210         qdepth = 2;
   7211     }
   7212     return qdepth;
   7213 }
   7214 
   7215 /*===========================================================================
   7216  * FUNCTION   : getZSLBackLookCount
   7217  *
   7218  * DESCRIPTION: get ZSL backlook count setting
   7219  *
   7220  * PARAMETERS : none
   7221  *
   7222  * RETURN     : ZSL backlook count value
   7223  *==========================================================================*/
   7224 int QCameraParameters::getZSLBackLookCount()
   7225 {
   7226     int look_back = getInt(KEY_QC_ZSL_BURST_LOOKBACK);
   7227     if (look_back < 0) {
   7228         look_back = 2;
   7229     }
   7230     return look_back;
   7231 }
   7232 
   7233 /*===========================================================================
   7234  * FUNCTION   : getZSLMaxUnmatchedFrames
   7235  *
   7236  * DESCRIPTION: get allowed ZSL max unmatched frames number
   7237  *
   7238  * PARAMETERS : none
   7239  *
   7240  * RETURN     : ZSL backlook count value
   7241  *==========================================================================*/
   7242 int QCameraParameters::getMaxUnmatchedFramesInQueue()
   7243 {
   7244     return m_pCapability->min_num_pp_bufs + (m_nBurstNum / 10);
   7245 }
   7246 
   7247 /*===========================================================================
   7248  * FUNCTION   : setRecordingHintValue
   7249  *
   7250  * DESCRIPTION: set recording hint
   7251  *
   7252  * PARAMETERS :
   7253  *   @value   : video hint value
   7254  *
   7255  * RETURN     : int32_t type of status
   7256  *              NO_ERROR  -- success
   7257  *              none-zero failure code
   7258  *==========================================================================*/
   7259 int QCameraParameters::setRecordingHintValue(int32_t value)
   7260 {
   7261     CDBG_HIGH("%s: VideoHint = %d", __func__, value);
   7262     bool newValue = (value > 0)? true : false;
   7263 
   7264     if ( m_bRecordingHint != newValue ) {
   7265         m_bNeedRestart = true;
   7266         m_bRecordingHint_new = newValue;
   7267     } else {
   7268         m_bRecordingHint_new = m_bRecordingHint;
   7269     }
   7270     return AddSetParmEntryToBatch(m_pParamBuf,
   7271                                   CAM_INTF_PARM_RECORDING_HINT,
   7272                                   sizeof(value),
   7273                                   &value);
   7274 }
   7275 
   7276 /*===========================================================================
   7277  * FUNCTION   : getNumOfSnapshots
   7278  *
   7279  * DESCRIPTION: get number of snapshot per shutter
   7280  *
   7281  * PARAMETERS : none
   7282  *
   7283  * RETURN     : number of snapshot per shutter
   7284  *==========================================================================*/
   7285 uint8_t QCameraParameters::getNumOfSnapshots()
   7286 {
   7287     int numOfSnapshot = getInt(KEY_QC_NUM_SNAPSHOT_PER_SHUTTER);
   7288     if (numOfSnapshot <= 0) {
   7289         numOfSnapshot = 1; // set to default value
   7290     }
   7291 
   7292     /* update the count for refocus */
   7293     if (isUbiRefocus())
   7294        numOfSnapshot += UfOutputCount();
   7295 
   7296     return (uint8_t)numOfSnapshot;
   7297 }
   7298 
   7299 /*===========================================================================
   7300  * FUNCTION   : getBurstCountForAdvancedCapture
   7301  *
   7302  * DESCRIPTION: get burst count for advanced capture.
   7303  *
   7304  * PARAMETERS : none
   7305  *
   7306  * RETURN     : number of snapshot required for advanced capture.
   7307  *==========================================================================*/
   7308 uint8_t QCameraParameters::getBurstCountForAdvancedCapture()
   7309 {
   7310     int burstCount = 0;
   7311     if (isUbiFocusEnabled()) {
   7312         //number of snapshots required for Ubi Focus.
   7313         burstCount = m_pCapability->ubifocus_af_bracketing_need.burst_count;
   7314     } else if (isOptiZoomEnabled()) {
   7315         //number of snapshots required for Opti Zoom.
   7316         burstCount = m_pCapability->opti_zoom_settings_need.burst_count;
   7317     } else if (isChromaFlashEnabled()) {
   7318         //number of snapshots required for Chroma Flash.
   7319         //TODO: remove hardcoded value, add in capability.
   7320         burstCount = 2;
   7321     } else if (isHDREnabled()) {
   7322         //number of snapshots required for HDR.
   7323         burstCount = m_pCapability->hdr_bracketing_setting.num_frames;
   7324     } else if (isAEBracketEnabled()) {
   7325       burstCount = 0;
   7326       const char *str_val = m_AEBracketingClient.values;
   7327       if ((str_val != NULL) && (strlen(str_val) > 0)) {
   7328           char prop[PROPERTY_VALUE_MAX];
   7329           memset(prop, 0, sizeof(prop));
   7330           strcpy(prop, str_val);
   7331           char *saveptr = NULL;
   7332           char *token = strtok_r(prop, ",", &saveptr);
   7333           while (token != NULL) {
   7334               token = strtok_r(NULL, ",", &saveptr);
   7335               burstCount++;
   7336           }
   7337       }
   7338     }
   7339 
   7340     if (burstCount <= 0) {
   7341         burstCount = 1;
   7342     }
   7343     return (uint8_t)burstCount;
   7344 }
   7345 
   7346 /*===========================================================================
   7347  * FUNCTION   : getNumOfRetroSnapshots
   7348  *
   7349  * DESCRIPTION: get number of retro active snapshots per shutter
   7350  *
   7351  * PARAMETERS : none
   7352  *
   7353  * RETURN     : number of retro active snapshots per shutter
   7354  *==========================================================================*/
   7355 uint8_t QCameraParameters::getNumOfRetroSnapshots()
   7356 {
   7357     int numOfRetroSnapshots = getInt(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER);
   7358     if (numOfRetroSnapshots < 0) {
   7359         numOfRetroSnapshots = 0;
   7360     }
   7361     CDBG_HIGH("%s: [ZSL Retro] : numOfRetroSnaps - %d", __func__, numOfRetroSnapshots);
   7362     return (uint8_t)numOfRetroSnapshots;
   7363 }
   7364 
   7365 /*===========================================================================
   7366  * FUNCTION   : getBurstLEDOnPeriod
   7367  *
   7368  * DESCRIPTION: get burst LED on period
   7369  *
   7370  * PARAMETERS : none
   7371  *
   7372  * RETURN     : burst LED on period
   7373  *==========================================================================*/
   7374 int QCameraParameters::getBurstLEDOnPeriod()
   7375 {
   7376   CDBG_HIGH("%s: [ZSL Retro] burst LED ON period: %d", __func__, m_nBurstLEDOnPeriod);
   7377   return m_nBurstLEDOnPeriod;
   7378 }
   7379 
   7380 /*===========================================================================
   7381  * FUNCTION   : getNumOfExtraHDRInBufsIfNeeded
   7382  *
   7383  * DESCRIPTION: get number of extra input buffers needed by HDR
   7384  *
   7385  * PARAMETERS : none
   7386  *
   7387  * RETURN     : number of extra buffers needed by HDR; 0 if not HDR enabled
   7388  *==========================================================================*/
   7389 uint8_t QCameraParameters::getNumOfExtraHDRInBufsIfNeeded()
   7390 {
   7391     uint8_t numOfBufs = 0;
   7392 
   7393     if (isHDREnabled()) {
   7394         numOfBufs += m_pCapability->hdr_bracketing_setting.num_frames;
   7395         if (isHDR1xFrameEnabled() && isHDR1xExtraBufferNeeded()) {
   7396             numOfBufs++;
   7397         }
   7398         numOfBufs--; // Only additional buffers need to be returned
   7399     }
   7400 
   7401     return numOfBufs * getBurstNum();
   7402 }
   7403 
   7404 /*===========================================================================
   7405  * FUNCTION   : getNumOfExtraHDROutBufsIfNeeded
   7406  *
   7407  * DESCRIPTION: get number of extra output buffers needed by HDR
   7408  *
   7409  * PARAMETERS : none
   7410  *
   7411  * RETURN     : number of extra buffers needed by HDR; 0 if not HDR enabled
   7412  *==========================================================================*/
   7413 uint8_t QCameraParameters::getNumOfExtraHDROutBufsIfNeeded()
   7414 {
   7415     uint8_t numOfBufs = 0;
   7416 
   7417     if (isHDREnabled() && isHDR1xFrameEnabled()) {
   7418         numOfBufs++;
   7419     }
   7420 
   7421     return numOfBufs * getBurstNum();
   7422 }
   7423 
   7424 /*===========================================================================
   7425  * FUNCTION   : getBurstNum
   7426  *
   7427  * DESCRIPTION: get burst number of snapshot
   7428  *
   7429  * PARAMETERS : none
   7430  *
   7431  * RETURN     : number of burst
   7432  *==========================================================================*/
   7433 int QCameraParameters::getBurstNum()
   7434 {
   7435     CDBG_HIGH("%s: m_nBurstNum = %d", __func__, m_nBurstNum);
   7436     return m_nBurstNum;
   7437 }
   7438 
   7439 /*===========================================================================
   7440  * FUNCTION   : getJpegQuality
   7441  *
   7442  * DESCRIPTION: get jpeg encoding quality
   7443  *
   7444  * PARAMETERS : none
   7445  *
   7446  * RETURN     : jpeg encoding quality
   7447  *==========================================================================*/
   7448 int QCameraParameters::getJpegQuality()
   7449 {
   7450     int quality = getInt(KEY_JPEG_QUALITY);
   7451     if (quality < 0) {
   7452         quality = 85; // set to default quality value
   7453     }
   7454     return quality;
   7455 }
   7456 
   7457 /*===========================================================================
   7458  * FUNCTION   : getJpegRotation
   7459  *
   7460  * DESCRIPTION: get rotation value
   7461  *
   7462  * PARAMETERS : none
   7463  *
   7464  * RETURN     : rotation value
   7465  *==========================================================================*/
   7466 int QCameraParameters::getJpegRotation() {
   7467     int rotation = getInt(KEY_ROTATION);
   7468     if (rotation < 0) {
   7469         rotation = 0;
   7470     }
   7471     return rotation;
   7472 }
   7473 
   7474 /*===========================================================================
   7475  * FUNCTION   : parseGPSCoordinate
   7476  *
   7477  * DESCRIPTION: parse GPS coordinate string
   7478  *
   7479  * PARAMETERS :
   7480  *   @coord_str : [input] coordinate string
   7481  *   @coord     : [output]  ptr to struct to store coordinate
   7482  *
   7483  * RETURN     : int32_t type of status
   7484  *              NO_ERROR  -- success
   7485  *              none-zero failure code
   7486  *==========================================================================*/
   7487 int QCameraParameters::parseGPSCoordinate(const char *coord_str, rat_t* coord)
   7488 {
   7489     if(coord == NULL) {
   7490         ALOGE("%s: error, invalid argument coord == NULL", __func__);
   7491         return BAD_VALUE;
   7492     }
   7493     float degF = atof(coord_str);
   7494     if (degF < 0) {
   7495         degF = -degF;
   7496     }
   7497     float minF = (degF - (int) degF) * 60;
   7498     float secF = (minF - (int) minF) * 60;
   7499 
   7500     getRational(&coord[0], (int)degF, 1);
   7501     getRational(&coord[1], (int)minF, 1);
   7502     getRational(&coord[2], (int)(secF * 10000), 10000);
   7503     return NO_ERROR;
   7504 }
   7505 
   7506 /*===========================================================================
   7507  * FUNCTION   : getExifDateTime
   7508  *
   7509  * DESCRIPTION: query exif date time
   7510  *
   7511  * PARAMETERS :
   7512  *   @dateTime : string to store exif date time
   7513  *   @count    : lenght of the dateTime string
   7514  *
   7515  * RETURN     : int32_t type of status
   7516  *              NO_ERROR  -- success
   7517  *              none-zero failure code
   7518  *==========================================================================*/
   7519 int32_t QCameraParameters::getExifDateTime(char *dateTime, uint32_t &count)
   7520 {
   7521     //get time and date from system
   7522     time_t rawtime;
   7523     struct tm * timeinfo = NULL;
   7524     memset(&rawtime, 0, sizeof(rawtime));
   7525     time(&rawtime);
   7526     timeinfo = localtime (&rawtime);
   7527     if (timeinfo != NULL && count >= 20) {
   7528         //Write datetime according to EXIF Spec
   7529         //"YYYY:MM:DD HH:MM:SS" (20 chars including \0)
   7530         snprintf(dateTime, 20, "%04d:%02d:%02d %02d:%02d:%02d",
   7531                  timeinfo->tm_year + 1900, timeinfo->tm_mon + 1,
   7532                  timeinfo->tm_mday, timeinfo->tm_hour,
   7533                  timeinfo->tm_min, timeinfo->tm_sec);
   7534         count = 20;
   7535         return NO_ERROR;
   7536     }
   7537     return UNKNOWN_ERROR;
   7538 }
   7539 
   7540 /*===========================================================================
   7541  * FUNCTION   : getRational
   7542  *
   7543  * DESCRIPTION: compose rational struct
   7544  *
   7545  * PARAMETERS :
   7546  *   @rat     : ptr to struct to store rational info
   7547  *   @num     :num of the rational
   7548  *   @denom   : denom of the rational
   7549  *
   7550  * RETURN     : int32_t type of status
   7551  *              NO_ERROR  -- success
   7552  *              none-zero failure code
   7553  *==========================================================================*/
   7554 int32_t QCameraParameters::getRational(rat_t *rat, int num, int denom)
   7555 {
   7556     if (NULL == rat) {
   7557         ALOGE("%s: NULL rat input", __func__);
   7558         return BAD_VALUE;
   7559     }
   7560     rat->num = num;
   7561     rat->denom = denom;
   7562     return NO_ERROR;
   7563 }
   7564 
   7565 /*===========================================================================
   7566  * FUNCTION   : getExifFocalLength
   7567  *
   7568  * DESCRIPTION: get exif focal lenght
   7569  *
   7570  * PARAMETERS :
   7571  *   @focalLength : ptr to rational strcut to store focal lenght
   7572  *
   7573  * RETURN     : int32_t type of status
   7574  *              NO_ERROR  -- success
   7575  *              none-zero failure code
   7576  *==========================================================================*/
   7577 int32_t QCameraParameters::getExifFocalLength(rat_t *focalLength)
   7578 {
   7579     int focalLengthValue =
   7580         (int)(getFloat(QCameraParameters::KEY_FOCAL_LENGTH) * FOCAL_LENGTH_DECIMAL_PRECISION);
   7581     return getRational(focalLength, focalLengthValue, FOCAL_LENGTH_DECIMAL_PRECISION);
   7582 }
   7583 
   7584 /*===========================================================================
   7585  * FUNCTION   : getExifIsoSpeed
   7586  *
   7587  * DESCRIPTION: get exif ISO speed
   7588  *
   7589  * PARAMETERS : none
   7590  *
   7591  * RETURN     : ISO speed value
   7592  *==========================================================================*/
   7593 uint16_t QCameraParameters::getExifIsoSpeed()
   7594 {
   7595     uint16_t isoSpeed = 0;
   7596     const char *iso_str = get(QCameraParameters::KEY_QC_ISO_MODE);
   7597     int iso_index = lookupAttr(ISO_MODES_MAP,
   7598         sizeof(ISO_MODES_MAP)/sizeof(ISO_MODES_MAP[0]), iso_str);
   7599     switch (iso_index) {
   7600     case CAM_ISO_MODE_AUTO:
   7601         isoSpeed = 0;
   7602         break;
   7603     case CAM_ISO_MODE_DEBLUR:
   7604         isoSpeed = 1;
   7605         break;
   7606     case CAM_ISO_MODE_100:
   7607         isoSpeed = 100;
   7608         break;
   7609     case CAM_ISO_MODE_200:
   7610         isoSpeed = 200;
   7611         break;
   7612     case CAM_ISO_MODE_400:
   7613         isoSpeed = 400;
   7614         break;
   7615     case CAM_ISO_MODE_800:
   7616         isoSpeed = 800;
   7617         break;
   7618     case CAM_ISO_MODE_1600:
   7619         isoSpeed = 1600;
   7620         break;
   7621     }
   7622     return isoSpeed;
   7623 }
   7624 
   7625 /*===========================================================================
   7626  * FUNCTION   : getExifGpsProcessingMethod
   7627  *
   7628  * DESCRIPTION: get GPS processing method
   7629  *
   7630  * PARAMETERS :
   7631  *   @gpsProcessingMethod : string to store GPS process method
   7632  *   @count               : lenght of the string
   7633  *
   7634  * RETURN     : int32_t type of status
   7635  *              NO_ERROR  -- success
   7636  *              none-zero failure code
   7637  *==========================================================================*/
   7638 int32_t QCameraParameters::getExifGpsProcessingMethod(char *gpsProcessingMethod,
   7639                                                       uint32_t &count)
   7640 {
   7641     const char *str = get(KEY_GPS_PROCESSING_METHOD);
   7642     if(str != NULL) {
   7643         memcpy(gpsProcessingMethod, ExifAsciiPrefix, EXIF_ASCII_PREFIX_SIZE);
   7644         count = EXIF_ASCII_PREFIX_SIZE;
   7645         strncpy(gpsProcessingMethod + EXIF_ASCII_PREFIX_SIZE, str, strlen(str));
   7646         count += strlen(str);
   7647         gpsProcessingMethod[count++] = '\0'; // increase 1 for the last NULL char
   7648         return NO_ERROR;
   7649     } else {
   7650         return BAD_VALUE;
   7651     }
   7652 }
   7653 
   7654 /*===========================================================================
   7655  * FUNCTION   : getExifLatitude
   7656  *
   7657  * DESCRIPTION: get exif latitude
   7658  *
   7659  * PARAMETERS :
   7660  *   @latitude : ptr to rational struct to store latitude info
   7661  *   @ladRef   : charater to indicate latitude reference
   7662  *
   7663  * RETURN     : int32_t type of status
   7664  *              NO_ERROR  -- success
   7665  *              none-zero failure code
   7666  *==========================================================================*/
   7667 int32_t QCameraParameters::getExifLatitude(rat_t *latitude,
   7668                                            char *latRef)
   7669 {
   7670     const char *str = get(KEY_GPS_LATITUDE);
   7671     if(str != NULL) {
   7672         parseGPSCoordinate(str, latitude);
   7673 
   7674         //set Latitude Ref
   7675         float latitudeValue = getFloat(KEY_GPS_LATITUDE);
   7676         if(latitudeValue < 0.0f) {
   7677             latRef[0] = 'S';
   7678         } else {
   7679             latRef[0] = 'N';
   7680         }
   7681         latRef[1] = '\0';
   7682         return NO_ERROR;
   7683     }else{
   7684         return BAD_VALUE;
   7685     }
   7686 }
   7687 
   7688 /*===========================================================================
   7689  * FUNCTION   : getExifLongitude
   7690  *
   7691  * DESCRIPTION: get exif longitude
   7692  *
   7693  * PARAMETERS :
   7694  *   @longitude : ptr to rational struct to store longitude info
   7695  *   @lonRef    : charater to indicate longitude reference
   7696  *
   7697  * RETURN     : int32_t type of status
   7698  *              NO_ERROR  -- success
   7699  *              none-zero failure code
   7700  *==========================================================================*/
   7701 int32_t QCameraParameters::getExifLongitude(rat_t *longitude,
   7702                                             char *lonRef)
   7703 {
   7704     const char *str = get(KEY_GPS_LONGITUDE);
   7705     if(str != NULL) {
   7706         parseGPSCoordinate(str, longitude);
   7707 
   7708         //set Longitude Ref
   7709         float longitudeValue = getFloat(KEY_GPS_LONGITUDE);
   7710         if(longitudeValue < 0.0f) {
   7711             lonRef[0] = 'W';
   7712         } else {
   7713             lonRef[0] = 'E';
   7714         }
   7715         lonRef[1] = '\0';
   7716         return NO_ERROR;
   7717     }else{
   7718         return BAD_VALUE;
   7719     }
   7720 }
   7721 
   7722 /*===========================================================================
   7723  * FUNCTION   : getExifAltitude
   7724  *
   7725  * DESCRIPTION: get exif altitude
   7726  *
   7727  * PARAMETERS :
   7728  *   @altitude : ptr to rational struct to store altitude info
   7729  *   @altRef   : charater to indicate altitude reference
   7730  *
   7731  * RETURN     : int32_t type of status
   7732  *              NO_ERROR  -- success
   7733  *              none-zero failure code
   7734  *==========================================================================*/
   7735 int32_t QCameraParameters::getExifAltitude(rat_t *altitude,
   7736                                            char *altRef)
   7737 {
   7738     const char *str = get(KEY_GPS_ALTITUDE);
   7739     if(str != NULL) {
   7740         double value = atof(str);
   7741         *altRef = 0;
   7742         if(value < 0){
   7743             *altRef = 1;
   7744             value = -value;
   7745         }
   7746         return getRational(altitude, value*1000, 1000);
   7747     }else{
   7748         return BAD_VALUE;
   7749     }
   7750 }
   7751 
   7752 /*===========================================================================
   7753  * FUNCTION   : getExifGpsDateTimeStamp
   7754  *
   7755  * DESCRIPTION: get exif GPS date time stamp
   7756  *
   7757  * PARAMETERS :
   7758  *   @gpsDateStamp : GPS date time stamp string
   7759  *   @bufLen       : length of the string
   7760  *   @gpsTimeStamp : ptr to rational struct to store time stamp info
   7761  *
   7762  * RETURN     : int32_t type of status
   7763  *              NO_ERROR  -- success
   7764  *              none-zero failure code
   7765  *==========================================================================*/
   7766 int32_t QCameraParameters::getExifGpsDateTimeStamp(char *gpsDateStamp,
   7767                                                    uint32_t bufLen,
   7768                                                    rat_t *gpsTimeStamp)
   7769 {
   7770     const char *str = get(KEY_GPS_TIMESTAMP);
   7771     if(str != NULL) {
   7772         time_t unixTime = (time_t)atol(str);
   7773         struct tm *UTCTimestamp = gmtime(&unixTime);
   7774 
   7775         strftime(gpsDateStamp, bufLen, "%Y:%m:%d", UTCTimestamp);
   7776 
   7777         getRational(&gpsTimeStamp[0], UTCTimestamp->tm_hour, 1);
   7778         getRational(&gpsTimeStamp[1], UTCTimestamp->tm_min, 1);
   7779         getRational(&gpsTimeStamp[2], UTCTimestamp->tm_sec, 1);
   7780 
   7781         return NO_ERROR;
   7782     } else {
   7783         return BAD_VALUE;
   7784     }
   7785 }
   7786 
   7787 /*===========================================================================
   7788  * FUNCTION   : updateFocusDistances
   7789  *
   7790  * DESCRIPTION: update focus distances
   7791  *
   7792  * PARAMETERS :
   7793  *   @focusDistances : ptr to focus distance info
   7794  *
   7795  * RETURN     : int32_t type of status
   7796  *              NO_ERROR  -- success
   7797  *              none-zero failure code
   7798  *==========================================================================*/
   7799 int32_t QCameraParameters::updateFocusDistances(cam_focus_distances_info_t *focusDistances)
   7800 {
   7801     String8 str;
   7802     char buffer[32] = {0};
   7803     //set all distances to infinity if focus mode is infinity
   7804     if(mFocusMode == CAM_FOCUS_MODE_INFINITY) {
   7805         str.append("Infinity,Infinity,Infinity");
   7806     } else {
   7807         snprintf(buffer, sizeof(buffer), "%f", focusDistances->focus_distance[0]);
   7808         str.append(buffer);
   7809         snprintf(buffer, sizeof(buffer), ",%f", focusDistances->focus_distance[1]);
   7810         str.append(buffer);
   7811         snprintf(buffer, sizeof(buffer), ",%f", focusDistances->focus_distance[2]);
   7812         str.append(buffer);
   7813     }
   7814     CDBG_HIGH("%s: setting KEY_FOCUS_DISTANCES as %s", __FUNCTION__, str.string());
   7815     set(QCameraParameters::KEY_FOCUS_DISTANCES, str.string());
   7816     return NO_ERROR;
   7817 }
   7818 
   7819 /*===========================================================================
   7820  * FUNCTION   : updateRecordingHintValue
   7821  *
   7822  * DESCRIPTION: update recording hint locally and to daemon
   7823  *
   7824  * PARAMETERS :
   7825  *   @value   : video hint value
   7826  *
   7827  * RETURN     : int32_t type of status
   7828  *              NO_ERROR  -- success
   7829  *              none-zero failure code
   7830  *==========================================================================*/
   7831 int32_t QCameraParameters::updateRecordingHintValue(int32_t value)
   7832 {
   7833     int32_t rc = NO_ERROR;
   7834     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   7835         ALOGE("%s:Failed to initialize group update table", __func__);
   7836         return BAD_TYPE;
   7837     }
   7838 
   7839     rc = setRecordingHintValue(value);
   7840     if (rc != NO_ERROR) {
   7841         ALOGE("%s:Failed to update table", __func__);
   7842         return rc;
   7843     }
   7844 
   7845     rc = commitSetBatch();
   7846     if (rc != NO_ERROR) {
   7847         ALOGE("%s:Failed to update recording hint", __func__);
   7848         return rc;
   7849     }
   7850 
   7851     return rc;
   7852 }
   7853 
   7854 /*===========================================================================
   7855  * FUNCTION   : setHistogram
   7856  *
   7857  * DESCRIPTION: set histogram
   7858  *
   7859  * PARAMETERS :
   7860  *   @enabled : if histogram is enabled
   7861  *
   7862  * RETURN     : int32_t type of status
   7863  *              NO_ERROR  -- success
   7864  *              none-zero failure code
   7865  *==========================================================================*/
   7866 int32_t QCameraParameters::setHistogram(bool enabled)
   7867 {
   7868     if(m_bHistogramEnabled == enabled) {
   7869         CDBG_HIGH("%s: histogram flag not changed, no ops here", __func__);
   7870         return NO_ERROR;
   7871     }
   7872 
   7873     // set parm for histogram
   7874     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   7875         ALOGE("%s:Failed to initialize group update table", __func__);
   7876         return BAD_TYPE;
   7877     }
   7878 
   7879     int32_t value = enabled;
   7880     int32_t rc = NO_ERROR;
   7881     rc = AddSetParmEntryToBatch(m_pParamBuf,
   7882                                 CAM_INTF_PARM_HISTOGRAM,
   7883                                 sizeof(value),
   7884                                 &value);
   7885     if (rc != NO_ERROR) {
   7886         ALOGE("%s:Failed to update table", __func__);
   7887         return rc;
   7888     }
   7889 
   7890     rc = commitSetBatch();
   7891     if (rc != NO_ERROR) {
   7892         ALOGE("%s:Failed to set histogram", __func__);
   7893         return rc;
   7894     }
   7895 
   7896     m_bHistogramEnabled = enabled;
   7897 
   7898     CDBG_HIGH(" Histogram -> %s", m_bHistogramEnabled ? "Enabled" : "Disabled");
   7899 
   7900     return rc;
   7901 }
   7902 
   7903 /*===========================================================================
   7904  * FUNCTION   : setFaceDetectionOption
   7905  *
   7906  * DESCRIPTION: set if face detection is enabled by SendCommand
   7907  *
   7908  * PARAMETERS :
   7909  *   @enabled : bool flag if face detection should be enabled
   7910  *
   7911  * RETURN     : int32_t type of status
   7912  *              NO_ERROR  -- success
   7913  *              none-zero failure code
   7914  *==========================================================================*/
   7915  int32_t QCameraParameters::setFaceDetectionOption(bool enabled)
   7916 {
   7917     m_bFaceDetectionOn = enabled;
   7918     return NO_ERROR;
   7919 }
   7920 
   7921 /*===========================================================================
   7922  * FUNCTION   : setFaceDetection
   7923  *
   7924  * DESCRIPTION: set face detection
   7925  *
   7926  * PARAMETERS :
   7927  *   @enabled : if face detection is enabled
   7928  *   @initCommit : if configuration list need to be initialized and commited
   7929  *
   7930  * RETURN     : int32_t type of status
   7931  *              NO_ERROR  -- success
   7932  *              none-zero failure code
   7933  *==========================================================================*/
   7934 int32_t QCameraParameters::setFaceDetection(bool enabled, bool initCommit)
   7935 {
   7936     int faceProcMask = m_nFaceProcMask;
   7937     // set face detection mask
   7938     if (enabled) {
   7939         faceProcMask |= CAM_FACE_PROCESS_MASK_DETECTION;
   7940     } else {
   7941         faceProcMask &= ~CAM_FACE_PROCESS_MASK_DETECTION;
   7942     }
   7943 
   7944     if(m_nFaceProcMask == faceProcMask) {
   7945         CDBG_HIGH("%s: face process mask not changed, no ops here", __func__);
   7946         return NO_ERROR;
   7947     }
   7948 
   7949     m_nFaceProcMask = faceProcMask;
   7950 
   7951     // set parm for face detection
   7952     int requested_faces = getInt(KEY_QC_MAX_NUM_REQUESTED_FACES);
   7953     cam_fd_set_parm_t fd_set_parm;
   7954     memset(&fd_set_parm, 0, sizeof(cam_fd_set_parm_t));
   7955     fd_set_parm.fd_mode = faceProcMask;
   7956     fd_set_parm.num_fd = requested_faces;
   7957 
   7958     CDBG_HIGH("[KPI Perf] %s: PROFILE_FACE_DETECTION_VALUE = %d num_fd = %d",
   7959           __func__, faceProcMask,requested_faces);
   7960 
   7961     if (initCommit) {
   7962         if(initBatchUpdate(m_pParamBuf) < 0 ) {
   7963             ALOGE("%s:Failed to initialize group update table", __func__);
   7964             return BAD_TYPE;
   7965         }
   7966     }
   7967 
   7968     int32_t rc = NO_ERROR;
   7969 
   7970     rc = AddSetParmEntryToBatch(m_pParamBuf,
   7971                                 CAM_INTF_PARM_FD,
   7972                                 sizeof(fd_set_parm),
   7973                                 &fd_set_parm);
   7974     if (rc != NO_ERROR) {
   7975         ALOGE("%s:Failed to update table", __func__);
   7976         return rc;
   7977     }
   7978 
   7979     if (initCommit) {
   7980         rc = commitSetBatch();
   7981         if (rc != NO_ERROR) {
   7982             ALOGE("%s:Failed to set face detection parm", __func__);
   7983             return rc;
   7984         }
   7985     }
   7986 
   7987     CDBG_HIGH("%s: FaceProcMask -> %d", __func__, m_nFaceProcMask);
   7988 
   7989     return rc;
   7990 }
   7991 
   7992 /*===========================================================================
   7993  * FUNCTION   : setFrameSkip
   7994  *
   7995  * DESCRIPTION: send ISP frame skip pattern to camera daemon
   7996  *
   7997  * PARAMETERS :
   7998  *   @pattern : skip pattern for ISP
   7999  *
   8000  * RETURN     : int32_t type of status
   8001  *              NO_ERROR  -- success
   8002  *              none-zero failure code
   8003  *==========================================================================*/
   8004 int32_t QCameraParameters::setFrameSkip(enum msm_vfe_frame_skip_pattern pattern)
   8005 {
   8006     int32_t rc = NO_ERROR;
   8007     int32_t value = (int32_t)pattern;
   8008 
   8009     if ( m_pParamBuf == NULL ) {
   8010         return NO_INIT;
   8011     }
   8012 
   8013     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   8014         ALOGE("%s:Failed to initialize group update table", __func__);
   8015         return BAD_TYPE;
   8016     }
   8017 
   8018     rc = AddSetParmEntryToBatch(m_pParamBuf,
   8019                                 CAM_INTF_PARM_FRAMESKIP,
   8020                                 sizeof(value),
   8021                                 &value);
   8022     if (rc != NO_ERROR) {
   8023         ALOGE("%s:Failed to update table", __func__);
   8024         return rc;
   8025     }
   8026 
   8027     rc = commitSetBatch();
   8028     if (rc != NO_ERROR) {
   8029         ALOGE("%s:Failed to set frameskip info parm", __func__);
   8030         return rc;
   8031     }
   8032 
   8033     return rc;
   8034 }
   8035 
   8036 int32_t QCameraParameters::updateRAW(cam_dimension_t max_dim)
   8037 {
   8038     int32_t rc = NO_ERROR;
   8039     cam_dimension_t raw_dim;
   8040 
   8041     if (max_dim.width == 0 || max_dim.height == 0) {
   8042         max_dim = m_pCapability->raw_dim[0];
   8043     }
   8044 
   8045     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   8046         ALOGE("%s:Failed to initialize group update table", __func__);
   8047         return BAD_TYPE;
   8048     }
   8049 
   8050     rc = AddSetParmEntryToBatch(m_pParamBuf,
   8051                                 CAM_INTF_PARM_MAX_DIMENSION,
   8052                                 sizeof(cam_dimension_t),
   8053                                 &max_dim);
   8054     if (rc != NO_ERROR) {
   8055         ALOGE("%s:Failed to update table for CAM_INTF_PARM_MAX_DIMENSION ", __func__);
   8056         return rc;
   8057     }
   8058 
   8059     rc = commitSetBatch();
   8060     if (rc != NO_ERROR) {
   8061         ALOGE("%s:Failed to set lock CAM_INTF_PARM_MAX_DIMENSION parm", __func__);
   8062         return rc;
   8063     }
   8064 
   8065     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   8066         ALOGE("%s:Failed to initialize group update table", __func__);
   8067         return BAD_TYPE;
   8068     }
   8069 
   8070     rc = AddGetParmEntryToBatch(m_pParamBuf,
   8071                                 CAM_INTF_PARM_RAW_DIMENSION);
   8072     if (rc != NO_ERROR) {
   8073         ALOGE("%s:Failed to get CAM_INTF_PARM_RAW_DIMENSION", __func__);
   8074         return rc;
   8075     }
   8076 
   8077     rc = commitGetBatch();
   8078     if (rc != NO_ERROR) {
   8079         ALOGE("%s:Failed to get commit CAM_INTF_PARM_RAW_DIMENSION", __func__);
   8080         return rc;
   8081     }
   8082     memcpy(&raw_dim,
   8083             POINTER_OF_PARAM(CAM_INTF_PARM_RAW_DIMENSION,m_pParamBuf),
   8084             sizeof(cam_dimension_t));
   8085     CDBG_HIGH("%s : RAW Dimension = %d X %d",__func__,raw_dim.width,raw_dim.height);
   8086     if (raw_dim.width == 0 || raw_dim.height == 0) {
   8087         ALOGE("%s: Error getting RAW size. Setting to Capability value",__func__);
   8088         raw_dim = m_pCapability->raw_dim[0];
   8089     }
   8090     setRawSize(raw_dim);
   8091     return rc;
   8092 }
   8093 
   8094 /*===========================================================================
   8095  * FUNCTION   : setHDRSceneEnable
   8096  *
   8097  * DESCRIPTION: sets hdr scene deteced flag
   8098  *
   8099  * PARAMETERS :
   8100  *   @bflag : hdr scene deteced
   8101  *
   8102  * RETURN     : nothing
   8103  *==========================================================================*/
   8104 void QCameraParameters::setHDRSceneEnable(bool bflag)
   8105 {
   8106     bool bupdate = false;
   8107     if (m_HDRSceneEnabled != bflag) {
   8108         bupdate = true;
   8109     }
   8110     m_HDRSceneEnabled = bflag;
   8111 
   8112     if (bupdate) {
   8113         updateFlash(true);
   8114     }
   8115 }
   8116 
   8117 /*===========================================================================
   8118  * FUNCTION   : getASDStateString
   8119  *
   8120  * DESCRIPTION: get ASD result in string format
   8121  *
   8122  * PARAMETERS :
   8123  *   @scene : selected scene mode
   8124  *
   8125  * RETURN     : int32_t type of status
   8126  *              NO_ERROR  -- success
   8127  *              none-zero failure code
   8128  *==========================================================================*/
   8129  const char *QCameraParameters::getASDStateString(cam_auto_scene_t scene)
   8130 {
   8131     switch (scene) {
   8132       case S_NORMAL :
   8133         return "Normal";
   8134       case S_SCENERY:
   8135         return "Scenery";
   8136       case S_PORTRAIT:
   8137         return "Portrait";
   8138       case S_PORTRAIT_BACKLIGHT:
   8139         return "Portrait-Backlight";
   8140       case S_SCENERY_BACKLIGHT:
   8141         return "Scenery-Backlight";
   8142       case S_BACKLIGHT:
   8143         return "Backlight";
   8144       default:
   8145         return "<Unknown!>";
   8146       }
   8147 }
   8148 
   8149 /*===========================================================================
   8150  * FUNCTION   : parseNDimVector
   8151  *
   8152  * DESCRIPTION: helper function to parse a string like "(1, 2, 3, 4, ..., N)"
   8153  *              into N-dimension vector
   8154  *
   8155  * PARAMETERS :
   8156  *   @str     : string to be parsed
   8157  *   @num     : output array of size N to store vector element values
   8158  *   @N       : number of dimension
   8159  *   @delim   : delimeter to seperete string
   8160  *
   8161  * RETURN     : int32_t type of status
   8162  *              NO_ERROR  -- success
   8163  *              none-zero failure code
   8164  *==========================================================================*/
   8165 int32_t QCameraParameters::parseNDimVector(const char *str, int *num, int N, char delim = ',')
   8166 {
   8167     char *start, *end;
   8168     if (num == NULL) {
   8169         ALOGE("%s: Invalid output array (num == NULL)", __func__);
   8170         return BAD_VALUE;
   8171     }
   8172 
   8173     //check if string starts and ends with parantheses
   8174     if(str[0] != '(' || str[strlen(str)-1] != ')') {
   8175         ALOGE("%s: Invalid format of string %s, valid format is (n1, n2, n3, n4 ...)",
   8176               __func__, str);
   8177         return BAD_VALUE;
   8178     }
   8179     start = (char*) str;
   8180     start++;
   8181     for(int i=0; i<N; i++) {
   8182         *(num+i) = (int) strtol(start, &end, 10);
   8183         if(*end != delim && i < N-1) {
   8184             ALOGE("%s: Cannot find delimeter '%c' in string \"%s\". end = %c",
   8185                   __func__, delim, str, *end);
   8186             return -1;
   8187         }
   8188         start = end+1;
   8189     }
   8190     return NO_ERROR;
   8191 }
   8192 
   8193 /*===========================================================================
   8194  * FUNCTION   : parseCameraAreaString
   8195  *
   8196  * DESCRIPTION: helper function to parse a string of camera areas like
   8197  *              "(1, 2, 3, 4, 5),(1, 2, 3, 4, 5),..."
   8198  *
   8199  * PARAMETERS :
   8200  *   @str             : string to be parsed
   8201  *   @max_num_areas   : max number of areas
   8202  *   @pAreas          : ptr to struct to store areas
   8203  *   @num_areas_found : number of areas found
   8204  *
   8205  * RETURN     : int32_t type of status
   8206  *              NO_ERROR  -- success
   8207  *              none-zero failure code
   8208  *==========================================================================*/
   8209 int32_t QCameraParameters::parseCameraAreaString(const char *str,
   8210                                                  int max_num_areas,
   8211                                                  cam_area_t *pAreas,
   8212                                                  int& num_areas_found)
   8213 {
   8214     char area_str[32];
   8215     const char *start, *end, *p;
   8216     start = str; end = NULL;
   8217     int values[5], index=0;
   8218     num_areas_found = 0;
   8219 
   8220     memset(values, 0, sizeof(values));
   8221     while(start != NULL) {
   8222        if(*start != '(') {
   8223             ALOGE("%s: error: Ill formatted area string: %s", __func__, str);
   8224             return BAD_VALUE;
   8225        }
   8226        end = strchr(start, ')');
   8227        if(end == NULL) {
   8228             ALOGE("%s: error: Ill formatted area string: %s", __func__, str);
   8229             return BAD_VALUE;
   8230        }
   8231        int i;
   8232        for (i=0,p=start; p<=end; p++, i++) {
   8233            area_str[i] = *p;
   8234        }
   8235        area_str[i] = '\0';
   8236        if(parseNDimVector(area_str, values, 5) < 0){
   8237             ALOGE("%s: error: Failed to parse the area string: %s", __func__, area_str);
   8238             return BAD_VALUE;
   8239        }
   8240        // no more areas than max_num_areas are accepted.
   8241        if(index >= max_num_areas) {
   8242             ALOGE("%s: error: too many areas specified %s", __func__, str);
   8243             return BAD_VALUE;
   8244        }
   8245        pAreas[index].rect.left = values[0];
   8246        pAreas[index].rect.top = values[1];
   8247        pAreas[index].rect.width = values[2] - values[0];
   8248        pAreas[index].rect.height = values[3] - values[1];
   8249        pAreas[index].weight = values[4];
   8250 
   8251        index++;
   8252        start = strchr(end, '('); // serach for next '('
   8253     }
   8254     num_areas_found = index;
   8255     return 0;
   8256 }
   8257 
   8258 /*===========================================================================
   8259  * FUNCTION   : validateCameraAreas
   8260  *
   8261  * DESCRIPTION: helper function to validate camera areas within (-1000, 1000)
   8262  *
   8263  * PARAMETERS :
   8264  *   @areas     : ptr to array of areas
   8265  *   @num_areas : number of areas
   8266  *
   8267  * RETURN     : true --  area is in valid range
   8268  *              false -- not valid
   8269  *==========================================================================*/
   8270 bool QCameraParameters::validateCameraAreas(cam_area_t *areas, int num_areas)
   8271 {
   8272     // special case: default area
   8273     if (num_areas == 1 &&
   8274         areas[0].rect.left == 0 &&
   8275         areas[0].rect.top == 0 &&
   8276         areas[0].rect.width == 0 &&
   8277         areas[0].rect.height == 0 &&
   8278         areas[0].weight == 0) {
   8279         return true;
   8280     }
   8281 
   8282     for(int i = 0; i < num_areas; i++) {
   8283         // left should be >= -1000
   8284         if(areas[i].rect.left < -1000) {
   8285             return false;
   8286         }
   8287 
   8288         // top  should be >= -1000
   8289         if(areas[i].rect.top < -1000) {
   8290             return false;
   8291         }
   8292 
   8293         // width or height should be > 0
   8294         if (areas[i].rect.width <= 0 || areas[i].rect.height <= 0) {
   8295             return false;
   8296         }
   8297 
   8298         // right  should be <= 1000
   8299         if(areas[i].rect.left + areas[i].rect.width > 1000) {
   8300             return false;
   8301         }
   8302 
   8303         // bottom should be <= 1000
   8304         if(areas[i].rect.top + areas[i].rect.height > 1000) {
   8305             return false;
   8306         }
   8307 
   8308         // weight should be within (1, 1000)
   8309         if (areas[i].weight < 1 || areas[i].weight > 1000) {
   8310             return false;
   8311         }
   8312     }
   8313     return true;
   8314 }
   8315 
   8316 /*===========================================================================
   8317  * FUNCTION   : isYUVFrameInfoNeeded
   8318  *
   8319  * DESCRIPTION: In AE-Bracket mode, we need set yuv buffer information for up-layer
   8320  *
   8321  * PARAMETERS : none
   8322  *
   8323  * RETURN     : true: needed
   8324  *              false: no need
   8325  *==========================================================================*/
   8326 bool QCameraParameters::isYUVFrameInfoNeeded()
   8327 {
   8328     //In AE-Bracket mode, we need set raw buffer information for up-layer
   8329     if(!isNV21PictureFormat() && !isNV16PictureFormat()){
   8330         return false;
   8331     }
   8332     const char *aecBracketStr =  get(KEY_QC_AE_BRACKET_HDR);
   8333 
   8334     int value = lookupAttr(BRACKETING_MODES_MAP,
   8335                    sizeof(BRACKETING_MODES_MAP)/sizeof(QCameraMap),
   8336                            aecBracketStr);
   8337     CDBG_HIGH("%s: aecBracketStr=%s, value=%d.", __func__, aecBracketStr, value);
   8338     return (value == CAM_EXP_BRACKETING_ON);
   8339 }
   8340 
   8341 /*===========================================================================
   8342  * FUNCTION   : getFrameFmtString
   8343  *
   8344  * DESCRIPTION: get string name of frame format
   8345  *
   8346  * PARAMETERS :
   8347  *   @frame   : frame format
   8348  *
   8349  * RETURN     : string name of frame format
   8350  *==========================================================================*/
   8351 const char *QCameraParameters::getFrameFmtString(cam_format_t fmt)
   8352 {
   8353     return lookupNameByValue(PICTURE_TYPES_MAP,
   8354                              sizeof(PICTURE_TYPES_MAP)/sizeof(QCameraMap),
   8355                              fmt);
   8356 }
   8357 
   8358 /*===========================================================================
   8359  * FUNCTION   : initBatchUpdate
   8360  *
   8361  * DESCRIPTION: init camera parameters buf entries
   8362  *
   8363  * PARAMETERS :
   8364  *   @p_table : ptr to parameter buffer
   8365  *
   8366  * RETURN     : int32_t type of status
   8367  *              NO_ERROR  -- success
   8368  *              none-zero failure code
   8369  *==========================================================================*/
   8370 int32_t QCameraParameters::initBatchUpdate(parm_buffer_t *p_table)
   8371 {
   8372     m_tempMap.clear();
   8373 
   8374     memset(p_table, 0, sizeof(parm_buffer_t));
   8375     return NO_ERROR;
   8376 }
   8377 
   8378 /*===========================================================================
   8379  * FUNCTION   : AddSetParmEntryToBatch
   8380  *
   8381  * DESCRIPTION: add set parameter entry into batch
   8382  *
   8383  * PARAMETERS :
   8384  *   @p_table     : ptr to parameter buffer
   8385  *   @paramType   : parameter type
   8386  *   @paramLength : length of parameter value
   8387  *   @paramValue  : ptr to parameter value
   8388  *
   8389  * RETURN     : int32_t type of status
   8390  *              NO_ERROR  -- success
   8391  *              none-zero failure code
   8392  *==========================================================================*/
   8393 int32_t QCameraParameters::AddSetParmEntryToBatch(parm_buffer_t *p_table,
   8394                                                   cam_intf_parm_type_t paramType,
   8395                                                   uint32_t paramLength,
   8396                                                   void *paramValue)
   8397 {
   8398     void* dst;
   8399     if ((NULL == p_table) || (NULL == paramValue) ||
   8400         (paramType >= CAM_INTF_PARM_MAX)) {
   8401         ALOGE("%s: Error invalid param. p_table: %p, paramValue: %p, "
   8402             "paramType: %d", __func__, p_table, paramValue, paramType);
   8403         return BAD_VALUE;
   8404     }
   8405     /*************************************************************************
   8406     *                   Copy contents into entry                             *
   8407     *************************************************************************/
   8408     if (paramLength > get_size_of(paramType)) {
   8409         ALOGE("%s:Size of input larger than max entry size. paramType: %d "
   8410             "paramLength: %d sizeof(paramType): %d",
   8411             __func__, paramType, paramLength, get_size_of(paramType));
   8412         return BAD_VALUE;
   8413     }
   8414 
   8415     dst = get_pointer_of(paramType, p_table);
   8416     if (NULL != dst) {
   8417         memcpy(dst, paramValue, paramLength);
   8418         p_table->is_valid[paramType] = 1;
   8419     }
   8420     return NO_ERROR;
   8421 }
   8422 
   8423 /*===========================================================================
   8424  * FUNCTION   : AddGetParmEntryToBatch
   8425  *
   8426  * DESCRIPTION: add get parameter entry into batch
   8427  *
   8428  * PARAMETERS :
   8429  *   @p_table     : ptr to parameter buffer
   8430  *   @paramType   : parameter type
   8431  *
   8432  * RETURN     : int32_t type of status
   8433  *              NO_ERROR  -- success
   8434  *              none-zero failure code
   8435  *==========================================================================*/
   8436 int32_t QCameraParameters::AddGetParmEntryToBatch(parm_buffer_t *p_table,
   8437                                                 cam_intf_parm_type_t paramType)
   8438 {
   8439     if ((p_table == NULL) || (paramType >= CAM_INTF_PARM_MAX)) {
   8440         ALOGE("%s: Error invalid param. p_table: %p, paramType: %d",
   8441             __func__, p_table, paramType);
   8442         return BAD_VALUE;
   8443     }
   8444     /* Set the is_reqd flag for this param so that backend can fill the value*/
   8445     p_table->is_reqd[paramType] = 1;
   8446 
   8447     return NO_ERROR;
   8448 }
   8449 
   8450 /*===========================================================================
   8451  * FUNCTION   : commitSetBatch
   8452  *
   8453  * DESCRIPTION: commit all set parameters in the batch work to backend
   8454  *
   8455  * PARAMETERS : none
   8456  *
   8457  * RETURN     : int32_t type of status
   8458  *              NO_ERROR  -- success
   8459  *              none-zero failure code
   8460  *==========================================================================*/
   8461 int32_t QCameraParameters::commitSetBatch()
   8462 {
   8463     int32_t rc = NO_ERROR;
   8464     int32_t i = 0;
   8465 
   8466     /* Loop to check if atleast one entry is valid */
   8467     for(i = 0; i < CAM_INTF_PARM_MAX; i++){
   8468         if(m_pParamBuf->is_valid[i])
   8469             break;
   8470     }
   8471 
   8472     if (i < CAM_INTF_PARM_MAX) {
   8473         rc = m_pCamOpsTbl->ops->set_parms(m_pCamOpsTbl->camera_handle, m_pParamBuf);
   8474     }
   8475     if (rc == NO_ERROR) {
   8476         // commit change from temp storage into param map
   8477         rc = commitParamChanges();
   8478     }
   8479     return rc;
   8480 }
   8481 
   8482 /*===========================================================================
   8483  * FUNCTION   : commitGetBatch
   8484  *
   8485  * DESCRIPTION: commit all get parameters in the batch work to backend
   8486  *
   8487  * PARAMETERS : none
   8488  *
   8489  * RETURN     : int32_t type of status
   8490  *              NO_ERROR  -- success
   8491  *              none-zero failure code
   8492  *==========================================================================*/
   8493 int32_t QCameraParameters::commitGetBatch()
   8494 {
   8495     int32_t rc = NO_ERROR;
   8496     int32_t i = 0;
   8497 
   8498     /* Loop to check if atleast one entry is valid */
   8499     for(i = 0; i < CAM_INTF_PARM_MAX; i++){
   8500         if(m_pParamBuf->is_valid[i])
   8501             break;
   8502     }
   8503 
   8504     if (i < CAM_INTF_PARM_MAX) {
   8505         return m_pCamOpsTbl->ops->get_parms(m_pCamOpsTbl->camera_handle, m_pParamBuf);
   8506     } else {
   8507         return NO_ERROR;
   8508     }
   8509     return rc;
   8510 }
   8511 
   8512 /*===========================================================================
   8513  * FUNCTION   : updateParamEntry
   8514  *
   8515  * DESCRIPTION: update a parameter entry in the local temp map obj
   8516  *
   8517  * PARAMETERS :
   8518  *   @key     : key of the entry
   8519  *   @value   : value of the entry
   8520  *
   8521  * RETURN     : int32_t type of status
   8522  *              NO_ERROR  -- success
   8523  *              none-zero failure code
   8524  *==========================================================================*/
   8525 int32_t QCameraParameters::updateParamEntry(const char *key, const char *value)
   8526 {
   8527     m_tempMap.replaceValueFor(String8(key), String8(value));
   8528     return NO_ERROR;
   8529 }
   8530 
   8531 /*===========================================================================
   8532  * FUNCTION   : commitParamChanges
   8533  *
   8534  * DESCRIPTION: commit all changes in local temp map obj into parameter obj
   8535  *
   8536  * PARAMETERS : none
   8537  *
   8538  * RETURN     : int32_t type of status
   8539  *              NO_ERROR  -- success
   8540  *              none-zero failure code
   8541  *==========================================================================*/
   8542 int32_t QCameraParameters::commitParamChanges()
   8543 {
   8544     size_t size = m_tempMap.size();
   8545     for (size_t i = 0; i < size; i++) {
   8546         String8 k, v;
   8547         k = m_tempMap.keyAt(i);
   8548         v = m_tempMap.valueAt(i);
   8549         set(k, v);
   8550     }
   8551     m_tempMap.clear();
   8552 
   8553     // update local changes
   8554     m_bRecordingHint = m_bRecordingHint_new;
   8555     m_bZslMode = m_bZslMode_new;
   8556 
   8557     /* After applying scene mode auto,
   8558       Camera effects need to be reapplied */
   8559     if ( m_bSceneTransitionAuto ) {
   8560         m_bUpdateEffects = true;
   8561         m_bSceneTransitionAuto = false;
   8562     }
   8563 
   8564     if ( m_bReleaseTorchCamera && ( NULL != m_pTorch) ) {
   8565         m_pTorch->releaseTorchCamera();
   8566         m_bReleaseTorchCamera = false;
   8567     }
   8568 
   8569 
   8570     return NO_ERROR;
   8571 }
   8572 
   8573 /*===========================================================================
   8574  * FUNCTION   : QCameraReprocScaleParam
   8575  *
   8576  * DESCRIPTION: constructor of QCameraReprocScaleParam
   8577  *
   8578  * PARAMETERS : none
   8579  *
   8580  * RETURN     : none
   8581  *==========================================================================*/
   8582 QCameraReprocScaleParam::QCameraReprocScaleParam(QCameraParameters *parent)
   8583   : mParent(parent),
   8584     mScaleEnabled(false),
   8585     mIsUnderScaling(false),
   8586     mScaleDirection(0),
   8587     mNeedScaleCnt(0),
   8588     mSensorSizeTblCnt(0),
   8589     mSensorSizeTbl(NULL),
   8590     mTotalSizeTblCnt(0)
   8591 {
   8592     mPicSizeFromAPK.width = 0;
   8593     mPicSizeFromAPK.height = 0;
   8594     mPicSizeSetted.width = 0;
   8595     mPicSizeSetted.height = 0;
   8596     memset(mNeedScaledSizeTbl, 0, sizeof(mNeedScaledSizeTbl));
   8597     memset(mTotalSizeTbl, 0, sizeof(mTotalSizeTbl));
   8598 }
   8599 
   8600 /*===========================================================================
   8601  * FUNCTION   : ~~QCameraReprocScaleParam
   8602  *
   8603  * DESCRIPTION: destructor of QCameraReprocScaleParam
   8604  *
   8605  * PARAMETERS : none
   8606  *
   8607  * RETURN     : none
   8608  *==========================================================================*/
   8609 QCameraReprocScaleParam::~QCameraReprocScaleParam()
   8610 {
   8611     //do nothing now.
   8612 }
   8613 
   8614 /*===========================================================================
   8615  * FUNCTION   : setScaledSizeTbl
   8616  *
   8617  * DESCRIPTION: re-set picture size table with dimensions that need scaling if Reproc Scale is enabled
   8618  *
   8619  * PARAMETERS :
   8620  *   @scale_cnt   : count of picture sizes that want scale
   8621  *   @scale_tbl    : picture size table that want scale
   8622  *   @org_cnt     : sensor supported picture size count
   8623  *   @org_tbl      : sensor supported picture size table
   8624  *
   8625  * RETURN     : int32_t type of status
   8626  *              NO_ERROR  -- success
   8627  *              none-zero failure code
   8628  *==========================================================================*/
   8629 int32_t QCameraReprocScaleParam::setScaleSizeTbl(uint8_t scale_cnt, cam_dimension_t *scale_tbl, uint8_t org_cnt, cam_dimension_t *org_tbl)
   8630 {
   8631     int32_t rc = NO_ERROR;
   8632     int i;
   8633     mNeedScaleCnt = 0;
   8634 
   8635     if(!mScaleEnabled || scale_cnt <=0 || scale_tbl == NULL || org_cnt <=0 || org_tbl == NULL){
   8636         return BAD_VALUE;    // Do not need scale, so also need not reset picture size table
   8637     }
   8638 
   8639     mSensorSizeTblCnt = org_cnt;
   8640     mSensorSizeTbl = org_tbl;
   8641     mNeedScaleCnt = checkScaleSizeTable(scale_cnt, scale_tbl, org_cnt, org_tbl);
   8642     if(mNeedScaleCnt <= 0){
   8643         ALOGE("%s: do not have picture sizes need scaling.", __func__);
   8644         return BAD_VALUE;
   8645     }
   8646 
   8647     if(mNeedScaleCnt + org_cnt > MAX_SIZES_CNT){
   8648         ALOGE("%s: picture size list exceed the max count.", __func__);
   8649         return BAD_VALUE;
   8650     }
   8651 
   8652     //get the total picture size table
   8653     mTotalSizeTblCnt = mNeedScaleCnt + org_cnt;
   8654     for(i = 0; i < mNeedScaleCnt; i++){
   8655         mTotalSizeTbl[i].width = mNeedScaledSizeTbl[i].width;
   8656         mTotalSizeTbl[i].height = mNeedScaledSizeTbl[i].height;
   8657         CDBG_HIGH("%s: scale picture size: i =%d, width=%d, height=%d.", __func__,
   8658             i, mTotalSizeTbl[i].width, mTotalSizeTbl[i].height);
   8659     }
   8660     for(; i < mTotalSizeTblCnt; i++){
   8661         mTotalSizeTbl[i].width = org_tbl[i-mNeedScaleCnt].width;
   8662         mTotalSizeTbl[i].height = org_tbl[i-mNeedScaleCnt].height;
   8663         CDBG_HIGH("%s: sensor supportted picture size: i =%d, width=%d, height=%d.", __func__,
   8664             i, mTotalSizeTbl[i].width, mTotalSizeTbl[i].height);
   8665     }
   8666     return rc;
   8667 }
   8668 
   8669 /*===========================================================================
   8670  * FUNCTION   : getScaledSizeTblCnt
   8671  *
   8672  * DESCRIPTION: get picture size cnt that need scale
   8673  *
   8674  * PARAMETERS : none
   8675  *
   8676  * RETURN     : uint8_t type of picture size count
   8677  *==========================================================================*/
   8678 uint8_t QCameraReprocScaleParam::getScaleSizeTblCnt()
   8679 {
   8680     return mNeedScaleCnt;
   8681 }
   8682 
   8683 /*===========================================================================
   8684  * FUNCTION   : getScaledSizeTbl
   8685  *
   8686  * DESCRIPTION: get picture size table that need scale
   8687  *
   8688  * PARAMETERS :  none
   8689  *
   8690  * RETURN     : cam_dimension_t list of picture size table
   8691  *==========================================================================*/
   8692 cam_dimension_t *QCameraReprocScaleParam::getScaledSizeTbl()
   8693 {
   8694     if(!mScaleEnabled)
   8695         return NULL;
   8696 
   8697     return mNeedScaledSizeTbl;
   8698 }
   8699 
   8700 /*===========================================================================
   8701  * FUNCTION   : setScaleEnable
   8702  *
   8703  * DESCRIPTION: enable or disable Reproc Scale
   8704  *
   8705  * PARAMETERS :
   8706  *   @enabled : enable: 1; disable 0
   8707  *
   8708  * RETURN     : none
   8709  *==========================================================================*/
   8710 void QCameraReprocScaleParam::setScaleEnable(bool enabled)
   8711 {
   8712     mScaleEnabled = enabled;
   8713 }
   8714 
   8715 /*===========================================================================
   8716  * FUNCTION   : isScaleEnabled
   8717  *
   8718  * DESCRIPTION: check if Reproc Scale is enabled
   8719  *
   8720  * PARAMETERS :  none
   8721  *
   8722  * RETURN     : bool type of status
   8723  *==========================================================================*/
   8724 bool QCameraReprocScaleParam::isScaleEnabled()
   8725 {
   8726     return mScaleEnabled;
   8727 }
   8728 
   8729 /*===========================================================================
   8730  * FUNCTION   : isScalePicSize
   8731  *
   8732  * DESCRIPTION: check if current picture size is from Scale Table
   8733  *
   8734  * PARAMETERS :
   8735  *   @width     : current picture width
   8736  *   @height    : current picture height
   8737  *
   8738  * RETURN     : bool type of status
   8739  *==========================================================================*/
   8740 bool QCameraReprocScaleParam::isScalePicSize(int width, int height)
   8741 {
   8742     //Check if the picture size is in scale table
   8743     if(mNeedScaleCnt <= 0)
   8744         return FALSE;
   8745 
   8746     for(int i = 0; i < mNeedScaleCnt; i++){
   8747         if(mNeedScaledSizeTbl[i].width == width
   8748             && mNeedScaledSizeTbl[i].height == height){
   8749             //found match
   8750             return TRUE;
   8751         }
   8752     }
   8753 
   8754     ALOGE("%s: Not in scale picture size table.", __func__);
   8755     return FALSE;
   8756 }
   8757 
   8758 /*===========================================================================
   8759  * FUNCTION   : isValidatePicSize
   8760  *
   8761  * DESCRIPTION: check if current picture size is validate
   8762  *
   8763  * PARAMETERS :
   8764  *   @width     : current picture width
   8765  *   @height    : current picture height
   8766  *
   8767  * RETURN     : bool type of status
   8768  *==========================================================================*/
   8769 bool QCameraReprocScaleParam::isValidatePicSize(int width, int height)
   8770 {
   8771     int i = 0;
   8772 
   8773     for(i = 0; i < mSensorSizeTblCnt; i++){
   8774         if(mSensorSizeTbl[i].width == width
   8775             && mSensorSizeTbl[i].height== height){
   8776             return TRUE;
   8777         }
   8778     }
   8779 
   8780     for(i = 0; i < mNeedScaleCnt; i++){
   8781         if(mNeedScaledSizeTbl[i].width == width
   8782             && mNeedScaledSizeTbl[i].height== height){
   8783             return TRUE;
   8784         }
   8785     }
   8786 
   8787     ALOGE("%s: Invalidate input picture size.", __func__);
   8788     return FALSE;
   8789 }
   8790 
   8791 /*===========================================================================
   8792  * FUNCTION   : setSensorSupportedPicSize
   8793  *
   8794  * DESCRIPTION: set sensor supported picture size.
   8795  *    For Snapshot stream size configuration, we need use sensor supported size.
   8796  *    We will use CPP to do Scaling based on output Snapshot stream.
   8797  *
   8798  * PARAMETERS : none
   8799  *
   8800  * RETURN     : int32_t type of status
   8801  *              NO_ERROR  -- success
   8802  *              none-zero failure code
   8803  *==========================================================================*/
   8804 int32_t QCameraReprocScaleParam::setSensorSupportedPicSize()
   8805 {
   8806     //will find a suitable picture size (here we leave a prossibility to add other scale requirement)
   8807     //Currently we only focus on upscaling, and checkScaleSizeTable() has guaranteed the dimension ratio.
   8808 
   8809     if(!mIsUnderScaling || mSensorSizeTblCnt <= 0)
   8810         return BAD_VALUE;
   8811 
   8812     //We just get the max sensor supported size here.
   8813     mPicSizeSetted.width = mSensorSizeTbl[0].width;
   8814     mPicSizeSetted.height = mSensorSizeTbl[0].height;
   8815 
   8816     return NO_ERROR;
   8817 }
   8818 
   8819 
   8820 /*===========================================================================
   8821  * FUNCTION   : setValidatePicSize
   8822  *
   8823  * DESCRIPTION: set sensor supported size and change scale status.
   8824  *
   8825  * PARAMETERS :
   8826  *   @width    : input picture width
   8827  *   @height   : input picture height
   8828  *
   8829  * RETURN     : int32_t type of status
   8830  *              NO_ERROR  -- success
   8831  *              none-zero failure code
   8832  *==========================================================================*/
   8833 int32_t QCameraReprocScaleParam::setValidatePicSize(int &width,int &height)
   8834 {
   8835     if(!mScaleEnabled)
   8836         return BAD_VALUE;
   8837 
   8838     mIsUnderScaling = FALSE; //default: not under scale
   8839 
   8840     if(isScalePicSize(width, height)){
   8841         // input picture size need scaling operation. Record size from APK and setted
   8842         mIsUnderScaling = TRUE;
   8843         mPicSizeFromAPK.width = width;
   8844         mPicSizeFromAPK.height = height;
   8845 
   8846         if(setSensorSupportedPicSize() != NO_ERROR)
   8847             return BAD_VALUE;
   8848 
   8849         //re-set picture size to sensor supported size
   8850         width = mPicSizeSetted.width;
   8851         height = mPicSizeSetted.height;
   8852         CDBG_HIGH("%s: mPicSizeFromAPK- with=%d, height=%d, mPicSizeSetted- with =%d, height=%d.",
   8853             __func__, mPicSizeFromAPK.width, mPicSizeFromAPK.height, mPicSizeSetted.width, mPicSizeSetted.height);
   8854     }else{
   8855         mIsUnderScaling = FALSE;
   8856         //no scale is needed for input picture size
   8857         if(!isValidatePicSize(width, height)){
   8858             ALOGE("%s: invalidate input picture size.", __func__);
   8859             return BAD_VALUE;
   8860         }
   8861         mPicSizeSetted.width = width;
   8862         mPicSizeSetted.height = height;
   8863     }
   8864 
   8865     CDBG_HIGH("%s: X. mIsUnderScaling=%d, width=%d, height=%d.", __func__, mIsUnderScaling, width, height);
   8866     return NO_ERROR;
   8867 }
   8868 
   8869 /*===========================================================================
   8870  * FUNCTION   : getPicSizeFromAPK
   8871  *
   8872  * DESCRIPTION: get picture size that get from APK
   8873  *
   8874  * PARAMETERS :
   8875  *   @width     : input width
   8876  *   @height    : input height
   8877  *
   8878  * RETURN     : int32_t type of status
   8879  *              NO_ERROR  -- success
   8880  *              none-zero failure code
   8881  *==========================================================================*/
   8882 int32_t QCameraReprocScaleParam::getPicSizeFromAPK(int &width, int &height)
   8883 {
   8884     if(!mIsUnderScaling)
   8885         return BAD_VALUE;
   8886 
   8887     width = mPicSizeFromAPK.width;
   8888     height = mPicSizeFromAPK.height;
   8889     return NO_ERROR;
   8890 }
   8891 
   8892 /*===========================================================================
   8893  * FUNCTION   : getPicSizeSetted
   8894  *
   8895  * DESCRIPTION: get picture size that setted into mm-camera
   8896  *
   8897  * PARAMETERS :
   8898  *   @width     : input width
   8899  *   @height    : input height
   8900  *
   8901  * RETURN     : int32_t type of status
   8902  *              NO_ERROR  -- success
   8903  *              none-zero failure code
   8904  *==========================================================================*/
   8905 int32_t QCameraReprocScaleParam::getPicSizeSetted(int &width, int &height)
   8906 {
   8907     width = mPicSizeSetted.width;
   8908     height = mPicSizeSetted.height;
   8909     return NO_ERROR;
   8910 }
   8911 
   8912 /*===========================================================================
   8913  * FUNCTION   : isUnderScaling
   8914  *
   8915  * DESCRIPTION: check if we are in Reproc Scaling requirment
   8916  *
   8917  * PARAMETERS :  none
   8918  *
   8919  * RETURN     : bool type of status
   8920  *==========================================================================*/
   8921 bool QCameraReprocScaleParam::isUnderScaling()
   8922 {
   8923     return mIsUnderScaling;
   8924 }
   8925 
   8926 /*===========================================================================
   8927  * FUNCTION   : checkScaleSizeTable
   8928  *
   8929  * DESCRIPTION: check PICTURE_SIZE_NEED_SCALE to choose
   8930  *
   8931  * PARAMETERS :
   8932  *   @scale_cnt   : count of picture sizes that want scale
   8933  *   @scale_tbl    : picture size table that want scale
   8934  *   @org_cnt     : sensor supported picture size count
   8935  *   @org_tbl      : sensor supported picture size table
   8936  *
   8937  * RETURN     : bool type of status
   8938  *==========================================================================*/
   8939 uint8_t QCameraReprocScaleParam::checkScaleSizeTable(uint8_t scale_cnt, cam_dimension_t *scale_tbl, uint8_t org_cnt, cam_dimension_t *org_tbl)
   8940 {
   8941     uint8_t stbl_cnt = 0;
   8942     uint8_t temp_cnt = 0;
   8943     int i = 0;
   8944     if(scale_cnt <=0 || scale_tbl == NULL || org_tbl == NULL || org_cnt <= 0)
   8945         return stbl_cnt;
   8946 
   8947     //get validate scale size table. Currently we only support:
   8948     // 1. upscale. The scale size must larger than max sensor supported size
   8949     // 2. Scale dimension ratio must be same as the max sensor supported size.
   8950     temp_cnt = scale_cnt;
   8951     for(i = scale_cnt-1; i >= 0; i--){
   8952         if(scale_tbl[i].width > org_tbl[0].width ||
   8953             (scale_tbl[i].width == org_tbl[0].width &&
   8954              scale_tbl[i].height > org_tbl[0].height)){
   8955             //get the smallest scale size
   8956             break;
   8957         }
   8958         temp_cnt--;
   8959     }
   8960 
   8961     //check dimension ratio
   8962     double supported_ratio = (double)org_tbl[0].width/ (double)org_tbl[0].height;
   8963     for(i = 0; i < temp_cnt; i++){
   8964         double cur_ratio = (double)scale_tbl[i].width/ (double)scale_tbl[i].height;
   8965         if(fabs(supported_ratio - cur_ratio) > ASPECT_TOLERANCE){
   8966             continue;
   8967         }
   8968         mNeedScaledSizeTbl[stbl_cnt].width = scale_tbl[i].width;
   8969         mNeedScaledSizeTbl[stbl_cnt].height= scale_tbl[i].height;
   8970         stbl_cnt++;
   8971     }
   8972 
   8973     return stbl_cnt;
   8974 }
   8975 
   8976 /*===========================================================================
   8977  * FUNCTION   : getTotalSizeTblCnt
   8978  *
   8979  * DESCRIPTION: get total picture size count after adding dimensions that need scaling
   8980  *
   8981  * PARAMETERS : none
   8982  *
   8983  * RETURN     : uint8_t type of picture size count
   8984  *==========================================================================*/
   8985 uint8_t QCameraReprocScaleParam::getTotalSizeTblCnt()
   8986 {
   8987     return mTotalSizeTblCnt;
   8988 }
   8989 
   8990 /*===========================================================================
   8991  * FUNCTION   : getTotalSizeTbl
   8992  *
   8993  * DESCRIPTION: get picture size table after adding dimensions that need scaling
   8994  *
   8995  * PARAMETERS :  none
   8996  *
   8997  * RETURN     : cam_dimension_t list of picture size table
   8998  *==========================================================================*/
   8999 cam_dimension_t *QCameraReprocScaleParam::getTotalSizeTbl()
   9000 {
   9001     if(!mScaleEnabled)
   9002         return NULL;
   9003 
   9004     return mTotalSizeTbl;
   9005 }
   9006 
   9007 /*===========================================================================
   9008  * FUNCTION   : isHDREnabled
   9009  *
   9010  * DESCRIPTION: if HDR is enabled
   9011  *
   9012  * PARAMETERS : none
   9013  *
   9014  * RETURN     : true: needed
   9015  *              false: no need
   9016  *==========================================================================*/
   9017 bool QCameraParameters::isHDREnabled()
   9018 {
   9019     return ((m_nBurstNum == 1) && (m_bHDREnabled || m_HDRSceneEnabled));
   9020 }
   9021 
   9022 /*===========================================================================
   9023  * FUNCTION   : isAVTimerEnabled
   9024  *
   9025  * DESCRIPTION: if AVTimer is enabled
   9026  *
   9027  * PARAMETERS : none
   9028  *
   9029  * RETURN     : true: needed
   9030  *              false: no need
   9031  *==========================================================================*/
   9032 bool QCameraParameters::isAVTimerEnabled()
   9033 {
   9034     return m_bAVTimerEnabled;
   9035 }
   9036 
   9037 /*===========================================================================
   9038 * FUNCTION   : isDISEnabled
   9039 *
   9040 * DESCRIPTION: if DIS is enabled
   9041 *
   9042 * PARAMETERS : none
   9043 *
   9044 * RETURN    : true: needed
   9045 *               false: no need
   9046 *==========================================================================*/
   9047 bool QCameraParameters::isDISEnabled()
   9048 {
   9049     return m_bDISEnabled;
   9050 }
   9051 
   9052 /*===========================================================================
   9053  * FUNCTION   : setStreamConfigure
   9054  *
   9055  * DESCRIPTION: set stream type, stream dimension for all configured streams.
   9056  *
   9057  * PARAMETERS :
   9058  *   @isCapture: Whether this configureation is for an image capture
   9059  *   @previewAsPostview: Use preview as postview
   9060  *
   9061  * RETURN     : int32_t type of status
   9062  *              NO_ERROR  -- success
   9063  *              none-zero failure code
   9064  *==========================================================================*/
   9065 bool QCameraParameters::setStreamConfigure(bool isCapture, bool previewAsPostview)
   9066 {
   9067     int32_t rc = NO_ERROR;
   9068     cam_stream_size_info_t stream_config_info;
   9069     char value[PROPERTY_VALUE_MAX];
   9070     bool raw_yuv = false;
   9071 
   9072     if ( m_pParamBuf == NULL ) {
   9073         return NO_INIT;
   9074     }
   9075 
   9076     memset(&stream_config_info, 0, sizeof(stream_config_info));
   9077     stream_config_info.num_streams = 0;
   9078 
   9079     property_get("persist.camera.raw_yuv", value, "0");
   9080     raw_yuv = atoi(value) > 0 ? true : false;
   9081 
   9082     if (isZSLMode() && getRecordingHintValue() != true) {
   9083         stream_config_info.type[stream_config_info.num_streams] =
   9084             CAM_STREAM_TYPE_PREVIEW;
   9085         getStreamDimension(CAM_STREAM_TYPE_PREVIEW,
   9086             stream_config_info.stream_sizes[stream_config_info.num_streams]);
   9087         stream_config_info.num_streams++;
   9088 
   9089         stream_config_info.type[stream_config_info.num_streams] =
   9090             CAM_STREAM_TYPE_SNAPSHOT;
   9091         getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,
   9092             stream_config_info.stream_sizes[stream_config_info.num_streams]);
   9093         stream_config_info.num_streams++;
   9094 
   9095     } else if (!isCapture) {
   9096         if (m_bRecordingHint) {
   9097            if (!is4k2kVideoResolution()) {
   9098                stream_config_info.type[stream_config_info.num_streams] =
   9099                    CAM_STREAM_TYPE_SNAPSHOT;
   9100                getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,
   9101                    stream_config_info.stream_sizes[stream_config_info.num_streams]);
   9102                stream_config_info.num_streams++;
   9103            }
   9104 
   9105             stream_config_info.type[stream_config_info.num_streams] =
   9106                 CAM_STREAM_TYPE_VIDEO;
   9107             getStreamDimension(CAM_STREAM_TYPE_VIDEO,
   9108                 stream_config_info.stream_sizes[stream_config_info.num_streams]);
   9109             stream_config_info.num_streams++;
   9110         }
   9111 
   9112         stream_config_info.type[stream_config_info.num_streams] =
   9113             CAM_STREAM_TYPE_PREVIEW;
   9114         getStreamDimension(CAM_STREAM_TYPE_PREVIEW,
   9115             stream_config_info.stream_sizes[stream_config_info.num_streams]);
   9116         stream_config_info.num_streams++;
   9117     } else {
   9118         if (isJpegPictureFormat() || isNV16PictureFormat() || isNV21PictureFormat()) {
   9119             stream_config_info.type[stream_config_info.num_streams] =
   9120                 CAM_STREAM_TYPE_SNAPSHOT;
   9121             getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,
   9122                 stream_config_info.stream_sizes[stream_config_info.num_streams]);
   9123             stream_config_info.num_streams++;
   9124 
   9125             if (previewAsPostview) {
   9126                 stream_config_info.type[stream_config_info.num_streams] =
   9127                     CAM_STREAM_TYPE_PREVIEW;
   9128                 getStreamDimension(CAM_STREAM_TYPE_PREVIEW,
   9129                     stream_config_info.stream_sizes[stream_config_info.num_streams]);
   9130                 stream_config_info.num_streams++;
   9131             } else {
   9132                 stream_config_info.type[stream_config_info.num_streams] =
   9133                     CAM_STREAM_TYPE_POSTVIEW;
   9134                 getStreamDimension(CAM_STREAM_TYPE_POSTVIEW,
   9135                     stream_config_info.stream_sizes[stream_config_info.num_streams]);
   9136                 stream_config_info.num_streams++;
   9137             }
   9138         }
   9139     }
   9140     if (raw_yuv) {
   9141         stream_config_info.type[stream_config_info.num_streams] =
   9142             CAM_STREAM_TYPE_RAW;
   9143         getStreamDimension(CAM_STREAM_TYPE_RAW,
   9144             stream_config_info.stream_sizes[stream_config_info.num_streams]);
   9145         stream_config_info.num_streams++;
   9146     }
   9147 
   9148     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   9149         ALOGE("%s:Failed to initialize group update table", __func__);
   9150         return BAD_TYPE;
   9151     }
   9152 
   9153     rc = AddSetParmEntryToBatch(m_pParamBuf,
   9154                                 CAM_INTF_META_STREAM_INFO,
   9155                                 sizeof(stream_config_info),
   9156                                 &stream_config_info);
   9157     if (rc != NO_ERROR) {
   9158         ALOGE("%s:Failed to update table", __func__);
   9159         return rc;
   9160     }
   9161 
   9162     rc = commitSetBatch();
   9163     if (rc != NO_ERROR) {
   9164         ALOGE("%s:Failed to set stream info parm", __func__);
   9165         return rc;
   9166     }
   9167 
   9168     return rc;
   9169 }
   9170 
   9171 /*===========================================================================
   9172  * FUNCTION   : needThumbnailReprocess
   9173  *
   9174  * DESCRIPTION: Check if thumbnail reprocessing is needed
   9175  *
   9176  * PARAMETERS : @pFeatureMask - feature mask
   9177  *
   9178  * RETURN     : true: needed
   9179  *              false: no need
   9180  *==========================================================================*/
   9181 bool QCameraParameters::needThumbnailReprocess(uint32_t *pFeatureMask)
   9182 {
   9183     if (isUbiFocusEnabled() || isChromaFlashEnabled() ||
   9184         isOptiZoomEnabled()) {
   9185         *pFeatureMask &= ~CAM_QCOM_FEATURE_CHROMA_FLASH;
   9186         *pFeatureMask &= ~CAM_QCOM_FEATURE_UBIFOCUS;
   9187         *pFeatureMask &= ~CAM_QCOM_FEATURE_OPTIZOOM;
   9188         return false;
   9189     } else {
   9190         return true;
   9191     }
   9192 }
   9193 
   9194 /*===========================================================================
   9195  * FUNCTION   : getNumOfExtraBuffersForImageProc
   9196  *
   9197  * DESCRIPTION: get number of extra input buffers needed by image processing
   9198  *
   9199  * PARAMETERS : none
   9200  *
   9201  * RETURN     : number of extra buffers needed by ImageProc;
   9202  *              0 if not ImageProc enabled
   9203  *==========================================================================*/
   9204 uint8_t QCameraParameters::getNumOfExtraBuffersForImageProc()
   9205 {
   9206     uint8_t numOfBufs = 0;
   9207 
   9208     if (isUbiFocusEnabled()) {
   9209         numOfBufs += m_pCapability->ubifocus_af_bracketing_need.burst_count - 1;
   9210         if (isUbiRefocus()) {
   9211             numOfBufs +=
   9212                 m_pCapability->ubifocus_af_bracketing_need.burst_count + 1;
   9213         }
   9214     } else if (m_bOptiZoomOn) {
   9215         numOfBufs += m_pCapability->opti_zoom_settings_need.burst_count - 1;
   9216     } else if (isChromaFlashEnabled()) {
   9217         numOfBufs += 1; /* flash and non flash */
   9218     }
   9219 
   9220     return numOfBufs * getBurstNum();
   9221 }
   9222 
   9223 /*===========================================================================
   9224  * FUNCTION   : is4k2kVideoResolution
   9225  *
   9226  * DESCRIPTION: if resolution is 4k x 2k or true 4k x 2k
   9227  *
   9228  * PARAMETERS : none
   9229  *
   9230  * RETURN     : true: video resolution is 4k x 2k
   9231  *              false: video resolution is not 4k x 2k
   9232  *==========================================================================*/
   9233 bool QCameraParameters::is4k2kVideoResolution()
   9234 {
   9235    bool enabled = false;
   9236    cam_dimension_t resolution;
   9237    getVideoSize(&resolution.width, &resolution.height);
   9238    if (!(resolution.width < 3840 && resolution.height < 2160)) {
   9239       enabled = true;
   9240    }
   9241    return enabled;
   9242 }
   9243 /*===========================================================================
   9244  * FUNCTION   : dump
   9245  *
   9246  * DESCRIPTION: Composes a string based on current configuration
   9247  *
   9248  * PARAMETERS : none
   9249  *
   9250  * RETURN     : Formatted string
   9251  *==========================================================================*/
   9252 String8 QCameraParameters::dump()
   9253 {
   9254     String8 str("\n");
   9255     char s[128];
   9256 
   9257     snprintf(s, 128, "Preview Pixel Fmt: %d\n", getPreviewHalPixelFormat());
   9258     str += s;
   9259 
   9260     snprintf(s, 128, "ZSL Burst Interval: %d\n", getZSLBurstInterval());
   9261     str += s;
   9262 
   9263     snprintf(s, 128, "ZSL Queue Depth: %d\n", getZSLQueueDepth());
   9264     str += s;
   9265 
   9266     snprintf(s, 128, "ZSL Back Look Count %d\n", getZSLBackLookCount());
   9267     str += s;
   9268 
   9269     snprintf(s, 128, "Max Unmatched Frames In Queue: %d\n",
   9270         getMaxUnmatchedFramesInQueue());
   9271     str += s;
   9272 
   9273     snprintf(s, 128, "Is ZSL Mode: %d\n", isZSLMode());
   9274     str += s;
   9275 
   9276     snprintf(s, 128, "Is No Display Mode: %d\n", isNoDisplayMode());
   9277     str += s;
   9278 
   9279     snprintf(s, 128, "Is WNR Enabled: %d\n", isWNREnabled());
   9280     str += s;
   9281 
   9282     snprintf(s, 128, "isHfrMode: %d\n", isHfrMode());
   9283     str += s;
   9284 
   9285     snprintf(s, 128, "getNumOfSnapshots: %d\n", getNumOfSnapshots());
   9286     str += s;
   9287 
   9288     snprintf(s, 128, "getNumOfExtraHDRInBufsIfNeeded: %d\n",
   9289         getNumOfExtraHDRInBufsIfNeeded());
   9290     str += s;
   9291 
   9292     snprintf(s, 128, "getNumOfExtraHDROutBufsIfNeeded: %d\n",
   9293         getNumOfExtraHDROutBufsIfNeeded());
   9294     str += s;
   9295 
   9296     snprintf(s, 128, "getBurstNum: %d\n", getBurstNum());
   9297     str += s;
   9298 
   9299     snprintf(s, 128, "getRecordingHintValue: %d\n", getRecordingHintValue());
   9300     str += s;
   9301 
   9302     snprintf(s, 128, "getJpegQuality: %d\n", getJpegQuality());
   9303     str += s;
   9304 
   9305     snprintf(s, 128, "getJpegRotation: %d\n", getJpegRotation());
   9306     str += s;
   9307 
   9308     snprintf(s, 128, "isHistogramEnabled: %d\n", isHistogramEnabled());
   9309     str += s;
   9310 
   9311     snprintf(s, 128, "isFaceDetectionEnabled: %d\n", isFaceDetectionEnabled());
   9312     str += s;
   9313 
   9314     snprintf(s, 128, "isHDREnabled: %d\n", isHDREnabled());
   9315     str += s;
   9316 
   9317     snprintf(s, 128, "isAutoHDREnabled: %d\n", isAutoHDREnabled());
   9318     str += s;
   9319 
   9320     snprintf(s, 128, "isAVTimerEnabled: %d\n", isAVTimerEnabled());
   9321     str += s;
   9322 
   9323     snprintf(s, 128, "getFocusMode: %d\n", getFocusMode());
   9324     str += s;
   9325 
   9326     snprintf(s, 128, "isJpegPictureFormat: %d\n", isJpegPictureFormat());
   9327     str += s;
   9328 
   9329     snprintf(s, 128, "isNV16PictureFormat: %d\n", isNV16PictureFormat());
   9330     str += s;
   9331 
   9332     snprintf(s, 128, "isNV21PictureFormat: %d\n", isNV21PictureFormat());
   9333     str += s;
   9334 
   9335     snprintf(s, 128, "isSnapshotFDNeeded: %d\n", isSnapshotFDNeeded());
   9336     str += s;
   9337 
   9338     snprintf(s, 128, "isHDR1xFrameEnabled: %d\n", isHDR1xFrameEnabled());
   9339     str += s;
   9340 
   9341     snprintf(s, 128, "isYUVFrameInfoNeeded: %d\n", isYUVFrameInfoNeeded());
   9342     str += s;
   9343 
   9344     snprintf(s, 128, "isHDR1xExtraBufferNeeded: %d\n",
   9345         isHDR1xExtraBufferNeeded());
   9346     str += s;
   9347 
   9348     snprintf(s, 128, "isHDROutputCropEnabled: %d\n", isHDROutputCropEnabled());
   9349     str += s;
   9350 
   9351     snprintf(s, 128, "isPreviewFlipChanged: %d\n", isPreviewFlipChanged());
   9352     str += s;
   9353 
   9354     snprintf(s, 128, "isVideoFlipChanged: %d\n", isVideoFlipChanged());
   9355     str += s;
   9356 
   9357     snprintf(s, 128, "isSnapshotFlipChanged: %d\n", isSnapshotFlipChanged());
   9358     str += s;
   9359 
   9360     snprintf(s, 128, "isHDRThumbnailProcessNeeded: %d\n",
   9361         isHDRThumbnailProcessNeeded());
   9362     str += s;
   9363 
   9364     snprintf(s, 128, "getAutoFlickerMode: %d\n", getAutoFlickerMode());
   9365     str += s;
   9366 
   9367     snprintf(s, 128, "getNumOfExtraBuffersForImageProc: %d\n",
   9368         getNumOfExtraBuffersForImageProc());
   9369     str += s;
   9370 
   9371     snprintf(s, 128, "isUbiFocusEnabled: %d\n", isUbiFocusEnabled());
   9372     str += s;
   9373 
   9374     snprintf(s, 128, "isChromaFlashEnabled: %d\n", isChromaFlashEnabled());
   9375     str += s;
   9376 
   9377     snprintf(s, 128, "isOptiZoomEnabled: %d\n", isOptiZoomEnabled());
   9378     str += s;
   9379 
   9380     snprintf(s, 128, "getBurstCountForAdvancedCapture: %d\n",
   9381         getBurstCountForAdvancedCapture());
   9382     str += s;
   9383 
   9384     return str;
   9385 }
   9386 }; // namespace qcamera
   9387