Home | History | Annotate | Download | only in HAL
      1 /* Copyright (c) 2012-2015, 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 <utils/Log.h>
     36 #include <string.h>
     37 #include <stdlib.h>
     38 #include <gralloc_priv.h>
     39 #include <sys/sysinfo.h>
     40 #include "QCamera2HWI.h"
     41 #include "QCameraParameters.h"
     42 
     43 #define ASPECT_TOLERANCE 0.001
     44 
     45 namespace qcamera {
     46 // Parameter keys to communicate between camera application and driver.
     47 const char QCameraParameters::KEY_QC_SUPPORTED_HFR_SIZES[] = "hfr-size-values";
     48 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_MODE[] = "preview-frame-rate-mode";
     49 const char QCameraParameters::KEY_QC_SUPPORTED_PREVIEW_FRAME_RATE_MODES[] = "preview-frame-rate-modes";
     50 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_AUTO_MODE[] = "frame-rate-auto";
     51 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_FIXED_MODE[] = "frame-rate-fixed";
     52 const char QCameraParameters::KEY_QC_TOUCH_AF_AEC[] = "touch-af-aec";
     53 const char QCameraParameters::KEY_QC_SUPPORTED_TOUCH_AF_AEC[] = "touch-af-aec-values";
     54 const char QCameraParameters::KEY_QC_TOUCH_INDEX_AEC[] = "touch-index-aec";
     55 const char QCameraParameters::KEY_QC_TOUCH_INDEX_AF[] = "touch-index-af";
     56 const char QCameraParameters::KEY_QC_SCENE_DETECT[] = "scene-detect";
     57 const char QCameraParameters::KEY_QC_SUPPORTED_SCENE_DETECT[] = "scene-detect-values";
     58 const char QCameraParameters::KEY_QC_ISO_MODE[] = "iso";
     59 const char QCameraParameters::KEY_QC_CONTINUOUS_ISO[] = "continuous-iso";
     60 const char QCameraParameters::KEY_QC_MIN_ISO[] = "min-iso";
     61 const char QCameraParameters::KEY_QC_MAX_ISO[] = "max-iso";
     62 const char QCameraParameters::KEY_QC_SUPPORTED_ISO_MODES[] = "iso-values";
     63 const char QCameraParameters::KEY_QC_EXPOSURE_TIME[] = "exposure-time";
     64 const char QCameraParameters::KEY_QC_MIN_EXPOSURE_TIME[] = "min-exposure-time";
     65 const char QCameraParameters::KEY_QC_MAX_EXPOSURE_TIME[] = "max-exposure-time";
     66 const char QCameraParameters::KEY_QC_CURRENT_EXPOSURE_TIME[] = "cur-exposure-time";
     67 const char QCameraParameters::KEY_QC_CURRENT_ISO[] = "cur-iso";
     68 const char QCameraParameters::KEY_QC_LENSSHADE[] = "lensshade";
     69 const char QCameraParameters::KEY_QC_SUPPORTED_LENSSHADE_MODES[] = "lensshade-values";
     70 const char QCameraParameters::KEY_QC_AUTO_EXPOSURE[] = "auto-exposure";
     71 const char QCameraParameters::KEY_QC_SUPPORTED_AUTO_EXPOSURE[] = "auto-exposure-values";
     72 const char QCameraParameters::KEY_QC_DENOISE[] = "denoise";
     73 const char QCameraParameters::KEY_QC_SUPPORTED_DENOISE[] = "denoise-values";
     74 const char QCameraParameters::KEY_QC_FOCUS_ALGO[] = "selectable-zone-af";
     75 const char QCameraParameters::KEY_QC_SUPPORTED_FOCUS_ALGOS[] = "selectable-zone-af-values";
     76 const char QCameraParameters::KEY_QC_MANUAL_FOCUS_POSITION[] = "manual-focus-position";
     77 const char QCameraParameters::KEY_QC_MANUAL_FOCUS_POS_TYPE[] = "manual-focus-pos-type";
     78 const char QCameraParameters::KEY_QC_MIN_FOCUS_POS_INDEX[] = "min-focus-pos-index";
     79 const char QCameraParameters::KEY_QC_MAX_FOCUS_POS_INDEX[] = "max-focus-pos-index";
     80 const char QCameraParameters::KEY_QC_MIN_FOCUS_POS_DAC[] = "min-focus-pos-dac";
     81 const char QCameraParameters::KEY_QC_MAX_FOCUS_POS_DAC[] = "max-focus-pos-dac";
     82 const char QCameraParameters::KEY_QC_MIN_FOCUS_POS_RATIO[] = "min-focus-pos-ratio";
     83 const char QCameraParameters::KEY_QC_MAX_FOCUS_POS_RATIO[] = "max-focus-pos-ratio";
     84 const char QCameraParameters::KEY_QC_FOCUS_POSITION_SCALE[] = "cur-focus-scale";
     85 const char QCameraParameters::KEY_QC_MIN_FOCUS_POS_DIOPTER[] = "min-focus-pos-diopter";
     86 const char QCameraParameters::KEY_QC_MAX_FOCUS_POS_DIOPTER[] = "max-focus-pos-diopter";
     87 const char QCameraParameters::KEY_QC_FOCUS_POSITION_DIOPTER[] = "cur-focus-diopter";
     88 const char QCameraParameters::KEY_QC_FACE_DETECTION[] = "face-detection";
     89 const char QCameraParameters::KEY_QC_SUPPORTED_FACE_DETECTION[] = "face-detection-values";
     90 const char QCameraParameters::KEY_QC_FACE_RECOGNITION[] = "face-recognition";
     91 const char QCameraParameters::KEY_QC_SUPPORTED_FACE_RECOGNITION[] = "face-recognition-values";
     92 const char QCameraParameters::KEY_QC_MEMORY_COLOR_ENHANCEMENT[] = "mce";
     93 const char QCameraParameters::KEY_QC_SUPPORTED_MEM_COLOR_ENHANCE_MODES[] = "mce-values";
     94 const char QCameraParameters::KEY_QC_DIS[] = "dis";
     95 const char QCameraParameters::KEY_QC_OIS[] = "ois";
     96 const char QCameraParameters::KEY_QC_SUPPORTED_DIS_MODES[] = "dis-values";
     97 const char QCameraParameters::KEY_QC_SUPPORTED_OIS_MODES[] = "ois-values";
     98 const char QCameraParameters::KEY_QC_VIDEO_HIGH_FRAME_RATE[] = "video-hfr";
     99 const char QCameraParameters::KEY_QC_VIDEO_HIGH_SPEED_RECORDING[] = "video-hsr";
    100 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_HIGH_FRAME_RATE_MODES[] = "video-hfr-values";
    101 const char QCameraParameters::KEY_QC_REDEYE_REDUCTION[] = "redeye-reduction";
    102 const char QCameraParameters::KEY_QC_SUPPORTED_REDEYE_REDUCTION[] = "redeye-reduction-values";
    103 const char QCameraParameters::KEY_QC_HIGH_DYNAMIC_RANGE_IMAGING[] = "hdr";
    104 const char QCameraParameters::KEY_QC_SUPPORTED_HDR_IMAGING_MODES[] = "hdr-values";
    105 const char QCameraParameters::KEY_QC_ZSL[] = "zsl";
    106 const char QCameraParameters::KEY_QC_SUPPORTED_ZSL_MODES[] = "zsl-values";
    107 const char QCameraParameters::KEY_QC_ZSL_BURST_INTERVAL[] = "capture-burst-interval";
    108 const char QCameraParameters::KEY_QC_ZSL_BURST_LOOKBACK[] = "capture-burst-retroactive";
    109 const char QCameraParameters::KEY_QC_ZSL_QUEUE_DEPTH[] = "capture-burst-queue-depth";
    110 const char QCameraParameters::KEY_QC_CAMERA_MODE[] = "camera-mode";
    111 const char QCameraParameters::KEY_QC_AE_BRACKET_HDR[] = "ae-bracket-hdr";
    112 const char QCameraParameters::KEY_QC_SUPPORTED_AE_BRACKET_MODES[] = "ae-bracket-hdr-values";
    113 const char QCameraParameters::KEY_QC_SUPPORTED_RAW_FORMATS[] = "raw-format-values";
    114 const char QCameraParameters::KEY_QC_RAW_FORMAT[] = "raw-format";
    115 const char QCameraParameters::KEY_QC_ORIENTATION[] = "orientation";
    116 const char QCameraParameters::KEY_QC_SELECTABLE_ZONE_AF[] = "selectable-zone-af";
    117 const char QCameraParameters::KEY_QC_CAPTURE_BURST_EXPOSURE[] = "capture-burst-exposures";
    118 const char QCameraParameters::KEY_QC_NUM_SNAPSHOT_PER_SHUTTER[] = "num-snaps-per-shutter";
    119 const char QCameraParameters::KEY_QC_NUM_RETRO_BURST_PER_SHUTTER[] = "num-retro-burst-per-shutter";
    120 const char QCameraParameters::KEY_QC_SNAPSHOT_BURST_LED_ON_PERIOD[] = "zsl-burst-led-on-period";
    121 const char QCameraParameters::KEY_QC_NO_DISPLAY_MODE[] = "no-display-mode";
    122 const char QCameraParameters::KEY_QC_RAW_PICUTRE_SIZE[] = "raw-size";
    123 const char QCameraParameters::KEY_QC_SUPPORTED_SKIN_TONE_ENHANCEMENT_MODES[] = "skinToneEnhancement-values";
    124 const char QCameraParameters::KEY_QC_SUPPORTED_LIVESNAPSHOT_SIZES[] = "supported-live-snapshot-sizes";
    125 const char QCameraParameters::KEY_QC_SUPPORTED_HDR_NEED_1X[] = "hdr-need-1x-values";
    126 const char QCameraParameters::KEY_QC_HDR_NEED_1X[] = "hdr-need-1x";
    127 const char QCameraParameters::KEY_QC_PREVIEW_FLIP[] = "preview-flip";
    128 const char QCameraParameters::KEY_QC_VIDEO_FLIP[] = "video-flip";
    129 const char QCameraParameters::KEY_QC_SNAPSHOT_PICTURE_FLIP[] = "snapshot-picture-flip";
    130 const char QCameraParameters::KEY_QC_SUPPORTED_FLIP_MODES[] = "flip-mode-values";
    131 const char QCameraParameters::KEY_QC_VIDEO_HDR[] = "video-hdr";
    132 const char QCameraParameters::KEY_QC_SENSOR_HDR[] = "sensor-hdr";
    133 const char QCameraParameters::KEY_QC_VT_ENABLE[] = "avtimer";
    134 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_HDR_MODES[] = "video-hdr-values";
    135 const char QCameraParameters::KEY_QC_SUPPORTED_SENSOR_HDR_MODES[] = "sensor-hdr-values";
    136 const char QCameraParameters::KEY_QC_AUTO_HDR_ENABLE [] = "auto-hdr-enable";
    137 const char QCameraParameters::KEY_QC_SNAPSHOT_BURST_NUM[] = "snapshot-burst-num";
    138 const char QCameraParameters::KEY_QC_SNAPSHOT_FD_DATA[] = "snapshot-fd-data-enable";
    139 const char QCameraParameters::KEY_QC_TINTLESS_ENABLE[] = "tintless";
    140 const char QCameraParameters::KEY_QC_SCENE_SELECTION[] = "scene-selection";
    141 const char QCameraParameters::KEY_QC_CDS_MODE[] = "cds-mode";
    142 const char QCameraParameters::KEY_QC_VIDEO_CDS_MODE[] = "video-cds-mode";
    143 const char QCameraParameters::KEY_QC_SUPPORTED_CDS_MODES[] = "cds-mode-values";
    144 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_CDS_MODES[] = "video-cds-mode-values";
    145 const char QCameraParameters::KEY_QC_TNR_MODE[] = "tnr-mode";
    146 const char QCameraParameters::KEY_QC_VIDEO_TNR_MODE[] = "video-tnr-mode";
    147 const char QCameraParameters::KEY_QC_SUPPORTED_TNR_MODES[] = "tnr-mode-values";
    148 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_TNR_MODES[] = "video-tnr-mode-values";
    149 const char QCameraParameters::KEY_QC_VIDEO_ROTATION[] = "video-rotation";
    150 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_ROTATION_VALUES[] = "video-rotation-values";
    151 const char QCameraParameters::KEY_QC_AF_BRACKET[] = "af-bracket";
    152 const char QCameraParameters::KEY_QC_SUPPORTED_AF_BRACKET_MODES[] = "af-bracket-values";
    153 const char QCameraParameters::KEY_QC_RE_FOCUS[] = "re-focus";
    154 const char QCameraParameters::KEY_QC_SUPPORTED_RE_FOCUS_MODES[] = "re-focus-values";
    155 const char QCameraParameters::KEY_QC_CHROMA_FLASH[] = "chroma-flash";
    156 const char QCameraParameters::KEY_QC_SUPPORTED_CHROMA_FLASH_MODES[] = "chroma-flash-values";
    157 const char QCameraParameters::KEY_QC_OPTI_ZOOM[] = "opti-zoom";
    158 const char QCameraParameters::KEY_QC_SEE_MORE[] = "see-more";
    159 const char QCameraParameters::KEY_QC_STILL_MORE[] = "still-more";
    160 const char QCameraParameters::KEY_QC_SUPPORTED_OPTI_ZOOM_MODES[] = "opti-zoom-values";
    161 const char QCameraParameters::KEY_QC_HDR_MODE[] = "hdr-mode";
    162 const char QCameraParameters::KEY_QC_SUPPORTED_KEY_QC_HDR_MODES[] = "hdr-mode-values";
    163 const char QCameraParameters::KEY_QC_TRUE_PORTRAIT[] = "true-portrait";
    164 const char QCameraParameters::KEY_QC_SUPPORTED_TRUE_PORTRAIT_MODES[] = "true-portrait-values";
    165 const char QCameraParameters::KEY_QC_SUPPORTED_SEE_MORE_MODES[] = "see-more-values";
    166 const char QCameraParameters::KEY_QC_SUPPORTED_STILL_MORE_MODES[] = "still-more-values";
    167 const char QCameraParameters::KEY_INTERNAL_PERVIEW_RESTART[] = "internal-restart";
    168 const char QCameraParameters::KEY_QC_RDI_MODE[] = "rdi-mode";
    169 const char QCameraParameters::KEY_QC_SUPPORTED_RDI_MODES[] = "rdi-mode-values";
    170 const char QCameraParameters::KEY_QC_SECURE_MODE[] = "secure-mode";
    171 const char QCameraParameters::KEY_QC_SUPPORTED_SECURE_MODES[] = "secure-mode-values";
    172 const char QCameraParameters::ISO_HJR[] = "ISO_HJR";
    173 const char QCameraParameters::KEY_QC_AUTO_HDR_SUPPORTED[] = "auto-hdr-supported";
    174 const char QCameraParameters::KEY_QC_LONGSHOT_SUPPORTED[] = "longshot-supported";
    175 const char QCameraParameters::KEY_QC_ZSL_HDR_SUPPORTED[] = "zsl-hdr-supported";
    176 const char QCameraParameters::KEY_QC_WB_MANUAL_CCT[] = "wb-manual-cct";
    177 const char QCameraParameters::KEY_QC_MIN_WB_CCT[] = "min-wb-cct";
    178 const char QCameraParameters::KEY_QC_MAX_WB_CCT[] = "max-wb-cct";
    179 
    180 const char QCameraParameters::KEY_QC_MANUAL_WB_GAINS[] = "manual-wb-gains";
    181 const char QCameraParameters::KEY_QC_MIN_WB_GAIN[] = "min-wb-gain";
    182 const char QCameraParameters::KEY_QC_MAX_WB_GAIN[] = "max-wb-gain";
    183 
    184 const char QCameraParameters::KEY_QC_MANUAL_WB_TYPE[] = "manual-wb-type";
    185 const char QCameraParameters::KEY_QC_MANUAL_WB_VALUE[] = "manual-wb-value";
    186 
    187 const char QCameraParameters::WHITE_BALANCE_MANUAL[] = "manual";
    188 const char QCameraParameters::FOCUS_MODE_MANUAL_POSITION[] = "manual";
    189 
    190 
    191 // Values for effect settings.
    192 const char QCameraParameters::EFFECT_EMBOSS[] = "emboss";
    193 const char QCameraParameters::EFFECT_SKETCH[] = "sketch";
    194 const char QCameraParameters::EFFECT_NEON[] = "neon";
    195 
    196 // Values for auto exposure settings.
    197 const char QCameraParameters::TOUCH_AF_AEC_OFF[] = "touch-off";
    198 const char QCameraParameters::TOUCH_AF_AEC_ON[] = "touch-on";
    199 
    200 // Values for scene mode settings.
    201 const char QCameraParameters::SCENE_MODE_ASD[] = "asd";   // corresponds to CAMERA_BESTSHOT_AUTO in HAL
    202 const char QCameraParameters::SCENE_MODE_BACKLIGHT[] = "backlight";
    203 const char QCameraParameters::SCENE_MODE_FLOWERS[] = "flowers";
    204 const char QCameraParameters::SCENE_MODE_AR[] = "AR";
    205 const char QCameraParameters::SCENE_MODE_HDR[] = "hdr";
    206 
    207 // Formats for setPreviewFormat and setPictureFormat.
    208 const char QCameraParameters::PIXEL_FORMAT_YUV420SP_ADRENO[] = "yuv420sp-adreno";
    209 const char QCameraParameters::PIXEL_FORMAT_YV12[] = "yuv420p";
    210 const char QCameraParameters::PIXEL_FORMAT_NV12[] = "nv12";
    211 const char QCameraParameters::QC_PIXEL_FORMAT_NV12_VENUS[] = "nv12-venus";
    212 
    213 // Values for raw image formats
    214 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_YUYV[] = "yuv-raw8-yuyv";
    215 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_YVYU[] = "yuv-raw8-yvyu";
    216 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_UYVY[] = "yuv-raw8-uyvy";
    217 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_VYUY[] = "yuv-raw8-vyuy";
    218 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GBRG[] = "bayer-qcom-8gbrg";
    219 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GRBG[] = "bayer-qcom-8grbg";
    220 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8RGGB[] = "bayer-qcom-8rggb";
    221 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8BGGR[] = "bayer-qcom-8bggr";
    222 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GBRG[] = "bayer-qcom-10gbrg";
    223 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GRBG[] = "bayer-qcom-10grbg";
    224 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10RGGB[] = "bayer-qcom-10rggb";
    225 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10BGGR[] = "bayer-qcom-10bggr";
    226 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GBRG[] = "bayer-qcom-12gbrg";
    227 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GRBG[] = "bayer-qcom-12grbg";
    228 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12RGGB[] = "bayer-qcom-12rggb";
    229 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12BGGR[] = "bayer-qcom-12bggr";
    230 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GBRG[] = "bayer-mipi-8gbrg";
    231 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GRBG[] = "bayer-mipi-8grbg";
    232 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8RGGB[] = "bayer-mipi-8rggb";
    233 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8BGGR[] = "bayer-mipi-8bggr";
    234 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GBRG[] = "bayer-mipi-10gbrg";
    235 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GRBG[] = "bayer-mipi-10grbg";
    236 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10RGGB[] = "bayer-mipi-10rggb";
    237 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10BGGR[] = "bayer-mipi-10bggr";
    238 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GBRG[] = "bayer-mipi-12gbrg";
    239 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GRBG[] = "bayer-mipi-12grbg";
    240 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12RGGB[] = "bayer-mipi-12rggb";
    241 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12BGGR[] = "bayer-mipi-12bggr";
    242 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GBRG[] = "bayer-ideal-qcom-8gbrg";
    243 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GRBG[] = "bayer-ideal-qcom-8grbg";
    244 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8RGGB[] = "bayer-ideal-qcom-8rggb";
    245 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8BGGR[] = "bayer-ideal-qcom-8bggr";
    246 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GBRG[] = "bayer-ideal-qcom-10gbrg";
    247 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GRBG[] = "bayer-ideal-qcom-10grbg";
    248 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10RGGB[] = "bayer-ideal-qcom-10rggb";
    249 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10BGGR[] = "bayer-ideal-qcom-10bggr";
    250 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GBRG[] = "bayer-ideal-qcom-12gbrg";
    251 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GRBG[] = "bayer-ideal-qcom-12grbg";
    252 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12RGGB[] = "bayer-ideal-qcom-12rggb";
    253 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12BGGR[] = "bayer-ideal-qcom-12bggr";
    254 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GBRG[] = "bayer-ideal-mipi-8gbrg";
    255 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GRBG[] = "bayer-ideal-mipi-8grbg";
    256 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8RGGB[] = "bayer-ideal-mipi-8rggb";
    257 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8BGGR[] = "bayer-ideal-mipi-8bggr";
    258 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GBRG[] = "bayer-ideal-mipi-10gbrg";
    259 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GRBG[] = "bayer-ideal-mipi-10grbg";
    260 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10RGGB[] = "bayer-ideal-mipi-10rggb";
    261 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10BGGR[] = "bayer-ideal-mipi-10bggr";
    262 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GBRG[] = "bayer-ideal-mipi-12gbrg";
    263 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GRBG[] = "bayer-ideal-mipi-12grbg";
    264 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12RGGB[] = "bayer-ideal-mipi-12rggb";
    265 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12BGGR[] = "bayer-ideal-mipi-12bggr";
    266 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GBRG[] = "bayer-ideal-plain8-8gbrg";
    267 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GRBG[] = "bayer-ideal-plain8-8grbg";
    268 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8RGGB[] = "bayer-ideal-plain8-8rggb";
    269 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8BGGR[] = "bayer-ideal-plain8-8bggr";
    270 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GBRG[] = "bayer-ideal-plain16-8gbrg";
    271 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GRBG[] = "bayer-ideal-plain16-8grbg";
    272 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8RGGB[] = "bayer-ideal-plain16-8rggb";
    273 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8BGGR[] = "bayer-ideal-plain16-8bggr";
    274 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GBRG[] = "bayer-ideal-plain16-10gbrg";
    275 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GRBG[] = "bayer-ideal-plain16-10grbg";
    276 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10RGGB[] = "bayer-ideal-plain16-10rggb";
    277 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10BGGR[] = "bayer-ideal-plain16-10bggr";
    278 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GBRG[] = "bayer-ideal-plain16-12gbrg";
    279 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GRBG[] = "bayer-ideal-plain16-12grbg";
    280 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12RGGB[] = "bayer-ideal-plain16-12rggb";
    281 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12BGGR[] = "bayer-ideal-plain16-12bggr";
    282 
    283 // Values for ISO Settings
    284 const char QCameraParameters::ISO_AUTO[] = "auto";
    285 const char QCameraParameters::ISO_100[] = "ISO100";
    286 const char QCameraParameters::ISO_200[] = "ISO200";
    287 const char QCameraParameters::ISO_400[] = "ISO400";
    288 const char QCameraParameters::ISO_800[] = "ISO800";
    289 const char QCameraParameters::ISO_1600[] = "ISO1600";
    290 const char QCameraParameters::ISO_3200[] = "ISO3200";
    291 const char QCameraParameters::ISO_MANUAL[] = "manual";
    292 
    293 
    294 // Values for auto exposure settings.
    295 const char QCameraParameters::AUTO_EXPOSURE_FRAME_AVG[] = "frame-average";
    296 const char QCameraParameters::AUTO_EXPOSURE_CENTER_WEIGHTED[] = "center-weighted";
    297 const char QCameraParameters::AUTO_EXPOSURE_SPOT_METERING[] = "spot-metering";
    298 const char QCameraParameters::AUTO_EXPOSURE_SMART_METERING[] = "smart-metering";
    299 const char QCameraParameters::AUTO_EXPOSURE_USER_METERING[] = "user-metering";
    300 const char QCameraParameters::AUTO_EXPOSURE_SPOT_METERING_ADV[] = "spot-metering-adv";
    301 const char QCameraParameters::AUTO_EXPOSURE_CENTER_WEIGHTED_ADV[] = "center-weighted-adv";
    302 
    303 const char QCameraParameters::KEY_QC_GPS_LATITUDE_REF[] = "gps-latitude-ref";
    304 const char QCameraParameters::KEY_QC_GPS_LONGITUDE_REF[] = "gps-longitude-ref";
    305 const char QCameraParameters::KEY_QC_GPS_ALTITUDE_REF[] = "gps-altitude-ref";
    306 const char QCameraParameters::KEY_QC_GPS_STATUS[] = "gps-status";
    307 
    308 const char QCameraParameters::KEY_QC_HISTOGRAM[] = "histogram";
    309 const char QCameraParameters::KEY_QC_SUPPORTED_HISTOGRAM_MODES[] = "histogram-values";
    310 
    311 const char QCameraParameters::VALUE_ENABLE[] = "enable";
    312 const char QCameraParameters::VALUE_DISABLE[] = "disable";
    313 const char QCameraParameters::VALUE_OFF[] = "off";
    314 const char QCameraParameters::VALUE_ON[] = "on";
    315 const char QCameraParameters::VALUE_TRUE[] = "true";
    316 const char QCameraParameters::VALUE_FALSE[] = "false";
    317 
    318 const char QCameraParameters::KEY_QC_SHARPNESS[] = "sharpness";
    319 const char QCameraParameters::KEY_QC_MIN_SHARPNESS[] = "min-sharpness";
    320 const char QCameraParameters::KEY_QC_MAX_SHARPNESS[] = "max-sharpness";
    321 const char QCameraParameters::KEY_QC_SHARPNESS_STEP[] = "sharpness-step";
    322 const char QCameraParameters::KEY_QC_CONTRAST[] = "contrast";
    323 const char QCameraParameters::KEY_QC_MIN_CONTRAST[] = "min-contrast";
    324 const char QCameraParameters::KEY_QC_MAX_CONTRAST[] = "max-contrast";
    325 const char QCameraParameters::KEY_QC_CONTRAST_STEP[] = "contrast-step";
    326 const char QCameraParameters::KEY_QC_SATURATION[] = "saturation";
    327 const char QCameraParameters::KEY_QC_MIN_SATURATION[] = "min-saturation";
    328 const char QCameraParameters::KEY_QC_MAX_SATURATION[] = "max-saturation";
    329 const char QCameraParameters::KEY_QC_SATURATION_STEP[] = "saturation-step";
    330 const char QCameraParameters::KEY_QC_BRIGHTNESS[] = "luma-adaptation";
    331 const char QCameraParameters::KEY_QC_MIN_BRIGHTNESS[] = "min-brightness";
    332 const char QCameraParameters::KEY_QC_MAX_BRIGHTNESS[] = "max-brightness";
    333 const char QCameraParameters::KEY_QC_BRIGHTNESS_STEP[] = "brightness-step";
    334 const char QCameraParameters::KEY_QC_SCE_FACTOR[] = "skinToneEnhancement";
    335 const char QCameraParameters::KEY_QC_MIN_SCE_FACTOR[] = "min-sce-factor";
    336 const char QCameraParameters::KEY_QC_MAX_SCE_FACTOR[] = "max-sce-factor";
    337 const char QCameraParameters::KEY_QC_SCE_FACTOR_STEP[] = "sce-factor-step";
    338 
    339 const char QCameraParameters::KEY_QC_SUPPORTED_CAMERA_FEATURES[] = "qc-camera-features";
    340 const char QCameraParameters::KEY_QC_MAX_NUM_REQUESTED_FACES[] = "qc-max-num-requested-faces";
    341 
    342 //Values for DENOISE
    343 const char QCameraParameters::DENOISE_OFF[] = "denoise-off";
    344 const char QCameraParameters::DENOISE_ON[] = "denoise-on";
    345 
    346 // Values for selectable zone af Settings
    347 const char QCameraParameters::FOCUS_ALGO_AUTO[] = "auto";
    348 const char QCameraParameters::FOCUS_ALGO_SPOT_METERING[] = "spot-metering";
    349 const char QCameraParameters::FOCUS_ALGO_CENTER_WEIGHTED[] = "center-weighted";
    350 const char QCameraParameters::FOCUS_ALGO_FRAME_AVERAGE[] = "frame-average";
    351 
    352 // Values for HFR settings.
    353 const char QCameraParameters::VIDEO_HFR_OFF[] = "off";
    354 const char QCameraParameters::VIDEO_HFR_2X[] = "60";
    355 const char QCameraParameters::VIDEO_HFR_3X[] = "90";
    356 const char QCameraParameters::VIDEO_HFR_4X[] = "120";
    357 const char QCameraParameters::VIDEO_HFR_5X[] = "150";
    358 const char QCameraParameters::VIDEO_HFR_6X[] = "180";
    359 const char QCameraParameters::VIDEO_HFR_7X[] = "210";
    360 const char QCameraParameters::VIDEO_HFR_8X[] = "240";
    361 const char QCameraParameters::VIDEO_HFR_9X[] = "480";
    362 
    363 // Values for HDR Bracketing settings.
    364 const char QCameraParameters::AE_BRACKET_OFF[] = "Off";
    365 const char QCameraParameters::AE_BRACKET[] = "AE-Bracket";
    366 
    367 // Values for AF Bracketing setting.
    368 const char QCameraParameters::AF_BRACKET_OFF[] = "af-bracket-off";
    369 const char QCameraParameters::AF_BRACKET_ON[] = "af-bracket-on";
    370 
    371 // Values for Refocus setting.
    372 const char QCameraParameters::RE_FOCUS_OFF[] = "re-focus-off";
    373 const char QCameraParameters::RE_FOCUS_ON[] = "re-focus-on";
    374 
    375 // Values for Chroma Flash setting.
    376 const char QCameraParameters::CHROMA_FLASH_OFF[] = "chroma-flash-off";
    377 const char QCameraParameters::CHROMA_FLASH_ON[] = "chroma-flash-on";
    378 
    379 // Values for Opti Zoom setting.
    380 const char QCameraParameters::OPTI_ZOOM_OFF[] = "opti-zoom-off";
    381 const char QCameraParameters::OPTI_ZOOM_ON[] = "opti-zoom-on";
    382 
    383 // Values for Still More setting.
    384 const char QCameraParameters::STILL_MORE_OFF[] = "still-more-off";
    385 const char QCameraParameters::STILL_MORE_ON[] = "still-more-on";
    386 
    387 // Values for HDR mode setting.
    388 const char QCameraParameters::HDR_MODE_SENSOR[] = "hdr-mode-sensor";
    389 const char QCameraParameters::HDR_MODE_MULTI_FRAME[] = "hdr-mode-multiframe";
    390 
    391 // Values for True Portrait setting.
    392 const char QCameraParameters::TRUE_PORTRAIT_OFF[] = "true-portrait-off";
    393 const char QCameraParameters::TRUE_PORTRAIT_ON[] = "true-portrait-on";
    394 
    395 // Values for FLIP settings.
    396 const char QCameraParameters::FLIP_MODE_OFF[] = "off";
    397 const char QCameraParameters::FLIP_MODE_V[] = "flip-v";
    398 const char QCameraParameters::FLIP_MODE_H[] = "flip-h";
    399 const char QCameraParameters::FLIP_MODE_VH[] = "flip-vh";
    400 
    401 const char QCameraParameters::CDS_MODE_OFF[] = "off";
    402 const char QCameraParameters::CDS_MODE_ON[] = "on";
    403 const char QCameraParameters::CDS_MODE_AUTO[] = "auto";
    404 
    405 const char QCameraParameters::KEY_SELECTED_AUTO_SCENE[] = "selected-auto-scene";
    406 
    407 // Values for video rotation settings.
    408 const char QCameraParameters::VIDEO_ROTATION_0[] = "0";
    409 const char QCameraParameters::VIDEO_ROTATION_90[] = "90";
    410 const char QCameraParameters::VIDEO_ROTATION_180[] = "180";
    411 const char QCameraParameters::VIDEO_ROTATION_270[] = "270";
    412 
    413 const char QCameraParameters::KEY_QC_SUPPORTED_MANUAL_FOCUS_MODES[] = "manual-focus-modes";
    414 const char QCameraParameters::KEY_QC_SUPPORTED_MANUAL_EXPOSURE_MODES[] = "manual-exposure-modes";
    415 const char QCameraParameters::KEY_QC_SUPPORTED_MANUAL_WB_MODES[] = "manual-wb-modes";
    416 const char QCameraParameters::KEY_QC_FOCUS_SCALE_MODE[] = "scale-mode";
    417 const char QCameraParameters::KEY_QC_FOCUS_DIOPTER_MODE[] = "diopter-mode";
    418 const char QCameraParameters::KEY_QC_ISO_PRIORITY[] = "iso-priority";
    419 const char QCameraParameters::KEY_QC_EXP_TIME_PRIORITY[] = "exp-time-priority";
    420 const char QCameraParameters::KEY_QC_USER_SETTING[] = "user-setting";
    421 const char QCameraParameters::KEY_QC_WB_CCT_MODE[] = "color-temperature";
    422 const char QCameraParameters::KEY_QC_WB_GAIN_MODE[] = "rbgb-gains";
    423 
    424 static const char* portrait = "portrait";
    425 static const char* landscape = "landscape";
    426 
    427 const cam_dimension_t QCameraParameters::THUMBNAIL_SIZES_MAP[] = {
    428     { 512, 288 }, //1.777778
    429     { 480, 288 }, //1.666667
    430     { 256, 154 }, //1.66233
    431     { 432, 288 }, //1.5
    432     { 320, 320 }, //1.0
    433     { 320, 240 }, //1.33333
    434     { 176, 144 }, //1.222222
    435     { 0, 0 }      // required by Android SDK
    436 };
    437 
    438 const QCameraParameters::QCameraMap<cam_auto_exposure_mode_type>
    439         QCameraParameters::AUTO_EXPOSURE_MAP[] = {
    440     { AUTO_EXPOSURE_FRAME_AVG,           CAM_AEC_MODE_FRAME_AVERAGE },
    441     { AUTO_EXPOSURE_CENTER_WEIGHTED,     CAM_AEC_MODE_CENTER_WEIGHTED },
    442     { AUTO_EXPOSURE_SPOT_METERING,       CAM_AEC_MODE_SPOT_METERING },
    443     { AUTO_EXPOSURE_SMART_METERING,      CAM_AEC_MODE_SMART_METERING },
    444     { AUTO_EXPOSURE_USER_METERING,       CAM_AEC_MODE_USER_METERING },
    445     { AUTO_EXPOSURE_SPOT_METERING_ADV,   CAM_AEC_MODE_SPOT_METERING_ADV },
    446     { AUTO_EXPOSURE_CENTER_WEIGHTED_ADV, CAM_AEC_MODE_CENTER_WEIGHTED_ADV },
    447 };
    448 
    449 const QCameraParameters::QCameraMap<cam_format_t>
    450         QCameraParameters::PREVIEW_FORMATS_MAP[] = {
    451     {PIXEL_FORMAT_YUV420SP,        CAM_FORMAT_YUV_420_NV21},
    452     {PIXEL_FORMAT_YUV420P,         CAM_FORMAT_YUV_420_YV12},
    453     {PIXEL_FORMAT_YUV420SP_ADRENO, CAM_FORMAT_YUV_420_NV21_ADRENO},
    454     {PIXEL_FORMAT_YV12,            CAM_FORMAT_YUV_420_YV12},
    455     {PIXEL_FORMAT_NV12,            CAM_FORMAT_YUV_420_NV12},
    456     {QC_PIXEL_FORMAT_NV12_VENUS,   CAM_FORMAT_YUV_420_NV12_VENUS}
    457 };
    458 
    459 const QCameraParameters::QCameraMap<cam_format_t>
    460         QCameraParameters::PICTURE_TYPES_MAP[] = {
    461     {PIXEL_FORMAT_JPEG,                          CAM_FORMAT_JPEG},
    462     {PIXEL_FORMAT_YUV420SP,                      CAM_FORMAT_YUV_420_NV21},
    463     {PIXEL_FORMAT_YUV422SP,                      CAM_FORMAT_YUV_422_NV16},
    464     {QC_PIXEL_FORMAT_YUV_RAW_8BIT_YUYV,          CAM_FORMAT_YUV_RAW_8BIT_YUYV},
    465     {QC_PIXEL_FORMAT_YUV_RAW_8BIT_YVYU,          CAM_FORMAT_YUV_RAW_8BIT_YVYU},
    466     {QC_PIXEL_FORMAT_YUV_RAW_8BIT_UYVY,          CAM_FORMAT_YUV_RAW_8BIT_UYVY},
    467     {QC_PIXEL_FORMAT_YUV_RAW_8BIT_VYUY,          CAM_FORMAT_YUV_RAW_8BIT_VYUY},
    468     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GBRG,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_GBRG},
    469     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GRBG,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_GRBG},
    470     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8RGGB,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_RGGB},
    471     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8BGGR,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_BGGR},
    472     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GBRG,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GBRG},
    473     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GRBG,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GRBG},
    474     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10RGGB,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_RGGB},
    475     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10BGGR,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_BGGR},
    476     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GBRG,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_GBRG},
    477     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GRBG,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_GRBG},
    478     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12RGGB,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_RGGB},
    479     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12BGGR,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_BGGR},
    480     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GBRG,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_GBRG},
    481     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GRBG,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_GRBG},
    482     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8RGGB,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_RGGB},
    483     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8BGGR,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_BGGR},
    484     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GBRG,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG},
    485     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GRBG,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GRBG},
    486     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10RGGB,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_RGGB},
    487     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10BGGR,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_BGGR},
    488     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GBRG,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_GBRG},
    489     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GRBG,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_GRBG},
    490     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12RGGB,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_RGGB},
    491     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12BGGR,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_BGGR},
    492     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GBRG,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_GBRG},
    493     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GRBG,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_GRBG},
    494     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8RGGB,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_RGGB},
    495     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8BGGR,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_BGGR},
    496     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_GBRG},
    497     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_GRBG},
    498     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_RGGB},
    499     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_BGGR},
    500     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_GBRG},
    501     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_GRBG},
    502     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_RGGB},
    503     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_BGGR},
    504     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GBRG,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_GBRG},
    505     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GRBG,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_GRBG},
    506     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8RGGB,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_RGGB},
    507     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8BGGR,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_BGGR},
    508     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_GBRG},
    509     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_GRBG},
    510     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_RGGB},
    511     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_BGGR},
    512     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_GBRG},
    513     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_GRBG},
    514     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_RGGB},
    515     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_BGGR},
    516     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GBRG,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_GBRG},
    517     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GRBG,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_GRBG},
    518     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8RGGB,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_RGGB},
    519     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8BGGR,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_BGGR},
    520     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GBRG,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_GBRG},
    521     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GRBG,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_GRBG},
    522     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8RGGB,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_RGGB},
    523     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8BGGR,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_BGGR},
    524     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_GBRG},
    525     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_GRBG},
    526     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_RGGB},
    527     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_BGGR},
    528     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_GBRG},
    529     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_GRBG},
    530     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_RGGB},
    531     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_BGGR}
    532 };
    533 
    534 const QCameraParameters::QCameraMap<cam_focus_mode_type>
    535         QCameraParameters::FOCUS_MODES_MAP[] = {
    536     { FOCUS_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
    537     { FOCUS_MODE_INFINITY,           CAM_FOCUS_MODE_INFINITY },
    538     { FOCUS_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
    539     { FOCUS_MODE_FIXED,              CAM_FOCUS_MODE_FIXED },
    540     { FOCUS_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
    541     { FOCUS_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
    542     { FOCUS_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO },
    543     { FOCUS_MODE_MANUAL_POSITION,    CAM_FOCUS_MODE_MANUAL},
    544 };
    545 
    546 const QCameraParameters::QCameraMap<cam_effect_mode_type>
    547         QCameraParameters::EFFECT_MODES_MAP[] = {
    548     { EFFECT_NONE,       CAM_EFFECT_MODE_OFF },
    549     { EFFECT_MONO,       CAM_EFFECT_MODE_MONO },
    550     { EFFECT_NEGATIVE,   CAM_EFFECT_MODE_NEGATIVE },
    551     { EFFECT_SOLARIZE,   CAM_EFFECT_MODE_SOLARIZE },
    552     { EFFECT_SEPIA,      CAM_EFFECT_MODE_SEPIA },
    553     { EFFECT_POSTERIZE,  CAM_EFFECT_MODE_POSTERIZE },
    554     { EFFECT_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
    555     { EFFECT_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
    556     { EFFECT_AQUA,       CAM_EFFECT_MODE_AQUA },
    557     { EFFECT_EMBOSS,     CAM_EFFECT_MODE_EMBOSS },
    558     { EFFECT_SKETCH,     CAM_EFFECT_MODE_SKETCH },
    559     { EFFECT_NEON,       CAM_EFFECT_MODE_NEON }
    560 };
    561 
    562 const QCameraParameters::QCameraMap<cam_scene_mode_type>
    563         QCameraParameters::SCENE_MODES_MAP[] = {
    564     { SCENE_MODE_AUTO,           CAM_SCENE_MODE_OFF },
    565     { SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
    566     { SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
    567     { SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
    568     { SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
    569     { SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
    570     { SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
    571     { SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
    572     { SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
    573     { SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
    574     { SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
    575     { SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
    576     { SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
    577     { SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
    578     { SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
    579     { SCENE_MODE_ASD,            CAM_SCENE_MODE_AUTO },
    580     { SCENE_MODE_BACKLIGHT,      CAM_SCENE_MODE_BACKLIGHT },
    581     { SCENE_MODE_FLOWERS,        CAM_SCENE_MODE_FLOWERS },
    582     { SCENE_MODE_AR,             CAM_SCENE_MODE_AR },
    583     { SCENE_MODE_HDR,            CAM_SCENE_MODE_HDR },
    584 };
    585 
    586 const QCameraParameters::QCameraMap<cam_flash_mode_t>
    587         QCameraParameters::FLASH_MODES_MAP[] = {
    588     { FLASH_MODE_OFF,   CAM_FLASH_MODE_OFF },
    589     { FLASH_MODE_AUTO,  CAM_FLASH_MODE_AUTO },
    590     { FLASH_MODE_ON,    CAM_FLASH_MODE_ON },
    591     { FLASH_MODE_TORCH, CAM_FLASH_MODE_TORCH }
    592 };
    593 
    594 const QCameraParameters::QCameraMap<cam_focus_algorithm_type>
    595          QCameraParameters::FOCUS_ALGO_MAP[] = {
    596     { FOCUS_ALGO_AUTO,            CAM_FOCUS_ALGO_AUTO },
    597     { FOCUS_ALGO_SPOT_METERING,   CAM_FOCUS_ALGO_SPOT },
    598     { FOCUS_ALGO_CENTER_WEIGHTED, CAM_FOCUS_ALGO_CENTER_WEIGHTED },
    599     { FOCUS_ALGO_FRAME_AVERAGE,   CAM_FOCUS_ALGO_AVERAGE }
    600 };
    601 
    602 const QCameraParameters::QCameraMap<cam_wb_mode_type>
    603         QCameraParameters::WHITE_BALANCE_MODES_MAP[] = {
    604     { WHITE_BALANCE_AUTO,            CAM_WB_MODE_AUTO },
    605     { WHITE_BALANCE_INCANDESCENT,    CAM_WB_MODE_INCANDESCENT },
    606     { WHITE_BALANCE_FLUORESCENT,     CAM_WB_MODE_FLUORESCENT },
    607     { WHITE_BALANCE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
    608     { WHITE_BALANCE_DAYLIGHT,        CAM_WB_MODE_DAYLIGHT },
    609     { WHITE_BALANCE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
    610     { WHITE_BALANCE_TWILIGHT,        CAM_WB_MODE_TWILIGHT },
    611     { WHITE_BALANCE_SHADE,           CAM_WB_MODE_SHADE },
    612     { WHITE_BALANCE_MANUAL,          CAM_WB_MODE_MANUAL},
    613 };
    614 
    615 const QCameraParameters::QCameraMap<cam_antibanding_mode_type>
    616         QCameraParameters::ANTIBANDING_MODES_MAP[] = {
    617     { ANTIBANDING_OFF,  CAM_ANTIBANDING_MODE_OFF },
    618     { ANTIBANDING_50HZ, CAM_ANTIBANDING_MODE_50HZ },
    619     { ANTIBANDING_60HZ, CAM_ANTIBANDING_MODE_60HZ },
    620     { ANTIBANDING_AUTO, CAM_ANTIBANDING_MODE_AUTO }
    621 };
    622 
    623 const QCameraParameters::QCameraMap<cam_iso_mode_type>
    624         QCameraParameters::ISO_MODES_MAP[] = {
    625     { ISO_AUTO,  CAM_ISO_MODE_AUTO },
    626     { ISO_HJR,   CAM_ISO_MODE_DEBLUR },
    627     { ISO_100,   CAM_ISO_MODE_100 },
    628     { ISO_200,   CAM_ISO_MODE_200 },
    629     { ISO_400,   CAM_ISO_MODE_400 },
    630     { ISO_800,   CAM_ISO_MODE_800 },
    631     { ISO_1600,  CAM_ISO_MODE_1600 },
    632     { ISO_3200,  CAM_ISO_MODE_3200 }
    633 };
    634 
    635 const QCameraParameters::QCameraMap<cam_hfr_mode_t>
    636         QCameraParameters::HFR_MODES_MAP[] = {
    637     { VIDEO_HFR_OFF, CAM_HFR_MODE_OFF },
    638     { VIDEO_HFR_2X, CAM_HFR_MODE_60FPS },
    639     { VIDEO_HFR_3X, CAM_HFR_MODE_90FPS },
    640     { VIDEO_HFR_4X, CAM_HFR_MODE_120FPS },
    641     { VIDEO_HFR_5X, CAM_HFR_MODE_150FPS },
    642     { VIDEO_HFR_6X, CAM_HFR_MODE_180FPS },
    643     { VIDEO_HFR_7X, CAM_HFR_MODE_210FPS },
    644     { VIDEO_HFR_8X, CAM_HFR_MODE_240FPS },
    645     { VIDEO_HFR_9X, CAM_HFR_MODE_480FPS }
    646 };
    647 
    648 const QCameraParameters::QCameraMap<cam_bracket_mode>
    649         QCameraParameters::BRACKETING_MODES_MAP[] = {
    650     { AE_BRACKET_OFF, CAM_EXP_BRACKETING_OFF },
    651     { AE_BRACKET,     CAM_EXP_BRACKETING_ON }
    652 };
    653 
    654 const QCameraParameters::QCameraMap<int>
    655         QCameraParameters::ON_OFF_MODES_MAP[] = {
    656     { VALUE_OFF, 0 },
    657     { VALUE_ON,  1 }
    658 };
    659 
    660 const QCameraParameters::QCameraMap<int>
    661         QCameraParameters::TOUCH_AF_AEC_MODES_MAP[] = {
    662     { QCameraParameters::TOUCH_AF_AEC_OFF, 0 },
    663     { QCameraParameters::TOUCH_AF_AEC_ON, 1 }
    664 };
    665 
    666 const QCameraParameters::QCameraMap<int>
    667         QCameraParameters::ENABLE_DISABLE_MODES_MAP[] = {
    668     { VALUE_ENABLE,  1 },
    669     { VALUE_DISABLE, 0 }
    670 };
    671 
    672 const QCameraParameters::QCameraMap<int>
    673         QCameraParameters::DENOISE_ON_OFF_MODES_MAP[] = {
    674     { DENOISE_OFF, 0 },
    675     { DENOISE_ON,  1 }
    676 };
    677 
    678 const QCameraParameters::QCameraMap<int>
    679         QCameraParameters::TRUE_FALSE_MODES_MAP[] = {
    680     { VALUE_FALSE, 0},
    681     { VALUE_TRUE,  1}
    682 };
    683 
    684 const QCameraParameters::QCameraMap<cam_flip_t>
    685         QCameraParameters::FLIP_MODES_MAP[] = {
    686     {FLIP_MODE_OFF, FLIP_NONE},
    687     {FLIP_MODE_V, FLIP_V},
    688     {FLIP_MODE_H, FLIP_H},
    689     {FLIP_MODE_VH, FLIP_V_H}
    690 };
    691 
    692 const QCameraParameters::QCameraMap<int>
    693         QCameraParameters::AF_BRACKETING_MODES_MAP[] = {
    694     { AF_BRACKET_OFF, 0 },
    695     { AF_BRACKET_ON,  1 }
    696 };
    697 
    698 const QCameraParameters::QCameraMap<int>
    699         QCameraParameters::RE_FOCUS_MODES_MAP[] = {
    700     { RE_FOCUS_OFF, 0 },
    701     { RE_FOCUS_ON,  1 }
    702 };
    703 
    704 const QCameraParameters::QCameraMap<int>
    705         QCameraParameters::CHROMA_FLASH_MODES_MAP[] = {
    706     { CHROMA_FLASH_OFF, 0 },
    707     { CHROMA_FLASH_ON,  1 }
    708 };
    709 
    710 const QCameraParameters::QCameraMap<int>
    711         QCameraParameters::OPTI_ZOOM_MODES_MAP[] = {
    712     { OPTI_ZOOM_OFF, 0 },
    713     { OPTI_ZOOM_ON,  1 }
    714 };
    715 
    716 const QCameraParameters::QCameraMap<int>
    717         QCameraParameters::TRUE_PORTRAIT_MODES_MAP[] = {
    718     { TRUE_PORTRAIT_OFF, 0 },
    719     { TRUE_PORTRAIT_ON,  1 }
    720 };
    721 
    722 const QCameraParameters::QCameraMap<int>
    723         QCameraParameters::STILL_MORE_MODES_MAP[] = {
    724     { STILL_MORE_OFF, 0 },
    725     { STILL_MORE_ON,  1 }
    726 };
    727 
    728 const QCameraParameters::QCameraMap<cam_cds_mode_type_t>
    729         QCameraParameters::CDS_MODES_MAP[] = {
    730     { CDS_MODE_OFF, CAM_CDS_MODE_OFF },
    731     { CDS_MODE_ON, CAM_CDS_MODE_ON },
    732     { CDS_MODE_AUTO, CAM_CDS_MODE_AUTO}
    733 };
    734 
    735 const QCameraParameters::QCameraMap<int>
    736         QCameraParameters::HDR_MODES_MAP[] = {
    737     { HDR_MODE_SENSOR, 0 },
    738     { HDR_MODE_MULTI_FRAME, 1 }
    739 };
    740 
    741 const QCameraParameters::QCameraMap<int>
    742         QCameraParameters::VIDEO_ROTATION_MODES_MAP[] = {
    743     { VIDEO_ROTATION_0, 0 },
    744     { VIDEO_ROTATION_90, 90 },
    745     { VIDEO_ROTATION_180, 180 },
    746     { VIDEO_ROTATION_270, 270 }
    747 };
    748 
    749 #define DEFAULT_CAMERA_AREA "(0, 0, 0, 0, 0)"
    750 #define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
    751 #define TOTAL_RAM_SIZE_512MB 536870912
    752 #define PARAM_MAP_SIZE(MAP) (sizeof(MAP)/sizeof(MAP[0]))
    753 
    754 /*===========================================================================
    755  * FUNCTION   : QCameraParameters
    756  *
    757  * DESCRIPTION: default constructor of QCameraParameters
    758  *
    759  * PARAMETERS : none
    760  *
    761  * RETURN     : None
    762  *==========================================================================*/
    763 QCameraParameters::QCameraParameters()
    764     : CameraParameters(),
    765       m_reprocScaleParam(this),
    766       m_pCapability(NULL),
    767       m_pCamOpsTbl(NULL),
    768       m_pParamHeap(NULL),
    769       m_pParamBuf(NULL),
    770       mIsType(IS_TYPE_NONE),
    771       m_bZslMode(false),
    772       m_bZslMode_new(false),
    773       m_bForceZslMode(false),
    774       m_bRecordingHint(false),
    775       m_bRecordingHint_new(false),
    776       m_bHistogramEnabled(false),
    777       m_nFaceProcMask(0),
    778       m_bFaceDetectionOn(0),
    779       m_bDebugFps(false),
    780       mFocusMode(CAM_FOCUS_MODE_MAX),
    781       mPreviewFormat(CAM_FORMAT_YUV_420_NV21),
    782       mPictureFormat(CAM_FORMAT_JPEG),
    783       m_bNeedRestart(false),
    784       m_bNoDisplayMode(false),
    785       m_bWNROn(false),
    786       m_bTNRPreviewOn(false),
    787       m_bTNRVideoOn(false),
    788       m_bInited(false),
    789       m_nBurstNum(1),
    790       m_nRetroBurstNum(0),
    791       m_nBurstLEDOnPeriod(100),
    792       m_bUpdateEffects(false),
    793       m_bSceneTransitionAuto(false),
    794       m_bPreviewFlipChanged(false),
    795       m_bVideoFlipChanged(false),
    796       m_bSnapshotFlipChanged(false),
    797       m_bFixedFrameRateSet(false),
    798       m_bHDREnabled(false),
    799       m_bAVTimerEnabled(false),
    800       m_bDISEnabled(false),
    801       m_MobiMask(0),
    802       m_AdjustFPS(NULL),
    803       m_bHDR1xFrameEnabled(true),
    804       m_HDRSceneEnabled(false),
    805       m_bHDRThumbnailProcessNeeded(false),
    806       m_bHDR1xExtraBufferNeeded(true),
    807       m_bHDROutputCropEnabled(false),
    808       m_tempMap(),
    809       m_bAFBracketingOn(false),
    810       m_bReFocusOn(false),
    811       m_bChromaFlashOn(false),
    812       m_bOptiZoomOn(false),
    813       m_bSceneSelection(false),
    814       m_SelectedScene(CAM_SCENE_MODE_MAX),
    815       m_bSeeMoreOn(false),
    816       m_bStillMoreOn(false),
    817       m_bHfrMode(false),
    818       m_bSensorHDREnabled(false),
    819       m_bRdiMode(false),
    820       m_bDisplayFrame(true),
    821       m_bSecureMode(false),
    822       m_bAeBracketingEnabled(false),
    823       mFlashValue(CAM_FLASH_MODE_OFF),
    824       mFlashDaemonValue(CAM_FLASH_MODE_OFF),
    825       mHfrMode(CAM_HFR_MODE_OFF),
    826       m_bHDRModeSensor(true),
    827       mOfflineRAW(false),
    828       m_bTruePortraitOn(false),
    829       mCds_mode(CAM_CDS_MODE_OFF)
    830 {
    831     char value[PROPERTY_VALUE_MAX];
    832     // TODO: may move to parameter instead of sysprop
    833     property_get("persist.debug.sf.showfps", value, "0");
    834     m_bDebugFps = atoi(value) > 0 ? true : false;
    835 
    836     // For thermal mode, it should be set as system property
    837     // because system property applies to all applications, while
    838     // parameters only apply to specific app.
    839     property_get("persist.camera.thermal.mode", value, "fps");
    840     if (!strcmp(value, "frameskip")) {
    841         m_ThermalMode = QCAMERA_THERMAL_ADJUST_FRAMESKIP;
    842     } else {
    843         if (strcmp(value, "fps"))
    844             ALOGE("%s: Invalid camera thermal mode %s", __func__, value);
    845         m_ThermalMode = QCAMERA_THERMAL_ADJUST_FPS;
    846     }
    847 
    848     memset(&m_LiveSnapshotSize, 0, sizeof(m_LiveSnapshotSize));
    849     memset(&m_default_fps_range, 0, sizeof(m_default_fps_range));
    850     memset(&m_hfrFpsRange, 0, sizeof(m_hfrFpsRange));
    851     memset(&m_stillmore_config, 0, sizeof(cam_still_more_t));
    852     memset(&m_captureFrameConfig, 0, sizeof(cam_capture_frame_config_t));
    853     mTotalPPCount = 0;
    854     mZoomLevel = 0;
    855     mParmZoomLevel = 0;
    856     mCurPPCount = 0;
    857     mBufBatchCnt = 0;
    858     mRotation = 0;
    859     mJpegRotation = 0;
    860 }
    861 
    862 /*===========================================================================
    863  * FUNCTION   : QCameraParameters
    864  *
    865  * DESCRIPTION: constructor of QCameraParameters
    866  *
    867  * PARAMETERS :
    868  *   @params  : parameters in string
    869  *
    870  * RETURN     : None
    871  *==========================================================================*/
    872 QCameraParameters::QCameraParameters(const String8 &params)
    873     : CameraParameters(params),
    874     m_reprocScaleParam(this),
    875     m_pCapability(NULL),
    876     m_pCamOpsTbl(NULL),
    877     m_pParamHeap(NULL),
    878     m_pParamBuf(NULL),
    879     m_bZslMode(false),
    880     m_bZslMode_new(false),
    881     m_bForceZslMode(false),
    882     m_bRecordingHint(false),
    883     m_bRecordingHint_new(false),
    884     m_bHistogramEnabled(false),
    885     m_nFaceProcMask(0),
    886     m_bDebugFps(false),
    887     mFocusMode(CAM_FOCUS_MODE_MAX),
    888     mPreviewFormat(CAM_FORMAT_YUV_420_NV21),
    889     mPictureFormat(CAM_FORMAT_JPEG),
    890     m_bNeedRestart(false),
    891     m_bNoDisplayMode(false),
    892     m_bWNROn(false),
    893     m_bTNRPreviewOn(false),
    894     m_bTNRVideoOn(false),
    895     m_bInited(false),
    896     m_nBurstNum(1),
    897     m_nRetroBurstNum(0),
    898     m_nBurstLEDOnPeriod(100),
    899     m_bPreviewFlipChanged(false),
    900     m_bVideoFlipChanged(false),
    901     m_bSnapshotFlipChanged(false),
    902     m_bFixedFrameRateSet(false),
    903     m_bHDREnabled(false),
    904     m_bAVTimerEnabled(false),
    905     m_AdjustFPS(NULL),
    906     m_bHDR1xFrameEnabled(true),
    907     m_HDRSceneEnabled(false),
    908     m_bHDRThumbnailProcessNeeded(false),
    909     m_bHDR1xExtraBufferNeeded(true),
    910     m_bHDROutputCropEnabled(false),
    911     m_tempMap(),
    912     m_bAFBracketingOn(false),
    913     m_bReFocusOn(false),
    914     m_bChromaFlashOn(false),
    915     m_bOptiZoomOn(false),
    916     m_bSceneSelection(false),
    917     m_SelectedScene(CAM_SCENE_MODE_MAX),
    918     m_bSeeMoreOn(false),
    919     m_bStillMoreOn(false),
    920     m_bHfrMode(false),
    921     m_bSensorHDREnabled(false),
    922     m_bRdiMode(false),
    923     m_bSecureMode(false),
    924     m_bAeBracketingEnabled(false),
    925     mFlashValue(CAM_FLASH_MODE_OFF),
    926     mFlashDaemonValue(CAM_FLASH_MODE_OFF),
    927     mHfrMode(CAM_HFR_MODE_OFF),
    928     m_bHDRModeSensor(true),
    929     mOfflineRAW(false),
    930     m_bTruePortraitOn(false),
    931     mCds_mode(CAM_CDS_MODE_OFF),
    932     mParmEffect(CAM_EFFECT_MODE_OFF)
    933 {
    934     memset(&m_LiveSnapshotSize, 0, sizeof(m_LiveSnapshotSize));
    935     memset(&m_default_fps_range, 0, sizeof(m_default_fps_range));
    936     memset(&m_hfrFpsRange, 0, sizeof(m_hfrFpsRange));
    937     memset(&m_stillmore_config, 0, sizeof(cam_still_more_t));
    938     mTotalPPCount = 0;
    939     mZoomLevel = 0;
    940     mParmZoomLevel = 0;
    941     mCurPPCount = 0;
    942     mRotation = 0;
    943     mJpegRotation = 0;
    944 }
    945 
    946 /*===========================================================================
    947  * FUNCTION   : ~QCameraParameters
    948  *
    949  * DESCRIPTION: deconstructor of QCameraParameters
    950  *
    951  * PARAMETERS : none
    952  *
    953  * RETURN     : None
    954  *==========================================================================*/
    955 QCameraParameters::~QCameraParameters()
    956 {
    957     deinit();
    958 }
    959 
    960 /*===========================================================================
    961  * FUNCTION   : createSizesString
    962  *
    963  * DESCRIPTION: create string obj contains array of dimensions
    964  *
    965  * PARAMETERS :
    966  *   @sizes   : array of dimensions
    967  *   @len     : size of dimension array
    968  *
    969  * RETURN     : string obj
    970  *==========================================================================*/
    971 String8 QCameraParameters::createSizesString(const cam_dimension_t *sizes, size_t len)
    972 {
    973     String8 str;
    974     char buffer[32];
    975 
    976     if (len > 0) {
    977         snprintf(buffer, sizeof(buffer), "%dx%d", sizes[0].width, sizes[0].height);
    978         str.append(buffer);
    979     }
    980     for (size_t i = 1; i < len; i++) {
    981         snprintf(buffer, sizeof(buffer), ",%dx%d",
    982                 sizes[i].width, sizes[i].height);
    983         str.append(buffer);
    984     }
    985     return str;
    986 }
    987 
    988 /*===========================================================================
    989  * FUNCTION   : createValuesString
    990  *
    991  * DESCRIPTION: create string obj contains array of values from map when matched
    992  *              from input values array
    993  *
    994  * PARAMETERS :
    995  *   @values  : array of values
    996  *   @len     : size of values array
    997  *   @map     : map contains the mapping between values and enums
    998  *   @map_len : size of the map
    999  *
   1000  * RETURN     : string obj
   1001  *==========================================================================*/
   1002 template <typename valuesType, class mapType> String8 createValuesString(
   1003         const valuesType *values, size_t len, const mapType *map, size_t map_len)
   1004 {
   1005     String8 str;
   1006     int count = 0;
   1007 
   1008     for (size_t i = 0; i < len; i++ ) {
   1009         for (size_t j = 0; j < map_len; j ++)
   1010             if (map[j].val == values[i]) {
   1011                 if (NULL != map[j].desc) {
   1012                     if (count > 0) {
   1013                         str.append(",");
   1014                     }
   1015                     str.append(map[j].desc);
   1016                     count++;
   1017                     break; //loop j
   1018                 }
   1019             }
   1020     }
   1021     return str;
   1022 }
   1023 
   1024 /*===========================================================================
   1025  * FUNCTION   : createValuesStringFromMap
   1026  *
   1027  * DESCRIPTION: create string obj contains array of values directly from map
   1028  *
   1029  * PARAMETERS :
   1030  *   @map     : map contains the mapping between values and enums
   1031  *   @map_len : size of the map
   1032  *
   1033  * RETURN     : string obj
   1034  *==========================================================================*/
   1035 template <class mapType> String8 createValuesStringFromMap(
   1036         const mapType *map, size_t map_len)
   1037 {
   1038     String8 str;
   1039 
   1040     for (size_t i = 0; i < map_len; i++) {
   1041         if (NULL != map[i].desc) {
   1042             if (i > 0) {
   1043                 str.append(",");
   1044             }
   1045             str.append(map[i].desc);
   1046         }
   1047     }
   1048     return str;
   1049 }
   1050 
   1051 /*===========================================================================
   1052  * FUNCTION   : createZoomRatioValuesString
   1053  *
   1054  * DESCRIPTION: create string obj contains array of zoom ratio values
   1055  *
   1056  * PARAMETERS :
   1057  *   @zoomRaios  : array of zoom ratios
   1058  *   @length     : size of the array
   1059  *
   1060  * RETURN     : string obj
   1061  *==========================================================================*/
   1062 String8 QCameraParameters::createZoomRatioValuesString(uint32_t *zoomRatios,
   1063         size_t length)
   1064 {
   1065     String8 str;
   1066     char buffer[32] = {0};
   1067 
   1068     if(length > 0){
   1069         snprintf(buffer, sizeof(buffer), "%d", zoomRatios[0]);
   1070         str.append(buffer);
   1071     }
   1072 
   1073     for (size_t i = 1; i < length; i++) {
   1074         memset(buffer, 0, sizeof(buffer));
   1075         snprintf(buffer, sizeof(buffer), ",%d", zoomRatios[i]);
   1076         str.append(buffer);
   1077     }
   1078     return str;
   1079 }
   1080 
   1081 /*===========================================================================
   1082  * FUNCTION   : createHfrValuesString
   1083  *
   1084  * DESCRIPTION: create string obj contains array of hfr values from map when
   1085  *              matched from input hfr values
   1086  *
   1087  * PARAMETERS :
   1088  *   @values  : array of hfr info
   1089  *   @len     : size of the array
   1090  *   @map     : map of hfr string value and enum
   1091  *   map_len  : size of map
   1092  *
   1093  * RETURN     : string obj
   1094  *==========================================================================*/
   1095 String8 QCameraParameters::createHfrValuesString(const cam_hfr_info_t *values,
   1096         size_t len, const QCameraMap<cam_hfr_mode_t> *map, size_t map_len)
   1097 {
   1098     String8 str;
   1099     int count = 0;
   1100 
   1101     char value[PROPERTY_VALUE_MAX];
   1102     int8_t batch_count = 0;
   1103 
   1104     property_get("persist.camera.batchcount", value, "0");
   1105     batch_count = atoi(value);
   1106 
   1107     for (size_t i = 0; i < len; i++ ) {
   1108         for (size_t j = 0; j < map_len; j ++) {
   1109             if ((batch_count < CAMERA_MIN_BATCH_COUNT)
   1110                     && (map[j].val > CAM_HFR_MODE_120FPS)) {
   1111                 /*TODO: Work around. Need to revert when we have
   1112                 complete 240fps support*/
   1113                 break;
   1114             }
   1115             if (map[j].val == (int)values[i].mode) {
   1116                 if (NULL != map[j].desc) {
   1117                     if (count > 0) {
   1118                         str.append(",");
   1119                     }
   1120                      str.append(map[j].desc);
   1121                      count++;
   1122                      break; //loop j
   1123                 }
   1124             }
   1125         }
   1126     }
   1127     if (count > 0) {
   1128         str.append(",");
   1129     }
   1130     str.append(VIDEO_HFR_OFF);
   1131     return str;
   1132 }
   1133 
   1134 /*===========================================================================
   1135  * FUNCTION   : createHfrSizesString
   1136  *
   1137  * DESCRIPTION: create string obj contains array of hfr sizes
   1138  *
   1139  * PARAMETERS :
   1140  *   @values  : array of hfr info
   1141  *   @len     : size of the array
   1142  *
   1143  * RETURN     : string obj
   1144  *==========================================================================*/
   1145 String8 QCameraParameters::createHfrSizesString(const cam_hfr_info_t *values, size_t len)
   1146 {
   1147     String8 str;
   1148     char buffer[32];
   1149 
   1150     if (len > 0) {
   1151         snprintf(buffer, sizeof(buffer), "%dx%d",
   1152                  values[0].dim.width, values[0].dim.height);
   1153         str.append(buffer);
   1154     }
   1155     for (size_t i = 1; i < len; i++) {
   1156         snprintf(buffer, sizeof(buffer), ",%dx%d",
   1157                  values[i].dim.width, values[i].dim.height);
   1158         str.append(buffer);
   1159     }
   1160     return str;
   1161 }
   1162 
   1163 /*===========================================================================
   1164  * FUNCTION   : createFpsString
   1165  *
   1166  * DESCRIPTION: create string obj contains array of FPS rates
   1167  *
   1168  * PARAMETERS :
   1169  *   @fps     : default fps range
   1170  *
   1171  * RETURN     : string obj
   1172  *==========================================================================*/
   1173 String8 QCameraParameters::createFpsString(cam_fps_range_t &fps)
   1174 {
   1175     char buffer[32];
   1176     String8 fpsValues;
   1177 
   1178     int min_fps = int(fps.min_fps);
   1179     int max_fps = int(fps.max_fps);
   1180 
   1181     if (min_fps < fps.min_fps){
   1182         min_fps++;
   1183     }
   1184     if (max_fps > fps.max_fps) {
   1185         max_fps--;
   1186     }
   1187     if (min_fps <= max_fps) {
   1188         snprintf(buffer, sizeof(buffer), "%d", min_fps);
   1189         fpsValues.append(buffer);
   1190     }
   1191 
   1192     for (int i = min_fps+1; i <= max_fps; i++) {
   1193         snprintf(buffer, sizeof(buffer), ",%d", i);
   1194         fpsValues.append(buffer);
   1195     }
   1196 
   1197     return fpsValues;
   1198 }
   1199 
   1200 /*===========================================================================
   1201  * FUNCTION   : createFpsRangeString
   1202  *
   1203  * DESCRIPTION: create string obj contains array of FPS ranges
   1204  *
   1205  * PARAMETERS :
   1206  *   @fps     : array of fps ranges
   1207  *   @len     : size of the array
   1208  *   @default_fps_index : reference to index of default fps range
   1209  *
   1210  * RETURN     : string obj
   1211  *==========================================================================*/
   1212 String8 QCameraParameters::createFpsRangeString(const cam_fps_range_t* fps,
   1213         size_t len, int &default_fps_index)
   1214 {
   1215     String8 str;
   1216     char buffer[32];
   1217     int max_range = 0;
   1218     int min_fps, max_fps;
   1219 
   1220     if (len > 0) {
   1221         min_fps = int(fps[0].min_fps * 1000);
   1222         max_fps = int(fps[0].max_fps * 1000);
   1223         max_range = max_fps - min_fps;
   1224         default_fps_index = 0;
   1225         snprintf(buffer, sizeof(buffer), "(%d,%d)", min_fps, max_fps);
   1226         str.append(buffer);
   1227     }
   1228     for (size_t i = 1; i < len; i++) {
   1229         min_fps = int(fps[i].min_fps * 1000);
   1230         max_fps = int(fps[i].max_fps * 1000);
   1231         if (max_range < (max_fps - min_fps)) {
   1232             max_range = max_fps - min_fps;
   1233             default_fps_index = (int)i;
   1234         }
   1235         snprintf(buffer, sizeof(buffer), ",(%d,%d)", min_fps, max_fps);
   1236         str.append(buffer);
   1237     }
   1238     return str;
   1239 }
   1240 
   1241 /*===========================================================================
   1242  * FUNCTION   : lookupAttr
   1243  *
   1244  * DESCRIPTION: lookup a value by its name
   1245  *
   1246  * PARAMETERS :
   1247  *   @attr    : map contains <name, value>
   1248  *   @len     : size of the map
   1249  *   @name    : name to be looked up
   1250  *
   1251  * RETURN     : valid value if found
   1252  *              NAME_NOT_FOUND if not found
   1253  *==========================================================================*/
   1254 template <class mapType> int lookupAttr(const mapType *arr,
   1255         size_t len, const char *name)
   1256 {
   1257     if (name) {
   1258         for (size_t i = 0; i < len; i++) {
   1259             if (!strcmp(arr[i].desc, name))
   1260                 return arr[i].val;
   1261         }
   1262     }
   1263     return NAME_NOT_FOUND;
   1264 }
   1265 
   1266 /*===========================================================================
   1267  * FUNCTION   : lookupNameByValue
   1268  *
   1269  * DESCRIPTION: lookup a name by its value
   1270  *
   1271  * PARAMETERS :
   1272  *   @attr    : map contains <name, value>
   1273  *   @len     : size of the map
   1274  *   @value   : value to be looked up
   1275  *
   1276  * RETURN     : name str or NULL if not found
   1277  *==========================================================================*/
   1278 template <class mapType> const char *lookupNameByValue(const mapType *arr,
   1279         size_t len, int value)
   1280 {
   1281     for (size_t i = 0; i < len; i++) {
   1282         if (arr[i].val == value) {
   1283             return arr[i].desc;
   1284         }
   1285     }
   1286     return NULL;
   1287 }
   1288 
   1289 /*===========================================================================
   1290  * FUNCTION   : setPreviewSize
   1291  *
   1292  * DESCRIPTION: set preview size from user setting
   1293  *
   1294  * PARAMETERS :
   1295  *   @params  : user setting parameters
   1296  *
   1297  * RETURN     : int32_t type of status
   1298  *              NO_ERROR  -- success
   1299  *              none-zero failure code
   1300  *==========================================================================*/
   1301 int32_t QCameraParameters::setPreviewSize(const QCameraParameters& params)
   1302 {
   1303     int width, height;
   1304     params.getPreviewSize(&width, &height);
   1305     ALOGI("Requested preview size %d x %d", width, height);
   1306 
   1307     // Validate the preview size
   1308     for (size_t i = 0; i < m_pCapability->preview_sizes_tbl_cnt; ++i) {
   1309         if (width ==  m_pCapability->preview_sizes_tbl[i].width
   1310            && height ==  m_pCapability->preview_sizes_tbl[i].height) {
   1311             // check if need to restart preview in case of preview size change
   1312             int old_width, old_height;
   1313             CameraParameters::getPreviewSize(&old_width, &old_height);
   1314             if (width != old_width || height != old_height) {
   1315                 m_bNeedRestart = true;
   1316             }
   1317 
   1318             // set the new value
   1319             CameraParameters::setPreviewSize(width, height);
   1320             return NO_ERROR;
   1321         }
   1322     }
   1323     ALOGE("Invalid preview size requested: %dx%d", width, height);
   1324     return BAD_VALUE;
   1325 }
   1326 
   1327 /*===========================================================================
   1328  * FUNCTION   : setPictureSize
   1329  *
   1330  * DESCRIPTION: set picture size from user setting
   1331  *
   1332  * PARAMETERS :
   1333  *   @params  : user setting parameters
   1334  *
   1335  * RETURN     : int32_t type of status
   1336  *              NO_ERROR  -- success
   1337  *              none-zero failure code
   1338  *==========================================================================*/
   1339 int32_t QCameraParameters::setPictureSize(const QCameraParameters& params)
   1340 {
   1341     int width, height;
   1342     params.getPictureSize(&width, &height);
   1343     ALOGI("Requested picture size %d x %d", width, height);
   1344 
   1345     // Validate the picture size
   1346     if(!m_reprocScaleParam.isScaleEnabled()){
   1347         for (size_t i = 0; i < m_pCapability->picture_sizes_tbl_cnt; ++i) {
   1348             if (width ==  m_pCapability->picture_sizes_tbl[i].width
   1349                && height ==  m_pCapability->picture_sizes_tbl[i].height) {
   1350                 // check if need to restart preview in case of picture size change
   1351                 int old_width, old_height;
   1352                 CameraParameters::getPictureSize(&old_width, &old_height);
   1353                 if ((m_bZslMode || m_bRecordingHint) &&
   1354                     (width != old_width || height != old_height)) {
   1355                     m_bNeedRestart = true;
   1356                 }
   1357 
   1358                 // set the new value
   1359                 CameraParameters::setPictureSize(width, height);
   1360                 return NO_ERROR;
   1361             }
   1362         }
   1363     }else{
   1364         //should use scaled picture size table to validate
   1365         if(m_reprocScaleParam.setValidatePicSize(width, height) == NO_ERROR){
   1366             // check if need to restart preview in case of picture size change
   1367             int old_width, old_height;
   1368             CameraParameters::getPictureSize(&old_width, &old_height);
   1369             if ((m_bZslMode || m_bRecordingHint) &&
   1370                 (width != old_width || height != old_height)) {
   1371                 m_bNeedRestart = true;
   1372             }
   1373 
   1374             // set the new value
   1375             char val[32];
   1376             snprintf(val, sizeof(val), "%dx%d", width, height);
   1377             updateParamEntry(KEY_PICTURE_SIZE, val);
   1378             CDBG("%s: %s", __func__, val);
   1379             return NO_ERROR;
   1380         }
   1381     }
   1382     ALOGE("Invalid picture size requested: %dx%d", width, height);
   1383     return BAD_VALUE;
   1384 }
   1385 
   1386 /*===========================================================================
   1387  * FUNCTION   : setVideoSize
   1388  *
   1389  * DESCRIPTION: set video size from user setting
   1390  *
   1391  * PARAMETERS :
   1392  *   @params  : user setting parameters
   1393  *
   1394  * RETURN     : int32_t type of status
   1395  *              NO_ERROR  -- success
   1396  *              none-zero failure code
   1397  *==========================================================================*/
   1398 int32_t QCameraParameters::setVideoSize(const QCameraParameters& params)
   1399 {
   1400     const char *str= NULL;
   1401     int width, height;
   1402     str = params.get(KEY_VIDEO_SIZE);
   1403     if(!str) {
   1404         //If application didn't set this parameter string, use the values from
   1405         //getPreviewSize() as video dimensions.
   1406         params.getPreviewSize(&width, &height);
   1407         ALOGE("No Record Size requested, use the preview dimensions");
   1408     } else {
   1409         params.getVideoSize(&width, &height);
   1410     }
   1411 
   1412     // Validate the video size
   1413     for (size_t i = 0; i < m_pCapability->video_sizes_tbl_cnt; ++i) {
   1414         if (width ==  m_pCapability->video_sizes_tbl[i].width
   1415                 && height ==  m_pCapability->video_sizes_tbl[i].height) {
   1416             // check if need to restart preview in case of video size change
   1417             int old_width, old_height;
   1418             CameraParameters::getVideoSize(&old_width, &old_height);
   1419             if (m_bRecordingHint &&
   1420                (width != old_width || height != old_height)) {
   1421                 m_bNeedRestart = true;
   1422             }
   1423 
   1424             // set the new value
   1425             CameraParameters::setVideoSize(width, height);
   1426             return NO_ERROR;
   1427         }
   1428     }
   1429 
   1430     ALOGE("Invalid video size requested: %dx%d", width, height);
   1431     return BAD_VALUE;
   1432 }
   1433 
   1434 /*===========================================================================
   1435  * FUNCTION   : getLiveSnapshotSize
   1436  *
   1437  * DESCRIPTION: get live snapshot size
   1438  *
   1439  * PARAMETERS : dim - Update dim with the liveshot size
   1440  *
   1441  *==========================================================================*/
   1442 void QCameraParameters::getLiveSnapshotSize(cam_dimension_t &dim)
   1443 {
   1444     if(is4k2kVideoResolution()) {
   1445         // We support maximum 8M liveshot @4K2K video resolution
   1446         cam_dimension_t resolution = {0, 0};
   1447         CameraParameters::getVideoSize(&resolution.width, &resolution.height);
   1448         if((m_LiveSnapshotSize.width > resolution.width) ||
   1449                 (m_LiveSnapshotSize.height > resolution.height)) {
   1450             m_LiveSnapshotSize.width = resolution.width;
   1451             m_LiveSnapshotSize.height = resolution.height;
   1452         }
   1453     }
   1454     dim = m_LiveSnapshotSize;
   1455     CDBG_HIGH("%s: w x h: %d x %d", __func__, dim.width, dim.height);
   1456 }
   1457 
   1458 /*===========================================================================
   1459  * FUNCTION   : setLiveSnapshotSize
   1460  *
   1461  * DESCRIPTION: set live snapshot size
   1462  *
   1463  * PARAMETERS :
   1464  *   @params  : user setting parameters
   1465  *
   1466  * RETURN     : int32_t type of status
   1467  *              NO_ERROR  -- success
   1468  *              none-zero failure code
   1469  *==========================================================================*/
   1470 int32_t QCameraParameters::setLiveSnapshotSize(const QCameraParameters& params)
   1471 {
   1472     char value[PROPERTY_VALUE_MAX];
   1473     property_get("persist.camera.opt.livepic", value, "1");
   1474     bool useOptimal = atoi(value) > 0 ? true : false;
   1475 
   1476     // use picture size from user setting
   1477     params.getPictureSize(&m_LiveSnapshotSize.width, &m_LiveSnapshotSize.height);
   1478 
   1479     size_t livesnapshot_sizes_tbl_cnt =
   1480             m_pCapability->livesnapshot_sizes_tbl_cnt;
   1481     cam_dimension_t *livesnapshot_sizes_tbl =
   1482             &m_pCapability->livesnapshot_sizes_tbl[0];
   1483 
   1484     if(is4k2kVideoResolution()) {
   1485         // We support maximum 8M liveshot @4K2K video resolution
   1486         cam_dimension_t resolution = {0, 0};
   1487         CameraParameters::getVideoSize(&resolution.width, &resolution.height);
   1488         if((m_LiveSnapshotSize.width > resolution.width) ||
   1489                 (m_LiveSnapshotSize.height > resolution.height)) {
   1490             m_LiveSnapshotSize.width = resolution.width;
   1491             m_LiveSnapshotSize.height = resolution.height;
   1492         }
   1493     }
   1494 
   1495     // check if HFR is enabled
   1496     const char *hfrStr = params.get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
   1497     cam_hfr_mode_t hfrMode = CAM_HFR_MODE_OFF;
   1498     const char *hsrStr = params.get(KEY_QC_VIDEO_HIGH_SPEED_RECORDING);
   1499 
   1500     if ((hsrStr != NULL) && strcmp(hsrStr, "off")) {
   1501         int32_t hsr = lookupAttr(HFR_MODES_MAP, PARAM_MAP_SIZE(HFR_MODES_MAP), hsrStr);
   1502         if ((hsr != NAME_NOT_FOUND) && (hsr > CAM_HFR_MODE_OFF)) {
   1503             // if HSR is enabled, change live snapshot size
   1504             for (size_t i = 0; i < m_pCapability->hfr_tbl_cnt; i++) {
   1505                 if (m_pCapability->hfr_tbl[i].mode == hsr) {
   1506                     livesnapshot_sizes_tbl_cnt =
   1507                             m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl_cnt;
   1508                     livesnapshot_sizes_tbl =
   1509                             &m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl[0];
   1510                     hfrMode = m_pCapability->hfr_tbl[i].mode;
   1511                     break;
   1512                 }
   1513             }
   1514         }
   1515     } else if ((hfrStr != NULL) && strcmp(hfrStr, "off")) {
   1516         int32_t hfr = lookupAttr(HFR_MODES_MAP, PARAM_MAP_SIZE(HFR_MODES_MAP), hfrStr);
   1517         if ((hfr != NAME_NOT_FOUND) && (hfr > CAM_HFR_MODE_OFF)) {
   1518             // if HFR is enabled, change live snapshot size
   1519             for (size_t i = 0; i < m_pCapability->hfr_tbl_cnt; i++) {
   1520                 if (m_pCapability->hfr_tbl[i].mode == hfr) {
   1521                     livesnapshot_sizes_tbl_cnt =
   1522                             m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl_cnt;
   1523                     livesnapshot_sizes_tbl =
   1524                             &m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl[0];
   1525                     hfrMode = m_pCapability->hfr_tbl[i].mode;
   1526                     break;
   1527                 }
   1528             }
   1529         }
   1530     }
   1531 
   1532     if (useOptimal || hfrMode != CAM_HFR_MODE_OFF) {
   1533         bool found = false;
   1534 
   1535         // first check if picture size is within the list of supported sizes
   1536         for (size_t i = 0; i < livesnapshot_sizes_tbl_cnt; ++i) {
   1537             if (m_LiveSnapshotSize.width == livesnapshot_sizes_tbl[i].width &&
   1538                 m_LiveSnapshotSize.height == livesnapshot_sizes_tbl[i].height) {
   1539                 found = true;
   1540                 break;
   1541             }
   1542         }
   1543 
   1544         if (!found) {
   1545             // use optimal live snapshot size from supported list,
   1546             // that has same preview aspect ratio
   1547             int width = 0, height = 0;
   1548             params.getPreviewSize(&width, &height);
   1549 
   1550             double previewAspectRatio = (double)width / height;
   1551             for (size_t i = 0; i < livesnapshot_sizes_tbl_cnt; ++i) {
   1552                 double ratio = (double)livesnapshot_sizes_tbl[i].width /
   1553                                 livesnapshot_sizes_tbl[i].height;
   1554                 if (fabs(previewAspectRatio - ratio) <= ASPECT_TOLERANCE) {
   1555                     m_LiveSnapshotSize = livesnapshot_sizes_tbl[i];
   1556                     found = true;
   1557                     break;
   1558                 }
   1559             }
   1560 
   1561             if (!found && hfrMode != CAM_HFR_MODE_OFF) {
   1562                 // Cannot find matching aspect ration from supported live snapshot list
   1563                 // choose the max dim from preview and video size
   1564                 CDBG("%s: Cannot find matching aspect ratio, choose max of preview or video size", __func__);
   1565                 params.getVideoSize(&m_LiveSnapshotSize.width, &m_LiveSnapshotSize.height);
   1566                 if (m_LiveSnapshotSize.width < width && m_LiveSnapshotSize.height < height) {
   1567                     m_LiveSnapshotSize.width = width;
   1568                     m_LiveSnapshotSize.height = height;
   1569                 }
   1570             }
   1571         }
   1572     }
   1573     CDBG_HIGH("%s: live snapshot size %d x %d", __func__,
   1574           m_LiveSnapshotSize.width, m_LiveSnapshotSize.height);
   1575 
   1576     return NO_ERROR;
   1577 }
   1578 
   1579 
   1580 /*===========================================================================
   1581  * FUNCTION   : setRawSize
   1582  *
   1583  * DESCRIPTION: set live snapshot size
   1584  *
   1585  * PARAMETERS :
   1586  *   @params  : user setting parameters
   1587  *
   1588  * RETURN     : int32_t type of status
   1589  *              NO_ERROR  -- success
   1590  *              none-zero failure code
   1591  *==========================================================================*/
   1592 int32_t QCameraParameters::setRawSize(cam_dimension_t &dim)
   1593 {
   1594     m_rawSize = dim;
   1595     return NO_ERROR;
   1596 }
   1597 /*===========================================================================
   1598  * FUNCTION   : setPreviewFormat
   1599  *
   1600  * DESCRIPTION: set preview format from user setting
   1601  *
   1602  * PARAMETERS :
   1603  *   @params  : user setting parameters
   1604  *
   1605  * RETURN     : int32_t type of status
   1606  *              NO_ERROR  -- success
   1607  *              none-zero failure code
   1608  *==========================================================================*/
   1609 int32_t QCameraParameters::setPreviewFormat(const QCameraParameters& params)
   1610 {
   1611     const char *str = params.getPreviewFormat();
   1612     int32_t previewFormat = lookupAttr(PREVIEW_FORMATS_MAP,
   1613             PARAM_MAP_SIZE(PREVIEW_FORMATS_MAP), str);
   1614     if (previewFormat != NAME_NOT_FOUND) {
   1615         mPreviewFormat = (cam_format_t)previewFormat;
   1616 
   1617         CameraParameters::setPreviewFormat(str);
   1618         CDBG_HIGH("%s: format %d\n", __func__, mPreviewFormat);
   1619         return NO_ERROR;
   1620     }
   1621     ALOGE("Invalid preview format value: %s", (str == NULL) ? "NULL" : str);
   1622     return BAD_VALUE;
   1623 }
   1624 
   1625 /*===========================================================================
   1626  * FUNCTION   : setPictureFormat
   1627  *
   1628  * DESCRIPTION: set picture format from user setting
   1629  *
   1630  * PARAMETERS :
   1631  *   @params  : user setting parameters
   1632  *
   1633  * RETURN     : int32_t type of status
   1634  *              NO_ERROR  -- success
   1635  *              none-zero failure code
   1636  *==========================================================================*/
   1637 int32_t QCameraParameters::setPictureFormat(const QCameraParameters& params)
   1638 {
   1639     const char *str = params.getPictureFormat();
   1640     int32_t pictureFormat = lookupAttr(PICTURE_TYPES_MAP, PARAM_MAP_SIZE(PICTURE_TYPES_MAP), str);
   1641     if (pictureFormat != NAME_NOT_FOUND) {
   1642         mPictureFormat = pictureFormat;
   1643 
   1644         CameraParameters::setPictureFormat(str);
   1645         CDBG_HIGH("%s: format %d\n", __func__, mPictureFormat);
   1646         return NO_ERROR;
   1647     }
   1648     ALOGE("%s: Invalid picture format value: %s", __func__, (str == NULL) ? "NULL" : str);
   1649     return BAD_VALUE;
   1650 }
   1651 
   1652 /*===========================================================================
   1653  * FUNCTION   : setJpegThumbnailSize
   1654  *
   1655  * DESCRIPTION: set jpeg thumbnail size from user setting
   1656  *
   1657  * PARAMETERS :
   1658  *   @params  : user setting parameters
   1659  *
   1660  * RETURN     : int32_t type of status
   1661  *              NO_ERROR  -- success
   1662  *              none-zero failure code
   1663  *==========================================================================*/
   1664 int32_t QCameraParameters::setJpegThumbnailSize(const QCameraParameters& params)
   1665 {
   1666     int width = params.getInt(KEY_JPEG_THUMBNAIL_WIDTH);
   1667     int height = params.getInt(KEY_JPEG_THUMBNAIL_HEIGHT);
   1668 
   1669     CDBG("requested jpeg thumbnail size %d x %d", width, height);
   1670 
   1671     size_t sizes_cnt = PARAM_MAP_SIZE(THUMBNAIL_SIZES_MAP);
   1672 
   1673     cam_dimension_t dim;
   1674 
   1675     // While taking livesnaphot match jpeg thumbnail size aspect
   1676     // ratio to liveshot size. For normal snapshot match thumbnail
   1677     // aspect ratio to picture size.
   1678     if (m_bRecordingHint) {
   1679         getLiveSnapshotSize(dim);
   1680     } else {
   1681         params.getPictureSize(&dim.width, &dim.height);
   1682     }
   1683 
   1684     if (0 == dim.height) {
   1685         ALOGE("%s: picture size is invalid (%d x %d)", __func__, dim.width, dim.height);
   1686         return BAD_VALUE;
   1687     }
   1688     double picAspectRatio = (double)dim.width / (double)dim.height;
   1689 
   1690     int optimalWidth = 0, optimalHeight = 0;
   1691     if (width != 0 || height != 0) {
   1692         // If input jpeg thumnmail size is (0,0), meaning no thumbnail needed
   1693         // hornor this setting.
   1694         // Otherwise, search for optimal jpeg thumbnail size that has the same
   1695         // aspect ratio as picture size.
   1696         // If missign jpeg thumbnail size with appropriate aspect ratio,
   1697         // just honor setting supplied by application.
   1698 
   1699         // Try to find a size matches aspect ratio and has the largest width
   1700         for (size_t i = 0; i < sizes_cnt; i++) {
   1701             if (THUMBNAIL_SIZES_MAP[i].height == 0) {
   1702                 // No thumbnail case, just skip
   1703                 continue;
   1704             }
   1705             double ratio =
   1706                 (double)THUMBNAIL_SIZES_MAP[i].width / THUMBNAIL_SIZES_MAP[i].height;
   1707             if (fabs(ratio - picAspectRatio) > ASPECT_TOLERANCE)  {
   1708                 continue;
   1709             }
   1710             if (THUMBNAIL_SIZES_MAP[i].width > optimalWidth) {
   1711                 optimalWidth = THUMBNAIL_SIZES_MAP[i].width;
   1712                 optimalHeight = THUMBNAIL_SIZES_MAP[i].height;
   1713             }
   1714         }
   1715 
   1716         if ((0 == optimalWidth) || (0 == optimalHeight)) {
   1717             // Optimal size not found
   1718             // Validate thumbnail size
   1719             for (size_t i = 0; i < sizes_cnt; i++) {
   1720                 if (width == THUMBNAIL_SIZES_MAP[i].width &&
   1721                     height == THUMBNAIL_SIZES_MAP[i].height) {
   1722                     optimalWidth = width;
   1723                     optimalHeight = height;
   1724                     break;
   1725                 }
   1726             }
   1727         }
   1728     }
   1729 
   1730     set(KEY_JPEG_THUMBNAIL_WIDTH, optimalWidth);
   1731     set(KEY_JPEG_THUMBNAIL_HEIGHT, optimalHeight);
   1732     return NO_ERROR;
   1733 }
   1734 
   1735 /*===========================================================================
   1736 
   1737  * FUNCTION   : setBurstLEDOnPeriod
   1738  *
   1739  * DESCRIPTION: set burst LED on period
   1740  *
   1741  * PARAMETERS :
   1742  *   @params  : user setting parameters
   1743  *
   1744  * RETURN     : int32_t type of status
   1745  *              NO_ERROR  -- success
   1746  *              none-zero failure code
   1747  *==========================================================================*/
   1748 int32_t QCameraParameters::setBurstLEDOnPeriod(const QCameraParameters& params)
   1749 {
   1750     int nBurstLEDOnPeriod = params.getInt(KEY_QC_SNAPSHOT_BURST_LED_ON_PERIOD);
   1751     //Check if the LED ON period is within limits
   1752     if ((nBurstLEDOnPeriod <= 0) || (nBurstLEDOnPeriod > 800)) {
   1753         // if burst led on period is not set in parameters,
   1754         // read from sys prop
   1755         char prop[PROPERTY_VALUE_MAX];
   1756         memset(prop, 0, sizeof(prop));
   1757         property_get("persist.camera.led.on.period", prop, "0");
   1758         nBurstLEDOnPeriod = atoi(prop);
   1759         if (nBurstLEDOnPeriod <= 0) {
   1760             nBurstLEDOnPeriod = 300;
   1761         }
   1762     }
   1763 
   1764     set(KEY_QC_SNAPSHOT_BURST_LED_ON_PERIOD, nBurstLEDOnPeriod);
   1765     m_nBurstLEDOnPeriod = nBurstLEDOnPeriod;
   1766     CDBG_HIGH("%s: Burst LED on period  %u", __func__, m_nBurstLEDOnPeriod);
   1767     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_BURST_LED_ON_PERIOD,
   1768             (uint32_t)nBurstLEDOnPeriod)) {
   1769         return BAD_VALUE;
   1770     }
   1771 
   1772     return NO_ERROR;
   1773 }
   1774 
   1775 
   1776 
   1777 /*===========================================================================
   1778  * FUNCTION   : setRetroActiveBurstNum
   1779  *
   1780  * DESCRIPTION: set retro active burst num
   1781  *
   1782  * PARAMETERS :
   1783  *   @params  : user setting parameters
   1784  *
   1785  * RETURN     : int32_t type of status
   1786  *              NO_ERROR  -- success
   1787  *              none-zero failure code
   1788  *==========================================================================*/
   1789 int32_t QCameraParameters::setRetroActiveBurstNum(
   1790         const QCameraParameters& params)
   1791 {
   1792     int32_t nBurstNum = params.getInt(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER);
   1793     CDBG_HIGH("%s:[ZSL Retro] m_nRetroBurstNum = %d", __func__, m_nRetroBurstNum);
   1794     if (nBurstNum <= 0) {
   1795         // if burst number is not set in parameters,
   1796         // read from sys prop
   1797         char prop[PROPERTY_VALUE_MAX];
   1798         memset(prop, 0, sizeof(prop));
   1799         property_get("persist.camera.retro.number", prop, "0");
   1800         nBurstNum = atoi(prop);
   1801         if (nBurstNum < 0) {
   1802             nBurstNum = 0;
   1803         }
   1804     }
   1805 
   1806     set(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER, nBurstNum);
   1807 
   1808     m_nRetroBurstNum = nBurstNum;
   1809     CDBG_HIGH("%s: [ZSL Retro] m_nRetroBurstNum = %d", __func__, m_nRetroBurstNum);
   1810     return NO_ERROR;
   1811 }
   1812 
   1813 /*===========================================================================
   1814  * FUNCTION   : setJpegQuality
   1815  *
   1816  * DESCRIPTION: set jpeg encpding quality from user setting
   1817  *
   1818  * PARAMETERS :
   1819  *   @params  : user setting parameters
   1820  *
   1821  * RETURN     : int32_t type of status
   1822  *              NO_ERROR  -- success
   1823  *              none-zero failure code
   1824  *==========================================================================*/
   1825 int32_t QCameraParameters::setJpegQuality(const QCameraParameters& params)
   1826 {
   1827     int32_t rc = NO_ERROR;
   1828     int quality = params.getInt(KEY_JPEG_QUALITY);
   1829     if (quality >= 0 && quality <= 100) {
   1830         set(KEY_JPEG_QUALITY, quality);
   1831     } else {
   1832         ALOGE("%s: Invalid jpeg quality=%d", __func__, quality);
   1833         rc = BAD_VALUE;
   1834     }
   1835 
   1836     quality = params.getInt(KEY_JPEG_THUMBNAIL_QUALITY);
   1837     if (quality >= 0 && quality <= 100) {
   1838         set(KEY_JPEG_THUMBNAIL_QUALITY, quality);
   1839     } else {
   1840         ALOGE("%s: Invalid jpeg thumbnail quality=%d", __func__, quality);
   1841         rc = BAD_VALUE;
   1842     }
   1843     return rc;
   1844 }
   1845 
   1846 /*===========================================================================
   1847  * FUNCTION   : setOrientaion
   1848  *
   1849  * DESCRIPTION: set orientaion from user setting
   1850  *
   1851  * PARAMETERS :
   1852  *   @params  : user setting parameters
   1853  *
   1854  * RETURN     : int32_t type of status
   1855  *              NO_ERROR  -- success
   1856  *              none-zero failure code
   1857  *==========================================================================*/
   1858 int32_t QCameraParameters::setOrientation(const QCameraParameters& params)
   1859 {
   1860     const char *str = params.get(KEY_QC_ORIENTATION);
   1861 
   1862     if (str != NULL) {
   1863         if (strcmp(str, portrait) == 0 || strcmp(str, landscape) == 0) {
   1864             // Camera service needs this to decide if the preview frames and raw
   1865             // pictures should be rotated.
   1866             set(KEY_QC_ORIENTATION, str);
   1867         } else {
   1868             ALOGE("%s: Invalid orientation value: %s", __func__, str);
   1869             return BAD_VALUE;
   1870         }
   1871     }
   1872     return NO_ERROR;
   1873 }
   1874 
   1875 /*===========================================================================
   1876  * FUNCTION   : setAutoExposure
   1877  *
   1878  * DESCRIPTION: set auto exposure value from user setting
   1879  *
   1880  * PARAMETERS :
   1881  *   @params  : user setting parameters
   1882  *
   1883  * RETURN     : int32_t type of status
   1884  *              NO_ERROR  -- success
   1885  *              none-zero failure code
   1886  *==========================================================================*/
   1887 int32_t QCameraParameters::setAutoExposure(const QCameraParameters& params)
   1888 {
   1889     const char *str = params.get(KEY_QC_AUTO_EXPOSURE);
   1890     const char *prev_str = get(KEY_QC_AUTO_EXPOSURE);
   1891     if (str != NULL) {
   1892         if (prev_str == NULL ||
   1893             strcmp(str, prev_str) != 0) {
   1894             return setAutoExposure(str);
   1895         }
   1896     }
   1897     return NO_ERROR;
   1898 }
   1899 
   1900 /*===========================================================================
   1901  * FUNCTION   : setPreviewFpsRange
   1902  *
   1903  * DESCRIPTION: set preview FPS range from user setting
   1904  *
   1905  * PARAMETERS :
   1906  *   @params  : user setting parameters
   1907  *
   1908  * RETURN     : int32_t type of status
   1909  *              NO_ERROR  -- success
   1910  *              none-zero failure code
   1911  *==========================================================================*/
   1912 int32_t QCameraParameters::setPreviewFpsRange(const QCameraParameters& params)
   1913 {
   1914     int minFps,maxFps;
   1915     int prevMinFps, prevMaxFps, vidMinFps, vidMaxFps;
   1916     int rc = NO_ERROR;
   1917     bool found = false, updateNeeded = false;
   1918 
   1919     CameraParameters::getPreviewFpsRange(&prevMinFps, &prevMaxFps);
   1920     params.getPreviewFpsRange(&minFps, &maxFps);
   1921 
   1922     CDBG_HIGH("%s: FpsRange Values:(%d, %d)", __func__, prevMinFps, prevMaxFps);
   1923     CDBG_HIGH("%s: Requested FpsRange Values:(%d, %d)", __func__, minFps, maxFps);
   1924 
   1925     //first check if we need to change fps because of HFR mode change
   1926     updateNeeded = UpdateHFRFrameRate(params);
   1927     if (updateNeeded) {
   1928         m_bNeedRestart = true;
   1929         rc = setHighFrameRate(mHfrMode);
   1930         if (rc != NO_ERROR) goto end;
   1931     }
   1932     CDBG_HIGH("%s: UpdateHFRFrameRate %d", __func__, updateNeeded);
   1933 
   1934     vidMinFps = (int)m_hfrFpsRange.video_min_fps;
   1935     vidMaxFps = (int)m_hfrFpsRange.video_max_fps;
   1936 
   1937     if(minFps == prevMinFps && maxFps == prevMaxFps) {
   1938         if ( m_bFixedFrameRateSet ) {
   1939             minFps = params.getPreviewFrameRate() * 1000;
   1940             maxFps = params.getPreviewFrameRate() * 1000;
   1941             m_bFixedFrameRateSet = false;
   1942         } else if (!updateNeeded) {
   1943             CDBG_HIGH("%s: No change in FpsRange", __func__);
   1944             rc = NO_ERROR;
   1945             goto end;
   1946         }
   1947     }
   1948     for(size_t i = 0; i < m_pCapability->fps_ranges_tbl_cnt; i++) {
   1949         // if the value is in the supported list
   1950         if (minFps >= m_pCapability->fps_ranges_tbl[i].min_fps * 1000 &&
   1951                 maxFps <= m_pCapability->fps_ranges_tbl[i].max_fps * 1000) {
   1952             found = true;
   1953             CDBG_HIGH("%s: FPS i=%d : minFps = %d, maxFps = %d"
   1954                     " vidMinFps = %d, vidMaxFps = %d",
   1955                     __func__, i, minFps, maxFps,
   1956                     (int)m_hfrFpsRange.video_min_fps,
   1957                     (int)m_hfrFpsRange.video_max_fps);
   1958             if ((0.0f >= m_hfrFpsRange.video_min_fps) ||
   1959                     (0.0f >= m_hfrFpsRange.video_max_fps)) {
   1960                 vidMinFps = minFps;
   1961                 vidMaxFps = maxFps;
   1962             }
   1963             else {
   1964                 vidMinFps = (int)m_hfrFpsRange.video_min_fps;
   1965                 vidMaxFps = (int)m_hfrFpsRange.video_max_fps;
   1966             }
   1967 
   1968             setPreviewFpsRange(minFps, maxFps, vidMinFps, vidMaxFps);
   1969             break;
   1970         }
   1971     }
   1972     if(found == false){
   1973         ALOGE("%s: error: FPS range value not supported", __func__);
   1974         rc = BAD_VALUE;
   1975     }
   1976 end:
   1977     return rc;
   1978 }
   1979 
   1980 /*===========================================================================
   1981  * FUNCTION   : UpdateHFRFrameRate
   1982  *
   1983  * DESCRIPTION: set preview FPS range based on HFR setting
   1984  *
   1985  * PARAMETERS :
   1986  *   @params  : user setting parameters
   1987  *
   1988  * RETURN     : bool true/false
   1989  *                  true -if HAL needs to overwrite FPS range set by app, false otherwise.
   1990  *==========================================================================*/
   1991 
   1992 bool QCameraParameters::UpdateHFRFrameRate(const QCameraParameters& params)
   1993 {
   1994     bool updateNeeded = false;
   1995     int min_fps, max_fps;
   1996     int32_t hfrMode = CAM_HFR_MODE_OFF;
   1997     int32_t newHfrMode = CAM_HFR_MODE_OFF;
   1998 
   1999     int parm_minfps,parm_maxfps;
   2000     int prevMinFps, prevMaxFps;
   2001     CameraParameters::getPreviewFpsRange(&prevMinFps, &prevMaxFps);
   2002     params.getPreviewFpsRange(&parm_minfps, &parm_maxfps);
   2003     CDBG_HIGH("%s: CameraParameters - : minFps = %d, maxFps = %d ",
   2004                 __func__, prevMinFps, prevMaxFps);
   2005     CDBG_HIGH("%s: Requested params - : minFps = %d, maxFps = %d ",
   2006                 __func__, parm_minfps, parm_maxfps);
   2007 
   2008     const char *hfrStr = params.get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
   2009     const char *hsrStr = params.get(KEY_QC_VIDEO_HIGH_SPEED_RECORDING);
   2010 
   2011     const char *prev_hfrStr = CameraParameters::get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
   2012     const char *prev_hsrStr = CameraParameters::get(KEY_QC_VIDEO_HIGH_SPEED_RECORDING);
   2013 
   2014     if ((hfrStr != NULL) && (prev_hfrStr != NULL) && strcmp(hfrStr, prev_hfrStr)) {
   2015         updateParamEntry(KEY_QC_VIDEO_HIGH_FRAME_RATE, hfrStr);
   2016     }
   2017 
   2018     if ((hsrStr != NULL) && (prev_hsrStr != NULL) && strcmp(hsrStr, prev_hsrStr)) {
   2019         updateParamEntry(KEY_QC_VIDEO_HIGH_SPEED_RECORDING, hsrStr);
   2020 
   2021     }
   2022 
   2023     // check if HFR is enabled
   2024     if ((hfrStr != NULL) && strcmp(hfrStr, "off")) {
   2025         hfrMode = lookupAttr(HFR_MODES_MAP, PARAM_MAP_SIZE(HFR_MODES_MAP), hfrStr);
   2026         if (NAME_NOT_FOUND != hfrMode) newHfrMode = hfrMode;
   2027     }
   2028     // check if HSR is enabled
   2029     else if ((hsrStr != NULL) && strcmp(hsrStr, "off")) {
   2030         hfrMode = lookupAttr(HFR_MODES_MAP, PARAM_MAP_SIZE(HFR_MODES_MAP), hsrStr);
   2031         if (NAME_NOT_FOUND != hfrMode) newHfrMode = hfrMode;
   2032     }
   2033     CDBG_HIGH("%s: prevHfrMode - %d, currentHfrMode = %d ",
   2034                 __func__, mHfrMode, newHfrMode);
   2035 
   2036     if (mHfrMode != newHfrMode) {
   2037         updateNeeded = true;
   2038         mHfrMode = newHfrMode;
   2039         switch (mHfrMode) {
   2040             case CAM_HFR_MODE_60FPS:
   2041                 min_fps = 60000;
   2042                 max_fps = 60000;
   2043                 break;
   2044             case CAM_HFR_MODE_90FPS:
   2045                 min_fps = 90000;
   2046                 max_fps = 90000;
   2047                 break;
   2048             case CAM_HFR_MODE_120FPS:
   2049                 min_fps = 120000;
   2050                 max_fps = 120000;
   2051                 break;
   2052             case CAM_HFR_MODE_150FPS:
   2053                 min_fps = 150000;
   2054                 max_fps = 150000;
   2055                 break;
   2056             case CAM_HFR_MODE_180FPS:
   2057                 min_fps = 180000;
   2058                 max_fps = 180000;
   2059                 break;
   2060             case CAM_HFR_MODE_210FPS:
   2061                 min_fps = 210000;
   2062                 max_fps = 210000;
   2063                 break;
   2064             case CAM_HFR_MODE_240FPS:
   2065                 min_fps = 240000;
   2066                 max_fps = 240000;
   2067                 break;
   2068             case CAM_HFR_MODE_480FPS:
   2069                 min_fps = 480000;
   2070                 max_fps = 480000;
   2071                 break;
   2072             case CAM_HFR_MODE_OFF:
   2073             default:
   2074                 // Set Video Fps to zero
   2075                 min_fps = 0;
   2076                 max_fps = 0;
   2077                 break;
   2078         }
   2079         m_hfrFpsRange.video_min_fps = (float)min_fps;
   2080         m_hfrFpsRange.video_max_fps = (float)max_fps;
   2081 
   2082         CDBG_HIGH("%s: HFR mode (%d) Set video FPS : minFps = %d, maxFps = %d ",
   2083                 __func__, mHfrMode, min_fps, max_fps);
   2084     }
   2085 
   2086     m_hfrFpsRange.min_fps = (float)parm_minfps;
   2087     m_hfrFpsRange.max_fps = (float)parm_maxfps;
   2088 
   2089     // Remember if HFR mode is ON
   2090     if ((mHfrMode > CAM_HFR_MODE_OFF) && (mHfrMode < CAM_HFR_MODE_MAX)) {
   2091         CDBG_HIGH("HFR mode is ON");
   2092         m_bHfrMode = true;
   2093     } else {
   2094         m_hfrFpsRange.video_min_fps = 0;
   2095         m_hfrFpsRange.video_max_fps = 0;
   2096         m_bHfrMode = false;
   2097         CDBG_HIGH("HFR mode is OFF");
   2098     }
   2099 
   2100     if (m_bHfrMode && (mHfrMode > CAM_HFR_MODE_120FPS)
   2101             && (parm_maxfps != 0)) {
   2102         /* Setting Buffer batch count to use batch mode for higher fps*/
   2103         setBufBatchCount((int8_t)(m_hfrFpsRange.video_max_fps / parm_maxfps));
   2104     }
   2105 
   2106     return updateNeeded;
   2107 }
   2108 
   2109 /*===========================================================================
   2110  * FUNCTION   : setPreviewFrameRate
   2111  *
   2112  * DESCRIPTION: set preview frame rate from user setting
   2113  *
   2114  * PARAMETERS :
   2115  *   @params  : user setting parameters
   2116  *
   2117  * RETURN     : int32_t type of status
   2118  *              NO_ERROR  -- success
   2119  *              none-zero failure code
   2120  *==========================================================================*/
   2121 int32_t QCameraParameters::setPreviewFrameRate(const QCameraParameters& params)
   2122 {
   2123     const char *str = params.get(KEY_PREVIEW_FRAME_RATE);
   2124     const char *prev_str = get(KEY_PREVIEW_FRAME_RATE);
   2125 
   2126     if ( str ) {
   2127         if ( prev_str &&
   2128              strcmp(str, prev_str)) {
   2129             CDBG("%s: Requested Fixed Frame Rate %s", __func__, str);
   2130             updateParamEntry(KEY_PREVIEW_FRAME_RATE, str);
   2131             m_bFixedFrameRateSet = true;
   2132         }
   2133     }
   2134     return NO_ERROR;
   2135 }
   2136 
   2137 /*===========================================================================
   2138  * FUNCTION   : setEffect
   2139  *
   2140  * DESCRIPTION: set effect 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::setEffect(const QCameraParameters& params)
   2150 {
   2151     const char *str = params.get(KEY_EFFECT);
   2152     const char *prev_str = get(KEY_EFFECT);
   2153     if (str != NULL) {
   2154         if (prev_str == NULL ||
   2155             strcmp(str, prev_str) != 0 ||
   2156             m_bUpdateEffects == true ) {
   2157             m_bUpdateEffects = false;
   2158             return setEffect(str);
   2159         }
   2160     }
   2161     return NO_ERROR;
   2162 }
   2163 
   2164 /*===========================================================================
   2165  * FUNCTION   : setFocusMode
   2166  *
   2167  * DESCRIPTION: set focus mode from user setting
   2168  *
   2169  * PARAMETERS :
   2170  *   @params  : user setting parameters
   2171  *
   2172  * RETURN     : int32_t type of status
   2173  *              NO_ERROR  -- success
   2174  *              none-zero failure code
   2175  *==========================================================================*/
   2176 int32_t QCameraParameters::setFocusMode(const QCameraParameters& params)
   2177 {
   2178     const char *str = params.get(KEY_FOCUS_MODE);
   2179     const char *prev_str = get(KEY_FOCUS_MODE);
   2180     if (str != NULL) {
   2181         if (prev_str == NULL ||
   2182             strcmp(str, prev_str) != 0) {
   2183             return setFocusMode(str);
   2184         }
   2185     }
   2186     return NO_ERROR;
   2187 }
   2188 
   2189 /*===========================================================================
   2190  * FUNCTION   : setFocusPosition
   2191  *
   2192  * DESCRIPTION: set focus position from user setting
   2193  *
   2194  * PARAMETERS :
   2195  *   @params  : user setting parameters
   2196  *
   2197  * RETURN     : int32_t type of status
   2198  *              NO_ERROR  -- success
   2199  *              none-zero failure code
   2200  *==========================================================================*/
   2201 int32_t  QCameraParameters::setFocusPosition(const QCameraParameters& params)
   2202 {
   2203     const char *focus_str = params.get(KEY_FOCUS_MODE);
   2204 
   2205     if (NULL == focus_str) {
   2206         return NO_ERROR;
   2207     }
   2208 
   2209     CDBG("%s, current focus mode: %s", __func__, focus_str);
   2210     if (strcmp(focus_str, FOCUS_MODE_MANUAL_POSITION)) {
   2211         CDBG_HIGH("%s, dont set focus pos to back-end!", __func__);
   2212         return NO_ERROR;
   2213     }
   2214 
   2215     const char *pos = params.get(KEY_QC_MANUAL_FOCUS_POSITION);
   2216     const char *prev_pos = get(KEY_QC_MANUAL_FOCUS_POSITION);
   2217     const char *type = params.get(KEY_QC_MANUAL_FOCUS_POS_TYPE);
   2218     const char *prev_type = get(KEY_QC_MANUAL_FOCUS_POS_TYPE);
   2219 
   2220     if ((pos != NULL) && (type != NULL)) {
   2221         if (prev_pos  == NULL || (strcmp(pos, prev_pos) != 0) ||
   2222                 prev_type == NULL || (strcmp(type, prev_type) != 0)) {
   2223             return setFocusPosition(type, pos);
   2224         }
   2225     }
   2226 
   2227     return NO_ERROR;
   2228 }
   2229 
   2230 /*===========================================================================
   2231  * FUNCTION   : setBrightness
   2232  *
   2233  * DESCRIPTION: set brightness control value from user setting
   2234  *
   2235  * PARAMETERS :
   2236  *   @params  : user setting parameters
   2237  *
   2238  * RETURN     : int32_t type of status
   2239  *              NO_ERROR  -- success
   2240  *              none-zero failure code
   2241  *==========================================================================*/
   2242 int32_t QCameraParameters::setBrightness(const QCameraParameters& params)
   2243 {
   2244     int currentBrightness = getInt(KEY_QC_BRIGHTNESS);
   2245     int brightness = params.getInt(KEY_QC_BRIGHTNESS);
   2246 
   2247     if(params.get(KEY_QC_BRIGHTNESS) == NULL) {
   2248        CDBG_HIGH("%s: Brigtness not set by App ",__func__);
   2249        return NO_ERROR;
   2250     }
   2251     if (currentBrightness !=  brightness) {
   2252         if (brightness >= m_pCapability->brightness_ctrl.min_value &&
   2253             brightness <= m_pCapability->brightness_ctrl.max_value) {
   2254             CDBG(" new brightness value : %d ", brightness);
   2255             return setBrightness(brightness);
   2256         } else {
   2257             ALOGE("%s: invalid value %d out of (%d, %d)",
   2258                   __func__, brightness,
   2259                   m_pCapability->brightness_ctrl.min_value,
   2260                   m_pCapability->brightness_ctrl.max_value);
   2261             return BAD_VALUE;
   2262         }
   2263     } else {
   2264         CDBG("%s: No brightness value changed.", __func__);
   2265         return NO_ERROR;
   2266     }
   2267 }
   2268 
   2269 /*===========================================================================
   2270  * FUNCTION   : getBrightness
   2271  *
   2272  * DESCRIPTION: get brightness control value from user setting
   2273  *
   2274  * PARAMETERS :
   2275  *   @params  : user setting parameters
   2276  *
   2277  * RETURN     : int32_t type of status
   2278  *              NO_ERROR  -- success
   2279  *              none-zero failure code
   2280  *==========================================================================*/
   2281 int QCameraParameters::getBrightness()
   2282 {
   2283     return getInt(KEY_QC_BRIGHTNESS);
   2284 }
   2285 
   2286 /*===========================================================================
   2287  * FUNCTION   : setSharpness
   2288  *
   2289  * DESCRIPTION: set sharpness control value from user setting
   2290  *
   2291  * PARAMETERS :
   2292  *   @params  : user setting parameters
   2293  *
   2294  * RETURN     : int32_t type of status
   2295  *              NO_ERROR  -- success
   2296  *              none-zero failure code
   2297  *==========================================================================*/
   2298 int32_t QCameraParameters::setSharpness(const QCameraParameters& params)
   2299 {
   2300     int shaprness = params.getInt(KEY_QC_SHARPNESS);
   2301     int prev_sharp = getInt(KEY_QC_SHARPNESS);
   2302 
   2303     if(params.get(KEY_QC_SHARPNESS) == NULL) {
   2304        CDBG_HIGH("%s: Sharpness not set by App ",__func__);
   2305        return NO_ERROR;
   2306     }
   2307     if (prev_sharp !=  shaprness) {
   2308         if((shaprness >= m_pCapability->sharpness_ctrl.min_value) &&
   2309            (shaprness <= m_pCapability->sharpness_ctrl.max_value)) {
   2310             CDBG(" new sharpness value : %d ", shaprness);
   2311             return setSharpness(shaprness);
   2312         } else {
   2313             ALOGE("%s: invalid value %d out of (%d, %d)",
   2314                   __func__, shaprness,
   2315                   m_pCapability->sharpness_ctrl.min_value,
   2316                   m_pCapability->sharpness_ctrl.max_value);
   2317             return BAD_VALUE;
   2318         }
   2319     } else {
   2320         CDBG("%s: No value change in shaprness", __func__);
   2321         return NO_ERROR;
   2322     }
   2323 }
   2324 
   2325 /*===========================================================================
   2326  * FUNCTION   : setSkintoneEnahancement
   2327  *
   2328  * DESCRIPTION: set skin tone enhancement factor from user setting
   2329  *
   2330  * PARAMETERS :
   2331  *   @params  : user setting parameters
   2332  *
   2333  * RETURN     : int32_t type of status
   2334  *              NO_ERROR  -- success
   2335  *              none-zero failure code
   2336  *==========================================================================*/
   2337 int32_t QCameraParameters::setSkinToneEnhancement(const QCameraParameters& params)
   2338 {
   2339     int sceFactor = params.getInt(KEY_QC_SCE_FACTOR);
   2340     int prev_sceFactor = getInt(KEY_QC_SCE_FACTOR);
   2341 
   2342     if(params.get(KEY_QC_SCE_FACTOR) == NULL) {
   2343        CDBG_HIGH("%s: Skintone enhancement not set by App ",__func__);
   2344        return NO_ERROR;
   2345     }
   2346     if (prev_sceFactor != sceFactor) {
   2347         if((sceFactor >= m_pCapability->sce_ctrl.min_value) &&
   2348            (sceFactor <= m_pCapability->sce_ctrl.max_value)) {
   2349             CDBG(" new Skintone Enhancement value : %d ", sceFactor);
   2350             return setSkinToneEnhancement(sceFactor);
   2351         } else {
   2352             ALOGE("%s: invalid value %d out of (%d, %d)",
   2353                   __func__, sceFactor,
   2354                   m_pCapability->sce_ctrl.min_value,
   2355                   m_pCapability->sce_ctrl.max_value);
   2356             return BAD_VALUE;
   2357         }
   2358     } else {
   2359         CDBG("%s: No value change in skintone enhancement factor", __func__);
   2360         return NO_ERROR;
   2361     }
   2362 }
   2363 
   2364 /*===========================================================================
   2365  * FUNCTION   : setSaturation
   2366  *
   2367  * DESCRIPTION: set saturation control value from user setting
   2368  *
   2369  * PARAMETERS :
   2370  *   @params  : user setting parameters
   2371  *
   2372  * RETURN     : int32_t type of status
   2373  *              NO_ERROR  -- success
   2374  *              none-zero failure code
   2375  *==========================================================================*/
   2376 int32_t QCameraParameters::setSaturation(const QCameraParameters& params)
   2377 {
   2378     int saturation = params.getInt(KEY_QC_SATURATION);
   2379     int prev_sat = getInt(KEY_QC_SATURATION);
   2380 
   2381     if(params.get(KEY_QC_SATURATION) == NULL) {
   2382        CDBG_HIGH("%s: Saturation not set by App ",__func__);
   2383        return NO_ERROR;
   2384     }
   2385     if (prev_sat !=  saturation) {
   2386         if((saturation >= m_pCapability->saturation_ctrl.min_value) &&
   2387            (saturation <= m_pCapability->saturation_ctrl.max_value)) {
   2388             CDBG(" new saturation value : %d ", saturation);
   2389             return setSaturation(saturation);
   2390         } else {
   2391             ALOGE("%s: invalid value %d out of (%d, %d)",
   2392                   __func__, saturation,
   2393                   m_pCapability->saturation_ctrl.min_value,
   2394                   m_pCapability->saturation_ctrl.max_value);
   2395             return BAD_VALUE;
   2396         }
   2397     } else {
   2398         CDBG("%s: No value change in saturation factor", __func__);
   2399         return NO_ERROR;
   2400     }
   2401 }
   2402 
   2403 /*===========================================================================
   2404  * FUNCTION   : setContrast
   2405  *
   2406  * DESCRIPTION: set contrast control value from user setting
   2407  *
   2408  * PARAMETERS :
   2409  *   @params  : user setting parameters
   2410  *
   2411  * RETURN     : int32_t type of status
   2412  *              NO_ERROR  -- success
   2413  *              none-zero failure code
   2414  *==========================================================================*/
   2415 int32_t QCameraParameters::setContrast(const QCameraParameters& params)
   2416 {
   2417     int contrast = params.getInt(KEY_QC_CONTRAST);
   2418     int prev_contrast = getInt(KEY_QC_CONTRAST);
   2419 
   2420     if(params.get(KEY_QC_CONTRAST) == NULL) {
   2421        CDBG_HIGH("%s: Contrast not set by App ",__func__);
   2422        return NO_ERROR;
   2423     }
   2424     if (prev_contrast !=  contrast) {
   2425         if((contrast >= m_pCapability->contrast_ctrl.min_value) &&
   2426            (contrast <= m_pCapability->contrast_ctrl.max_value)) {
   2427             CDBG(" new contrast value : %d ", contrast);
   2428             int32_t rc = setContrast(contrast);
   2429             return rc;
   2430         } else {
   2431             ALOGE("%s: invalid value %d out of (%d, %d)",
   2432                   __func__, contrast,
   2433                   m_pCapability->contrast_ctrl.min_value,
   2434                   m_pCapability->contrast_ctrl.max_value);
   2435             return BAD_VALUE;
   2436         }
   2437     } else {
   2438         CDBG("%s: No value change in contrast", __func__);
   2439         return NO_ERROR;
   2440     }
   2441 }
   2442 
   2443 /*===========================================================================
   2444  * FUNCTION   : setExposureCompensation
   2445  *
   2446  * DESCRIPTION: set exposure compensation value from user setting
   2447  *
   2448  * PARAMETERS :
   2449  *   @params  : user setting parameters
   2450  *
   2451  * RETURN     : int32_t type of status
   2452  *              NO_ERROR  -- success
   2453  *              none-zero failure code
   2454  *==========================================================================*/
   2455 int32_t QCameraParameters::setExposureCompensation(const QCameraParameters & params)
   2456 {
   2457     int expComp = params.getInt(KEY_EXPOSURE_COMPENSATION);
   2458     int prev_expComp = getInt(KEY_EXPOSURE_COMPENSATION);
   2459 
   2460     if(params.get(KEY_EXPOSURE_COMPENSATION) == NULL) {
   2461        CDBG_HIGH("%s: Exposure compensation not set by App ",__func__);
   2462        return NO_ERROR;
   2463     }
   2464     if (prev_expComp != expComp) {
   2465         if((expComp >= m_pCapability->exposure_compensation_min) &&
   2466            (expComp <= m_pCapability->exposure_compensation_max)) {
   2467             CDBG(" new Exposure Compensation value : %d ", expComp);
   2468             return setExposureCompensation(expComp);
   2469         } else {
   2470             ALOGE("%s: invalid value %d out of (%d, %d)",
   2471                   __func__, expComp,
   2472                   m_pCapability->exposure_compensation_min,
   2473                   m_pCapability->exposure_compensation_max);
   2474             return BAD_VALUE;
   2475         }
   2476     } else {
   2477         CDBG("%s: No value change in Exposure Compensation", __func__);
   2478         return NO_ERROR;
   2479     }
   2480 }
   2481 
   2482 /*===========================================================================
   2483  * FUNCTION   : setWhiteBalance
   2484  *
   2485  * DESCRIPTION: set white balance value from user setting
   2486  *
   2487  * PARAMETERS :
   2488  *   @params  : user setting parameters
   2489  *
   2490  * RETURN     : int32_t type of status
   2491  *              NO_ERROR  -- success
   2492  *              none-zero failure code
   2493  *==========================================================================*/
   2494 int32_t QCameraParameters::setWhiteBalance(const QCameraParameters& params)
   2495 {
   2496     const char *str = params.get(KEY_WHITE_BALANCE);
   2497     const char *prev_str = get(KEY_WHITE_BALANCE);
   2498     if (str != NULL) {
   2499         if (prev_str == NULL ||
   2500             strcmp(str, prev_str) != 0) {
   2501             return setWhiteBalance(str);
   2502         }
   2503     }
   2504     return NO_ERROR;
   2505 }
   2506 
   2507 /*===========================================================================
   2508  * FUNCTION   : setManualWhiteBalance
   2509  *
   2510  * DESCRIPTION: set manual white balance from user setting
   2511  *
   2512  * PARAMETERS :
   2513  *   @params  : user setting parameters
   2514  *
   2515  * RETURN     : int32_t type of status
   2516  *              NO_ERROR  -- success
   2517  *              none-zero failure code
   2518  *==========================================================================*/
   2519 int32_t  QCameraParameters::setManualWhiteBalance(const QCameraParameters& params)
   2520 {
   2521     int32_t rc = NO_ERROR;
   2522     const char *wb_str = params.get(KEY_WHITE_BALANCE);
   2523     CDBG("%s, current wb mode: %s", __func__, wb_str);
   2524 
   2525     if (wb_str != NULL) {
   2526         if (strcmp(wb_str, WHITE_BALANCE_MANUAL)) {
   2527             CDBG("%s, dont set cct to back-end.", __func__);
   2528             return NO_ERROR;
   2529         }
   2530     }
   2531 
   2532     const char *value = params.get(KEY_QC_MANUAL_WB_VALUE);
   2533     const char *prev_value = get(KEY_QC_MANUAL_WB_VALUE);
   2534     const char *type = params.get(KEY_QC_MANUAL_WB_TYPE);
   2535     const char *prev_type = get(KEY_QC_MANUAL_WB_TYPE);
   2536 
   2537     if ((value != NULL) && (type != NULL)) {
   2538         if (prev_value  == NULL || (strcmp(value, prev_value) != 0) ||
   2539                 prev_type == NULL || (strcmp(type, prev_type) != 0)) {
   2540             updateParamEntry(KEY_QC_MANUAL_WB_TYPE, type);
   2541             updateParamEntry(KEY_QC_MANUAL_WB_VALUE, value);
   2542             int32_t wb_type = atoi(type);
   2543             if (wb_type == CAM_MANUAL_WB_MODE_CCT) {
   2544                 rc = setWBManualCCT(value);
   2545             } else if (wb_type == CAM_MANUAL_WB_MODE_GAIN) {
   2546                 rc = setManualWBGains(value);
   2547             } else {
   2548                 rc = BAD_VALUE;
   2549             }
   2550         }
   2551     }
   2552     return rc;
   2553 }
   2554 
   2555 /*===========================================================================
   2556  * FUNCTION   : setAntibanding
   2557  *
   2558  * DESCRIPTION: set antibanding value from user setting
   2559  *
   2560  * PARAMETERS :
   2561  *   @params  : user setting parameters
   2562  *
   2563  * RETURN     : int32_t type of status
   2564  *              NO_ERROR  -- success
   2565  *              none-zero failure code
   2566  *==========================================================================*/
   2567 int32_t QCameraParameters::setAntibanding(const QCameraParameters& params)
   2568 {
   2569     const char *str = params.get(KEY_ANTIBANDING);
   2570     const char *prev_str = get(KEY_ANTIBANDING);
   2571     if (str != NULL) {
   2572         if (prev_str == NULL ||
   2573             strcmp(str, prev_str) != 0) {
   2574             return setAntibanding(str);
   2575         }
   2576     }
   2577     return NO_ERROR;
   2578 }
   2579 
   2580 /*===========================================================================
   2581  * FUNCTION   : setStatsDebugMask
   2582  *
   2583  * DESCRIPTION: get the value from persist file in Stats module that will
   2584  *              control funtionality in the module
   2585  *
   2586  * PARAMETERS : none
   2587  *
   2588  * RETURN     : int32_t type of status
   2589  *              NO_ERROR  -- success
   2590  *              none-zero failure code
   2591  *==========================================================================*/
   2592 int32_t QCameraParameters::setStatsDebugMask()
   2593 {
   2594     uint32_t mask = 0;
   2595     char value[PROPERTY_VALUE_MAX];
   2596 
   2597     property_get("persist.camera.stats.debug.mask", value, "0");
   2598     mask = (uint32_t)atoi(value);
   2599 
   2600     CDBG_HIGH("%s: ctrl mask :%d", __func__, mask);
   2601 
   2602     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_STATS_DEBUG_MASK, mask)) {
   2603         return BAD_VALUE;
   2604     }
   2605 
   2606     return NO_ERROR;
   2607 }
   2608 
   2609 /*===========================================================================
   2610  * FUNCTION   : setPAAF
   2611  *
   2612  * DESCRIPTION: get the value from persist file in Stats module that will
   2613  *              control the preview assisted AF in the module
   2614  *
   2615  * PARAMETERS : none
   2616  *
   2617  * RETURN     : int32_t type of status
   2618  *              NO_ERROR  -- success
   2619  *              none-zero failure code
   2620  *==========================================================================*/
   2621 int32_t QCameraParameters::setPAAF()
   2622 {
   2623     uint32_t paaf = 0;
   2624     char value[PROPERTY_VALUE_MAX];
   2625 
   2626     property_get("persist.camera.stats.af.paaf", value, "1");
   2627     paaf = (uint32_t)atoi(value);
   2628 
   2629     CDBG_HIGH("%s: PAAF is: %s", __func__, paaf ? "ON": "OFF");
   2630 
   2631     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_STATS_AF_PAAF, paaf)) {
   2632         return BAD_VALUE;
   2633     }
   2634 
   2635     return NO_ERROR;
   2636 }
   2637 
   2638 /*===========================================================================
   2639  * FUNCTION   : setSceneDetect
   2640  *
   2641  * DESCRIPTION: set scenen detect value from user setting
   2642  *
   2643  * PARAMETERS :
   2644  *   @params  : user setting parameters
   2645  *
   2646  * RETURN     : int32_t type of status
   2647  *              NO_ERROR  -- success
   2648  *              none-zero failure code
   2649  *==========================================================================*/
   2650 int32_t QCameraParameters::setSceneDetect(const QCameraParameters& params)
   2651 {
   2652     const char *str = params.get(KEY_QC_SCENE_DETECT);
   2653     const char *prev_str = get(KEY_QC_SCENE_DETECT);
   2654     if (str != NULL) {
   2655         if (prev_str == NULL ||
   2656             strcmp(str, prev_str) != 0) {
   2657             return setSceneDetect(str);
   2658         }
   2659     }
   2660     return NO_ERROR;
   2661 }
   2662 
   2663 /*===========================================================================
   2664  * FUNCTION   : setVideoHDR
   2665  *
   2666  * DESCRIPTION: set video HDR value from user setting
   2667  *
   2668  * PARAMETERS :
   2669  *   @params  : user setting parameters
   2670  *
   2671  * RETURN     : int32_t type of status
   2672  *              NO_ERROR  -- success
   2673  *              none-zero failure code
   2674  *==========================================================================*/
   2675 int32_t QCameraParameters::setVideoHDR(const QCameraParameters& params)
   2676 {
   2677     const char *str = params.get(KEY_QC_VIDEO_HDR);
   2678     const char *prev_str = get(KEY_QC_VIDEO_HDR);
   2679     if (str != NULL) {
   2680         if (prev_str == NULL ||
   2681             strcmp(str, prev_str) != 0) {
   2682             return setVideoHDR(str);
   2683         }
   2684     }
   2685     return NO_ERROR;
   2686 }
   2687 
   2688 /*===========================================================================
   2689  * FUNCTION   : setVtEnable
   2690  *
   2691  * DESCRIPTION: set vt Time Stamp enable from user setting
   2692  *
   2693  * PARAMETERS :
   2694  *   @params  : user setting parameters
   2695  *
   2696  * RETURN     : int32_t type of status
   2697  *              NO_ERROR  -- success
   2698  *              none-zero failure code
   2699  *==========================================================================*/
   2700 int32_t QCameraParameters::setVtEnable(const QCameraParameters& params)
   2701 {
   2702     const char *str = params.get(KEY_QC_VT_ENABLE);
   2703     const char *prev_str = get(KEY_QC_VT_ENABLE);
   2704     if (str != NULL) {
   2705         if (prev_str == NULL ||
   2706             strcmp(str, prev_str) != 0) {
   2707             return setVtEnable(str);
   2708         }
   2709     }
   2710     return NO_ERROR;
   2711 }
   2712 
   2713 /*===========================================================================
   2714  * FUNCTION   : setFaceRecognition
   2715  *
   2716  * DESCRIPTION: set face recognition mode from user setting
   2717  *
   2718  * PARAMETERS :
   2719  *   @params  : user setting parameters
   2720  *
   2721  * RETURN     : int32_t type of status
   2722  *              NO_ERROR  -- success
   2723  *              none-zero failure code
   2724  *==========================================================================*/
   2725 int32_t QCameraParameters::setFaceRecognition(const QCameraParameters& params)
   2726 {
   2727     const char *str = params.get(KEY_QC_FACE_RECOGNITION);
   2728     const char *prev_str = get(KEY_QC_FACE_RECOGNITION);
   2729     if (str != NULL) {
   2730         if (prev_str == NULL ||
   2731             strcmp(str, prev_str) != 0) {
   2732             uint32_t maxFaces = (uint32_t)params.getInt(KEY_QC_MAX_NUM_REQUESTED_FACES);
   2733             return setFaceRecognition(str, maxFaces);
   2734         }
   2735     }
   2736     return NO_ERROR;
   2737 }
   2738 
   2739 /*===========================================================================
   2740  * FUNCTION   : setZoom
   2741  *
   2742  * DESCRIPTION: set zoom value from user setting
   2743  *
   2744  * PARAMETERS :
   2745  *   @params  : user setting parameters
   2746  *
   2747  * RETURN     : int32_t type of status
   2748  *              NO_ERROR  -- success
   2749  *              none-zero failure code
   2750  *==========================================================================*/
   2751 int32_t QCameraParameters::setZoom(const QCameraParameters& params)
   2752 {
   2753     if ((m_pCapability->zoom_supported == 0 ||
   2754          m_pCapability->zoom_ratio_tbl_cnt == 0)) {
   2755         CDBG_HIGH("%s: no zoom support", __func__);
   2756         return NO_ERROR;
   2757     }
   2758 
   2759     int zoomLevel = params.getInt(KEY_ZOOM);
   2760     mParmZoomLevel = zoomLevel;
   2761     if ((zoomLevel < 0) || (zoomLevel >= (int)m_pCapability->zoom_ratio_tbl_cnt)) {
   2762         ALOGE("%s: invalid value %d out of (%d, %d)",
   2763               __func__, zoomLevel,
   2764               0, m_pCapability->zoom_ratio_tbl_cnt-1);
   2765         return BAD_VALUE;
   2766     }
   2767 
   2768     int prevZoomLevel = getInt(KEY_ZOOM);
   2769     if (prevZoomLevel == zoomLevel) {
   2770         CDBG("%s: No value change in zoom %d %d", __func__, prevZoomLevel, zoomLevel);
   2771         return NO_ERROR;
   2772     }
   2773 
   2774     return setZoom(zoomLevel);
   2775 }
   2776 
   2777 /*===========================================================================
   2778  * FUNCTION   : setISOValue
   2779  *
   2780  * DESCRIPTION: set ISO value from user setting
   2781  *
   2782  * PARAMETERS :
   2783  *   @params  : user setting parameters
   2784  *
   2785  * RETURN     : int32_t type of status
   2786  *              NO_ERROR  -- success
   2787  *              none-zero failure code
   2788  *==========================================================================*/
   2789 int32_t  QCameraParameters::setISOValue(const QCameraParameters& params)
   2790 {
   2791     const char *str = params.get(KEY_QC_ISO_MODE);
   2792     const char *prev_str = get(KEY_QC_ISO_MODE);
   2793     if (str != NULL) {
   2794         if (prev_str == NULL ||
   2795             strcmp(str, prev_str) != 0) {
   2796             return setISOValue(str);
   2797         }
   2798     }
   2799     return NO_ERROR;
   2800 }
   2801 
   2802 /*===========================================================================
   2803  * FUNCTION   : setContinuousISO
   2804  *
   2805  * DESCRIPTION: set ISO value from user setting
   2806  *
   2807  * PARAMETERS :
   2808  *   @params  : user setting parameters
   2809  *
   2810  * RETURN     : int32_t type of status
   2811  *              NO_ERROR  -- success
   2812  *              none-zero failure code
   2813  *==========================================================================*/
   2814 int32_t  QCameraParameters::setContinuousISO(const char *isoValue)
   2815 {
   2816     char iso[PROPERTY_VALUE_MAX];
   2817     int32_t continous_iso = 0;
   2818 
   2819     // Check if continuous ISO is set through setproperty
   2820     property_get("persist.camera.continuous.iso", iso, "");
   2821     if (strlen(iso) > 0) {
   2822         continous_iso = atoi(iso);
   2823     } else {
   2824         continous_iso = atoi(isoValue);
   2825     }
   2826 
   2827     if ((continous_iso >= 0) &&
   2828             (continous_iso <= m_pCapability->sensitivity_range.max_sensitivity)) {
   2829         CDBG_HIGH("%s: Setting continuous ISO value %d", __func__, continous_iso);
   2830         updateParamEntry(KEY_QC_CONTINUOUS_ISO, isoValue);
   2831         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ISO, continous_iso)) {
   2832             return BAD_VALUE;
   2833         }
   2834         return NO_ERROR;
   2835     }
   2836     ALOGE("Invalid iso value: %d", continous_iso);
   2837     return BAD_VALUE;
   2838 }
   2839 
   2840 /*===========================================================================
   2841  * FUNCTION   : setExposureTime
   2842  *
   2843  * DESCRIPTION: set exposure time from user setting
   2844  *
   2845  * PARAMETERS :
   2846  *   @params  : user setting parameters
   2847  *
   2848  * RETURN     : int32_t type of status
   2849  *              NO_ERROR  -- success
   2850  *              none-zero failure code
   2851  *==========================================================================*/
   2852 int32_t  QCameraParameters::setExposureTime(const QCameraParameters& params)
   2853 {
   2854     const char *str = params.get(KEY_QC_EXPOSURE_TIME);
   2855     const char *prev_str = get(KEY_QC_EXPOSURE_TIME);
   2856     if (str != NULL) {
   2857         if (prev_str == NULL ||
   2858                 strcmp(str, prev_str) != 0) {
   2859             return setExposureTime(str);
   2860         }
   2861     }
   2862 
   2863     return NO_ERROR;
   2864 }
   2865 
   2866 /*===========================================================================
   2867  * FUNCTION   : setVideoRotation
   2868  *
   2869  * DESCRIPTION: set rotation value from user setting
   2870  *
   2871  * PARAMETERS :
   2872  *   @params  : user setting parameters
   2873  *
   2874  * RETURN     : int32_t type of status
   2875  *              NO_ERROR  -- success
   2876  *              none-zero failure code
   2877  *==========================================================================*/
   2878 int32_t QCameraParameters::setVideoRotation(const QCameraParameters& params)
   2879 {
   2880     const char *str = params.get(KEY_QC_VIDEO_ROTATION);
   2881     if(str != NULL) {
   2882         int value = lookupAttr(VIDEO_ROTATION_MODES_MAP,
   2883                 PARAM_MAP_SIZE(VIDEO_ROTATION_MODES_MAP), str);
   2884         if (value != NAME_NOT_FOUND) {
   2885             updateParamEntry(KEY_QC_VIDEO_ROTATION, str);
   2886             ALOGV("setVideoRotation: %s:  %d: ", str, value);
   2887         } else {
   2888             ALOGE("Invalid rotation value: %d", value);
   2889             return BAD_VALUE;
   2890         }
   2891 
   2892     }
   2893     return NO_ERROR;
   2894 }
   2895 
   2896 /*===========================================================================
   2897  * FUNCTION   : setRotation
   2898  *
   2899  * DESCRIPTION: set rotation value from user setting
   2900  *
   2901  * PARAMETERS :
   2902  *   @params  : user setting parameters
   2903  *
   2904  * RETURN     : int32_t type of status
   2905  *              NO_ERROR  -- success
   2906  *              none-zero failure code
   2907  *==========================================================================*/
   2908 int32_t QCameraParameters::setRotation(const QCameraParameters& params)
   2909 {
   2910     int32_t rotation = params.getInt(KEY_ROTATION);
   2911     if (rotation != -1) {
   2912         if (rotation == 0 || rotation == 90 ||
   2913             rotation == 180 || rotation == 270) {
   2914             set(KEY_ROTATION, rotation);
   2915 
   2916             ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_META_JPEG_ORIENTATION,
   2917                     rotation);
   2918             mRotation = rotation;
   2919         } else {
   2920             ALOGE("Invalid rotation value: %d", rotation);
   2921             return BAD_VALUE;
   2922         }
   2923     }
   2924     return NO_ERROR;
   2925 }
   2926 
   2927 /*===========================================================================
   2928  * FUNCTION   : setFlash
   2929  *
   2930  * DESCRIPTION: set flash mode from user setting
   2931  *
   2932  * PARAMETERS :
   2933  *   @params  : user setting parameters
   2934  *
   2935  * RETURN     : int32_t type of status
   2936  *              NO_ERROR  -- success
   2937  *              none-zero failure code
   2938  *==========================================================================*/
   2939 int32_t QCameraParameters::setFlash(const QCameraParameters& params)
   2940 {
   2941     const char *str = params.get(KEY_FLASH_MODE);
   2942     const char *prev_str = get(KEY_FLASH_MODE);
   2943     if (str != NULL) {
   2944         if (prev_str == NULL ||
   2945             strcmp(str, prev_str) != 0) {
   2946             return setFlash(str);
   2947         }
   2948     }
   2949     return NO_ERROR;
   2950 }
   2951 
   2952 /*===========================================================================
   2953  * FUNCTION   : setAecLock
   2954  *
   2955  * DESCRIPTION: set AEC lock value from user setting
   2956  *
   2957  * PARAMETERS :
   2958  *   @params  : user setting parameters
   2959  *
   2960  * RETURN     : int32_t type of status
   2961  *              NO_ERROR  -- success
   2962  *              none-zero failure code
   2963  *==========================================================================*/
   2964 int32_t QCameraParameters::setAecLock(const QCameraParameters& params)
   2965 {
   2966     const char *str = params.get(KEY_AUTO_EXPOSURE_LOCK);
   2967     const char *prev_str = get(KEY_AUTO_EXPOSURE_LOCK);
   2968     if (str != NULL) {
   2969         if (prev_str == NULL ||
   2970             strcmp(str, prev_str) != 0) {
   2971             return setAecLock(str);
   2972         }
   2973     }
   2974     return NO_ERROR;
   2975 }
   2976 
   2977 /*===========================================================================
   2978  * FUNCTION   : setAwbLock
   2979  *
   2980  * DESCRIPTION: set AWB lock from user setting
   2981  *
   2982  * PARAMETERS :
   2983  *   @params  : user setting parameters
   2984  *
   2985  * RETURN     : int32_t type of status
   2986  *              NO_ERROR  -- success
   2987  *              none-zero failure code
   2988  *==========================================================================*/
   2989 int32_t QCameraParameters::setAwbLock(const QCameraParameters& params)
   2990 {
   2991     const char *str = params.get(KEY_AUTO_WHITEBALANCE_LOCK);
   2992     const char *prev_str = get(KEY_AUTO_WHITEBALANCE_LOCK);
   2993     if (str != NULL) {
   2994         if (prev_str == NULL ||
   2995             strcmp(str, prev_str) != 0) {
   2996             return setAwbLock(str);
   2997         }
   2998     }
   2999     return NO_ERROR;
   3000 }
   3001 
   3002 /*===========================================================================
   3003  * FUNCTION   : setAutoHDR
   3004  *
   3005  * DESCRIPTION: Enable/disable auto HDR
   3006  *
   3007  * PARAMETERS :
   3008  *   @params  : user setting parameters
   3009  *
   3010  * RETURN     : int32_t type of status
   3011  *              NO_ERROR  -- success
   3012  *              none-zero failure code
   3013  *==========================================================================*/
   3014 int32_t QCameraParameters::setAutoHDR(const QCameraParameters& params)
   3015 {
   3016     const char *str = params.get(KEY_QC_AUTO_HDR_ENABLE);
   3017     const char *prev_str = get(KEY_QC_AUTO_HDR_ENABLE);
   3018     char prop[PROPERTY_VALUE_MAX];
   3019 
   3020     memset(prop, 0, sizeof(prop));
   3021     property_get("persist.camera.auto.hdr.enable", prop, VALUE_DISABLE);
   3022     if (str != NULL) {
   3023        if (prev_str == NULL ||
   3024            strcmp(str, prev_str) != 0) {
   3025            CDBG_HIGH("%s : Auto HDR set to: %s", __func__, str);
   3026            return updateParamEntry(KEY_QC_AUTO_HDR_ENABLE, str);
   3027        }
   3028     } else {
   3029        if (prev_str == NULL ||
   3030            strcmp(prev_str, prop) != 0 ) {
   3031            CDBG_HIGH("%s : Auto HDR set to: %s", __func__, prop);
   3032            updateParamEntry(KEY_QC_AUTO_HDR_ENABLE, prop);
   3033        }
   3034     }
   3035 
   3036        return NO_ERROR;
   3037 }
   3038 
   3039 /*===========================================================================
   3040 * FUNCTION   : isAutoHDREnabled
   3041 *
   3042 * DESCRIPTION: Query auto HDR status
   3043 *
   3044 * PARAMETERS : None
   3045 *
   3046 * RETURN     : bool true/false
   3047 *==========================================================================*/
   3048 bool QCameraParameters::isAutoHDREnabled()
   3049 {
   3050     const char *str = get(KEY_QC_AUTO_HDR_ENABLE);
   3051     if (str != NULL) {
   3052         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   3053                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), str);
   3054         if (value == NAME_NOT_FOUND) {
   3055             ALOGE("%s: Invalid Auto HDR value %s", __func__, str);
   3056             return false;
   3057         }
   3058 
   3059         CDBG_HIGH("%s : Auto HDR status is: %d", __func__, value);
   3060         return value ? true : false;
   3061     }
   3062 
   3063     CDBG_HIGH("%s : Auto HDR status not set!", __func__);
   3064     return false;
   3065 }
   3066 
   3067 /*===========================================================================
   3068  * FUNCTION   : setMCEValue
   3069  *
   3070  * DESCRIPTION: set memory color enhancement value from user setting
   3071  *
   3072  * PARAMETERS :
   3073  *   @params  : user setting parameters
   3074  *
   3075  * RETURN     : int32_t type of status
   3076  *              NO_ERROR  -- success
   3077  *              none-zero failure code
   3078  *==========================================================================*/
   3079 int32_t QCameraParameters::setMCEValue(const QCameraParameters& params)
   3080 {
   3081     const char *str = params.get(KEY_QC_MEMORY_COLOR_ENHANCEMENT);
   3082     const char *prev_str = get(KEY_QC_MEMORY_COLOR_ENHANCEMENT);
   3083     if (str != NULL) {
   3084         if (prev_str == NULL ||
   3085             strcmp(str, prev_str) != 0) {
   3086             return setMCEValue(str);
   3087         }
   3088     }
   3089     return NO_ERROR;
   3090 }
   3091 
   3092 /*===========================================================================
   3093  * FUNCTION   : setDISValue
   3094  *
   3095  * DESCRIPTION: enable/disable DIS 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::setDISValue(const QCameraParameters& params)
   3105 {
   3106     const char *str = params.get(KEY_QC_DIS);
   3107     const char *prev_str = get(KEY_QC_DIS);
   3108     if (str != NULL) {
   3109         if (prev_str == NULL ||
   3110             strcmp(str, prev_str) != 0) {
   3111             return setDISValue(str);
   3112         }
   3113     }
   3114     return NO_ERROR;
   3115 }
   3116 
   3117 /*===========================================================================
   3118  * FUNCTION   : setLensShadeValue
   3119  *
   3120  * DESCRIPTION: set lens shade value 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::setLensShadeValue(const QCameraParameters& params)
   3130 {
   3131     const char *str = params.get(KEY_QC_LENSSHADE);
   3132     const char *prev_str = get(KEY_QC_LENSSHADE);
   3133     if (str != NULL) {
   3134         if (prev_str == NULL ||
   3135             strcmp(str, prev_str) != 0) {
   3136             return setLensShadeValue(str);
   3137         }
   3138     }
   3139     return NO_ERROR;
   3140 }
   3141 
   3142 /*===========================================================================
   3143  * FUNCTION   : setFocusAreas
   3144  *
   3145  * DESCRIPTION: set focus areas from user setting
   3146  *
   3147  * PARAMETERS :
   3148  *   @params  : user setting parameters
   3149  *
   3150  * RETURN     : int32_t type of status
   3151  *              NO_ERROR  -- success
   3152  *              none-zero failure code
   3153  *==========================================================================*/
   3154 int32_t QCameraParameters::setFocusAreas(const QCameraParameters& params)
   3155 {
   3156     const char *str = params.get(KEY_FOCUS_AREAS);
   3157     if (str != NULL) {
   3158         int max_num_af_areas = getInt(KEY_MAX_NUM_FOCUS_AREAS);
   3159         if(max_num_af_areas == 0) {
   3160             ALOGE("%s: max num of AF area is 0, cannot set focus areas", __func__);
   3161             return BAD_VALUE;
   3162         }
   3163 
   3164         const char *prev_str = get(KEY_FOCUS_AREAS);
   3165         if (prev_str == NULL ||
   3166             strcmp(str, prev_str) != 0) {
   3167             return setFocusAreas(str);
   3168         }
   3169     }
   3170     return NO_ERROR;
   3171 }
   3172 
   3173 /*===========================================================================
   3174  * FUNCTION   : setMeteringAreas
   3175  *
   3176  * DESCRIPTION: set metering areas from user setting
   3177  *
   3178  * PARAMETERS :
   3179  *   @params  : user setting parameters
   3180  *
   3181  * RETURN     : int32_t type of status
   3182  *              NO_ERROR  -- success
   3183  *              none-zero failure code
   3184  *==========================================================================*/
   3185 int32_t QCameraParameters::setMeteringAreas(const QCameraParameters& params)
   3186 {
   3187     const char *str = params.get(KEY_METERING_AREAS);
   3188     if (str != NULL) {
   3189         int max_num_mtr_areas = getInt(KEY_MAX_NUM_METERING_AREAS);
   3190         if(max_num_mtr_areas == 0) {
   3191             ALOGE("%s: max num of metering areas is 0, cannot set focus areas", __func__);
   3192             return BAD_VALUE;
   3193         }
   3194 
   3195         const char *prev_str = get(KEY_METERING_AREAS);
   3196         if (prev_str == NULL ||
   3197             strcmp(str, prev_str) != 0) {
   3198             return setMeteringAreas(str);
   3199         }
   3200     }
   3201     return NO_ERROR;
   3202 }
   3203 
   3204 /*===========================================================================
   3205  * FUNCTION   : setSceneMode
   3206  *
   3207  * DESCRIPTION: set scenen mode from user setting
   3208  *
   3209  * PARAMETERS :
   3210  *   @params  : user setting parameters
   3211  *
   3212  * RETURN     : int32_t type of status
   3213  *              NO_ERROR  -- success
   3214  *              none-zero failure code
   3215  *==========================================================================*/
   3216 int32_t QCameraParameters::setSceneMode(const QCameraParameters& params)
   3217 {
   3218     const char *str = params.get(KEY_SCENE_MODE);
   3219     const char *prev_str = get(KEY_SCENE_MODE);
   3220     CDBG_HIGH("%s: str - %s, prev_str - %s",__func__, str, prev_str);
   3221 
   3222     if (str != NULL) {
   3223         if (prev_str == NULL ||
   3224             strcmp(str, prev_str) != 0) {
   3225 
   3226             if(strcmp(str, SCENE_MODE_AUTO) == 0) {
   3227                 m_bSceneTransitionAuto = true;
   3228             }
   3229             if (strcmp(str, SCENE_MODE_HDR) == 0) {
   3230 
   3231                 // If HDR is set from client  and the feature is not enabled in the backend, ignore it.
   3232                 if (m_bHDRModeSensor) {
   3233                     m_bSensorHDREnabled = true;
   3234                     CDBG_HIGH("%s: Sensor HDR mode Enabled",__func__);
   3235                 } else {
   3236                     m_bHDREnabled = true;
   3237                     CDBG_HIGH("%s: S/W HDR Enabled",__func__);
   3238                 }
   3239             } else {
   3240                 m_bHDREnabled = false;
   3241                 if (m_bSensorHDREnabled) {
   3242                     m_bSensorHDREnabled = false;
   3243                     m_bNeedRestart = true;
   3244                     setSensorSnapshotHDR("off");
   3245                 }
   3246             }
   3247 
   3248             if (m_bSensorHDREnabled) {
   3249                 setSensorSnapshotHDR("on");
   3250                 m_bNeedRestart = true;
   3251             } else if ((m_bHDREnabled) ||
   3252                 ((prev_str != NULL) && (strcmp(prev_str, SCENE_MODE_HDR) == 0))) {
   3253                 CDBG_HIGH("%s: scene mode changed between HDR and non-HDR, need restart", __func__);
   3254 
   3255                 m_bNeedRestart = true;
   3256             }
   3257 
   3258             return setSceneMode(str);
   3259         }
   3260     }
   3261     return NO_ERROR;
   3262 }
   3263 
   3264 /*===========================================================================
   3265  * FUNCTION   : setSelectableZoneAf
   3266  *
   3267  * DESCRIPTION: set selectable zone auto focus value from user setting
   3268  *
   3269  * PARAMETERS :
   3270  *   @params  : user setting parameters
   3271  *
   3272  * RETURN     : int32_t type of status
   3273  *              NO_ERROR  -- success
   3274  *              none-zero failure code
   3275  *==========================================================================*/
   3276 int32_t QCameraParameters::setSelectableZoneAf(const QCameraParameters& params)
   3277 {
   3278     const char *str = params.get(KEY_QC_SELECTABLE_ZONE_AF);
   3279     const char *prev_str = get(KEY_QC_SELECTABLE_ZONE_AF);
   3280     if (str != NULL) {
   3281         if (prev_str == NULL ||
   3282             strcmp(str, prev_str) != 0) {
   3283             return setSelectableZoneAf(str);
   3284         }
   3285     }
   3286     return NO_ERROR;
   3287 }
   3288 
   3289 /*===========================================================================
   3290  * FUNCTION   : setAEBracket
   3291  *
   3292  * DESCRIPTION: set AE bracket from user setting
   3293  *
   3294  * PARAMETERS :
   3295  *   @params  : user setting parameters
   3296  *
   3297  * RETURN     : int32_t type of status
   3298  *              NO_ERROR  -- success
   3299  *              none-zero failure code
   3300  *==========================================================================*/
   3301 int32_t QCameraParameters::setAEBracket(const QCameraParameters& params)
   3302 {
   3303     if (isHDREnabled()) {
   3304         CDBG_HIGH("%s: scene mode is HDR, overwrite AE bracket setting to off", __func__);
   3305         return setAEBracket(AE_BRACKET_OFF);
   3306     }
   3307 
   3308     const char *expStr = params.get(KEY_QC_CAPTURE_BURST_EXPOSURE);
   3309     if (NULL != expStr && strlen(expStr) > 0) {
   3310         set(KEY_QC_CAPTURE_BURST_EXPOSURE, expStr);
   3311     } else {
   3312         char prop[PROPERTY_VALUE_MAX];
   3313         memset(prop, 0, sizeof(prop));
   3314         property_get("persist.capture.burst.exposures", prop, "");
   3315         if (strlen(prop) > 0) {
   3316             set(KEY_QC_CAPTURE_BURST_EXPOSURE, prop);
   3317         } else {
   3318             remove(KEY_QC_CAPTURE_BURST_EXPOSURE);
   3319         }
   3320     }
   3321 
   3322     const char *str = params.get(KEY_QC_AE_BRACKET_HDR);
   3323     const char *prev_str = get(KEY_QC_AE_BRACKET_HDR);
   3324     if (str != NULL) {
   3325         if (prev_str == NULL ||
   3326             strcmp(str, prev_str) != 0) {
   3327             return setAEBracket(str);
   3328         }
   3329     }
   3330     return NO_ERROR;
   3331 }
   3332 
   3333 /*===========================================================================
   3334  * FUNCTION   : setAFBracket
   3335  *
   3336  * DESCRIPTION: set AF bracket from user setting
   3337  *
   3338  * PARAMETERS :
   3339  *   @params  : user setting parameters
   3340  *
   3341  * RETURN     : int32_t type of status
   3342  *              NO_ERROR  -- success
   3343  *              none-zero failure code
   3344  *==========================================================================*/
   3345 int32_t QCameraParameters::setAFBracket(const QCameraParameters& params)
   3346 {
   3347     if ((m_pCapability->qcom_supported_feature_mask &
   3348             (CAM_QCOM_FEATURE_REFOCUS | CAM_QCOM_FEATURE_UBIFOCUS)) == 0) {
   3349         CDBG_HIGH("%s: AF Bracketing is not supported",__func__);
   3350         return NO_ERROR;
   3351     }
   3352     const char *str = params.get(KEY_QC_AF_BRACKET);
   3353     const char *prev_str = get(KEY_QC_AF_BRACKET);
   3354     CDBG_HIGH("%s: str =%s & prev_str =%s",__func__, str, prev_str);
   3355     if (str != NULL) {
   3356         if (prev_str == NULL ||
   3357             strcmp(str, prev_str) != 0) {
   3358             m_bNeedRestart = true;
   3359             return setAFBracket(str);
   3360         }
   3361     }
   3362     return NO_ERROR;
   3363 }
   3364 
   3365 /*===========================================================================
   3366  * FUNCTION   : setReFocus
   3367  *
   3368  * DESCRIPTION: set refocus from user setting
   3369  *
   3370  * PARAMETERS :
   3371  *   @params  : user setting parameters
   3372  *
   3373  * RETURN     : int32_t type of status
   3374  *              NO_ERROR  -- success
   3375  *              none-zero failure code
   3376  *==========================================================================*/
   3377 int32_t QCameraParameters::setReFocus(const QCameraParameters& params)
   3378 {
   3379     if ((m_pCapability->qcom_supported_feature_mask &
   3380             (CAM_QCOM_FEATURE_REFOCUS | CAM_QCOM_FEATURE_UBIFOCUS)) == 0) {
   3381         ALOGD("%s: AF Bracketing is not supported",__func__);
   3382         return NO_ERROR;
   3383     }
   3384     const char *str = params.get(KEY_QC_RE_FOCUS);
   3385     const char *prev_str = get(KEY_QC_RE_FOCUS);
   3386     CDBG_HIGH("%s: str =%s & prev_str =%s",__func__, str, prev_str);
   3387     if (str != NULL) {
   3388         if (prev_str == NULL ||
   3389             strcmp(str, prev_str) != 0) {
   3390             m_bNeedRestart = true;
   3391             return setReFocus(str);
   3392         }
   3393     }
   3394     return NO_ERROR;
   3395 }
   3396 
   3397 /*===========================================================================
   3398  * FUNCTION   : setChromaFlash
   3399  *
   3400  * DESCRIPTION: set chroma flash from user setting
   3401  *
   3402  * PARAMETERS :
   3403  *   @params  : user setting parameters
   3404  *
   3405  * RETURN     : int32_t type of status
   3406  *              NO_ERROR  -- success
   3407  *              none-zero failure code
   3408  *==========================================================================*/
   3409 int32_t QCameraParameters::setChromaFlash(const QCameraParameters& params)
   3410 {
   3411     if ((m_pCapability->qcom_supported_feature_mask &
   3412         CAM_QCOM_FEATURE_CHROMA_FLASH) == 0) {
   3413         CDBG_HIGH("%s: Chroma Flash is not supported",__func__);
   3414         return NO_ERROR;
   3415     }
   3416     const char *str = params.get(KEY_QC_CHROMA_FLASH);
   3417     const char *prev_str = get(KEY_QC_CHROMA_FLASH);
   3418     CDBG_HIGH("%s: str =%s & prev_str =%s",__func__, str, prev_str);
   3419     if (str != NULL) {
   3420         if (prev_str == NULL ||
   3421             strcmp(str, prev_str) != 0) {
   3422             m_bNeedRestart = true;
   3423             return setChromaFlash(str);
   3424         }
   3425     }
   3426     return NO_ERROR;
   3427 }
   3428 
   3429 /*===========================================================================
   3430  * FUNCTION   : setOptiZoom
   3431  *
   3432  * DESCRIPTION: set opti zoom from user setting
   3433  *
   3434  * PARAMETERS :
   3435  *   @params  : user setting parameters
   3436  *
   3437  * RETURN     : int32_t type of status
   3438  *              NO_ERROR  -- success
   3439  *              none-zero failure code
   3440  *==========================================================================*/
   3441 int32_t QCameraParameters::setOptiZoom(const QCameraParameters& params)
   3442 {
   3443     if ((m_pCapability->qcom_supported_feature_mask &
   3444         CAM_QCOM_FEATURE_OPTIZOOM) == 0){
   3445         CDBG_HIGH("%s: Opti Zoom is not supported",__func__);
   3446         return NO_ERROR;
   3447     }
   3448     const char *str = params.get(KEY_QC_OPTI_ZOOM);
   3449     const char *prev_str = get(KEY_QC_OPTI_ZOOM);
   3450     CDBG_HIGH("%s: str =%s & prev_str =%s",__func__, str, prev_str);
   3451     if (str != NULL) {
   3452         if (prev_str == NULL ||
   3453             strcmp(str, prev_str) != 0) {
   3454             m_bNeedRestart = true;
   3455             return setOptiZoom(str);
   3456         }
   3457     }
   3458     return NO_ERROR;
   3459 }
   3460 
   3461 /*===========================================================================
   3462  * FUNCTION   : setTruePortrait
   3463  *
   3464  * DESCRIPTION: set true portrait from user setting
   3465  *
   3466  * PARAMETERS :
   3467  *   @params  : user setting parameters
   3468  *
   3469  * RETURN     : int32_t type of status
   3470  *              NO_ERROR  -- success
   3471  *              none-zero failure code
   3472  *==========================================================================*/
   3473 int32_t QCameraParameters::setTruePortrait(const QCameraParameters& params)
   3474 {
   3475     if ((m_pCapability->qcom_supported_feature_mask &
   3476             CAM_QCOM_FEATURE_TRUEPORTRAIT) == 0) {
   3477         CDBG("%s: True Portrait is not supported",__func__);
   3478         return NO_ERROR;
   3479     }
   3480     const char *str = params.get(KEY_QC_TRUE_PORTRAIT);
   3481     const char *prev_str = get(KEY_QC_TRUE_PORTRAIT);
   3482     CDBG_HIGH("%s: str =%s & prev_str =%s", __func__, str, prev_str);
   3483     if (str != NULL) {
   3484         if (prev_str == NULL ||
   3485             strcmp(str, prev_str) != 0) {
   3486             return setTruePortrait(str);
   3487         }
   3488     }
   3489     return NO_ERROR;
   3490 }
   3491 
   3492 /*===========================================================================
   3493  * FUNCTION   : setHDRMode
   3494  *
   3495  * DESCRIPTION: set HDR mode from user setting
   3496  *
   3497  * PARAMETERS :
   3498  *   @params  : user setting parameters
   3499  *
   3500  * RETURN     : int32_t type of status
   3501  *              NO_ERROR  -- success
   3502  *              none-zero failure code
   3503  *==========================================================================*/
   3504 int32_t QCameraParameters::setHDRMode(const QCameraParameters& params)
   3505 {
   3506     const char *str = params.get(KEY_QC_HDR_MODE);
   3507     const char *prev_str = get(KEY_QC_HDR_MODE);
   3508     uint32_t supported_hdr_modes = m_pCapability->qcom_supported_feature_mask &
   3509           (CAM_QCOM_FEATURE_SENSOR_HDR | CAM_QCOM_FEATURE_HDR);
   3510 
   3511     CDBG_HIGH("%s: str =%s & prev_str =%s",__func__, str, prev_str);
   3512     if (str != NULL) {
   3513         if ((CAM_QCOM_FEATURE_SENSOR_HDR == supported_hdr_modes) &&
   3514                 (strncmp(str, HDR_MODE_SENSOR, strlen(HDR_MODE_SENSOR)))) {
   3515             CDBG_HIGH("%s: Only sensor HDR is supported",__func__);
   3516             return NO_ERROR;
   3517         } else if  ((CAM_QCOM_FEATURE_HDR == supported_hdr_modes) &&
   3518                 (strncmp(str, HDR_MODE_SENSOR, strlen(HDR_MODE_MULTI_FRAME)))) {
   3519             CDBG_HIGH("%s: Only multi frame HDR is supported",__func__);
   3520             return NO_ERROR;
   3521         } else if (!supported_hdr_modes) {
   3522             CDBG_HIGH("%s: HDR is not supported",__func__);
   3523             return NO_ERROR;
   3524         }
   3525         if (prev_str == NULL ||
   3526                 strcmp(str, prev_str) != 0) {
   3527             return setHDRMode(str);
   3528         }
   3529     }
   3530 
   3531     return NO_ERROR;
   3532 }
   3533 
   3534 /*===========================================================================
   3535  * FUNCTION   : setHDRNeed1x
   3536  *
   3537  * DESCRIPTION: set HDR need 1x from user setting
   3538  *
   3539  * PARAMETERS :
   3540  *   @params  : user setting parameters
   3541  *
   3542  * RETURN     : int32_t type of status
   3543  *              NO_ERROR  -- success
   3544  *              none-zero failure code
   3545  *==========================================================================*/
   3546 int32_t QCameraParameters::setHDRNeed1x(const QCameraParameters& params)
   3547 {
   3548     const char *str = params.get(KEY_QC_HDR_NEED_1X);
   3549     const char *prev_str = get(KEY_QC_HDR_NEED_1X);
   3550 
   3551     CDBG_HIGH("%s: str =%s & prev_str =%s", __func__, str, prev_str);
   3552     if (str != NULL) {
   3553         if (m_bHDRModeSensor) {
   3554             CDBG_HIGH("%s: Only multi frame HDR supports 1x frame",__func__);
   3555             return NO_ERROR;
   3556         }
   3557         if ((prev_str == NULL) || (strcmp(str, prev_str) != 0)) {
   3558             return setHDRNeed1x(str);
   3559         }
   3560     }
   3561     return NO_ERROR;
   3562 }
   3563 
   3564 /*===========================================================================
   3565  * FUNCTION   : setSeeMore
   3566  *
   3567  * DESCRIPTION: set see more (llvd) from user setting
   3568  *
   3569  * PARAMETERS :
   3570  *   @params  : user setting parameters
   3571  *
   3572  * RETURN     : int32_t type of status
   3573  *              NO_ERROR  -- success
   3574  *              none-zero failure code
   3575  *==========================================================================*/
   3576 int32_t QCameraParameters::setSeeMore(const QCameraParameters& params)
   3577 {
   3578     if ((m_pCapability->qcom_supported_feature_mask &
   3579             CAM_QCOM_FEATURE_LLVD) == 0) {
   3580         CDBG("%s: See more is not supported", __func__);
   3581         return NO_ERROR;
   3582     }
   3583     const char *str = params.get(KEY_QC_SEE_MORE);
   3584     const char *prev_str = get(KEY_QC_SEE_MORE);
   3585     CDBG_HIGH("%s: str =%s & prev_str =%s", __func__, str, prev_str);
   3586     if (str != NULL) {
   3587         if (prev_str == NULL || strcmp(str, prev_str) != 0) {
   3588             m_bNeedRestart = true;
   3589             return setSeeMore(str);
   3590         }
   3591     }
   3592     return NO_ERROR;
   3593 }
   3594 
   3595 /*===========================================================================
   3596  * FUNCTION   : setStillMore
   3597  *
   3598  * DESCRIPTION: set stillmore from user setting
   3599  *
   3600  * PARAMETERS :
   3601  *   @params  : user setting parameters
   3602  *
   3603  * RETURN     : int32_t type of status
   3604  *              NO_ERROR  -- success
   3605  *              none-zero failure code
   3606  *==========================================================================*/
   3607 int32_t QCameraParameters::setStillMore(const QCameraParameters& params)
   3608 {
   3609     if ((m_pCapability->qcom_supported_feature_mask &
   3610             CAM_QCOM_FEATURE_STILLMORE) == 0) {
   3611         CDBG("%s: Stillmore is not supported",__func__);
   3612         return NO_ERROR;
   3613     }
   3614     const char *str = params.get(KEY_QC_STILL_MORE);
   3615     const char *prev_str = get(KEY_QC_STILL_MORE);
   3616     CDBG_HIGH("%s: str =%s & prev_str =%s", __func__, str, prev_str);
   3617     if (str != NULL) {
   3618         if (prev_str == NULL || strcmp(str, prev_str) != 0) {
   3619             m_bNeedRestart = true;
   3620             return setStillMore(str);
   3621         }
   3622     }
   3623     return NO_ERROR;
   3624 }
   3625 
   3626 /*===========================================================================
   3627  * FUNCTION   : setRedeyeReduction
   3628  *
   3629  * DESCRIPTION: set red eye reduction setting from user setting
   3630  *
   3631  * PARAMETERS :
   3632  *   @params  : user setting parameters
   3633  *
   3634  * RETURN     : int32_t type of status
   3635  *              NO_ERROR  -- success
   3636  *              none-zero failure code
   3637  *==========================================================================*/
   3638 int32_t QCameraParameters::setRedeyeReduction(const QCameraParameters& params)
   3639 {
   3640     const char *str = params.get(KEY_QC_REDEYE_REDUCTION);
   3641     const char *prev_str = get(KEY_QC_REDEYE_REDUCTION);
   3642     if (str != NULL) {
   3643         if (prev_str == NULL ||
   3644             strcmp(str, prev_str) != 0) {
   3645             return setRedeyeReduction(str);
   3646         }
   3647     }
   3648     return NO_ERROR;
   3649 }
   3650 
   3651 /*===========================================================================
   3652  * FUNCTION   : setGpsLocation
   3653  *
   3654  * DESCRIPTION: set GPS location information from user setting
   3655  *
   3656  * PARAMETERS :
   3657  *   @params  : user setting parameters
   3658  *
   3659  * RETURN     : int32_t type of status
   3660  *              NO_ERROR  -- success
   3661  *              none-zero failure code
   3662  *==========================================================================*/
   3663 int32_t QCameraParameters::setGpsLocation(const QCameraParameters& params)
   3664 {
   3665     const char *method = params.get(KEY_GPS_PROCESSING_METHOD);
   3666     if (method) {
   3667         set(KEY_GPS_PROCESSING_METHOD, method);
   3668     }else {
   3669         remove(KEY_GPS_PROCESSING_METHOD);
   3670     }
   3671 
   3672     const char *latitude = params.get(KEY_GPS_LATITUDE);
   3673     if (latitude) {
   3674         set(KEY_GPS_LATITUDE, latitude);
   3675     }else {
   3676         remove(KEY_GPS_LATITUDE);
   3677     }
   3678 
   3679     const char *latitudeRef = params.get(KEY_QC_GPS_LATITUDE_REF);
   3680     if (latitudeRef) {
   3681         set(KEY_QC_GPS_LATITUDE_REF, latitudeRef);
   3682     }else {
   3683         remove(KEY_QC_GPS_LATITUDE_REF);
   3684     }
   3685 
   3686     const char *longitude = params.get(KEY_GPS_LONGITUDE);
   3687     if (longitude) {
   3688         set(KEY_GPS_LONGITUDE, longitude);
   3689     }else {
   3690         remove(KEY_GPS_LONGITUDE);
   3691     }
   3692 
   3693     const char *longitudeRef = params.get(KEY_QC_GPS_LONGITUDE_REF);
   3694     if (longitudeRef) {
   3695         set(KEY_QC_GPS_LONGITUDE_REF, longitudeRef);
   3696     }else {
   3697         remove(KEY_QC_GPS_LONGITUDE_REF);
   3698     }
   3699 
   3700     const char *altitudeRef = params.get(KEY_QC_GPS_ALTITUDE_REF);
   3701     if (altitudeRef) {
   3702         set(KEY_QC_GPS_ALTITUDE_REF, altitudeRef);
   3703     }else {
   3704         remove(KEY_QC_GPS_ALTITUDE_REF);
   3705     }
   3706 
   3707     const char *altitude = params.get(KEY_GPS_ALTITUDE);
   3708     if (altitude) {
   3709         set(KEY_GPS_ALTITUDE, altitude);
   3710     }else {
   3711         remove(KEY_GPS_ALTITUDE);
   3712     }
   3713 
   3714     const char *status = params.get(KEY_QC_GPS_STATUS);
   3715     if (status) {
   3716         set(KEY_QC_GPS_STATUS, status);
   3717     } else {
   3718         remove(KEY_QC_GPS_STATUS);
   3719     }
   3720 
   3721     const char *timestamp = params.get(KEY_GPS_TIMESTAMP);
   3722     if (timestamp) {
   3723         set(KEY_GPS_TIMESTAMP, timestamp);
   3724     }else {
   3725         remove(KEY_GPS_TIMESTAMP);
   3726     }
   3727     return NO_ERROR;
   3728 }
   3729 
   3730 /*===========================================================================
   3731  * FUNCTION   : setNumOfSnapshot
   3732  *
   3733  * DESCRIPTION: set number of snapshot per shutter from user setting
   3734  *
   3735  * PARAMETERS : none
   3736  *
   3737  * RETURN     : int32_t type of status
   3738  *              NO_ERROR  -- success
   3739  *              none-zero failure code
   3740  *==========================================================================*/
   3741 int32_t QCameraParameters::setNumOfSnapshot()
   3742 {
   3743     int nBurstNum = getBurstNum();
   3744     int nExpnum = 0;
   3745 
   3746     const char *bracket_str = get(KEY_QC_AE_BRACKET_HDR);
   3747     if (bracket_str != NULL && strlen(bracket_str) > 0) {
   3748         int value = lookupAttr(BRACKETING_MODES_MAP, PARAM_MAP_SIZE(BRACKETING_MODES_MAP),
   3749                 bracket_str);
   3750         switch (value) {
   3751         case CAM_EXP_BRACKETING_ON:
   3752             {
   3753                 nExpnum = 0;
   3754                 const char *str_val = get(KEY_QC_CAPTURE_BURST_EXPOSURE);
   3755                 if ((str_val != NULL) && (strlen(str_val) > 0)) {
   3756                     char prop[PROPERTY_VALUE_MAX];
   3757                     memset(prop, 0, sizeof(prop));
   3758                     strlcpy(prop, str_val, PROPERTY_VALUE_MAX);
   3759                     char *saveptr = NULL;
   3760                     char *token = strtok_r(prop, ",", &saveptr);
   3761                     while (token != NULL) {
   3762                         token = strtok_r(NULL, ",", &saveptr);
   3763                         nExpnum++;
   3764                     }
   3765                 }
   3766                 if (nExpnum == 0) {
   3767                     nExpnum = 1;
   3768                 }
   3769             }
   3770             break;
   3771         default:
   3772             nExpnum = 1 + getNumOfExtraHDROutBufsIfNeeded();
   3773             break;
   3774         }
   3775     }
   3776 
   3777     if (isUbiRefocus()) {
   3778         nBurstNum = m_pCapability->refocus_af_bracketing_need.output_count + 1;
   3779     }
   3780 
   3781     CDBG_HIGH("%s: nBurstNum = %d, nExpnum = %d", __func__, nBurstNum, nExpnum);
   3782     set(KEY_QC_NUM_SNAPSHOT_PER_SHUTTER, nBurstNum * nExpnum);
   3783     return NO_ERROR;
   3784 }
   3785 
   3786 /*===========================================================================
   3787  * FUNCTION   : setRecordingHint
   3788  *
   3789  * DESCRIPTION: set recording hint value from user setting
   3790  *
   3791  * PARAMETERS :
   3792  *   @params  : user setting parameters
   3793  *
   3794  * RETURN     : int32_t type of status
   3795  *              NO_ERROR  -- success
   3796  *              none-zero failure code
   3797  *==========================================================================*/
   3798 int32_t QCameraParameters::setRecordingHint(const QCameraParameters& params)
   3799 {
   3800     const char * str = params.get(KEY_RECORDING_HINT);
   3801     const char *prev_str = get(KEY_RECORDING_HINT);
   3802     if (str != NULL) {
   3803         if (prev_str == NULL || strcmp(str, prev_str) != 0) {
   3804             int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP, PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP),
   3805                     str);
   3806             if(value != NAME_NOT_FOUND){
   3807                 updateParamEntry(KEY_RECORDING_HINT, str);
   3808                 setRecordingHintValue(value);
   3809                 if (getFaceDetectionOption() == true) {
   3810                     setFaceDetection(value > 0 ? false : true, false);
   3811                 }
   3812                 if (m_bDISEnabled) {
   3813                     CDBG_HIGH("%s: %d: Setting DIS value again", __func__, __LINE__);
   3814                     setDISValue(VALUE_ENABLE);
   3815                 }
   3816                 return NO_ERROR;
   3817             } else {
   3818                 ALOGE("Invalid recording hint value: %s", str);
   3819                 return BAD_VALUE;
   3820             }
   3821         }
   3822     }
   3823     return NO_ERROR;
   3824 }
   3825 
   3826 /*===========================================================================
   3827  * FUNCTION   : setNoDisplayMode
   3828  *
   3829  * DESCRIPTION: set no display mode from user setting
   3830  *
   3831  * PARAMETERS :
   3832  *   @params  : user setting parameters
   3833  *
   3834  * RETURN     : int32_t type of status
   3835  *              NO_ERROR  -- success
   3836  *              none-zero failure code
   3837  *==========================================================================*/
   3838 int32_t QCameraParameters::setNoDisplayMode(const QCameraParameters& params)
   3839 {
   3840     const char *str_val  = params.get(KEY_QC_NO_DISPLAY_MODE);
   3841     const char *prev_str = get(KEY_QC_NO_DISPLAY_MODE);
   3842     char prop[PROPERTY_VALUE_MAX];
   3843 
   3844     if(str_val && strlen(str_val) > 0) {
   3845         if (prev_str == NULL || strcmp(str_val, prev_str) != 0) {
   3846             m_bNoDisplayMode = atoi(str_val);
   3847             set(KEY_QC_NO_DISPLAY_MODE, str_val);
   3848             m_bNeedRestart = true;
   3849         }
   3850     } else {
   3851         memset(prop, 0, sizeof(prop));
   3852         property_get("persist.camera.no-display", prop, "0");
   3853         m_bNoDisplayMode = atoi(prop);
   3854     }
   3855     CDBG_HIGH("Param m_bNoDisplayMode = %d", m_bNoDisplayMode);
   3856     return NO_ERROR;
   3857 }
   3858 
   3859 /*===========================================================================
   3860  * FUNCTION   : setZslMode
   3861  *
   3862  * DESCRIPTION: set ZSL mode from user setting
   3863  *
   3864  * PARAMETERS :
   3865  *   @params  : user setting parameters
   3866  *
   3867  * RETURN     : int32_t type of status
   3868  *              NO_ERROR  -- success
   3869  *              none-zero failure code
   3870  *==========================================================================*/
   3871 int32_t QCameraParameters::setZslMode(const QCameraParameters& params)
   3872 {
   3873     const char *str_val  = params.get(KEY_QC_ZSL);
   3874     const char *prev_val  = get(KEY_QC_ZSL);
   3875     int32_t rc = NO_ERROR;
   3876 
   3877     if(m_bForceZslMode && !m_bZslMode) {
   3878         // Force ZSL mode to ON
   3879         set(KEY_QC_ZSL, VALUE_ON);
   3880         m_bZslMode_new = true;
   3881         m_bZslMode = true;
   3882         m_bNeedRestart = true;
   3883         int32_t value = m_bForceZslMode;
   3884         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ZSL_MODE, value)) {
   3885             rc = BAD_VALUE;
   3886         }
   3887     } else if (str_val != NULL) {
   3888         if (prev_val == NULL || strcmp(str_val, prev_val) != 0) {
   3889             int32_t value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP),
   3890                     str_val);
   3891             if (value != NAME_NOT_FOUND) {
   3892                 set(KEY_QC_ZSL, str_val);
   3893                 m_bZslMode_new = (value > 0)? true : false;
   3894 
   3895                 // ZSL mode changed, need restart preview
   3896                 m_bNeedRestart = true;
   3897 
   3898                 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ZSL_MODE, value)) {
   3899                     rc = BAD_VALUE;
   3900                 }
   3901             } else {
   3902                 ALOGE("Invalid ZSL mode value: %s", str_val);
   3903                 rc = BAD_VALUE;
   3904             }
   3905         }
   3906     }
   3907     ALOGI("%s: enabled: %d", __func__, m_bZslMode_new);
   3908     return rc;
   3909 }
   3910 
   3911 /*===========================================================================
   3912  * FUNCTION   : setWaveletDenoise
   3913  *
   3914  * DESCRIPTION: set wavelet denoise value from user setting
   3915  *
   3916  * PARAMETERS :
   3917  *   @params  : user setting parameters
   3918  *
   3919  * RETURN     : int32_t type of status
   3920  *              NO_ERROR  -- success
   3921  *              none-zero failure code
   3922  *==========================================================================*/
   3923 int32_t QCameraParameters::setWaveletDenoise(const QCameraParameters& params)
   3924 {
   3925     const char *str_pf = params.getPictureFormat();
   3926     int32_t pictureFormat = lookupAttr(PICTURE_TYPES_MAP, PARAM_MAP_SIZE(PICTURE_TYPES_MAP),
   3927             str_pf);
   3928     if (pictureFormat != NAME_NOT_FOUND) {
   3929         if (CAM_FORMAT_YUV_422_NV16 == pictureFormat) {
   3930             ALOGE("NV16 format isn't supported in denoise lib!");
   3931             return setWaveletDenoise(DENOISE_OFF);
   3932         }
   3933     }
   3934     const char *str = params.get(KEY_QC_DENOISE);
   3935     const char *prev_str = get(KEY_QC_DENOISE);
   3936     if (str != NULL) {
   3937         if (prev_str == NULL ||
   3938             strcmp(str, prev_str) != 0) {
   3939             return setWaveletDenoise(str);
   3940         }
   3941     }
   3942     return NO_ERROR;
   3943 }
   3944 
   3945 /*===========================================================================
   3946  * FUNCTION   : setTemporalDenoise
   3947  *
   3948  * DESCRIPTION: set temporal denoise value from properties
   3949  *
   3950  * PARAMETERS : none
   3951  *
   3952  * RETURN     : int32_t type of status
   3953  *              NO_ERROR  -- success
   3954  *              none-zero failure code
   3955  *==========================================================================*/
   3956 int32_t QCameraParameters::setTemporalDenoise(const QCameraParameters& params)
   3957 {
   3958     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_CPP_TNR) == 0) {
   3959         CDBG_HIGH("%s: TNR is not supported",__func__);
   3960         return NO_ERROR;
   3961     }
   3962     const char *str = params.get(KEY_QC_TNR_MODE);
   3963     const char *prev_str = get(KEY_QC_TNR_MODE);
   3964     const char *video_str = params.get(KEY_QC_VIDEO_TNR_MODE);
   3965     const char *video_prev_str = get(KEY_QC_VIDEO_TNR_MODE);
   3966 
   3967     if (m_bRecordingHint_new == true) {
   3968         if (video_str) {
   3969             if ((video_prev_str == NULL) || (strcmp(video_str, video_prev_str) != 0)) {
   3970                 if (!strcmp(video_str, VALUE_ON)) {
   3971                     m_bTNRVideoOn = true;
   3972                     m_bTNRPreviewOn = true;
   3973                 } else {
   3974                     m_bTNRVideoOn = false;
   3975                     m_bTNRPreviewOn = false;
   3976                 }
   3977                 updateParamEntry(KEY_QC_VIDEO_TNR_MODE, video_str);
   3978             } else {
   3979                 return NO_ERROR;
   3980             }
   3981         } else {
   3982             char video_value[PROPERTY_VALUE_MAX];
   3983             memset(video_value, 0, sizeof(video_value));
   3984             property_get("persist.camera.tnr.video", video_value, VALUE_OFF);
   3985             if (!strcmp(video_value, VALUE_ON)) {
   3986                 m_bTNRVideoOn = true;
   3987             } else {
   3988                 m_bTNRVideoOn = false;
   3989             }
   3990             updateParamEntry(KEY_QC_VIDEO_TNR_MODE, video_value);
   3991 
   3992             char preview_value[PROPERTY_VALUE_MAX];
   3993             memset(preview_value, 0, sizeof(preview_value));
   3994             property_get("persist.camera.tnr.preview", preview_value, video_value);
   3995             if (!strcmp(preview_value, VALUE_ON)) {
   3996                 m_bTNRPreviewOn = true;
   3997             } else {
   3998                 m_bTNRPreviewOn = false;
   3999             }
   4000             updateParamEntry(KEY_QC_TNR_MODE, preview_value);
   4001         }
   4002 
   4003         cam_denoise_param_t temp;
   4004         memset(&temp, 0, sizeof(temp));
   4005         if (m_bTNRVideoOn || m_bTNRPreviewOn) {
   4006             temp.denoise_enable = 1;
   4007             temp.process_plates = getDenoiseProcessPlate(CAM_INTF_PARM_TEMPORAL_DENOISE);
   4008 
   4009             int32_t cds_mode = lookupAttr(CDS_MODES_MAP, PARAM_MAP_SIZE(CDS_MODES_MAP),
   4010                     CDS_MODE_OFF);
   4011 
   4012             if (cds_mode != NAME_NOT_FOUND) {
   4013                 updateParamEntry(KEY_QC_VIDEO_CDS_MODE, CDS_MODE_OFF);
   4014                 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
   4015                     ALOGE("%s:Failed CDS MODE to update table", __func__);
   4016                     return BAD_VALUE;
   4017                 }
   4018                 CDBG("%s: CDS in video mode is set to = %s when TNR is enabled",
   4019                         __func__, CDS_MODE_OFF);
   4020                 mCds_mode = cds_mode;
   4021             } else {
   4022                 ALOGE("%s: Invalid argument for video CDS MODE %d", __func__, cds_mode);
   4023             }
   4024         }
   4025         CDBG("%s: TNR enable in video mode = %d, plates = %d", __func__,
   4026                 temp.denoise_enable, temp.process_plates);
   4027         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_TEMPORAL_DENOISE, temp)) {
   4028             return BAD_VALUE;
   4029         }
   4030     } else {
   4031         if (str) {
   4032             if ((prev_str == NULL) || (strcmp(str, prev_str) != 0)) {
   4033                 if (!strcmp(str, VALUE_ON)) {
   4034                     m_bTNRPreviewOn = true;
   4035                 } else {
   4036                     m_bTNRPreviewOn = false;
   4037                 }
   4038                 updateParamEntry(KEY_QC_TNR_MODE, str);
   4039             } else {
   4040                 return NO_ERROR;
   4041             }
   4042         } else {
   4043             char value[PROPERTY_VALUE_MAX];
   4044             memset(value, 0, sizeof(value));
   4045             property_get("persist.camera.tnr.preview", value, VALUE_OFF);
   4046             if (!strcmp(value, VALUE_ON)) {
   4047                 m_bTNRPreviewOn = true;
   4048             } else {
   4049                 m_bTNRPreviewOn = false;
   4050             }
   4051             updateParamEntry(KEY_QC_TNR_MODE, value);
   4052         }
   4053         cam_denoise_param_t temp;
   4054         memset(&temp, 0, sizeof(temp));
   4055         if (m_bTNRPreviewOn) {
   4056             temp.denoise_enable = 1;
   4057             temp.process_plates = getDenoiseProcessPlate(CAM_INTF_PARM_TEMPORAL_DENOISE);
   4058 
   4059             int32_t cds_mode = lookupAttr(CDS_MODES_MAP, PARAM_MAP_SIZE(CDS_MODES_MAP),
   4060                     CDS_MODE_OFF);
   4061 
   4062             if (cds_mode != NAME_NOT_FOUND) {
   4063                 updateParamEntry(KEY_QC_CDS_MODE, CDS_MODE_OFF);
   4064                 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
   4065                     ALOGE("%s:Failed CDS MODE to update table", __func__);
   4066                     return BAD_VALUE;
   4067                 }
   4068                 CDBG("%s: CDS in snapshot mode is set to = %s when TNR is enabled",
   4069                         __func__, CDS_MODE_OFF);
   4070                 mCds_mode = cds_mode;
   4071             } else {
   4072                 ALOGE("%s: Invalid argument for snapshot CDS MODE %d", __func__, cds_mode);
   4073             }
   4074         }
   4075         CDBG("%s: TNR enable in snapshot mode = %d, plates = %d", __func__,
   4076                 temp.denoise_enable, temp.process_plates);
   4077         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_TEMPORAL_DENOISE, temp)) {
   4078             return BAD_VALUE;
   4079         }
   4080     }
   4081 
   4082     return NO_ERROR;
   4083 }
   4084 
   4085 /*===========================================================================
   4086  * FUNCTION   : setCameraMode
   4087  *
   4088  * DESCRIPTION: set camera mode from user setting
   4089  *
   4090  * PARAMETERS :
   4091  *   @params  : user setting parameters
   4092  *
   4093  * RETURN     : int32_t type of status
   4094  *              NO_ERROR  -- success
   4095  *              none-zero failure code
   4096  *==========================================================================*/
   4097 int32_t QCameraParameters::setCameraMode(const QCameraParameters& params)
   4098 {
   4099     const char *str = params.get(KEY_QC_CAMERA_MODE);
   4100     if (str != NULL) {
   4101         set(KEY_QC_CAMERA_MODE, str);
   4102     } else {
   4103         remove(KEY_QC_CAMERA_MODE);
   4104     }
   4105     return NO_ERROR;
   4106 }
   4107 
   4108 /*===========================================================================
   4109  * FUNCTION   : setSceneSelectionMode
   4110  *
   4111  * DESCRIPTION: set scene selection mode from user setting
   4112  *
   4113  * PARAMETERS :
   4114  *   @params  : user setting parameters
   4115  *
   4116  * RETURN     : int32_t type of status
   4117  *              NO_ERROR  -- success
   4118  *              none-zero failure code
   4119  *==========================================================================*/
   4120 int32_t QCameraParameters::setSceneSelectionMode(const QCameraParameters& params)
   4121 {
   4122     const char *str = params.get(KEY_QC_SCENE_SELECTION);
   4123     const char *prev_str = get(KEY_QC_SCENE_SELECTION);
   4124     if (NULL != str) {
   4125         if ((NULL == prev_str) || (strcmp(str, prev_str) != 0)) {
   4126             int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   4127                     PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), str);
   4128             if (value != NAME_NOT_FOUND) {
   4129                 ALOGD("%s: Setting selection value %s", __func__, str);
   4130                 if (value && m_bZslMode_new) {
   4131                     updateParamEntry(KEY_QC_SCENE_SELECTION, str);
   4132                     m_bNeedRestart = true;
   4133                     m_bSceneSelection = true;
   4134                 } else if (!value) {
   4135                     updateParamEntry(KEY_QC_SCENE_SELECTION, str);
   4136                     m_bNeedRestart = true;
   4137                     m_bSceneSelection = false;
   4138                 } else {
   4139                     ALOGE("%s: Trying to enable scene selection in non ZSL mode!!!",
   4140                             __func__);
   4141                     return BAD_VALUE;
   4142                 }
   4143             } else {
   4144                 ALOGE("%s: Trying to configure invalid scene selection value: %s",
   4145                         __func__,
   4146                         str);
   4147                 return BAD_VALUE;
   4148             }
   4149         }
   4150     }
   4151 
   4152     return NO_ERROR;
   4153 }
   4154 
   4155 /*===========================================================================
   4156  * FUNCTION   : setSelectedScene
   4157  *
   4158  * DESCRIPTION: select specific scene
   4159  *
   4160  * PARAMETERS :
   4161  *   @scene   : scene mode
   4162  *
   4163  * RETURN     : int32_t type of status
   4164  *              NO_ERROR  -- success
   4165  *              none-zero failure code
   4166  *==========================================================================*/
   4167 int32_t QCameraParameters::setSelectedScene(cam_scene_mode_type scene)
   4168 {
   4169     Mutex::Autolock l(m_SceneSelectLock);
   4170     m_SelectedScene = scene;
   4171     return NO_ERROR;
   4172 }
   4173 
   4174 /*===========================================================================
   4175  * FUNCTION   : getSelectedScene
   4176  *
   4177  * DESCRIPTION: get selected scene
   4178  *
   4179  * PARAMETERS :
   4180  *
   4181  * RETURN     : currently selected scene
   4182  *==========================================================================*/
   4183 cam_scene_mode_type QCameraParameters::getSelectedScene()
   4184 {
   4185     Mutex::Autolock l(m_SceneSelectLock);
   4186     return m_SelectedScene;
   4187 }
   4188 
   4189 /*==========================================================
   4190  * FUNCTION   : setRdiMode
   4191  *
   4192  * DESCRIPTION: set Rdi mode from user setting
   4193  *
   4194  * PARAMETERS :
   4195  *   @params  : user setting parameters
   4196  *
   4197  * RETURN     : int32_t type of status
   4198  *              NO_ERROR  -- success
   4199  *              none-zero failure code
   4200  *===========================================================*/
   4201 int32_t QCameraParameters::setRdiMode(const QCameraParameters& params)
   4202 {
   4203     const char *str = params.get(KEY_QC_RDI_MODE);
   4204     const char *prev_str = get(KEY_QC_RDI_MODE);
   4205     char prop[PROPERTY_VALUE_MAX];
   4206     memset(prop, 0, sizeof(prop));
   4207 
   4208     property_get("persist.camera.rdi.mode", prop, VALUE_DISABLE);
   4209     if ((str != NULL) && (prev_str == NULL || strcmp(str, prev_str) != 0)) {
   4210         ALOGD("%s:%d : RDI mode set to %s", __func__, __LINE__, str);
   4211         setRdiMode(str);
   4212     } else if (prev_str == NULL || strcmp(prev_str, prop) != 0 ) {
   4213         ALOGD("%s:%d : RDI mode set to prop: %s", __func__, __LINE__, prop);
   4214         setRdiMode(prop);
   4215     }
   4216     return NO_ERROR;
   4217 }
   4218 
   4219 /*==========================================================
   4220  * FUNCTION   : setSecureMode
   4221  *
   4222  * DESCRIPTION: set secure mode from user setting
   4223  *
   4224  * PARAMETERS :
   4225  *   @params  : user setting parameters
   4226  *
   4227  * RETURN     : int32_t type of status
   4228  *              NO_ERROR  -- success
   4229  *              none-zero failure code
   4230  *===========================================================*/
   4231 
   4232 int32_t QCameraParameters::setSecureMode(const QCameraParameters& params)
   4233 {
   4234     const char *str = params.get(KEY_QC_SECURE_MODE);
   4235     const char *prev_str = get(KEY_QC_SECURE_MODE);
   4236     char prop[PROPERTY_VALUE_MAX];
   4237     memset(prop, 0, sizeof(prop));
   4238 
   4239     property_get("persist.camera.secure.mode", prop, VALUE_DISABLE);
   4240     if ((str != NULL) && (prev_str == NULL || strcmp(str, prev_str) != 0)) {
   4241         ALOGD("%s : Secure mode set to KEY: %s", __func__, str);
   4242         setSecureMode(str);
   4243     } else if (prev_str == NULL || strcmp(prev_str, prop) != 0 ) {
   4244         ALOGD("%s : Secure mode set to prop: %s", __func__, prop);
   4245         setSecureMode(prop);
   4246     }
   4247     return NO_ERROR;
   4248 }
   4249 
   4250 /*===========================================================================
   4251  * FUNCTION   : setZslAttributes
   4252  *
   4253  * DESCRIPTION: set ZSL related attributes from user setting
   4254  *
   4255  * PARAMETERS :
   4256  *   @params  : user setting parameters
   4257  *
   4258  * RETURN     : int32_t type of status
   4259  *              NO_ERROR  -- success
   4260  *              none-zero failure code
   4261  *==========================================================================*/
   4262 int32_t QCameraParameters::setZslAttributes(const QCameraParameters& params)
   4263 {
   4264     // TODO: may switch to pure param instead of sysprop
   4265     char prop[PROPERTY_VALUE_MAX];
   4266 
   4267     const char *str = params.get(KEY_QC_ZSL_BURST_INTERVAL);
   4268     if (str != NULL) {
   4269         set(KEY_QC_ZSL_BURST_INTERVAL, str);
   4270     } else {
   4271         memset(prop, 0, sizeof(prop));
   4272         property_get("persist.camera.zsl.interval", prop, "1");
   4273         set(KEY_QC_ZSL_BURST_INTERVAL, prop);
   4274         CDBG_HIGH("%s: [ZSL Retro] burst interval: %s", __func__, prop);
   4275     }
   4276 
   4277     str = params.get(KEY_QC_ZSL_BURST_LOOKBACK);
   4278     if (str != NULL) {
   4279         set(KEY_QC_ZSL_BURST_LOOKBACK, str);
   4280     } else {
   4281         memset(prop, 0, sizeof(prop));
   4282         property_get("persist.camera.zsl.backlookcnt", prop, "2");
   4283         set(KEY_QC_ZSL_BURST_LOOKBACK, prop);
   4284         CDBG_HIGH("%s: [ZSL Retro] look back count: %s", __func__, prop);
   4285     }
   4286 
   4287     str = params.get(KEY_QC_ZSL_QUEUE_DEPTH);
   4288     if (str != NULL) {
   4289         set(KEY_QC_ZSL_QUEUE_DEPTH, str);
   4290     } else {
   4291         memset(prop, 0, sizeof(prop));
   4292         property_get("persist.camera.zsl.queuedepth", prop, "2");
   4293         set(KEY_QC_ZSL_QUEUE_DEPTH, prop);
   4294         CDBG_HIGH("%s: [ZSL Retro] queue depth: %s", __func__, prop);
   4295     }
   4296 
   4297     return NO_ERROR;
   4298 }
   4299 
   4300 /*===========================================================================
   4301  * FUNCTION   : setFlip
   4302  *
   4303  * DESCRIPTION: set preview/ video/ picture flip mode from user setting
   4304  *
   4305  * PARAMETERS :
   4306  *   @params  : user setting parameters
   4307  *
   4308  * RETURN     : int32_t type of status
   4309  *              NO_ERROR  -- success
   4310  *              none-zero failure code
   4311  *==========================================================================*/
   4312 int32_t QCameraParameters::setFlip(const QCameraParameters& params)
   4313 {
   4314     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_FLIP) == 0) {
   4315         CDBG_HIGH("%s: flip is not supported.", __func__);
   4316         return NO_ERROR;
   4317     }
   4318 
   4319     //check preview flip setting
   4320     const char *str = params.get(KEY_QC_PREVIEW_FLIP);
   4321     const char *prev_val = get(KEY_QC_PREVIEW_FLIP);
   4322     if(str != NULL){
   4323         if (prev_val == NULL || strcmp(str, prev_val) != 0) {
   4324             int32_t value = lookupAttr(FLIP_MODES_MAP, PARAM_MAP_SIZE(FLIP_MODES_MAP), str);
   4325             if(value != NAME_NOT_FOUND){
   4326                 set(KEY_QC_PREVIEW_FLIP, str);
   4327                 m_bPreviewFlipChanged = true;
   4328             }
   4329         }
   4330     }
   4331 
   4332     // check video filp setting
   4333     str = params.get(KEY_QC_VIDEO_FLIP);
   4334     prev_val = get(KEY_QC_VIDEO_FLIP);
   4335     if(str != NULL){
   4336         if (prev_val == NULL || strcmp(str, prev_val) != 0) {
   4337             int32_t value = lookupAttr(FLIP_MODES_MAP, PARAM_MAP_SIZE(FLIP_MODES_MAP), str);
   4338             if(value != NAME_NOT_FOUND){
   4339                 set(KEY_QC_VIDEO_FLIP, str);
   4340                 m_bVideoFlipChanged = true;
   4341             }
   4342         }
   4343     }
   4344 
   4345     // check picture filp setting
   4346     str = params.get(KEY_QC_SNAPSHOT_PICTURE_FLIP);
   4347     prev_val = get(KEY_QC_SNAPSHOT_PICTURE_FLIP);
   4348     if(str != NULL){
   4349         if (prev_val == NULL || strcmp(str, prev_val) != 0) {
   4350             int32_t value = lookupAttr(FLIP_MODES_MAP, PARAM_MAP_SIZE(FLIP_MODES_MAP), str);
   4351             if(value != NAME_NOT_FOUND){
   4352                 set(KEY_QC_SNAPSHOT_PICTURE_FLIP, str);
   4353                 m_bSnapshotFlipChanged = true;
   4354             }
   4355         }
   4356     }
   4357 
   4358     return NO_ERROR;
   4359 }
   4360 
   4361 /*===========================================================================
   4362  * FUNCTION   : setBurstNum
   4363  *
   4364  * DESCRIPTION: set burst number of snapshot
   4365  *
   4366  * PARAMETERS :
   4367  *   @params  : user setting parameters
   4368  *
   4369  * RETURN     : int32_t type of status
   4370  *              NO_ERROR  -- success
   4371  *              none-zero failure code
   4372  *==========================================================================*/
   4373 int32_t QCameraParameters::setBurstNum(const QCameraParameters& params)
   4374 {
   4375     int nBurstNum = params.getInt(KEY_QC_SNAPSHOT_BURST_NUM);
   4376     if (isAdvCamFeaturesEnabled()) {
   4377         nBurstNum = 1;
   4378     }
   4379     if (nBurstNum <= 0) {
   4380         // if burst number is not set in parameters,
   4381         // read from sys prop
   4382         char prop[PROPERTY_VALUE_MAX];
   4383         memset(prop, 0, sizeof(prop));
   4384         property_get("persist.camera.snapshot.number", prop, "0");
   4385         nBurstNum = atoi(prop);
   4386         if (nBurstNum <= 0) {
   4387             nBurstNum = 1;
   4388         }
   4389     }
   4390     set(KEY_QC_SNAPSHOT_BURST_NUM, nBurstNum);
   4391     m_nBurstNum = (uint8_t)nBurstNum;
   4392     CDBG_HIGH("%s: [ZSL Retro] m_nBurstNum = %d", __func__, m_nBurstNum);
   4393     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_BURST_NUM, (uint32_t)nBurstNum)) {
   4394         return BAD_VALUE;
   4395     }
   4396 
   4397     return NO_ERROR;
   4398 }
   4399 
   4400 /*===========================================================================
   4401  * FUNCTION   : setSnapshotFDReq
   4402  *
   4403  * DESCRIPTION: set requirement of Face Detection Metadata in Snapshot mode.
   4404  *
   4405  * PARAMETERS :
   4406  *   @params  : user setting parameters
   4407  *
   4408  * RETURN     : int32_t type of status
   4409  *              NO_ERROR  -- success
   4410  *              none-zero failure code
   4411  *==========================================================================*/
   4412 int32_t QCameraParameters::setSnapshotFDReq(const QCameraParameters& params)
   4413 {
   4414     char prop[PROPERTY_VALUE_MAX];
   4415     const char *str = params.get(KEY_QC_SNAPSHOT_FD_DATA);
   4416 
   4417     if(str != NULL){
   4418         set(KEY_QC_SNAPSHOT_FD_DATA, str);
   4419     }else{
   4420         memset(prop, 0, sizeof(prop));
   4421         property_get("persist.camera.snapshot.fd", prop, "0");
   4422         set(KEY_QC_SNAPSHOT_FD_DATA, prop);
   4423     }
   4424     return NO_ERROR;
   4425 }
   4426 
   4427 /*===========================================================================
   4428  * FUNCTION   : setMobicat
   4429  *
   4430  * DESCRIPTION: set Mobicat on/off.
   4431  *
   4432  * PARAMETERS :
   4433  *   @params  : user setting parameters
   4434  *
   4435  * RETURN     : int32_t type of status
   4436  *              NO_ERROR  -- success
   4437  *              none-zero failure code
   4438  *==========================================================================*/
   4439 int32_t QCameraParameters::setMobicat(const QCameraParameters& )
   4440 {
   4441     char value [PROPERTY_VALUE_MAX];
   4442     property_get("persist.camera.mobicat", value, "0");
   4443     int32_t ret = NO_ERROR;
   4444     uint8_t enableMobi = (uint8_t)atoi(value);
   4445 
   4446     if (enableMobi) {
   4447         tune_cmd_t tune_cmd;
   4448         tune_cmd.type = 2;
   4449         tune_cmd.module = 0;
   4450         tune_cmd.value = 1;
   4451         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SET_VFE_COMMAND, tune_cmd)) {
   4452             return BAD_VALUE;
   4453         }
   4454         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SET_PP_COMMAND, tune_cmd)) {
   4455             ret = BAD_VALUE;
   4456         }
   4457     }
   4458     m_MobiMask = enableMobi;
   4459 
   4460     return ret;
   4461 }
   4462 
   4463 /*===========================================================================
   4464  * FUNCTION   : updateParameters
   4465  *
   4466  * DESCRIPTION: update parameters from user setting
   4467  *
   4468  * PARAMETERS :
   4469  *   @params  : user setting parameters
   4470  *   @needRestart : [output] if preview need restart upon setting changes
   4471  *
   4472  * RETURN     : int32_t type of status
   4473  *              NO_ERROR  -- success
   4474  *              none-zero failure code
   4475  *==========================================================================*/
   4476 int32_t QCameraParameters::updateParameters(QCameraParameters& params,
   4477         bool &needRestart)
   4478 {
   4479     int32_t final_rc = NO_ERROR;
   4480     int32_t rc;
   4481     m_bNeedRestart = false;
   4482 
   4483     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   4484         ALOGE("%s:Failed to initialize group update table",__func__);
   4485         rc = BAD_TYPE;
   4486         goto UPDATE_PARAM_DONE;
   4487     }
   4488 
   4489     if ((rc = setPreviewSize(params)))                  final_rc = rc;
   4490     if ((rc = setVideoSize(params)))                    final_rc = rc;
   4491     if ((rc = setPictureSize(params)))                  final_rc = rc;
   4492     if ((rc = setPreviewFormat(params)))                final_rc = rc;
   4493     if ((rc = setPictureFormat(params)))                final_rc = rc;
   4494     if ((rc = setJpegQuality(params)))                  final_rc = rc;
   4495     if ((rc = setOrientation(params)))                  final_rc = rc;
   4496     if ((rc = setRotation(params)))                     final_rc = rc;
   4497     if ((rc = setVideoRotation(params)))                final_rc = rc;
   4498     if ((rc = setNoDisplayMode(params)))                final_rc = rc;
   4499     if ((rc = setZslMode(params)))                      final_rc = rc;
   4500     if ((rc = setZslAttributes(params)))                final_rc = rc;
   4501     if ((rc = setCameraMode(params)))                   final_rc = rc;
   4502     if ((rc = setSceneSelectionMode(params)))           final_rc = rc;
   4503     if ((rc = setRecordingHint(params)))                final_rc = rc;
   4504     if ((rc = setRdiMode(params)))                      final_rc = rc;
   4505     if ((rc = setSecureMode(params)))                   final_rc = rc;
   4506     if ((rc = setPreviewFrameRate(params)))             final_rc = rc;
   4507     if ((rc = setPreviewFpsRange(params)))              final_rc = rc;
   4508     if ((rc = setAutoExposure(params)))                 final_rc = rc;
   4509     if ((rc = setEffect(params)))                       final_rc = rc;
   4510     if ((rc = setBrightness(params)))                   final_rc = rc;
   4511     if ((rc = setZoom(params)))                         final_rc = rc;
   4512     if ((rc = setSharpness(params)))                    final_rc = rc;
   4513     if ((rc = setSaturation(params)))                   final_rc = rc;
   4514     if ((rc = setContrast(params)))                     final_rc = rc;
   4515     if ((rc = setFocusMode(params)))                    final_rc = rc;
   4516     if ((rc = setISOValue(params)))                     final_rc = rc;
   4517     if ((rc = setContinuousISO(params)))                final_rc = rc;
   4518     if ((rc = setExposureTime(params)))                 final_rc = rc;
   4519     if ((rc = setSkinToneEnhancement(params)))          final_rc = rc;
   4520     if ((rc = setFlash(params)))                        final_rc = rc;
   4521     if ((rc = setAecLock(params)))                      final_rc = rc;
   4522     if ((rc = setAwbLock(params)))                      final_rc = rc;
   4523     if ((rc = setLensShadeValue(params)))               final_rc = rc;
   4524     if ((rc = setMCEValue(params)))                     final_rc = rc;
   4525     if ((rc = setDISValue(params)))                     final_rc = rc;
   4526     if ((rc = setAntibanding(params)))                  final_rc = rc;
   4527     if ((rc = setExposureCompensation(params)))         final_rc = rc;
   4528     if ((rc = setWhiteBalance(params)))                 final_rc = rc;
   4529     if ((rc = setHDRMode(params)))                      final_rc = rc;
   4530     if ((rc = setHDRNeed1x(params)))                    final_rc = rc;
   4531     if ((rc = setManualWhiteBalance(params)))           final_rc = rc;
   4532     if ((rc = setSceneMode(params)))                    final_rc = rc;
   4533     if ((rc = setFocusAreas(params)))                   final_rc = rc;
   4534     if ((rc = setFocusPosition(params)))                final_rc = rc;
   4535     if ((rc = setMeteringAreas(params)))                final_rc = rc;
   4536     if ((rc = setSelectableZoneAf(params)))             final_rc = rc;
   4537     if ((rc = setRedeyeReduction(params)))              final_rc = rc;
   4538     if ((rc = setAEBracket(params)))                    final_rc = rc;
   4539     if ((rc = setAutoHDR(params)))                      final_rc = rc;
   4540     if ((rc = setGpsLocation(params)))                  final_rc = rc;
   4541     if ((rc = setWaveletDenoise(params)))               final_rc = rc;
   4542     if ((rc = setFaceRecognition(params)))              final_rc = rc;
   4543     if ((rc = setFlip(params)))                         final_rc = rc;
   4544     if ((rc = setVideoHDR(params)))                     final_rc = rc;
   4545     if ((rc = setVtEnable(params)))                     final_rc = rc;
   4546     if ((rc = setAFBracket(params)))                    final_rc = rc;
   4547     if ((rc = setReFocus(params)))                      final_rc = rc;
   4548     if ((rc = setChromaFlash(params)))                  final_rc = rc;
   4549     if ((rc = setTruePortrait(params)))                 final_rc = rc;
   4550     if ((rc = setOptiZoom(params)))                     final_rc = rc;
   4551     if ((rc = setBurstNum(params)))                     final_rc = rc;
   4552     if ((rc = setBurstLEDOnPeriod(params)))             final_rc = rc;
   4553     if ((rc = setRetroActiveBurstNum(params)))          final_rc = rc;
   4554     if ((rc = setSnapshotFDReq(params)))                final_rc = rc;
   4555     if ((rc = setTintlessValue(params)))                final_rc = rc;
   4556     if ((rc = setCDSMode(params)))                      final_rc = rc;
   4557     if ((rc = setTemporalDenoise(params)))              final_rc = rc;
   4558 
   4559     // update live snapshot size after all other parameters are set
   4560     if ((rc = setLiveSnapshotSize(params)))             final_rc = rc;
   4561     if ((rc = setJpegThumbnailSize(params)))            final_rc = rc;
   4562     if ((rc = setStatsDebugMask()))                     final_rc = rc;
   4563     if ((rc = setPAAF()))                               final_rc = rc;
   4564     if ((rc = setMobicat(params)))                      final_rc = rc;
   4565     if ((rc = setSeeMore(params)))                      final_rc = rc;
   4566     if ((rc = setStillMore(params)))                    final_rc = rc;
   4567 
   4568     if ((rc = updateFlash(false)))                      final_rc = rc;
   4569 
   4570 UPDATE_PARAM_DONE:
   4571     needRestart = m_bNeedRestart;
   4572     return final_rc;
   4573 }
   4574 
   4575 /*===========================================================================
   4576  * FUNCTION   : commitParameters
   4577  *
   4578  * DESCRIPTION: commit parameter changes to backend
   4579  *
   4580  * PARAMETERS : none
   4581  *
   4582  * RETURN     : int32_t type of status
   4583  *              NO_ERROR  -- success
   4584  *              none-zero failure code
   4585  *==========================================================================*/
   4586 int32_t QCameraParameters::commitParameters()
   4587 {
   4588     return commitSetBatch();
   4589 }
   4590 
   4591 /*===========================================================================
   4592  * FUNCTION   : initDefaultParameters
   4593  *
   4594  * DESCRIPTION: initialize default parameters for the first time
   4595  *
   4596  * PARAMETERS : none
   4597  *
   4598  * RETURN     : int32_t type of status
   4599  *              NO_ERROR  -- success
   4600  *              none-zero failure code
   4601  *==========================================================================*/
   4602 int32_t QCameraParameters::initDefaultParameters()
   4603 {
   4604     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   4605         ALOGE("%s:Failed to initialize group update table", __func__);
   4606         return BAD_TYPE;
   4607     }
   4608     int32_t hal_version = CAM_HAL_V1;
   4609     ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HAL_VERSION, hal_version);
   4610 
   4611     /*************************Initialize Values******************************/
   4612     // Set read only parameters from camera capability
   4613     set(KEY_SMOOTH_ZOOM_SUPPORTED,
   4614         m_pCapability->smooth_zoom_supported? VALUE_TRUE : VALUE_FALSE);
   4615     set(KEY_ZOOM_SUPPORTED,
   4616         m_pCapability->zoom_supported? VALUE_TRUE : VALUE_FALSE);
   4617     set(KEY_VIDEO_SNAPSHOT_SUPPORTED,
   4618         m_pCapability->video_snapshot_supported? VALUE_TRUE : VALUE_FALSE);
   4619     set(KEY_VIDEO_STABILIZATION_SUPPORTED,
   4620         m_pCapability->video_stablization_supported? VALUE_TRUE : VALUE_FALSE);
   4621     set(KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
   4622         m_pCapability->auto_exposure_lock_supported? VALUE_TRUE : VALUE_FALSE);
   4623     set(KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
   4624         m_pCapability->auto_wb_lock_supported? VALUE_TRUE : VALUE_FALSE);
   4625     set(KEY_QC_SUPPORTED_CAMERA_FEATURES,
   4626             (int)m_pCapability->qcom_supported_feature_mask);
   4627     set(KEY_MAX_NUM_DETECTED_FACES_HW, m_pCapability->max_num_roi);
   4628     set(KEY_MAX_NUM_DETECTED_FACES_SW, m_pCapability->max_num_roi);
   4629     set(KEY_QC_MAX_NUM_REQUESTED_FACES, m_pCapability->max_num_roi);
   4630     // Set focal length, horizontal view angle, and vertical view angle
   4631     setFloat(KEY_FOCAL_LENGTH, m_pCapability->focal_length);
   4632     setFloat(KEY_HORIZONTAL_VIEW_ANGLE, m_pCapability->hor_view_angle);
   4633     setFloat(KEY_VERTICAL_VIEW_ANGLE, m_pCapability->ver_view_angle);
   4634     set(QCameraParameters::KEY_FOCUS_DISTANCES, "Infinity,Infinity,Infinity");
   4635     set(KEY_QC_AUTO_HDR_SUPPORTED,
   4636         (m_pCapability->auto_hdr_supported)? VALUE_TRUE : VALUE_FALSE);
   4637     // Set supported preview sizes
   4638     if (m_pCapability->preview_sizes_tbl_cnt > 0 &&
   4639         m_pCapability->preview_sizes_tbl_cnt <= MAX_SIZES_CNT) {
   4640         String8 previewSizeValues = createSizesString(
   4641                 m_pCapability->preview_sizes_tbl, m_pCapability->preview_sizes_tbl_cnt);
   4642         set(KEY_SUPPORTED_PREVIEW_SIZES, previewSizeValues.string());
   4643         CDBG_HIGH("%s: supported preview sizes: %s", __func__, previewSizeValues.string());
   4644         // Set default preview size
   4645         CameraParameters::setPreviewSize(m_pCapability->preview_sizes_tbl[0].width,
   4646                                          m_pCapability->preview_sizes_tbl[0].height);
   4647     } else {
   4648         ALOGE("%s: supported preview sizes cnt is 0 or exceeds max!!!", __func__);
   4649     }
   4650 
   4651     // Set supported video sizes
   4652     if (m_pCapability->video_sizes_tbl_cnt > 0 &&
   4653         m_pCapability->video_sizes_tbl_cnt <= MAX_SIZES_CNT) {
   4654         String8 videoSizeValues = createSizesString(
   4655                 m_pCapability->video_sizes_tbl, m_pCapability->video_sizes_tbl_cnt);
   4656         set(KEY_SUPPORTED_VIDEO_SIZES, videoSizeValues.string());
   4657         CDBG_HIGH("%s: supported video sizes: %s", __func__, videoSizeValues.string());
   4658         // Set default video size
   4659         CameraParameters::setVideoSize(m_pCapability->video_sizes_tbl[0].width,
   4660                                        m_pCapability->video_sizes_tbl[0].height);
   4661 
   4662         //Set preferred Preview size for video
   4663         String8 vSize = createSizesString(&m_pCapability->preview_sizes_tbl[0], 1);
   4664         set(KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, vSize.string());
   4665     } else {
   4666         ALOGE("%s: supported video sizes cnt is 0 or exceeds max!!!", __func__);
   4667     }
   4668 
   4669     // Set supported picture sizes
   4670     if (m_pCapability->picture_sizes_tbl_cnt > 0 &&
   4671         m_pCapability->picture_sizes_tbl_cnt <= MAX_SIZES_CNT) {
   4672         String8 pictureSizeValues = createSizesString(
   4673                 m_pCapability->picture_sizes_tbl, m_pCapability->picture_sizes_tbl_cnt);
   4674         set(KEY_SUPPORTED_PICTURE_SIZES, pictureSizeValues.string());
   4675         CDBG_HIGH("%s: supported pic sizes: %s", __func__, pictureSizeValues.string());
   4676         // Set default picture size to the smallest resolution
   4677         CameraParameters::setPictureSize(
   4678            m_pCapability->picture_sizes_tbl[m_pCapability->picture_sizes_tbl_cnt-1].width,
   4679            m_pCapability->picture_sizes_tbl[m_pCapability->picture_sizes_tbl_cnt-1].height);
   4680     } else {
   4681         ALOGE("%s: supported picture sizes cnt is 0 or exceeds max!!!", __func__);
   4682     }
   4683 
   4684     // Need check if scale should be enabled
   4685     if (m_pCapability->scale_picture_sizes_cnt > 0 &&
   4686         m_pCapability->scale_picture_sizes_cnt <= MAX_SCALE_SIZES_CNT){
   4687         //get scale size, enable scaling. And re-set picture size table with scale sizes
   4688         m_reprocScaleParam.setScaleEnable(true);
   4689         int rc_s = m_reprocScaleParam.setScaleSizeTbl(
   4690             m_pCapability->scale_picture_sizes_cnt, m_pCapability->scale_picture_sizes,
   4691             m_pCapability->picture_sizes_tbl_cnt, m_pCapability->picture_sizes_tbl);
   4692         if(rc_s == NO_ERROR){
   4693             cam_dimension_t *totalSizeTbl = m_reprocScaleParam.getTotalSizeTbl();
   4694             size_t totalSizeCnt = m_reprocScaleParam.getTotalSizeTblCnt();
   4695             String8 pictureSizeValues = createSizesString(totalSizeTbl, totalSizeCnt);
   4696             set(KEY_SUPPORTED_PICTURE_SIZES, pictureSizeValues.string());
   4697             CDBG_HIGH("%s: scaled supported pic sizes: %s", __func__, pictureSizeValues.string());
   4698         }else{
   4699             m_reprocScaleParam.setScaleEnable(false);
   4700             ALOGE("%s: reset scaled picture size table failed.", __func__);
   4701         }
   4702     }else{
   4703         m_reprocScaleParam.setScaleEnable(false);
   4704     }
   4705 
   4706     // Set supported thumbnail sizes
   4707     String8 thumbnailSizeValues = createSizesString(
   4708             THUMBNAIL_SIZES_MAP,
   4709             PARAM_MAP_SIZE(THUMBNAIL_SIZES_MAP));
   4710     set(KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, thumbnailSizeValues.string());
   4711     // Set default thumnail size
   4712     set(KEY_JPEG_THUMBNAIL_WIDTH, THUMBNAIL_SIZES_MAP[0].width);
   4713     set(KEY_JPEG_THUMBNAIL_HEIGHT, THUMBNAIL_SIZES_MAP[0].height);
   4714 
   4715     // Set supported livesnapshot sizes
   4716     if (m_pCapability->livesnapshot_sizes_tbl_cnt > 0 &&
   4717         m_pCapability->livesnapshot_sizes_tbl_cnt <= MAX_SIZES_CNT) {
   4718         String8 liveSnpashotSizeValues = createSizesString(
   4719                 m_pCapability->livesnapshot_sizes_tbl,
   4720                 m_pCapability->livesnapshot_sizes_tbl_cnt);
   4721         set(KEY_QC_SUPPORTED_LIVESNAPSHOT_SIZES, liveSnpashotSizeValues.string());
   4722         CDBG("%s: supported live snapshot sizes: %s", __func__, liveSnpashotSizeValues.string());
   4723         m_LiveSnapshotSize =
   4724             m_pCapability->livesnapshot_sizes_tbl[m_pCapability->livesnapshot_sizes_tbl_cnt-1];
   4725     }
   4726 
   4727     // Set supported preview formats
   4728     String8 previewFormatValues = createValuesString(
   4729             m_pCapability->supported_preview_fmts,
   4730             m_pCapability->supported_preview_fmt_cnt,
   4731             PREVIEW_FORMATS_MAP,
   4732             PARAM_MAP_SIZE(PREVIEW_FORMATS_MAP));
   4733     set(KEY_SUPPORTED_PREVIEW_FORMATS, previewFormatValues.string());
   4734     // Set default preview format
   4735     CameraParameters::setPreviewFormat(PIXEL_FORMAT_YUV420SP);
   4736 
   4737     // Set default Video Format
   4738     set(KEY_VIDEO_FRAME_FORMAT, PIXEL_FORMAT_YUV420SP);
   4739 
   4740     // Set supported picture formats
   4741     String8 pictureTypeValues(PIXEL_FORMAT_JPEG);
   4742     String8 str = createValuesString(
   4743             m_pCapability->supported_raw_fmts,
   4744             m_pCapability->supported_raw_fmt_cnt,
   4745             PICTURE_TYPES_MAP,
   4746             PARAM_MAP_SIZE(PICTURE_TYPES_MAP));
   4747     if (str.string() != NULL) {
   4748         pictureTypeValues.append(",");
   4749         pictureTypeValues.append(str);
   4750     }
   4751 
   4752     set(KEY_SUPPORTED_PICTURE_FORMATS, pictureTypeValues.string());
   4753     // Set default picture Format
   4754     CameraParameters::setPictureFormat(PIXEL_FORMAT_JPEG);
   4755     // Set raw image size
   4756     char raw_size_str[32];
   4757     snprintf(raw_size_str, sizeof(raw_size_str), "%dx%d",
   4758              m_pCapability->raw_dim[0].width, m_pCapability->raw_dim[0].height);
   4759     set(KEY_QC_RAW_PICUTRE_SIZE, raw_size_str);
   4760     CDBG("%s: KEY_QC_RAW_PICUTRE_SIZE: w: %d, h: %d ", __func__,
   4761        m_pCapability->raw_dim[0].width, m_pCapability->raw_dim[0].height);
   4762 
   4763     //set default jpeg quality and thumbnail quality
   4764     set(KEY_JPEG_QUALITY, 85);
   4765     set(KEY_JPEG_THUMBNAIL_QUALITY, 85);
   4766 
   4767     // Set FPS ranges
   4768     if (m_pCapability->fps_ranges_tbl_cnt > 0 &&
   4769         m_pCapability->fps_ranges_tbl_cnt <= MAX_SIZES_CNT) {
   4770         int default_fps_index = 0;
   4771         String8 fpsRangeValues = createFpsRangeString(m_pCapability->fps_ranges_tbl,
   4772                                                       m_pCapability->fps_ranges_tbl_cnt,
   4773                                                       default_fps_index);
   4774         set(KEY_SUPPORTED_PREVIEW_FPS_RANGE, fpsRangeValues.string());
   4775 
   4776         int min_fps =
   4777             int(m_pCapability->fps_ranges_tbl[default_fps_index].min_fps * 1000);
   4778         int max_fps =
   4779             int(m_pCapability->fps_ranges_tbl[default_fps_index].max_fps * 1000);
   4780         m_default_fps_range = m_pCapability->fps_ranges_tbl[default_fps_index];
   4781         //Set video fps same as preview fps
   4782         setPreviewFpsRange(min_fps, max_fps, min_fps, max_fps);
   4783 
   4784         // Set legacy preview fps
   4785         String8 fpsValues = createFpsString(m_pCapability->fps_ranges_tbl[default_fps_index]);
   4786         set(KEY_SUPPORTED_PREVIEW_FRAME_RATES, fpsValues.string());
   4787         CDBG_HIGH("%s: supported fps rates: %s", __func__, fpsValues.string());
   4788         CameraParameters::setPreviewFrameRate(int(m_pCapability->fps_ranges_tbl[default_fps_index].max_fps));
   4789     } else {
   4790         ALOGE("%s: supported fps ranges cnt is 0 or exceeds max!!!", __func__);
   4791     }
   4792 
   4793     // Set supported focus modes
   4794     if (m_pCapability->supported_focus_modes_cnt > 0) {
   4795         String8 focusModeValues = createValuesString(
   4796                 m_pCapability->supported_focus_modes,
   4797                 m_pCapability->supported_focus_modes_cnt,
   4798                 FOCUS_MODES_MAP,
   4799                 PARAM_MAP_SIZE(FOCUS_MODES_MAP));
   4800         set(KEY_SUPPORTED_FOCUS_MODES, focusModeValues);
   4801 
   4802         // Set default focus mode and update corresponding parameter buf
   4803         const char *focusMode = lookupNameByValue(FOCUS_MODES_MAP,
   4804                 PARAM_MAP_SIZE(FOCUS_MODES_MAP),
   4805                 m_pCapability->supported_focus_modes[0]);
   4806         if (focusMode != NULL) {
   4807             setFocusMode(focusMode);
   4808         } else {
   4809             setFocusMode(FOCUS_MODE_FIXED);
   4810         }
   4811     } else {
   4812         ALOGE("%s: supported focus modes cnt is 0!!!", __func__);
   4813     }
   4814 
   4815     // Set focus areas
   4816     if (m_pCapability->max_num_focus_areas > MAX_ROI) {
   4817         m_pCapability->max_num_focus_areas = MAX_ROI;
   4818     }
   4819     set(KEY_MAX_NUM_FOCUS_AREAS, m_pCapability->max_num_focus_areas);
   4820     if (m_pCapability->max_num_focus_areas > 0) {
   4821         setFocusAreas(DEFAULT_CAMERA_AREA);
   4822     }
   4823 
   4824     // Set metering areas
   4825     if (m_pCapability->max_num_metering_areas > MAX_ROI) {
   4826         m_pCapability->max_num_metering_areas = MAX_ROI;
   4827     }
   4828     set(KEY_MAX_NUM_METERING_AREAS, m_pCapability->max_num_metering_areas);
   4829     if (m_pCapability->max_num_metering_areas > 0) {
   4830         setMeteringAreas(DEFAULT_CAMERA_AREA);
   4831     }
   4832 
   4833     // set focus position, we should get them from m_pCapability
   4834     m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_INDEX] = 0;
   4835     m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_INDEX] = 1023;
   4836     set(KEY_QC_MIN_FOCUS_POS_INDEX,
   4837             (int) m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_INDEX]);
   4838     set(KEY_QC_MAX_FOCUS_POS_INDEX,
   4839             (int) m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_INDEX]);
   4840 
   4841     m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_DAC_CODE] = 0;
   4842     m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_DAC_CODE] = 1023;
   4843     set(KEY_QC_MIN_FOCUS_POS_DAC,
   4844             (int) m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_DAC_CODE]);
   4845     set(KEY_QC_MAX_FOCUS_POS_DAC,
   4846             (int) m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_DAC_CODE]);
   4847 
   4848     m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_RATIO] = 0;
   4849     m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_RATIO] = 100;
   4850     set(KEY_QC_MIN_FOCUS_POS_RATIO,
   4851             (int) m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_RATIO]);
   4852     set(KEY_QC_MAX_FOCUS_POS_RATIO,
   4853             (int) m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_RATIO]);
   4854 
   4855     m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_DIOPTER] = 0;
   4856     if (m_pCapability->min_focus_distance > 0) {
   4857         m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_DIOPTER] =
   4858                 100.0f / m_pCapability->min_focus_distance;
   4859     } else {
   4860         m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_DIOPTER] = 0;
   4861     }
   4862     setFloat(KEY_QC_MIN_FOCUS_POS_DIOPTER,
   4863             m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_DIOPTER]);
   4864     setFloat(KEY_QC_MAX_FOCUS_POS_DIOPTER,
   4865             m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_DIOPTER]);
   4866 
   4867     //set supported manual focus modes
   4868     String8 manualFocusModes(VALUE_OFF);
   4869     if (m_pCapability->supported_focus_modes_cnt > 1 &&
   4870         m_pCapability->min_focus_distance > 0) {
   4871         manualFocusModes.append(",");
   4872         manualFocusModes.append(KEY_QC_FOCUS_SCALE_MODE);
   4873         manualFocusModes.append(",");
   4874         manualFocusModes.append(KEY_QC_FOCUS_DIOPTER_MODE);
   4875     }
   4876     set(KEY_QC_SUPPORTED_MANUAL_FOCUS_MODES, manualFocusModes.string());
   4877 
   4878     // Set Saturation
   4879     set(KEY_QC_MIN_SATURATION, m_pCapability->saturation_ctrl.min_value);
   4880     set(KEY_QC_MAX_SATURATION, m_pCapability->saturation_ctrl.max_value);
   4881     set(KEY_QC_SATURATION_STEP, m_pCapability->saturation_ctrl.step);
   4882     setSaturation(m_pCapability->saturation_ctrl.def_value);
   4883 
   4884     // Set Sharpness
   4885     set(KEY_QC_MIN_SHARPNESS, m_pCapability->sharpness_ctrl.min_value);
   4886     set(KEY_QC_MAX_SHARPNESS, m_pCapability->sharpness_ctrl.max_value);
   4887     set(KEY_QC_SHARPNESS_STEP, m_pCapability->sharpness_ctrl.step);
   4888     setSharpness(m_pCapability->sharpness_ctrl.def_value);
   4889 
   4890     // Set Contrast
   4891     set(KEY_QC_MIN_CONTRAST, m_pCapability->contrast_ctrl.min_value);
   4892     set(KEY_QC_MAX_CONTRAST, m_pCapability->contrast_ctrl.max_value);
   4893     set(KEY_QC_CONTRAST_STEP, m_pCapability->contrast_ctrl.step);
   4894     setContrast(m_pCapability->contrast_ctrl.def_value);
   4895 
   4896     // Set SCE factor
   4897     set(KEY_QC_MIN_SCE_FACTOR, m_pCapability->sce_ctrl.min_value); // -100
   4898     set(KEY_QC_MAX_SCE_FACTOR, m_pCapability->sce_ctrl.max_value); // 100
   4899     set(KEY_QC_SCE_FACTOR_STEP, m_pCapability->sce_ctrl.step);     // 10
   4900     setSkinToneEnhancement(m_pCapability->sce_ctrl.def_value);     // 0
   4901 
   4902     // Set Brightness
   4903     set(KEY_QC_MIN_BRIGHTNESS, m_pCapability->brightness_ctrl.min_value); // 0
   4904     set(KEY_QC_MAX_BRIGHTNESS, m_pCapability->brightness_ctrl.max_value); // 6
   4905     set(KEY_QC_BRIGHTNESS_STEP, m_pCapability->brightness_ctrl.step);     // 1
   4906     setBrightness(m_pCapability->brightness_ctrl.def_value);
   4907 
   4908     // Set Auto exposure
   4909     String8 autoExposureValues = createValuesString(
   4910             m_pCapability->supported_aec_modes,
   4911             m_pCapability->supported_aec_modes_cnt,
   4912             AUTO_EXPOSURE_MAP,
   4913             PARAM_MAP_SIZE(AUTO_EXPOSURE_MAP));
   4914     set(KEY_QC_SUPPORTED_AUTO_EXPOSURE, autoExposureValues.string());
   4915     setAutoExposure(AUTO_EXPOSURE_FRAME_AVG);
   4916 
   4917     // Set Exposure Compensation
   4918     set(KEY_MAX_EXPOSURE_COMPENSATION, m_pCapability->exposure_compensation_max); // 12
   4919     set(KEY_MIN_EXPOSURE_COMPENSATION, m_pCapability->exposure_compensation_min); // -12
   4920     setFloat(KEY_EXPOSURE_COMPENSATION_STEP, m_pCapability->exposure_compensation_step); // 1/6
   4921     setExposureCompensation(m_pCapability->exposure_compensation_default); // 0
   4922 
   4923     // Set Antibanding
   4924     String8 antibandingValues = createValuesString(
   4925             m_pCapability->supported_antibandings,
   4926             m_pCapability->supported_antibandings_cnt,
   4927             ANTIBANDING_MODES_MAP,
   4928             PARAM_MAP_SIZE(ANTIBANDING_MODES_MAP));
   4929     set(KEY_SUPPORTED_ANTIBANDING, antibandingValues);
   4930     setAntibanding(ANTIBANDING_OFF);
   4931 
   4932     // Set Effect
   4933     String8 effectValues = createValuesString(
   4934             m_pCapability->supported_effects,
   4935             m_pCapability->supported_effects_cnt,
   4936             EFFECT_MODES_MAP,
   4937             PARAM_MAP_SIZE(EFFECT_MODES_MAP));
   4938     set(KEY_SUPPORTED_EFFECTS, effectValues);
   4939     setEffect(EFFECT_NONE);
   4940 
   4941     // Set WhiteBalance
   4942     String8 whitebalanceValues = createValuesString(
   4943             m_pCapability->supported_white_balances,
   4944             m_pCapability->supported_white_balances_cnt,
   4945             WHITE_BALANCE_MODES_MAP,
   4946             PARAM_MAP_SIZE(WHITE_BALANCE_MODES_MAP));
   4947     set(KEY_SUPPORTED_WHITE_BALANCE, whitebalanceValues);
   4948     setWhiteBalance(WHITE_BALANCE_AUTO);
   4949 
   4950     // set supported wb cct, we should get them from m_pCapability
   4951     m_pCapability->min_wb_cct = 2000;
   4952     m_pCapability->max_wb_cct = 8000;
   4953     set(KEY_QC_MIN_WB_CCT, m_pCapability->min_wb_cct);
   4954     set(KEY_QC_MAX_WB_CCT, m_pCapability->max_wb_cct);
   4955 
   4956     // set supported wb rgb gains, ideally we should get them from m_pCapability
   4957     //but for now hardcode.
   4958     m_pCapability->min_wb_gain = 1.0;
   4959     m_pCapability->max_wb_gain = 4.0;
   4960     setFloat(KEY_QC_MIN_WB_GAIN, m_pCapability->min_wb_gain);
   4961     setFloat(KEY_QC_MAX_WB_GAIN, m_pCapability->max_wb_gain);
   4962 
   4963     //set supported manual wb modes
   4964     String8 manualWBModes(VALUE_OFF);
   4965     if(m_pCapability->sensor_type.sens_type != CAM_SENSOR_YUV) {
   4966         manualWBModes.append(",");
   4967         manualWBModes.append(KEY_QC_WB_CCT_MODE);
   4968         manualWBModes.append(",");
   4969         manualWBModes.append(KEY_QC_WB_GAIN_MODE);
   4970     }
   4971     set(KEY_QC_SUPPORTED_MANUAL_WB_MODES, manualWBModes.string());
   4972 
   4973     // Set Flash mode
   4974     if(m_pCapability->supported_flash_modes_cnt > 0) {
   4975        String8 flashValues = createValuesString(
   4976                m_pCapability->supported_flash_modes,
   4977                m_pCapability->supported_flash_modes_cnt,
   4978                FLASH_MODES_MAP,
   4979                PARAM_MAP_SIZE(FLASH_MODES_MAP));
   4980        set(KEY_SUPPORTED_FLASH_MODES, flashValues);
   4981        setFlash(FLASH_MODE_OFF);
   4982     } else {
   4983         ALOGE("%s: supported flash modes cnt is 0!!!", __func__);
   4984     }
   4985 
   4986     // Set Scene Mode
   4987     String8 sceneModeValues = createValuesString(
   4988             m_pCapability->supported_scene_modes,
   4989             m_pCapability->supported_scene_modes_cnt,
   4990             SCENE_MODES_MAP,
   4991             PARAM_MAP_SIZE(SCENE_MODES_MAP));
   4992     set(KEY_SUPPORTED_SCENE_MODES, sceneModeValues);
   4993     setSceneMode(SCENE_MODE_AUTO);
   4994 
   4995     // Set CDS Mode
   4996     String8 cdsModeValues = createValuesStringFromMap(
   4997             CDS_MODES_MAP,
   4998             PARAM_MAP_SIZE(CDS_MODES_MAP));
   4999     set(KEY_QC_SUPPORTED_CDS_MODES, cdsModeValues);
   5000 
   5001     // Set video CDS Mode
   5002     String8 videoCdsModeValues = createValuesStringFromMap(
   5003             CDS_MODES_MAP,
   5004             PARAM_MAP_SIZE(CDS_MODES_MAP));
   5005     set(KEY_QC_SUPPORTED_VIDEO_CDS_MODES, videoCdsModeValues);
   5006 
   5007     // Set TNR Mode
   5008     String8 tnrModeValues = createValuesStringFromMap(
   5009             ON_OFF_MODES_MAP,
   5010             PARAM_MAP_SIZE(ON_OFF_MODES_MAP));
   5011     set(KEY_QC_SUPPORTED_TNR_MODES, tnrModeValues);
   5012 
   5013     // Set video TNR Mode
   5014     String8 videoTnrModeValues = createValuesStringFromMap(
   5015             ON_OFF_MODES_MAP,
   5016             PARAM_MAP_SIZE(ON_OFF_MODES_MAP));
   5017     set(KEY_QC_SUPPORTED_VIDEO_TNR_MODES, videoTnrModeValues);
   5018 
   5019     // Set ISO Mode
   5020     String8 isoValues = createValuesString(
   5021             m_pCapability->supported_iso_modes,
   5022             m_pCapability->supported_iso_modes_cnt,
   5023             ISO_MODES_MAP,
   5024             PARAM_MAP_SIZE(ISO_MODES_MAP));
   5025     set(KEY_QC_SUPPORTED_ISO_MODES, isoValues);
   5026     setISOValue(ISO_AUTO);
   5027 
   5028     // Set exposure time
   5029     String8 manualExpModes(VALUE_OFF);
   5030     bool expTimeSupported = false;
   5031     bool manualISOSupported = false;
   5032     //capability values are in nano sec, convert to milli sec for upper layers
   5033     char expTimeStr[20];
   5034     double min_exp_time = (double) m_pCapability->exposure_time_range[0] / 1000000.0;
   5035     double max_exp_time = (double) m_pCapability->exposure_time_range[1] / 1000000.0;
   5036     snprintf(expTimeStr, sizeof(expTimeStr), "%f", min_exp_time);
   5037     set(KEY_QC_MIN_EXPOSURE_TIME, expTimeStr);
   5038     snprintf(expTimeStr, sizeof(expTimeStr), "%f", max_exp_time);
   5039     set(KEY_QC_MAX_EXPOSURE_TIME, expTimeStr);
   5040     if ((min_exp_time > 0) && (max_exp_time > min_exp_time)) {
   5041         manualExpModes.append(",");
   5042         manualExpModes.append(KEY_QC_EXP_TIME_PRIORITY);
   5043         expTimeSupported = true;
   5044     }
   5045     CDBG_HIGH("%s, Exposure time min %f ms, max %f ms", __func__,
   5046             min_exp_time, max_exp_time);
   5047 
   5048     // Set iso
   5049     set(KEY_QC_MIN_ISO, m_pCapability->sensitivity_range.min_sensitivity);
   5050     set(KEY_QC_MAX_ISO, m_pCapability->sensitivity_range.max_sensitivity);
   5051     CDBG_HIGH("%s, ISO min %d, max %d", __func__,
   5052             m_pCapability->sensitivity_range.min_sensitivity,
   5053             m_pCapability->sensitivity_range.max_sensitivity);
   5054     if ((m_pCapability->sensitivity_range.min_sensitivity > 0) &&
   5055             (m_pCapability->sensitivity_range.max_sensitivity >
   5056                     m_pCapability->sensitivity_range.min_sensitivity)) {
   5057         manualExpModes.append(",");
   5058         manualExpModes.append(KEY_QC_ISO_PRIORITY);
   5059         manualISOSupported = true;
   5060     }
   5061     if (expTimeSupported && manualISOSupported) {
   5062         manualExpModes.append(",");
   5063         manualExpModes.append(KEY_QC_USER_SETTING);
   5064     }
   5065     //finally set supported manual exposure modes
   5066     set(KEY_QC_SUPPORTED_MANUAL_EXPOSURE_MODES, manualExpModes.string());
   5067 
   5068     // Set HFR
   5069     String8 hfrValues = createHfrValuesString(
   5070             m_pCapability->hfr_tbl,
   5071             m_pCapability->hfr_tbl_cnt,
   5072             HFR_MODES_MAP,
   5073             PARAM_MAP_SIZE(HFR_MODES_MAP));
   5074     set(KEY_QC_SUPPORTED_VIDEO_HIGH_FRAME_RATE_MODES, hfrValues.string());
   5075     set(KEY_QC_VIDEO_HIGH_SPEED_RECORDING, "off");
   5076     set(KEY_QC_VIDEO_HIGH_FRAME_RATE, "off");
   5077     String8 hfrSizeValues = createHfrSizesString(
   5078             m_pCapability->hfr_tbl,
   5079             m_pCapability->hfr_tbl_cnt);
   5080     set(KEY_QC_SUPPORTED_HFR_SIZES, hfrSizeValues.string());
   5081     CDBG("HFR values %s HFR Sizes = %s", hfrValues.string(), hfrSizeValues.string());
   5082     setHighFrameRate(CAM_HFR_MODE_OFF);
   5083 
   5084     // Set Focus algorithms
   5085     String8 focusAlgoValues = createValuesString(
   5086             m_pCapability->supported_focus_algos,
   5087             m_pCapability->supported_focus_algos_cnt,
   5088             FOCUS_ALGO_MAP,
   5089             PARAM_MAP_SIZE(FOCUS_ALGO_MAP));
   5090     set(KEY_QC_SUPPORTED_FOCUS_ALGOS, focusAlgoValues);
   5091     setSelectableZoneAf(FOCUS_ALGO_AUTO);
   5092 
   5093     // Set Zoom Ratios
   5094     if (m_pCapability->zoom_supported > 0) {
   5095         String8 zoomRatioValues = createZoomRatioValuesString(
   5096                 m_pCapability->zoom_ratio_tbl,
   5097                 m_pCapability->zoom_ratio_tbl_cnt);
   5098         set(KEY_ZOOM_RATIOS, zoomRatioValues);
   5099         set(KEY_MAX_ZOOM, (int)(m_pCapability->zoom_ratio_tbl_cnt - 1));
   5100         setZoom(0);
   5101     }
   5102 
   5103     // Set Bracketing/HDR
   5104     char prop[PROPERTY_VALUE_MAX];
   5105     memset(prop, 0, sizeof(prop));
   5106     property_get("persist.capture.burst.exposures", prop, "");
   5107     if (strlen(prop) > 0) {
   5108         set(KEY_QC_CAPTURE_BURST_EXPOSURE, prop);
   5109     }
   5110     String8 bracketingValues = createValuesStringFromMap(
   5111             BRACKETING_MODES_MAP,
   5112             PARAM_MAP_SIZE(BRACKETING_MODES_MAP));
   5113     set(KEY_QC_SUPPORTED_AE_BRACKET_MODES, bracketingValues);
   5114     setAEBracket(AE_BRACKET_OFF);
   5115 
   5116     //Set AF Bracketing.
   5117     for (size_t i = 0; i < m_pCapability->supported_focus_modes_cnt; i++) {
   5118         if ((CAM_FOCUS_MODE_AUTO == m_pCapability->supported_focus_modes[i]) &&
   5119                 ((m_pCapability->qcom_supported_feature_mask &
   5120                         CAM_QCOM_FEATURE_UBIFOCUS) > 0)) {
   5121             String8 afBracketingValues = createValuesStringFromMap(
   5122                     AF_BRACKETING_MODES_MAP,
   5123                     PARAM_MAP_SIZE(AF_BRACKETING_MODES_MAP));
   5124             set(KEY_QC_SUPPORTED_AF_BRACKET_MODES, afBracketingValues);
   5125             setAFBracket(AF_BRACKET_OFF);
   5126             break;
   5127          }
   5128     }
   5129 
   5130     //Set Refocus.
   5131     //Re-use ubifocus flag for now.
   5132     for (size_t i = 0; i < m_pCapability->supported_focus_modes_cnt; i++) {
   5133         if ((CAM_FOCUS_MODE_AUTO == m_pCapability->supported_focus_modes[i]) &&
   5134                 (m_pCapability->qcom_supported_feature_mask &
   5135                     CAM_QCOM_FEATURE_REFOCUS) > 0) {
   5136             String8 reFocusValues = createValuesStringFromMap(
   5137                     RE_FOCUS_MODES_MAP,
   5138                     PARAM_MAP_SIZE(RE_FOCUS_MODES_MAP));
   5139             set(KEY_QC_SUPPORTED_RE_FOCUS_MODES, reFocusValues);
   5140             setReFocus(RE_FOCUS_OFF);
   5141         }
   5142     }
   5143 
   5144     //Set Chroma Flash.
   5145     if ((m_pCapability->supported_flash_modes_cnt > 0) &&
   5146             (m_pCapability->qcom_supported_feature_mask &
   5147             CAM_QCOM_FEATURE_CHROMA_FLASH) > 0) {
   5148         String8 chromaFlashValues = createValuesStringFromMap(
   5149                 CHROMA_FLASH_MODES_MAP,
   5150                 PARAM_MAP_SIZE(CHROMA_FLASH_MODES_MAP));
   5151         set(KEY_QC_SUPPORTED_CHROMA_FLASH_MODES, chromaFlashValues);
   5152         setChromaFlash(CHROMA_FLASH_OFF);
   5153     }
   5154 
   5155     //Set Opti Zoom.
   5156     if (m_pCapability->zoom_supported &&
   5157             (m_pCapability->qcom_supported_feature_mask &
   5158             CAM_QCOM_FEATURE_OPTIZOOM) > 0){
   5159         String8 optiZoomValues = createValuesStringFromMap(
   5160                 OPTI_ZOOM_MODES_MAP,
   5161                 PARAM_MAP_SIZE(OPTI_ZOOM_MODES_MAP));
   5162         set(KEY_QC_SUPPORTED_OPTI_ZOOM_MODES, optiZoomValues);
   5163         setOptiZoom(OPTI_ZOOM_OFF);
   5164     }
   5165 
   5166     //Set HDR Type
   5167     uint32_t supported_hdr_modes = m_pCapability->qcom_supported_feature_mask &
   5168             (CAM_QCOM_FEATURE_SENSOR_HDR | CAM_QCOM_FEATURE_HDR);
   5169     if (supported_hdr_modes) {
   5170         if (CAM_QCOM_FEATURE_SENSOR_HDR == supported_hdr_modes) {
   5171             String8 hdrModeValues;
   5172             hdrModeValues.append(HDR_MODE_SENSOR);
   5173             set(KEY_QC_SUPPORTED_KEY_QC_HDR_MODES, hdrModeValues);
   5174             setHDRMode(HDR_MODE_SENSOR);
   5175         } else if (CAM_QCOM_FEATURE_HDR == supported_hdr_modes) {
   5176             String8 hdrModeValues;
   5177             hdrModeValues.append(HDR_MODE_MULTI_FRAME);
   5178             set(KEY_QC_SUPPORTED_KEY_QC_HDR_MODES, hdrModeValues);
   5179             setHDRMode(HDR_MODE_MULTI_FRAME);
   5180         } else {
   5181             String8 hdrModeValues = createValuesStringFromMap(
   5182                     HDR_MODES_MAP,
   5183                     PARAM_MAP_SIZE(HDR_MODES_MAP));
   5184             set(KEY_QC_SUPPORTED_KEY_QC_HDR_MODES, hdrModeValues);
   5185             setHDRMode(HDR_MODE_MULTI_FRAME);
   5186         }
   5187     }
   5188 
   5189     //Set HDR need 1x
   5190     String8 hdrNeed1xValues;
   5191     if (!m_bHDRModeSensor) {
   5192         hdrNeed1xValues = createValuesStringFromMap(TRUE_FALSE_MODES_MAP,
   5193                 PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP));
   5194         setHDRNeed1x(VALUE_TRUE);
   5195     } else {
   5196         hdrNeed1xValues.append(VALUE_FALSE);
   5197         setHDRNeed1x(VALUE_FALSE);
   5198     }
   5199     set(KEY_QC_SUPPORTED_HDR_NEED_1X, hdrNeed1xValues);
   5200 
   5201     //Set True Portrait
   5202     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_TRUEPORTRAIT) > 0) {
   5203         String8 truePortraitValues = createValuesStringFromMap(
   5204                 TRUE_PORTRAIT_MODES_MAP,
   5205                 PARAM_MAP_SIZE(TRUE_PORTRAIT_MODES_MAP));
   5206         set(KEY_QC_SUPPORTED_TRUE_PORTRAIT_MODES, truePortraitValues);
   5207     }
   5208 
   5209     // Set Denoise
   5210     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_DENOISE2D) > 0){
   5211     String8 denoiseValues = createValuesStringFromMap(
   5212         DENOISE_ON_OFF_MODES_MAP, PARAM_MAP_SIZE(DENOISE_ON_OFF_MODES_MAP));
   5213     set(KEY_QC_SUPPORTED_DENOISE, denoiseValues.string());
   5214 #ifdef DEFAULT_DENOISE_MODE_ON
   5215     setWaveletDenoise(DENOISE_ON);
   5216 #else
   5217     setWaveletDenoise(DENOISE_OFF);
   5218 #endif
   5219     }
   5220 
   5221     // Set feature enable/disable
   5222     String8 enableDisableValues = createValuesStringFromMap(
   5223             ENABLE_DISABLE_MODES_MAP, PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP));
   5224 
   5225     // Set Lens Shading
   5226     set(KEY_QC_SUPPORTED_LENSSHADE_MODES, enableDisableValues);
   5227     setLensShadeValue(VALUE_ENABLE);
   5228     // Set MCE
   5229     set(KEY_QC_SUPPORTED_MEM_COLOR_ENHANCE_MODES, enableDisableValues);
   5230     setMCEValue(VALUE_ENABLE);
   5231 
   5232     // Set DIS
   5233     set(KEY_QC_SUPPORTED_DIS_MODES, enableDisableValues);
   5234     setDISValue(VALUE_DISABLE);
   5235 
   5236     // Set Histogram
   5237     set(KEY_QC_SUPPORTED_HISTOGRAM_MODES,
   5238         m_pCapability->histogram_supported ? enableDisableValues : "");
   5239     set(KEY_QC_HISTOGRAM, VALUE_DISABLE);
   5240 
   5241     //Set Red Eye Reduction
   5242     set(KEY_QC_SUPPORTED_REDEYE_REDUCTION, enableDisableValues);
   5243     setRedeyeReduction(VALUE_DISABLE);
   5244 
   5245     //Set SkinTone Enhancement
   5246     set(KEY_QC_SUPPORTED_SKIN_TONE_ENHANCEMENT_MODES, enableDisableValues);
   5247 
   5248     // Set feature on/off
   5249     String8 onOffValues = createValuesStringFromMap(
   5250             ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP));
   5251 
   5252     //Set See more (LLVD)
   5253     if (m_pCapability->qcom_supported_feature_mask &
   5254             CAM_QCOM_FEATURE_LLVD) {
   5255         set(KEY_QC_SUPPORTED_SEE_MORE_MODES, onOffValues);
   5256         setSeeMore(VALUE_OFF);
   5257     }
   5258 
   5259     //Set Still more
   5260     if (m_pCapability->qcom_supported_feature_mask &
   5261             CAM_QCOM_FEATURE_STILLMORE) {
   5262         String8 stillMoreValues = createValuesStringFromMap(
   5263                 STILL_MORE_MODES_MAP,
   5264                 PARAM_MAP_SIZE(STILL_MORE_MODES_MAP));
   5265         set(KEY_QC_SUPPORTED_STILL_MORE_MODES, stillMoreValues);
   5266         setStillMore(STILL_MORE_OFF);
   5267     }
   5268 
   5269     //Set Scene Detection
   5270     set(KEY_QC_SUPPORTED_SCENE_DETECT, onOffValues);
   5271     setSceneDetect(VALUE_OFF);
   5272     m_bHDREnabled = false;
   5273     m_bHDR1xFrameEnabled = true;
   5274 
   5275     m_bHDRThumbnailProcessNeeded = false;
   5276     m_bHDR1xExtraBufferNeeded = true;
   5277     for (uint32_t i=0; i<m_pCapability->hdr_bracketing_setting.num_frames; i++) {
   5278         if (0 == m_pCapability->hdr_bracketing_setting.exp_val.values[i]) {
   5279             m_bHDR1xExtraBufferNeeded = false;
   5280             break;
   5281         }
   5282     }
   5283 
   5284     // Set HDR output scaling
   5285     char value[PROPERTY_VALUE_MAX];
   5286 
   5287     property_get("persist.camera.hdr.outcrop", value, VALUE_DISABLE);
   5288     if (strncmp(VALUE_ENABLE, value, sizeof(VALUE_ENABLE))) {
   5289       m_bHDROutputCropEnabled = false;
   5290     } else {
   5291       m_bHDROutputCropEnabled = true;
   5292     }
   5293 
   5294     //Set Face Detection
   5295     set(KEY_QC_SUPPORTED_FACE_DETECTION, onOffValues);
   5296     set(KEY_QC_FACE_DETECTION, VALUE_OFF);
   5297 
   5298     //Set Face Recognition
   5299     //set(KEY_QC_SUPPORTED_FACE_RECOGNITION, onOffValues);
   5300     //set(KEY_QC_FACE_RECOGNITION, VALUE_OFF);
   5301 
   5302     //Set ZSL
   5303     set(KEY_QC_SUPPORTED_ZSL_MODES, onOffValues);
   5304 #ifdef DEFAULT_ZSL_MODE_ON
   5305     set(KEY_QC_ZSL, VALUE_ON);
   5306     m_bZslMode = true;
   5307 #else
   5308     set(KEY_QC_ZSL, VALUE_OFF);
   5309     m_bZslMode = false;
   5310 #endif
   5311 
   5312     // Check if zsl mode property is enabled.
   5313     // If yes, force the camera to be in zsl mode
   5314     memset(value, 0x00, PROPERTY_VALUE_MAX);
   5315     property_get("persist.camera.zsl.mode", value, "0");
   5316     int32_t zsl_mode = atoi(value);
   5317     if(zsl_mode == 1) {
   5318         CDBG_HIGH("%s: %d: Forcing Camera to ZSL mode ", __func__, __LINE__);
   5319         set(KEY_QC_ZSL, VALUE_ON);
   5320         m_bForceZslMode = true;
   5321         m_bZslMode = true;
   5322     }
   5323     m_bZslMode_new = m_bZslMode;
   5324 
   5325     set(KEY_QC_SCENE_SELECTION, VALUE_DISABLE);
   5326 
   5327     // Rdi mode
   5328     set(KEY_QC_SUPPORTED_RDI_MODES, enableDisableValues);
   5329     setRdiMode(VALUE_DISABLE);
   5330 
   5331     // Secure mode
   5332     set(KEY_QC_SUPPORTED_SECURE_MODES, enableDisableValues);
   5333     setSecureMode(VALUE_DISABLE);
   5334 
   5335     //Set video HDR
   5336     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_VIDEO_HDR) > 0) {
   5337         set(KEY_QC_SUPPORTED_VIDEO_HDR_MODES, onOffValues);
   5338         set(KEY_QC_VIDEO_HDR, VALUE_OFF);
   5339     }
   5340 
   5341     //Set HW Sensor Snapshot HDR
   5342     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_SENSOR_HDR)> 0) {
   5343         set(KEY_QC_SUPPORTED_SENSOR_HDR_MODES, onOffValues);
   5344         set(KEY_QC_SENSOR_HDR, VALUE_OFF);
   5345         m_bSensorHDREnabled = false;
   5346     }
   5347 
   5348     // Set VT TimeStamp
   5349     set(KEY_QC_VT_ENABLE, VALUE_DISABLE);
   5350     //Set Touch AF/AEC
   5351     String8 touchValues = createValuesStringFromMap(
   5352             TOUCH_AF_AEC_MODES_MAP, PARAM_MAP_SIZE(TOUCH_AF_AEC_MODES_MAP));
   5353 
   5354     set(KEY_QC_SUPPORTED_TOUCH_AF_AEC, touchValues);
   5355     set(KEY_QC_TOUCH_AF_AEC, TOUCH_AF_AEC_OFF);
   5356 
   5357     //set flip mode
   5358     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_FLIP) > 0) {
   5359         String8 flipModes = createValuesStringFromMap(
   5360                 FLIP_MODES_MAP, PARAM_MAP_SIZE(FLIP_MODES_MAP));
   5361         set(KEY_QC_SUPPORTED_FLIP_MODES, flipModes);
   5362         set(KEY_QC_PREVIEW_FLIP, FLIP_MODE_OFF);
   5363         set(KEY_QC_VIDEO_FLIP, FLIP_MODE_OFF);
   5364         set(KEY_QC_SNAPSHOT_PICTURE_FLIP, FLIP_MODE_OFF);
   5365     }
   5366 
   5367     // Set default Auto Exposure lock value
   5368     setAecLock(VALUE_FALSE);
   5369 
   5370     // Set default AWB_LOCK lock value
   5371     setAwbLock(VALUE_FALSE);
   5372 
   5373     // Set default Camera mode
   5374     set(KEY_QC_CAMERA_MODE, 0);
   5375 
   5376     // Add support for internal preview restart
   5377     set(KEY_INTERNAL_PERVIEW_RESTART, VALUE_TRUE);
   5378     // Set default burst number
   5379     set(KEY_QC_SNAPSHOT_BURST_NUM, 0);
   5380     set(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER, 0);
   5381 
   5382     //Get RAM size and disable features which are memory rich
   5383     struct sysinfo info;
   5384     sysinfo(&info);
   5385 
   5386     CDBG_HIGH("%s: totalram = %ld, freeram = %ld ", __func__, info.totalram,
   5387         info.freeram);
   5388     if (info.totalram > TOTAL_RAM_SIZE_512MB) {
   5389         set(KEY_QC_LONGSHOT_SUPPORTED, VALUE_TRUE);
   5390         set(KEY_QC_ZSL_HDR_SUPPORTED, VALUE_TRUE);
   5391     } else {
   5392         set(KEY_QC_LONGSHOT_SUPPORTED, VALUE_FALSE);
   5393         set(KEY_QC_ZSL_HDR_SUPPORTED, VALUE_FALSE);
   5394     }
   5395 
   5396     setOfflineRAW();
   5397     memset(mStreamPpMask, 0, sizeof(uint32_t)*CAM_STREAM_TYPE_MAX);
   5398 
   5399     int32_t rc = commitParameters();
   5400     if (rc == NO_ERROR) {
   5401         rc = setNumOfSnapshot();
   5402     }
   5403 
   5404     //Set Video Rotation
   5405     String8 videoRotationValues = createValuesStringFromMap(VIDEO_ROTATION_MODES_MAP,
   5406             PARAM_MAP_SIZE(VIDEO_ROTATION_MODES_MAP));
   5407 
   5408     set(KEY_QC_SUPPORTED_VIDEO_ROTATION_VALUES, videoRotationValues.string());
   5409     set(KEY_QC_VIDEO_ROTATION, VIDEO_ROTATION_0);
   5410     return rc;
   5411 }
   5412 
   5413 /*===========================================================================
   5414  * FUNCTION   : init
   5415  *
   5416  * DESCRIPTION: initialize parameter obj
   5417  *
   5418  * PARAMETERS :
   5419  *   @capabilities  : ptr to camera capabilities
   5420  *   @mmops         : ptr to memory ops table for mapping/unmapping
   5421  *   @adjustFPS     : object reference for additional (possibly thermal)
   5422  *                    framerate adjustment
   5423  *
   5424  * RETURN     : int32_t type of status
   5425  *              NO_ERROR  -- success
   5426  *              none-zero failure code
   5427  *==========================================================================*/
   5428 int32_t QCameraParameters::init(cam_capability_t *capabilities,
   5429         mm_camera_vtbl_t *mmOps, QCameraAdjustFPS *adjustFPS)
   5430 {
   5431     int32_t rc = NO_ERROR;
   5432 
   5433     m_pCapability = capabilities;
   5434     m_pCamOpsTbl = mmOps;
   5435     m_AdjustFPS = adjustFPS;
   5436 
   5437     //Allocate Set Param Buffer
   5438     m_pParamHeap = new QCameraHeapMemory(QCAMERA_ION_USE_CACHE);
   5439     rc = m_pParamHeap->allocate(1, sizeof(parm_buffer_t), NON_SECURE);
   5440     if(rc != OK) {
   5441         rc = NO_MEMORY;
   5442         ALOGE("Failed to allocate SETPARM Heap memory");
   5443         goto TRANS_INIT_ERROR1;
   5444     }
   5445 
   5446     //Map memory for parameters buffer
   5447     rc = m_pCamOpsTbl->ops->map_buf(m_pCamOpsTbl->camera_handle,
   5448                              CAM_MAPPING_BUF_TYPE_PARM_BUF,
   5449                              m_pParamHeap->getFd(0),
   5450                              sizeof(parm_buffer_t));
   5451     if(rc < 0) {
   5452         ALOGE("%s:failed to map SETPARM buffer",__func__);
   5453         rc = FAILED_TRANSACTION;
   5454         goto TRANS_INIT_ERROR2;
   5455     }
   5456     m_pParamBuf = (parm_buffer_t*) DATA_PTR(m_pParamHeap,0);
   5457 
   5458     initDefaultParameters();
   5459 
   5460     m_bInited = true;
   5461 
   5462     goto TRANS_INIT_DONE;
   5463 
   5464 TRANS_INIT_ERROR2:
   5465     m_pParamHeap->deallocate();
   5466 
   5467 TRANS_INIT_ERROR1:
   5468     delete m_pParamHeap;
   5469     m_pParamHeap = NULL;
   5470 
   5471 TRANS_INIT_DONE:
   5472     return rc;
   5473 }
   5474 
   5475 /*===========================================================================
   5476  * FUNCTION   : deinit
   5477  *
   5478  * DESCRIPTION: deinitialize
   5479  *
   5480  * PARAMETERS : none
   5481  *
   5482  * RETURN     : none
   5483  *==========================================================================*/
   5484 void QCameraParameters::deinit()
   5485 {
   5486     if (!m_bInited) {
   5487         return;
   5488     }
   5489 
   5490     //clear all entries in the map
   5491     String8 emptyStr;
   5492     QCameraParameters::unflatten(emptyStr);
   5493 
   5494     if (NULL != m_pCamOpsTbl) {
   5495         m_pCamOpsTbl->ops->unmap_buf(
   5496                              m_pCamOpsTbl->camera_handle,
   5497                              CAM_MAPPING_BUF_TYPE_PARM_BUF);
   5498         m_pCamOpsTbl = NULL;
   5499     }
   5500     m_pCapability = NULL;
   5501     if (NULL != m_pParamHeap) {
   5502         m_pParamHeap->deallocate();
   5503         delete m_pParamHeap;
   5504         m_pParamHeap = NULL;
   5505         m_pParamBuf = NULL;
   5506     }
   5507 
   5508     m_AdjustFPS = NULL;
   5509 
   5510     m_tempMap.clear();
   5511 
   5512     m_bInited = false;
   5513 }
   5514 
   5515 /*===========================================================================
   5516  * FUNCTION   : parse_pair
   5517  *
   5518  * DESCRIPTION: helper function to parse string like "640x480" or "10000,20000"
   5519  *
   5520  * PARAMETERS :
   5521  *   @str     : input string to be parse
   5522  *   @first   : [output] first value of the pair
   5523  *   @second  : [output]  second value of the pair
   5524  *   @delim   : [input] delimeter to seperate the pair
   5525  *   @endptr  : [output] ptr to the end of the pair string
   5526  *
   5527  * RETURN     : int32_t type of status
   5528  *              NO_ERROR  -- success
   5529  *              none-zero failure code
   5530  *==========================================================================*/
   5531 int32_t QCameraParameters::parse_pair(const char *str,
   5532                                       int *first,
   5533                                       int *second,
   5534                                       char delim,
   5535                                       char **endptr = NULL)
   5536 {
   5537     // Find the first integer.
   5538     char *end;
   5539     int w = (int)strtol(str, &end, 10);
   5540     // If a delimeter does not immediately follow, give up.
   5541     if (*end != delim) {
   5542         ALOGE("Cannot find delimeter (%c) in str=%s", delim, str);
   5543         return BAD_VALUE;
   5544     }
   5545 
   5546     // Find the second integer, immediately after the delimeter.
   5547     int h = (int)strtol(end+1, &end, 10);
   5548 
   5549     *first = w;
   5550     *second = h;
   5551 
   5552     if (endptr) {
   5553         *endptr = end;
   5554     }
   5555 
   5556     return NO_ERROR;
   5557 }
   5558 
   5559 /*===========================================================================
   5560  * FUNCTION   : parseSizesList
   5561  *
   5562  * DESCRIPTION: helper function to parse string containing sizes
   5563  *
   5564  * PARAMETERS :
   5565  *   @sizesStr: [input] input string to be parse
   5566  *   @sizes   : [output] reference to store parsed sizes
   5567  *
   5568  * RETURN     : none
   5569  *==========================================================================*/
   5570 void QCameraParameters::parseSizesList(const char *sizesStr, Vector<Size> &sizes)
   5571 {
   5572     if (sizesStr == 0) {
   5573         return;
   5574     }
   5575 
   5576     char *sizeStartPtr = (char *)sizesStr;
   5577 
   5578     while (true) {
   5579         int width, height;
   5580         int success = parse_pair(sizeStartPtr, &width, &height, 'x',
   5581                                  &sizeStartPtr);
   5582         if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) {
   5583             ALOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
   5584             return;
   5585         }
   5586         sizes.push(Size(width, height));
   5587 
   5588         if (*sizeStartPtr == '\0') {
   5589             return;
   5590         }
   5591         sizeStartPtr++;
   5592     }
   5593 }
   5594 
   5595 /*===========================================================================
   5596  * FUNCTION   : getSupportedHfrSizes
   5597  *
   5598  * DESCRIPTION: return supported HFR sizes
   5599  *
   5600  * PARAMETERS :
   5601  *   @sizes  : [output] reference to a vector storing supported HFR sizes
   5602  *
   5603  * RETURN     : none
   5604  *==========================================================================*/
   5605 void QCameraParameters::getSupportedHfrSizes(Vector<Size> &sizes)
   5606 {
   5607     const char *hfrSizesStr = get(KEY_QC_SUPPORTED_HFR_SIZES);
   5608     parseSizesList(hfrSizesStr, sizes);
   5609 }
   5610 
   5611 /*===========================================================================
   5612  * FUNCTION   : adjustPreviewFpsRanges
   5613  *
   5614  * DESCRIPTION: adjust preview FPS ranges
   5615  *              according to external events
   5616  *
   5617  * PARAMETERS :
   5618  *   @minFPS  : min FPS value
   5619  *   @maxFPS  : max FPS value
   5620  *
   5621  * RETURN     : int32_t type of status
   5622  *              NO_ERROR  -- success
   5623  *              none-zero failure code
   5624  *==========================================================================*/
   5625 int32_t QCameraParameters::adjustPreviewFpsRange(cam_fps_range_t *fpsRange)
   5626 {
   5627     if ( fpsRange == NULL ) {
   5628         return BAD_VALUE;
   5629     }
   5630 
   5631     if ( m_pParamBuf == NULL ) {
   5632         return NO_INIT;
   5633     }
   5634 
   5635     int32_t rc = initBatchUpdate(m_pParamBuf);
   5636     if ( rc != NO_ERROR ) {
   5637         ALOGE("%s:Failed to initialize group update table", __func__);
   5638         return rc;
   5639     }
   5640 
   5641     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FPS_RANGE, *fpsRange)) {
   5642         ALOGE("%s: Parameters batch failed",__func__);
   5643         return BAD_VALUE;
   5644     }
   5645 
   5646     rc = commitSetBatch();
   5647     if ( rc != NO_ERROR ) {
   5648         ALOGE("%s:Failed to commit batch parameters", __func__);
   5649         return rc;
   5650     }
   5651 
   5652     return rc;
   5653 }
   5654 
   5655 /*===========================================================================
   5656  * FUNCTION   : setPreviewFpsRanges
   5657  *
   5658  * DESCRIPTION: set preview FPS ranges
   5659  *
   5660  * PARAMETERS :
   5661  *   @minFPS  : min FPS value
   5662  *   @maxFPS  : max FPS value
   5663  *
   5664  * RETURN     : int32_t type of status
   5665  *              NO_ERROR  -- success
   5666  *              none-zero failure code
   5667  *==========================================================================*/
   5668 int32_t QCameraParameters::setPreviewFpsRange(int min_fps,
   5669         int max_fps, int vid_min_fps,int vid_max_fps)
   5670 {
   5671     char str[32];
   5672     char value[PROPERTY_VALUE_MAX];
   5673     int fixedFpsValue;
   5674     /*This property get value should be the fps that user needs*/
   5675     property_get("persist.debug.set.fixedfps", value, "0");
   5676     fixedFpsValue = atoi(value);
   5677 
   5678     CDBG("%s: E minFps = %d, maxFps = %d , vid minFps = %d, vid maxFps = %d",
   5679                 __func__, min_fps, max_fps, vid_min_fps, vid_max_fps);
   5680 
   5681     if(fixedFpsValue != 0) {
   5682       min_fps = (int)fixedFpsValue*1000;
   5683       max_fps = (int)fixedFpsValue*1000;
   5684     }
   5685     snprintf(str, sizeof(str), "%d,%d", min_fps, max_fps);
   5686     CDBG_HIGH("%s: Setting preview fps range %s", __func__, str);
   5687     updateParamEntry(KEY_PREVIEW_FPS_RANGE, str);
   5688     cam_fps_range_t fps_range;
   5689     memset(&fps_range, 0x00, sizeof(cam_fps_range_t));
   5690     fps_range.min_fps = (float)min_fps / 1000.0f;
   5691     fps_range.max_fps = (float)max_fps / 1000.0f;
   5692     fps_range.video_min_fps = (float)vid_min_fps / 1000.0f;
   5693     fps_range.video_max_fps = (float)vid_max_fps / 1000.0f;
   5694 
   5695     CDBG_HIGH("%s: Updated: minFps = %d, maxFps = %d ,"
   5696             " vid minFps = %d, vid maxFps = %d",
   5697             __func__, min_fps, max_fps, vid_min_fps, vid_max_fps);
   5698 
   5699     if ( NULL != m_AdjustFPS ) {
   5700         m_AdjustFPS->recalcFPSRange(min_fps, max_fps, fps_range);
   5701         CDBG_HIGH("%s: Thermal adjusted Preview fps range %3.2f,%3.2f, %3.2f, %3.2f",
   5702               __func__, fps_range.min_fps, fps_range.max_fps,
   5703               fps_range.video_min_fps, fps_range.video_max_fps);
   5704     }
   5705 
   5706     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FPS_RANGE, fps_range)) {
   5707         return BAD_VALUE;
   5708     }
   5709 
   5710     return NO_ERROR;
   5711 }
   5712 
   5713 
   5714 
   5715 /*===========================================================================
   5716  * FUNCTION   : setAutoExposure
   5717  *
   5718  * DESCRIPTION: set auto exposure
   5719  *
   5720  * PARAMETERS :
   5721  *   @autoExp : auto exposure value string
   5722  *
   5723  * RETURN     : int32_t type of status
   5724  *              NO_ERROR  -- success
   5725  *              none-zero failure code
   5726  *==========================================================================*/
   5727 int32_t QCameraParameters::setAutoExposure(const char *autoExp)
   5728 {
   5729     if (autoExp != NULL) {
   5730         int32_t value = lookupAttr(AUTO_EXPOSURE_MAP, PARAM_MAP_SIZE(AUTO_EXPOSURE_MAP), autoExp);
   5731         if (value != NAME_NOT_FOUND) {
   5732             CDBG_HIGH("%s: Setting auto exposure %s", __func__, autoExp);
   5733             updateParamEntry(KEY_QC_AUTO_EXPOSURE, autoExp);
   5734             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_AEC_ALGO_TYPE, value)) {
   5735                 return BAD_VALUE;
   5736             }
   5737             return NO_ERROR;
   5738         }
   5739     }
   5740     ALOGE("Invalid auto exposure value: %s", (autoExp == NULL) ? "NULL" : autoExp);
   5741     return BAD_VALUE;
   5742 }
   5743 
   5744 /*===========================================================================
   5745  * FUNCTION   : setEffect
   5746  *
   5747  * DESCRIPTION: set effect
   5748  *
   5749  * PARAMETERS :
   5750  *   @effect  : effect value string
   5751  *
   5752  * RETURN     : int32_t type of status
   5753  *              NO_ERROR  -- success
   5754  *              none-zero failure code
   5755  *==========================================================================*/
   5756 int32_t QCameraParameters::setEffect(const char *effect)
   5757 {
   5758     if (effect != NULL) {
   5759         int32_t value = lookupAttr(EFFECT_MODES_MAP, PARAM_MAP_SIZE(EFFECT_MODES_MAP), effect);
   5760         if (value != NAME_NOT_FOUND) {
   5761             CDBG_HIGH("%s: Setting effect %s", __func__, effect);
   5762             updateParamEntry(KEY_EFFECT, effect);
   5763             uint8_t prmEffect = static_cast<uint8_t>(value);
   5764             mParmEffect = prmEffect;
   5765             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_EFFECT, prmEffect)) {
   5766                 return BAD_VALUE;
   5767             }
   5768             return NO_ERROR;
   5769         }
   5770     }
   5771     ALOGE("Invalid effect value: %s", (effect == NULL) ? "NULL" : effect);
   5772     return BAD_VALUE;
   5773 }
   5774 
   5775 /*===========================================================================
   5776  * FUNCTION   : setBrightness
   5777  *
   5778  * DESCRIPTION: set brightness control value
   5779  *
   5780  * PARAMETERS :
   5781  *   @brightness  : brightness control value
   5782  *
   5783  * RETURN     : int32_t type of status
   5784  *              NO_ERROR  -- success
   5785  *              none-zero failure code
   5786  *==========================================================================*/
   5787 int32_t QCameraParameters::setBrightness(int brightness)
   5788 {
   5789     char val[16];
   5790     snprintf(val, sizeof(val), "%d", brightness);
   5791     updateParamEntry(KEY_QC_BRIGHTNESS, val);
   5792 
   5793     CDBG_HIGH("%s: Setting brightness %s", __func__, val);
   5794     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_BRIGHTNESS, brightness)) {
   5795         return BAD_VALUE;
   5796     }
   5797 
   5798     return NO_ERROR;
   5799 }
   5800 
   5801 /*===========================================================================
   5802  * FUNCTION   : setFocusMode
   5803  *
   5804  * DESCRIPTION: set focus mode
   5805  *
   5806  * PARAMETERS :
   5807  *   @focusMode  : focus mode value string
   5808  *
   5809  * RETURN     : int32_t type of status
   5810  *              NO_ERROR  -- success
   5811  *              none-zero failure code
   5812  *==========================================================================*/
   5813 int32_t QCameraParameters::setFocusMode(const char *focusMode)
   5814 {
   5815     if (focusMode != NULL) {
   5816         int32_t value = lookupAttr(FOCUS_MODES_MAP, PARAM_MAP_SIZE(FOCUS_MODES_MAP), focusMode);
   5817         if (value != NAME_NOT_FOUND) {
   5818             int32_t rc = NO_ERROR;
   5819             CDBG_HIGH("%s: Setting focus mode %s", __func__, focusMode);
   5820             mFocusMode = (cam_focus_mode_type)value;
   5821 
   5822             updateParamEntry(KEY_FOCUS_MODE, focusMode);
   5823             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   5824                     CAM_INTF_PARM_FOCUS_MODE, (uint8_t)value)) {
   5825                 rc = BAD_VALUE;
   5826             }
   5827             if (strcmp(focusMode,"infinity")==0){
   5828                 set(QCameraParameters::KEY_FOCUS_DISTANCES, "Infinity,Infinity,Infinity");
   5829             }
   5830             return rc;
   5831         }
   5832     }
   5833     ALOGE("Invalid focus mode value: %s", (focusMode == NULL) ? "NULL" : focusMode);
   5834     return BAD_VALUE;
   5835 }
   5836 
   5837 /*===========================================================================
   5838  * FUNCTION   : setFocusPosition
   5839  *
   5840  * DESCRIPTION: set focus position
   5841  *
   5842  * PARAMETERS :
   5843  *   @typeStr : focus position type, index or dac_code
   5844  *   @posStr : focus positon.
   5845  *
   5846  * RETURN     : int32_t type of status
   5847  *              NO_ERROR  -- success
   5848  *              none-zero failure code
   5849  *==========================================================================*/
   5850 int32_t  QCameraParameters::setFocusPosition(const char *typeStr, const char *posStr)
   5851 {
   5852     CDBG_HIGH("%s, type:%s, pos: %s", __func__, typeStr, posStr);
   5853     int32_t type = atoi(typeStr);
   5854     float pos = (float) atof(posStr);
   5855 
   5856     if ((type >= CAM_MANUAL_FOCUS_MODE_INDEX) &&
   5857             (type < CAM_MANUAL_FOCUS_MODE_MAX)) {
   5858         // get max and min focus position from m_pCapability
   5859         int32_t minFocusPos = (int32_t) m_pCapability->min_focus_pos[type];
   5860         int32_t maxFocusPos = (int32_t) m_pCapability->max_focus_pos[type];
   5861         CDBG_HIGH("%s, focusPos min: %d, max: %d", __func__, minFocusPos, maxFocusPos);
   5862 
   5863         if (pos >= minFocusPos && pos <= maxFocusPos) {
   5864             updateParamEntry(KEY_QC_MANUAL_FOCUS_POS_TYPE, typeStr);
   5865             updateParamEntry(KEY_QC_MANUAL_FOCUS_POSITION, posStr);
   5866 
   5867             cam_manual_focus_parm_t manual_focus;
   5868             manual_focus.flag = (cam_manual_focus_mode_type)type;
   5869             if (manual_focus.flag == CAM_MANUAL_FOCUS_MODE_DIOPTER) {
   5870                 manual_focus.af_manual_diopter = pos;
   5871             } else if (manual_focus.flag == CAM_MANUAL_FOCUS_MODE_RATIO) {
   5872                 manual_focus.af_manual_lens_position_ratio = (int32_t) pos;
   5873             } else if (manual_focus.flag == CAM_MANUAL_FOCUS_MODE_INDEX) {
   5874                 manual_focus.af_manual_lens_position_index = (int32_t) pos;
   5875             } else {
   5876                 manual_focus.af_manual_lens_position_dac = (int32_t) pos;
   5877             }
   5878 
   5879             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_MANUAL_FOCUS_POS,
   5880                     manual_focus)) {
   5881                 return BAD_VALUE;
   5882             }
   5883             return NO_ERROR;
   5884         }
   5885     }
   5886 
   5887     ALOGE("%s, invalid params, type:%d, pos: %f", __func__, type, pos);
   5888     return BAD_VALUE;
   5889 }
   5890 
   5891 /*===========================================================================
   5892  * FUNCTION   : updateAEInfo
   5893  *
   5894  * DESCRIPTION: update exposure information from metadata callback
   5895  *
   5896  * PARAMETERS :
   5897  *   @ae_params : auto exposure params
   5898  *
   5899  * RETURN     : void
   5900  *==========================================================================*/
   5901 void  QCameraParameters::updateAEInfo(cam_3a_params_t &ae_params)
   5902 {
   5903     const char *prevExpTime = get(KEY_QC_CURRENT_EXPOSURE_TIME);
   5904     char newExpTime[15];
   5905     snprintf(newExpTime, sizeof(newExpTime), "%f", ae_params.exp_time*1000.0);
   5906 
   5907     if (prevExpTime == NULL || strcmp(prevExpTime, newExpTime)) {
   5908         CDBG("update exposure time: old: %s, new: %s", prevExpTime, newExpTime);
   5909         set(KEY_QC_CURRENT_EXPOSURE_TIME, newExpTime);
   5910     }
   5911 
   5912     int32_t prevISO = getInt(KEY_QC_CURRENT_ISO);
   5913     int32_t newISO = ae_params.iso_value;
   5914     if (prevISO != newISO) {
   5915         CDBG("update iso: old:%d, new:%d", prevISO, newISO);
   5916         set(KEY_QC_CURRENT_ISO, newISO);
   5917     }
   5918 }
   5919 
   5920 /*===========================================================================
   5921  * FUNCTION   : updateCurrentFocusPosition
   5922  *
   5923  * DESCRIPTION: update current focus position from metadata callback
   5924  *
   5925  * PARAMETERS :
   5926  *   @pos : current focus position
   5927  *
   5928  * RETURN     : void
   5929  *==========================================================================*/
   5930 void  QCameraParameters::updateCurrentFocusPosition(cam_focus_pos_info_t &cur_pos_info)
   5931 {
   5932     int prevScalePos = getInt(KEY_QC_FOCUS_POSITION_SCALE);
   5933     int newScalePos = (int) cur_pos_info.scale;
   5934     if (prevScalePos != newScalePos) {
   5935         CDBG("update focus scale: old:%d, new:%d", prevScalePos, newScalePos);
   5936         set(KEY_QC_FOCUS_POSITION_SCALE, newScalePos);
   5937     }
   5938 
   5939     float prevDiopterPos = getFloat(KEY_QC_FOCUS_POSITION_DIOPTER);
   5940     float newDiopterPos = cur_pos_info.diopter;
   5941     if (prevDiopterPos != newDiopterPos) {
   5942         CDBG("update focus diopter: old:%f, new:%f", prevDiopterPos, newDiopterPos);
   5943         setFloat(KEY_QC_FOCUS_POSITION_DIOPTER, newDiopterPos);
   5944     }
   5945 }
   5946 
   5947 /*===========================================================================
   5948  * FUNCTION   : setSharpness
   5949  *
   5950  * DESCRIPTION: set sharpness control value
   5951  *
   5952  * PARAMETERS :
   5953  *   @sharpness  : sharpness control value
   5954  *
   5955  * RETURN     : int32_t type of status
   5956  *              NO_ERROR  -- success
   5957  *              none-zero failure code
   5958  *==========================================================================*/
   5959 int32_t QCameraParameters::setSharpness(int sharpness)
   5960 {
   5961     char val[16];
   5962     snprintf(val, sizeof(val), "%d", sharpness);
   5963     updateParamEntry(KEY_QC_SHARPNESS, val);
   5964     CDBG_HIGH("%s: Setting sharpness %s", __func__, val);
   5965     m_nSharpness = sharpness;
   5966     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SHARPNESS, m_nSharpness)) {
   5967         return BAD_VALUE;
   5968     }
   5969 
   5970     return NO_ERROR;
   5971 }
   5972 
   5973 /*===========================================================================
   5974  * FUNCTION   : setSkinToneEnhancement
   5975  *
   5976  * DESCRIPTION: set skin tone enhancement value
   5977  *
   5978  * PARAMETERS :
   5979  *   @sceFactore  : skin tone enhancement factor value
   5980  *
   5981  * RETURN     : int32_t type of status
   5982  *              NO_ERROR  -- success
   5983  *              none-zero failure code
   5984  *==========================================================================*/
   5985 int32_t QCameraParameters::setSkinToneEnhancement(int sceFactor)
   5986 {
   5987     char val[16];
   5988     snprintf(val, sizeof(val), "%d", sceFactor);
   5989     updateParamEntry(KEY_QC_SCE_FACTOR, val);
   5990     CDBG_HIGH("%s: Setting skintone enhancement %s", __func__, val);
   5991 
   5992     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SCE_FACTOR, sceFactor)) {
   5993         return BAD_VALUE;
   5994     }
   5995 
   5996     return NO_ERROR;
   5997 }
   5998 
   5999 /*===========================================================================
   6000  * FUNCTION   : setSaturation
   6001  *
   6002  * DESCRIPTION: set saturation control value
   6003  *
   6004  * PARAMETERS :
   6005  *   @saturation : saturation control value
   6006  *
   6007  * RETURN     : int32_t type of status
   6008  *              NO_ERROR  -- success
   6009  *              none-zero failure code
   6010  *==========================================================================*/
   6011 int32_t QCameraParameters::setSaturation(int saturation)
   6012 {
   6013     char val[16];
   6014     snprintf(val, sizeof(val), "%d", saturation);
   6015     updateParamEntry(KEY_QC_SATURATION, val);
   6016     CDBG_HIGH("%s: Setting saturation %s", __func__, val);
   6017 
   6018     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SATURATION, saturation)) {
   6019         return BAD_VALUE;
   6020     }
   6021 
   6022     return NO_ERROR;
   6023 }
   6024 
   6025 /*===========================================================================
   6026  * FUNCTION   : setContrast
   6027  *
   6028  * DESCRIPTION: set contrast control value
   6029  *
   6030  * PARAMETERS :
   6031  *   @contrast : contrast control value
   6032  *
   6033  * RETURN     : int32_t type of status
   6034  *              NO_ERROR  -- success
   6035  *              none-zero failure code
   6036  *==========================================================================*/
   6037 int32_t QCameraParameters::setContrast(int contrast)
   6038 {
   6039     char val[16];
   6040     snprintf(val, sizeof(val), "%d", contrast);
   6041     updateParamEntry(KEY_QC_CONTRAST, val);
   6042     CDBG_HIGH("%s: Setting contrast %s", __func__, val);
   6043 
   6044     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CONTRAST, contrast)) {
   6045         return BAD_VALUE;
   6046     }
   6047 
   6048     return NO_ERROR;
   6049 }
   6050 
   6051 /*===========================================================================
   6052  * FUNCTION   : setSceneDetect
   6053  *
   6054  * DESCRIPTION: set scenen detect value
   6055  *
   6056  * PARAMETERS :
   6057  *   @sceneDetect  : scene detect value string
   6058  *
   6059  * RETURN     : int32_t type of status
   6060  *              NO_ERROR  -- success
   6061  *              none-zero failure code
   6062  *==========================================================================*/
   6063 int32_t QCameraParameters::setSceneDetect(const char *sceneDetect)
   6064 {
   6065     if (sceneDetect != NULL) {
   6066         int32_t value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP),
   6067                 sceneDetect);
   6068         if (value != NAME_NOT_FOUND) {
   6069             CDBG_HIGH("%s: Setting Scene Detect %s", __func__, sceneDetect);
   6070             updateParamEntry(KEY_QC_SCENE_DETECT, sceneDetect);
   6071             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ASD_ENABLE, value)) {
   6072                 return BAD_VALUE;
   6073             }
   6074             return NO_ERROR;
   6075         }
   6076     }
   6077     ALOGE("Invalid Scene Detect value: %s",
   6078           (sceneDetect == NULL) ? "NULL" : sceneDetect);
   6079     return BAD_VALUE;
   6080 }
   6081 
   6082 /*===========================================================================
   6083  * FUNCTION   : setSensorSnapshotHDR
   6084  *
   6085  * DESCRIPTION: set snapshot HDR value
   6086  *
   6087  * PARAMETERS :
   6088  *   @snapshotHDR  : snapshot HDR value string
   6089  *
   6090  * RETURN     : int32_t type of status
   6091  *              NO_ERROR  -- success
   6092  *              none-zero failure code
   6093  *==========================================================================*/
   6094 int32_t QCameraParameters::setSensorSnapshotHDR(const char *snapshotHDR)
   6095 {
   6096     if (snapshotHDR != NULL) {
   6097         int32_t value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP),
   6098                 snapshotHDR);
   6099         if (value != NAME_NOT_FOUND) {
   6100             CDBG_HIGH("%s: Setting Sensor Snapshot HDR %s", __func__, snapshotHDR);
   6101             updateParamEntry(KEY_QC_SENSOR_HDR, snapshotHDR);
   6102             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SENSOR_HDR, value)) {
   6103                 return BAD_VALUE;
   6104             }
   6105             return NO_ERROR;
   6106         }
   6107     }
   6108     ALOGE("Invalid Snapshot HDR value: %s",
   6109           (snapshotHDR == NULL) ? "NULL" : snapshotHDR);
   6110     return BAD_VALUE;
   6111 
   6112 }
   6113 
   6114 
   6115 /*===========================================================================
   6116  * FUNCTION   : setVideoHDR
   6117  *
   6118  * DESCRIPTION: set video HDR value
   6119  *
   6120  * PARAMETERS :
   6121  *   @videoHDR  : svideo HDR value string
   6122  *
   6123  * RETURN     : int32_t type of status
   6124  *              NO_ERROR  -- success
   6125  *              none-zero failure code
   6126  *==========================================================================*/
   6127 int32_t QCameraParameters::setVideoHDR(const char *videoHDR)
   6128 {
   6129     if (videoHDR != NULL) {
   6130         int32_t value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP), videoHDR);
   6131         if (value != NAME_NOT_FOUND) {
   6132             CDBG_HIGH("%s: Setting Video HDR %s", __func__, videoHDR);
   6133             updateParamEntry(KEY_QC_VIDEO_HDR, videoHDR);
   6134             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_VIDEO_HDR, value)) {
   6135                 return BAD_VALUE;
   6136             }
   6137             return NO_ERROR;
   6138         }
   6139     }
   6140     ALOGE("Invalid Video HDR value: %s",
   6141           (videoHDR == NULL) ? "NULL" : videoHDR);
   6142     return BAD_VALUE;
   6143 }
   6144 
   6145 
   6146 
   6147 /*===========================================================================
   6148  * FUNCTION   : setVtEnable
   6149  *
   6150  * DESCRIPTION: set vt Enable value
   6151  *
   6152  * PARAMETERS :
   6153  *   @videoHDR  : svtEnable value string
   6154  *
   6155  * RETURN     : int32_t type of status
   6156  *              NO_ERROR  -- success
   6157  *              none-zero failure code
   6158  *==========================================================================*/
   6159 int32_t QCameraParameters::setVtEnable(const char *vtEnable)
   6160 {
   6161     if (vtEnable != NULL) {
   6162         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   6163                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), vtEnable);
   6164         if (value != NAME_NOT_FOUND) {
   6165             CDBG_HIGH("%s: Setting Vt Enable %s", __func__, vtEnable);
   6166             m_bAVTimerEnabled = true;
   6167             updateParamEntry(KEY_QC_VT_ENABLE, vtEnable);
   6168             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_VT, value)) {
   6169                 return BAD_VALUE;
   6170             }
   6171             return NO_ERROR;
   6172         }
   6173     }
   6174     ALOGE("Invalid Vt Enable value: %s",
   6175           (vtEnable == NULL) ? "NULL" : vtEnable);
   6176     m_bAVTimerEnabled = false;
   6177     return BAD_VALUE;
   6178 }
   6179 
   6180 /*===========================================================================
   6181  * FUNCTION   : setFaceRecognition
   6182  *
   6183  * DESCRIPTION: set face recognition value
   6184  *
   6185  * PARAMETERS :
   6186  *   @faceRecog  : face recognition value string
   6187  *   @maxFaces   : number of max faces to be detected/recognized
   6188  *
   6189  * RETURN     : int32_t type of status
   6190  *              NO_ERROR  -- success
   6191  *              none-zero failure code
   6192  *==========================================================================*/
   6193 int32_t QCameraParameters::setFaceRecognition(const char *faceRecog,
   6194         uint32_t maxFaces)
   6195 {
   6196     if (faceRecog != NULL) {
   6197         int32_t value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP), faceRecog);
   6198         if (value != NAME_NOT_FOUND) {
   6199             CDBG_HIGH("%s: Setting face recognition %s", __func__, faceRecog);
   6200             updateParamEntry(KEY_QC_FACE_RECOGNITION, faceRecog);
   6201 
   6202             uint32_t faceProcMask = m_nFaceProcMask;
   6203             if (value > 0) {
   6204                 faceProcMask |= CAM_FACE_PROCESS_MASK_RECOGNITION;
   6205             } else {
   6206                 faceProcMask &= (uint32_t)(~CAM_FACE_PROCESS_MASK_RECOGNITION);
   6207             }
   6208 
   6209             if(m_nFaceProcMask == faceProcMask) {
   6210                 CDBG_HIGH("%s: face process mask not changed, no ops here", __func__);
   6211                 return NO_ERROR;
   6212             }
   6213             m_nFaceProcMask = faceProcMask;
   6214             CDBG_HIGH("%s: FaceProcMask -> %d", __func__, m_nFaceProcMask);
   6215 
   6216             // set parm for face process
   6217             cam_fd_set_parm_t fd_set_parm;
   6218             memset(&fd_set_parm, 0, sizeof(cam_fd_set_parm_t));
   6219             fd_set_parm.fd_mode = m_nFaceProcMask;
   6220             fd_set_parm.num_fd = maxFaces;
   6221 
   6222             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FD, fd_set_parm)) {
   6223                 return BAD_VALUE;
   6224             }
   6225             return NO_ERROR;
   6226         }
   6227     }
   6228     ALOGE("Invalid face recognition value: %s", (faceRecog == NULL) ? "NULL" : faceRecog);
   6229     return BAD_VALUE;
   6230 }
   6231 
   6232 /*===========================================================================
   6233  * FUNCTION   : setZoom
   6234  *
   6235  * DESCRIPTION: set zoom level
   6236  *
   6237  * PARAMETERS :
   6238  *   @zoom_level : zoom level
   6239  *
   6240  * RETURN     : int32_t type of status
   6241  *              NO_ERROR  -- success
   6242  *              none-zero failure code
   6243  *==========================================================================*/
   6244 int32_t QCameraParameters::setZoom(int zoom_level)
   6245 {
   6246     char val[16];
   6247     snprintf(val, sizeof(val), "%d", zoom_level);
   6248     updateParamEntry(KEY_ZOOM, val);
   6249     CDBG_HIGH("%s: zoom level: %d", __func__, zoom_level);
   6250     mZoomLevel = zoom_level;
   6251     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ZOOM, zoom_level)) {
   6252         return BAD_VALUE;
   6253     }
   6254 
   6255     return NO_ERROR;
   6256 }
   6257 
   6258 /*===========================================================================
   6259  * FUNCTION   : setISOValue
   6260  *
   6261  * DESCRIPTION: set ISO value
   6262  *
   6263  * PARAMETERS :
   6264  *   @isoValue : ISO value string
   6265  *
   6266  * RETURN     : int32_t type of status
   6267  *              NO_ERROR  -- success
   6268  *              none-zero failure code
   6269  *==========================================================================*/
   6270 int32_t  QCameraParameters::setISOValue(const char *isoValue)
   6271 {
   6272     if (isoValue != NULL) {
   6273         if (!strcmp(isoValue, ISO_MANUAL)) {
   6274             CDBG("%s, iso manual mode - use continuous iso", __func__);
   6275             updateParamEntry(KEY_QC_ISO_MODE, isoValue);
   6276             return NO_ERROR;
   6277         }
   6278         int32_t value = lookupAttr(ISO_MODES_MAP, PARAM_MAP_SIZE(ISO_MODES_MAP), isoValue);
   6279         if (value != NAME_NOT_FOUND) {
   6280             CDBG_HIGH("%s: Setting ISO value %s", __func__, isoValue);
   6281             updateParamEntry(KEY_QC_ISO_MODE, isoValue);
   6282             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ISO, value)) {
   6283                 return BAD_VALUE;
   6284             }
   6285             return NO_ERROR;
   6286         }
   6287     }
   6288     ALOGE("Invalid ISO value: %s",
   6289           (isoValue == NULL) ? "NULL" : isoValue);
   6290     return BAD_VALUE;
   6291 }
   6292 
   6293 
   6294 /*===========================================================================
   6295  * FUNCTION   : setContinuousISO
   6296  *
   6297  * DESCRIPTION: set continuous ISO value
   6298  *
   6299  * PARAMETERS :
   6300  *   @params : ISO value parameter
   6301  *
   6302  * RETURN     : int32_t type of status
   6303  *              NO_ERROR  -- success
   6304  *              none-zero failure code
   6305  *==========================================================================*/
   6306 int32_t  QCameraParameters::setContinuousISO(const QCameraParameters& params)
   6307 {
   6308     const char *iso = params.get(KEY_QC_ISO_MODE);
   6309     CDBG("%s, current iso mode: %s", __func__, iso);
   6310 
   6311     if (iso != NULL) {
   6312         if (strcmp(iso, ISO_MANUAL)) {
   6313             CDBG("%s, dont set iso to back-end.", __func__);
   6314             return NO_ERROR;
   6315         }
   6316     }
   6317 
   6318     const char *str = params.get(KEY_QC_CONTINUOUS_ISO);
   6319     const char *prev_str = get(KEY_QC_CONTINUOUS_ISO);
   6320     if (str != NULL) {
   6321         if (prev_str == NULL ||
   6322             strcmp(str, prev_str) != 0) {
   6323             return setContinuousISO(str);
   6324         }
   6325     }
   6326     return NO_ERROR;
   6327 }
   6328 
   6329 /*===========================================================================
   6330  * FUNCTION   : setExposureTime
   6331  *
   6332  * DESCRIPTION: set exposure time
   6333  *
   6334  * PARAMETERS :
   6335  *   @expTimeStr : string of exposure time in ms
   6336  *
   6337  * RETURN     : int32_t type of status
   6338  *              NO_ERROR  -- success
   6339  *              none-zero failure code
   6340  *==========================================================================*/
   6341 int32_t  QCameraParameters::setExposureTime(const char *expTimeStr)
   6342 {
   6343     if (expTimeStr != NULL) {
   6344         double expTimeMs = atof(expTimeStr);
   6345         //input is in milli seconds. Convert to nano sec for backend
   6346         int64_t expTimeNs = ((int64_t)expTimeMs)*1000000L;
   6347 
   6348         // expTime == 0 means not to use manual exposure time.
   6349         if ((0 <= expTimeNs) &&
   6350                 ((expTimeNs == 0) ||
   6351                 ((expTimeNs >= m_pCapability->exposure_time_range[0]) &&
   6352                 (expTimeNs <= m_pCapability->exposure_time_range[1])))) {
   6353             CDBG_HIGH("%s, exposure time: %f ms", __func__, expTimeMs);
   6354             updateParamEntry(KEY_QC_EXPOSURE_TIME, expTimeStr);
   6355             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_EXPOSURE_TIME,
   6356                     (uint64_t)expTimeNs)) {
   6357                 return BAD_VALUE;
   6358             }
   6359             return NO_ERROR;
   6360         }
   6361     }
   6362 
   6363     ALOGE("Invalid exposure time, value: %s",
   6364           (expTimeStr == NULL) ? "NULL" : expTimeStr);
   6365     return BAD_VALUE;
   6366 }
   6367 
   6368 /*===========================================================================
   6369  * FUNCTION   : setLongshotEnable
   6370  *
   6371  * DESCRIPTION: set a flag indicating longshot mode
   6372  *
   6373  * PARAMETERS :
   6374  *   @enable  : true - Longshot enabled
   6375  *              false - Longshot disabled
   6376  *
   6377  * RETURN     : int32_t type of status
   6378  *              NO_ERROR  -- success
   6379  *              none-zero failure code
   6380  *==========================================================================*/
   6381 int32_t QCameraParameters::setLongshotEnable(bool enable)
   6382 {
   6383     int32_t rc = NO_ERROR;
   6384     int8_t value = enable ? 1 : 0;
   6385 
   6386     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   6387         ALOGE("%s:Failed to initialize group update table", __func__);
   6388         return BAD_TYPE;
   6389     }
   6390 
   6391     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_LONGSHOT_ENABLE, value)) {
   6392         ALOGE("%s:Failed to update table", __func__);
   6393         return BAD_VALUE;
   6394     }
   6395 
   6396     rc = commitSetBatch();
   6397     if (rc != NO_ERROR) {
   6398         ALOGE("%s:Failed to parameter changes", __func__);
   6399         return rc;
   6400     }
   6401 
   6402     return rc;
   6403 }
   6404 
   6405 /*===========================================================================
   6406  * FUNCTION   : setFlash
   6407  *
   6408  * DESCRIPTION: set flash mode
   6409  *
   6410  * PARAMETERS :
   6411  *   @flashStr : LED flash mode value string
   6412  *
   6413  * RETURN     : int32_t type of status
   6414  *              NO_ERROR  -- success
   6415  *              none-zero failure code
   6416  *==========================================================================*/
   6417 int32_t QCameraParameters::setFlash(const char *flashStr)
   6418 {
   6419     if (flashStr != NULL) {
   6420         int32_t value = lookupAttr(FLASH_MODES_MAP, PARAM_MAP_SIZE(FLASH_MODES_MAP), flashStr);
   6421         if (value != NAME_NOT_FOUND) {
   6422             CDBG_HIGH("%s: Setting Flash value %s", __func__, flashStr);
   6423             updateParamEntry(KEY_FLASH_MODE, flashStr);
   6424             mFlashValue = value;
   6425             return NO_ERROR;
   6426         }
   6427     }
   6428     ALOGE("Invalid flash value: %s", (flashStr == NULL) ? "NULL" : flashStr);
   6429     return BAD_VALUE;
   6430 }
   6431 
   6432 /*===========================================================================
   6433  * FUNCTION   : updateFlashMode
   6434  *
   6435  * DESCRIPTION: update flash mode
   6436  *
   6437  * PARAMETERS :
   6438  *   @flashStr : LED flash mode value
   6439  *
   6440  * RETURN     : int32_t type of status
   6441  *              NO_ERROR  -- success
   6442  *              none-zero failure code
   6443  *==========================================================================*/
   6444 int32_t QCameraParameters::updateFlashMode(cam_flash_mode_t flash_mode)
   6445 {
   6446     int32_t rc = NO_ERROR;
   6447     if (flash_mode >= CAM_FLASH_MODE_MAX) {
   6448         CDBG_HIGH("%s: Error!! Invalid flash mode (%d)", __func__, flash_mode);
   6449         return BAD_VALUE;
   6450     }
   6451     CDBG_HIGH("%s: Setting Flash mode from EZTune %d", __func__, flash_mode);
   6452 
   6453     const char *flash_mode_str = lookupNameByValue(FLASH_MODES_MAP,
   6454             PARAM_MAP_SIZE(FLASH_MODES_MAP), flash_mode);
   6455     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   6456         ALOGE("%s:Failed to initialize group update table", __func__);
   6457         return BAD_TYPE;
   6458     }
   6459     rc = setFlash(flash_mode_str);
   6460     if (rc != NO_ERROR) {
   6461         ALOGE("%s:Failed to update Flash mode", __func__);
   6462         return rc;
   6463     }
   6464 
   6465     CDBG_HIGH("%s: Setting Flash mode %d", __func__, mFlashValue);
   6466     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_LED_MODE, mFlashValue)) {
   6467         ALOGE("%s:Failed to set led mode", __func__);
   6468         return BAD_VALUE;
   6469     }
   6470 
   6471     rc = commitSetBatch();
   6472     if (rc != NO_ERROR) {
   6473         ALOGE("%s:Failed to commit parameters", __func__);
   6474         return rc;
   6475     }
   6476 
   6477     return NO_ERROR;
   6478 }
   6479 
   6480 
   6481 /*===========================================================================
   6482  * FUNCTION   : configureFlash
   6483  *
   6484  * DESCRIPTION: configure Flash Bracketing.
   6485  *
   6486  * PARAMETERS :
   6487  *    @frame_config : output configaration structure to fill in.
   6488  *
   6489  * RETURN     : int32_t type of status
   6490  *              NO_ERROR  -- success
   6491  *              none-zero failure code
   6492  *==========================================================================*/
   6493 int32_t QCameraParameters::configureFlash(cam_capture_frame_config_t &frame_config)
   6494 {
   6495     CDBG_HIGH("%s: E",__func__);
   6496     int32_t rc = NO_ERROR;
   6497     uint32_t i = 0;
   6498 
   6499     if (isChromaFlashEnabled()) {
   6500 
   6501         rc = setToneMapMode(false, false);
   6502         if (rc != NO_ERROR) {
   6503             ALOGE("%s: Failed to configure tone map", __func__);
   6504             return rc;
   6505         }
   6506 
   6507         rc = setCDSMode(CAM_CDS_MODE_OFF, false);
   6508         if (rc != NO_ERROR) {
   6509             ALOGE("%s: Failed to configure csd mode", __func__);
   6510             return rc;
   6511         }
   6512 
   6513         CDBG_HIGH("%s : Enable Chroma Flash capture", __func__);
   6514         cam_flash_mode_t flash_mode = CAM_FLASH_MODE_OFF;
   6515         frame_config.num_batch =
   6516                 m_pCapability->chroma_flash_settings_need.burst_count;
   6517         if (frame_config.num_batch > CAM_MAX_FLASH_BRACKETING) {
   6518             frame_config.num_batch = CAM_MAX_FLASH_BRACKETING;
   6519         }
   6520         for (i = 0; i < frame_config.num_batch; i++) {
   6521             flash_mode = (m_pCapability->chroma_flash_settings_need.flash_bracketing[i]) ?
   6522                     CAM_FLASH_MODE_ON:CAM_FLASH_MODE_OFF;
   6523             frame_config.configs[i].num_frames = 1;
   6524             frame_config.configs[i].type = CAM_CAPTURE_FLASH;
   6525             frame_config.configs[i].flash_mode = flash_mode;
   6526         }
   6527     } else if (mFlashValue != CAM_FLASH_MODE_OFF) {
   6528         frame_config.num_batch = 1;
   6529         for (i = 0; i < frame_config.num_batch; i++) {
   6530             frame_config.configs[i].num_frames = 1;
   6531             frame_config.configs[i].type = CAM_CAPTURE_FLASH;
   6532             frame_config.configs[i].flash_mode =(cam_flash_mode_t)mFlashValue;
   6533         }
   6534     }
   6535 
   6536     CDBG("%s: Chroma Flash cnt = %d", __func__,frame_config.num_batch);
   6537     return rc;
   6538 }
   6539 
   6540 /*===========================================================================
   6541  * FUNCTION   : configureHDRBracketing
   6542  *
   6543  * DESCRIPTION: configure HDR Bracketing.
   6544  *
   6545  * PARAMETERS :
   6546  *    @frame_config : output configaration structure to fill in.
   6547  *
   6548  * RETURN     : int32_t type of status
   6549  *              NO_ERROR  -- success
   6550  *              none-zero failure code
   6551  *==========================================================================*/
   6552 int32_t QCameraParameters::configureHDRBracketing(cam_capture_frame_config_t &frame_config)
   6553 {
   6554     CDBG_HIGH("%s: E",__func__);
   6555     int32_t rc = NO_ERROR;
   6556     uint32_t i = 0;
   6557 
   6558     uint32_t hdrFrameCount = m_pCapability->hdr_bracketing_setting.num_frames;
   6559     CDBG_HIGH("%s : HDR values %d, %d frame count: %u",
   6560           __func__,
   6561           (int8_t) m_pCapability->hdr_bracketing_setting.exp_val.values[0],
   6562           (int8_t) m_pCapability->hdr_bracketing_setting.exp_val.values[1],
   6563           hdrFrameCount);
   6564 
   6565     frame_config.num_batch = hdrFrameCount;
   6566 
   6567     cam_bracket_mode mode =
   6568             m_pCapability->hdr_bracketing_setting.exp_val.mode;
   6569     if (mode == CAM_EXP_BRACKETING_ON) {
   6570         rc = setToneMapMode(false, true);
   6571         if (rc != NO_ERROR) {
   6572             ALOGE("%s: Failed to disable tone map during HDR", __func__);
   6573         }
   6574     }
   6575     for (i = 0; i < frame_config.num_batch; i++) {
   6576         frame_config.configs[i].num_frames = 1;
   6577         frame_config.configs[i].type = CAM_CAPTURE_BRACKETING;
   6578         frame_config.configs[i].hdr_mode.mode = mode;
   6579         frame_config.configs[i].hdr_mode.values =
   6580                 m_pCapability->hdr_bracketing_setting.exp_val.values[i];
   6581         CDBG("%s: exp values %d", __func__,
   6582                 (int)frame_config.configs[i].hdr_mode.values);
   6583     }
   6584     return rc;
   6585 }
   6586 
   6587 /*===========================================================================
   6588  * FUNCTION   : configureAEBracketing
   6589  *
   6590  * DESCRIPTION: configure AE Bracketing.
   6591  *
   6592  * PARAMETERS :
   6593  *    @frame_config : output configaration structure to fill in.
   6594  *
   6595  * RETURN     : int32_t type of status
   6596  *              NO_ERROR  -- success
   6597  *              none-zero failure code
   6598  *==========================================================================*/
   6599 int32_t QCameraParameters::configureAEBracketing(cam_capture_frame_config_t &frame_config)
   6600 {
   6601     CDBG_HIGH("%s: E",__func__);
   6602     int32_t rc = NO_ERROR;
   6603     uint32_t i = 0;
   6604     char exp_value[MAX_EXP_BRACKETING_LENGTH];
   6605 
   6606     rc = setToneMapMode(false, true);
   6607     if (rc != NO_ERROR) {
   6608         CDBG_HIGH("%s: Failed to disable tone map during AEBracketing", __func__);
   6609     }
   6610 
   6611     uint32_t burstCount = 0;
   6612     const char *str_val = m_AEBracketingClient.values;
   6613     if ((str_val != NULL) && (strlen(str_val) > 0)) {
   6614         char prop[PROPERTY_VALUE_MAX];
   6615         memset(prop, 0, sizeof(prop));
   6616         strlcpy(prop, str_val, PROPERTY_VALUE_MAX);
   6617         char *saveptr = NULL;
   6618         char *token = strtok_r(prop, ",", &saveptr);
   6619         if (token != NULL) {
   6620             exp_value[burstCount++] = (char)atoi(token);
   6621             while (token != NULL) {
   6622                 token = strtok_r(NULL, ",", &saveptr);
   6623                 if (token != NULL) {
   6624                     exp_value[burstCount++] = (char)atoi(token);
   6625                 }
   6626             }
   6627         }
   6628     }
   6629 
   6630     frame_config.num_batch = burstCount;
   6631     cam_bracket_mode mode = m_AEBracketingClient.mode;
   6632 
   6633     for (i = 0; i < frame_config.num_batch; i++) {
   6634         frame_config.configs[i].num_frames = 1;
   6635         frame_config.configs[i].type = CAM_CAPTURE_BRACKETING;
   6636         frame_config.configs[i].hdr_mode.mode = mode;
   6637         frame_config.configs[i].hdr_mode.values =
   6638                 m_AEBracketingClient.values[i];
   6639         CDBG("%s: exp values %d", __func__, (int)m_AEBracketingClient.values[i]);
   6640     }
   6641 
   6642     CDBG_HIGH("%s: num_frame = %d X",__func__, burstCount);
   6643     return rc;
   6644 }
   6645 
   6646 /*===========================================================================
   6647  * FUNCTION   : configFrameCapture
   6648  *
   6649  * DESCRIPTION: configuration for ZSL special captures (FLASH/HDR etc)
   6650  *
   6651  * PARAMETERS :
   6652  *   @commitSettings : flag to enable or disable commit this this settings
   6653  *
   6654  * RETURN     : int32_t type of status
   6655  *              NO_ERROR  -- success
   6656  *              none-zero failure code
   6657  *==========================================================================*/
   6658 int32_t QCameraParameters::configFrameCapture(bool commitSettings)
   6659 {
   6660     int32_t rc = NO_ERROR;
   6661     memset(&m_captureFrameConfig, 0, sizeof(cam_capture_frame_config_t));
   6662 
   6663     if (commitSettings) {
   6664         if(initBatchUpdate(m_pParamBuf) < 0 ) {
   6665             ALOGE("%s:Failed to initialize group update table", __func__);
   6666             return BAD_TYPE;
   6667         }
   6668     }
   6669 
   6670     if (isChromaFlashEnabled() || mFlashValue != CAM_FLASH_MODE_OFF) {
   6671         configureFlash(m_captureFrameConfig);
   6672     } else if(isHDREnabled()) {
   6673         configureHDRBracketing (m_captureFrameConfig);
   6674     } else if(isAEBracketEnabled()) {
   6675         configureAEBracketing (m_captureFrameConfig);
   6676     }
   6677 
   6678     rc = ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CAPTURE_FRAME_CONFIG,
   6679             (cam_capture_frame_config_t)m_captureFrameConfig);
   6680     if (rc != NO_ERROR) {
   6681         rc = BAD_VALUE;
   6682         ALOGE("%s:Failed to set capture settings", __func__);
   6683         return rc;
   6684     }
   6685 
   6686     if (commitSettings) {
   6687         rc = commitSetBatch();
   6688         if (rc != NO_ERROR) {
   6689             ALOGE("%s:Failed to commit parameters", __func__);
   6690             return rc;
   6691         }
   6692     }
   6693     return rc;
   6694 }
   6695 
   6696 /*===========================================================================
   6697  * FUNCTION   : resetFrameCapture
   6698  *
   6699  * DESCRIPTION: reset special captures settings(FLASH/HDR etc)
   6700  *
   6701  * PARAMETERS :
   6702  *   @commitSettings : flag to enable or disable commit this this settings
   6703  *
   6704  * RETURN     : int32_t type of status
   6705  *              NO_ERROR  -- success
   6706  *              none-zero failure code
   6707  *==========================================================================*/
   6708 int32_t QCameraParameters::resetFrameCapture(bool commitSettings)
   6709 {
   6710     int32_t rc = NO_ERROR, i = 0;
   6711     memset(&m_captureFrameConfig, 0, sizeof(cam_capture_frame_config_t));
   6712 
   6713     if (commitSettings) {
   6714         if(initBatchUpdate(m_pParamBuf) < 0 ) {
   6715             ALOGE("%s:Failed to initialize group update table", __func__);
   6716             return BAD_TYPE;
   6717         }
   6718     }
   6719 
   6720     if (isHDREnabled() || isAEBracketEnabled()) {
   6721         rc = setToneMapMode(true, true);
   6722         if (rc != NO_ERROR) {
   6723             CDBG_HIGH("%s: Failed to enable tone map during HDR/AEBracketing", __func__);
   6724         }
   6725         rc = stopAEBracket();
   6726     } else if (isChromaFlashEnabled()) {
   6727         rc = setToneMapMode(true, false);
   6728         if (rc != NO_ERROR) {
   6729             CDBG_HIGH("%s: Failed to enable tone map during chroma flash", __func__);
   6730         }
   6731 
   6732         rc = setCDSMode(mCds_mode, false);
   6733         if (rc != NO_ERROR) {
   6734             ALOGE("%s: Failed to configure csd mode", __func__);
   6735             return rc;
   6736         }
   6737     }
   6738 
   6739     rc = ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CAPTURE_FRAME_CONFIG,
   6740             (cam_capture_frame_config_t)m_captureFrameConfig);
   6741     if (rc != NO_ERROR) {
   6742         rc = BAD_VALUE;
   6743         ALOGE("%s:Failed to set capture settings", __func__);
   6744         return rc;
   6745     }
   6746 
   6747     if (commitSettings) {
   6748         rc = commitSetBatch();
   6749         if (rc != NO_ERROR) {
   6750             ALOGE("%s:Failed to commit parameters", __func__);
   6751             return rc;
   6752         }
   6753     }
   6754     return rc;
   6755 }
   6756 
   6757 /*===========================================================================
   6758  * FUNCTION   : setAecLock
   6759  *
   6760  * DESCRIPTION: set AEC lock value
   6761  *
   6762  * PARAMETERS :
   6763  *   @aecLockStr : AEC lock value string
   6764  *
   6765  * RETURN     : int32_t type of status
   6766  *              NO_ERROR  -- success
   6767  *              none-zero failure code
   6768  *==========================================================================*/
   6769 int32_t QCameraParameters::setAecLock(const char *aecLockStr)
   6770 {
   6771     if (aecLockStr != NULL) {
   6772         int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP, PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP),
   6773                 aecLockStr);
   6774         if (value != NAME_NOT_FOUND) {
   6775             CDBG_HIGH("%s: Setting AECLock value %s", __func__, aecLockStr);
   6776             updateParamEntry(KEY_AUTO_EXPOSURE_LOCK, aecLockStr);
   6777             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   6778                     CAM_INTF_PARM_AEC_LOCK, (uint32_t)value)) {
   6779                 return BAD_VALUE;
   6780             }
   6781             return NO_ERROR;
   6782         }
   6783     }
   6784     ALOGE("Invalid AECLock value: %s",
   6785         (aecLockStr == NULL) ? "NULL" : aecLockStr);
   6786     return BAD_VALUE;
   6787 }
   6788 
   6789 /*===========================================================================
   6790  * FUNCTION   : setAwbLock
   6791  *
   6792  * DESCRIPTION: set AWB lock value
   6793  *
   6794  * PARAMETERS :
   6795  *   @awbLockStr : AWB lock value string
   6796  *
   6797  * RETURN     : int32_t type of status
   6798  *              NO_ERROR  -- success
   6799  *              none-zero failure code
   6800  *==========================================================================*/
   6801 int32_t QCameraParameters::setAwbLock(const char *awbLockStr)
   6802 {
   6803     if (awbLockStr != NULL) {
   6804         int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP, PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP),
   6805                 awbLockStr);
   6806         if (value != NAME_NOT_FOUND) {
   6807             CDBG_HIGH("%s: Setting AWBLock value %s", __func__, awbLockStr);
   6808             updateParamEntry(KEY_AUTO_WHITEBALANCE_LOCK, awbLockStr);
   6809             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   6810                     CAM_INTF_PARM_AWB_LOCK, (uint32_t)value)) {
   6811                 return BAD_VALUE;
   6812             }
   6813             return NO_ERROR;
   6814         }
   6815     }
   6816     ALOGE("Invalid AWBLock value: %s", (awbLockStr == NULL) ? "NULL" : awbLockStr);
   6817     return BAD_VALUE;
   6818 }
   6819 
   6820 /*===========================================================================
   6821  * FUNCTION   : setMCEValue
   6822  *
   6823  * DESCRIPTION: set memory color enhancement value
   6824  *
   6825  * PARAMETERS :
   6826  *   @mceStr : MCE value string
   6827  *
   6828  * RETURN     : int32_t type of status
   6829  *              NO_ERROR  -- success
   6830  *              none-zero failure code
   6831  *==========================================================================*/
   6832 int32_t QCameraParameters::setMCEValue(const char *mceStr)
   6833 {
   6834     if (mceStr != NULL) {
   6835         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   6836                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), mceStr);
   6837         if (value != NAME_NOT_FOUND) {
   6838             CDBG_HIGH("%s: Setting AWBLock value %s", __func__, mceStr);
   6839             updateParamEntry(KEY_QC_MEMORY_COLOR_ENHANCEMENT, mceStr);
   6840             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_MCE, value)) {
   6841                 return BAD_VALUE;
   6842             }
   6843             return NO_ERROR;
   6844         }
   6845     }
   6846     ALOGE("Invalid MCE value: %s", (mceStr == NULL) ? "NULL" : mceStr);
   6847     return BAD_VALUE;
   6848 }
   6849 
   6850 /*===========================================================================
   6851  * FUNCTION   : setTintlessValue
   6852  *
   6853  * DESCRIPTION: enable/disable tintless from user setting
   6854  *
   6855  * PARAMETERS :
   6856  *   @params  : user setting parameters
   6857  *
   6858  * RETURN     : int32_t type of status
   6859  *              NO_ERROR  -- success
   6860  *              none-zero failure code
   6861  *==========================================================================*/
   6862 int32_t QCameraParameters::setTintlessValue(const QCameraParameters& params)
   6863 {
   6864     const char *str = params.get(KEY_QC_TINTLESS_ENABLE);
   6865     const char *prev_str = get(KEY_QC_TINTLESS_ENABLE);
   6866     char prop[PROPERTY_VALUE_MAX];
   6867 
   6868     memset(prop, 0, sizeof(prop));
   6869     property_get("persist.camera.tintless", prop, VALUE_ENABLE);
   6870     if (str != NULL) {
   6871         if (prev_str == NULL ||
   6872             strcmp(str, prev_str) != 0) {
   6873             return setTintlessValue(str);
   6874         }
   6875     } else {
   6876         if (prev_str == NULL ||
   6877             strcmp(prev_str, prop) != 0 ) {
   6878             setTintlessValue(prop);
   6879         }
   6880     }
   6881 
   6882     return NO_ERROR;
   6883 }
   6884 
   6885 /*===========================================================================
   6886  * FUNCTION   : setTintless
   6887  *
   6888  * DESCRIPTION: set tintless mode
   6889  *
   6890  * PARAMETERS :
   6891  *   @enable : 1 = enable, 0 = disable
   6892  *
   6893  * RETURN     : int32_t type of status
   6894  *              NO_ERROR  -- success
   6895  *              none-zero failure code
   6896  *==========================================================================*/
   6897 void QCameraParameters::setTintless(bool enable)
   6898 {
   6899     if (enable) {
   6900         setTintlessValue(VALUE_ENABLE);
   6901     } else {
   6902         setTintlessValue(VALUE_DISABLE);
   6903     }
   6904 }
   6905 
   6906 /*===========================================================================
   6907  * FUNCTION   : setTintlessValue
   6908  *
   6909  * DESCRIPTION: set tintless value
   6910  *
   6911  * PARAMETERS :
   6912  *   @tintStr : Tintless value string
   6913  *
   6914  * RETURN     : int32_t type of status
   6915  *              NO_ERROR  -- success
   6916  *              none-zero failure code
   6917  *==========================================================================*/
   6918 int32_t QCameraParameters::setTintlessValue(const char *tintStr)
   6919 {
   6920     if (tintStr != NULL) {
   6921         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   6922                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), tintStr);
   6923         if (value != NAME_NOT_FOUND) {
   6924             CDBG_HIGH("%s: Setting Tintless value %s", __func__, tintStr);
   6925             updateParamEntry(KEY_QC_TINTLESS_ENABLE, tintStr);
   6926             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_TINTLESS, value)) {
   6927                 return BAD_VALUE;
   6928             }
   6929             return NO_ERROR;
   6930         }
   6931     }
   6932     ALOGE("Invalid Tintless value: %s", (tintStr == NULL) ? "NULL" : tintStr);
   6933     return BAD_VALUE;
   6934 }
   6935 
   6936 /*===========================================================================
   6937  * FUNCTION   : setCDSMode
   6938  *
   6939  * DESCRIPTION: Set CDS mode
   6940  *
   6941  * PARAMETERS :
   6942  *   @params  : user setting parameters
   6943  *
   6944  * RETURN     : int32_t type of status
   6945  *              NO_ERROR  -- success
   6946  *              none-zero failure code
   6947  *==========================================================================*/
   6948 int32_t QCameraParameters::setCDSMode(const QCameraParameters& params)
   6949 {
   6950     const char *str = params.get(KEY_QC_CDS_MODE);
   6951     const char *prev_str = get(KEY_QC_CDS_MODE);
   6952     const char *video_str = params.get(KEY_QC_VIDEO_CDS_MODE);
   6953     const char *video_prev_str = get(KEY_QC_VIDEO_CDS_MODE);
   6954     int32_t rc = NO_ERROR;
   6955 
   6956     if (m_bRecordingHint_new == true) {
   6957         if (video_str) {
   6958             if ((video_prev_str == NULL) || (strcmp(video_str, video_prev_str) != 0)) {
   6959                 int32_t cds_mode = lookupAttr(CDS_MODES_MAP, PARAM_MAP_SIZE(CDS_MODES_MAP),
   6960                         video_str);
   6961                 if (cds_mode != NAME_NOT_FOUND) {
   6962                     updateParamEntry(KEY_QC_VIDEO_CDS_MODE, video_str);
   6963                     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
   6964                         ALOGE("%s:Failed CDS MODE to update table", __func__);
   6965                         rc = BAD_VALUE;
   6966                     } else {
   6967                         CDBG("%s: Set CDS in video mode = %d", __func__, cds_mode);
   6968                         mCds_mode = cds_mode;
   6969                     }
   6970                 } else {
   6971                     ALOGE("%s: Invalid argument for video CDS MODE %d", __func__,  cds_mode);
   6972                     rc = BAD_VALUE;
   6973                 }
   6974             }
   6975         } else {
   6976             char video_prop[PROPERTY_VALUE_MAX];
   6977             memset(video_prop, 0, sizeof(video_prop));
   6978             property_get("persist.camera.video.CDS", video_prop, CDS_MODE_ON);
   6979             int32_t cds_mode = lookupAttr(CDS_MODES_MAP, PARAM_MAP_SIZE(CDS_MODES_MAP),
   6980                     video_prop);
   6981             if (cds_mode != NAME_NOT_FOUND) {
   6982                 updateParamEntry(KEY_QC_VIDEO_CDS_MODE, video_prop);
   6983                 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
   6984                     ALOGE("%s:Failed CDS MODE to update table", __func__);
   6985                     rc = BAD_VALUE;
   6986                 } else {
   6987                     CDBG("%s: Set CDS in video mode from setprop = %d", __func__, cds_mode);
   6988                     mCds_mode = cds_mode;
   6989                 }
   6990             } else {
   6991                 ALOGE("%s: Invalid prop for video CDS MODE %d", __func__,  cds_mode);
   6992                 rc = BAD_VALUE;
   6993             }
   6994         }
   6995     } else {
   6996         if (str) {
   6997             if ((prev_str == NULL) || (strcmp(str, prev_str) != 0)) {
   6998                 int32_t cds_mode = lookupAttr(CDS_MODES_MAP, PARAM_MAP_SIZE(CDS_MODES_MAP),
   6999                         str);
   7000                 if (cds_mode != NAME_NOT_FOUND) {
   7001                     updateParamEntry(KEY_QC_CDS_MODE, str);
   7002                     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
   7003                         ALOGE("%s:Failed CDS MODE to update table", __func__);
   7004                         rc = BAD_VALUE;
   7005                     } else {
   7006                         CDBG("%s: Set CDS in capture mode = %d", __func__, cds_mode);
   7007                         mCds_mode = cds_mode;
   7008                     }
   7009                 } else {
   7010                     ALOGE("%s: Invalid argument for snapshot CDS MODE %d", __func__,  cds_mode);
   7011                     rc = BAD_VALUE;
   7012                 }
   7013             }
   7014         } else {
   7015             char prop[PROPERTY_VALUE_MAX];
   7016             memset(prop, 0, sizeof(prop));
   7017             property_get("persist.camera.CDS", prop, CDS_MODE_ON);
   7018             int32_t cds_mode = lookupAttr(CDS_MODES_MAP, PARAM_MAP_SIZE(CDS_MODES_MAP),
   7019                     prop);
   7020             if (cds_mode != NAME_NOT_FOUND) {
   7021                 updateParamEntry(KEY_QC_CDS_MODE, prop);
   7022                 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
   7023                     ALOGE("%s:Failed CDS MODE to update table", __func__);
   7024                     rc = BAD_VALUE;
   7025                 } else {
   7026                     CDBG("%s: Set CDS in snapshot mode from setprop = %d", __func__, cds_mode);
   7027                     mCds_mode = cds_mode;
   7028                 }
   7029             } else {
   7030                 ALOGE("%s: Invalid prop for snapshot CDS MODE %d", __func__,  cds_mode);
   7031                 rc = BAD_VALUE;
   7032             }
   7033         }
   7034     }
   7035 
   7036     return rc;
   7037 }
   7038 
   7039 /*===========================================================================
   7040  * FUNCTION   : setDISValue
   7041  *
   7042  * DESCRIPTION: set DIS value
   7043  *
   7044  * PARAMETERS :
   7045  *   @disStr : DIS value string
   7046  *
   7047  * RETURN     : int32_t type of status
   7048  *              NO_ERROR  -- success
   7049  *              none-zero failure code
   7050  *==========================================================================*/
   7051 int32_t QCameraParameters::setDISValue(const char *disStr)
   7052 {
   7053     if (disStr != NULL) {
   7054         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   7055                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), disStr);
   7056         if (value != NAME_NOT_FOUND) {
   7057             //For some IS types (like EIS 2.0), when DIS value is changed, we need to restart
   7058             //preview because of topology change in backend. But, for now, restart preview
   7059             //for all IS types.
   7060             m_bNeedRestart = true;
   7061             CDBG_HIGH("%s: Setting DIS value %s", __func__, disStr);
   7062             updateParamEntry(KEY_QC_DIS, disStr);
   7063             if (!(strcmp(disStr,"enable"))) {
   7064                 m_bDISEnabled = true;
   7065             } else {
   7066                 m_bDISEnabled = false;
   7067             }
   7068             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_DIS_ENABLE, value)) {
   7069                 return BAD_VALUE;
   7070             }
   7071             return NO_ERROR;
   7072         }
   7073     }
   7074     ALOGE("Invalid DIS value: %s", (disStr == NULL) ? "NULL" : disStr);
   7075     m_bDISEnabled = false;
   7076     return BAD_VALUE;
   7077 }
   7078 
   7079 /*===========================================================================
   7080  * FUNCTION   : updateOisValue
   7081  *
   7082  * DESCRIPTION: update OIS value
   7083  *
   7084  * PARAMETERS :
   7085  *   @oisValue : OIS value TRUE/FALSE
   7086  *
   7087  * RETURN     : int32_t type of status
   7088  *              NO_ERROR  -- success
   7089  *              none-zero failure code
   7090  *==========================================================================*/
   7091 int32_t QCameraParameters::updateOisValue(bool oisValue)
   7092 {
   7093     uint8_t enable = 0;
   7094     int32_t rc = NO_ERROR;
   7095 
   7096     // Check for OIS disable
   7097     char ois_prop[PROPERTY_VALUE_MAX];
   7098     memset(ois_prop, 0, sizeof(ois_prop));
   7099     property_get("persist.camera.ois.disable", ois_prop, "0");
   7100     uint8_t ois_disable = (uint8_t)atoi(ois_prop);
   7101 
   7102     //Enable OIS if it is camera mode or Camcoder 4K mode
   7103     if (!m_bRecordingHint || (is4k2kVideoResolution() && m_bRecordingHint)) {
   7104         enable = 1;
   7105         CDBG_HIGH("%s: Valid OIS mode!! ", __func__);
   7106     }
   7107     // Disable OIS if setprop is set
   7108     if (ois_disable || !oisValue) {
   7109         //Disable OIS
   7110         enable = 0;
   7111         CDBG_HIGH("%s: Disable OIS mode!! ois_disable(%d) oisValue(%d)",
   7112                 __func__, ois_disable, oisValue);
   7113 
   7114     }
   7115     m_bOISEnabled = enable;
   7116     if (m_bOISEnabled) {
   7117         updateParamEntry(KEY_QC_OIS, VALUE_ENABLE);
   7118     } else {
   7119         updateParamEntry(KEY_QC_OIS, VALUE_DISABLE);
   7120     }
   7121 
   7122     if (initBatchUpdate(m_pParamBuf) < 0 ) {
   7123         ALOGE("%s:Failed to initialize group update table", __func__);
   7124         return BAD_TYPE;
   7125     }
   7126 
   7127     CDBG_HIGH("%s: Sending OIS mode (%d)", __func__, enable);
   7128     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_META_LENS_OPT_STAB_MODE, enable)) {
   7129         ALOGE("%s:Failed to update table", __func__);
   7130         return BAD_VALUE;
   7131     }
   7132 
   7133     rc = commitSetBatch();
   7134     if (rc != NO_ERROR) {
   7135         ALOGE("%s:Failed to parameter changes", __func__);
   7136         return rc;
   7137     }
   7138 
   7139     return rc;
   7140 }
   7141 
   7142 /*===========================================================================
   7143  * FUNCTION   : setHighFrameRate
   7144  *
   7145  * DESCRIPTION: set high frame rate
   7146  *
   7147  * PARAMETERS :
   7148  *   @hfrMode : HFR mode
   7149  *
   7150  * RETURN     : int32_t type of status
   7151  *              NO_ERROR  -- success
   7152  *              none-zero failure code
   7153  *==========================================================================*/
   7154 int32_t QCameraParameters::setHighFrameRate(const int32_t hfrMode)
   7155 {
   7156     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HFR, hfrMode)) {
   7157         return BAD_VALUE;
   7158     }
   7159 
   7160     return NO_ERROR;
   7161 }
   7162 
   7163 /*===========================================================================
   7164  * FUNCTION   : setLensShadeValue
   7165  *
   7166  * DESCRIPTION: set lens shade value
   7167  *
   7168  * PARAMETERS :
   7169  *   @lensSahdeStr : lens shade value string
   7170  *
   7171  * RETURN     : int32_t type of status
   7172  *              NO_ERROR  -- success
   7173  *              none-zero failure code
   7174  *==========================================================================*/
   7175 int32_t QCameraParameters::setLensShadeValue(const char *lensShadeStr)
   7176 {
   7177     if (lensShadeStr != NULL) {
   7178         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   7179                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), lensShadeStr);
   7180         if (value != NAME_NOT_FOUND) {
   7181             CDBG_HIGH("%s: Setting LensShade value %s", __func__, lensShadeStr);
   7182             updateParamEntry(KEY_QC_LENSSHADE, lensShadeStr);
   7183             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ROLLOFF, value)) {
   7184                 return BAD_VALUE;
   7185             }
   7186             return NO_ERROR;
   7187         }
   7188     }
   7189     ALOGE("Invalid LensShade value: %s",
   7190           (lensShadeStr == NULL) ? "NULL" : lensShadeStr);
   7191     return BAD_VALUE;
   7192 }
   7193 
   7194 /*===========================================================================
   7195  * FUNCTION   : setExposureCompensation
   7196  *
   7197  * DESCRIPTION: set exposure compensation value
   7198  *
   7199  * PARAMETERS :
   7200  *   @expComp : exposure compensation value
   7201  *
   7202  * RETURN     : int32_t type of status
   7203  *              NO_ERROR  -- success
   7204  *              none-zero failure code
   7205  *==========================================================================*/
   7206 int32_t QCameraParameters::setExposureCompensation(int expComp)
   7207 {
   7208     char val[16];
   7209     snprintf(val, sizeof(val), "%d", expComp);
   7210     updateParamEntry(KEY_EXPOSURE_COMPENSATION, val);
   7211 
   7212     // Don't need to pass step as part of setParameter because
   7213     // camera daemon is already aware of it.
   7214     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_EXPOSURE_COMPENSATION, expComp)) {
   7215         return BAD_VALUE;
   7216     }
   7217 
   7218     return NO_ERROR;
   7219 }
   7220 
   7221 /*===========================================================================
   7222  * FUNCTION   : setWhiteBalance
   7223  *
   7224  * DESCRIPTION: set white balance mode
   7225  *
   7226  * PARAMETERS :
   7227  *   @wbStr   : white balance mode value string
   7228  *
   7229  * RETURN     : int32_t type of status
   7230  *              NO_ERROR  -- success
   7231  *              none-zero failure code
   7232  *==========================================================================*/
   7233 int32_t QCameraParameters::setWhiteBalance(const char *wbStr)
   7234 {
   7235     if (wbStr != NULL) {
   7236         int32_t value = lookupAttr(WHITE_BALANCE_MODES_MAP,
   7237                 PARAM_MAP_SIZE(WHITE_BALANCE_MODES_MAP), wbStr);
   7238         if (value != NAME_NOT_FOUND) {
   7239             CDBG_HIGH("%s: Setting WhiteBalance value %s", __func__, wbStr);
   7240             updateParamEntry(KEY_WHITE_BALANCE, wbStr);
   7241             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_WHITE_BALANCE, value)) {
   7242                 return BAD_VALUE;
   7243             }
   7244             return NO_ERROR;
   7245         }
   7246     }
   7247     ALOGE("Invalid WhiteBalance value: %s", (wbStr == NULL) ? "NULL" : wbStr);
   7248     return BAD_VALUE;
   7249 }
   7250 
   7251 /*===========================================================================
   7252  * FUNCTION   : setWBManualCCT
   7253  *
   7254  * DESCRIPTION: set setWBManualCCT time
   7255  *
   7256  * PARAMETERS :
   7257  *   @cctStr : string of wb cct, range (2000, 8000) in K.
   7258  *
   7259  * RETURN     : int32_t type of status
   7260  *              NO_ERROR  -- success
   7261  *              none-zero failure code
   7262  *==========================================================================*/
   7263 int32_t  QCameraParameters::setWBManualCCT(const char *cctStr)
   7264 {
   7265     if (cctStr != NULL) {
   7266         int32_t cctVal = atoi(cctStr);
   7267         int32_t minCct = m_pCapability->min_wb_cct; /* 2000K */
   7268         int32_t maxCct = m_pCapability->max_wb_cct; /* 8000K */
   7269 
   7270         if (cctVal >= minCct && cctVal <= maxCct) {
   7271             CDBG_HIGH("%s, cct value: %d", __func__, cctVal);
   7272             updateParamEntry(KEY_QC_WB_MANUAL_CCT, cctStr);
   7273             cam_manual_wb_parm_t manual_wb;
   7274             manual_wb.type = CAM_MANUAL_WB_MODE_CCT;
   7275             manual_wb.cct = cctVal;
   7276             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_WB_MANUAL, manual_wb)) {
   7277                 return BAD_VALUE;
   7278             }
   7279             return NO_ERROR;
   7280         }
   7281     }
   7282 
   7283     ALOGE("Invalid cct, value: %s",
   7284             (cctStr == NULL) ? "NULL" : cctStr);
   7285     return BAD_VALUE;
   7286 }
   7287 
   7288 /*===========================================================================
   7289  * FUNCTION   : updateAWBParams
   7290  *
   7291  * DESCRIPTION: update CCT parameters key
   7292  *
   7293  * PARAMETERS :
   7294  *   @awb_params : WB parameters
   7295  *
   7296  * RETURN     : int32_t type of status
   7297  *              NO_ERROR  -- success
   7298  *              none-zero failure code
   7299  *==========================================================================*/
   7300 int32_t QCameraParameters::updateAWBParams(cam_awb_params_t &awb_params)
   7301 {
   7302     //check and update CCT
   7303     int32_t prev_cct = getInt(KEY_QC_WB_MANUAL_CCT);
   7304     if (prev_cct != awb_params.cct_value) {
   7305         CDBG("%s: update current cct value. old:%d, now:%d", __func__,
   7306                 prev_cct, awb_params.cct_value);
   7307         set(KEY_QC_WB_MANUAL_CCT, awb_params.cct_value);
   7308     }
   7309 
   7310     //check and update WB gains
   7311     const char *prev_gains = get(KEY_QC_MANUAL_WB_GAINS);
   7312     char gainStr[30];
   7313     snprintf(gainStr, sizeof(gainStr), "%f,%f,%f", awb_params.rgb_gains.r_gain,
   7314         awb_params.rgb_gains.g_gain, awb_params.rgb_gains.b_gain);
   7315 
   7316     if (prev_gains == NULL || strcmp(prev_gains, gainStr)) {
   7317         set(KEY_QC_MANUAL_WB_GAINS, gainStr);
   7318         CDBG("%s: update currernt RGB gains: old %s new %s",__func__, prev_gains, gainStr);
   7319     }
   7320     return NO_ERROR;
   7321 }
   7322 
   7323 /*===========================================================================
   7324  * FUNCTION   : parseGains
   7325  *
   7326  * DESCRIPTION: parse WB gains
   7327  *
   7328  * PARAMETERS :
   7329  *   @gainStr : WB result string
   7330  *   @r_gain  : WB red gain
   7331  *   @g_gain  : WB green gain
   7332  *   @b_gain  : WB blue gain
   7333  *
   7334  * RETURN     : int32_t type of status
   7335  *              NO_ERROR  -- success
   7336  *              none-zero failure code
   7337  *==========================================================================*/
   7338 int32_t QCameraParameters::parseGains(const char *gainStr, float &r_gain,
   7339         float &g_gain, float &b_gain)
   7340 {
   7341     int32_t rc = NO_ERROR;
   7342     char *saveptr = NULL;
   7343     char* gains = (char*) calloc(1, strlen(gainStr) + 1);
   7344     if (NULL == gains) {
   7345         ALOGE("%s: No memory for gains", __func__);
   7346         return NO_MEMORY;
   7347     }
   7348     strlcpy(gains, gainStr, strlen(gainStr) + 1);
   7349     char *token = strtok_r(gains, ",", &saveptr);
   7350 
   7351     if (NULL != token) {
   7352         r_gain = atof(token);
   7353         token = strtok_r(NULL, ",", &saveptr);
   7354     }
   7355 
   7356     if (NULL != token) {
   7357         g_gain = atof(token);
   7358         token = strtok_r(NULL, ",", &saveptr);
   7359     }
   7360 
   7361     if (NULL != token) {
   7362         b_gain = (float) atof(token);
   7363     } else {
   7364         ALOGE("%s: Malformed string for gains", __func__);
   7365         rc = BAD_VALUE;
   7366     }
   7367 
   7368     free(gains);
   7369     return rc;
   7370 }
   7371 
   7372 /*===========================================================================
   7373  * FUNCTION   : setManualWBGains
   7374  *
   7375  * DESCRIPTION: set manual wb gains for r,g,b
   7376  *
   7377  * PARAMETERS :
   7378  *   @cctStr : string of wb gains, range (1.0, 4.0).
   7379  *
   7380  * RETURN     : int32_t type of status
   7381  *              NO_ERROR  -- success
   7382  *              none-zero failure code
   7383  *==========================================================================*/
   7384 int32_t QCameraParameters::setManualWBGains(const char *gainStr)
   7385 {
   7386     int32_t rc = NO_ERROR;
   7387     if (gainStr != NULL) {
   7388         float r_gain, g_gain, b_gain;
   7389         rc = parseGains(gainStr, r_gain, g_gain, b_gain);
   7390         if (rc != NO_ERROR) {
   7391             return rc;
   7392         }
   7393 
   7394         float minGain = m_pCapability->min_wb_gain;
   7395         float maxGain = m_pCapability->max_wb_gain;
   7396 
   7397         if ((r_gain >= minGain) && (r_gain <= maxGain) &&
   7398                 (g_gain >= minGain) && (g_gain <= maxGain) &&
   7399                 (b_gain >= minGain) && (b_gain <= maxGain)) {
   7400             CDBG_HIGH("%s, setting rgb gains: %s", __func__, gainStr);
   7401             updateParamEntry(KEY_QC_MANUAL_WB_GAINS, gainStr);
   7402             cam_manual_wb_parm_t manual_wb;
   7403             manual_wb.type = CAM_MANUAL_WB_MODE_GAIN;
   7404             manual_wb.gains.r_gain = r_gain;
   7405             manual_wb.gains.g_gain = g_gain;
   7406             manual_wb.gains.b_gain = b_gain;
   7407             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_WB_MANUAL, manual_wb)) {
   7408                 return BAD_VALUE;
   7409             }
   7410             return NO_ERROR;
   7411         }
   7412     }
   7413 
   7414     CDBG_HIGH("Invalid manual wb gains: %s",
   7415           (gainStr == NULL) ? "NULL" : gainStr);
   7416     return BAD_VALUE;
   7417 }
   7418 
   7419 int QCameraParameters::getAutoFlickerMode()
   7420 {
   7421     /* Enable Advanced Auto Antibanding where we can set
   7422        any of the following option
   7423        ie. CAM_ANTIBANDING_MODE_AUTO
   7424            CAM_ANTIBANDING_MODE_AUTO_50HZ
   7425            CAM_ANTIBANDING_MODE_AUTO_60HZ
   7426       Currently setting it to default    */
   7427     char prop[PROPERTY_VALUE_MAX];
   7428     memset(prop, 0, sizeof(prop));
   7429     property_get("persist.camera.set.afd", prop, "3");
   7430     return atoi(prop);
   7431 }
   7432 
   7433 /*===========================================================================
   7434  * FUNCTION   : setAntibanding
   7435  *
   7436  * DESCRIPTION: set antibanding value
   7437  *
   7438  * PARAMETERS :
   7439  *   @antiBandingStr : antibanding value string
   7440  *
   7441  * RETURN     : int32_t type of status
   7442  *              NO_ERROR  -- success
   7443  *              none-zero failure code
   7444  *==========================================================================*/
   7445 int32_t QCameraParameters::setAntibanding(const char *antiBandingStr)
   7446 {
   7447     if (antiBandingStr != NULL) {
   7448         int32_t value = lookupAttr(ANTIBANDING_MODES_MAP, PARAM_MAP_SIZE(ANTIBANDING_MODES_MAP),
   7449                 antiBandingStr);
   7450         if (value != NAME_NOT_FOUND) {
   7451             CDBG_HIGH("%s: Setting AntiBanding value %s", __func__, antiBandingStr);
   7452             updateParamEntry(KEY_ANTIBANDING, antiBandingStr);
   7453             if(value == CAM_ANTIBANDING_MODE_AUTO) {
   7454                value = getAutoFlickerMode();
   7455             }
   7456             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   7457                     CAM_INTF_PARM_ANTIBANDING, (uint32_t)value)) {
   7458                 return BAD_VALUE;
   7459             }
   7460             return NO_ERROR;
   7461         }
   7462     }
   7463     ALOGE("Invalid AntiBanding value: %s",
   7464           (antiBandingStr == NULL) ? "NULL" : antiBandingStr);
   7465     return BAD_VALUE;
   7466 }
   7467 
   7468 /*===========================================================================
   7469  * FUNCTION   : setFocusAreas
   7470  *
   7471  * DESCRIPTION: set focus areas
   7472  *
   7473  * PARAMETERS :
   7474  *   @focusAreasStr : focus areas value string
   7475  *
   7476  * RETURN     : int32_t type of status
   7477  *              NO_ERROR  -- success
   7478  *              none-zero failure code
   7479  *==========================================================================*/
   7480 int32_t QCameraParameters::setFocusAreas(const char *focusAreasStr)
   7481 {
   7482     if (m_pCapability->max_num_focus_areas == 0 ||
   7483         focusAreasStr == NULL) {
   7484         CDBG("%s: Parameter string is null", __func__);
   7485         return NO_ERROR;
   7486     }
   7487 
   7488     cam_area_t *areas = (cam_area_t *)malloc(sizeof(cam_area_t) * m_pCapability->max_num_focus_areas);
   7489     if (NULL == areas) {
   7490         ALOGE("%s: No memory for areas", __func__);
   7491         return NO_MEMORY;
   7492     }
   7493     memset(areas, 0, sizeof(cam_area_t) * m_pCapability->max_num_focus_areas);
   7494     int num_areas_found = 0;
   7495     if (parseCameraAreaString(focusAreasStr,
   7496                               m_pCapability->max_num_focus_areas,
   7497                               areas,
   7498                               num_areas_found) != NO_ERROR) {
   7499         ALOGE("%s: Failed to parse the string: %s", __func__, focusAreasStr);
   7500         free(areas);
   7501         return BAD_VALUE;
   7502     }
   7503 
   7504     if (validateCameraAreas(areas, num_areas_found) == false) {
   7505         ALOGE("%s: invalid areas specified : %s", __func__, focusAreasStr);
   7506         free(areas);
   7507         return BAD_VALUE;
   7508     }
   7509 
   7510     updateParamEntry(KEY_FOCUS_AREAS, focusAreasStr);
   7511 
   7512     //for special area string (0, 0, 0, 0, 0), set the num_areas_found to 0,
   7513     //so no action is takenby the lower layer
   7514     if (num_areas_found == 1 &&
   7515         areas[0].rect.left == 0 &&
   7516         areas[0].rect.top == 0 &&
   7517         areas[0].rect.width == 0 &&
   7518         areas[0].rect.height == 0 &&
   7519         areas[0].weight == 0) {
   7520         num_areas_found = 0;
   7521     }
   7522 
   7523     int previewWidth, previewHeight;
   7524     getPreviewSize(&previewWidth, &previewHeight);
   7525     cam_roi_info_t af_roi_value;
   7526     memset(&af_roi_value, 0, sizeof(cam_roi_info_t));
   7527     af_roi_value.num_roi = (uint8_t)num_areas_found;
   7528     for (int i = 0; i < num_areas_found; i++) {
   7529         CDBG_HIGH("%s: FocusArea[%d] = (%d, %d, %d, %d)",
   7530               __func__, i, (areas[i].rect.top), (areas[i].rect.left),
   7531               (areas[i].rect.width), (areas[i].rect.height));
   7532 
   7533         // Transform the coords from (-1000, 1000)
   7534         // to (0, previewWidth or previewHeight).
   7535         af_roi_value.roi[i].left =
   7536                 (int32_t)(((double)areas[i].rect.left + 1000.0) *
   7537                     ((double)previewWidth / 2000.0));
   7538         af_roi_value.roi[i].top =
   7539                 (int32_t)(((double)areas[i].rect.top + 1000.0) *
   7540                     ((double)previewHeight / 2000.0));
   7541         af_roi_value.roi[i].width =
   7542                 (int32_t)((double)areas[i].rect.width *
   7543                     (double)previewWidth / 2000.0);
   7544         af_roi_value.roi[i].height =
   7545                 (int32_t)((double)areas[i].rect.height *
   7546                     (double)previewHeight / 2000.0);
   7547         af_roi_value.weight[i] = areas[i].weight;
   7548     }
   7549     free(areas);
   7550     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_AF_ROI, af_roi_value)) {
   7551         return BAD_VALUE;
   7552     }
   7553 
   7554     return NO_ERROR;
   7555 }
   7556 
   7557 /*===========================================================================
   7558  * FUNCTION   : setMeteringAreas
   7559  *
   7560  * DESCRIPTION: set metering areas value
   7561  *
   7562  * PARAMETERS :
   7563  *   @meteringAreasStr : metering areas value string
   7564  *
   7565  * RETURN     : int32_t type of status
   7566  *              NO_ERROR  -- success
   7567  *              none-zero failure code
   7568  *==========================================================================*/
   7569 int32_t QCameraParameters::setMeteringAreas(const char *meteringAreasStr)
   7570 {
   7571     if (m_pCapability->max_num_metering_areas == 0 ||
   7572         meteringAreasStr == NULL) {
   7573         CDBG("%s: Parameter string is null", __func__);
   7574         return NO_ERROR;
   7575     }
   7576 
   7577     cam_area_t *areas = (cam_area_t *)malloc(sizeof(cam_area_t) * m_pCapability->max_num_metering_areas);
   7578     if (NULL == areas) {
   7579         ALOGE("%s: No memory for areas", __func__);
   7580         return NO_MEMORY;
   7581     }
   7582     memset(areas, 0, sizeof(cam_area_t) * m_pCapability->max_num_metering_areas);
   7583     int num_areas_found = 0;
   7584     if (parseCameraAreaString(meteringAreasStr,
   7585                               m_pCapability->max_num_metering_areas,
   7586                               areas,
   7587                               num_areas_found) < 0) {
   7588         ALOGE("%s: Failed to parse the string: %s", __func__, meteringAreasStr);
   7589         free(areas);
   7590         return BAD_VALUE;
   7591     }
   7592 
   7593     if (validateCameraAreas(areas, num_areas_found) == false) {
   7594         ALOGE("%s: invalid areas specified : %s", __func__, meteringAreasStr);
   7595         free(areas);
   7596         return BAD_VALUE;
   7597     }
   7598 
   7599     updateParamEntry(KEY_METERING_AREAS, meteringAreasStr);
   7600 
   7601     //for special area string (0, 0, 0, 0, 0), set the num_areas_found to 0,
   7602     //so no action is takenby the lower layer
   7603     if (num_areas_found == 1 &&
   7604         areas[0].rect.left == 0 &&
   7605         areas[0].rect.top == 0 &&
   7606         areas[0].rect.width == 0 &&
   7607         areas[0].rect.height == 0 &&
   7608         areas[0].weight == 0) {
   7609         num_areas_found = 0;
   7610     }
   7611     cam_set_aec_roi_t aec_roi_value;
   7612     int previewWidth, previewHeight;
   7613     getPreviewSize(&previewWidth, &previewHeight);
   7614 
   7615     memset(&aec_roi_value, 0, sizeof(cam_set_aec_roi_t));
   7616     if (num_areas_found > 0) {
   7617         aec_roi_value.aec_roi_enable = CAM_AEC_ROI_ON;
   7618         aec_roi_value.aec_roi_type = CAM_AEC_ROI_BY_COORDINATE;
   7619 
   7620         for (int i = 0; i < num_areas_found; i++) {
   7621             CDBG_HIGH("%s: MeteringArea[%d] = (%d, %d, %d, %d)",
   7622                   __func__, i, (areas[i].rect.top), (areas[i].rect.left),
   7623                   (areas[i].rect.width), (areas[i].rect.height));
   7624 
   7625             // Transform the coords from (-1000, 1000) to
   7626             // (0, previewWidth or previewHeight).
   7627             aec_roi_value.cam_aec_roi_position.coordinate[i].x =
   7628                     (uint32_t)((((double)areas[i].rect.left +
   7629                         (double)areas[i].rect.width / 2.0) + 1000.0) *
   7630                             (double)previewWidth / 2000.0);
   7631             aec_roi_value.cam_aec_roi_position.coordinate[i].y =
   7632                     (uint32_t)((((double)areas[i].rect.top +
   7633                         (double)areas[i].rect.height / 2.0) + 1000.0) *
   7634                             (double)previewHeight / 2000.0);
   7635         }
   7636     } else {
   7637         aec_roi_value.aec_roi_enable = CAM_AEC_ROI_OFF;
   7638     }
   7639     free(areas);
   7640     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_AEC_ROI, aec_roi_value)) {
   7641         return BAD_VALUE;
   7642     }
   7643 
   7644     return NO_ERROR;
   7645 }
   7646 
   7647 /*===========================================================================
   7648  * FUNCTION   : setSceneMode
   7649  *
   7650  * DESCRIPTION: set scene mode
   7651  *
   7652  * PARAMETERS :
   7653  *   @sceneModeStr : scene mode value string
   7654  *
   7655  * RETURN     : int32_t type of status
   7656  *              NO_ERROR  -- success
   7657  *              none-zero failure code
   7658  *==========================================================================*/
   7659 int32_t QCameraParameters::setSceneMode(const char *sceneModeStr)
   7660 {
   7661     if (sceneModeStr != NULL) {
   7662         int32_t value = lookupAttr(SCENE_MODES_MAP, PARAM_MAP_SIZE(SCENE_MODES_MAP), sceneModeStr);
   7663         if (value != NAME_NOT_FOUND) {
   7664             CDBG("%s: Setting SceneMode %s", __func__, sceneModeStr);
   7665             updateParamEntry(KEY_SCENE_MODE, sceneModeStr);
   7666             if (m_bSensorHDREnabled) {
   7667               // Incase of HW HDR mode, we do not update the same as Best shot mode.
   7668               CDBG_HIGH("%s: H/W HDR mode enabled. Do not set Best Shot Mode", __func__);
   7669               return NO_ERROR;
   7670             }
   7671             if (m_bSceneSelection) {
   7672                 setSelectedScene((cam_scene_mode_type) value);
   7673             }
   7674             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_BESTSHOT_MODE,
   7675                     (uint32_t)value)) {
   7676                 return BAD_VALUE;
   7677             }
   7678             return NO_ERROR;
   7679         }
   7680     }
   7681     ALOGE("%s: Invalid Secene Mode: %s",
   7682           __func__, (sceneModeStr == NULL) ? "NULL" : sceneModeStr);
   7683     return BAD_VALUE;
   7684 }
   7685 
   7686 /*===========================================================================
   7687  * FUNCTION   : setSelectableZoneAf
   7688  *
   7689  * DESCRIPTION: set selectable zone AF algorithm
   7690  *
   7691  * PARAMETERS :
   7692  *   @selZoneAFStr : selectable zone AF algorithm value string
   7693  *
   7694  * RETURN     : int32_t type of status
   7695  *              NO_ERROR  -- success
   7696  *              none-zero failure code
   7697  *==========================================================================*/
   7698 int32_t QCameraParameters::setSelectableZoneAf(const char *selZoneAFStr)
   7699 {
   7700     if (selZoneAFStr != NULL) {
   7701         int32_t value = lookupAttr(FOCUS_ALGO_MAP, PARAM_MAP_SIZE(FOCUS_ALGO_MAP), selZoneAFStr);
   7702         if (value != NAME_NOT_FOUND) {
   7703             CDBG("%s: Setting Selectable Zone AF value %s", __func__, selZoneAFStr);
   7704             updateParamEntry(KEY_QC_SELECTABLE_ZONE_AF, selZoneAFStr);
   7705             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FOCUS_ALGO_TYPE, value)) {
   7706                 return BAD_VALUE;
   7707             }
   7708             return NO_ERROR;
   7709         }
   7710     }
   7711     ALOGE("%s: Invalid selectable zone af value: %s",
   7712           __func__, (selZoneAFStr == NULL) ? "NULL" : selZoneAFStr);
   7713     return BAD_VALUE;
   7714 }
   7715 
   7716 /*===========================================================================
   7717  * FUNCTION   : isAEBracketEnabled
   7718  *
   7719  * DESCRIPTION: checks if AE bracketing is enabled
   7720  *
   7721  * PARAMETERS :
   7722  *
   7723  * RETURN     : TRUE/FALSE
   7724  *==========================================================================*/
   7725 bool QCameraParameters::isAEBracketEnabled()
   7726 {
   7727     const char *str = get(KEY_QC_AE_BRACKET_HDR);
   7728     if (str != NULL) {
   7729         if (strcmp(str, AE_BRACKET_OFF) != 0) {
   7730             return true;
   7731         }
   7732     }
   7733     return false;
   7734 }
   7735 
   7736 /*===========================================================================
   7737  * FUNCTION   : setAEBracket
   7738  *
   7739  * DESCRIPTION: set AE bracket value
   7740  *
   7741  * PARAMETERS :
   7742  *   @aecBracketStr : AE bracket value string
   7743  *
   7744  * RETURN     : int32_t type of status
   7745  *              NO_ERROR  -- success
   7746  *              none-zero failure code
   7747  *==========================================================================*/
   7748 int32_t QCameraParameters::setAEBracket(const char *aecBracketStr)
   7749 {
   7750     if (aecBracketStr == NULL) {
   7751         CDBG("%s: setAEBracket with NULL value", __func__);
   7752         return NO_ERROR;
   7753     }
   7754 
   7755     cam_exp_bracketing_t expBracket;
   7756     memset(&expBracket, 0, sizeof(expBracket));
   7757 
   7758     int value = lookupAttr(BRACKETING_MODES_MAP, PARAM_MAP_SIZE(BRACKETING_MODES_MAP),
   7759             aecBracketStr);
   7760     switch (value) {
   7761     case CAM_EXP_BRACKETING_ON:
   7762         {
   7763             CDBG("%s, EXP_BRACKETING_ON", __func__);
   7764             const char *str_val = get(KEY_QC_CAPTURE_BURST_EXPOSURE);
   7765             if ((str_val != NULL) && (strlen(str_val)>0)) {
   7766                 expBracket.mode = CAM_EXP_BRACKETING_ON;
   7767                 m_bAeBracketingEnabled = true;
   7768                 strlcpy(expBracket.values, str_val, MAX_EXP_BRACKETING_LENGTH);
   7769                 CDBG("%s: setting Exposure Bracketing value of %s",
   7770                       __func__, expBracket.values);
   7771             }
   7772             else {
   7773                 /* Apps not set capture-burst-exposures, error case fall into bracketing off mode */
   7774                 CDBG("%s: capture-burst-exposures not set, back to HDR OFF mode", __func__);
   7775                 m_bAeBracketingEnabled = false;
   7776                 expBracket.mode = CAM_EXP_BRACKETING_OFF;
   7777             }
   7778         }
   7779         break;
   7780     default:
   7781         {
   7782             m_bAeBracketingEnabled = false;
   7783             CDBG_HIGH("%s, EXP_BRACKETING_OFF", __func__);
   7784             expBracket.mode = CAM_EXP_BRACKETING_OFF;
   7785         }
   7786         break;
   7787     }
   7788 
   7789     // Cache client AE bracketing configuration
   7790     memcpy(&m_AEBracketingClient, &expBracket, sizeof(cam_exp_bracketing_t));
   7791 
   7792     /* save the value*/
   7793     updateParamEntry(KEY_QC_AE_BRACKET_HDR, aecBracketStr);
   7794     return NO_ERROR;
   7795 }
   7796 
   7797 /*===========================================================================
   7798  * FUNCTION   : set3ALock
   7799  *
   7800  * DESCRIPTION: enable/disable 3A lock.
   7801  *
   7802  * PARAMETERS :
   7803  *   @lockStr : lock value string.
   7804  *
   7805  * RETURN     : int32_t type of status
   7806  *              NO_ERROR  -- success
   7807  *              none-zero failure code
   7808  *==========================================================================*/
   7809 int32_t QCameraParameters::set3ALock(const char *lockStr)
   7810 {
   7811     int32_t rc = NO_ERROR;
   7812     if (lockStr != NULL) {
   7813         int value = lookupAttr(TRUE_FALSE_MODES_MAP, PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP),
   7814                 lockStr);
   7815         if (value != NAME_NOT_FOUND) {
   7816             CDBG_HIGH("%s: Setting Lock lockStr =%s", __func__, lockStr);
   7817             if(initBatchUpdate(m_pParamBuf) < 0 ) {
   7818                 ALOGE("%s:Failed to initialize group update table", __func__);
   7819                 return BAD_TYPE;
   7820             }
   7821             uint32_t focus_mode = CAM_FOCUS_MODE_AUTO;
   7822             if (value == 1) {
   7823                 if (isUbiFocusEnabled() || isUbiRefocus()) {
   7824                     //For Ubi focus move focus to infinity.
   7825                     focus_mode = CAM_FOCUS_MODE_INFINITY;
   7826                 } else if (isOptiZoomEnabled() || isStillMoreEnabled()) {
   7827                     //For optizoom and stillmore, set focus as fixed.
   7828                     focus_mode = CAM_FOCUS_MODE_FIXED;
   7829                 }
   7830             } else {
   7831                 // retrieve previous focus value.
   7832                 const char *focus = get(KEY_FOCUS_MODE);
   7833                 int val = lookupAttr(FOCUS_MODES_MAP, PARAM_MAP_SIZE(FOCUS_MODES_MAP), focus);
   7834                 if (val != NAME_NOT_FOUND) {
   7835                     focus_mode = (uint32_t) val;
   7836                     CDBG("%s: focus mode %s", __func__, focus);
   7837                 }
   7838             }
   7839             //Lock AWB
   7840             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_AWB_LOCK, (uint32_t)value)) {
   7841                 return BAD_VALUE;
   7842             }
   7843             //Lock AEC
   7844             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_AEC_LOCK, (uint32_t)value)) {
   7845                 return BAD_VALUE;
   7846             }
   7847             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FOCUS_MODE, focus_mode)) {
   7848                 return BAD_VALUE;
   7849             }
   7850 
   7851             rc = commitSetBatch();
   7852             if (rc != NO_ERROR) {
   7853                 ALOGE("%s:Failed to commit batch", __func__);
   7854             }
   7855         }
   7856     }
   7857     return rc;
   7858 }
   7859 
   7860 /*===========================================================================
   7861  * FUNCTION   : setAndCommitZoom
   7862  *
   7863  * DESCRIPTION: set zoom.
   7864  *
   7865  * PARAMETERS :
   7866  *     @zoom_level : zoom level to set.
   7867  *
   7868  * RETURN     : int32_t type of status
   7869  *              NO_ERROR  -- success
   7870  *              none-zero failure code
   7871  *==========================================================================*/
   7872 int32_t QCameraParameters::setAndCommitZoom(int zoom_level)
   7873 {
   7874     CDBG_HIGH("%s: E",__func__);
   7875     int32_t rc = NO_ERROR;
   7876     if (initBatchUpdate(m_pParamBuf) < 0 ) {
   7877         ALOGE("%s:Failed to initialize group update table", __func__);
   7878         return BAD_TYPE;
   7879     }
   7880 
   7881     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ZOOM, zoom_level)) {
   7882         ALOGE("%s:Failed to update table", __func__);
   7883         return BAD_VALUE;
   7884     }
   7885 
   7886     rc = commitSetBatch();
   7887     if (rc != NO_ERROR) {
   7888         ALOGE("%s:Failed to set Flash value", __func__);
   7889     }
   7890 
   7891     mZoomLevel = zoom_level;
   7892     CDBG_HIGH("%s: X",__func__);
   7893 
   7894     return rc;
   7895 }
   7896 
   7897 /*===========================================================================
   7898  * FUNCTION   : isOptiZoomEnabled
   7899  *
   7900  * DESCRIPTION: checks whether optizoom is enabled
   7901  *
   7902  * PARAMETERS :
   7903  *
   7904  * RETURN     : true - enabled, false - disabled
   7905  *
   7906  *==========================================================================*/
   7907 bool QCameraParameters::isOptiZoomEnabled()
   7908 {
   7909     if (m_bOptiZoomOn && (0 <= mParmZoomLevel)) {
   7910         uint32_t zoom_level = (uint32_t) mParmZoomLevel;
   7911         cam_opti_zoom_t *opti_zoom_settings_need =
   7912                 &(m_pCapability->opti_zoom_settings_need);
   7913         uint32_t zoom_threshold = (uint32_t) opti_zoom_settings_need->zoom_threshold;
   7914         CDBG_HIGH("%s: current zoom level =%u & zoom_threshold =%u",
   7915                 __func__, zoom_level, zoom_threshold);
   7916 
   7917         if (zoom_level >= zoom_threshold) {
   7918             return true;
   7919         }
   7920     }
   7921 
   7922     return false;
   7923 }
   7924 
   7925 /*===========================================================================
   7926  * FUNCTION   : commitAFBracket
   7927  *
   7928  * DESCRIPTION: commit AF Bracket.
   7929  *
   7930  * PARAMETERS :
   7931  *   @AFBracket : AF bracketing configuration
   7932  *
   7933  * RETURN     : int32_t type of status
   7934  *              NO_ERROR  -- success
   7935  *              none-zero failure code
   7936  *==========================================================================*/
   7937 int32_t QCameraParameters::commitAFBracket(cam_af_bracketing_t afBracket)
   7938 {
   7939 
   7940     int32_t rc = NO_ERROR;
   7941     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   7942         ALOGE("%s:Failed to initialize group update table", __func__);
   7943         return BAD_TYPE;
   7944     }
   7945 
   7946     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FOCUS_BRACKETING, afBracket)) {
   7947         ALOGE("%s:Failed to update table", __func__);
   7948         return BAD_VALUE;
   7949     }
   7950 
   7951     rc = commitSetBatch();
   7952     if (rc != NO_ERROR) {
   7953         ALOGE("%s:Failed to commit batch", __func__);
   7954         return rc;
   7955     }
   7956 
   7957     return rc;
   7958 }
   7959 
   7960 /*===========================================================================
   7961  * FUNCTION   : commitFlashBracket
   7962  *
   7963  * DESCRIPTION: commit Flash Bracket.
   7964  *
   7965  * PARAMETERS :
   7966  *   @AFBracket : Flash bracketing configuration
   7967  *
   7968  * RETURN     : int32_t type of status
   7969  *              NO_ERROR  -- success
   7970  *              none-zero failure code
   7971  *==========================================================================*/
   7972 int32_t QCameraParameters::commitFlashBracket(cam_flash_bracketing_t flashBracket)
   7973 {
   7974     CDBG_HIGH("%s: E",__func__);
   7975     int32_t rc = NO_ERROR;
   7976     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   7977         ALOGE("%s:Failed to initialize group update table", __func__);
   7978         return BAD_TYPE;
   7979     }
   7980 
   7981     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   7982             CAM_INTF_PARM_FLASH_BRACKETING, flashBracket)) {
   7983         ALOGE("%s:Failed to update table", __func__);
   7984         return BAD_VALUE;
   7985     }
   7986 
   7987     rc = commitSetBatch();
   7988     if (rc != NO_ERROR) {
   7989         ALOGE("%s:Failed to commit batch", __func__);
   7990     }
   7991 
   7992     CDBG_HIGH("%s: X",__func__);
   7993     return rc;
   7994 }
   7995 
   7996 /*===========================================================================
   7997  * FUNCTION   : setAFBracket
   7998  *
   7999  * DESCRIPTION: set AF bracket value
   8000  *
   8001  * PARAMETERS :
   8002  *   @afBracketStr : AF bracket value string
   8003  *
   8004  * RETURN     : int32_t type of status
   8005  *              NO_ERROR  -- success
   8006  *              none-zero failure code
   8007  *==========================================================================*/
   8008 int32_t QCameraParameters::setAFBracket(const char *afBracketStr)
   8009 {
   8010     CDBG_HIGH("%s: afBracketStr =%s",__func__,afBracketStr);
   8011 
   8012     if(afBracketStr != NULL) {
   8013         int value = lookupAttr(AF_BRACKETING_MODES_MAP, PARAM_MAP_SIZE(AF_BRACKETING_MODES_MAP),
   8014                 afBracketStr);
   8015         if (value != NAME_NOT_FOUND) {
   8016             m_bAFBracketingOn = (value != 0);
   8017             updateParamEntry(KEY_QC_AF_BRACKET, afBracketStr);
   8018 
   8019             return NO_ERROR;
   8020         }
   8021     }
   8022 
   8023     ALOGE("Invalid af bracket value: %s",
   8024         (afBracketStr == NULL) ? "NULL" : afBracketStr);
   8025     return BAD_VALUE;
   8026 }
   8027 
   8028 /*===========================================================================
   8029  * FUNCTION   : setReFocus
   8030  *
   8031  * DESCRIPTION: set refocus value
   8032  *
   8033  * PARAMETERS :
   8034  *   @afBracketStr : refocus value string
   8035  *
   8036  * RETURN     : int32_t type of status
   8037  *              NO_ERROR  -- success
   8038  *              none-zero failure code
   8039  *==========================================================================*/
   8040 int32_t QCameraParameters::setReFocus(const char *reFocusStr)
   8041 {
   8042     CDBG_HIGH("%s: reFocusStr =%s",__func__,reFocusStr);
   8043 
   8044     if (reFocusStr != NULL) {
   8045         int value = lookupAttr(RE_FOCUS_MODES_MAP, PARAM_MAP_SIZE(RE_FOCUS_MODES_MAP),
   8046                 reFocusStr);
   8047         if (value != NAME_NOT_FOUND) {
   8048             m_bReFocusOn = (value != 0);
   8049             updateParamEntry(KEY_QC_RE_FOCUS, reFocusStr);
   8050             return NO_ERROR;
   8051         }
   8052     }
   8053 
   8054     return NO_ERROR;
   8055 }
   8056 
   8057 /*===========================================================================
   8058  * FUNCTION   : setChromaFlash
   8059  *
   8060  * DESCRIPTION: set chroma flash value
   8061  *
   8062  * PARAMETERS :
   8063  *   @aecBracketStr : chroma flash value string
   8064  *
   8065  * RETURN     : int32_t type of status
   8066  *              NO_ERROR  -- success
   8067  *              none-zero failure code
   8068  *==========================================================================*/
   8069 int32_t QCameraParameters::setChromaFlash(const char *chromaFlashStr)
   8070 {
   8071     CDBG_HIGH("%s: chromaFlashStr =%s",__func__,chromaFlashStr);
   8072     if(chromaFlashStr != NULL) {
   8073         int value = lookupAttr(CHROMA_FLASH_MODES_MAP, PARAM_MAP_SIZE(CHROMA_FLASH_MODES_MAP),
   8074                 chromaFlashStr);
   8075         if(value != NAME_NOT_FOUND) {
   8076             m_bChromaFlashOn = (value != 0);
   8077             updateParamEntry(KEY_QC_CHROMA_FLASH, chromaFlashStr);
   8078 
   8079             return NO_ERROR;
   8080         }
   8081     }
   8082 
   8083     ALOGE("Invalid chroma flash value: %s",
   8084         (chromaFlashStr == NULL) ? "NULL" : chromaFlashStr);
   8085     return BAD_VALUE;
   8086 }
   8087 
   8088 /*===========================================================================
   8089  * FUNCTION   : setOptiZoom
   8090  *
   8091  * DESCRIPTION: set opti zoom value
   8092  *
   8093  * PARAMETERS :
   8094  *   @optiZoomStr : opti zoom value string
   8095  *
   8096  * RETURN     : int32_t type of status
   8097  *              NO_ERROR  -- success
   8098  *              none-zero failure code
   8099  *==========================================================================*/
   8100 int32_t QCameraParameters::setOptiZoom(const char *optiZoomStr)
   8101 {
   8102     CDBG_HIGH("%s: optiZoomStr =%s",__func__,optiZoomStr);
   8103     if(optiZoomStr != NULL) {
   8104         int value = lookupAttr(OPTI_ZOOM_MODES_MAP, PARAM_MAP_SIZE(OPTI_ZOOM_MODES_MAP),
   8105                 optiZoomStr);
   8106         if(value != NAME_NOT_FOUND) {
   8107             m_bOptiZoomOn = (value != 0);
   8108             updateParamEntry(KEY_QC_OPTI_ZOOM, optiZoomStr);
   8109 
   8110             return NO_ERROR;
   8111         }
   8112     }
   8113     ALOGE("Invalid opti zoom value: %s",
   8114         (optiZoomStr == NULL) ? "NULL" : optiZoomStr);
   8115     return BAD_VALUE;
   8116 }
   8117 
   8118 /*===========================================================================
   8119  * FUNCTION   : setTruePortrait
   8120  *
   8121  * DESCRIPTION: set true portrait value
   8122  *
   8123  * PARAMETERS :
   8124  *   @optiZoomStr : true portrait value string
   8125  *
   8126  * RETURN     : int32_t type of status
   8127  *              NO_ERROR  -- success
   8128  *              none-zero failure code
   8129  *==========================================================================*/
   8130 int32_t QCameraParameters::setTruePortrait(const char *truePortraitStr)
   8131 {
   8132     CDBG_HIGH("%s: truePortraitStr =%s", __func__, truePortraitStr);
   8133     if (truePortraitStr != NULL) {
   8134         int value = lookupAttr(TRUE_PORTRAIT_MODES_MAP,
   8135                 PARAM_MAP_SIZE(TRUE_PORTRAIT_MODES_MAP),
   8136                 truePortraitStr);
   8137         if (value != NAME_NOT_FOUND) {
   8138             m_bTruePortraitOn = (value != 0);
   8139             updateParamEntry(KEY_QC_TRUE_PORTRAIT, truePortraitStr);
   8140             return NO_ERROR;
   8141         }
   8142     }
   8143     CDBG_HIGH("Invalid true portrait value: %s",
   8144             (truePortraitStr == NULL) ? "NULL" : truePortraitStr);
   8145     return BAD_VALUE;
   8146 }
   8147 
   8148 /*===========================================================================
   8149  * FUNCTION   : setHDRMode
   8150  *
   8151  * DESCRIPTION: set hdr mode value
   8152  *
   8153  * PARAMETERS :
   8154  *   @hdrModeStr : hdr mode value string
   8155  *
   8156  * RETURN     : int32_t type of status
   8157  *              NO_ERROR  -- success
   8158  *              none-zero failure code
   8159  *==========================================================================*/
   8160 int32_t QCameraParameters::setHDRMode(const char *hdrModeStr)
   8161 {
   8162     CDBG_HIGH("%s: hdrModeStr =%s", __func__, hdrModeStr);
   8163     if (hdrModeStr != NULL) {
   8164         int value = lookupAttr(HDR_MODES_MAP, PARAM_MAP_SIZE(HDR_MODES_MAP), hdrModeStr);
   8165         if (value != NAME_NOT_FOUND) {
   8166             const char *str = get(KEY_SCENE_MODE);
   8167 
   8168             m_bHDRModeSensor = !strncmp(hdrModeStr, HDR_MODE_SENSOR, strlen(HDR_MODE_SENSOR));
   8169 
   8170             updateParamEntry(KEY_QC_HDR_MODE, hdrModeStr);
   8171 
   8172             // If hdr is already selected, need to deselect it in local cache
   8173             // So the new hdr mode will be applied
   8174             if (str && !strncmp(str, SCENE_MODE_HDR, strlen(SCENE_MODE_HDR))) {
   8175                 updateParamEntry(KEY_SCENE_MODE, SCENE_MODE_AUTO);
   8176                 m_bNeedRestart = true;
   8177             }
   8178 
   8179             return NO_ERROR;
   8180         }
   8181     }
   8182     CDBG_HIGH("Invalid hdr mode value: %s",
   8183             (hdrModeStr == NULL) ? "NULL" : hdrModeStr);
   8184     return BAD_VALUE;
   8185 }
   8186 
   8187 /*===========================================================================
   8188  * FUNCTION   : setSeeMore
   8189  *
   8190  * DESCRIPTION: set see more value
   8191  *
   8192  * PARAMETERS :
   8193  *   @seeMoreStr : see more value string
   8194  *
   8195  * RETURN     : int32_t type of status
   8196  *              NO_ERROR  -- success
   8197  *              none-zero failure code
   8198  *==========================================================================*/
   8199 int32_t QCameraParameters::setSeeMore(const char *seeMoreStr)
   8200 {
   8201     int32_t rc = NO_ERROR;
   8202 
   8203     CDBG_HIGH("%s: seeMoreStr =%s", __func__, seeMoreStr);
   8204     if (seeMoreStr != NULL) {
   8205         int value = lookupAttr(ON_OFF_MODES_MAP,
   8206                 PARAM_MAP_SIZE(ON_OFF_MODES_MAP),
   8207                 seeMoreStr);
   8208         if (value != NAME_NOT_FOUND) {
   8209             m_bSeeMoreOn = (value != 0);
   8210 
   8211             // If SeeMore is enabled, enable StillMore for live snapshot
   8212             // and disable tone map
   8213             if (m_bSeeMoreOn) {
   8214                 m_bStillMoreOn = TRUE;
   8215                 rc = setToneMapMode(false, false);
   8216                 if (rc != NO_ERROR) {
   8217                     CDBG_HIGH("%s: Failed to disable tone map during SeeMore", __func__);
   8218                 }
   8219             } else {
   8220                 m_bStillMoreOn = FALSE;
   8221                 rc = setToneMapMode(true, false);
   8222                 if (rc != NO_ERROR) {
   8223                     CDBG_HIGH("%s: Failed to enable tone map during SeeMore", __func__);
   8224                 }
   8225             }
   8226             updateParamEntry(KEY_QC_SEE_MORE, seeMoreStr);
   8227             return NO_ERROR;
   8228         }
   8229     }
   8230     ALOGE("Invalid see more value: %s",
   8231             (seeMoreStr == NULL) ? "NULL" : seeMoreStr);
   8232     return BAD_VALUE;
   8233 }
   8234 
   8235 /*===========================================================================
   8236  * FUNCTION   : setStillMore
   8237  *
   8238  * DESCRIPTION: set still more value
   8239  *
   8240  * PARAMETERS :
   8241  *   @seeMoreStr : still more value string
   8242  *
   8243  * RETURN     : int32_t type of status
   8244  *              NO_ERROR  -- success
   8245  *              none-zero failure code
   8246  *==========================================================================*/
   8247 int32_t QCameraParameters::setStillMore(const char *stillMoreStr)
   8248 {
   8249     CDBG_HIGH("%s: stillMoreStr =%s", __func__, stillMoreStr);
   8250     if (stillMoreStr != NULL) {
   8251         int value = lookupAttr(STILL_MORE_MODES_MAP, PARAM_MAP_SIZE(STILL_MORE_MODES_MAP),
   8252                 stillMoreStr);
   8253         if (value != NAME_NOT_FOUND) {
   8254             m_bStillMoreOn = (value != 0);
   8255             updateParamEntry(KEY_QC_STILL_MORE, stillMoreStr);
   8256 
   8257             return NO_ERROR;
   8258         }
   8259     }
   8260     ALOGE("Invalid still more value: %s",
   8261             (stillMoreStr == NULL) ? "NULL" : stillMoreStr);
   8262     return BAD_VALUE;
   8263 }
   8264 
   8265 /*===========================================================================
   8266  * FUNCTION   : setHDRNeed1x
   8267  *
   8268  * DESCRIPTION: set hdr need 1x value
   8269  *
   8270  * PARAMETERS :
   8271  *   @hdrModeStr : hdr need 1x value string
   8272  *
   8273  * RETURN     : int32_t type of status
   8274  *              NO_ERROR  -- success
   8275  *              none-zero failure code
   8276  *==========================================================================*/
   8277 int32_t QCameraParameters::setHDRNeed1x(const char *hdrNeed1xStr)
   8278 {
   8279     CDBG_HIGH("%s: hdrNeed1xStr =%s", __func__, hdrNeed1xStr);
   8280     if (hdrNeed1xStr != NULL) {
   8281         int value = lookupAttr(TRUE_FALSE_MODES_MAP, PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP),
   8282                 hdrNeed1xStr);
   8283         if (value != NAME_NOT_FOUND) {
   8284             updateParamEntry(KEY_QC_HDR_NEED_1X, hdrNeed1xStr);
   8285             m_bHDR1xFrameEnabled = !strncmp(hdrNeed1xStr, VALUE_TRUE, strlen(VALUE_TRUE));
   8286             m_bNeedRestart = true;
   8287 
   8288             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HDR_NEED_1X,
   8289                     m_bHDR1xFrameEnabled)) {
   8290                 return BAD_VALUE;
   8291             }
   8292             return NO_ERROR;
   8293         }
   8294     }
   8295 
   8296     CDBG_HIGH("Invalid hdr need 1x value: %s",
   8297             (hdrNeed1xStr == NULL) ? "NULL" : hdrNeed1xStr);
   8298     return BAD_VALUE;
   8299 }
   8300 
   8301 /*===========================================================================
   8302  * FUNCTION   : setAEBracketing
   8303  *
   8304  * DESCRIPTION: enables AE bracketing
   8305  *
   8306  * PARAMETERS :
   8307  *
   8308  * RETURN     : int32_t type of status
   8309  *              NO_ERROR  -- success
   8310  *              none-zero failure code
   8311  *==========================================================================*/
   8312 int32_t QCameraParameters::setAEBracketing()
   8313 {
   8314     int32_t rc = NO_ERROR;
   8315     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   8316         ALOGE("%s:Failed to initialize group update table", __func__);
   8317         return BAD_TYPE;
   8318     }
   8319 
   8320     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HDR, m_AEBracketingClient)) {
   8321         ALOGE("%s:Failed to update AE bracketing", __func__);
   8322         return BAD_VALUE;
   8323     }
   8324 
   8325     rc = commitSetBatch();
   8326     if (rc != NO_ERROR) {
   8327         ALOGE("%s:Failed to configure AE bracketing", __func__);
   8328         return rc;
   8329     }
   8330 
   8331     return rc;
   8332 }
   8333 
   8334 /*===========================================================================
   8335  * FUNCTION   : setHDRAEBracket
   8336  *
   8337  * DESCRIPTION: enables AE bracketing for HDR
   8338  *
   8339  * PARAMETERS :
   8340  *   @hdrBracket : HDR bracketing configuration
   8341  *
   8342  * RETURN     : int32_t type of status
   8343  *              NO_ERROR  -- success
   8344  *              none-zero failure code
   8345  *==========================================================================*/
   8346 int32_t QCameraParameters::setHDRAEBracket(cam_exp_bracketing_t hdrBracket)
   8347 {
   8348     int32_t rc = NO_ERROR;
   8349     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   8350         ALOGE("%s:Failed to initialize group update table", __func__);
   8351         return BAD_TYPE;
   8352     }
   8353 
   8354     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HDR, hdrBracket)) {
   8355         ALOGE("%s:Failed to update table", __func__);
   8356         return BAD_TYPE;
   8357     }
   8358 
   8359     rc = commitSetBatch();
   8360     if (rc != NO_ERROR) {
   8361         ALOGE("%s:Failed to configure HDR bracketing", __func__);
   8362         return rc;
   8363     }
   8364 
   8365     return rc;
   8366 }
   8367 
   8368 /*===========================================================================
   8369  * FUNCTION   : restoreAEBracket
   8370  *
   8371  * DESCRIPTION: restores client AE bracketing configuration after HDR is done
   8372  *
   8373  * PARAMETERS :
   8374  *
   8375  * RETURN     : int32_t type of status
   8376  *              NO_ERROR  -- success
   8377  *              none-zero failure code
   8378  *==========================================================================*/
   8379 int32_t QCameraParameters::stopAEBracket()
   8380 {
   8381   cam_exp_bracketing_t bracketing;
   8382 
   8383   bracketing.mode = CAM_EXP_BRACKETING_OFF;
   8384 
   8385   return setHDRAEBracket(bracketing);
   8386 }
   8387 
   8388 /*===========================================================================
   8389  * FUNCTION   : updateFlash
   8390  *
   8391  * DESCRIPTION: restores client flash configuration or disables flash
   8392  *
   8393  * PARAMETERS :
   8394  *   @commitSettings : flag indicating whether settings need to be commited
   8395  *
   8396  * RETURN     : int32_t type of status
   8397  *              NO_ERROR  -- success
   8398  *              none-zero failure code
   8399  *==========================================================================*/
   8400 int32_t QCameraParameters::updateFlash(bool commitSettings)
   8401 {
   8402     int32_t rc = NO_ERROR;
   8403     int32_t value;
   8404 
   8405     if (commitSettings) {
   8406       if(initBatchUpdate(m_pParamBuf) < 0 ) {
   8407           ALOGE("%s:Failed to initialize group update table", __func__);
   8408           return BAD_TYPE;
   8409       }
   8410     }
   8411 
   8412     if (isHDREnabled() || m_bAeBracketingEnabled || m_bAFBracketingOn ||
   8413           m_bOptiZoomOn || m_bReFocusOn) {
   8414         value = CAM_FLASH_MODE_OFF;
   8415     } else if (m_bChromaFlashOn) {
   8416         value = CAM_FLASH_MODE_ON;
   8417     } else {
   8418         value = mFlashValue;
   8419     }
   8420 
   8421     if (value != mFlashDaemonValue) {
   8422         CDBG("%s: Setting Flash value %d", __func__, value);
   8423         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_LED_MODE, value)) {
   8424             ALOGE("%s:Failed to set led mode", __func__);
   8425             return BAD_VALUE;
   8426         }
   8427         mFlashDaemonValue = value;
   8428     } else {
   8429         rc = NO_ERROR;
   8430     }
   8431 
   8432     if (commitSettings) {
   8433         rc = commitSetBatch();
   8434         if (rc != NO_ERROR) {
   8435             ALOGE("%s:Failed to configure HDR bracketing", __func__);
   8436             return rc;
   8437         }
   8438     }
   8439 
   8440     return rc;
   8441 }
   8442 
   8443 /*===========================================================================
   8444  * FUNCTION   : setRedeyeReduction
   8445  *
   8446  * DESCRIPTION: set red eye reduction value
   8447  *
   8448  * PARAMETERS :
   8449  *   @redeyeStr : red eye reduction value string
   8450  *
   8451  * RETURN     : int32_t type of status
   8452  *              NO_ERROR  -- success
   8453  *              none-zero failure code
   8454  *==========================================================================*/
   8455 int32_t QCameraParameters::setRedeyeReduction(const char *redeyeStr)
   8456 {
   8457     if (redeyeStr != NULL) {
   8458         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   8459                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), redeyeStr);
   8460         if (value != NAME_NOT_FOUND) {
   8461             CDBG("%s: Setting RedEye Reduce value %s", __func__, redeyeStr);
   8462             updateParamEntry(KEY_QC_REDEYE_REDUCTION, redeyeStr);
   8463             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   8464                     CAM_INTF_PARM_REDEYE_REDUCTION, value)) {
   8465                 return BAD_VALUE;
   8466             }
   8467             return NO_ERROR;
   8468         }
   8469     }
   8470     ALOGE("%s: Invalid RedEye Reduce value: %s",
   8471           __func__, (redeyeStr == NULL) ? "NULL" : redeyeStr);
   8472     return BAD_VALUE;
   8473 }
   8474 
   8475 /*===========================================================================
   8476  * FUNCTION   : getDenoiseProcessPlate
   8477  *
   8478  * DESCRIPTION: query denoise process plate
   8479  *
   8480  * PARAMETERS : None
   8481  *
   8482  * RETURN     : NR process plate vlaue
   8483  *==========================================================================*/
   8484 cam_denoise_process_type_t
   8485         QCameraParameters::getDenoiseProcessPlate(cam_intf_parm_type_t type)
   8486 {
   8487     char prop[PROPERTY_VALUE_MAX];
   8488     memset(prop, 0, sizeof(prop));
   8489     cam_denoise_process_type_t processPlate = CAM_WAVELET_DENOISE_CBCR_ONLY;
   8490     if (CAM_INTF_PARM_WAVELET_DENOISE == type) {
   8491         property_get("persist.denoise.process.plates", prop, "");
   8492     } else if (CAM_INTF_PARM_TEMPORAL_DENOISE == type) {
   8493         property_get("persist.tnr.process.plates", prop, "");
   8494     } else {
   8495         ALOGE("%s: Type not supported", __func__);
   8496         prop[0] = '\0';
   8497     }
   8498     if (strlen(prop) > 0) {
   8499         switch(atoi(prop)) {
   8500         case 0:
   8501             processPlate = CAM_WAVELET_DENOISE_YCBCR_PLANE;
   8502             break;
   8503         case 1:
   8504             processPlate = CAM_WAVELET_DENOISE_CBCR_ONLY;
   8505             break;
   8506         case 2:
   8507             processPlate = CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
   8508             break;
   8509         case 3:
   8510             processPlate = CAM_WAVELET_DENOISE_STREAMLINED_CBCR;
   8511             break;
   8512         default:
   8513             processPlate = CAM_WAVELET_DENOISE_CBCR_ONLY;
   8514             break;
   8515         }
   8516     }
   8517     return processPlate;
   8518 }
   8519 
   8520 /*===========================================================================
   8521  * FUNCTION   : setWaveletDenoise
   8522  *
   8523  * DESCRIPTION: set wavelet denoise value
   8524  *
   8525  * PARAMETERS :
   8526  *   @wnrStr : wavelet denoise value string
   8527  *
   8528  * RETURN     : int32_t type of status
   8529  *              NO_ERROR  -- success
   8530  *              none-zero failure code
   8531  *==========================================================================*/
   8532 int32_t QCameraParameters::setWaveletDenoise(const char *wnrStr)
   8533 {
   8534     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_DENOISE2D) == 0){
   8535         CDBG_HIGH("%s: WNR is not supported",__func__);
   8536         return NO_ERROR;
   8537     }
   8538 
   8539     if (wnrStr != NULL) {
   8540         int value = lookupAttr(DENOISE_ON_OFF_MODES_MAP,
   8541                 PARAM_MAP_SIZE(DENOISE_ON_OFF_MODES_MAP), wnrStr);
   8542         if (value != NAME_NOT_FOUND) {
   8543             updateParamEntry(KEY_QC_DENOISE, wnrStr);
   8544 
   8545             cam_denoise_param_t temp;
   8546             memset(&temp, 0, sizeof(temp));
   8547             temp.denoise_enable = (uint8_t)value;
   8548             m_bWNROn = (value != 0);
   8549             if (m_bWNROn) {
   8550                 temp.process_plates = getDenoiseProcessPlate(CAM_INTF_PARM_WAVELET_DENOISE);
   8551             }
   8552             CDBG("%s: Denoise enable=%d, plates=%d",
   8553                   __func__, temp.denoise_enable, temp.process_plates);
   8554             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_WAVELET_DENOISE, temp)) {
   8555                 return BAD_VALUE;
   8556             }
   8557             return NO_ERROR;
   8558         }
   8559     }
   8560     ALOGE("%s: Invalid Denoise value: %s", __func__, (wnrStr == NULL) ? "NULL" : wnrStr);
   8561     return BAD_VALUE;
   8562 }
   8563 
   8564 /*===========================================================================
   8565  * FUNCTION   : setRdiMode
   8566  *
   8567  * DESCRIPTION: set rdi mode value
   8568  *
   8569  * PARAMETERS :
   8570  *   @str     : rdi mode value string
   8571  *
   8572  * RETURN     : int32_t type of status
   8573  *              NO_ERROR  -- success
   8574  *              none-zero failure code
   8575  *==========================================================================*/
   8576 int32_t QCameraParameters::setRdiMode(const char *str)
   8577 {
   8578     CDBG("RDI_DEBUG %s: rdi mode value: %s", __func__, str);
   8579 
   8580     if (str != NULL) {
   8581         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   8582                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), str);
   8583         if (value != NAME_NOT_FOUND) {
   8584             updateParamEntry(KEY_QC_RDI_MODE, str);
   8585             m_bRdiMode = (value == 0) ? false : true;
   8586             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_RDI_MODE, value)) {
   8587                 return BAD_VALUE;
   8588             }
   8589             return NO_ERROR;
   8590         }
   8591     }
   8592     ALOGE("%s: Invalid rdi mode value: %s", __func__, (str == NULL) ? "NULL" : str);
   8593     return BAD_VALUE;
   8594 }
   8595 
   8596 
   8597 /*===========================================================================
   8598  * FUNCTION   : setSecureMode
   8599  *
   8600  * DESCRIPTION: set secure mode value
   8601  *
   8602  * PARAMETERS :
   8603  *   @str     : secure mode value string
   8604  *
   8605  * RETURN     : int32_t type of status
   8606  *              NO_ERROR  -- success
   8607  *              none-zero failure code
   8608  *==========================================================================*/
   8609 int32_t QCameraParameters::setSecureMode(const char *str)
   8610 {
   8611   ALOGD("%s: Secure mode value: %s", __func__, str);
   8612 
   8613   if (str != NULL) {
   8614     int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   8615             PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), str);
   8616     if (value != NAME_NOT_FOUND) {
   8617         updateParamEntry(KEY_QC_SECURE_MODE, str);
   8618         m_bSecureMode = (value == 0)? false : true;
   8619         return NO_ERROR;
   8620     }
   8621   }
   8622   ALOGE("%s: Invalid Secure mode value: %s",
   8623     __func__, (str == NULL) ? "NULL" : str);
   8624   return BAD_VALUE;
   8625 }
   8626 
   8627 /*===========================================================================
   8628  * FUNCTION   : setPreviewFrameRateMode
   8629  *
   8630  * DESCRIPTION: set preview frame rate mode
   8631  *
   8632  * PARAMETERS :
   8633  *   @mode    : preview frame rate mode
   8634  *
   8635  * RETURN     : none
   8636  *==========================================================================*/
   8637 void QCameraParameters::setPreviewFrameRateMode(const char *mode)
   8638 {
   8639     set(KEY_QC_PREVIEW_FRAME_RATE_MODE, mode);
   8640 }
   8641 
   8642 /*===========================================================================
   8643  * FUNCTION   : getPreviewFrameRateMode
   8644  *
   8645  * DESCRIPTION: get preview frame rate mode
   8646  *
   8647  * PARAMETERS : none
   8648  *
   8649  * RETURN     : preview frame rate mode string
   8650  *==========================================================================*/
   8651 const char *QCameraParameters::getPreviewFrameRateMode() const
   8652 {
   8653     return get(KEY_QC_PREVIEW_FRAME_RATE_MODE);
   8654 }
   8655 
   8656 /*===========================================================================
   8657  * FUNCTION   : setTouchIndexAec
   8658  *
   8659  * DESCRIPTION: set touch index AEC
   8660  *
   8661  * PARAMETERS :
   8662  *   @x,y     :
   8663  *
   8664  * RETURN     : none
   8665  *==========================================================================*/
   8666 void QCameraParameters::setTouchIndexAec(int x, int y)
   8667 {
   8668     char str[32];
   8669     snprintf(str, sizeof(str), "%dx%d", x, y);
   8670     set(KEY_QC_TOUCH_INDEX_AEC, str);
   8671 }
   8672 
   8673 /*===========================================================================
   8674  * FUNCTION   : getTouchIndexAec
   8675  *
   8676  * DESCRIPTION: get touch index AEC
   8677  *
   8678  * PARAMETERS :
   8679  *   @x,y     :
   8680  *
   8681  * RETURN     : none
   8682  *==========================================================================*/
   8683 void QCameraParameters::getTouchIndexAec(int *x, int *y)
   8684 {
   8685     *x = -1;
   8686     *y = -1;
   8687 
   8688     // Get the current string, if it doesn't exist, leave the -1x-1
   8689     const char *p = get(KEY_QC_TOUCH_INDEX_AEC);
   8690     if (p == 0)
   8691         return;
   8692 
   8693     int tempX, tempY;
   8694     if (parse_pair(p, &tempX, &tempY, 'x') == 0) {
   8695         *x = tempX;
   8696         *y = tempY;
   8697     }
   8698 }
   8699 
   8700 /*===========================================================================
   8701  * FUNCTION   : setTouchIndexAf
   8702  *
   8703  * DESCRIPTION: set touch index AF
   8704  *
   8705  * PARAMETERS :
   8706  *   @x,y     :
   8707  *
   8708  * RETURN     : none
   8709  *==========================================================================*/
   8710 void QCameraParameters::setTouchIndexAf(int x, int y)
   8711 {
   8712     char str[32];
   8713     snprintf(str, sizeof(str), "%dx%d", x, y);
   8714     set(KEY_QC_TOUCH_INDEX_AF, str);
   8715 }
   8716 
   8717 /*===========================================================================
   8718  * FUNCTION   : getTouchIndexAf
   8719  *
   8720  * DESCRIPTION: get touch index AF
   8721  *
   8722  * PARAMETERS :
   8723  *   @x,y     :
   8724  *
   8725  * RETURN     : none
   8726  *==========================================================================*/
   8727 void QCameraParameters::getTouchIndexAf(int *x, int *y)
   8728 {
   8729     *x = -1;
   8730     *y = -1;
   8731 
   8732     // Get the current string, if it doesn't exist, leave the -1x-1
   8733     const char *p = get(KEY_QC_TOUCH_INDEX_AF);
   8734     if (p == 0)
   8735         return;
   8736 
   8737     int tempX, tempY;
   8738     if (parse_pair(p, &tempX, &tempY, 'x') == 0) {
   8739         *x = tempX;
   8740         *y = tempY;
   8741     }
   8742 }
   8743 
   8744 /*===========================================================================
   8745  * FUNCTION   : getStreamFormat
   8746  *
   8747  * DESCRIPTION: get stream format by its type
   8748  *
   8749  * PARAMETERS :
   8750  *   @streamType : [input] stream type
   8751  *   @format     : [output] stream format
   8752  *
   8753  * RETURN     : int32_t type of status
   8754  *              NO_ERROR  -- success
   8755  *              none-zero failure code
   8756  *==========================================================================*/
   8757 int32_t QCameraParameters::getStreamRotation(cam_stream_type_t streamType,
   8758                                             cam_pp_feature_config_t &featureConfig,
   8759                                             cam_dimension_t &dim)
   8760 {
   8761     int32_t ret = NO_ERROR;
   8762     const char *str = get(KEY_QC_VIDEO_ROTATION);
   8763     int rotationParam = lookupAttr(VIDEO_ROTATION_MODES_MAP,
   8764             PARAM_MAP_SIZE(VIDEO_ROTATION_MODES_MAP), str);
   8765     featureConfig.rotation = ROTATE_0;
   8766     int swapDim = 0;
   8767     switch (streamType) {
   8768         case CAM_STREAM_TYPE_VIDEO:
   8769             switch(rotationParam) {
   8770                 case 90:
   8771                     featureConfig.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
   8772                     featureConfig.rotation = ROTATE_90;
   8773                     swapDim = 1;
   8774                     break;
   8775                 case 180:
   8776                     featureConfig.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
   8777                     featureConfig.rotation = ROTATE_180;
   8778                     break;
   8779                 case 270:
   8780                     featureConfig.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
   8781                     featureConfig.rotation = ROTATE_270;
   8782                     swapDim = 1;
   8783                     break;
   8784                 default:
   8785                     featureConfig.rotation = ROTATE_0;
   8786             }
   8787             break;
   8788         case CAM_STREAM_TYPE_PREVIEW:
   8789         case CAM_STREAM_TYPE_POSTVIEW:
   8790         case CAM_STREAM_TYPE_SNAPSHOT:
   8791         case CAM_STREAM_TYPE_RAW:
   8792         case CAM_STREAM_TYPE_METADATA:
   8793         case CAM_STREAM_TYPE_OFFLINE_PROC:
   8794         case CAM_STREAM_TYPE_DEFAULT:
   8795         default:
   8796             break;
   8797     }
   8798 
   8799     if (swapDim > 0) {
   8800         int w = 0;
   8801         w = dim.width;
   8802         dim.width = dim.height;
   8803         dim.height = w;
   8804     }
   8805     return ret;
   8806 }
   8807 
   8808 /*===========================================================================
   8809  * FUNCTION   : getStreamFormat
   8810  *
   8811  * DESCRIPTION: get stream format by its type
   8812  *
   8813  * PARAMETERS :
   8814  *   @streamType : [input] stream type
   8815  *   @format     : [output] stream format
   8816  *
   8817  * RETURN     : int32_t type of status
   8818  *              NO_ERROR  -- success
   8819  *              none-zero failure code
   8820  *==========================================================================*/
   8821 int32_t QCameraParameters::getStreamFormat(cam_stream_type_t streamType,
   8822                                             cam_format_t &format)
   8823 {
   8824     int32_t ret = NO_ERROR;
   8825 
   8826     format = CAM_FORMAT_MAX;
   8827     switch (streamType) {
   8828     case CAM_STREAM_TYPE_PREVIEW:
   8829     case CAM_STREAM_TYPE_POSTVIEW:
   8830     case CAM_STREAM_TYPE_CALLBACK:
   8831         format = mPreviewFormat;
   8832         break;
   8833     case CAM_STREAM_TYPE_ANALYSIS:
   8834         if (m_pCapability->analysis_recommended_format ==
   8835                 CAM_FORMAT_Y_ONLY) {
   8836             format = m_pCapability->analysis_recommended_format;
   8837         } else {
   8838             ALOGE("%s:%d invalid analysis_recommended_format %d\n",
   8839                     __func__, __LINE__,
   8840                     m_pCapability->analysis_recommended_format);
   8841             format = mPreviewFormat;
   8842         }
   8843       break;
   8844     case CAM_STREAM_TYPE_SNAPSHOT:
   8845         if ( mPictureFormat == CAM_FORMAT_YUV_422_NV16 ) {
   8846             format = CAM_FORMAT_YUV_422_NV16;
   8847         } else {
   8848             char prop[PROPERTY_VALUE_MAX];
   8849             int snapshotFormat;
   8850             memset(prop, 0, sizeof(prop));
   8851             property_get("persist.camera.snap.format", prop, "0");
   8852             snapshotFormat = atoi(prop);
   8853             if(snapshotFormat == 1) {
   8854                 format = CAM_FORMAT_YUV_422_NV61;
   8855             } else {
   8856                 format = CAM_FORMAT_YUV_420_NV21;
   8857             }
   8858         }
   8859         break;
   8860     case CAM_STREAM_TYPE_VIDEO:
   8861         format = CAM_FORMAT_YUV_420_NV12;
   8862         break;
   8863     case CAM_STREAM_TYPE_RAW:
   8864         if (isRdiMode()) {
   8865             format = m_pCapability->rdi_mode_stream_fmt;
   8866         } else if (mPictureFormat >= CAM_FORMAT_YUV_RAW_8BIT_YUYV) {
   8867             format = (cam_format_t)mPictureFormat;
   8868         } else if (getofflineRAW()) {
   8869             format = CAM_FORMAT_BAYER_MIPI_RAW_10BPP_BGGR;
   8870         } else {
   8871             char raw_format[PROPERTY_VALUE_MAX];
   8872             int rawFormat;
   8873             memset(raw_format, 0, sizeof(raw_format));
   8874             /*Default value is CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GBRG*/
   8875             property_get("persist.camera.raw.format", raw_format, "16");
   8876             rawFormat = atoi(raw_format);
   8877             format = (cam_format_t)rawFormat;
   8878             CDBG_HIGH("%s: Raw stream format %d bundled with snapshot",
   8879                    __func__, format);
   8880         }
   8881         break;
   8882     case CAM_STREAM_TYPE_METADATA:
   8883     case CAM_STREAM_TYPE_OFFLINE_PROC:
   8884     case CAM_STREAM_TYPE_DEFAULT:
   8885     default:
   8886         break;
   8887     }
   8888 
   8889     return ret;
   8890 }
   8891 
   8892 /*===========================================================================
   8893  * FUNCTION   : getFlipMode
   8894  *
   8895  * DESCRIPTION: get flip mode
   8896  *
   8897  * PARAMETERS :
   8898  *   @cam_intf_parm_type_t : [input] stream type
   8899  *
   8900  * RETURN     : int type of flip mode
   8901  *              0 - no filp
   8902  *              1 - FLIP_H
   8903  *              2 - FLIP_V
   8904  *              3 - FLIP_H | FLIP_V
   8905  *==========================================================================*/
   8906 int QCameraParameters::getFlipMode(cam_stream_type_t type)
   8907 {
   8908     const char *str = NULL;
   8909     int flipMode = 0; // no flip
   8910 
   8911     switch(type){
   8912     case CAM_STREAM_TYPE_PREVIEW:
   8913         if (!isRdiMode()) {
   8914             str = get(KEY_QC_PREVIEW_FLIP);
   8915         }
   8916         break;
   8917     case CAM_STREAM_TYPE_VIDEO:
   8918         str = get(KEY_QC_VIDEO_FLIP);
   8919         break;
   8920     case CAM_STREAM_TYPE_SNAPSHOT:
   8921     case CAM_STREAM_TYPE_POSTVIEW:
   8922         str = get(KEY_QC_SNAPSHOT_PICTURE_FLIP);
   8923         break;
   8924     default:
   8925         CDBG("%s: No flip mode for stream type %d", __func__, type);
   8926         break;
   8927     }
   8928 
   8929     if(str != NULL){
   8930         //Need give corresponding filp value based on flip mode strings
   8931         int value = lookupAttr(FLIP_MODES_MAP, PARAM_MAP_SIZE(FLIP_MODES_MAP), str);
   8932         if(value != NAME_NOT_FOUND)
   8933             flipMode = value;
   8934         }
   8935 
   8936     CDBG_HIGH("%s: the filp mode of stream type %d is %d .", __func__, type, flipMode);
   8937     return flipMode;
   8938 }
   8939 
   8940 /*===========================================================================
   8941  * FUNCTION   : isSnapshotFDNeeded
   8942  *
   8943  * DESCRIPTION: check whether Face Detection Metadata is needed
   8944  *
   8945  * PARAMETERS : none
   8946  *
   8947  * RETURN     : bool type of status
   8948  *              0 - need
   8949  *              1 - not need
   8950  *==========================================================================*/
   8951 bool QCameraParameters::isSnapshotFDNeeded()
   8952 {
   8953     return getInt(KEY_QC_SNAPSHOT_FD_DATA);
   8954 }
   8955 
   8956 /*===========================================================================
   8957  * FUNCTION   : getStreamDimension
   8958  *
   8959  * DESCRIPTION: get stream dimension by its type
   8960  *
   8961  * PARAMETERS :
   8962  *   @streamType : [input] stream type
   8963  *   @dim        : [output] stream dimension
   8964  *
   8965  * RETURN     : int32_t type of status
   8966  *              NO_ERROR  -- success
   8967  *              none-zero failure code
   8968  *==========================================================================*/
   8969 int32_t QCameraParameters::getStreamDimension(cam_stream_type_t streamType,
   8970                                                cam_dimension_t &dim)
   8971 {
   8972     int32_t ret = NO_ERROR;
   8973     memset(&dim, 0, sizeof(cam_dimension_t));
   8974 
   8975     switch (streamType) {
   8976     case CAM_STREAM_TYPE_PREVIEW:
   8977         getPreviewSize(&dim.width, &dim.height);
   8978         break;
   8979     case CAM_STREAM_TYPE_POSTVIEW:
   8980         getPreviewSize(&dim.width, &dim.height);
   8981         break;
   8982     case CAM_STREAM_TYPE_SNAPSHOT:
   8983         if (getRecordingHintValue() == true) {
   8984             // live snapshot
   8985             getLiveSnapshotSize(dim);
   8986         } else {
   8987             getPictureSize(&dim.width, &dim.height);
   8988         }
   8989         break;
   8990     case CAM_STREAM_TYPE_VIDEO:
   8991         getVideoSize(&dim.width, &dim.height);
   8992         break;
   8993     case CAM_STREAM_TYPE_RAW:
   8994         //dim = m_pCapability->raw_dim;
   8995         getRawSize(dim);
   8996         break;
   8997     case CAM_STREAM_TYPE_METADATA:
   8998         dim.width = (int32_t)sizeof(metadata_buffer_t);
   8999         dim.height = 1;
   9000         break;
   9001     case CAM_STREAM_TYPE_OFFLINE_PROC:
   9002         break;
   9003     case CAM_STREAM_TYPE_ANALYSIS:
   9004         cam_dimension_t prv_dim, max_dim;
   9005 
   9006         /* Analysis stream need aspect ratio as preview stream */
   9007         getPreviewSize(&prv_dim.width, &prv_dim.height);
   9008 
   9009         max_dim.width = m_pCapability->analysis_max_res.width;
   9010         max_dim.height = m_pCapability->analysis_max_res.height;
   9011 
   9012         if (prv_dim.width > max_dim.width || prv_dim.height > max_dim.height) {
   9013             double max_ratio, requested_ratio;
   9014 
   9015             max_ratio = (double)max_dim.width / (double)max_dim.height;
   9016             requested_ratio = (double)prv_dim.width / (double)prv_dim.height;
   9017 
   9018             if (max_ratio < requested_ratio) {
   9019                 dim.width = max_dim.width;
   9020                 dim.height = (int32_t)((double)dim.width / requested_ratio);
   9021             } else {
   9022                 dim.height = max_dim.height;
   9023                 dim.width = (int32_t)((double)max_dim.height * requested_ratio);
   9024             }
   9025             dim.width &= ~0x1;
   9026             dim.height &= ~0x1;
   9027         } else {
   9028             dim.width = prv_dim.width;
   9029             dim.height = prv_dim.height;
   9030         }
   9031       break;
   9032     case CAM_STREAM_TYPE_DEFAULT:
   9033     default:
   9034         ALOGE("%s: no dimension for unsupported stream type %d",
   9035               __func__, streamType);
   9036         ret = BAD_VALUE;
   9037         break;
   9038     }
   9039     return ret;
   9040 }
   9041 
   9042 /*===========================================================================
   9043  * FUNCTION   : getPreviewHalPixelFormat
   9044  *
   9045  * DESCRIPTION: get preview HAL pixel format
   9046  *
   9047  * PARAMETERS : none
   9048  *
   9049  * RETURN     : HAL pixel format
   9050  *==========================================================================*/
   9051 int QCameraParameters::getPreviewHalPixelFormat() const
   9052 {
   9053     int32_t halPixelFormat;
   9054 
   9055     switch (mPreviewFormat) {
   9056     case CAM_FORMAT_YUV_420_NV12:
   9057         halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
   9058         break;
   9059     case CAM_FORMAT_YUV_420_NV21:
   9060         halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
   9061         break;
   9062     case CAM_FORMAT_YUV_420_NV21_ADRENO:
   9063         halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
   9064         break;
   9065     case CAM_FORMAT_YUV_420_YV12:
   9066         halPixelFormat = HAL_PIXEL_FORMAT_YV12;
   9067         break;
   9068     case CAM_FORMAT_YUV_420_NV12_VENUS:
   9069         halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS;
   9070         break;
   9071     case CAM_FORMAT_YUV_422_NV16:
   9072     case CAM_FORMAT_YUV_422_NV61:
   9073     default:
   9074         halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
   9075         break;
   9076     }
   9077     CDBG_HIGH("%s: format %d\n", __func__, halPixelFormat);
   9078     return halPixelFormat;
   9079 }
   9080 
   9081 /*===========================================================================
   9082  * FUNCTION   : getthumbnailSize
   9083  *
   9084  * DESCRIPTION: get thumbnail size
   9085  *
   9086  * PARAMETERS :
   9087  *   @width, height : [output] thumbnail width and height
   9088  *
   9089  * RETURN     : none
   9090  *==========================================================================*/
   9091 void QCameraParameters::getThumbnailSize(int *width, int *height) const
   9092 {
   9093     *width = getInt(KEY_JPEG_THUMBNAIL_WIDTH);
   9094     *height = getInt(KEY_JPEG_THUMBNAIL_HEIGHT);
   9095 }
   9096 
   9097 /*===========================================================================
   9098  * FUNCTION   : getZSLBurstInterval
   9099  *
   9100  * DESCRIPTION: get ZSL burst interval setting
   9101  *
   9102  * PARAMETERS : none
   9103  *
   9104  * RETURN     : ZSL burst interval value
   9105  *==========================================================================*/
   9106 uint8_t QCameraParameters::getZSLBurstInterval()
   9107 {
   9108     int interval = getInt(KEY_QC_ZSL_BURST_INTERVAL);
   9109     if (interval < 0) {
   9110         interval = 1;
   9111     }
   9112     return (uint8_t)interval;
   9113 }
   9114 
   9115 /*===========================================================================
   9116  * FUNCTION   : getZSLQueueDepth
   9117  *
   9118  * DESCRIPTION: get ZSL queue depth
   9119  *
   9120  * PARAMETERS : none
   9121  *
   9122  * RETURN     : ZSL queue depth value
   9123  *==========================================================================*/
   9124 uint8_t QCameraParameters::getZSLQueueDepth()
   9125 {
   9126     int qdepth = getInt(KEY_QC_ZSL_QUEUE_DEPTH);
   9127     if (qdepth < 0) {
   9128         qdepth = 2;
   9129     }
   9130     return (uint8_t)qdepth;
   9131 }
   9132 
   9133 /*===========================================================================
   9134  * FUNCTION   : getZSLBackLookCount
   9135  *
   9136  * DESCRIPTION: get ZSL backlook count setting
   9137  *
   9138  * PARAMETERS : none
   9139  *
   9140  * RETURN     : ZSL backlook count value
   9141  *==========================================================================*/
   9142 uint8_t QCameraParameters::getZSLBackLookCount()
   9143 {
   9144     int look_back = getInt(KEY_QC_ZSL_BURST_LOOKBACK);
   9145     if (look_back < 0) {
   9146         look_back = 2;
   9147     }
   9148     return (uint8_t)look_back;
   9149 }
   9150 
   9151 /*===========================================================================
   9152  * FUNCTION   : getZSLMaxUnmatchedFrames
   9153  *
   9154  * DESCRIPTION: get allowed ZSL max unmatched frames number
   9155  *
   9156  * PARAMETERS : none
   9157  *
   9158  * RETURN     : ZSL backlook count value
   9159  *==========================================================================*/
   9160 uint8_t QCameraParameters::getMaxUnmatchedFramesInQueue()
   9161 {
   9162     return (uint8_t)(m_pCapability->min_num_pp_bufs + (m_nBurstNum / 10));
   9163 }
   9164 
   9165 /*===========================================================================
   9166  * FUNCTION   : setRecordingHintValue
   9167  *
   9168  * DESCRIPTION: set recording hint
   9169  *
   9170  * PARAMETERS :
   9171  *   @value   : video hint value
   9172  *
   9173  * RETURN     : int32_t type of status
   9174  *              NO_ERROR  -- success
   9175  *              none-zero failure code
   9176  *==========================================================================*/
   9177 int QCameraParameters::setRecordingHintValue(int32_t value)
   9178 {
   9179     CDBG_HIGH("%s: VideoHint = %d", __func__, value);
   9180     bool newValue = (value > 0)? true : false;
   9181 
   9182     if ( m_bRecordingHint != newValue ) {
   9183         m_bNeedRestart = true;
   9184         m_bRecordingHint_new = newValue;
   9185     } else {
   9186         m_bRecordingHint_new = m_bRecordingHint;
   9187     }
   9188     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_RECORDING_HINT, value)) {
   9189         return BAD_VALUE;
   9190     }
   9191 
   9192     return NO_ERROR;
   9193 }
   9194 
   9195 /*===========================================================================
   9196  * FUNCTION   : getNumOfSnapshots
   9197  *
   9198  * DESCRIPTION: get number of snapshot per shutter
   9199  *
   9200  * PARAMETERS : none
   9201  *
   9202  * RETURN     : number of snapshot per shutter
   9203  *==========================================================================*/
   9204 uint8_t QCameraParameters::getNumOfSnapshots()
   9205 {
   9206     uint8_t numOfSnapshot = 1;
   9207     int val = getInt(KEY_QC_NUM_SNAPSHOT_PER_SHUTTER);
   9208     if (0 < val) {
   9209         numOfSnapshot = (uint8_t)val;
   9210     }
   9211 
   9212     return (uint8_t)numOfSnapshot;
   9213 }
   9214 
   9215 /*===========================================================================
   9216  * FUNCTION   : getBurstCountForAdvancedCapture
   9217  *
   9218  * DESCRIPTION: get burst count for advanced capture.
   9219  *
   9220  * PARAMETERS : none
   9221  *
   9222  * RETURN     : number of snapshot required for advanced capture.
   9223  *==========================================================================*/
   9224 uint8_t QCameraParameters::getBurstCountForAdvancedCapture()
   9225 {
   9226     uint32_t burstCount = 0;
   9227     if (isUbiFocusEnabled()) {
   9228         //number of snapshots required for Ubi Focus.
   9229         burstCount = m_pCapability->ubifocus_af_bracketing_need.burst_count;
   9230     } else if (isUbiRefocus()) {
   9231         //number of snapshots required for Opti Zoom.
   9232         burstCount = m_pCapability->refocus_af_bracketing_need.burst_count;
   9233     } else if (isOptiZoomEnabled()) {
   9234         //number of snapshots required for Opti Zoom.
   9235         burstCount = m_pCapability->opti_zoom_settings_need.burst_count;
   9236     } else if (isChromaFlashEnabled()) {
   9237         //number of snapshots required for Chroma Flash.
   9238         burstCount = m_pCapability->chroma_flash_settings_need.burst_count;
   9239     } else if (isStillMoreEnabled()) {
   9240         //number of snapshots required for Still More.
   9241         if (isSeeMoreEnabled()) {
   9242             burstCount = 1;
   9243         } else if ((m_stillmore_config.burst_count >=
   9244                 m_pCapability->stillmore_settings_need.min_burst_count) &&
   9245                 (m_stillmore_config.burst_count <=
   9246                 m_pCapability->stillmore_settings_need.max_burst_count)) {
   9247             burstCount = m_stillmore_config.burst_count;
   9248         } else {
   9249             burstCount = m_pCapability->stillmore_settings_need.burst_count;
   9250         }
   9251     } else if (isHDREnabled()) {
   9252         //number of snapshots required for HDR.
   9253         burstCount = m_pCapability->hdr_bracketing_setting.num_frames;
   9254     } else if (isAEBracketEnabled()) {
   9255       burstCount = 0;
   9256       const char *str_val = m_AEBracketingClient.values;
   9257       if ((str_val != NULL) && (strlen(str_val) > 0)) {
   9258           char prop[PROPERTY_VALUE_MAX];
   9259           memset(prop, 0, sizeof(prop));
   9260           strlcpy(prop, str_val, PROPERTY_VALUE_MAX);
   9261           char *saveptr = NULL;
   9262           char *token = strtok_r(prop, ",", &saveptr);
   9263           while (token != NULL) {
   9264               token = strtok_r(NULL, ",", &saveptr);
   9265               burstCount++;
   9266           }
   9267       }
   9268     }
   9269     if (burstCount <= 0) {
   9270         burstCount = 1;
   9271     }
   9272 
   9273     CDBG_HIGH("%s: Snapshot burst count = %d", __func__, burstCount);
   9274     return (uint8_t)burstCount;
   9275 }
   9276 
   9277 /*===========================================================================
   9278  * FUNCTION   : getNumOfRetroSnapshots
   9279  *
   9280  * DESCRIPTION: get number of retro active snapshots per shutter
   9281  *
   9282  * PARAMETERS : none
   9283  *
   9284  * RETURN     : number of retro active snapshots per shutter
   9285  *==========================================================================*/
   9286 uint8_t QCameraParameters::getNumOfRetroSnapshots()
   9287 {
   9288     int numOfRetroSnapshots = getInt(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER);
   9289     if (numOfRetroSnapshots < 0) {
   9290         numOfRetroSnapshots = 0;
   9291     }
   9292     CDBG_HIGH("%s: [ZSL Retro] : numOfRetroSnaps - %d", __func__, numOfRetroSnapshots);
   9293     return (uint8_t)numOfRetroSnapshots;
   9294 }
   9295 
   9296 /*===========================================================================
   9297  * FUNCTION   : getBurstLEDOnPeriod
   9298  *
   9299  * DESCRIPTION: get burst LED on period
   9300  *
   9301  * PARAMETERS : none
   9302  *
   9303  * RETURN     : burst LED on period
   9304  *==========================================================================*/
   9305 int QCameraParameters::getBurstLEDOnPeriod()
   9306 {
   9307   CDBG_HIGH("%s: [ZSL Retro] burst LED ON period: %d", __func__, m_nBurstLEDOnPeriod);
   9308   return m_nBurstLEDOnPeriod;
   9309 }
   9310 
   9311 /*===========================================================================
   9312  * FUNCTION   : getNumOfExtraHDRInBufsIfNeeded
   9313  *
   9314  * DESCRIPTION: get number of extra input buffers needed by HDR
   9315  *
   9316  * PARAMETERS : none
   9317  *
   9318  * RETURN     : number of extra buffers needed by HDR; 0 if not HDR enabled
   9319  *==========================================================================*/
   9320 uint8_t QCameraParameters::getNumOfExtraHDRInBufsIfNeeded()
   9321 {
   9322     unsigned int numOfBufs = 0;
   9323 
   9324     if (isHDREnabled()) {
   9325         numOfBufs += m_pCapability->hdr_bracketing_setting.num_frames;
   9326         if (isHDR1xFrameEnabled() && isHDR1xExtraBufferNeeded()) {
   9327             numOfBufs++;
   9328         }
   9329         numOfBufs--; // Only additional buffers need to be returned
   9330     }
   9331 
   9332     return (uint8_t)(numOfBufs * getBurstNum());
   9333 }
   9334 
   9335 /*===========================================================================
   9336  * FUNCTION   : getNumOfExtraHDROutBufsIfNeeded
   9337  *
   9338  * DESCRIPTION: get number of extra output buffers needed by HDR
   9339  *
   9340  * PARAMETERS : none
   9341  *
   9342  * RETURN     : number of extra buffers needed by HDR; 0 if not HDR enabled
   9343  *==========================================================================*/
   9344 uint8_t QCameraParameters::getNumOfExtraHDROutBufsIfNeeded()
   9345 {
   9346     int numOfBufs = 0;
   9347 
   9348     if (isHDREnabled() && isHDR1xFrameEnabled()) {
   9349         numOfBufs++;
   9350     }
   9351 
   9352     return (uint8_t)(numOfBufs * getBurstNum());
   9353 }
   9354 
   9355 /*===========================================================================
   9356  * FUNCTION   : getBurstNum
   9357  *
   9358  * DESCRIPTION: get burst number of snapshot
   9359  *
   9360  * PARAMETERS : none
   9361  *
   9362  * RETURN     : number of burst
   9363  *==========================================================================*/
   9364 uint8_t QCameraParameters::getBurstNum()
   9365 {
   9366     CDBG_HIGH("%s: m_nBurstNum = %d", __func__, m_nBurstNum);
   9367     return m_nBurstNum;
   9368 }
   9369 
   9370 /*===========================================================================
   9371  * FUNCTION   : getJpegQuality
   9372  *
   9373  * DESCRIPTION: get jpeg encoding quality
   9374  *
   9375  * PARAMETERS : none
   9376  *
   9377  * RETURN     : jpeg encoding quality
   9378  *==========================================================================*/
   9379 uint32_t QCameraParameters::getJpegQuality()
   9380 {
   9381     int quality = getInt(KEY_JPEG_QUALITY);
   9382     if (quality < 0) {
   9383         quality = 85; // set to default quality value
   9384     }
   9385     return (uint32_t)quality;
   9386 }
   9387 
   9388 /*===========================================================================
   9389  * FUNCTION   : getRotation
   9390  *
   9391  * DESCRIPTION: get application configured rotation
   9392  *
   9393  * PARAMETERS : none
   9394  *
   9395  * RETURN     : rotation value
   9396  *==========================================================================*/
   9397 uint32_t QCameraParameters::getRotation() {
   9398     int rotation = 0;
   9399 
   9400     //If exif rotation is set, do not rotate captured image
   9401     if (!useJpegExifRotation()) {
   9402         rotation = mRotation;
   9403         if (rotation < 0) {
   9404             rotation = 0;
   9405         }
   9406     }
   9407     return (uint32_t)rotation;
   9408 }
   9409 
   9410 /*===========================================================================
   9411  * FUNCTION   : setJpegRotation
   9412  *
   9413  * DESCRIPTION: set jpeg rotation value configured internally
   9414  *
   9415  * PARAMETERS : none
   9416  *
   9417  * RETURN     : jpeg rotation value
   9418  *==========================================================================*/
   9419 void QCameraParameters::setJpegRotation(int rotation) {
   9420     if (rotation == 0 || rotation == 90 ||
   9421             rotation == 180 || rotation == 270) {
   9422         mJpegRotation = (uint32_t)rotation;
   9423     }
   9424 }
   9425 
   9426 /*===========================================================================
   9427  * FUNCTION   : getDeviceRotation
   9428  *
   9429  * DESCRIPTION: get device rotation value
   9430  *
   9431  * PARAMETERS : none
   9432  *
   9433  * RETURN     : device rotation value
   9434  *==========================================================================*/
   9435 uint32_t QCameraParameters::getDeviceRotation() {
   9436     int rotation = 0;
   9437 
   9438     rotation = mRotation;
   9439     if (rotation < 0) {
   9440         rotation = 0;
   9441     }
   9442 
   9443     return (uint32_t)rotation;
   9444 }
   9445 
   9446 /*===========================================================================
   9447  * FUNCTION   : getJpegExifRotation
   9448  *
   9449  * DESCRIPTION: get exif rotation value
   9450  *
   9451  * PARAMETERS : none
   9452  *
   9453  * RETURN     : rotation value
   9454  *==========================================================================*/
   9455 uint32_t QCameraParameters::getJpegExifRotation() {
   9456     int rotation = 0;
   9457 
   9458     if (useJpegExifRotation()) {
   9459         rotation = mRotation;
   9460         if (rotation < 0) {
   9461             rotation = 0;
   9462         }
   9463     }
   9464     return (uint32_t)rotation;
   9465 }
   9466 
   9467 /*===========================================================================
   9468  * FUNCTION   : useJpegExifRotation
   9469  *
   9470  * DESCRIPTION: Check if jpeg exif rotation need to be used
   9471  *
   9472  * PARAMETERS : none
   9473  *
   9474  * RETURN     : true if jpeg exif rotation need to be used
   9475  *==========================================================================*/
   9476 bool QCameraParameters::useJpegExifRotation() {
   9477     char exifRotation[PROPERTY_VALUE_MAX];
   9478 
   9479     property_get("persist.camera.exif.rotation", exifRotation, "off");
   9480     if (!strcmp(exifRotation, "on")) {
   9481         return true;
   9482     }
   9483     return false;
   9484 }
   9485 
   9486 /*===========================================================================
   9487  * FUNCTION   : getEffectValue
   9488  *
   9489  * DESCRIPTION: get effect value
   9490  *
   9491  * PARAMETERS : none
   9492  *
   9493  * RETURN     : effect value
   9494  *==========================================================================*/
   9495 int32_t QCameraParameters::getEffectValue()
   9496 {
   9497     uint32_t cnt = 0;
   9498     const char *effect = get(KEY_EFFECT);
   9499     if (effect) {
   9500         while (NULL != EFFECT_MODES_MAP[cnt].desc) {
   9501             if (!strcmp(EFFECT_MODES_MAP[cnt].desc, effect)) {
   9502                 return EFFECT_MODES_MAP[cnt].val;
   9503             }
   9504             cnt++;
   9505         }
   9506     } else {
   9507         ALOGE("%s: Missing effect value", __func__);
   9508     }
   9509     return CAM_EFFECT_MODE_OFF;
   9510 }
   9511 
   9512 /*===========================================================================
   9513  * FUNCTION   : parseGPSCoordinate
   9514  *
   9515  * DESCRIPTION: parse GPS coordinate string
   9516  *
   9517  * PARAMETERS :
   9518  *   @coord_str : [input] coordinate string
   9519  *   @coord     : [output]  ptr to struct to store coordinate
   9520  *
   9521  * RETURN     : int32_t type of status
   9522  *              NO_ERROR  -- success
   9523  *              none-zero failure code
   9524  *==========================================================================*/
   9525 int QCameraParameters::parseGPSCoordinate(const char *coord_str, rat_t* coord)
   9526 {
   9527     if(coord == NULL) {
   9528         ALOGE("%s: error, invalid argument coord == NULL", __func__);
   9529         return BAD_VALUE;
   9530     }
   9531     double degF = atof(coord_str);
   9532     if (degF < 0) {
   9533         degF = -degF;
   9534     }
   9535     double minF = (degF - (double)(int) degF) * 60.0;
   9536     double secF = (minF - (double)(int) minF) * 60.0;
   9537 
   9538     getRational(&coord[0], (int)degF, 1);
   9539     getRational(&coord[1], (int)minF, 1);
   9540     getRational(&coord[2], (int)(secF * 10000.0), 10000);
   9541     return NO_ERROR;
   9542 }
   9543 
   9544 /*===========================================================================
   9545  * FUNCTION   : getExifDateTime
   9546  *
   9547  * DESCRIPTION: query exif date time
   9548  *
   9549  * PARAMETERS :
   9550  *   @dateTime    : String to store exif date time.
   9551  *                  Should be leaved unchanged in case of error.
   9552  *   @subsecTime  : String to store exif time nanoseconds.
   9553  *                  Should be leaved unchanged in case of error.
   9554  *
   9555  * RETURN     : int32_t type of status
   9556  *              NO_ERROR  -- success
   9557  *              none-zero failure code
   9558  *==========================================================================*/
   9559 int32_t QCameraParameters::getExifDateTime(String8 &dateTime, String8 &subsecTime)
   9560 {
   9561     int32_t ret = NO_ERROR;
   9562 
   9563     //get time and date from system
   9564     struct timeval tv;
   9565     struct tm timeinfo_data;
   9566 
   9567     int res = gettimeofday(&tv, NULL);
   9568     if (0 == res) {
   9569         struct tm *timeinfo = localtime_r(&tv.tv_sec, &timeinfo_data);
   9570         if (NULL != timeinfo) {
   9571             //Write datetime according to EXIF Spec
   9572             //"YYYY:MM:DD HH:MM:SS" (20 chars including \0)
   9573             dateTime = String8::format("%04d:%02d:%02d %02d:%02d:%02d",
   9574                     timeinfo->tm_year + 1900, timeinfo->tm_mon + 1,
   9575                     timeinfo->tm_mday, timeinfo->tm_hour,
   9576                     timeinfo->tm_min, timeinfo->tm_sec);
   9577             //Write subsec according to EXIF Sepc
   9578             subsecTime = String8::format("%06ld", tv.tv_usec);
   9579         } else {
   9580             ALOGE("%s: localtime_r() error", __func__);
   9581             ret = UNKNOWN_ERROR;
   9582         }
   9583     } else if (-1 == res) {
   9584         ALOGE("%s: gettimeofday() error: %s", __func__, strerror(errno));
   9585         ret = UNKNOWN_ERROR;
   9586     } else {
   9587         ALOGE("%s: gettimeofday() unexpected return code: %d", __func__, res);
   9588         ret = UNKNOWN_ERROR;
   9589     }
   9590 
   9591     return ret;
   9592 }
   9593 
   9594 /*===========================================================================
   9595  * FUNCTION   : getRational
   9596  *
   9597  * DESCRIPTION: compose rational struct
   9598  *
   9599  * PARAMETERS :
   9600  *   @rat     : ptr to struct to store rational info
   9601  *   @num     :num of the rational
   9602  *   @denom   : denom of the rational
   9603  *
   9604  * RETURN     : int32_t type of status
   9605  *              NO_ERROR  -- success
   9606  *              none-zero failure code
   9607  *==========================================================================*/
   9608 int32_t QCameraParameters::getRational(rat_t *rat, int num, int denom)
   9609 {
   9610     if ((0 > num) || (0 > denom)) {
   9611         ALOGE("%s: Negative values", __func__);
   9612         return BAD_VALUE;
   9613     }
   9614     if (NULL == rat) {
   9615         ALOGE("%s: NULL rat input", __func__);
   9616         return BAD_VALUE;
   9617     }
   9618     rat->num = (uint32_t)num;
   9619     rat->denom = (uint32_t)denom;
   9620     return NO_ERROR;
   9621 }
   9622 
   9623 /*===========================================================================
   9624  * FUNCTION   : getExifFocalLength
   9625  *
   9626  * DESCRIPTION: get exif focal lenght
   9627  *
   9628  * PARAMETERS :
   9629  *   @focalLength : ptr to rational strcut to store focal lenght
   9630  *
   9631  * RETURN     : int32_t type of status
   9632  *              NO_ERROR  -- success
   9633  *              none-zero failure code
   9634  *==========================================================================*/
   9635 int32_t QCameraParameters::getExifFocalLength(rat_t *focalLength)
   9636 {
   9637     int focalLengthValue =
   9638         (int)(getFloat(QCameraParameters::KEY_FOCAL_LENGTH) * FOCAL_LENGTH_DECIMAL_PRECISION);
   9639     return getRational(focalLength, focalLengthValue, FOCAL_LENGTH_DECIMAL_PRECISION);
   9640 }
   9641 
   9642 /*===========================================================================
   9643  * FUNCTION   : getExifIsoSpeed
   9644  *
   9645  * DESCRIPTION: get exif ISO speed
   9646  *
   9647  * PARAMETERS : none
   9648  *
   9649  * RETURN     : ISO speed value
   9650  *==========================================================================*/
   9651 uint16_t QCameraParameters::getExifIsoSpeed()
   9652 {
   9653     uint16_t isoSpeed = 0;
   9654     const char *iso_str = get(QCameraParameters::KEY_QC_ISO_MODE);
   9655     int iso_index = lookupAttr(ISO_MODES_MAP, PARAM_MAP_SIZE(ISO_MODES_MAP), iso_str);
   9656     switch (iso_index) {
   9657     case CAM_ISO_MODE_AUTO:
   9658         isoSpeed = 0;
   9659         break;
   9660     case CAM_ISO_MODE_DEBLUR:
   9661         isoSpeed = 1;
   9662         break;
   9663     case CAM_ISO_MODE_100:
   9664         isoSpeed = 100;
   9665         break;
   9666     case CAM_ISO_MODE_200:
   9667         isoSpeed = 200;
   9668         break;
   9669     case CAM_ISO_MODE_400:
   9670         isoSpeed = 400;
   9671         break;
   9672     case CAM_ISO_MODE_800:
   9673         isoSpeed = 800;
   9674         break;
   9675     case CAM_ISO_MODE_1600:
   9676         isoSpeed = 1600;
   9677         break;
   9678     case CAM_ISO_MODE_3200:
   9679         isoSpeed = 3200;
   9680         break;
   9681     }
   9682     return isoSpeed;
   9683 }
   9684 
   9685 /*===========================================================================
   9686  * FUNCTION   : getExifGpsProcessingMethod
   9687  *
   9688  * DESCRIPTION: get GPS processing method
   9689  *
   9690  * PARAMETERS :
   9691  *   @gpsProcessingMethod : string to store GPS process method
   9692  *   @count               : lenght of the string
   9693  *
   9694  * RETURN     : int32_t type of status
   9695  *              NO_ERROR  -- success
   9696  *              none-zero failure code
   9697  *==========================================================================*/
   9698 int32_t QCameraParameters::getExifGpsProcessingMethod(char *gpsProcessingMethod,
   9699                                                       uint32_t &count)
   9700 {
   9701     const char *str = get(KEY_GPS_PROCESSING_METHOD);
   9702     if(str != NULL) {
   9703         memcpy(gpsProcessingMethod, ExifAsciiPrefix, EXIF_ASCII_PREFIX_SIZE);
   9704         count = EXIF_ASCII_PREFIX_SIZE;
   9705         strlcpy(gpsProcessingMethod + EXIF_ASCII_PREFIX_SIZE, str, strlen(str)+1);
   9706         count += (uint32_t)strlen(str);
   9707         gpsProcessingMethod[count++] = '\0'; // increase 1 for the last NULL char
   9708         return NO_ERROR;
   9709     } else {
   9710         return BAD_VALUE;
   9711     }
   9712 }
   9713 
   9714 /*===========================================================================
   9715  * FUNCTION   : getExifLatitude
   9716  *
   9717  * DESCRIPTION: get exif latitude
   9718  *
   9719  * PARAMETERS :
   9720  *   @latitude : ptr to rational struct to store latitude info
   9721  *   @ladRef   : charater to indicate latitude reference
   9722  *
   9723  * RETURN     : int32_t type of status
   9724  *              NO_ERROR  -- success
   9725  *              none-zero failure code
   9726  *==========================================================================*/
   9727 int32_t QCameraParameters::getExifLatitude(rat_t *latitude,
   9728                                            char *latRef)
   9729 {
   9730     const char *str = get(KEY_GPS_LATITUDE);
   9731     if(str != NULL) {
   9732         parseGPSCoordinate(str, latitude);
   9733 
   9734         //set Latitude Ref
   9735         float latitudeValue = getFloat(KEY_GPS_LATITUDE);
   9736         if(latitudeValue < 0.0f) {
   9737             latRef[0] = 'S';
   9738         } else {
   9739             latRef[0] = 'N';
   9740         }
   9741         latRef[1] = '\0';
   9742         return NO_ERROR;
   9743     }else{
   9744         return BAD_VALUE;
   9745     }
   9746 }
   9747 
   9748 /*===========================================================================
   9749  * FUNCTION   : getExifLongitude
   9750  *
   9751  * DESCRIPTION: get exif longitude
   9752  *
   9753  * PARAMETERS :
   9754  *   @longitude : ptr to rational struct to store longitude info
   9755  *   @lonRef    : charater to indicate longitude reference
   9756  *
   9757  * RETURN     : int32_t type of status
   9758  *              NO_ERROR  -- success
   9759  *              none-zero failure code
   9760  *==========================================================================*/
   9761 int32_t QCameraParameters::getExifLongitude(rat_t *longitude,
   9762                                             char *lonRef)
   9763 {
   9764     const char *str = get(KEY_GPS_LONGITUDE);
   9765     if(str != NULL) {
   9766         parseGPSCoordinate(str, longitude);
   9767 
   9768         //set Longitude Ref
   9769         float longitudeValue = getFloat(KEY_GPS_LONGITUDE);
   9770         if(longitudeValue < 0.0f) {
   9771             lonRef[0] = 'W';
   9772         } else {
   9773             lonRef[0] = 'E';
   9774         }
   9775         lonRef[1] = '\0';
   9776         return NO_ERROR;
   9777     }else{
   9778         return BAD_VALUE;
   9779     }
   9780 }
   9781 
   9782 /*===========================================================================
   9783  * FUNCTION   : getExifAltitude
   9784  *
   9785  * DESCRIPTION: get exif altitude
   9786  *
   9787  * PARAMETERS :
   9788  *   @altitude : ptr to rational struct to store altitude info
   9789  *   @altRef   : charater to indicate altitude reference
   9790  *
   9791  * RETURN     : int32_t type of status
   9792  *              NO_ERROR  -- success
   9793  *              none-zero failure code
   9794  *==========================================================================*/
   9795 int32_t QCameraParameters::getExifAltitude(rat_t *altitude,
   9796                                            char *altRef)
   9797 {
   9798     const char *str = get(KEY_GPS_ALTITUDE);
   9799     if(str != NULL) {
   9800         double value = atof(str);
   9801         *altRef = 0;
   9802         if(value < 0){
   9803             *altRef = 1;
   9804             value = -value;
   9805         }
   9806         return getRational(altitude, (int)(value*1000), 1000);
   9807     }else{
   9808         return BAD_VALUE;
   9809     }
   9810 }
   9811 
   9812 /*===========================================================================
   9813  * FUNCTION   : getExifGpsDateTimeStamp
   9814  *
   9815  * DESCRIPTION: get exif GPS date time stamp
   9816  *
   9817  * PARAMETERS :
   9818  *   @gpsDateStamp : GPS date time stamp string
   9819  *   @bufLen       : length of the string
   9820  *   @gpsTimeStamp : ptr to rational struct to store time stamp info
   9821  *
   9822  * RETURN     : int32_t type of status
   9823  *              NO_ERROR  -- success
   9824  *              none-zero failure code
   9825  *==========================================================================*/
   9826 int32_t QCameraParameters::getExifGpsDateTimeStamp(char *gpsDateStamp,
   9827                                                    uint32_t bufLen,
   9828                                                    rat_t *gpsTimeStamp)
   9829 {
   9830     const char *str = get(KEY_GPS_TIMESTAMP);
   9831     if(str != NULL) {
   9832         time_t unixTime = (time_t)atol(str);
   9833         struct tm *UTCTimestamp = gmtime(&unixTime);
   9834 
   9835         if(!UTCTimestamp) {
   9836             ALOGE("%s: UTCTimestamp is null\n", __func__);
   9837             return BAD_VALUE;
   9838         }
   9839 
   9840         strftime(gpsDateStamp, bufLen, "%Y:%m:%d", UTCTimestamp);
   9841 
   9842         getRational(&gpsTimeStamp[0], UTCTimestamp->tm_hour, 1);
   9843         getRational(&gpsTimeStamp[1], UTCTimestamp->tm_min, 1);
   9844         getRational(&gpsTimeStamp[2], UTCTimestamp->tm_sec, 1);
   9845 
   9846         return NO_ERROR;
   9847     } else {
   9848         return BAD_VALUE;
   9849     }
   9850 }
   9851 
   9852 /*===========================================================================
   9853  * FUNCTION   : updateFocusDistances
   9854  *
   9855  * DESCRIPTION: update focus distances
   9856  *
   9857  * PARAMETERS :
   9858  *   @focusDistances : ptr to focus distance info
   9859  *
   9860  * RETURN     : int32_t type of status
   9861  *              NO_ERROR  -- success
   9862  *              none-zero failure code
   9863  *==========================================================================*/
   9864 int32_t QCameraParameters::updateFocusDistances(cam_focus_distances_info_t *focusDistances)
   9865 {
   9866     String8 str;
   9867     char buffer[32] = {0};
   9868     //set all distances to infinity if focus mode is infinity
   9869     if(mFocusMode == CAM_FOCUS_MODE_INFINITY) {
   9870         str.append("Infinity,Infinity,Infinity");
   9871     } else {
   9872         snprintf(buffer, sizeof(buffer), "%f", focusDistances->focus_distance[0]);
   9873         str.append(buffer);
   9874         snprintf(buffer, sizeof(buffer), ",%f", focusDistances->focus_distance[1]);
   9875         str.append(buffer);
   9876         snprintf(buffer, sizeof(buffer), ",%f", focusDistances->focus_distance[2]);
   9877         str.append(buffer);
   9878     }
   9879     CDBG_HIGH("%s: setting KEY_FOCUS_DISTANCES as %s", __FUNCTION__, str.string());
   9880     set(QCameraParameters::KEY_FOCUS_DISTANCES, str.string());
   9881     return NO_ERROR;
   9882 }
   9883 
   9884 /*===========================================================================
   9885  * FUNCTION   : updateRecordingHintValue
   9886  *
   9887  * DESCRIPTION: update recording hint locally and to daemon
   9888  *
   9889  * PARAMETERS :
   9890  *   @value   : video hint value
   9891  *
   9892  * RETURN     : int32_t type of status
   9893  *              NO_ERROR  -- success
   9894  *              none-zero failure code
   9895  *==========================================================================*/
   9896 int32_t QCameraParameters::updateRecordingHintValue(int32_t value)
   9897 {
   9898     int32_t rc = NO_ERROR;
   9899     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   9900         ALOGE("%s:Failed to initialize group update table", __func__);
   9901         return BAD_TYPE;
   9902     }
   9903 
   9904     rc = setRecordingHintValue(value);
   9905     if (rc != NO_ERROR) {
   9906         ALOGE("%s:Failed to update table", __func__);
   9907         return rc;
   9908     }
   9909 
   9910     if(m_bDISEnabled && (value==1)) {
   9911         CDBG_HIGH("%s: %d: Setting DIS value again!!", __func__, __LINE__);
   9912         setDISValue(VALUE_ENABLE);
   9913     }
   9914 
   9915     rc = commitSetBatch();
   9916     if (rc != NO_ERROR) {
   9917         ALOGE("%s:Failed to update recording hint", __func__);
   9918         return rc;
   9919     }
   9920 
   9921     return rc;
   9922 }
   9923 
   9924 /*===========================================================================
   9925  * FUNCTION   : setHistogram
   9926  *
   9927  * DESCRIPTION: set histogram
   9928  *
   9929  * PARAMETERS :
   9930  *   @enabled : if histogram is enabled
   9931  *
   9932  * RETURN     : int32_t type of status
   9933  *              NO_ERROR  -- success
   9934  *              none-zero failure code
   9935  *==========================================================================*/
   9936 int32_t QCameraParameters::setHistogram(bool enabled)
   9937 {
   9938     if(m_bHistogramEnabled == enabled) {
   9939         CDBG_HIGH("%s: histogram flag not changed, no ops here", __func__);
   9940         return NO_ERROR;
   9941     }
   9942 
   9943     // set parm for histogram
   9944     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   9945         ALOGE("%s:Failed to initialize group update table", __func__);
   9946         return BAD_TYPE;
   9947     }
   9948 
   9949     int32_t value = enabled ? 1 : 0;
   9950     int32_t rc = NO_ERROR;
   9951     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HISTOGRAM, value)) {
   9952         ALOGE("%s:Failed to update table", __func__);
   9953         return BAD_VALUE;
   9954     }
   9955 
   9956     rc = commitSetBatch();
   9957     if (rc != NO_ERROR) {
   9958         ALOGE("%s:Failed to set histogram", __func__);
   9959         return rc;
   9960     }
   9961 
   9962     m_bHistogramEnabled = enabled;
   9963 
   9964     CDBG_HIGH(" Histogram -> %s", m_bHistogramEnabled ? "Enabled" : "Disabled");
   9965 
   9966     return rc;
   9967 }
   9968 
   9969 /*===========================================================================
   9970  * FUNCTION   : setIntEvent
   9971  *
   9972  * DESCRIPTION: set setIntEvent
   9973  *
   9974  * PARAMETERS :
   9975  *   @params : image size and dimensions
   9976  *
   9977  * RETURN     : int32_t type of status
   9978  *              NO_ERROR  -- success
   9979  *              none-zero failure code
   9980  *==========================================================================*/
   9981 int32_t QCameraParameters::setIntEvent(cam_int_evt_params_t params)
   9982 {
   9983     int32_t rc = NO_ERROR;
   9984 
   9985     if ( m_pParamBuf == NULL ) {
   9986         return NO_INIT;
   9987     }
   9988 
   9989     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   9990         ALOGE("%s:Failed to initialize group update table", __func__);
   9991         return BAD_TYPE;
   9992     }
   9993 
   9994     //Sending snapshot taken notification back to Eztune"
   9995     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_INT_EVT, params)) {
   9996         ALOGE("%s:Failed to update table", __func__);
   9997         return BAD_VALUE;
   9998     }
   9999 
   10000     rc = commitSetBatch();
   10001     if (rc != NO_ERROR) {
   10002         ALOGE("%s:Failed to set frameskip info parm", __func__);
   10003         return rc;
   10004     }
   10005 
   10006     return rc;
   10007 }
   10008 
   10009 /*===========================================================================
   10010  * FUNCTION   : setFaceDetectionOption
   10011  *
   10012  * DESCRIPTION: set if face detection is enabled by SendCommand
   10013  *
   10014  * PARAMETERS :
   10015  *   @enabled : bool flag if face detection should be enabled
   10016  *
   10017  * RETURN     : int32_t type of status
   10018  *              NO_ERROR  -- success
   10019  *              none-zero failure code
   10020  *==========================================================================*/
   10021  int32_t QCameraParameters::setFaceDetectionOption(bool enabled)
   10022 {
   10023     m_bFaceDetectionOn = enabled;
   10024     return NO_ERROR;
   10025 }
   10026 
   10027 /*===========================================================================
   10028  * FUNCTION   : setFaceDetection
   10029  *
   10030  * DESCRIPTION: set face detection
   10031  *
   10032  * PARAMETERS :
   10033  *   @enabled : if face detection is enabled
   10034  *   @initCommit : if configuration list need to be initialized and commited
   10035  *
   10036  * RETURN     : int32_t type of status
   10037  *              NO_ERROR  -- success
   10038  *              none-zero failure code
   10039  *==========================================================================*/
   10040 int32_t QCameraParameters::setFaceDetection(bool enabled, bool initCommit)
   10041 {
   10042     uint32_t faceProcMask = m_nFaceProcMask;
   10043     // set face detection mask
   10044     if (enabled) {
   10045         faceProcMask |= CAM_FACE_PROCESS_MASK_DETECTION;
   10046     } else {
   10047         faceProcMask &= ~CAM_FACE_PROCESS_MASK_DETECTION;
   10048     }
   10049 
   10050     if(m_nFaceProcMask == faceProcMask) {
   10051         CDBG_HIGH("%s: face process mask not changed, no ops here", __func__);
   10052         return NO_ERROR;
   10053     }
   10054 
   10055     m_nFaceProcMask = faceProcMask;
   10056 
   10057     // set parm for face detection
   10058     uint32_t requested_faces = (uint32_t)getInt(KEY_QC_MAX_NUM_REQUESTED_FACES);
   10059     cam_fd_set_parm_t fd_set_parm;
   10060     memset(&fd_set_parm, 0, sizeof(cam_fd_set_parm_t));
   10061     fd_set_parm.fd_mode = faceProcMask;
   10062     fd_set_parm.num_fd = requested_faces;
   10063 
   10064     CDBG_HIGH("[KPI Perf] %s: PROFILE_FACE_DETECTION_VALUE = %d num_fd = %d",
   10065           __func__, faceProcMask,requested_faces);
   10066 
   10067     if (initCommit) {
   10068         if(initBatchUpdate(m_pParamBuf) < 0 ) {
   10069             ALOGE("%s:Failed to initialize group update table", __func__);
   10070             return BAD_TYPE;
   10071         }
   10072     }
   10073 
   10074     int32_t rc = NO_ERROR;
   10075 
   10076     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FD, fd_set_parm)) {
   10077         ALOGE("%s:Failed to update table", __func__);
   10078         return BAD_VALUE;
   10079     }
   10080 
   10081     if (initCommit) {
   10082         rc = commitSetBatch();
   10083         if (rc != NO_ERROR) {
   10084             ALOGE("%s:Failed to set face detection parm", __func__);
   10085             return rc;
   10086         }
   10087     }
   10088 
   10089     CDBG_HIGH("%s: FaceProcMask -> %d", __func__, m_nFaceProcMask);
   10090 
   10091     return rc;
   10092 }
   10093 
   10094 /*===========================================================================
   10095  * FUNCTION   : setFrameSkip
   10096  *
   10097  * DESCRIPTION: send ISP frame skip pattern to camera daemon
   10098  *
   10099  * PARAMETERS :
   10100  *   @pattern : skip pattern for ISP
   10101  *
   10102  * RETURN     : int32_t type of status
   10103  *              NO_ERROR  -- success
   10104  *              none-zero failure code
   10105  *==========================================================================*/
   10106 int32_t QCameraParameters::setFrameSkip(enum msm_vfe_frame_skip_pattern pattern)
   10107 {
   10108     int32_t rc = NO_ERROR;
   10109 
   10110     if ( m_pParamBuf == NULL ) {
   10111         return NO_INIT;
   10112     }
   10113 
   10114     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   10115         ALOGE("%s:Failed to initialize group update table", __func__);
   10116         return BAD_TYPE;
   10117     }
   10118 
   10119     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FRAMESKIP, (int32_t)pattern)) {
   10120         ALOGE("%s:Failed to update table", __func__);
   10121         return BAD_VALUE;
   10122     }
   10123 
   10124     rc = commitSetBatch();
   10125     if (rc != NO_ERROR) {
   10126         ALOGE("%s:Failed to set frameskip info parm", __func__);
   10127         return rc;
   10128     }
   10129 
   10130     return rc;
   10131 }
   10132 
   10133 int32_t QCameraParameters::updateRAW(cam_dimension_t max_dim)
   10134 {
   10135     int32_t rc = NO_ERROR;
   10136     cam_dimension_t raw_dim;
   10137 
   10138     if (max_dim.width == 0 || max_dim.height == 0) {
   10139         max_dim = m_pCapability->raw_dim[0];
   10140     }
   10141 
   10142     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   10143         ALOGE("%s:Failed to initialize group update table", __func__);
   10144         return BAD_TYPE;
   10145     }
   10146 
   10147     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_MAX_DIMENSION, max_dim)) {
   10148         ALOGE("%s:Failed to update table for CAM_INTF_PARM_MAX_DIMENSION ", __func__);
   10149         return BAD_VALUE;
   10150     }
   10151 
   10152     rc = commitSetBatch();
   10153     if (rc != NO_ERROR) {
   10154         ALOGE("%s:Failed to set lock CAM_INTF_PARM_MAX_DIMENSION parm", __func__);
   10155         return rc;
   10156     }
   10157 
   10158     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   10159         ALOGE("%s:Failed to initialize group update table", __func__);
   10160         return BAD_TYPE;
   10161     }
   10162 
   10163     ADD_GET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_RAW_DIMENSION);
   10164 
   10165     rc = commitGetBatch();
   10166     if (rc != NO_ERROR) {
   10167         ALOGE("%s:Failed to get commit CAM_INTF_PARM_RAW_DIMENSION", __func__);
   10168         return rc;
   10169     }
   10170 
   10171     READ_PARAM_ENTRY(m_pParamBuf, CAM_INTF_PARM_RAW_DIMENSION, raw_dim);
   10172 
   10173     CDBG_HIGH("%s : RAW Dimension = %d X %d",__func__,raw_dim.width,raw_dim.height);
   10174     if (raw_dim.width == 0 || raw_dim.height == 0) {
   10175         ALOGE("%s: Error getting RAW size. Setting to Capability value",__func__);
   10176         raw_dim = m_pCapability->raw_dim[0];
   10177     }
   10178     setRawSize(raw_dim);
   10179     return rc;
   10180 }
   10181 
   10182 /*===========================================================================
   10183  * FUNCTION   : setHDRSceneEnable
   10184  *
   10185  * DESCRIPTION: sets hdr scene deteced flag
   10186  *
   10187  * PARAMETERS :
   10188  *   @bflag : hdr scene deteced
   10189  *
   10190  * RETURN     : nothing
   10191  *==========================================================================*/
   10192 void QCameraParameters::setHDRSceneEnable(bool bflag)
   10193 {
   10194     bool bupdate = false;
   10195     if (m_HDRSceneEnabled != bflag) {
   10196         bupdate = true;
   10197     }
   10198     m_HDRSceneEnabled = bflag;
   10199 
   10200     if (bupdate) {
   10201         updateFlash(true);
   10202     }
   10203 }
   10204 
   10205 /*===========================================================================
   10206  * FUNCTION   : getASDStateString
   10207  *
   10208  * DESCRIPTION: get ASD result in string format
   10209  *
   10210  * PARAMETERS :
   10211  *   @scene : selected scene mode
   10212  *
   10213  * RETURN     : int32_t type of status
   10214  *              NO_ERROR  -- success
   10215  *              none-zero failure code
   10216  *==========================================================================*/
   10217  const char *QCameraParameters::getASDStateString(cam_auto_scene_t scene)
   10218 {
   10219     switch (scene) {
   10220       case S_NORMAL :
   10221         return "Normal";
   10222       case S_SCENERY:
   10223         return "Scenery";
   10224       case S_PORTRAIT:
   10225         return "Portrait";
   10226       case S_PORTRAIT_BACKLIGHT:
   10227         return "Portrait-Backlight";
   10228       case S_SCENERY_BACKLIGHT:
   10229         return "Scenery-Backlight";
   10230       case S_BACKLIGHT:
   10231         return "Backlight";
   10232       default:
   10233         return "<Unknown!>";
   10234       }
   10235 }
   10236 
   10237 /*===========================================================================
   10238  * FUNCTION   : parseNDimVector
   10239  *
   10240  * DESCRIPTION: helper function to parse a string like "(1, 2, 3, 4, ..., N)"
   10241  *              into N-dimension vector
   10242  *
   10243  * PARAMETERS :
   10244  *   @str     : string to be parsed
   10245  *   @num     : output array of size N to store vector element values
   10246  *   @N       : number of dimension
   10247  *   @delim   : delimeter to seperete string
   10248  *
   10249  * RETURN     : int32_t type of status
   10250  *              NO_ERROR  -- success
   10251  *              none-zero failure code
   10252  *==========================================================================*/
   10253 int32_t QCameraParameters::parseNDimVector(const char *str, int *num, int N, char delim = ',')
   10254 {
   10255     char *start, *end;
   10256     if (num == NULL) {
   10257         ALOGE("%s: Invalid output array (num == NULL)", __func__);
   10258         return BAD_VALUE;
   10259     }
   10260 
   10261     //check if string starts and ends with parantheses
   10262     if(str[0] != '(' || str[strlen(str)-1] != ')') {
   10263         ALOGE("%s: Invalid format of string %s, valid format is (n1, n2, n3, n4 ...)",
   10264               __func__, str);
   10265         return BAD_VALUE;
   10266     }
   10267     start = (char*) str;
   10268     start++;
   10269     for(int i=0; i<N; i++) {
   10270         *(num+i) = (int) strtol(start, &end, 10);
   10271         if(*end != delim && i < N-1) {
   10272             ALOGE("%s: Cannot find delimeter '%c' in string \"%s\". end = %c",
   10273                   __func__, delim, str, *end);
   10274             return -1;
   10275         }
   10276         start = end+1;
   10277     }
   10278     return NO_ERROR;
   10279 }
   10280 
   10281 /*===========================================================================
   10282  * FUNCTION   : parseCameraAreaString
   10283  *
   10284  * DESCRIPTION: helper function to parse a string of camera areas like
   10285  *              "(1, 2, 3, 4, 5),(1, 2, 3, 4, 5),..."
   10286  *
   10287  * PARAMETERS :
   10288  *   @str             : string to be parsed
   10289  *   @max_num_areas   : max number of areas
   10290  *   @pAreas          : ptr to struct to store areas
   10291  *   @num_areas_found : number of areas found
   10292  *
   10293  * RETURN     : int32_t type of status
   10294  *              NO_ERROR  -- success
   10295  *              none-zero failure code
   10296  *==========================================================================*/
   10297 int32_t QCameraParameters::parseCameraAreaString(const char *str,
   10298                                                  int max_num_areas,
   10299                                                  cam_area_t *pAreas,
   10300                                                  int& num_areas_found)
   10301 {
   10302     char area_str[32];
   10303     const char *start, *end, *p;
   10304     start = str; end = NULL;
   10305     int values[5], index=0;
   10306     num_areas_found = 0;
   10307 
   10308     memset(values, 0, sizeof(values));
   10309     while(start != NULL) {
   10310        if(*start != '(') {
   10311             ALOGE("%s: error: Ill formatted area string: %s", __func__, str);
   10312             return BAD_VALUE;
   10313        }
   10314        end = strchr(start, ')');
   10315        if(end == NULL) {
   10316             ALOGE("%s: error: Ill formatted area string: %s", __func__, str);
   10317             return BAD_VALUE;
   10318        }
   10319        int i;
   10320        for (i=0,p=start; p<=end; p++, i++) {
   10321            area_str[i] = *p;
   10322        }
   10323        area_str[i] = '\0';
   10324        if(parseNDimVector(area_str, values, 5) < 0){
   10325             ALOGE("%s: error: Failed to parse the area string: %s", __func__, area_str);
   10326             return BAD_VALUE;
   10327        }
   10328        // no more areas than max_num_areas are accepted.
   10329        if(index >= max_num_areas) {
   10330             ALOGE("%s: error: too many areas specified %s", __func__, str);
   10331             return BAD_VALUE;
   10332        }
   10333        pAreas[index].rect.left = values[0];
   10334        pAreas[index].rect.top = values[1];
   10335        pAreas[index].rect.width = values[2] - values[0];
   10336        pAreas[index].rect.height = values[3] - values[1];
   10337        pAreas[index].weight = values[4];
   10338 
   10339        index++;
   10340        start = strchr(end, '('); // serach for next '('
   10341     }
   10342     num_areas_found = index;
   10343     return 0;
   10344 }
   10345 
   10346 /*===========================================================================
   10347  * FUNCTION   : validateCameraAreas
   10348  *
   10349  * DESCRIPTION: helper function to validate camera areas within (-1000, 1000)
   10350  *
   10351  * PARAMETERS :
   10352  *   @areas     : ptr to array of areas
   10353  *   @num_areas : number of areas
   10354  *
   10355  * RETURN     : true --  area is in valid range
   10356  *              false -- not valid
   10357  *==========================================================================*/
   10358 bool QCameraParameters::validateCameraAreas(cam_area_t *areas, int num_areas)
   10359 {
   10360     // special case: default area
   10361     if (num_areas == 1 &&
   10362         areas[0].rect.left == 0 &&
   10363         areas[0].rect.top == 0 &&
   10364         areas[0].rect.width == 0 &&
   10365         areas[0].rect.height == 0 &&
   10366         areas[0].weight == 0) {
   10367         return true;
   10368     }
   10369 
   10370     for(int i = 0; i < num_areas; i++) {
   10371         // left should be >= -1000
   10372         if(areas[i].rect.left < -1000) {
   10373             return false;
   10374         }
   10375 
   10376         // top  should be >= -1000
   10377         if(areas[i].rect.top < -1000) {
   10378             return false;
   10379         }
   10380 
   10381         // width or height should be > 0
   10382         if (areas[i].rect.width <= 0 || areas[i].rect.height <= 0) {
   10383             return false;
   10384         }
   10385 
   10386         // right  should be <= 1000
   10387         if(areas[i].rect.left + areas[i].rect.width > 1000) {
   10388             return false;
   10389         }
   10390 
   10391         // bottom should be <= 1000
   10392         if(areas[i].rect.top + areas[i].rect.height > 1000) {
   10393             return false;
   10394         }
   10395 
   10396         // weight should be within (1, 1000)
   10397         if (areas[i].weight < 1 || areas[i].weight > 1000) {
   10398             return false;
   10399         }
   10400     }
   10401     return true;
   10402 }
   10403 
   10404 /*===========================================================================
   10405  * FUNCTION   : isYUVFrameInfoNeeded
   10406  *
   10407  * DESCRIPTION: In AE-Bracket mode, we need set yuv buffer information for up-layer
   10408  *
   10409  * PARAMETERS : none
   10410  *
   10411  * RETURN     : true: needed
   10412  *              false: no need
   10413  *==========================================================================*/
   10414 bool QCameraParameters::isYUVFrameInfoNeeded()
   10415 {
   10416     //In AE-Bracket mode, we need set raw buffer information for up-layer
   10417     if(!isNV21PictureFormat() && !isNV16PictureFormat()){
   10418         return false;
   10419     }
   10420     const char *aecBracketStr =  get(KEY_QC_AE_BRACKET_HDR);
   10421 
   10422     int value = lookupAttr(BRACKETING_MODES_MAP, PARAM_MAP_SIZE(BRACKETING_MODES_MAP),
   10423             aecBracketStr);
   10424     CDBG_HIGH("%s: aecBracketStr=%s, value=%d.", __func__, aecBracketStr, value);
   10425     return (value == CAM_EXP_BRACKETING_ON);
   10426 }
   10427 
   10428 /*===========================================================================
   10429  * FUNCTION   : getFrameFmtString
   10430  *
   10431  * DESCRIPTION: get string name of frame format
   10432  *
   10433  * PARAMETERS :
   10434  *   @frame   : frame format
   10435  *
   10436  * RETURN     : string name of frame format
   10437  *==========================================================================*/
   10438 const char *QCameraParameters::getFrameFmtString(cam_format_t fmt)
   10439 {
   10440     return lookupNameByValue(PICTURE_TYPES_MAP, PARAM_MAP_SIZE(PICTURE_TYPES_MAP), fmt);
   10441 }
   10442 
   10443 /*===========================================================================
   10444  * FUNCTION   : initBatchUpdate
   10445  *
   10446  * DESCRIPTION: init camera parameters buf entries
   10447  *
   10448  * PARAMETERS :
   10449  *   @p_table : ptr to parameter buffer
   10450  *
   10451  * RETURN     : int32_t type of status
   10452  *              NO_ERROR  -- success
   10453  *              none-zero failure code
   10454  *==========================================================================*/
   10455 int32_t QCameraParameters::initBatchUpdate(parm_buffer_t *p_table)
   10456 {
   10457     m_tempMap.clear();
   10458 
   10459     clear_metadata_buffer(p_table);
   10460     return NO_ERROR;
   10461 }
   10462 
   10463 /*===========================================================================
   10464  * FUNCTION   : commitSetBatch
   10465  *
   10466  * DESCRIPTION: commit all set parameters in the batch work to backend
   10467  *
   10468  * PARAMETERS : none
   10469  *
   10470  * RETURN     : int32_t type of status
   10471  *              NO_ERROR  -- success
   10472  *              none-zero failure code
   10473  *==========================================================================*/
   10474 int32_t QCameraParameters::commitSetBatch()
   10475 {
   10476     int32_t rc = NO_ERROR;
   10477     int32_t i = 0;
   10478 
   10479     if (NULL == m_pParamBuf) {
   10480         ALOGE("%s: Params not initialized", __func__);
   10481         return NO_INIT;
   10482     }
   10483 
   10484     /* Loop to check if atleast one entry is valid */
   10485     for(i = 0; i < CAM_INTF_PARM_MAX; i++){
   10486         if(m_pParamBuf->is_valid[i])
   10487             break;
   10488     }
   10489 
   10490     if (NULL == m_pCamOpsTbl) {
   10491         ALOGE("%s: Ops not initialized", __func__);
   10492         return NO_INIT;
   10493     }
   10494 
   10495     if (i < CAM_INTF_PARM_MAX) {
   10496         rc = m_pCamOpsTbl->ops->set_parms(m_pCamOpsTbl->camera_handle, m_pParamBuf);
   10497     }
   10498     if (rc == NO_ERROR) {
   10499         // commit change from temp storage into param map
   10500         rc = commitParamChanges();
   10501     }
   10502     return rc;
   10503 }
   10504 
   10505 /*===========================================================================
   10506  * FUNCTION   : commitGetBatch
   10507  *
   10508  * DESCRIPTION: commit all get parameters in the batch work to backend
   10509  *
   10510  * PARAMETERS : none
   10511  *
   10512  * RETURN     : int32_t type of status
   10513  *              NO_ERROR  -- success
   10514  *              none-zero failure code
   10515  *==========================================================================*/
   10516 int32_t QCameraParameters::commitGetBatch()
   10517 {
   10518     int32_t rc = NO_ERROR;
   10519     int32_t i = 0;
   10520 
   10521     if (NULL == m_pParamBuf) {
   10522         ALOGE("%s: Params not initialized", __func__);
   10523         return NO_INIT;
   10524     }
   10525 
   10526     /* Loop to check if atleast one entry is valid */
   10527     for(i = 0; i < CAM_INTF_PARM_MAX; i++){
   10528         if(m_pParamBuf->is_valid[i])
   10529             break;
   10530     }
   10531 
   10532     if (NULL == m_pCamOpsTbl) {
   10533         ALOGE("%s: Ops not initialized", __func__);
   10534         return NO_INIT;
   10535     }
   10536 
   10537     if (i < CAM_INTF_PARM_MAX) {
   10538         return m_pCamOpsTbl->ops->get_parms(m_pCamOpsTbl->camera_handle, m_pParamBuf);
   10539     } else {
   10540         return NO_ERROR;
   10541     }
   10542     return rc;
   10543 }
   10544 
   10545 /*===========================================================================
   10546  * FUNCTION   : updateParamEntry
   10547  *
   10548  * DESCRIPTION: update a parameter entry in the local temp map obj
   10549  *
   10550  * PARAMETERS :
   10551  *   @key     : key of the entry
   10552  *   @value   : value of the entry
   10553  *
   10554  * RETURN     : int32_t type of status
   10555  *              NO_ERROR  -- success
   10556  *              none-zero failure code
   10557  *==========================================================================*/
   10558 int32_t QCameraParameters::updateParamEntry(const char *key, const char *value)
   10559 {
   10560     m_tempMap.replaceValueFor(String8(key), String8(value));
   10561     return NO_ERROR;
   10562 }
   10563 
   10564 /*===========================================================================
   10565  * FUNCTION   : commitParamChanges
   10566  *
   10567  * DESCRIPTION: commit all changes in local temp map obj into parameter obj
   10568  *
   10569  * PARAMETERS : none
   10570  *
   10571  * RETURN     : int32_t type of status
   10572  *              NO_ERROR  -- success
   10573  *              none-zero failure code
   10574  *==========================================================================*/
   10575 int32_t QCameraParameters::commitParamChanges()
   10576 {
   10577     size_t size = m_tempMap.size();
   10578     for (size_t i = 0; i < size; i++) {
   10579         String8 k, v;
   10580         k = m_tempMap.keyAt(i);
   10581         v = m_tempMap.valueAt(i);
   10582         set(k, v);
   10583     }
   10584     m_tempMap.clear();
   10585 
   10586     // update local changes
   10587     m_bRecordingHint = m_bRecordingHint_new;
   10588     m_bZslMode = m_bZslMode_new;
   10589 
   10590     /* After applying scene mode auto,
   10591       Camera effects need to be reapplied */
   10592     if ( m_bSceneTransitionAuto ) {
   10593         m_bUpdateEffects = true;
   10594         m_bSceneTransitionAuto = false;
   10595     }
   10596 
   10597 
   10598     return NO_ERROR;
   10599 }
   10600 
   10601 /*===========================================================================
   10602  * FUNCTION   : QCameraReprocScaleParam
   10603  *
   10604  * DESCRIPTION: constructor of QCameraReprocScaleParam
   10605  *
   10606  * PARAMETERS : none
   10607  *
   10608  * RETURN     : none
   10609  *==========================================================================*/
   10610 QCameraReprocScaleParam::QCameraReprocScaleParam(QCameraParameters *parent)
   10611   : mParent(parent),
   10612     mScaleEnabled(false),
   10613     mIsUnderScaling(false),
   10614     mScaleDirection(0),
   10615     mNeedScaleCnt(0),
   10616     mSensorSizeTblCnt(0),
   10617     mSensorSizeTbl(NULL),
   10618     mTotalSizeTblCnt(0)
   10619 {
   10620     mPicSizeFromAPK.width = 0;
   10621     mPicSizeFromAPK.height = 0;
   10622     mPicSizeSetted.width = 0;
   10623     mPicSizeSetted.height = 0;
   10624     memset(mNeedScaledSizeTbl, 0, sizeof(mNeedScaledSizeTbl));
   10625     memset(mTotalSizeTbl, 0, sizeof(mTotalSizeTbl));
   10626 }
   10627 
   10628 /*===========================================================================
   10629  * FUNCTION   : ~~QCameraReprocScaleParam
   10630  *
   10631  * DESCRIPTION: destructor of QCameraReprocScaleParam
   10632  *
   10633  * PARAMETERS : none
   10634  *
   10635  * RETURN     : none
   10636  *==========================================================================*/
   10637 QCameraReprocScaleParam::~QCameraReprocScaleParam()
   10638 {
   10639     //do nothing now.
   10640 }
   10641 
   10642 /*===========================================================================
   10643  * FUNCTION   : setScaledSizeTbl
   10644  *
   10645  * DESCRIPTION: re-set picture size table with dimensions that need scaling if Reproc Scale is enabled
   10646  *
   10647  * PARAMETERS :
   10648  *   @scale_cnt   : count of picture sizes that want scale
   10649  *   @scale_tbl    : picture size table that want scale
   10650  *   @org_cnt     : sensor supported picture size count
   10651  *   @org_tbl      : sensor supported picture size table
   10652  *
   10653  * RETURN     : int32_t type of status
   10654  *              NO_ERROR  -- success
   10655  *              none-zero failure code
   10656  *==========================================================================*/
   10657 int32_t QCameraReprocScaleParam::setScaleSizeTbl(size_t scale_cnt,
   10658         cam_dimension_t *scale_tbl, size_t org_cnt, cam_dimension_t *org_tbl)
   10659 {
   10660     int32_t rc = NO_ERROR;
   10661     size_t i;
   10662     mNeedScaleCnt = 0;
   10663 
   10664     if(!mScaleEnabled || scale_cnt <=0 || scale_tbl == NULL || org_cnt <=0 || org_tbl == NULL){
   10665         return BAD_VALUE;    // Do not need scale, so also need not reset picture size table
   10666     }
   10667 
   10668     mSensorSizeTblCnt = org_cnt;
   10669     mSensorSizeTbl = org_tbl;
   10670     mNeedScaleCnt = checkScaleSizeTable(scale_cnt, scale_tbl, org_cnt, org_tbl);
   10671     if(mNeedScaleCnt <= 0){
   10672         ALOGE("%s: do not have picture sizes need scaling.", __func__);
   10673         return BAD_VALUE;
   10674     }
   10675 
   10676     if(mNeedScaleCnt + org_cnt > MAX_SIZES_CNT){
   10677         ALOGE("%s: picture size list exceed the max count.", __func__);
   10678         return BAD_VALUE;
   10679     }
   10680 
   10681     //get the total picture size table
   10682     mTotalSizeTblCnt = mNeedScaleCnt + org_cnt;
   10683 
   10684     if (mNeedScaleCnt > MAX_SCALE_SIZES_CNT) {
   10685         ALOGE("%s: Error!! mNeedScaleCnt (%d) is more than MAX_SCALE_SIZES_CNT",
   10686                 __func__, mNeedScaleCnt);
   10687         return BAD_VALUE;
   10688     }
   10689 
   10690     for(i = 0; i < mNeedScaleCnt; i++){
   10691         mTotalSizeTbl[i].width = mNeedScaledSizeTbl[i].width;
   10692         mTotalSizeTbl[i].height = mNeedScaledSizeTbl[i].height;
   10693         CDBG_HIGH("%s: scale picture size: i =%d, width=%d, height=%d.", __func__,
   10694             i, mTotalSizeTbl[i].width, mTotalSizeTbl[i].height);
   10695     }
   10696     for(; i < mTotalSizeTblCnt; i++){
   10697         mTotalSizeTbl[i].width = org_tbl[i-mNeedScaleCnt].width;
   10698         mTotalSizeTbl[i].height = org_tbl[i-mNeedScaleCnt].height;
   10699         CDBG_HIGH("%s: sensor supportted picture size: i =%d, width=%d, height=%d.", __func__,
   10700             i, mTotalSizeTbl[i].width, mTotalSizeTbl[i].height);
   10701     }
   10702     return rc;
   10703 }
   10704 
   10705 /*===========================================================================
   10706  * FUNCTION   : getScaledSizeTblCnt
   10707  *
   10708  * DESCRIPTION: get picture size cnt that need scale
   10709  *
   10710  * PARAMETERS : none
   10711  *
   10712  * RETURN     : uint8_t type of picture size count
   10713  *==========================================================================*/
   10714 size_t QCameraReprocScaleParam::getScaleSizeTblCnt()
   10715 {
   10716     return mNeedScaleCnt;
   10717 }
   10718 
   10719 /*===========================================================================
   10720  * FUNCTION   : getScaledSizeTbl
   10721  *
   10722  * DESCRIPTION: get picture size table that need scale
   10723  *
   10724  * PARAMETERS :  none
   10725  *
   10726  * RETURN     : cam_dimension_t list of picture size table
   10727  *==========================================================================*/
   10728 cam_dimension_t *QCameraReprocScaleParam::getScaledSizeTbl()
   10729 {
   10730     if(!mScaleEnabled)
   10731         return NULL;
   10732 
   10733     return mNeedScaledSizeTbl;
   10734 }
   10735 
   10736 /*===========================================================================
   10737  * FUNCTION   : setScaleEnable
   10738  *
   10739  * DESCRIPTION: enable or disable Reproc Scale
   10740  *
   10741  * PARAMETERS :
   10742  *   @enabled : enable: 1; disable 0
   10743  *
   10744  * RETURN     : none
   10745  *==========================================================================*/
   10746 void QCameraReprocScaleParam::setScaleEnable(bool enabled)
   10747 {
   10748     mScaleEnabled = enabled;
   10749 }
   10750 
   10751 /*===========================================================================
   10752  * FUNCTION   : isScaleEnabled
   10753  *
   10754  * DESCRIPTION: check if Reproc Scale is enabled
   10755  *
   10756  * PARAMETERS :  none
   10757  *
   10758  * RETURN     : bool type of status
   10759  *==========================================================================*/
   10760 bool QCameraReprocScaleParam::isScaleEnabled()
   10761 {
   10762     return mScaleEnabled;
   10763 }
   10764 
   10765 /*===========================================================================
   10766  * FUNCTION   : isScalePicSize
   10767  *
   10768  * DESCRIPTION: check if current picture size is from Scale Table
   10769  *
   10770  * PARAMETERS :
   10771  *   @width     : current picture width
   10772  *   @height    : current picture height
   10773  *
   10774  * RETURN     : bool type of status
   10775  *==========================================================================*/
   10776 bool QCameraReprocScaleParam::isScalePicSize(int width, int height)
   10777 {
   10778     //Check if the picture size is in scale table
   10779     if(mNeedScaleCnt <= 0)
   10780         return FALSE;
   10781 
   10782     for (size_t i = 0; i < mNeedScaleCnt; i++) {
   10783         if ((mNeedScaledSizeTbl[i].width == width) && (mNeedScaledSizeTbl[i].height == height)) {
   10784             //found match
   10785             return TRUE;
   10786         }
   10787     }
   10788 
   10789     ALOGE("%s: Not in scale picture size table.", __func__);
   10790     return FALSE;
   10791 }
   10792 
   10793 /*===========================================================================
   10794  * FUNCTION   : isValidatePicSize
   10795  *
   10796  * DESCRIPTION: check if current picture size is validate
   10797  *
   10798  * PARAMETERS :
   10799  *   @width     : current picture width
   10800  *   @height    : current picture height
   10801  *
   10802  * RETURN     : bool type of status
   10803  *==========================================================================*/
   10804 bool QCameraReprocScaleParam::isValidatePicSize(int width, int height)
   10805 {
   10806     size_t i = 0;
   10807 
   10808     for(i = 0; i < mSensorSizeTblCnt; i++){
   10809         if(mSensorSizeTbl[i].width == width
   10810             && mSensorSizeTbl[i].height== height){
   10811             return TRUE;
   10812         }
   10813     }
   10814 
   10815     for(i = 0; i < mNeedScaleCnt; i++){
   10816         if(mNeedScaledSizeTbl[i].width == width
   10817             && mNeedScaledSizeTbl[i].height== height){
   10818             return TRUE;
   10819         }
   10820     }
   10821 
   10822     ALOGE("%s: Invalidate input picture size.", __func__);
   10823     return FALSE;
   10824 }
   10825 
   10826 /*===========================================================================
   10827  * FUNCTION   : setSensorSupportedPicSize
   10828  *
   10829  * DESCRIPTION: set sensor supported picture size.
   10830  *    For Snapshot stream size configuration, we need use sensor supported size.
   10831  *    We will use CPP to do Scaling based on output Snapshot stream.
   10832  *
   10833  * PARAMETERS : none
   10834  *
   10835  * RETURN     : int32_t type of status
   10836  *              NO_ERROR  -- success
   10837  *              none-zero failure code
   10838  *==========================================================================*/
   10839 int32_t QCameraReprocScaleParam::setSensorSupportedPicSize()
   10840 {
   10841     //will find a suitable picture size (here we leave a prossibility to add other scale requirement)
   10842     //Currently we only focus on upscaling, and checkScaleSizeTable() has guaranteed the dimension ratio.
   10843 
   10844     if(!mIsUnderScaling || mSensorSizeTblCnt <= 0)
   10845         return BAD_VALUE;
   10846 
   10847     //We just get the max sensor supported size here.
   10848     mPicSizeSetted.width = mSensorSizeTbl[0].width;
   10849     mPicSizeSetted.height = mSensorSizeTbl[0].height;
   10850 
   10851     return NO_ERROR;
   10852 }
   10853 
   10854 
   10855 /*===========================================================================
   10856  * FUNCTION   : setValidatePicSize
   10857  *
   10858  * DESCRIPTION: set sensor supported size and change scale status.
   10859  *
   10860  * PARAMETERS :
   10861  *   @width    : input picture width
   10862  *   @height   : input picture height
   10863  *
   10864  * RETURN     : int32_t type of status
   10865  *              NO_ERROR  -- success
   10866  *              none-zero failure code
   10867  *==========================================================================*/
   10868 int32_t QCameraReprocScaleParam::setValidatePicSize(int &width,int &height)
   10869 {
   10870     if(!mScaleEnabled)
   10871         return BAD_VALUE;
   10872 
   10873     mIsUnderScaling = FALSE; //default: not under scale
   10874 
   10875     if(isScalePicSize(width, height)){
   10876         // input picture size need scaling operation. Record size from APK and setted
   10877         mIsUnderScaling = TRUE;
   10878         mPicSizeFromAPK.width = width;
   10879         mPicSizeFromAPK.height = height;
   10880 
   10881         if(setSensorSupportedPicSize() != NO_ERROR)
   10882             return BAD_VALUE;
   10883 
   10884         //re-set picture size to sensor supported size
   10885         width = mPicSizeSetted.width;
   10886         height = mPicSizeSetted.height;
   10887         CDBG_HIGH("%s: mPicSizeFromAPK- with=%d, height=%d, mPicSizeSetted- with =%d, height=%d.",
   10888             __func__, mPicSizeFromAPK.width, mPicSizeFromAPK.height, mPicSizeSetted.width, mPicSizeSetted.height);
   10889     }else{
   10890         mIsUnderScaling = FALSE;
   10891         //no scale is needed for input picture size
   10892         if(!isValidatePicSize(width, height)){
   10893             ALOGE("%s: invalidate input picture size.", __func__);
   10894             return BAD_VALUE;
   10895         }
   10896         mPicSizeSetted.width = width;
   10897         mPicSizeSetted.height = height;
   10898     }
   10899 
   10900     CDBG_HIGH("%s: X. mIsUnderScaling=%d, width=%d, height=%d.", __func__, mIsUnderScaling, width, height);
   10901     return NO_ERROR;
   10902 }
   10903 
   10904 /*===========================================================================
   10905  * FUNCTION   : getPicSizeFromAPK
   10906  *
   10907  * DESCRIPTION: get picture size that get from APK
   10908  *
   10909  * PARAMETERS :
   10910  *   @width     : input width
   10911  *   @height    : input height
   10912  *
   10913  * RETURN     : int32_t type of status
   10914  *              NO_ERROR  -- success
   10915  *              none-zero failure code
   10916  *==========================================================================*/
   10917 int32_t QCameraReprocScaleParam::getPicSizeFromAPK(int &width, int &height)
   10918 {
   10919     if(!mIsUnderScaling)
   10920         return BAD_VALUE;
   10921 
   10922     width = mPicSizeFromAPK.width;
   10923     height = mPicSizeFromAPK.height;
   10924     return NO_ERROR;
   10925 }
   10926 
   10927 /*===========================================================================
   10928  * FUNCTION   : getPicSizeSetted
   10929  *
   10930  * DESCRIPTION: get picture size that setted into mm-camera
   10931  *
   10932  * PARAMETERS :
   10933  *   @width     : input width
   10934  *   @height    : input height
   10935  *
   10936  * RETURN     : int32_t type of status
   10937  *              NO_ERROR  -- success
   10938  *              none-zero failure code
   10939  *==========================================================================*/
   10940 int32_t QCameraReprocScaleParam::getPicSizeSetted(int &width, int &height)
   10941 {
   10942     width = mPicSizeSetted.width;
   10943     height = mPicSizeSetted.height;
   10944     return NO_ERROR;
   10945 }
   10946 
   10947 /*===========================================================================
   10948  * FUNCTION   : isUnderScaling
   10949  *
   10950  * DESCRIPTION: check if we are in Reproc Scaling requirment
   10951  *
   10952  * PARAMETERS :  none
   10953  *
   10954  * RETURN     : bool type of status
   10955  *==========================================================================*/
   10956 bool QCameraReprocScaleParam::isUnderScaling()
   10957 {
   10958     return mIsUnderScaling;
   10959 }
   10960 
   10961 /*===========================================================================
   10962  * FUNCTION   : checkScaleSizeTable
   10963  *
   10964  * DESCRIPTION: check PICTURE_SIZE_NEED_SCALE to choose
   10965  *
   10966  * PARAMETERS :
   10967  *   @scale_cnt   : count of picture sizes that want scale
   10968  *   @scale_tbl    : picture size table that want scale
   10969  *   @org_cnt     : sensor supported picture size count
   10970  *   @org_tbl      : sensor supported picture size table
   10971  *
   10972  * RETURN     : bool type of status
   10973  *==========================================================================*/
   10974 size_t QCameraReprocScaleParam::checkScaleSizeTable(size_t scale_cnt,
   10975         cam_dimension_t *scale_tbl, size_t org_cnt, cam_dimension_t *org_tbl)
   10976 {
   10977     size_t stbl_cnt = 0;
   10978     size_t temp_cnt = 0;
   10979     ssize_t i = 0;
   10980     if(scale_cnt <=0 || scale_tbl == NULL || org_tbl == NULL || org_cnt <= 0)
   10981         return stbl_cnt;
   10982 
   10983     //get validate scale size table. Currently we only support:
   10984     // 1. upscale. The scale size must larger than max sensor supported size
   10985     // 2. Scale dimension ratio must be same as the max sensor supported size.
   10986     temp_cnt = scale_cnt;
   10987     for (i = (ssize_t)(scale_cnt - 1); i >= 0; i--) {
   10988         if (scale_tbl[i].width > org_tbl[0].width ||
   10989                 (scale_tbl[i].width == org_tbl[0].width &&
   10990                     scale_tbl[i].height > org_tbl[0].height)) {
   10991             //get the smallest scale size
   10992             break;
   10993         }
   10994         temp_cnt--;
   10995     }
   10996 
   10997     //check dimension ratio
   10998     double supported_ratio = (double)org_tbl[0].width / (double)org_tbl[0].height;
   10999     for (i = 0; i < (ssize_t)temp_cnt; i++) {
   11000         double cur_ratio = (double)scale_tbl[i].width / (double)scale_tbl[i].height;
   11001         if (fabs(supported_ratio - cur_ratio) > ASPECT_TOLERANCE) {
   11002             continue;
   11003         }
   11004         mNeedScaledSizeTbl[stbl_cnt].width = scale_tbl[i].width;
   11005         mNeedScaledSizeTbl[stbl_cnt].height= scale_tbl[i].height;
   11006         stbl_cnt++;
   11007     }
   11008 
   11009     return stbl_cnt;
   11010 }
   11011 
   11012 /*===========================================================================
   11013  * FUNCTION   : getTotalSizeTblCnt
   11014  *
   11015  * DESCRIPTION: get total picture size count after adding dimensions that need scaling
   11016  *
   11017  * PARAMETERS : none
   11018  *
   11019  * RETURN     : uint8_t type of picture size count
   11020  *==========================================================================*/
   11021 size_t QCameraReprocScaleParam::getTotalSizeTblCnt()
   11022 {
   11023     return mTotalSizeTblCnt;
   11024 }
   11025 
   11026 /*===========================================================================
   11027  * FUNCTION   : getTotalSizeTbl
   11028  *
   11029  * DESCRIPTION: get picture size table after adding dimensions that need scaling
   11030  *
   11031  * PARAMETERS :  none
   11032  *
   11033  * RETURN     : cam_dimension_t list of picture size table
   11034  *==========================================================================*/
   11035 cam_dimension_t *QCameraReprocScaleParam::getTotalSizeTbl()
   11036 {
   11037     if(!mScaleEnabled)
   11038         return NULL;
   11039 
   11040     return mTotalSizeTbl;
   11041 }
   11042 
   11043 /*===========================================================================
   11044  * FUNCTION   : isHDREnabled
   11045  *
   11046  * DESCRIPTION: if HDR is enabled
   11047  *
   11048  * PARAMETERS : none
   11049  *
   11050  * RETURN     : true: needed
   11051  *              false: no need
   11052  *==========================================================================*/
   11053 bool QCameraParameters::isHDREnabled()
   11054 {
   11055     return ((m_nBurstNum == 1) && (m_bHDREnabled || m_HDRSceneEnabled));
   11056 }
   11057 
   11058 /*===========================================================================
   11059  * FUNCTION   : isAVTimerEnabled
   11060  *
   11061  * DESCRIPTION: if AVTimer is enabled
   11062  *
   11063  * PARAMETERS : none
   11064  *
   11065  * RETURN     : true: needed
   11066  *              false: no need
   11067  *==========================================================================*/
   11068 bool QCameraParameters::isAVTimerEnabled()
   11069 {
   11070     return m_bAVTimerEnabled;
   11071 }
   11072 
   11073 /*===========================================================================
   11074 * FUNCTION   : isDISEnabled
   11075 *
   11076 * DESCRIPTION: if DIS is enabled
   11077 *
   11078 * PARAMETERS : none
   11079 *
   11080 * RETURN    : true: needed
   11081 *               false: no need
   11082 *==========================================================================*/
   11083 bool QCameraParameters::isDISEnabled()
   11084 {
   11085     return m_bDISEnabled;
   11086 }
   11087 
   11088 /*===========================================================================
   11089 * FUNCTION   : getISType
   11090 *
   11091 * DESCRIPTION: returns IS type
   11092 *
   11093 * PARAMETERS : none
   11094 *
   11095 * RETURN     : IS type
   11096 *
   11097 *==========================================================================*/
   11098 cam_is_type_t QCameraParameters::getISType()
   11099 {
   11100     return mIsType;
   11101 }
   11102 
   11103 /*===========================================================================
   11104  * FUNCTION   : MobicatMask
   11105  *
   11106  * DESCRIPTION: returns mobicat mask
   11107  *
   11108  * PARAMETERS : none
   11109  *
   11110  * RETURN     : mobicat mask
   11111  *
   11112  *==========================================================================*/
   11113 uint8_t QCameraParameters::getMobicatMask()
   11114 {
   11115     return m_MobiMask;
   11116 }
   11117 
   11118 /*===========================================================================
   11119  * FUNCTION   : sendStreamConfigInfo
   11120  *
   11121  * DESCRIPTION: send Stream config info.
   11122  *
   11123  * PARAMETERS :
   11124  *   @stream_config_info: Stream config information
   11125  *
   11126  * RETURN     : int32_t type of status
   11127  *              NO_ERROR  -- success
   11128  *              none-zero failure code
   11129  *==========================================================================*/
   11130 bool QCameraParameters::sendStreamConfigInfo(cam_stream_size_info_t &stream_config_info) {
   11131     int32_t rc = NO_ERROR;
   11132     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   11133         ALOGE("%s:Failed to initialize group update table", __func__);
   11134         return BAD_TYPE;
   11135     }
   11136 
   11137     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   11138             CAM_INTF_META_STREAM_INFO, stream_config_info)) {
   11139         ALOGE("%s:Failed to update table", __func__);
   11140         return BAD_VALUE;
   11141     }
   11142 
   11143     rc = commitSetBatch();
   11144     if (rc != NO_ERROR) {
   11145         ALOGE("%s:Failed to set stream info parm", __func__);
   11146         return rc;
   11147     }
   11148 
   11149     return rc;
   11150 }
   11151 
   11152 /*===========================================================================
   11153  * FUNCTION   : setStreamConfigure
   11154  *
   11155  * DESCRIPTION: set stream type, stream dimension for all configured streams.
   11156  *
   11157  * PARAMETERS :
   11158  *   @isCapture: Whether this configureation is for an image capture
   11159  *   @previewAsPostview: Use preview as postview
   11160  *
   11161  * RETURN     : int32_t type of status
   11162  *              NO_ERROR  -- success
   11163  *              none-zero failure code
   11164  *==========================================================================*/
   11165 bool QCameraParameters::setStreamConfigure(bool isCapture,
   11166         bool previewAsPostview, bool resetConfig) {
   11167 
   11168     int32_t rc = NO_ERROR;
   11169     cam_stream_size_info_t stream_config_info;
   11170     char value[PROPERTY_VALUE_MAX];
   11171     bool raw_yuv = false;
   11172     bool raw_capture = false;
   11173 
   11174     if ( m_pParamBuf == NULL ) {
   11175         return NO_INIT;
   11176     }
   11177 
   11178     memset(&stream_config_info, 0, sizeof(stream_config_info));
   11179     stream_config_info.num_streams = 0;
   11180 
   11181     if (m_bStreamsConfigured) {
   11182         CDBG_HIGH("%s: Reset stream config!!", __func__);
   11183         rc = sendStreamConfigInfo(stream_config_info);
   11184         m_bStreamsConfigured = false;
   11185     }
   11186     if (resetConfig) {
   11187         CDBG_HIGH("%s: Done Resetting stream config!!", __func__);
   11188         return rc;
   11189     }
   11190 
   11191     property_get("persist.camera.raw_yuv", value, "0");
   11192     raw_yuv = atoi(value) > 0 ? true : false;
   11193 
   11194     if (isZSLMode() && getRecordingHintValue() != true) {
   11195         stream_config_info.type[stream_config_info.num_streams] =
   11196             CAM_STREAM_TYPE_PREVIEW;
   11197         getStreamDimension(CAM_STREAM_TYPE_PREVIEW,
   11198                 stream_config_info.stream_sizes[stream_config_info.num_streams]);
   11199         updatePpFeatureMask(CAM_STREAM_TYPE_PREVIEW);
   11200         stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   11201                 mStreamPpMask[CAM_STREAM_TYPE_PREVIEW];
   11202         stream_config_info.num_streams++;
   11203 
   11204         stream_config_info.type[stream_config_info.num_streams] =
   11205                 CAM_STREAM_TYPE_ANALYSIS;
   11206         getStreamDimension(CAM_STREAM_TYPE_ANALYSIS,
   11207                 stream_config_info.stream_sizes[stream_config_info.num_streams]);
   11208         updatePpFeatureMask(CAM_STREAM_TYPE_ANALYSIS);
   11209         stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   11210                 mStreamPpMask[CAM_STREAM_TYPE_ANALYSIS];
   11211         stream_config_info.num_streams++;
   11212 
   11213         stream_config_info.type[stream_config_info.num_streams] =
   11214                 CAM_STREAM_TYPE_SNAPSHOT;
   11215         getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,
   11216                 stream_config_info.stream_sizes[stream_config_info.num_streams]);
   11217         updatePpFeatureMask(CAM_STREAM_TYPE_SNAPSHOT);
   11218         stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   11219                 mStreamPpMask[CAM_STREAM_TYPE_SNAPSHOT];
   11220         stream_config_info.num_streams++;
   11221 
   11222     } else if (!isCapture) {
   11223         if (m_bRecordingHint) {
   11224             if (m_bDISEnabled) {
   11225                 char value[PROPERTY_VALUE_MAX];
   11226                 // Make default value for IS_TYPE as IS_TYPE_EIS_2_0
   11227                 property_get("persist.camera.is_type", value, "4");
   11228                 mIsType = static_cast<cam_is_type_t>(atoi(value));
   11229             } else {
   11230                 mIsType = IS_TYPE_NONE;
   11231             }
   11232             stream_config_info.is_type = mIsType;
   11233             stream_config_info.type[stream_config_info.num_streams] =
   11234                     CAM_STREAM_TYPE_SNAPSHOT;
   11235             getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,
   11236                     stream_config_info.stream_sizes[stream_config_info.num_streams]);
   11237             updatePpFeatureMask(CAM_STREAM_TYPE_SNAPSHOT);
   11238             stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   11239                     mStreamPpMask[CAM_STREAM_TYPE_SNAPSHOT];
   11240             stream_config_info.num_streams++;
   11241 
   11242             stream_config_info.type[stream_config_info.num_streams] =
   11243                     CAM_STREAM_TYPE_VIDEO;
   11244             getStreamDimension(CAM_STREAM_TYPE_VIDEO,
   11245                     stream_config_info.stream_sizes[stream_config_info.num_streams]);
   11246             updatePpFeatureMask(CAM_STREAM_TYPE_VIDEO);
   11247             stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   11248                     mStreamPpMask[CAM_STREAM_TYPE_VIDEO];
   11249             stream_config_info.num_streams++;
   11250         }
   11251 
   11252         if (getRecordingHintValue() != true) {
   11253             /* Analysis stream is used only in capture usecase */
   11254             stream_config_info.type[stream_config_info.num_streams] =
   11255                     CAM_STREAM_TYPE_ANALYSIS;
   11256             getStreamDimension(CAM_STREAM_TYPE_ANALYSIS,
   11257                     stream_config_info.stream_sizes[stream_config_info.num_streams]);
   11258             updatePpFeatureMask(CAM_STREAM_TYPE_ANALYSIS);
   11259             stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   11260                     mStreamPpMask[CAM_STREAM_TYPE_ANALYSIS];
   11261             stream_config_info.num_streams++;
   11262         }
   11263 
   11264         stream_config_info.type[stream_config_info.num_streams] =
   11265                 CAM_STREAM_TYPE_PREVIEW;
   11266         getStreamDimension(CAM_STREAM_TYPE_PREVIEW,
   11267                 stream_config_info.stream_sizes[stream_config_info.num_streams]);
   11268         updatePpFeatureMask(CAM_STREAM_TYPE_PREVIEW);
   11269         stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   11270                 mStreamPpMask[CAM_STREAM_TYPE_PREVIEW];
   11271         stream_config_info.num_streams++;
   11272 
   11273     } else {
   11274         if (isJpegPictureFormat() || isNV16PictureFormat() || isNV21PictureFormat()) {
   11275             if (!getofflineRAW()) {
   11276                 stream_config_info.type[stream_config_info.num_streams] =
   11277                         CAM_STREAM_TYPE_SNAPSHOT;
   11278                 getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,
   11279                         stream_config_info.stream_sizes[stream_config_info.num_streams]);
   11280                 updatePpFeatureMask(CAM_STREAM_TYPE_SNAPSHOT);
   11281                 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   11282                         mStreamPpMask[CAM_STREAM_TYPE_SNAPSHOT];
   11283                 stream_config_info.num_streams++;
   11284             }
   11285 
   11286             if (previewAsPostview) {
   11287                 stream_config_info.type[stream_config_info.num_streams] =
   11288                         CAM_STREAM_TYPE_PREVIEW;
   11289                 getStreamDimension(CAM_STREAM_TYPE_PREVIEW,
   11290                         stream_config_info.stream_sizes[stream_config_info.num_streams]);
   11291                 updatePpFeatureMask(CAM_STREAM_TYPE_PREVIEW);
   11292                 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   11293                         mStreamPpMask[CAM_STREAM_TYPE_PREVIEW];
   11294                 stream_config_info.num_streams++;
   11295             } else {
   11296                 stream_config_info.type[stream_config_info.num_streams] =
   11297                         CAM_STREAM_TYPE_POSTVIEW;
   11298                 getStreamDimension(CAM_STREAM_TYPE_POSTVIEW,
   11299                         stream_config_info.stream_sizes[stream_config_info.num_streams]);
   11300                 updatePpFeatureMask(CAM_STREAM_TYPE_POSTVIEW);
   11301                 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   11302                         mStreamPpMask[CAM_STREAM_TYPE_POSTVIEW];
   11303                 stream_config_info.num_streams++;
   11304             }
   11305         } else {
   11306             raw_capture = true;
   11307             stream_config_info.type[stream_config_info.num_streams] =
   11308                     CAM_STREAM_TYPE_RAW;
   11309             getStreamDimension(CAM_STREAM_TYPE_RAW,
   11310                     stream_config_info.stream_sizes[stream_config_info.num_streams]);
   11311             updatePpFeatureMask(CAM_STREAM_TYPE_RAW);
   11312             stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   11313                     mStreamPpMask[CAM_STREAM_TYPE_RAW];
   11314             stream_config_info.num_streams++;
   11315         }
   11316     }
   11317     if (raw_yuv && !raw_capture && (isZSLMode() ||
   11318             (getofflineRAW() && isCapture && !getRecordingHintValue()))) {
   11319         cam_dimension_t max_dim = {0,0};
   11320         updateRAW(max_dim);
   11321         stream_config_info.type[stream_config_info.num_streams] =
   11322                 CAM_STREAM_TYPE_RAW;
   11323         getStreamDimension(CAM_STREAM_TYPE_RAW,
   11324                 stream_config_info.stream_sizes[stream_config_info.num_streams]);
   11325         updatePpFeatureMask(CAM_STREAM_TYPE_RAW);
   11326         stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   11327                 mStreamPpMask[CAM_STREAM_TYPE_RAW];
   11328         stream_config_info.num_streams++;
   11329     }
   11330     for (uint32_t k = 0; k < stream_config_info.num_streams; k++) {
   11331         ALOGI("%s: stream type %d, w x h: %d x %d, pp_mask: 0x%x", __func__,
   11332                 stream_config_info.type[k],
   11333                 stream_config_info.stream_sizes[k].width,
   11334                 stream_config_info.stream_sizes[k].height,
   11335                 stream_config_info.postprocess_mask[k]);
   11336     }
   11337 
   11338     rc = sendStreamConfigInfo(stream_config_info);
   11339     m_bStreamsConfigured = true;
   11340 
   11341     return rc;
   11342 }
   11343 
   11344 /*===========================================================================
   11345  * FUNCTION   : addOnlineRotation
   11346  *
   11347  * DESCRIPTION: send additional rotation information for specific stream
   11348  *
   11349  * PARAMETERS :
   11350  *   @rotation: rotation
   11351  *   @streamId: internal stream id
   11352  *   @device_rotation: device rotation
   11353  *
   11354  * RETURN     : int32_t type of status
   11355  *              NO_ERROR  -- success
   11356  *              none-zero failure code
   11357  *==========================================================================*/
   11358 int32_t QCameraParameters::addOnlineRotation(uint32_t rotation, uint32_t streamId,
   11359         int32_t device_rotation)
   11360 {
   11361     int32_t rc = NO_ERROR;
   11362     cam_rotation_info_t rotation_info;
   11363     memset(&rotation_info, 0, sizeof(cam_rotation_info_t));
   11364 
   11365     /* Add jpeg rotation information */
   11366     if (rotation == 0) {
   11367         rotation_info.rotation = ROTATE_0;
   11368     } else if (rotation == 90) {
   11369         rotation_info.rotation = ROTATE_90;
   11370     } else if (rotation == 180) {
   11371         rotation_info.rotation = ROTATE_180;
   11372     } else if (rotation == 270) {
   11373         rotation_info.rotation = ROTATE_270;
   11374     } else {
   11375         rotation_info.rotation = ROTATE_0;
   11376     }
   11377     rotation_info.streamId = streamId;
   11378 
   11379     /* Add device rotation information */
   11380     if (device_rotation == 0) {
   11381         rotation_info.device_rotation = ROTATE_0;
   11382     } else if (device_rotation == 90) {
   11383         rotation_info.device_rotation = ROTATE_90;
   11384     } else if (device_rotation == 180) {
   11385         rotation_info.device_rotation = ROTATE_180;
   11386     } else if (device_rotation == 270) {
   11387         rotation_info.device_rotation = ROTATE_270;
   11388     } else {
   11389         rotation_info.device_rotation = ROTATE_0;
   11390     }
   11391 
   11392     if(initBatchUpdate(m_pParamBuf) < 0 ) {
   11393         ALOGE("%s:Failed to initialize group update table", __func__);
   11394         return BAD_TYPE;
   11395     }
   11396 
   11397     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ROTATION, rotation_info)) {
   11398         ALOGE("%s:Failed to update table", __func__);
   11399         return BAD_VALUE;
   11400     }
   11401 
   11402     rc = commitSetBatch();
   11403     if (rc != NO_ERROR) {
   11404         ALOGE("%s:Failed to set stream info parm", __func__);
   11405         return rc;
   11406     }
   11407 
   11408     return rc;
   11409 }
   11410 
   11411 /*===========================================================================
   11412  * FUNCTION   : needThumbnailReprocess
   11413  *
   11414  * DESCRIPTION: Check if thumbnail reprocessing is needed
   11415  *
   11416  * PARAMETERS : @pFeatureMask - feature mask
   11417  *
   11418  * RETURN     : true: needed
   11419  *              false: no need
   11420  *==========================================================================*/
   11421 bool QCameraParameters::needThumbnailReprocess(uint32_t *pFeatureMask)
   11422 {
   11423     if (isUbiFocusEnabled() || isChromaFlashEnabled() ||
   11424             isOptiZoomEnabled() || isUbiRefocus() ||
   11425             isStillMoreEnabled()) {
   11426         *pFeatureMask &= ~CAM_QCOM_FEATURE_CHROMA_FLASH;
   11427         *pFeatureMask &= ~CAM_QCOM_FEATURE_UBIFOCUS;
   11428         *pFeatureMask &= ~CAM_QCOM_FEATURE_REFOCUS;
   11429         *pFeatureMask &= ~CAM_QCOM_FEATURE_OPTIZOOM;
   11430         *pFeatureMask &= ~CAM_QCOM_FEATURE_STILLMORE;
   11431         return false;
   11432     } else {
   11433         return true;
   11434     }
   11435 }
   11436 
   11437 /*===========================================================================
   11438  * FUNCTION   : getNumOfExtraBuffersForImageProc
   11439  *
   11440  * DESCRIPTION: get number of extra input buffers needed by image processing
   11441  *
   11442  * PARAMETERS : none
   11443  *
   11444  * RETURN     : number of extra buffers needed by ImageProc;
   11445  *              0 if not ImageProc enabled
   11446  *==========================================================================*/
   11447 uint8_t QCameraParameters::getNumOfExtraBuffersForImageProc()
   11448 {
   11449     int numOfBufs = 0;
   11450 
   11451     if (isUbiRefocus()) {
   11452         return (uint8_t)(m_pCapability->refocus_af_bracketing_need.burst_count - 1);
   11453     } else if (isUbiFocusEnabled()) {
   11454         numOfBufs += m_pCapability->ubifocus_af_bracketing_need.burst_count - 1;
   11455     } else if (m_bOptiZoomOn) {
   11456         numOfBufs += m_pCapability->opti_zoom_settings_need.burst_count - 1;
   11457     } else if (isChromaFlashEnabled()) {
   11458         numOfBufs += m_pCapability->chroma_flash_settings_need.burst_count - 1;
   11459     } else if (isStillMoreEnabled()) {
   11460         if (isSeeMoreEnabled()) {
   11461             m_stillmore_config.burst_count = 1;
   11462         } else if ((m_stillmore_config.burst_count >=
   11463                 m_pCapability->stillmore_settings_need.min_burst_count) &&
   11464                 (m_stillmore_config.burst_count <=
   11465                 m_pCapability->stillmore_settings_need.max_burst_count)) {
   11466             numOfBufs += m_stillmore_config.burst_count - 1;
   11467         } else {
   11468             numOfBufs += m_pCapability->stillmore_settings_need.burst_count - 1;
   11469         }
   11470     }
   11471 
   11472     return (uint8_t)(numOfBufs * getBurstNum());
   11473 }
   11474 
   11475 /*===========================================================================
   11476  * FUNCTION   : getExifBufIndex
   11477  *
   11478  * DESCRIPTION: get index of metadata to be used for EXIF
   11479  *
   11480  * PARAMETERS : @captureIndex - index of current captured frame
   11481  *
   11482  * RETURN     : index of metadata to be used for EXIF
   11483  *==========================================================================*/
   11484 uint32_t QCameraParameters::getExifBufIndex(uint32_t captureIndex)
   11485 {
   11486     uint32_t index = captureIndex;
   11487 
   11488     if (isUbiRefocus()) {
   11489         if (captureIndex < m_pCapability->refocus_af_bracketing_need.burst_count) {
   11490             index = captureIndex;
   11491         } else {
   11492             index = 0;
   11493         }
   11494     } else if (isChromaFlashEnabled()) {
   11495         index = m_pCapability->chroma_flash_settings_need.metadata_index;
   11496     } else if (isHDREnabled()) {
   11497         if (isHDR1xFrameEnabled() && isHDR1xExtraBufferNeeded()) {
   11498             index = m_pCapability->hdr_bracketing_setting.num_frames;
   11499         } else {
   11500             for (index = 0; index < m_pCapability->hdr_bracketing_setting.num_frames; index++) {
   11501                 if (0 == m_pCapability->hdr_bracketing_setting.exp_val.values[index]) {
   11502                     break;
   11503                 }
   11504             }
   11505             if (index == m_pCapability->hdr_bracketing_setting.num_frames) {
   11506                 index = captureIndex;
   11507             }
   11508         }
   11509     }
   11510 
   11511     return index;
   11512 }
   11513 
   11514 /*===========================================================================
   11515  * FUNCTION   : getNumberInBufsForSingleShot
   11516  *
   11517  * DESCRIPTION: get number of input buffers for single shot
   11518  *
   11519  * PARAMETERS : none
   11520  *
   11521  * RETURN     : number of input buffers for single shot
   11522  *==========================================================================*/
   11523 uint32_t QCameraParameters::getNumberInBufsForSingleShot()
   11524 {
   11525     uint32_t numOfBufs = 1;
   11526 
   11527     if (isUbiRefocus()) {
   11528         numOfBufs = m_pCapability->refocus_af_bracketing_need.burst_count;
   11529     } else if (isUbiFocusEnabled()) {
   11530         numOfBufs = m_pCapability->ubifocus_af_bracketing_need.burst_count;
   11531     } else if (m_bOptiZoomOn) {
   11532         numOfBufs = m_pCapability->opti_zoom_settings_need.burst_count;
   11533     } else if (isChromaFlashEnabled()) {
   11534         numOfBufs = m_pCapability->chroma_flash_settings_need.burst_count;
   11535     } else if (isHDREnabled()) {
   11536         numOfBufs = m_pCapability->hdr_bracketing_setting.num_frames;
   11537         if (isHDR1xFrameEnabled() && isHDR1xExtraBufferNeeded()) {
   11538             numOfBufs++;
   11539         }
   11540     } else if (isStillMoreEnabled()) {
   11541         if (isSeeMoreEnabled()) {
   11542             m_stillmore_config.burst_count = 1;
   11543             numOfBufs = m_stillmore_config.burst_count;
   11544         } else if ((m_stillmore_config.burst_count >=
   11545                 m_pCapability->stillmore_settings_need.min_burst_count) &&
   11546                 (m_stillmore_config.burst_count <=
   11547                 m_pCapability->stillmore_settings_need.max_burst_count)) {
   11548             numOfBufs = m_stillmore_config.burst_count;
   11549         } else {
   11550             numOfBufs = m_pCapability->stillmore_settings_need.burst_count;
   11551         }
   11552     }
   11553 
   11554     return numOfBufs;
   11555 }
   11556 
   11557 /*===========================================================================
   11558  * FUNCTION   : getNumberOutBufsForSingleShot
   11559  *
   11560  * DESCRIPTION: get number of output buffers for single shot
   11561  *
   11562  * PARAMETERS : none
   11563  *
   11564  * RETURN     : number of output buffers for single shot
   11565  *==========================================================================*/
   11566 uint32_t QCameraParameters::getNumberOutBufsForSingleShot()
   11567 {
   11568     uint32_t numOfBufs = 1;
   11569 
   11570     if (isUbiRefocus()) {
   11571         numOfBufs = m_pCapability->refocus_af_bracketing_need.output_count;
   11572     } else if (isHDREnabled()) {
   11573         if (isHDR1xFrameEnabled()) {
   11574             numOfBufs++;
   11575         }
   11576     }
   11577 
   11578     return numOfBufs;
   11579 }
   11580 
   11581 /*===========================================================================
   11582  * FUNCTION   : is4k2kVideoResolution
   11583  *
   11584  * DESCRIPTION: if resolution is 4k x 2k or true 4k x 2k
   11585  *
   11586  * PARAMETERS : none
   11587  *
   11588  * RETURN     : true: video resolution is 4k x 2k
   11589  *              false: video resolution is not 4k x 2k
   11590  *==========================================================================*/
   11591 bool QCameraParameters::is4k2kVideoResolution()
   11592 {
   11593    bool enabled = false;
   11594    cam_dimension_t resolution;
   11595    getVideoSize(&resolution.width, &resolution.height);
   11596    if (!(resolution.width < 3840 && resolution.height < 2160)) {
   11597       enabled = true;
   11598    }
   11599 
   11600    return enabled;
   11601 }
   11602 
   11603 /*===========================================================================
   11604  * FUNCTION   : updateDebugLevel
   11605  *
   11606  * DESCRIPTION: send CAM_INTF_PARM_UPDATE_DEBUG_LEVEL to backend
   11607  *
   11608  * PARAMETERS : none
   11609  *
   11610  * RETURN     : NO_ERROR --success
   11611  *              int32_t type of status
   11612  *==========================================================================*/
   11613 int32_t QCameraParameters::updateDebugLevel()
   11614 {
   11615     if ( m_pParamBuf == NULL ) {
   11616         return NO_INIT;
   11617     }
   11618 
   11619     int32_t rc = initBatchUpdate(m_pParamBuf);
   11620     if ( rc != NO_ERROR ) {
   11621         ALOGE("%s:Failed to initialize group update table", __func__);
   11622         return rc;
   11623     }
   11624 
   11625     uint32_t dummyDebugLevel = 0;
   11626     /* The value of dummyDebugLevel is irrelavent. On
   11627      * CAM_INTF_PARM_UPDATE_DEBUG_LEVEL, read debug property */
   11628     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_UPDATE_DEBUG_LEVEL, dummyDebugLevel)) {
   11629         ALOGE("%s: Parameters batch failed",__func__);
   11630         return BAD_VALUE;
   11631     }
   11632 
   11633     rc = commitSetBatch();
   11634     if ( rc != NO_ERROR ) {
   11635         ALOGE("%s:Failed to commit batch parameters", __func__);
   11636         return rc;
   11637     }
   11638 
   11639     return NO_ERROR;
   11640 }
   11641 
   11642 /*===========================================================================
   11643  * FUNCTION   : setOfflineRAW
   11644  *
   11645  * DESCRIPTION: Function to decide Offline RAW feature.
   11646  *
   11647  * PARAMETERS : none
   11648  *
   11649  * RETURN     : none
   11650  *==========================================================================*/
   11651 void QCameraParameters::setOfflineRAW()
   11652 {
   11653    char value[PROPERTY_VALUE_MAX];
   11654    bool raw_yuv = false;
   11655    bool offlineRaw = false;
   11656 
   11657    property_get("persist.camera.raw_yuv", value, "0");
   11658    raw_yuv = atoi(value) > 0 ? true : false;
   11659    property_get("persist.camera.offlineraw", value, "0");
   11660    offlineRaw = atoi(value) > 0 ? true : false;
   11661    if((raw_yuv || isRdiMode()) && offlineRaw){
   11662        mOfflineRAW = true;
   11663    }else{
   11664        mOfflineRAW = false;
   11665    }
   11666    CDBG_HIGH("%s: Offline Raw  %d",__func__, mOfflineRAW);
   11667 }
   11668 
   11669 /*===========================================================================
   11670  * FUNCTION   : updatePpFeatureMask
   11671  *
   11672  * DESCRIPTION: Updates the feature mask for a particular stream depending
   11673  *              on current client configuration.
   11674  *
   11675  * PARAMETERS :
   11676  *  @stream_type: Camera stream type
   11677  *
   11678  * RETURN     : NO_ERROR --success
   11679  *              int32_t type of status
   11680  *==========================================================================*/
   11681 int32_t QCameraParameters::updatePpFeatureMask(cam_stream_type_t stream_type) {
   11682 
   11683     uint32_t feature_mask = 0;
   11684 
   11685     if (stream_type >= CAM_STREAM_TYPE_MAX) {
   11686         ALOGE("%s: Error!! stream type: %d not valid", __func__, stream_type);
   11687         return -1;
   11688     }
   11689 
   11690     // Update feature mask for SeeMore in video and video preview
   11691     if (isSeeMoreEnabled() &&
   11692             !is4k2kVideoResolution() &&
   11693             ((stream_type == CAM_STREAM_TYPE_VIDEO) ||
   11694             (stream_type == CAM_STREAM_TYPE_PREVIEW && getRecordingHintValue()))) {
   11695        feature_mask |= CAM_QCOM_FEATURE_LLVD;
   11696     }
   11697 
   11698     // Do not enable feature mask for ZSL/non-ZSL/liveshot snapshot except for 4K2k case
   11699     if ((getRecordingHintValue() &&
   11700             (stream_type == CAM_STREAM_TYPE_SNAPSHOT) && is4k2kVideoResolution()) ||
   11701             (stream_type != CAM_STREAM_TYPE_SNAPSHOT)) {
   11702         if ((m_nMinRequiredPpMask & CAM_QCOM_FEATURE_SHARPNESS) &&
   11703                 !isOptiZoomEnabled()) {
   11704             feature_mask |= CAM_QCOM_FEATURE_SHARPNESS;
   11705         }
   11706 
   11707         if (m_nMinRequiredPpMask & CAM_QCOM_FEATURE_EFFECT) {
   11708             feature_mask |= CAM_QCOM_FEATURE_EFFECT;
   11709         }
   11710         if (isWNREnabled() && (getRecordingHintValue() == false)) {
   11711             feature_mask |= CAM_QCOM_FEATURE_DENOISE2D;
   11712         }
   11713 
   11714         //Set flip mode based on Stream type;
   11715         int flipMode = getFlipMode(stream_type);
   11716         if (flipMode > 0) {
   11717             feature_mask |= CAM_QCOM_FEATURE_FLIP;
   11718         }
   11719     }
   11720 
   11721     if ((isTNRVideoEnabled() && (CAM_STREAM_TYPE_VIDEO == stream_type))
   11722             || (isTNRPreviewEnabled() && (CAM_STREAM_TYPE_PREVIEW == stream_type))) {
   11723         feature_mask |= CAM_QCOM_FEATURE_CPP_TNR;
   11724     }
   11725 
   11726     //Rotation could also have an effect on pp feature mask
   11727     cam_pp_feature_config_t config;
   11728     cam_dimension_t dim;
   11729     memset(&config, 0, sizeof(cam_pp_feature_config_t));
   11730     getStreamRotation(stream_type, config, dim);
   11731     feature_mask |= config.feature_mask;
   11732 
   11733     // Store stream feature mask
   11734     setStreamPpMask(stream_type, feature_mask);
   11735     CDBG_HIGH("%s: stream type: %d, pp_mask: 0x%x", __func__, stream_type, feature_mask);
   11736 
   11737     return NO_ERROR;
   11738 }
   11739 
   11740 /*===========================================================================
   11741  * FUNCTION   : setStreamPpMask
   11742  *
   11743  * DESCRIPTION: Stores a particular feature mask for a given camera stream
   11744  *
   11745  * PARAMETERS :
   11746  *  @stream_type: Camera stream type
   11747  *  @pp_mask  : Feature mask
   11748  *
   11749  * RETURN     : NO_ERROR --success
   11750  *              int32_t type of status
   11751  *==========================================================================*/
   11752 int32_t QCameraParameters::setStreamPpMask(cam_stream_type_t stream_type,
   11753         uint32_t pp_mask) {
   11754 
   11755     if(stream_type >= CAM_STREAM_TYPE_MAX) {
   11756         return BAD_TYPE;
   11757     }
   11758 
   11759     mStreamPpMask[stream_type] = pp_mask;
   11760     return NO_ERROR;
   11761 }
   11762 
   11763 /*===========================================================================
   11764  * FUNCTION   : getStreamPpMask
   11765  *
   11766  * DESCRIPTION: Retrieves the feature mask for a given camera stream
   11767  *
   11768  * PARAMETERS :
   11769  *  @stream_type: Camera stream type
   11770  *  @pp_mask  : Feature mask
   11771  *
   11772  * RETURN     : NO_ERROR --success
   11773  *              int32_t type of status
   11774  *==========================================================================*/
   11775 int32_t QCameraParameters::getStreamPpMask(cam_stream_type_t stream_type,
   11776         uint32_t &pp_mask) {
   11777 
   11778     if(stream_type >= CAM_STREAM_TYPE_MAX) {
   11779         return BAD_TYPE;
   11780     }
   11781 
   11782     pp_mask = mStreamPpMask[stream_type];
   11783     return NO_ERROR;
   11784 }
   11785 
   11786 /*===========================================================================
   11787  * FUNCTION   : setReprocCount
   11788  *
   11789  * DESCRIPTION: Set total reprocessing pass count
   11790  *
   11791  * PARAMETERS : none
   11792  *
   11793  * RETURN     : None
   11794  *==========================================================================*/
   11795 void QCameraParameters::setReprocCount()
   11796 {
   11797     mTotalPPCount = 1; //Default reprocessing Pass count
   11798     char value[PROPERTY_VALUE_MAX];
   11799     int multpass = 0;
   11800 
   11801     property_get("persist.camera.multi_pass", value, "0");
   11802     multpass = atoi(value);
   11803 
   11804    if ( multpass == 0 ) {
   11805        return;
   11806    }
   11807 
   11808     if ((getZoomLevel() != 0) && (isZSLMode())) {
   11809         ALOGW("Zoom Present. Need 2nd pass for post processing");
   11810         mTotalPPCount++;
   11811     }
   11812 }
   11813 
   11814 /*===========================================================================
   11815  * FUNCTION   : setBufBatchCount
   11816  *
   11817  * DESCRIPTION: Function to configure batch buffer
   11818  *
   11819  * PARAMETERS : int8_t buf_cnt
   11820  *                     Buffer batch count
   11821  *
   11822  * RETURN     :  None
   11823  *==========================================================================*/
   11824 void QCameraParameters::setBufBatchCount(int8_t buf_cnt)
   11825 {
   11826     mBufBatchCnt = 0;
   11827     char value[PROPERTY_VALUE_MAX];
   11828     int8_t count = 0;
   11829 
   11830     property_get("persist.camera.batchcount", value, "0");
   11831     count = atoi(value);
   11832 
   11833     if (!(count != 0 || buf_cnt > CAMERA_MIN_BATCH_COUNT)) {
   11834         CDBG_HIGH("%s : Buffer batch count = %d", __func__, mBufBatchCnt);
   11835         return;
   11836     }
   11837 
   11838     while((m_pCapability->max_batch_bufs_supported != 0)
   11839             && (m_pCapability->max_batch_bufs_supported < buf_cnt)) {
   11840         buf_cnt = buf_cnt / 2;
   11841     }
   11842 
   11843     if (count > 0) {
   11844         mBufBatchCnt = count;
   11845         CDBG_HIGH("%s : Buffer batch count = %d", __func__, mBufBatchCnt);
   11846         return;
   11847     }
   11848 
   11849     if (buf_cnt > CAMERA_MIN_BATCH_COUNT) {
   11850         mBufBatchCnt = buf_cnt;
   11851         CDBG_HIGH("%s : Buffer batch count = %d", __func__, mBufBatchCnt);
   11852         return;
   11853     }
   11854 }
   11855 
   11856 /*===========================================================================
   11857  * FUNCTION   : dump
   11858  *
   11859  * DESCRIPTION: Composes a string based on current configuration
   11860  *
   11861  * PARAMETERS : none
   11862  *
   11863  * RETURN     : Formatted string
   11864  *==========================================================================*/
   11865 String8 QCameraParameters::dump()
   11866 {
   11867     String8 str("\n");
   11868     char s[128];
   11869 
   11870     snprintf(s, 128, "Preview Pixel Fmt: %d\n", getPreviewHalPixelFormat());
   11871     str += s;
   11872 
   11873     snprintf(s, 128, "ZSL Burst Interval: %d\n", getZSLBurstInterval());
   11874     str += s;
   11875 
   11876     snprintf(s, 128, "ZSL Queue Depth: %d\n", getZSLQueueDepth());
   11877     str += s;
   11878 
   11879     snprintf(s, 128, "ZSL Back Look Count %d\n", getZSLBackLookCount());
   11880     str += s;
   11881 
   11882     snprintf(s, 128, "Max Unmatched Frames In Queue: %d\n",
   11883         getMaxUnmatchedFramesInQueue());
   11884     str += s;
   11885 
   11886     snprintf(s, 128, "Is ZSL Mode: %d\n", isZSLMode());
   11887     str += s;
   11888 
   11889     snprintf(s, 128, "Is No Display Mode: %d\n", isNoDisplayMode());
   11890     str += s;
   11891 
   11892     snprintf(s, 128, "Is WNR Enabled: %d\n", isWNREnabled());
   11893     str += s;
   11894 
   11895     snprintf(s, 128, "isHfrMode: %d\n", isHfrMode());
   11896     str += s;
   11897 
   11898     snprintf(s, 128, "getNumOfSnapshots: %d\n", getNumOfSnapshots());
   11899     str += s;
   11900 
   11901     snprintf(s, 128, "getNumOfExtraHDRInBufsIfNeeded: %d\n",
   11902         getNumOfExtraHDRInBufsIfNeeded());
   11903     str += s;
   11904 
   11905     snprintf(s, 128, "getNumOfExtraHDROutBufsIfNeeded: %d\n",
   11906         getNumOfExtraHDROutBufsIfNeeded());
   11907     str += s;
   11908 
   11909     snprintf(s, 128, "getBurstNum: %d\n", getBurstNum());
   11910     str += s;
   11911 
   11912     snprintf(s, 128, "getRecordingHintValue: %d\n", getRecordingHintValue());
   11913     str += s;
   11914 
   11915     snprintf(s, 128, "getJpegQuality: %u\n", getJpegQuality());
   11916     str += s;
   11917 
   11918     snprintf(s, 128, "getJpegRotation: %u\n", getJpegRotation());
   11919     str += s;
   11920 
   11921     snprintf(s, 128, "isHistogramEnabled: %d\n", isHistogramEnabled());
   11922     str += s;
   11923 
   11924     snprintf(s, 128, "isFaceDetectionEnabled: %d\n", isFaceDetectionEnabled());
   11925     str += s;
   11926 
   11927     snprintf(s, 128, "isHDREnabled: %d\n", isHDREnabled());
   11928     str += s;
   11929 
   11930     snprintf(s, 128, "isAutoHDREnabled: %d\n", isAutoHDREnabled());
   11931     str += s;
   11932 
   11933     snprintf(s, 128, "isAVTimerEnabled: %d\n", isAVTimerEnabled());
   11934     str += s;
   11935 
   11936     snprintf(s, 128, "getFocusMode: %d\n", getFocusMode());
   11937     str += s;
   11938 
   11939     snprintf(s, 128, "isJpegPictureFormat: %d\n", isJpegPictureFormat());
   11940     str += s;
   11941 
   11942     snprintf(s, 128, "isNV16PictureFormat: %d\n", isNV16PictureFormat());
   11943     str += s;
   11944 
   11945     snprintf(s, 128, "isNV21PictureFormat: %d\n", isNV21PictureFormat());
   11946     str += s;
   11947 
   11948     snprintf(s, 128, "isSnapshotFDNeeded: %d\n", isSnapshotFDNeeded());
   11949     str += s;
   11950 
   11951     snprintf(s, 128, "isHDR1xFrameEnabled: %d\n", isHDR1xFrameEnabled());
   11952     str += s;
   11953 
   11954     snprintf(s, 128, "isYUVFrameInfoNeeded: %d\n", isYUVFrameInfoNeeded());
   11955     str += s;
   11956 
   11957     snprintf(s, 128, "isHDR1xExtraBufferNeeded: %d\n",
   11958         isHDR1xExtraBufferNeeded());
   11959     str += s;
   11960 
   11961     snprintf(s, 128, "isHDROutputCropEnabled: %d\n", isHDROutputCropEnabled());
   11962     str += s;
   11963 
   11964     snprintf(s, 128, "isPreviewFlipChanged: %d\n", isPreviewFlipChanged());
   11965     str += s;
   11966 
   11967     snprintf(s, 128, "isVideoFlipChanged: %d\n", isVideoFlipChanged());
   11968     str += s;
   11969 
   11970     snprintf(s, 128, "isSnapshotFlipChanged: %d\n", isSnapshotFlipChanged());
   11971     str += s;
   11972 
   11973     snprintf(s, 128, "isHDRThumbnailProcessNeeded: %d\n",
   11974         isHDRThumbnailProcessNeeded());
   11975     str += s;
   11976 
   11977     snprintf(s, 128, "getAutoFlickerMode: %d\n", getAutoFlickerMode());
   11978     str += s;
   11979 
   11980     snprintf(s, 128, "getNumOfExtraBuffersForImageProc: %d\n",
   11981         getNumOfExtraBuffersForImageProc());
   11982     str += s;
   11983 
   11984     snprintf(s, 128, "isUbiFocusEnabled: %d\n", isUbiFocusEnabled());
   11985     str += s;
   11986 
   11987     snprintf(s, 128, "isChromaFlashEnabled: %d\n", isChromaFlashEnabled());
   11988     str += s;
   11989 
   11990     snprintf(s, 128, "isOptiZoomEnabled: %d\n", isOptiZoomEnabled());
   11991     str += s;
   11992 
   11993     snprintf(s, 128, "isStillMoreEnabled: %d\n", isStillMoreEnabled());
   11994     str += s;
   11995 
   11996     snprintf(s, 128, "getBurstCountForAdvancedCapture: %d\n",
   11997         getBurstCountForAdvancedCapture());
   11998     str += s;
   11999 
   12000     return str;
   12001 }
   12002 
   12003 /*===========================================================================
   12004  * FUNCTION   : getNumOfExtraBuffersForVideo
   12005  *
   12006  * DESCRIPTION: get number of extra buffers needed by image processing
   12007  *
   12008  * PARAMETERS : none
   12009  *
   12010  * RETURN     : number of extra buffers needed by ImageProc;
   12011  *              0 if not ImageProc enabled
   12012  *==========================================================================*/
   12013 uint8_t QCameraParameters::getNumOfExtraBuffersForVideo()
   12014 {
   12015     uint8_t numOfBufs = 0;
   12016 
   12017     if (isSeeMoreEnabled()) {
   12018         numOfBufs = 1;
   12019     }
   12020 
   12021     return numOfBufs;
   12022 }
   12023 
   12024 /*===========================================================================
   12025  * FUNCTION   : getNumOfExtraBuffersForPreview
   12026  *
   12027  * DESCRIPTION: get number of extra buffers needed by image processing
   12028  *
   12029  * PARAMETERS : none
   12030  *
   12031  * RETURN     : number of extra buffers needed by ImageProc;
   12032  *              0 if not ImageProc enabled
   12033  *==========================================================================*/
   12034 uint8_t QCameraParameters::getNumOfExtraBuffersForPreview()
   12035 {
   12036     uint8_t numOfBufs = 0;
   12037 
   12038     if (isSeeMoreEnabled() && !isZSLMode() && getRecordingHintValue()) {
   12039         numOfBufs = 1;
   12040     }
   12041 
   12042     return numOfBufs;
   12043 }
   12044 
   12045 /*===========================================================================
   12046  * FUNCTION   : setToneMapMode
   12047  *
   12048  * DESCRIPTION: enable or disable tone map
   12049  *
   12050  * PARAMETERS :
   12051  *   @enable : enable: 1; disable 0
   12052  *   @initCommit: if configuration list needs to be initialized and commited
   12053  *
   12054  * RETURN     : int32_t type of status
   12055  *              NO_ERROR  -- success
   12056  *              none-zero failure code
   12057  *==========================================================================*/
   12058 int32_t QCameraParameters::setToneMapMode(uint32_t enable, bool initCommit)
   12059 {
   12060     int32_t rc = NO_ERROR;
   12061     CDBG_HIGH("%s: tone map mode %d ", __func__, enable);
   12062 
   12063     if (initCommit) {
   12064         if (initBatchUpdate(m_pParamBuf) < 0) {
   12065             ALOGE("%s:Failed to initialize group update table", __func__);
   12066             return FAILED_TRANSACTION;
   12067         }
   12068     }
   12069 
   12070     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_TONE_MAP_MODE, enable)) {
   12071         ALOGE("%s:Failed to update tone map mode", __func__);
   12072         return BAD_VALUE;
   12073     }
   12074 
   12075     if (initCommit) {
   12076         rc = commitSetBatch();
   12077         if (rc != NO_ERROR) {
   12078             ALOGE("%s:Failed to commit tone map mode", __func__);
   12079             return rc;
   12080         }
   12081     }
   12082 
   12083     return rc;
   12084 }
   12085 
   12086 /*===========================================================================
   12087  * FUNCTION   : setCDSMode
   12088  *
   12089  * DESCRIPTION: set CDS mode
   12090  *
   12091  * PARAMETERS :
   12092  *   @cds_mode : cds mode
   12093  *   @initCommit: if configuration list needs to be initialized and commited
   12094  *
   12095  * RETURN     : int32_t type of status
   12096  *              NO_ERROR  -- success
   12097  *              none-zero failure code
   12098  *==========================================================================*/
   12099 int32_t QCameraParameters::setCDSMode(int32_t cds_mode, bool initCommit)
   12100 {
   12101     if (initCommit) {
   12102         if (initBatchUpdate(m_pParamBuf) < 0) {
   12103             ALOGE("%s:Failed to initialize group update table", __func__);
   12104             return FAILED_TRANSACTION;
   12105         }
   12106     }
   12107 
   12108     int32_t rc = NO_ERROR;
   12109     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
   12110         ALOGE("%s:Failed to update cds mode", __func__);
   12111         return BAD_VALUE;
   12112     }
   12113 
   12114     if (initCommit) {
   12115         rc = commitSetBatch();
   12116         if (NO_ERROR != rc) {
   12117             ALOGE("%s:Failed to set cds mode", __func__);
   12118             return rc;
   12119         }
   12120     }
   12121 
   12122     CDBG_HIGH(" cds mode -> %d", cds_mode);
   12123 
   12124     return rc;
   12125 }
   12126 
   12127 }; // namespace qcamera
   12128