Home | History | Annotate | Download | only in HAL
      1 /* Copyright (c) 2012-2017, 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 // To remove
     33 #include <cutils/properties.h>
     34 
     35 // System dependencies
     36 #include <math.h>
     37 #include <string.h>
     38 #include <stdlib.h>
     39 #include <utils/Errors.h>
     40 #define SYSINFO_H <SYSTEM_HEADER_PREFIX/sysinfo.h>
     41 #include SYSINFO_H
     42 #include "gralloc_priv.h"
     43 #include "graphics.h"
     44 
     45 // Camera dependencies
     46 #include "QCameraBufferMaps.h"
     47 #include "QCamera2HWI.h"
     48 #include "QCameraParameters.h"
     49 #include "QCameraTrace.h"
     50 
     51 extern "C" {
     52 #include "mm_camera_dbg.h"
     53 }
     54 
     55 #define PI 3.14159265
     56 #define ASPECT_TOLERANCE 0.001
     57 #define CAMERA_DEFAULT_LONGSHOT_STAGES 4
     58 #define CAMERA_MIN_LONGSHOT_STAGES 2
     59 #define FOCUS_PERCISION 0.0000001
     60 
     61 
     62 namespace qcamera {
     63 // Parameter keys to communicate between camera application and driver.
     64 const char QCameraParameters::KEY_QC_SUPPORTED_HFR_SIZES[] = "hfr-size-values";
     65 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_MODE[] = "preview-frame-rate-mode";
     66 const char QCameraParameters::KEY_QC_SUPPORTED_PREVIEW_FRAME_RATE_MODES[] = "preview-frame-rate-modes";
     67 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_AUTO_MODE[] = "frame-rate-auto";
     68 const char QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_FIXED_MODE[] = "frame-rate-fixed";
     69 const char QCameraParameters::KEY_QC_TOUCH_AF_AEC[] = "touch-af-aec";
     70 const char QCameraParameters::KEY_QC_SUPPORTED_TOUCH_AF_AEC[] = "touch-af-aec-values";
     71 const char QCameraParameters::KEY_QC_TOUCH_INDEX_AEC[] = "touch-index-aec";
     72 const char QCameraParameters::KEY_QC_TOUCH_INDEX_AF[] = "touch-index-af";
     73 const char QCameraParameters::KEY_QC_SCENE_DETECT[] = "scene-detect";
     74 const char QCameraParameters::KEY_QC_SUPPORTED_SCENE_DETECT[] = "scene-detect-values";
     75 const char QCameraParameters::KEY_QC_ISO_MODE[] = "iso";
     76 const char QCameraParameters::KEY_QC_CONTINUOUS_ISO[] = "continuous-iso";
     77 const char QCameraParameters::KEY_QC_MIN_ISO[] = "min-iso";
     78 const char QCameraParameters::KEY_QC_MAX_ISO[] = "max-iso";
     79 const char QCameraParameters::KEY_QC_SUPPORTED_ISO_MODES[] = "iso-values";
     80 const char QCameraParameters::KEY_QC_EXPOSURE_TIME[] = "exposure-time";
     81 const char QCameraParameters::KEY_QC_MIN_EXPOSURE_TIME[] = "min-exposure-time";
     82 const char QCameraParameters::KEY_QC_MAX_EXPOSURE_TIME[] = "max-exposure-time";
     83 const char QCameraParameters::KEY_QC_CURRENT_EXPOSURE_TIME[] = "cur-exposure-time";
     84 const char QCameraParameters::KEY_QC_CURRENT_ISO[] = "cur-iso";
     85 const char QCameraParameters::KEY_QC_LENSSHADE[] = "lensshade";
     86 const char QCameraParameters::KEY_QC_SUPPORTED_LENSSHADE_MODES[] = "lensshade-values";
     87 const char QCameraParameters::KEY_QC_AUTO_EXPOSURE[] = "auto-exposure";
     88 const char QCameraParameters::KEY_QC_SUPPORTED_AUTO_EXPOSURE[] = "auto-exposure-values";
     89 const char QCameraParameters::KEY_QC_DENOISE[] = "denoise";
     90 const char QCameraParameters::KEY_QC_SUPPORTED_DENOISE[] = "denoise-values";
     91 const char QCameraParameters::KEY_QC_FOCUS_ALGO[] = "selectable-zone-af";
     92 const char QCameraParameters::KEY_QC_SUPPORTED_FOCUS_ALGOS[] = "selectable-zone-af-values";
     93 const char QCameraParameters::KEY_QC_MANUAL_FOCUS_POSITION[] = "manual-focus-position";
     94 const char QCameraParameters::KEY_QC_MANUAL_FOCUS_POS_TYPE[] = "manual-focus-pos-type";
     95 const char QCameraParameters::KEY_QC_MIN_FOCUS_POS_INDEX[] = "min-focus-pos-index";
     96 const char QCameraParameters::KEY_QC_MAX_FOCUS_POS_INDEX[] = "max-focus-pos-index";
     97 const char QCameraParameters::KEY_QC_MIN_FOCUS_POS_DAC[] = "min-focus-pos-dac";
     98 const char QCameraParameters::KEY_QC_MAX_FOCUS_POS_DAC[] = "max-focus-pos-dac";
     99 const char QCameraParameters::KEY_QC_MIN_FOCUS_POS_RATIO[] = "min-focus-pos-ratio";
    100 const char QCameraParameters::KEY_QC_MAX_FOCUS_POS_RATIO[] = "max-focus-pos-ratio";
    101 const char QCameraParameters::KEY_QC_FOCUS_POSITION_SCALE[] = "cur-focus-scale";
    102 const char QCameraParameters::KEY_QC_MIN_FOCUS_POS_DIOPTER[] = "min-focus-pos-diopter";
    103 const char QCameraParameters::KEY_QC_MAX_FOCUS_POS_DIOPTER[] = "max-focus-pos-diopter";
    104 const char QCameraParameters::KEY_QC_FOCUS_POSITION_DIOPTER[] = "cur-focus-diopter";
    105 const char QCameraParameters::KEY_QC_FACE_DETECTION[] = "face-detection";
    106 const char QCameraParameters::KEY_QC_SUPPORTED_FACE_DETECTION[] = "face-detection-values";
    107 const char QCameraParameters::KEY_QC_FACE_RECOGNITION[] = "face-recognition";
    108 const char QCameraParameters::KEY_QC_SUPPORTED_FACE_RECOGNITION[] = "face-recognition-values";
    109 const char QCameraParameters::KEY_QC_MEMORY_COLOR_ENHANCEMENT[] = "mce";
    110 const char QCameraParameters::KEY_QC_SUPPORTED_MEM_COLOR_ENHANCE_MODES[] = "mce-values";
    111 const char QCameraParameters::KEY_QC_DIS[] = "dis";
    112 const char QCameraParameters::KEY_QC_OIS[] = "ois";
    113 const char QCameraParameters::KEY_QC_SUPPORTED_DIS_MODES[] = "dis-values";
    114 const char QCameraParameters::KEY_QC_SUPPORTED_OIS_MODES[] = "ois-values";
    115 const char QCameraParameters::KEY_QC_VIDEO_HIGH_FRAME_RATE[] = "video-hfr";
    116 const char QCameraParameters::KEY_QC_VIDEO_HIGH_SPEED_RECORDING[] = "video-hsr";
    117 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_HIGH_FRAME_RATE_MODES[] = "video-hfr-values";
    118 const char QCameraParameters::KEY_QC_REDEYE_REDUCTION[] = "redeye-reduction";
    119 const char QCameraParameters::KEY_QC_SUPPORTED_REDEYE_REDUCTION[] = "redeye-reduction-values";
    120 const char QCameraParameters::KEY_QC_HIGH_DYNAMIC_RANGE_IMAGING[] = "hdr";
    121 const char QCameraParameters::KEY_QC_SUPPORTED_HDR_IMAGING_MODES[] = "hdr-values";
    122 const char QCameraParameters::KEY_QC_ZSL[] = "zsl";
    123 const char QCameraParameters::KEY_QC_SUPPORTED_ZSL_MODES[] = "zsl-values";
    124 const char QCameraParameters::KEY_QC_ZSL_BURST_INTERVAL[] = "capture-burst-interval";
    125 const char QCameraParameters::KEY_QC_ZSL_BURST_LOOKBACK[] = "capture-burst-retroactive";
    126 const char QCameraParameters::KEY_QC_ZSL_QUEUE_DEPTH[] = "capture-burst-queue-depth";
    127 const char QCameraParameters::KEY_QC_CAMERA_MODE[] = "camera-mode";
    128 const char QCameraParameters::KEY_QC_AE_BRACKET_HDR[] = "ae-bracket-hdr";
    129 const char QCameraParameters::KEY_QC_SUPPORTED_AE_BRACKET_MODES[] = "ae-bracket-hdr-values";
    130 const char QCameraParameters::KEY_QC_SUPPORTED_RAW_FORMATS[] = "raw-format-values";
    131 const char QCameraParameters::KEY_QC_RAW_FORMAT[] = "raw-format";
    132 const char QCameraParameters::KEY_QC_ORIENTATION[] = "orientation";
    133 const char QCameraParameters::KEY_QC_SELECTABLE_ZONE_AF[] = "selectable-zone-af";
    134 const char QCameraParameters::KEY_QC_CAPTURE_BURST_EXPOSURE[] = "capture-burst-exposures";
    135 const char QCameraParameters::KEY_QC_NUM_SNAPSHOT_PER_SHUTTER[] = "num-snaps-per-shutter";
    136 const char QCameraParameters::KEY_QC_NUM_RETRO_BURST_PER_SHUTTER[] = "num-retro-burst-per-shutter";
    137 const char QCameraParameters::KEY_QC_SNAPSHOT_BURST_LED_ON_PERIOD[] = "zsl-burst-led-on-period";
    138 const char QCameraParameters::KEY_QC_NO_DISPLAY_MODE[] = "no-display-mode";
    139 const char QCameraParameters::KEY_QC_RAW_PICUTRE_SIZE[] = "raw-size";
    140 const char QCameraParameters::KEY_QC_SUPPORTED_SKIN_TONE_ENHANCEMENT_MODES[] = "skinToneEnhancement-values";
    141 const char QCameraParameters::KEY_QC_SUPPORTED_LIVESNAPSHOT_SIZES[] = "supported-live-snapshot-sizes";
    142 const char QCameraParameters::KEY_QC_SUPPORTED_HDR_NEED_1X[] = "hdr-need-1x-values";
    143 const char QCameraParameters::KEY_QC_HDR_NEED_1X[] = "hdr-need-1x";
    144 const char QCameraParameters::KEY_QC_PREVIEW_FLIP[] = "preview-flip";
    145 const char QCameraParameters::KEY_QC_VIDEO_FLIP[] = "video-flip";
    146 const char QCameraParameters::KEY_QC_SNAPSHOT_PICTURE_FLIP[] = "snapshot-picture-flip";
    147 const char QCameraParameters::KEY_QC_SUPPORTED_FLIP_MODES[] = "flip-mode-values";
    148 const char QCameraParameters::KEY_QC_VIDEO_HDR[] = "video-hdr";
    149 const char QCameraParameters::KEY_QC_SENSOR_HDR[] = "sensor-hdr";
    150 const char QCameraParameters::KEY_QC_VT_ENABLE[] = "avtimer";
    151 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_HDR_MODES[] = "video-hdr-values";
    152 const char QCameraParameters::KEY_QC_SUPPORTED_SENSOR_HDR_MODES[] = "sensor-hdr-values";
    153 const char QCameraParameters::KEY_QC_AUTO_HDR_ENABLE [] = "auto-hdr-enable";
    154 const char QCameraParameters::KEY_QC_SNAPSHOT_BURST_NUM[] = "snapshot-burst-num";
    155 const char QCameraParameters::KEY_QC_SNAPSHOT_FD_DATA[] = "snapshot-fd-data-enable";
    156 const char QCameraParameters::KEY_QC_TINTLESS_ENABLE[] = "tintless";
    157 const char QCameraParameters::KEY_QC_SCENE_SELECTION[] = "scene-selection";
    158 const char QCameraParameters::KEY_QC_CDS_MODE[] = "cds-mode";
    159 const char QCameraParameters::KEY_QC_VIDEO_CDS_MODE[] = "video-cds-mode";
    160 const char QCameraParameters::KEY_QC_SUPPORTED_CDS_MODES[] = "cds-mode-values";
    161 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_CDS_MODES[] = "video-cds-mode-values";
    162 const char QCameraParameters::KEY_QC_TNR_MODE[] = "tnr-mode";
    163 const char QCameraParameters::KEY_QC_VIDEO_TNR_MODE[] = "video-tnr-mode";
    164 const char QCameraParameters::KEY_QC_SUPPORTED_TNR_MODES[] = "tnr-mode-values";
    165 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_TNR_MODES[] = "video-tnr-mode-values";
    166 const char QCameraParameters::KEY_QC_VIDEO_ROTATION[] = "video-rotation";
    167 const char QCameraParameters::KEY_QC_SUPPORTED_VIDEO_ROTATION_VALUES[] = "video-rotation-values";
    168 const char QCameraParameters::KEY_QC_AF_BRACKET[] = "af-bracket";
    169 const char QCameraParameters::KEY_QC_SUPPORTED_AF_BRACKET_MODES[] = "af-bracket-values";
    170 const char QCameraParameters::KEY_QC_RE_FOCUS[] = "re-focus";
    171 const char QCameraParameters::KEY_QC_SUPPORTED_RE_FOCUS_MODES[] = "re-focus-values";
    172 const char QCameraParameters::KEY_QC_CHROMA_FLASH[] = "chroma-flash";
    173 const char QCameraParameters::KEY_QC_SUPPORTED_CHROMA_FLASH_MODES[] = "chroma-flash-values";
    174 const char QCameraParameters::KEY_QC_OPTI_ZOOM[] = "opti-zoom";
    175 const char QCameraParameters::KEY_QC_SEE_MORE[] = "see-more";
    176 const char QCameraParameters::KEY_QC_STILL_MORE[] = "still-more";
    177 const char QCameraParameters::KEY_QC_SUPPORTED_OPTI_ZOOM_MODES[] = "opti-zoom-values";
    178 const char QCameraParameters::KEY_QC_HDR_MODE[] = "hdr-mode";
    179 const char QCameraParameters::KEY_QC_SUPPORTED_KEY_QC_HDR_MODES[] = "hdr-mode-values";
    180 const char QCameraParameters::KEY_QC_TRUE_PORTRAIT[] = "true-portrait";
    181 const char QCameraParameters::KEY_QC_SUPPORTED_TRUE_PORTRAIT_MODES[] = "true-portrait-values";
    182 const char QCameraParameters::KEY_QC_SUPPORTED_SEE_MORE_MODES[] = "see-more-values";
    183 const char QCameraParameters::KEY_QC_SUPPORTED_STILL_MORE_MODES[] = "still-more-values";
    184 const char QCameraParameters::KEY_INTERNAL_PERVIEW_RESTART[] = "internal-restart";
    185 const char QCameraParameters::KEY_QC_RDI_MODE[] = "rdi-mode";
    186 const char QCameraParameters::KEY_QC_SUPPORTED_RDI_MODES[] = "rdi-mode-values";
    187 const char QCameraParameters::KEY_QC_SECURE_MODE[] = "secure-mode";
    188 const char QCameraParameters::KEY_QC_SUPPORTED_SECURE_MODES[] = "secure-mode-values";
    189 const char QCameraParameters::ISO_HJR[] = "ISO_HJR";
    190 const char QCameraParameters::KEY_QC_AUTO_HDR_SUPPORTED[] = "auto-hdr-supported";
    191 const char QCameraParameters::KEY_QC_LONGSHOT_SUPPORTED[] = "longshot-supported";
    192 const char QCameraParameters::KEY_QC_ZSL_HDR_SUPPORTED[] = "zsl-hdr-supported";
    193 const char QCameraParameters::KEY_QC_WB_MANUAL_CCT[] = "wb-manual-cct";
    194 const char QCameraParameters::KEY_QC_MIN_WB_CCT[] = "min-wb-cct";
    195 const char QCameraParameters::KEY_QC_MAX_WB_CCT[] = "max-wb-cct";
    196 
    197 const char QCameraParameters::KEY_QC_MANUAL_WB_GAINS[] = "manual-wb-gains";
    198 const char QCameraParameters::KEY_QC_MIN_WB_GAIN[] = "min-wb-gain";
    199 const char QCameraParameters::KEY_QC_MAX_WB_GAIN[] = "max-wb-gain";
    200 
    201 const char QCameraParameters::KEY_QC_MANUAL_WB_TYPE[] = "manual-wb-type";
    202 const char QCameraParameters::KEY_QC_MANUAL_WB_VALUE[] = "manual-wb-value";
    203 
    204 const char QCameraParameters::WHITE_BALANCE_MANUAL[] = "manual";
    205 const char QCameraParameters::FOCUS_MODE_MANUAL_POSITION[] = "manual";
    206 const char QCameraParameters::KEY_QC_CACHE_VIDEO_BUFFERS[] = "cache-video-buffers";
    207 
    208 const char QCameraParameters::KEY_QC_LONG_SHOT[] = "long-shot";
    209 const char QCameraParameters::KEY_QC_INITIAL_EXPOSURE_INDEX[] = "initial-exp-index";
    210 const char QCameraParameters::KEY_QC_INSTANT_AEC[] = "instant-aec";
    211 const char QCameraParameters::KEY_QC_INSTANT_CAPTURE[] = "instant-capture";
    212 const char QCameraParameters::KEY_QC_INSTANT_AEC_SUPPORTED_MODES[] = "instant-aec-values";
    213 const char QCameraParameters::KEY_QC_INSTANT_CAPTURE_SUPPORTED_MODES[] = "instant-capture-values";
    214 
    215 // Values for effect settings.
    216 const char QCameraParameters::EFFECT_EMBOSS[] = "emboss";
    217 const char QCameraParameters::EFFECT_SKETCH[] = "sketch";
    218 const char QCameraParameters::EFFECT_NEON[] = "neon";
    219 const char QCameraParameters::EFFECT_BEAUTY[] = "beauty";
    220 
    221 
    222 // Values for auto exposure settings.
    223 const char QCameraParameters::TOUCH_AF_AEC_OFF[] = "touch-off";
    224 const char QCameraParameters::TOUCH_AF_AEC_ON[] = "touch-on";
    225 
    226 // Values for scene mode settings.
    227 const char QCameraParameters::SCENE_MODE_ASD[] = "asd";   // corresponds to CAMERA_BESTSHOT_AUTO in HAL
    228 const char QCameraParameters::SCENE_MODE_BACKLIGHT[] = "backlight";
    229 const char QCameraParameters::SCENE_MODE_FLOWERS[] = "flowers";
    230 const char QCameraParameters::SCENE_MODE_AR[] = "AR";
    231 const char QCameraParameters::SCENE_MODE_HDR[] = "hdr";
    232 
    233 // Formats for setPreviewFormat and setPictureFormat.
    234 const char QCameraParameters::PIXEL_FORMAT_YUV420SP_ADRENO[] = "yuv420sp-adreno";
    235 const char QCameraParameters::PIXEL_FORMAT_YV12[] = "yuv420p";
    236 const char QCameraParameters::PIXEL_FORMAT_NV12[] = "nv12";
    237 const char QCameraParameters::QC_PIXEL_FORMAT_NV12_VENUS[] = "nv12-venus";
    238 
    239 // Values for raw image formats
    240 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_YUYV[] = "yuv-raw8-yuyv";
    241 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_YVYU[] = "yuv-raw8-yvyu";
    242 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_UYVY[] = "yuv-raw8-uyvy";
    243 const char QCameraParameters::QC_PIXEL_FORMAT_YUV_RAW_8BIT_VYUY[] = "yuv-raw8-vyuy";
    244 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GBRG[] = "bayer-qcom-8gbrg";
    245 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GRBG[] = "bayer-qcom-8grbg";
    246 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8RGGB[] = "bayer-qcom-8rggb";
    247 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8BGGR[] = "bayer-qcom-8bggr";
    248 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GBRG[] = "bayer-qcom-10gbrg";
    249 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GRBG[] = "bayer-qcom-10grbg";
    250 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10RGGB[] = "bayer-qcom-10rggb";
    251 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10BGGR[] = "bayer-qcom-10bggr";
    252 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GBRG[] = "bayer-qcom-12gbrg";
    253 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GRBG[] = "bayer-qcom-12grbg";
    254 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12RGGB[] = "bayer-qcom-12rggb";
    255 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12BGGR[] = "bayer-qcom-12bggr";
    256 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14GBRG[] = "bayer-qcom-14gbrg";
    257 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14GRBG[] = "bayer-qcom-14grbg";
    258 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14RGGB[] = "bayer-qcom-14rggb";
    259 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14BGGR[] = "bayer-qcom-14bggr";
    260 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GBRG[] = "bayer-mipi-8gbrg";
    261 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GRBG[] = "bayer-mipi-8grbg";
    262 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8RGGB[] = "bayer-mipi-8rggb";
    263 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8BGGR[] = "bayer-mipi-8bggr";
    264 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GBRG[] = "bayer-mipi-10gbrg";
    265 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GRBG[] = "bayer-mipi-10grbg";
    266 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10RGGB[] = "bayer-mipi-10rggb";
    267 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10BGGR[] = "bayer-mipi-10bggr";
    268 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GBRG[] = "bayer-mipi-12gbrg";
    269 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GRBG[] = "bayer-mipi-12grbg";
    270 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12RGGB[] = "bayer-mipi-12rggb";
    271 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12BGGR[] = "bayer-mipi-12bggr";
    272 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14GBRG[] = "bayer-mipi-14gbrg";
    273 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14GRBG[] = "bayer-mipi-14grbg";
    274 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14RGGB[] = "bayer-mipi-14rggb";
    275 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14BGGR[] = "bayer-mipi-14bggr";
    276 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GBRG[] = "bayer-ideal-qcom-8gbrg";
    277 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GRBG[] = "bayer-ideal-qcom-8grbg";
    278 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8RGGB[] = "bayer-ideal-qcom-8rggb";
    279 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8BGGR[] = "bayer-ideal-qcom-8bggr";
    280 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GBRG[] = "bayer-ideal-qcom-10gbrg";
    281 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GRBG[] = "bayer-ideal-qcom-10grbg";
    282 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10RGGB[] = "bayer-ideal-qcom-10rggb";
    283 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10BGGR[] = "bayer-ideal-qcom-10bggr";
    284 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GBRG[] = "bayer-ideal-qcom-12gbrg";
    285 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GRBG[] = "bayer-ideal-qcom-12grbg";
    286 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12RGGB[] = "bayer-ideal-qcom-12rggb";
    287 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12BGGR[] = "bayer-ideal-qcom-12bggr";
    288 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14GBRG[] = "bayer-ideal-qcom-14gbrg";
    289 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14GRBG[] = "bayer-ideal-qcom-14grbg";
    290 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14RGGB[] = "bayer-ideal-qcom-14rggb";
    291 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14BGGR[] = "bayer-ideal-qcom-14bggr";
    292 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GBRG[] = "bayer-ideal-mipi-8gbrg";
    293 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GRBG[] = "bayer-ideal-mipi-8grbg";
    294 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8RGGB[] = "bayer-ideal-mipi-8rggb";
    295 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8BGGR[] = "bayer-ideal-mipi-8bggr";
    296 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GBRG[] = "bayer-ideal-mipi-10gbrg";
    297 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GRBG[] = "bayer-ideal-mipi-10grbg";
    298 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10RGGB[] = "bayer-ideal-mipi-10rggb";
    299 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10BGGR[] = "bayer-ideal-mipi-10bggr";
    300 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GBRG[] = "bayer-ideal-mipi-12gbrg";
    301 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GRBG[] = "bayer-ideal-mipi-12grbg";
    302 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12RGGB[] = "bayer-ideal-mipi-12rggb";
    303 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12BGGR[] = "bayer-ideal-mipi-12bggr";
    304 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14GBRG[] = "bayer-ideal-mipi-14gbrg";
    305 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14GRBG[] = "bayer-ideal-mipi-14grbg";
    306 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14RGGB[] = "bayer-ideal-mipi-14rggb";
    307 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14BGGR[] = "bayer-ideal-mipi-14bggr";
    308 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GBRG[] = "bayer-ideal-plain8-8gbrg";
    309 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GRBG[] = "bayer-ideal-plain8-8grbg";
    310 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8RGGB[] = "bayer-ideal-plain8-8rggb";
    311 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8BGGR[] = "bayer-ideal-plain8-8bggr";
    312 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GBRG[] = "bayer-ideal-plain16-8gbrg";
    313 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GRBG[] = "bayer-ideal-plain16-8grbg";
    314 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8RGGB[] = "bayer-ideal-plain16-8rggb";
    315 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8BGGR[] = "bayer-ideal-plain16-8bggr";
    316 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GBRG[] = "bayer-ideal-plain16-10gbrg";
    317 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GRBG[] = "bayer-ideal-plain16-10grbg";
    318 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10RGGB[] = "bayer-ideal-plain16-10rggb";
    319 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10BGGR[] = "bayer-ideal-plain16-10bggr";
    320 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GBRG[] = "bayer-ideal-plain16-12gbrg";
    321 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GRBG[] = "bayer-ideal-plain16-12grbg";
    322 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12RGGB[] = "bayer-ideal-plain16-12rggb";
    323 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12BGGR[] = "bayer-ideal-plain16-12bggr";
    324 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14GBRG[] = "bayer-ideal-plain16-14gbrg";
    325 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14GRBG[] = "bayer-ideal-plain16-14grbg";
    326 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14RGGB[] = "bayer-ideal-plain16-14rggb";
    327 const char QCameraParameters::QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14BGGR[] = "bayer-ideal-plain16-14bggr";
    328 
    329 // Values for ISO Settings
    330 const char QCameraParameters::ISO_AUTO[] = "auto";
    331 const char QCameraParameters::ISO_100[] = "ISO100";
    332 const char QCameraParameters::ISO_200[] = "ISO200";
    333 const char QCameraParameters::ISO_400[] = "ISO400";
    334 const char QCameraParameters::ISO_800[] = "ISO800";
    335 const char QCameraParameters::ISO_1600[] = "ISO1600";
    336 const char QCameraParameters::ISO_3200[] = "ISO3200";
    337 const char QCameraParameters::ISO_MANUAL[] = "manual";
    338 
    339 
    340 // Values for auto exposure settings.
    341 const char QCameraParameters::AUTO_EXPOSURE_FRAME_AVG[] = "frame-average";
    342 const char QCameraParameters::AUTO_EXPOSURE_CENTER_WEIGHTED[] = "center-weighted";
    343 const char QCameraParameters::AUTO_EXPOSURE_SPOT_METERING[] = "spot-metering";
    344 const char QCameraParameters::AUTO_EXPOSURE_SMART_METERING[] = "smart-metering";
    345 const char QCameraParameters::AUTO_EXPOSURE_USER_METERING[] = "user-metering";
    346 const char QCameraParameters::AUTO_EXPOSURE_SPOT_METERING_ADV[] = "spot-metering-adv";
    347 const char QCameraParameters::AUTO_EXPOSURE_CENTER_WEIGHTED_ADV[] = "center-weighted-adv";
    348 
    349 // Values for instant AEC modes
    350 const char QCameraParameters::KEY_QC_INSTANT_AEC_DISABLE[] = "0";
    351 const char QCameraParameters::KEY_QC_INSTANT_AEC_AGGRESSIVE_AEC[] = "1";
    352 const char QCameraParameters::KEY_QC_INSTANT_AEC_FAST_AEC[] = "2";
    353 
    354 // Values for instant capture modes
    355 const char QCameraParameters::KEY_QC_INSTANT_CAPTURE_DISABLE[] = "0";
    356 const char QCameraParameters::KEY_QC_INSTANT_CAPTURE_AGGRESSIVE_AEC[] = "1";
    357 const char QCameraParameters::KEY_QC_INSTANT_CAPTURE_FAST_AEC[] = "2";
    358 
    359 const char QCameraParameters::KEY_QC_GPS_LATITUDE_REF[] = "gps-latitude-ref";
    360 const char QCameraParameters::KEY_QC_GPS_LONGITUDE_REF[] = "gps-longitude-ref";
    361 const char QCameraParameters::KEY_QC_GPS_ALTITUDE_REF[] = "gps-altitude-ref";
    362 const char QCameraParameters::KEY_QC_GPS_STATUS[] = "gps-status";
    363 
    364 const char QCameraParameters::KEY_QC_HISTOGRAM[] = "histogram";
    365 const char QCameraParameters::KEY_QC_SUPPORTED_HISTOGRAM_MODES[] = "histogram-values";
    366 
    367 const char QCameraParameters::VALUE_ENABLE[] = "enable";
    368 const char QCameraParameters::VALUE_DISABLE[] = "disable";
    369 const char QCameraParameters::VALUE_OFF[] = "off";
    370 const char QCameraParameters::VALUE_ON[] = "on";
    371 const char QCameraParameters::VALUE_TRUE[] = "true";
    372 const char QCameraParameters::VALUE_FALSE[] = "false";
    373 
    374 const char QCameraParameters::VALUE_FAST[] = "fast";
    375 const char QCameraParameters::VALUE_HIGH_QUALITY[] = "high-quality";
    376 
    377 const char QCameraParameters::KEY_QC_SHARPNESS[] = "sharpness";
    378 const char QCameraParameters::KEY_QC_MIN_SHARPNESS[] = "min-sharpness";
    379 const char QCameraParameters::KEY_QC_MAX_SHARPNESS[] = "max-sharpness";
    380 const char QCameraParameters::KEY_QC_SHARPNESS_STEP[] = "sharpness-step";
    381 const char QCameraParameters::KEY_QC_CONTRAST[] = "contrast";
    382 const char QCameraParameters::KEY_QC_MIN_CONTRAST[] = "min-contrast";
    383 const char QCameraParameters::KEY_QC_MAX_CONTRAST[] = "max-contrast";
    384 const char QCameraParameters::KEY_QC_CONTRAST_STEP[] = "contrast-step";
    385 const char QCameraParameters::KEY_QC_SATURATION[] = "saturation";
    386 const char QCameraParameters::KEY_QC_MIN_SATURATION[] = "min-saturation";
    387 const char QCameraParameters::KEY_QC_MAX_SATURATION[] = "max-saturation";
    388 const char QCameraParameters::KEY_QC_SATURATION_STEP[] = "saturation-step";
    389 const char QCameraParameters::KEY_QC_BRIGHTNESS[] = "luma-adaptation";
    390 const char QCameraParameters::KEY_QC_MIN_BRIGHTNESS[] = "min-brightness";
    391 const char QCameraParameters::KEY_QC_MAX_BRIGHTNESS[] = "max-brightness";
    392 const char QCameraParameters::KEY_QC_BRIGHTNESS_STEP[] = "brightness-step";
    393 const char QCameraParameters::KEY_QC_SCE_FACTOR[] = "skinToneEnhancement";
    394 const char QCameraParameters::KEY_QC_MIN_SCE_FACTOR[] = "min-sce-factor";
    395 const char QCameraParameters::KEY_QC_MAX_SCE_FACTOR[] = "max-sce-factor";
    396 const char QCameraParameters::KEY_QC_SCE_FACTOR_STEP[] = "sce-factor-step";
    397 
    398 const char QCameraParameters::KEY_QC_MAX_NUM_REQUESTED_FACES[] = "qc-max-num-requested-faces";
    399 
    400 //Values for DENOISE
    401 const char QCameraParameters::DENOISE_OFF[] = "denoise-off";
    402 const char QCameraParameters::DENOISE_ON[] = "denoise-on";
    403 
    404 // Values for selectable zone af Settings
    405 const char QCameraParameters::FOCUS_ALGO_AUTO[] = "auto";
    406 const char QCameraParameters::FOCUS_ALGO_SPOT_METERING[] = "spot-metering";
    407 const char QCameraParameters::FOCUS_ALGO_CENTER_WEIGHTED[] = "center-weighted";
    408 const char QCameraParameters::FOCUS_ALGO_FRAME_AVERAGE[] = "frame-average";
    409 
    410 // Values for HFR settings.
    411 const char QCameraParameters::VIDEO_HFR_OFF[] = "off";
    412 const char QCameraParameters::VIDEO_HFR_2X[] = "60";
    413 const char QCameraParameters::VIDEO_HFR_3X[] = "90";
    414 const char QCameraParameters::VIDEO_HFR_4X[] = "120";
    415 const char QCameraParameters::VIDEO_HFR_5X[] = "150";
    416 const char QCameraParameters::VIDEO_HFR_6X[] = "180";
    417 const char QCameraParameters::VIDEO_HFR_7X[] = "210";
    418 const char QCameraParameters::VIDEO_HFR_8X[] = "240";
    419 const char QCameraParameters::VIDEO_HFR_9X[] = "480";
    420 
    421 // Values for HDR Bracketing settings.
    422 const char QCameraParameters::AE_BRACKET_OFF[] = "Off";
    423 const char QCameraParameters::AE_BRACKET[] = "AE-Bracket";
    424 
    425 // Values for AF Bracketing setting.
    426 const char QCameraParameters::AF_BRACKET_OFF[] = "af-bracket-off";
    427 const char QCameraParameters::AF_BRACKET_ON[] = "af-bracket-on";
    428 
    429 // Values for Refocus setting.
    430 const char QCameraParameters::RE_FOCUS_OFF[] = "re-focus-off";
    431 const char QCameraParameters::RE_FOCUS_ON[] = "re-focus-on";
    432 
    433 // Values for Chroma Flash setting.
    434 const char QCameraParameters::CHROMA_FLASH_OFF[] = "chroma-flash-off";
    435 const char QCameraParameters::CHROMA_FLASH_ON[] = "chroma-flash-on";
    436 
    437 // Values for Opti Zoom setting.
    438 const char QCameraParameters::OPTI_ZOOM_OFF[] = "opti-zoom-off";
    439 const char QCameraParameters::OPTI_ZOOM_ON[] = "opti-zoom-on";
    440 
    441 // Values for Still More setting.
    442 const char QCameraParameters::STILL_MORE_OFF[] = "still-more-off";
    443 const char QCameraParameters::STILL_MORE_ON[] = "still-more-on";
    444 
    445 // Values for HDR mode setting.
    446 const char QCameraParameters::HDR_MODE_SENSOR[] = "hdr-mode-sensor";
    447 const char QCameraParameters::HDR_MODE_MULTI_FRAME[] = "hdr-mode-multiframe";
    448 
    449 // Values for True Portrait setting.
    450 const char QCameraParameters::TRUE_PORTRAIT_OFF[] = "true-portrait-off";
    451 const char QCameraParameters::TRUE_PORTRAIT_ON[] = "true-portrait-on";
    452 
    453 // Values for FLIP settings.
    454 const char QCameraParameters::FLIP_MODE_OFF[] = "off";
    455 const char QCameraParameters::FLIP_MODE_V[] = "flip-v";
    456 const char QCameraParameters::FLIP_MODE_H[] = "flip-h";
    457 const char QCameraParameters::FLIP_MODE_VH[] = "flip-vh";
    458 
    459 const char QCameraParameters::CDS_MODE_OFF[] = "off";
    460 const char QCameraParameters::CDS_MODE_ON[] = "on";
    461 const char QCameraParameters::CDS_MODE_AUTO[] = "auto";
    462 
    463 // Values for video rotation settings.
    464 const char QCameraParameters::VIDEO_ROTATION_0[] = "0";
    465 const char QCameraParameters::VIDEO_ROTATION_90[] = "90";
    466 const char QCameraParameters::VIDEO_ROTATION_180[] = "180";
    467 const char QCameraParameters::VIDEO_ROTATION_270[] = "270";
    468 
    469 const char QCameraParameters::KEY_QC_SUPPORTED_MANUAL_FOCUS_MODES[] = "manual-focus-modes";
    470 const char QCameraParameters::KEY_QC_SUPPORTED_MANUAL_EXPOSURE_MODES[] = "manual-exposure-modes";
    471 const char QCameraParameters::KEY_QC_SUPPORTED_MANUAL_WB_MODES[] = "manual-wb-modes";
    472 const char QCameraParameters::KEY_QC_FOCUS_SCALE_MODE[] = "scale-mode";
    473 const char QCameraParameters::KEY_QC_FOCUS_DIOPTER_MODE[] = "diopter-mode";
    474 const char QCameraParameters::KEY_QC_ISO_PRIORITY[] = "iso-priority";
    475 const char QCameraParameters::KEY_QC_EXP_TIME_PRIORITY[] = "exp-time-priority";
    476 const char QCameraParameters::KEY_QC_USER_SETTING[] = "user-setting";
    477 const char QCameraParameters::KEY_QC_WB_CCT_MODE[] = "color-temperature";
    478 const char QCameraParameters::KEY_QC_WB_GAIN_MODE[] = "rbgb-gains";
    479 const char QCameraParameters::KEY_QC_NOISE_REDUCTION_MODE[] = "noise-reduction-mode";
    480 const char QCameraParameters::KEY_QC_NOISE_REDUCTION_MODE_VALUES[] = "noise-reduction-mode-values";
    481 
    482 #ifdef TARGET_TS_MAKEUP
    483 const char QCameraParameters::KEY_TS_MAKEUP[] = "tsmakeup";
    484 const char QCameraParameters::KEY_TS_MAKEUP_WHITEN[] = "tsmakeup_whiten";
    485 const char QCameraParameters::KEY_TS_MAKEUP_CLEAN[] = "tsmakeup_clean";
    486 #endif
    487 
    488 //KEY to share HFR batch size with video encoder.
    489 const char QCameraParameters::KEY_QC_VIDEO_BATCH_SIZE[] = "video-batch-size";
    490 
    491 //Camera supported metadata.  App can use this to read metadata callback type.
    492 const char QCameraParameters::KEY_QC_SUPPORTED_METADATA_TYPES[] = "metadata-types";
    493 const char QCameraParameters::QC_METADATA_ASD[] = "metadata-asd";
    494 const char QCameraParameters::QC_METADATA_FD[] = "metadata-fd";
    495 const char QCameraParameters::QC_METADATA_HDR[] = "metadata-hdr";
    496 const char QCameraParameters::QC_METADATA_LED_CALIB[] = "metadata-led-calib";
    497 
    498 const char QCameraParameters::KEY_QC_LED_CALIBRATION[] = "led-calibration";
    499 
    500 static const char* portrait = "portrait";
    501 static const char* landscape = "landscape";
    502 
    503 const cam_dimension_t QCameraParameters::THUMBNAIL_SIZES_MAP[] = {
    504     { 256, 154 }, //1.66233
    505     { 240, 160 }, //1.5
    506     { 320, 320 }, //1.0
    507     { 320, 240 }, //1.33333
    508     { 256, 144 }, //1.777778
    509     { 240, 144 }, //1.666667
    510     { 176, 144 }, //1.222222
    511     /*Thumbnail sizes to match portrait picture size aspect ratio*/
    512     { 240, 320 }, //to match 480X640 & 240X320 picture size
    513     { 144, 176 }, //to match 144X176  picture size
    514     { 0, 0 }      // required by Android SDK
    515 };
    516 
    517 const QCameraParameters::QCameraMap<cam_auto_exposure_mode_type>
    518         QCameraParameters::AUTO_EXPOSURE_MAP[] = {
    519     { AUTO_EXPOSURE_FRAME_AVG,           CAM_AEC_MODE_FRAME_AVERAGE },
    520     { AUTO_EXPOSURE_CENTER_WEIGHTED,     CAM_AEC_MODE_CENTER_WEIGHTED },
    521     { AUTO_EXPOSURE_SPOT_METERING,       CAM_AEC_MODE_SPOT_METERING },
    522     { AUTO_EXPOSURE_SMART_METERING,      CAM_AEC_MODE_SMART_METERING },
    523     { AUTO_EXPOSURE_USER_METERING,       CAM_AEC_MODE_USER_METERING },
    524     { AUTO_EXPOSURE_SPOT_METERING_ADV,   CAM_AEC_MODE_SPOT_METERING_ADV },
    525     { AUTO_EXPOSURE_CENTER_WEIGHTED_ADV, CAM_AEC_MODE_CENTER_WEIGHTED_ADV },
    526 };
    527 
    528 const QCameraParameters::QCameraMap<cam_aec_convergence_type>
    529         QCameraParameters::INSTANT_AEC_MODES_MAP[] = {
    530     { KEY_QC_INSTANT_AEC_DISABLE,        CAM_AEC_NORMAL_CONVERGENCE },
    531     { KEY_QC_INSTANT_AEC_AGGRESSIVE_AEC, CAM_AEC_AGGRESSIVE_CONVERGENCE },
    532     { KEY_QC_INSTANT_AEC_FAST_AEC,       CAM_AEC_FAST_CONVERGENCE },
    533 };
    534 
    535 const QCameraParameters::QCameraMap<cam_aec_convergence_type>
    536         QCameraParameters::INSTANT_CAPTURE_MODES_MAP[] = {
    537     { KEY_QC_INSTANT_CAPTURE_DISABLE,        CAM_AEC_NORMAL_CONVERGENCE },
    538     { KEY_QC_INSTANT_CAPTURE_AGGRESSIVE_AEC, CAM_AEC_AGGRESSIVE_CONVERGENCE },
    539     { KEY_QC_INSTANT_CAPTURE_FAST_AEC,       CAM_AEC_FAST_CONVERGENCE },
    540 };
    541 
    542 const QCameraParameters::QCameraMap<cam_format_t>
    543         QCameraParameters::PREVIEW_FORMATS_MAP[] = {
    544     {PIXEL_FORMAT_YUV420SP,        CAM_FORMAT_YUV_420_NV21},
    545     {PIXEL_FORMAT_YUV420P,         CAM_FORMAT_YUV_420_YV12},
    546     {PIXEL_FORMAT_YUV420SP_ADRENO, CAM_FORMAT_YUV_420_NV21_ADRENO},
    547     {PIXEL_FORMAT_YV12,            CAM_FORMAT_YUV_420_YV12},
    548     {PIXEL_FORMAT_NV12,            CAM_FORMAT_YUV_420_NV12},
    549     {QC_PIXEL_FORMAT_NV12_VENUS,   CAM_FORMAT_YUV_420_NV12_VENUS}
    550 };
    551 
    552 const QCameraParameters::QCameraMap<cam_format_t>
    553         QCameraParameters::PICTURE_TYPES_MAP[] = {
    554     {PIXEL_FORMAT_JPEG,                          CAM_FORMAT_JPEG},
    555     {PIXEL_FORMAT_YUV420SP,                      CAM_FORMAT_YUV_420_NV21},
    556     {PIXEL_FORMAT_YUV422SP,                      CAM_FORMAT_YUV_422_NV16},
    557     {QC_PIXEL_FORMAT_YUV_RAW_8BIT_YUYV,          CAM_FORMAT_YUV_RAW_8BIT_YUYV},
    558     {QC_PIXEL_FORMAT_YUV_RAW_8BIT_YVYU,          CAM_FORMAT_YUV_RAW_8BIT_YVYU},
    559     {QC_PIXEL_FORMAT_YUV_RAW_8BIT_UYVY,          CAM_FORMAT_YUV_RAW_8BIT_UYVY},
    560     {QC_PIXEL_FORMAT_YUV_RAW_8BIT_VYUY,          CAM_FORMAT_YUV_RAW_8BIT_VYUY},
    561     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GBRG,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_GBRG},
    562     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8GRBG,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_GRBG},
    563     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8RGGB,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_RGGB},
    564     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_8BGGR,       CAM_FORMAT_BAYER_QCOM_RAW_8BPP_BGGR},
    565     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GBRG,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GBRG},
    566     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10GRBG,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GRBG},
    567     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10RGGB,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_RGGB},
    568     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_10BGGR,      CAM_FORMAT_BAYER_QCOM_RAW_10BPP_BGGR},
    569     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GBRG,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_GBRG},
    570     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12GRBG,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_GRBG},
    571     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12RGGB,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_RGGB},
    572     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_12BGGR,      CAM_FORMAT_BAYER_QCOM_RAW_12BPP_BGGR},
    573     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14GBRG,      CAM_FORMAT_BAYER_QCOM_RAW_14BPP_GBRG},
    574     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14GRBG,      CAM_FORMAT_BAYER_QCOM_RAW_14BPP_GRBG},
    575     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14RGGB,      CAM_FORMAT_BAYER_QCOM_RAW_14BPP_RGGB},
    576     {QC_PIXEL_FORMAT_BAYER_QCOM_RAW_14BGGR,      CAM_FORMAT_BAYER_QCOM_RAW_14BPP_BGGR},
    577     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GBRG,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_GBRG},
    578     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8GRBG,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_GRBG},
    579     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8RGGB,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_RGGB},
    580     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_8BGGR,       CAM_FORMAT_BAYER_MIPI_RAW_8BPP_BGGR},
    581     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GBRG,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG},
    582     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10GRBG,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GRBG},
    583     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10RGGB,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_RGGB},
    584     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_10BGGR,      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_BGGR},
    585     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GBRG,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_GBRG},
    586     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12GRBG,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_GRBG},
    587     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12RGGB,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_RGGB},
    588     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_12BGGR,      CAM_FORMAT_BAYER_MIPI_RAW_12BPP_BGGR},
    589     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14GBRG,      CAM_FORMAT_BAYER_MIPI_RAW_14BPP_GBRG},
    590     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14GRBG,      CAM_FORMAT_BAYER_MIPI_RAW_14BPP_GRBG},
    591     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14RGGB,      CAM_FORMAT_BAYER_MIPI_RAW_14BPP_RGGB},
    592     {QC_PIXEL_FORMAT_BAYER_MIPI_RAW_14BGGR,      CAM_FORMAT_BAYER_MIPI_RAW_14BPP_BGGR},
    593     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GBRG,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_GBRG},
    594     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8GRBG,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_GRBG},
    595     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8RGGB,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_RGGB},
    596     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_8BGGR,     CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_BGGR},
    597     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_GBRG},
    598     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_GRBG},
    599     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_RGGB},
    600     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_10BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_BGGR},
    601     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_GBRG},
    602     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_GRBG},
    603     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_RGGB},
    604     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_12BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_BGGR},
    605     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_14BPP_GBRG},
    606     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_14BPP_GRBG},
    607     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_14BPP_RGGB},
    608     {QC_PIXEL_FORMAT_BAYER_IDEAL_QCOM_14BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_14BPP_BGGR},
    609     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GBRG,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_GBRG},
    610     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8GRBG,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_GRBG},
    611     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8RGGB,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_RGGB},
    612     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_8BGGR,     CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_BGGR},
    613     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_GBRG},
    614     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_GRBG},
    615     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_RGGB},
    616     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_10BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_BGGR},
    617     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_GBRG},
    618     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_GRBG},
    619     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_RGGB},
    620     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_12BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_BGGR},
    621     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14GBRG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_14BPP_GBRG},
    622     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14GRBG,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_14BPP_GRBG},
    623     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14RGGB,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_14BPP_RGGB},
    624     {QC_PIXEL_FORMAT_BAYER_IDEAL_MIPI_14BGGR,    CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_14BPP_BGGR},
    625     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GBRG,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_GBRG},
    626     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8GRBG,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_GRBG},
    627     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8RGGB,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_RGGB},
    628     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN8_8BGGR,   CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_BGGR},
    629     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GBRG,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_GBRG},
    630     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8GRBG,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_GRBG},
    631     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8RGGB,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_RGGB},
    632     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_8BGGR,  CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_BGGR},
    633     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_GBRG},
    634     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_GRBG},
    635     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_RGGB},
    636     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_10BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_BGGR},
    637     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_GBRG},
    638     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_GRBG},
    639     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_RGGB},
    640     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_12BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_BGGR},
    641     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14GBRG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_14BPP_GBRG},
    642     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14GRBG, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_14BPP_GRBG},
    643     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14RGGB, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_14BPP_RGGB},
    644     {QC_PIXEL_FORMAT_BAYER_IDEAL_PLAIN16_14BGGR, CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_14BPP_BGGR}
    645 };
    646 
    647 const QCameraParameters::QCameraMap<cam_focus_mode_type>
    648         QCameraParameters::FOCUS_MODES_MAP[] = {
    649     { FOCUS_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
    650     { FOCUS_MODE_INFINITY,           CAM_FOCUS_MODE_INFINITY },
    651     { FOCUS_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
    652     { FOCUS_MODE_FIXED,              CAM_FOCUS_MODE_FIXED },
    653     { FOCUS_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
    654     { FOCUS_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
    655     { FOCUS_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO },
    656     { FOCUS_MODE_MANUAL_POSITION,    CAM_FOCUS_MODE_MANUAL},
    657 };
    658 
    659 const QCameraParameters::QCameraMap<cam_effect_mode_type>
    660         QCameraParameters::EFFECT_MODES_MAP[] = {
    661     { EFFECT_NONE,       CAM_EFFECT_MODE_OFF },
    662     { EFFECT_MONO,       CAM_EFFECT_MODE_MONO },
    663     { EFFECT_NEGATIVE,   CAM_EFFECT_MODE_NEGATIVE },
    664     { EFFECT_SOLARIZE,   CAM_EFFECT_MODE_SOLARIZE },
    665     { EFFECT_SEPIA,      CAM_EFFECT_MODE_SEPIA },
    666     { EFFECT_POSTERIZE,  CAM_EFFECT_MODE_POSTERIZE },
    667     { EFFECT_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
    668     { EFFECT_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
    669     { EFFECT_AQUA,       CAM_EFFECT_MODE_AQUA },
    670     { EFFECT_EMBOSS,     CAM_EFFECT_MODE_EMBOSS },
    671     { EFFECT_SKETCH,     CAM_EFFECT_MODE_SKETCH },
    672     { EFFECT_NEON,       CAM_EFFECT_MODE_NEON },
    673     { EFFECT_BEAUTY,     CAM_EFFECT_MODE_BEAUTY }
    674 };
    675 
    676 const QCameraParameters::QCameraMap<cam_scene_mode_type>
    677         QCameraParameters::SCENE_MODES_MAP[] = {
    678     { SCENE_MODE_AUTO,           CAM_SCENE_MODE_OFF },
    679     { SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
    680     { SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
    681     { SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
    682     { SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
    683     { SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
    684     { SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
    685     { SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
    686     { SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
    687     { SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
    688     { SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
    689     { SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
    690     { SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
    691     { SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
    692     { SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
    693     { SCENE_MODE_ASD,            CAM_SCENE_MODE_AUTO },
    694     { SCENE_MODE_BACKLIGHT,      CAM_SCENE_MODE_BACKLIGHT },
    695     { SCENE_MODE_FLOWERS,        CAM_SCENE_MODE_FLOWERS },
    696     { SCENE_MODE_AR,             CAM_SCENE_MODE_AR },
    697     { SCENE_MODE_HDR,            CAM_SCENE_MODE_HDR },
    698 };
    699 
    700 const QCameraParameters::QCameraMap<cam_flash_mode_t>
    701         QCameraParameters::FLASH_MODES_MAP[] = {
    702     { FLASH_MODE_OFF,   CAM_FLASH_MODE_OFF },
    703     { FLASH_MODE_AUTO,  CAM_FLASH_MODE_AUTO },
    704     { FLASH_MODE_ON,    CAM_FLASH_MODE_ON },
    705     { FLASH_MODE_TORCH, CAM_FLASH_MODE_TORCH }
    706 };
    707 
    708 const QCameraParameters::QCameraMap<cam_focus_algorithm_type>
    709          QCameraParameters::FOCUS_ALGO_MAP[] = {
    710     { FOCUS_ALGO_AUTO,            CAM_FOCUS_ALGO_AUTO },
    711     { FOCUS_ALGO_SPOT_METERING,   CAM_FOCUS_ALGO_SPOT },
    712     { FOCUS_ALGO_CENTER_WEIGHTED, CAM_FOCUS_ALGO_CENTER_WEIGHTED },
    713     { FOCUS_ALGO_FRAME_AVERAGE,   CAM_FOCUS_ALGO_AVERAGE }
    714 };
    715 
    716 const QCameraParameters::QCameraMap<cam_wb_mode_type>
    717         QCameraParameters::WHITE_BALANCE_MODES_MAP[] = {
    718     { WHITE_BALANCE_AUTO,            CAM_WB_MODE_AUTO },
    719     { WHITE_BALANCE_INCANDESCENT,    CAM_WB_MODE_INCANDESCENT },
    720     { WHITE_BALANCE_FLUORESCENT,     CAM_WB_MODE_FLUORESCENT },
    721     { WHITE_BALANCE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
    722     { WHITE_BALANCE_DAYLIGHT,        CAM_WB_MODE_DAYLIGHT },
    723     { WHITE_BALANCE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
    724     { WHITE_BALANCE_TWILIGHT,        CAM_WB_MODE_TWILIGHT },
    725     { WHITE_BALANCE_SHADE,           CAM_WB_MODE_SHADE },
    726     { WHITE_BALANCE_MANUAL,          CAM_WB_MODE_MANUAL},
    727 };
    728 
    729 const QCameraParameters::QCameraMap<cam_antibanding_mode_type>
    730         QCameraParameters::ANTIBANDING_MODES_MAP[] = {
    731     { ANTIBANDING_OFF,  CAM_ANTIBANDING_MODE_OFF },
    732     { ANTIBANDING_50HZ, CAM_ANTIBANDING_MODE_50HZ },
    733     { ANTIBANDING_60HZ, CAM_ANTIBANDING_MODE_60HZ },
    734     { ANTIBANDING_AUTO, CAM_ANTIBANDING_MODE_AUTO }
    735 };
    736 
    737 const QCameraParameters::QCameraMap<cam_iso_mode_type>
    738         QCameraParameters::ISO_MODES_MAP[] = {
    739     { ISO_AUTO,  CAM_ISO_MODE_AUTO },
    740     { ISO_HJR,   CAM_ISO_MODE_DEBLUR },
    741     { ISO_100,   CAM_ISO_MODE_100 },
    742     { ISO_200,   CAM_ISO_MODE_200 },
    743     { ISO_400,   CAM_ISO_MODE_400 },
    744     { ISO_800,   CAM_ISO_MODE_800 },
    745     { ISO_1600,  CAM_ISO_MODE_1600 },
    746     { ISO_3200,  CAM_ISO_MODE_3200 }
    747 };
    748 
    749 const QCameraParameters::QCameraMap<cam_hfr_mode_t>
    750         QCameraParameters::HFR_MODES_MAP[] = {
    751     { VIDEO_HFR_OFF, CAM_HFR_MODE_OFF },
    752     { VIDEO_HFR_2X, CAM_HFR_MODE_60FPS },
    753     { VIDEO_HFR_3X, CAM_HFR_MODE_90FPS },
    754     { VIDEO_HFR_4X, CAM_HFR_MODE_120FPS },
    755     { VIDEO_HFR_5X, CAM_HFR_MODE_150FPS },
    756     { VIDEO_HFR_6X, CAM_HFR_MODE_180FPS },
    757     { VIDEO_HFR_7X, CAM_HFR_MODE_210FPS },
    758     { VIDEO_HFR_8X, CAM_HFR_MODE_240FPS },
    759     { VIDEO_HFR_9X, CAM_HFR_MODE_480FPS }
    760 };
    761 
    762 const QCameraParameters::QCameraMap<cam_bracket_mode>
    763         QCameraParameters::BRACKETING_MODES_MAP[] = {
    764     { AE_BRACKET_OFF, CAM_EXP_BRACKETING_OFF },
    765     { AE_BRACKET,     CAM_EXP_BRACKETING_ON }
    766 };
    767 
    768 const QCameraParameters::QCameraMap<int>
    769         QCameraParameters::ON_OFF_MODES_MAP[] = {
    770     { VALUE_OFF, 0 },
    771     { VALUE_ON,  1 }
    772 };
    773 
    774 const QCameraParameters::QCameraMap<int>
    775         QCameraParameters::TOUCH_AF_AEC_MODES_MAP[] = {
    776     { QCameraParameters::TOUCH_AF_AEC_OFF, 0 },
    777     { QCameraParameters::TOUCH_AF_AEC_ON, 1 }
    778 };
    779 
    780 const QCameraParameters::QCameraMap<int>
    781         QCameraParameters::ENABLE_DISABLE_MODES_MAP[] = {
    782     { VALUE_ENABLE,  1 },
    783     { VALUE_DISABLE, 0 }
    784 };
    785 
    786 const QCameraParameters::QCameraMap<int>
    787         QCameraParameters::DENOISE_ON_OFF_MODES_MAP[] = {
    788     { DENOISE_OFF, 0 },
    789     { DENOISE_ON,  1 }
    790 };
    791 
    792 const QCameraParameters::QCameraMap<int>
    793         QCameraParameters::TRUE_FALSE_MODES_MAP[] = {
    794     { VALUE_FALSE, 0},
    795     { VALUE_TRUE,  1}
    796 };
    797 
    798 const QCameraParameters::QCameraMap<cam_flip_t>
    799         QCameraParameters::FLIP_MODES_MAP[] = {
    800     {FLIP_MODE_OFF, FLIP_NONE},
    801     {FLIP_MODE_V, FLIP_V},
    802     {FLIP_MODE_H, FLIP_H},
    803     {FLIP_MODE_VH, FLIP_V_H}
    804 };
    805 
    806 const QCameraParameters::QCameraMap<int>
    807         QCameraParameters::AF_BRACKETING_MODES_MAP[] = {
    808     { AF_BRACKET_OFF, 0 },
    809     { AF_BRACKET_ON,  1 }
    810 };
    811 
    812 const QCameraParameters::QCameraMap<int>
    813         QCameraParameters::RE_FOCUS_MODES_MAP[] = {
    814     { RE_FOCUS_OFF, 0 },
    815     { RE_FOCUS_ON,  1 }
    816 };
    817 
    818 const QCameraParameters::QCameraMap<int>
    819         QCameraParameters::CHROMA_FLASH_MODES_MAP[] = {
    820     { CHROMA_FLASH_OFF, 0 },
    821     { CHROMA_FLASH_ON,  1 }
    822 };
    823 
    824 const QCameraParameters::QCameraMap<int>
    825         QCameraParameters::OPTI_ZOOM_MODES_MAP[] = {
    826     { OPTI_ZOOM_OFF, 0 },
    827     { OPTI_ZOOM_ON,  1 }
    828 };
    829 
    830 const QCameraParameters::QCameraMap<int>
    831         QCameraParameters::TRUE_PORTRAIT_MODES_MAP[] = {
    832     { TRUE_PORTRAIT_OFF, 0 },
    833     { TRUE_PORTRAIT_ON,  1 }
    834 };
    835 
    836 const QCameraParameters::QCameraMap<int>
    837         QCameraParameters::STILL_MORE_MODES_MAP[] = {
    838     { STILL_MORE_OFF, 0 },
    839     { STILL_MORE_ON,  1 }
    840 };
    841 
    842 const QCameraParameters::QCameraMap<cam_cds_mode_type_t>
    843         QCameraParameters::CDS_MODES_MAP[] = {
    844     { CDS_MODE_OFF, CAM_CDS_MODE_OFF },
    845     { CDS_MODE_ON, CAM_CDS_MODE_ON },
    846     { CDS_MODE_AUTO, CAM_CDS_MODE_AUTO}
    847 };
    848 
    849 const QCameraParameters::QCameraMap<int>
    850         QCameraParameters::HDR_MODES_MAP[] = {
    851     { HDR_MODE_SENSOR, 0 },
    852     { HDR_MODE_MULTI_FRAME, 1 }
    853 };
    854 
    855 const QCameraParameters::QCameraMap<int>
    856         QCameraParameters::VIDEO_ROTATION_MODES_MAP[] = {
    857     { VIDEO_ROTATION_0, 0 },
    858     { VIDEO_ROTATION_90, 90 },
    859     { VIDEO_ROTATION_180, 180 },
    860     { VIDEO_ROTATION_270, 270 }
    861 };
    862 
    863 const QCameraParameters::QCameraMap<int>
    864         QCameraParameters::NOISE_REDUCTION_MODES_MAP[] = {
    865     { VALUE_OFF, 0 },
    866     { VALUE_FAST,  1 },
    867     { VALUE_HIGH_QUALITY,  2 }
    868 };
    869 
    870 const QCameraParameters::QCameraMap<int>
    871         QCameraParameters::METADATA_TYPES_MAP[] = {
    872     {QC_METADATA_ASD,        QCAMERA_METADATA_ASD},
    873     {QC_METADATA_FD,         QCAMERA_METADATA_FD},
    874     {QC_METADATA_HDR,        QCAMERA_METADATA_HDR},
    875     {QC_METADATA_LED_CALIB,  QCAMERA_METADATA_LED_CALIB}
    876 };
    877 
    878 
    879 #define DEFAULT_CAMERA_AREA "(0, 0, 0, 0, 0)"
    880 #define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
    881 #define TOTAL_RAM_SIZE_512MB 536870912
    882 #define PARAM_MAP_SIZE(MAP) (sizeof(MAP)/sizeof(MAP[0]))
    883 
    884 // initialise to some default value
    885 uint32_t QCameraParameters::sessionId[] = {0};
    886 
    887 /*===========================================================================
    888  * FUNCTION   : isOEMFeat1PropEnabled
    889  *
    890  * DESCRIPTION: inline function to check from property if custom feature
    891  *            is enabled
    892  *
    893  * PARAMETERS : none
    894  *
    895  * RETURN     : boolean true/false
    896  *==========================================================================*/
    897 static inline bool isOEMFeat1PropEnabled()
    898 {
    899     char value[PROPERTY_VALUE_MAX];
    900     property_get("persist.camera.imglib.oemfeat1", value, "0");
    901     return atoi(value) > 0 ? true : false;
    902 }
    903 
    904 /*===========================================================================
    905  * FUNCTION   : QCameraParameters
    906  *
    907  * DESCRIPTION: default constructor of QCameraParameters
    908  *
    909  * PARAMETERS : none
    910  *
    911  * RETURN     : None
    912  *==========================================================================*/
    913 QCameraParameters::QCameraParameters()
    914     : CameraParameters(),
    915       m_reprocScaleParam(),
    916       mCommon(),
    917       m_pCapability(NULL),
    918       m_pCamOpsTbl(NULL),
    919       m_pParamHeap(NULL),
    920       m_pParamBuf(NULL),
    921       m_pParamBufAux(NULL),
    922       m_pDualCamCmdHeap(NULL),
    923       m_bFrameSyncEnabled(false),
    924       mIsTypeVideo(IS_TYPE_NONE),
    925       mIsTypePreview(IS_TYPE_NONE),
    926       m_bZslMode(false),
    927       m_bZslMode_new(false),
    928       m_bForceZslMode(false),
    929       m_bRecordingHint(false),
    930       m_bRecordingHint_new(false),
    931       m_bHistogramEnabled(false),
    932       m_bLongshotEnabled(false),
    933       m_nFaceProcMask(0),
    934       m_bFaceDetectionOn(0),
    935       m_bDebugFps(false),
    936       mFocusMode(CAM_FOCUS_MODE_MAX),
    937       mPreviewFormat(CAM_FORMAT_YUV_420_NV21),
    938       mAppPreviewFormat(CAM_FORMAT_YUV_420_NV21),
    939       mPictureFormat(CAM_FORMAT_JPEG),
    940       m_bNeedRestart(false),
    941       m_bNoDisplayMode(false),
    942       m_bWNROn(false),
    943       m_bTNRPreviewOn(false),
    944       m_bTNRVideoOn(false),
    945       m_bTNRSnapshotOn(false),
    946       m_bInited(false),
    947       m_nRetroBurstNum(0),
    948       m_nBurstLEDOnPeriod(100),
    949       m_bUpdateEffects(false),
    950       m_bSceneTransitionAuto(false),
    951       m_bPreviewFlipChanged(false),
    952       m_bVideoFlipChanged(false),
    953       m_bSnapshotFlipChanged(false),
    954       m_bZoomChanged(false),
    955       m_bFixedFrameRateSet(false),
    956       m_bHDREnabled(false),
    957       m_bLocalHDREnabled(false),
    958       m_bAVTimerEnabled(false),
    959       m_bDISEnabled(false),
    960       m_bMetaRawEnabled(false),
    961       m_MobiMask(0),
    962       m_AdjustFPS(NULL),
    963       m_bHDR1xFrameEnabled(false),
    964       m_HDRSceneEnabled(false),
    965       m_bHDRThumbnailProcessNeeded(false),
    966       m_bHDR1xExtraBufferNeeded(true),
    967       m_bHDROutputCropEnabled(false),
    968       m_tempMap(),
    969       m_bAFBracketingOn(false),
    970       m_bReFocusOn(false),
    971       m_bChromaFlashOn(false),
    972       m_bOptiZoomOn(false),
    973       m_bSceneSelection(false),
    974       m_SelectedScene(CAM_SCENE_MODE_MAX),
    975       m_bSeeMoreOn(false),
    976       m_bStillMoreOn(false),
    977       m_bHighQualityNoiseReductionMode(false),
    978       m_bHfrMode(false),
    979       m_bSensorHDREnabled(false),
    980       m_bRdiMode(false),
    981       m_bSecureMode(false),
    982       m_bAeBracketingEnabled(false),
    983       mFlashValue(CAM_FLASH_MODE_OFF),
    984       mFlashDaemonValue(CAM_FLASH_MODE_OFF),
    985       mHfrMode(CAM_HFR_MODE_OFF),
    986       m_bHDRModeSensor(true),
    987       mOfflineRAW(false),
    988       m_bTruePortraitOn(false),
    989       m_bIsLowMemoryDevice(false),
    990       mCds_mode(CAM_CDS_MODE_OFF),
    991       m_LLCaptureEnabled(FALSE),
    992       m_LowLightLevel(CAM_LOW_LIGHT_OFF),
    993       m_bLtmForSeeMoreEnabled(false),
    994       m_expTime(0),
    995       m_isoValue(0),
    996       m_ManualCaptureMode(CAM_MANUAL_CAPTURE_TYPE_OFF),
    997       m_dualLedCalibration(0),
    998       m_bInstantAEC(false),
    999       m_bInstantCapture(false),
   1000       mAecFrameBound(0),
   1001       mAecSkipDisplayFrameBound(0),
   1002       m_bQuadraCfa(false),
   1003       mMasterCamera(CAM_TYPE_MAIN),
   1004       m_bSmallJpegSize(false),
   1005       mSecureStraemType(CAM_STREAM_TYPE_PREVIEW),
   1006       mFrameNumber(0),
   1007       mSyncDCParam(0),
   1008       mAsymmetricSnapMode(false)
   1009 {
   1010     char value[PROPERTY_VALUE_MAX];
   1011     // TODO: may move to parameter instead of sysprop
   1012     property_get("persist.debug.sf.showfps", value, "0");
   1013     m_bDebugFps = atoi(value) > 0 ? true : false;
   1014 
   1015     // For thermal mode, it should be set as system property
   1016     // because system property applies to all applications, while
   1017     // parameters only apply to specific app.
   1018     property_get("persist.camera.thermal.mode", value, "fps");
   1019     if (!strcmp(value, "frameskip")) {
   1020         m_ThermalMode = QCAMERA_THERMAL_ADJUST_FRAMESKIP;
   1021     } else {
   1022         if (strcmp(value, "fps"))
   1023             LOGW("Invalid camera thermal mode %s", value);
   1024         m_ThermalMode = QCAMERA_THERMAL_ADJUST_FPS;
   1025     }
   1026 
   1027     memset(value, 0, sizeof(value));
   1028     // As per Power/Quality evaluation, LTM is enabled by default in SeeMore/StillMore usecase
   1029     // to improve the quality as there is no much impact to power
   1030     property_get("persist.camera.ltmforseemore", value, "1");
   1031     m_bLtmForSeeMoreEnabled = atoi(value);
   1032 
   1033     memset(&m_LiveSnapshotSize, 0, sizeof(m_LiveSnapshotSize));
   1034     memset(&m_default_fps_range, 0, sizeof(m_default_fps_range));
   1035     memset(&m_hfrFpsRange, 0, sizeof(m_hfrFpsRange));
   1036     memset(&m_stillmore_config, 0, sizeof(cam_still_more_t));
   1037     memset(&m_captureFrameConfig, 0, sizeof(cam_capture_frame_config_t));
   1038     memset(&m_relCamSyncInfo, 0, sizeof(cam_sync_related_sensors_event_info_t));
   1039     memset(m_pDualCamCmdPtr, 0, sizeof(m_pDualCamCmdPtr));
   1040     mTotalPPCount = 1;
   1041     mZoomLevel = 0;
   1042     mParmZoomLevel = 0;
   1043     mCurPPCount = 0;
   1044     mBufBatchCnt = 0;
   1045     mRotation = 0;
   1046     mJpegRotation = 0;
   1047     mVideoBatchSize = 0;
   1048     m_bOEMFeatEnabled = isOEMFeat1PropEnabled();
   1049     m_bDualCamera = 0;
   1050 }
   1051 
   1052 /*===========================================================================
   1053  * FUNCTION   : QCameraParameters
   1054  *
   1055  * DESCRIPTION: constructor of QCameraParameters
   1056  *
   1057  * PARAMETERS :
   1058  *   @params  : parameters in string
   1059  *
   1060  * RETURN     : None
   1061  *==========================================================================*/
   1062 QCameraParameters::QCameraParameters(const String8 &params)
   1063     : CameraParameters(params),
   1064     m_reprocScaleParam(),
   1065     m_pCapability(NULL),
   1066     m_pCamOpsTbl(NULL),
   1067     m_pParamHeap(NULL),
   1068     m_pParamBuf(NULL),
   1069     m_pParamBufAux(NULL),
   1070     m_pDualCamCmdHeap(NULL),
   1071     m_bFrameSyncEnabled(false),
   1072     m_bZslMode(false),
   1073     m_bZslMode_new(false),
   1074     m_bForceZslMode(false),
   1075     m_bRecordingHint(false),
   1076     m_bRecordingHint_new(false),
   1077     m_bHistogramEnabled(false),
   1078     m_bLongshotEnabled(false),
   1079     m_nFaceProcMask(0),
   1080     m_bDebugFps(false),
   1081     mFocusMode(CAM_FOCUS_MODE_MAX),
   1082     mPreviewFormat(CAM_FORMAT_YUV_420_NV21),
   1083     mAppPreviewFormat(CAM_FORMAT_YUV_420_NV21),
   1084     mPictureFormat(CAM_FORMAT_JPEG),
   1085     m_bNeedRestart(false),
   1086     m_bNoDisplayMode(false),
   1087     m_bWNROn(false),
   1088     m_bTNRPreviewOn(false),
   1089     m_bTNRVideoOn(false),
   1090     m_bTNRSnapshotOn(false),
   1091     m_bInited(false),
   1092     m_nRetroBurstNum(0),
   1093     m_nBurstLEDOnPeriod(100),
   1094     m_bPreviewFlipChanged(false),
   1095     m_bVideoFlipChanged(false),
   1096     m_bSnapshotFlipChanged(false),
   1097     m_bFixedFrameRateSet(false),
   1098     m_bHDREnabled(false),
   1099     m_bLocalHDREnabled(false),
   1100     m_bAVTimerEnabled(false),
   1101     m_AdjustFPS(NULL),
   1102     m_bHDR1xFrameEnabled(false),
   1103     m_HDRSceneEnabled(false),
   1104     m_bHDRThumbnailProcessNeeded(false),
   1105     m_bHDR1xExtraBufferNeeded(true),
   1106     m_bHDROutputCropEnabled(false),
   1107     m_tempMap(),
   1108     m_bAFBracketingOn(false),
   1109     m_bReFocusOn(false),
   1110     m_bChromaFlashOn(false),
   1111     m_bOptiZoomOn(false),
   1112     m_bSceneSelection(false),
   1113     m_SelectedScene(CAM_SCENE_MODE_MAX),
   1114     m_bSeeMoreOn(false),
   1115     m_bStillMoreOn(false),
   1116     m_bHighQualityNoiseReductionMode(false),
   1117     m_bHfrMode(false),
   1118     m_bSensorHDREnabled(false),
   1119     m_bRdiMode(false),
   1120     m_bSecureMode(false),
   1121     m_bAeBracketingEnabled(false),
   1122     mFlashValue(CAM_FLASH_MODE_OFF),
   1123     mFlashDaemonValue(CAM_FLASH_MODE_OFF),
   1124     mHfrMode(CAM_HFR_MODE_OFF),
   1125     m_bHDRModeSensor(true),
   1126     mOfflineRAW(false),
   1127     m_bTruePortraitOn(false),
   1128     m_bIsLowMemoryDevice(false),
   1129     mCds_mode(CAM_CDS_MODE_OFF),
   1130     mParmEffect(CAM_EFFECT_MODE_OFF),
   1131     m_LLCaptureEnabled(FALSE),
   1132     m_LowLightLevel(CAM_LOW_LIGHT_OFF),
   1133     m_bLtmForSeeMoreEnabled(false),
   1134     m_expTime(0),
   1135     m_isoValue(0),
   1136     m_ManualCaptureMode(CAM_MANUAL_CAPTURE_TYPE_OFF),
   1137     m_dualLedCalibration(0),
   1138     m_bInstantAEC(false),
   1139     m_bInstantCapture(false),
   1140     mAecFrameBound(0),
   1141     mAecSkipDisplayFrameBound(0),
   1142     m_bQuadraCfa(false),
   1143     mMasterCamera(CAM_TYPE_MAIN),
   1144     m_bSmallJpegSize(false),
   1145     mSecureStraemType(CAM_STREAM_TYPE_PREVIEW),
   1146     mFrameNumber(0),
   1147     mSyncDCParam(0),
   1148     mAsymmetricSnapMode(false)
   1149 {
   1150     memset(&m_LiveSnapshotSize, 0, sizeof(m_LiveSnapshotSize));
   1151     memset(&m_default_fps_range, 0, sizeof(m_default_fps_range));
   1152     memset(&m_hfrFpsRange, 0, sizeof(m_hfrFpsRange));
   1153     memset(&m_stillmore_config, 0, sizeof(cam_still_more_t));
   1154     memset(&m_relCamSyncInfo, 0, sizeof(cam_sync_related_sensors_event_info_t));
   1155     memset(m_pDualCamCmdPtr, 0, sizeof(m_pDualCamCmdPtr));
   1156     mTotalPPCount = 0;
   1157     mZoomLevel = 0;
   1158     mParmZoomLevel = 0;
   1159     mCurPPCount = 0;
   1160     mRotation = 0;
   1161     mJpegRotation = 0;
   1162     mBufBatchCnt = 0;
   1163     mVideoBatchSize = 0;
   1164     m_bOEMFeatEnabled = isOEMFeat1PropEnabled();
   1165     m_bDualCamera = 0;
   1166 }
   1167 
   1168 /*===========================================================================
   1169  * FUNCTION   : ~QCameraParameters
   1170  *
   1171  * DESCRIPTION: deconstructor of QCameraParameters
   1172  *
   1173  * PARAMETERS : none
   1174  *
   1175  * RETURN     : None
   1176  *==========================================================================*/
   1177 QCameraParameters::~QCameraParameters()
   1178 {
   1179     deinit();
   1180 }
   1181 
   1182 /*===========================================================================
   1183  * FUNCTION   : createSizesString
   1184  *
   1185  * DESCRIPTION: create string obj contains array of dimensions
   1186  *
   1187  * PARAMETERS :
   1188  *   @sizes   : array of dimensions
   1189  *   @len     : size of dimension array
   1190  *
   1191  * RETURN     : string obj
   1192  *==========================================================================*/
   1193 String8 QCameraParameters::createSizesString(const cam_dimension_t *sizes, size_t len)
   1194 {
   1195     String8 str;
   1196     char buffer[32];
   1197 
   1198     if (len > 0) {
   1199         snprintf(buffer, sizeof(buffer), "%dx%d", sizes[0].width, sizes[0].height);
   1200         str.append(buffer);
   1201     }
   1202     for (size_t i = 1; i < len; i++) {
   1203         snprintf(buffer, sizeof(buffer), ",%dx%d",
   1204                 sizes[i].width, sizes[i].height);
   1205         str.append(buffer);
   1206     }
   1207     return str;
   1208 }
   1209 
   1210 /*===========================================================================
   1211  * FUNCTION   : createValuesString
   1212  *
   1213  * DESCRIPTION: create string obj contains array of values from map when matched
   1214  *              from input values array
   1215  *
   1216  * PARAMETERS :
   1217  *   @values  : array of values
   1218  *   @len     : size of values array
   1219  *   @map     : map contains the mapping between values and enums
   1220  *   @map_len : size of the map
   1221  *
   1222  * RETURN     : string obj
   1223  *==========================================================================*/
   1224 template <typename valuesType, class mapType> String8 createValuesString(
   1225         const valuesType *values, size_t len, const mapType *map, size_t map_len)
   1226 {
   1227     String8 str;
   1228     int count = 0;
   1229 
   1230     for (size_t i = 0; i < len; i++ ) {
   1231         for (size_t j = 0; j < map_len; j ++)
   1232             if (map[j].val == values[i]) {
   1233                 if (NULL != map[j].desc) {
   1234                     if (count > 0) {
   1235                         str.append(",");
   1236                     }
   1237                     str.append(map[j].desc);
   1238                     count++;
   1239                     break; //loop j
   1240                 }
   1241             }
   1242     }
   1243     return str;
   1244 }
   1245 
   1246 /*===========================================================================
   1247  * FUNCTION   : createValuesStringFromMap
   1248  *
   1249  * DESCRIPTION: create string obj contains array of values directly from map
   1250  *
   1251  * PARAMETERS :
   1252  *   @map     : map contains the mapping between values and enums
   1253  *   @map_len : size of the map
   1254  *
   1255  * RETURN     : string obj
   1256  *==========================================================================*/
   1257 template <class mapType> String8 createValuesStringFromMap(
   1258         const mapType *map, size_t map_len)
   1259 {
   1260     String8 str;
   1261 
   1262     for (size_t i = 0; i < map_len; i++) {
   1263         if (NULL != map[i].desc) {
   1264             if (i > 0) {
   1265                 str.append(",");
   1266             }
   1267             str.append(map[i].desc);
   1268         }
   1269     }
   1270     return str;
   1271 }
   1272 
   1273 /*===========================================================================
   1274  * FUNCTION   : createZoomRatioValuesString
   1275  *
   1276  * DESCRIPTION: create string obj contains array of zoom ratio values
   1277  *
   1278  * PARAMETERS :
   1279  *   @zoomRaios  : array of zoom ratios
   1280  *   @length     : size of the array
   1281  *
   1282  * RETURN     : string obj
   1283  *==========================================================================*/
   1284 String8 QCameraParameters::createZoomRatioValuesString(uint32_t *zoomRatios,
   1285         size_t length)
   1286 {
   1287     String8 str;
   1288     char buffer[32] = {0};
   1289 
   1290     if(length > 0){
   1291         snprintf(buffer, sizeof(buffer), "%d", zoomRatios[0]);
   1292         str.append(buffer);
   1293     }
   1294 
   1295     for (size_t i = 1; i < length; i++) {
   1296         memset(buffer, 0, sizeof(buffer));
   1297         snprintf(buffer, sizeof(buffer), ",%d", zoomRatios[i]);
   1298         str.append(buffer);
   1299     }
   1300     return str;
   1301 }
   1302 
   1303 /*===========================================================================
   1304  * FUNCTION   : createHfrValuesString
   1305  *
   1306  * DESCRIPTION: create string obj contains array of hfr values from map when
   1307  *              matched from input hfr values
   1308  *
   1309  * PARAMETERS :
   1310  *   @values  : array of hfr info
   1311  *   @len     : size of the array
   1312  *   @map     : map of hfr string value and enum
   1313  *   map_len  : size of map
   1314  *
   1315  * RETURN     : string obj
   1316  *==========================================================================*/
   1317 String8 QCameraParameters::createHfrValuesString(const cam_hfr_info_t *values,
   1318         size_t len, const QCameraMap<cam_hfr_mode_t> *map, size_t map_len)
   1319 {
   1320     String8 str;
   1321     int count = 0;
   1322 
   1323     //Create HFR supported size string.
   1324     for (size_t i = 0; i < len; i++ ) {
   1325         for (size_t j = 0; j < map_len; j ++) {
   1326             if (map[j].val == (int)values[i].mode) {
   1327                 if (NULL != map[j].desc) {
   1328                     if (count > 0) {
   1329                         str.append(",");
   1330                     }
   1331                      str.append(map[j].desc);
   1332                      count++;
   1333                      break; //loop j
   1334                 }
   1335             }
   1336         }
   1337     }
   1338     if (count > 0) {
   1339         str.append(",");
   1340     }
   1341     str.append(VIDEO_HFR_OFF);
   1342     return str;
   1343 }
   1344 
   1345 /*===========================================================================
   1346  * FUNCTION   : createHfrSizesString
   1347  *
   1348  * DESCRIPTION: create string obj contains array of hfr sizes
   1349  *
   1350  * PARAMETERS :
   1351  *   @values  : array of hfr info
   1352  *   @len     : size of the array
   1353  *
   1354  * RETURN     : string obj
   1355  *==========================================================================*/
   1356 String8 QCameraParameters::createHfrSizesString(const cam_hfr_info_t *values, size_t len)
   1357 {
   1358     String8 str;
   1359     char buffer[32];
   1360 
   1361     if (len > 0) {
   1362         snprintf(buffer, sizeof(buffer), "%dx%d",
   1363                  values[0].dim[0].width, values[0].dim[0].height);
   1364         str.append(buffer);
   1365     }
   1366     for (size_t i = 1; i < len; i++) {
   1367         snprintf(buffer, sizeof(buffer), ",%dx%d",
   1368                  values[i].dim[0].width, values[i].dim[0].height);
   1369         str.append(buffer);
   1370     }
   1371     return str;
   1372 }
   1373 
   1374 /*===========================================================================
   1375  * FUNCTION   : createFpsString
   1376  *
   1377  * DESCRIPTION: create string obj contains array of FPS rates
   1378  *
   1379  * PARAMETERS :
   1380  *   @fps     : default fps range
   1381  *
   1382  * RETURN     : string obj
   1383  *==========================================================================*/
   1384 String8 QCameraParameters::createFpsString(cam_fps_range_t &fps)
   1385 {
   1386     char buffer[32];
   1387     String8 fpsValues;
   1388 
   1389     int min_fps = int(fps.min_fps);
   1390     int max_fps = int(fps.max_fps);
   1391 
   1392     if (min_fps < fps.min_fps){
   1393         min_fps++;
   1394     }
   1395     if (max_fps > fps.max_fps) {
   1396         max_fps--;
   1397     }
   1398     if (min_fps <= max_fps) {
   1399         snprintf(buffer, sizeof(buffer), "%d", min_fps);
   1400         fpsValues.append(buffer);
   1401     }
   1402 
   1403     for (int i = min_fps+1; i <= max_fps; i++) {
   1404         snprintf(buffer, sizeof(buffer), ",%d", i);
   1405         fpsValues.append(buffer);
   1406     }
   1407 
   1408     return fpsValues;
   1409 }
   1410 
   1411 /*===========================================================================
   1412  * FUNCTION   : createFpsRangeString
   1413  *
   1414  * DESCRIPTION: create string obj contains array of FPS ranges
   1415  *
   1416  * PARAMETERS :
   1417  *   @fps     : array of fps ranges
   1418  *   @len     : size of the array
   1419  *   @default_fps_index : reference to index of default fps range
   1420  *
   1421  * RETURN     : string obj
   1422  *==========================================================================*/
   1423 String8 QCameraParameters::createFpsRangeString(const cam_fps_range_t* fps,
   1424         size_t len, int &default_fps_index)
   1425 {
   1426     String8 str;
   1427     char buffer[32];
   1428     int max_range = 0;
   1429     int min_fps, max_fps;
   1430 
   1431     if (len > 0) {
   1432         min_fps = int(fps[0].min_fps * 1000);
   1433         max_fps = int(fps[0].max_fps * 1000);
   1434         max_range = max_fps - min_fps;
   1435         default_fps_index = 0;
   1436         snprintf(buffer, sizeof(buffer), "(%d,%d)", min_fps, max_fps);
   1437         str.append(buffer);
   1438     }
   1439     for (size_t i = 1; i < len; i++) {
   1440         min_fps = int(fps[i].min_fps * 1000);
   1441         max_fps = int(fps[i].max_fps * 1000);
   1442         if (max_range < (max_fps - min_fps)) {
   1443             max_range = max_fps - min_fps;
   1444             default_fps_index = (int)i;
   1445         }
   1446         snprintf(buffer, sizeof(buffer), ",(%d,%d)", min_fps, max_fps);
   1447         str.append(buffer);
   1448     }
   1449     return str;
   1450 }
   1451 
   1452 /*===========================================================================
   1453  * FUNCTION   : lookupAttr
   1454  *
   1455  * DESCRIPTION: lookup a value by its name
   1456  *
   1457  * PARAMETERS :
   1458  *   @attr    : map contains <name, value>
   1459  *   @len     : size of the map
   1460  *   @name    : name to be looked up
   1461  *
   1462  * RETURN     : valid value if found
   1463  *              NAME_NOT_FOUND if not found
   1464  *==========================================================================*/
   1465 template <class mapType> int lookupAttr(const mapType *arr,
   1466         size_t len, const char *name)
   1467 {
   1468     if (name) {
   1469         for (size_t i = 0; i < len; i++) {
   1470             if (!strcmp(arr[i].desc, name))
   1471                 return arr[i].val;
   1472         }
   1473     }
   1474     return NAME_NOT_FOUND;
   1475 }
   1476 
   1477 /*===========================================================================
   1478  * FUNCTION   : lookupNameByValue
   1479  *
   1480  * DESCRIPTION: lookup a name by its value
   1481  *
   1482  * PARAMETERS :
   1483  *   @attr    : map contains <name, value>
   1484  *   @len     : size of the map
   1485  *   @value   : value to be looked up
   1486  *
   1487  * RETURN     : name str or NULL if not found
   1488  *==========================================================================*/
   1489 template <class mapType> const char *lookupNameByValue(const mapType *arr,
   1490         size_t len, int value)
   1491 {
   1492     for (size_t i = 0; i < len; i++) {
   1493         if (arr[i].val == value) {
   1494             return arr[i].desc;
   1495         }
   1496     }
   1497     return NULL;
   1498 }
   1499 
   1500 /*===========================================================================
   1501  * FUNCTION   : setPreviewSize
   1502  *
   1503  * DESCRIPTION: set preview size from user setting
   1504  *
   1505  * PARAMETERS :
   1506  *   @params  : user setting parameters
   1507  *
   1508  * RETURN     : int32_t type of status
   1509  *              NO_ERROR  -- success
   1510  *              none-zero failure code
   1511  *==========================================================================*/
   1512 int32_t QCameraParameters::setPreviewSize(const QCameraParameters& params)
   1513 {
   1514     int width = 0, height = 0;
   1515     int old_width = 0, old_height = 0;
   1516     params.getPreviewSize(&width, &height);
   1517     CameraParameters::getPreviewSize(&old_width, &old_height);
   1518 
   1519     // Validate the preview size
   1520     for (size_t i = 0; i < m_pCapability->preview_sizes_tbl_cnt; ++i) {
   1521         if (width ==  m_pCapability->preview_sizes_tbl[i].width
   1522            && height ==  m_pCapability->preview_sizes_tbl[i].height) {
   1523             // check if need to restart preview in case of preview size change
   1524             if (width != old_width || height != old_height) {
   1525                 LOGI("Requested preview size %d x %d", width, height);
   1526                 m_bNeedRestart = true;
   1527             }
   1528             // set the new value
   1529             CameraParameters::setPreviewSize(width, height);
   1530             return NO_ERROR;
   1531         }
   1532     }
   1533     if (m_relCamSyncInfo.mode == CAM_MODE_SECONDARY) {
   1534         char prop[PROPERTY_VALUE_MAX];
   1535         // set prop to configure aux preview size
   1536         property_get("persist.camera.aux.preview.size", prop, "0");
   1537         parse_pair(prop, &width, &height, 'x', NULL);
   1538         bool foundMatch = false;
   1539         for (size_t i = 0; i < m_pCapability->preview_sizes_tbl_cnt; ++i) {
   1540             if (width ==  m_pCapability->preview_sizes_tbl[i].width &&
   1541                     height ==  m_pCapability->preview_sizes_tbl[i].height) {
   1542                foundMatch = true;
   1543             }
   1544         }
   1545         if (!foundMatch) {
   1546             width = m_pCapability->preview_sizes_tbl[0].width;
   1547             height = m_pCapability->preview_sizes_tbl[0].height;
   1548         }
   1549         // check if need to restart preview in case of preview size change
   1550         if (width != old_width || height != old_height) {
   1551             m_bNeedRestart = true;
   1552         }
   1553         CameraParameters::setPreviewSize(width, height);
   1554         LOGH("Secondary Camera: preview size %d x %d", width, height);
   1555         return NO_ERROR;
   1556     }
   1557 
   1558     LOGE("Invalid preview size requested: %dx%d", width, height);
   1559     return BAD_VALUE;
   1560 }
   1561 
   1562 /*===========================================================================
   1563  * FUNCTION   : setPictureSize
   1564  *
   1565  * DESCRIPTION: set picture size from user setting
   1566  *
   1567  * PARAMETERS :
   1568  *   @params  : user setting parameters
   1569  *
   1570  * RETURN     : int32_t type of status
   1571  *              NO_ERROR  -- success
   1572  *              none-zero failure code
   1573  *==========================================================================*/
   1574 int32_t QCameraParameters::setPictureSize(const QCameraParameters& params)
   1575 {
   1576     int width, height;
   1577     params.getPictureSize(&width, &height);
   1578     int old_width, old_height;
   1579     CameraParameters::getPictureSize(&old_width, &old_height);
   1580 
   1581     // Validate the picture size
   1582     if(!m_reprocScaleParam.isScaleEnabled()){
   1583         for (size_t i = 0; i < m_pCapability->picture_sizes_tbl_cnt; ++i) {
   1584             if (width ==  m_pCapability->picture_sizes_tbl[i].width
   1585                && height ==  m_pCapability->picture_sizes_tbl[i].height) {
   1586                 // check if need to restart preview in case of picture size change
   1587                 if ((m_bZslMode || m_bRecordingHint) &&
   1588                     (width != old_width || height != old_height)) {
   1589                     LOGI("Requested picture size %d x %d", width, height);
   1590                     m_bNeedRestart = true;
   1591                 }
   1592                 // set the new value
   1593                 CameraParameters::setPictureSize(width, height);
   1594                 // Update View angles based on Picture Aspect ratio
   1595                 updateViewAngles();
   1596                 return NO_ERROR;
   1597             }
   1598         }
   1599     }else{
   1600         //should use scaled picture size table to validate
   1601         if(m_reprocScaleParam.setValidatePicSize(width, height) == NO_ERROR){
   1602             // check if need to restart preview in case of picture size change
   1603             if ((m_bZslMode || m_bRecordingHint) &&
   1604                 (width != old_width || height != old_height)) {
   1605                 m_bNeedRestart = true;
   1606             }
   1607             // set the new value
   1608             char val[32];
   1609             snprintf(val, sizeof(val), "%dx%d", width, height);
   1610             updateParamEntry(KEY_PICTURE_SIZE, val);
   1611             LOGH("%s", val);
   1612             // Update View angles based on Picture Aspect ratio
   1613             updateViewAngles();
   1614             return NO_ERROR;
   1615         }
   1616     }
   1617     if (m_relCamSyncInfo.mode == CAM_MODE_SECONDARY) {
   1618         char prop[PROPERTY_VALUE_MAX];
   1619         // set prop to configure aux preview size
   1620         property_get("persist.camera.aux.picture.size", prop, "0");
   1621         parse_pair(prop, &width, &height, 'x', NULL);
   1622         bool foundMatch = false;
   1623         for (size_t i = 0; i < m_pCapability->picture_sizes_tbl_cnt; ++i) {
   1624             if (width ==  m_pCapability->picture_sizes_tbl[i].width &&
   1625                     height ==  m_pCapability->picture_sizes_tbl[i].height) {
   1626                foundMatch = true;
   1627             }
   1628         }
   1629         if (!foundMatch) {
   1630             width = m_pCapability->picture_sizes_tbl[0].width;
   1631             height = m_pCapability->picture_sizes_tbl[0].height;
   1632         }
   1633         // check if need to restart preview in case of preview size change
   1634         if (width != old_width || height != old_height) {
   1635             m_bNeedRestart = true;
   1636         }
   1637         char val[32];
   1638         snprintf(val, sizeof(val), "%dx%d", width, height);
   1639         set(KEY_PICTURE_SIZE, val);
   1640         LOGH("Secondary Camera: picture size %s", val);
   1641         return NO_ERROR;
   1642     }
   1643     LOGE("Invalid picture size requested: %dx%d", width, height);
   1644     return BAD_VALUE;
   1645 }
   1646 
   1647 /*===========================================================================
   1648  * FUNCTION   : updateViewAngles
   1649  *
   1650  * DESCRIPTION: Update the Horizontal & Vertical based on the Aspect ratio of Preview and
   1651  *                        Picture aspect ratio
   1652  *
   1653  * PARAMETERS : none
   1654  *
   1655  * RETURN     : none
   1656  *==========================================================================*/
   1657 void QCameraParameters::updateViewAngles()
   1658 {
   1659     double stillAspectRatio, maxPictureAspectRatio;
   1660     int stillWidth, stillHeight, maxWidth, maxHeight;
   1661     // The crop factors from the full sensor array to the still picture crop region
   1662     double horizCropFactor = 1.f,vertCropFactor = 1.f;
   1663     float horizViewAngle, vertViewAngle, maxHfov, maxVfov;
   1664 
   1665     // Get current Picture & max Snapshot sizes
   1666     getPictureSize(&stillWidth, &stillHeight);
   1667     maxWidth  = m_pCapability->picture_sizes_tbl[0].width;
   1668     maxHeight = m_pCapability->picture_sizes_tbl[0].height;
   1669 
   1670     // Get default maximum FOV from corresponding sensor driver
   1671     maxHfov = m_pCapability->hor_view_angle;
   1672     maxVfov = m_pCapability->ver_view_angle;
   1673 
   1674     stillAspectRatio = (double)stillWidth/stillHeight;
   1675     maxPictureAspectRatio = (double)maxWidth/maxHeight;
   1676     LOGD("Stillwidth: %d, height: %d", stillWidth, stillHeight);
   1677     LOGD("Max width: %d, height: %d", maxWidth, maxHeight);
   1678     LOGD("still aspect: %f, Max Pic Aspect: %f",
   1679             stillAspectRatio, maxPictureAspectRatio);
   1680 
   1681     // crop as per the Maximum Snapshot aspect ratio
   1682     if (stillAspectRatio < maxPictureAspectRatio)
   1683         horizCropFactor = stillAspectRatio/maxPictureAspectRatio;
   1684     else
   1685         vertCropFactor = maxPictureAspectRatio/stillAspectRatio;
   1686 
   1687     LOGD("horizCropFactor %f, vertCropFactor %f",
   1688              horizCropFactor, vertCropFactor);
   1689 
   1690     // Now derive the final FOV's based on field of view formula is i.e,
   1691     // angle of view = 2 * arctangent ( d / 2f )
   1692     // where d is the physical sensor dimension of interest, and f is
   1693     // the focal length. This only applies to rectilinear sensors, for focusing
   1694     // at distances >> f, etc.
   1695     // Here d/2f is nothing but the Maximum Horizontal or Veritical FOV
   1696     horizViewAngle = (180/PI)*2*atan(horizCropFactor*tan((maxHfov/2)*(PI/180)));
   1697     vertViewAngle = (180/PI)*2*atan(horizCropFactor*tan((maxVfov/2)*(PI/180)));
   1698 
   1699     setFloat(QCameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizViewAngle);
   1700     setFloat(QCameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertViewAngle);
   1701     LOGH("Final horizViewAngle %f, vertViewAngle %f",
   1702             horizViewAngle, vertViewAngle);
   1703 }
   1704 
   1705 /*===========================================================================
   1706  * FUNCTION   : setVideoSize
   1707  *
   1708  * DESCRIPTION: set video size from user setting
   1709  *
   1710  * PARAMETERS :
   1711  *   @params  : user setting parameters
   1712  *
   1713  * RETURN     : int32_t type of status
   1714  *              NO_ERROR  -- success
   1715  *              none-zero failure code
   1716  *==========================================================================*/
   1717 int32_t QCameraParameters::setVideoSize(const QCameraParameters& params)
   1718 {
   1719     const char *str= NULL;
   1720     int width, height;
   1721     str = params.get(KEY_VIDEO_SIZE);
   1722     int old_width, old_height;
   1723     CameraParameters::getVideoSize(&old_width, &old_height);
   1724     if(!str) {
   1725         //If application didn't set this parameter string, use the values from
   1726         //getPreviewSize() as video dimensions.
   1727         params.getPreviewSize(&width, &height);
   1728         LOGW("No Record Size requested, use the preview dimensions");
   1729     } else {
   1730         params.getVideoSize(&width, &height);
   1731     }
   1732 
   1733     // Validate the video size
   1734     for (size_t i = 0; i < m_pCapability->video_sizes_tbl_cnt; ++i) {
   1735         if (width ==  m_pCapability->video_sizes_tbl[i].width
   1736                 && height ==  m_pCapability->video_sizes_tbl[i].height) {
   1737             // check if need to restart preview in case of video size change
   1738             if (m_bRecordingHint &&
   1739                (width != old_width || height != old_height)) {
   1740                 m_bNeedRestart = true;
   1741             }
   1742 
   1743             // set the new value
   1744             LOGH("Requested video size %d x %d", width, height);
   1745             CameraParameters::setVideoSize(width, height);
   1746             return NO_ERROR;
   1747         }
   1748     }
   1749     if (m_relCamSyncInfo.mode == CAM_MODE_SECONDARY) {
   1750         // Set the default preview size for secondary camera
   1751         width = m_pCapability->video_sizes_tbl[0].width;
   1752         height = m_pCapability->video_sizes_tbl[0].height;
   1753         // check if need to restart preview in case of preview size change
   1754         if (width != old_width || height != old_height) {
   1755             m_bNeedRestart = true;
   1756         }
   1757 
   1758         CameraParameters::setVideoSize(width, height);
   1759         LOGH("Secondary Camera: video size %d x %d",
   1760                  width, height);
   1761         return NO_ERROR;
   1762     }
   1763 
   1764     LOGE("Error !! Invalid video size requested: %dx%d", width, height);
   1765     return BAD_VALUE;
   1766 }
   1767 
   1768 /*===========================================================================
   1769  * FUNCTION   : getLiveSnapshotSize
   1770  *
   1771  * DESCRIPTION: get live snapshot size
   1772  *
   1773  * PARAMETERS : dim - Update dim with the liveshot size
   1774  *
   1775  *==========================================================================*/
   1776 void QCameraParameters::getLiveSnapshotSize(cam_dimension_t &dim)
   1777 {
   1778     if(is4k2kVideoResolution()) {
   1779         // We support maximum 8M liveshot @4K2K video resolution
   1780         cam_dimension_t resolution = {0, 0};
   1781         CameraParameters::getVideoSize(&resolution.width, &resolution.height);
   1782         if((m_LiveSnapshotSize.width > resolution.width) ||
   1783                 (m_LiveSnapshotSize.height > resolution.height)) {
   1784             m_LiveSnapshotSize.width = resolution.width;
   1785             m_LiveSnapshotSize.height = resolution.height;
   1786         }
   1787     }
   1788     dim = m_LiveSnapshotSize;
   1789     LOGH("w x h: %d x %d", dim.width, dim.height);
   1790 }
   1791 
   1792 /*===========================================================================
   1793  * FUNCTION   : setLiveSnapshotSize
   1794  *
   1795  * DESCRIPTION: set live snapshot size
   1796  *
   1797  * PARAMETERS :
   1798  *   @params  : user setting parameters
   1799  *
   1800  * RETURN     : int32_t type of status
   1801  *              NO_ERROR  -- success
   1802  *              none-zero failure code
   1803  *==========================================================================*/
   1804 int32_t QCameraParameters::setLiveSnapshotSize(const QCameraParameters& params)
   1805 {
   1806     char value[PROPERTY_VALUE_MAX];
   1807     property_get("persist.camera.opt.livepic", value, "1");
   1808     bool useOptimal = atoi(value) > 0 ? true : false;
   1809     bool vHdrOn;
   1810     int32_t liveSnapWidth = 0, liveSnapHeight = 0;
   1811     // use picture size from user setting
   1812     params.getPictureSize(&m_LiveSnapshotSize.width, &m_LiveSnapshotSize.height);
   1813 
   1814     size_t livesnapshot_sizes_tbl_cnt =
   1815             m_pCapability->livesnapshot_sizes_tbl_cnt;
   1816     cam_dimension_t *livesnapshot_sizes_tbl =
   1817             &m_pCapability->livesnapshot_sizes_tbl[0];
   1818 
   1819     if(is4k2kVideoResolution()) {
   1820         // We support maximum 8M liveshot @4K2K video resolution
   1821         cam_dimension_t resolution = {0, 0};
   1822         CameraParameters::getVideoSize(&resolution.width, &resolution.height);
   1823         if((m_LiveSnapshotSize.width > resolution.width) ||
   1824                 (m_LiveSnapshotSize.height > resolution.height)) {
   1825             m_LiveSnapshotSize.width = resolution.width;
   1826             m_LiveSnapshotSize.height = resolution.height;
   1827         }
   1828     }
   1829 
   1830     // check if HFR is enabled
   1831     const char *hfrStr = params.get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
   1832     cam_hfr_mode_t hfrMode = CAM_HFR_MODE_OFF;
   1833     const char *hsrStr = params.get(KEY_QC_VIDEO_HIGH_SPEED_RECORDING);
   1834 
   1835     const char *vhdrStr = params.get(KEY_QC_VIDEO_HDR);
   1836     vHdrOn = (vhdrStr != NULL && (0 == strcmp(vhdrStr,"on"))) ? true : false;
   1837     if (vHdrOn) {
   1838         livesnapshot_sizes_tbl_cnt = m_pCapability->vhdr_livesnapshot_sizes_tbl_cnt;
   1839         livesnapshot_sizes_tbl = &m_pCapability->vhdr_livesnapshot_sizes_tbl[0];
   1840     }
   1841     if ((hsrStr != NULL) && strcmp(hsrStr, "off")) {
   1842         int32_t hsr = lookupAttr(HFR_MODES_MAP, PARAM_MAP_SIZE(HFR_MODES_MAP), hsrStr);
   1843         if ((hsr != NAME_NOT_FOUND) && (hsr > CAM_HFR_MODE_OFF)) {
   1844             // if HSR is enabled, change live snapshot size
   1845             for (size_t i = 0; i < m_pCapability->hfr_tbl_cnt; i++) {
   1846                 if (m_pCapability->hfr_tbl[i].mode == hsr) {
   1847                     livesnapshot_sizes_tbl_cnt =
   1848                             m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl_cnt;
   1849                     livesnapshot_sizes_tbl =
   1850                             &m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl[0];
   1851                     hfrMode = m_pCapability->hfr_tbl[i].mode;
   1852                     break;
   1853                 }
   1854             }
   1855         }
   1856     } else if ((hfrStr != NULL) && strcmp(hfrStr, "off")) {
   1857         int32_t hfr = lookupAttr(HFR_MODES_MAP, PARAM_MAP_SIZE(HFR_MODES_MAP), hfrStr);
   1858         if ((hfr != NAME_NOT_FOUND) && (hfr > CAM_HFR_MODE_OFF)) {
   1859             // if HFR is enabled, change live snapshot size
   1860             for (size_t i = 0; i < m_pCapability->hfr_tbl_cnt; i++) {
   1861                 if (m_pCapability->hfr_tbl[i].mode == hfr) {
   1862                     livesnapshot_sizes_tbl_cnt =
   1863                             m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl_cnt;
   1864                     livesnapshot_sizes_tbl =
   1865                             &m_pCapability->hfr_tbl[i].livesnapshot_sizes_tbl[0];
   1866                     hfrMode = m_pCapability->hfr_tbl[i].mode;
   1867                     break;
   1868                 }
   1869             }
   1870         }
   1871     }
   1872 
   1873     if (useOptimal || hfrMode != CAM_HFR_MODE_OFF || vHdrOn) {
   1874         bool found = false;
   1875 
   1876         // first check if picture size is within the list of supported sizes
   1877         for (size_t i = 0; i < livesnapshot_sizes_tbl_cnt; ++i) {
   1878             if (m_LiveSnapshotSize.width == livesnapshot_sizes_tbl[i].width &&
   1879                 m_LiveSnapshotSize.height == livesnapshot_sizes_tbl[i].height) {
   1880                 found = true;
   1881                 break;
   1882             }
   1883         }
   1884 
   1885         if (!found) {
   1886             // use optimal live snapshot size from supported list,
   1887             // that has same preview aspect ratio
   1888             int width = 0, height = 0;
   1889             params.getPreviewSize(&width, &height);
   1890 
   1891             double previewAspectRatio = (double)width / height;
   1892             for (size_t i = 0; i < livesnapshot_sizes_tbl_cnt; ++i) {
   1893                 double ratio = (double)livesnapshot_sizes_tbl[i].width /
   1894                                 livesnapshot_sizes_tbl[i].height;
   1895                 if (fabs(previewAspectRatio - ratio) <= ASPECT_TOLERANCE) {
   1896                     m_LiveSnapshotSize = livesnapshot_sizes_tbl[i];
   1897                     found = true;
   1898                     break;
   1899                 }
   1900             }
   1901 
   1902             if (!found && ((hfrMode != CAM_HFR_MODE_OFF) || vHdrOn)) {
   1903                 // Cannot find matching aspect ration from supported live snapshot list
   1904                 // choose the max dim from preview and video size
   1905                 LOGD("Cannot find matching aspect ratio, choose max of preview or video size");
   1906                 params.getVideoSize(&m_LiveSnapshotSize.width, &m_LiveSnapshotSize.height);
   1907                 if (m_LiveSnapshotSize.width < width && m_LiveSnapshotSize.height < height) {
   1908                     m_LiveSnapshotSize.width = width;
   1909                     m_LiveSnapshotSize.height = height;
   1910                 }
   1911             }
   1912         }
   1913     }
   1914     //To read liveshot resolution from setprop instead of matching aspect ratio.
   1915     //The setprop resolution format should be WxH.
   1916     //e.g: adb shell setprop persist.camera.liveshot.size 1280x720
   1917     memset(value, 0, PROPERTY_VALUE_MAX);
   1918     property_get("persist.camera.liveshot.size", value, "");
   1919     if (strlen(value) > 0) {
   1920         char *saveptr = NULL;
   1921         char *token = strtok_r(value, "x", &saveptr);
   1922         if (token != NULL) {
   1923             liveSnapWidth = atoi(token);
   1924         }
   1925         token = strtok_r(NULL, "x", &saveptr);
   1926         if (token != NULL) {
   1927             liveSnapHeight = atoi(token);
   1928         }
   1929         if ((liveSnapWidth!=0) && (liveSnapHeight!=0)) {
   1930             for (size_t i = 0; i < m_pCapability->picture_sizes_tbl_cnt; ++i) {
   1931                 if (liveSnapWidth ==  m_pCapability->picture_sizes_tbl[i].width
   1932                         && liveSnapHeight ==  m_pCapability->picture_sizes_tbl[i].height) {
   1933                    m_LiveSnapshotSize.width = liveSnapWidth;
   1934                    m_LiveSnapshotSize.height = liveSnapHeight;
   1935                    break;
   1936                 }
   1937             }
   1938         }
   1939     }
   1940     LOGH("live snapshot size %d x %d",
   1941           m_LiveSnapshotSize.width, m_LiveSnapshotSize.height);
   1942 
   1943     return NO_ERROR;
   1944 }
   1945 
   1946 
   1947 /*===========================================================================
   1948  * FUNCTION   : setRawSize
   1949  *
   1950  * DESCRIPTION: set live snapshot size
   1951  *
   1952  * PARAMETERS :
   1953  *   @params  : user setting parameters
   1954  *
   1955  * RETURN     : int32_t type of status
   1956  *              NO_ERROR  -- success
   1957  *              none-zero failure code
   1958  *==========================================================================*/
   1959 int32_t QCameraParameters::setRawSize(cam_dimension_t &dim)
   1960 {
   1961     m_rawSize = dim;
   1962     return NO_ERROR;
   1963 }
   1964 /*===========================================================================
   1965  * FUNCTION   : setPreviewFormat
   1966  *
   1967  * DESCRIPTION: set preview format from user setting
   1968  *
   1969  * PARAMETERS :
   1970  *   @params  : user setting parameters
   1971  *
   1972  * RETURN     : int32_t type of status
   1973  *              NO_ERROR  -- success
   1974  *              none-zero failure code
   1975  *==========================================================================*/
   1976 int32_t QCameraParameters::setPreviewFormat(const QCameraParameters& params)
   1977 {
   1978     const char *str = params.getPreviewFormat();
   1979     int32_t previewFormat = lookupAttr(PREVIEW_FORMATS_MAP,
   1980             PARAM_MAP_SIZE(PREVIEW_FORMATS_MAP), str);
   1981     if (previewFormat != NAME_NOT_FOUND) {
   1982         if (isUBWCEnabled()) {
   1983             char prop[PROPERTY_VALUE_MAX];
   1984             int pFormat;
   1985             memset(prop, 0, sizeof(prop));
   1986             property_get("persist.camera.preview.ubwc", prop, "1");
   1987 
   1988             pFormat = atoi(prop);
   1989             if (pFormat == 1) {
   1990                 mPreviewFormat = CAM_FORMAT_YUV_420_NV12_UBWC;
   1991                 mAppPreviewFormat = (cam_format_t)previewFormat;
   1992             } else {
   1993                 mPreviewFormat = (cam_format_t)previewFormat;
   1994                 mAppPreviewFormat = (cam_format_t)previewFormat;
   1995             }
   1996         } else {
   1997             mPreviewFormat = (cam_format_t)previewFormat;
   1998             mAppPreviewFormat = (cam_format_t)previewFormat;
   1999         }
   2000         CameraParameters::setPreviewFormat(str);
   2001         LOGH("format %d\n", mPreviewFormat);
   2002         return NO_ERROR;
   2003     }
   2004     LOGE("Invalid preview format value: %s", (str == NULL) ? "NULL" : str);
   2005     return BAD_VALUE;
   2006 }
   2007 
   2008 /*===========================================================================
   2009  * FUNCTION   : setPictureFormat
   2010  *
   2011  * DESCRIPTION: set picture format from user setting
   2012  *
   2013  * PARAMETERS :
   2014  *   @params  : user setting parameters
   2015  *
   2016  * RETURN     : int32_t type of status
   2017  *              NO_ERROR  -- success
   2018  *              none-zero failure code
   2019  *==========================================================================*/
   2020 int32_t QCameraParameters::setPictureFormat(const QCameraParameters& params)
   2021 {
   2022     const char *str = params.getPictureFormat();
   2023     int32_t pictureFormat = lookupAttr(PICTURE_TYPES_MAP, PARAM_MAP_SIZE(PICTURE_TYPES_MAP), str);
   2024     if (pictureFormat != NAME_NOT_FOUND) {
   2025         mPictureFormat = pictureFormat;
   2026 
   2027         CameraParameters::setPictureFormat(str);
   2028         LOGH("format %d\n", mPictureFormat);
   2029         return NO_ERROR;
   2030     }
   2031     LOGE("Invalid picture format value: %s", (str == NULL) ? "NULL" : str);
   2032     return BAD_VALUE;
   2033 }
   2034 
   2035 /*===========================================================================
   2036  * FUNCTION   : setJpegThumbnailSize
   2037  *
   2038  * DESCRIPTION: set jpeg thumbnail size from user setting
   2039  *
   2040  * PARAMETERS :
   2041  *   @params  : user setting parameters
   2042  *
   2043  * RETURN     : int32_t type of status
   2044  *              NO_ERROR  -- success
   2045  *              none-zero failure code
   2046  *==========================================================================*/
   2047 int32_t QCameraParameters::setJpegThumbnailSize(const QCameraParameters& params)
   2048 {
   2049     int width = params.getInt(KEY_JPEG_THUMBNAIL_WIDTH);
   2050     int height = params.getInt(KEY_JPEG_THUMBNAIL_HEIGHT);
   2051 
   2052     LOGD("requested jpeg thumbnail size %d x %d", width, height);
   2053     int sizes_cnt = sizeof(THUMBNAIL_SIZES_MAP) / sizeof(cam_dimension_t);
   2054     // Validate thumbnail size
   2055     for (int i = 0; i < sizes_cnt; i++) {
   2056         if (width == THUMBNAIL_SIZES_MAP[i].width &&
   2057                 height == THUMBNAIL_SIZES_MAP[i].height) {
   2058            set(KEY_JPEG_THUMBNAIL_WIDTH, width);
   2059            set(KEY_JPEG_THUMBNAIL_HEIGHT, height);
   2060            return NO_ERROR;
   2061         }
   2062     }
   2063     LOGE("error: setting jpeg thumbnail size (%d, %d)", width, height);
   2064     return BAD_VALUE;
   2065 }
   2066 
   2067 /*===========================================================================
   2068 
   2069  * FUNCTION   : setBurstLEDOnPeriod
   2070  *
   2071  * DESCRIPTION: set burst LED on period
   2072  *
   2073  * PARAMETERS :
   2074  *   @params  : user setting parameters
   2075  *
   2076  * RETURN     : int32_t type of status
   2077  *              NO_ERROR  -- success
   2078  *              none-zero failure code
   2079  *==========================================================================*/
   2080 int32_t QCameraParameters::setBurstLEDOnPeriod(const QCameraParameters& params)
   2081 {
   2082     int nBurstLEDOnPeriod = params.getInt(KEY_QC_SNAPSHOT_BURST_LED_ON_PERIOD);
   2083     //Check if the LED ON period is within limits
   2084     if ((nBurstLEDOnPeriod <= 0) || (nBurstLEDOnPeriod > 800)) {
   2085         // if burst led on period is not set in parameters,
   2086         // read from sys prop
   2087         char prop[PROPERTY_VALUE_MAX];
   2088         memset(prop, 0, sizeof(prop));
   2089         property_get("persist.camera.led.on.period", prop, "0");
   2090         nBurstLEDOnPeriod = atoi(prop);
   2091         if (nBurstLEDOnPeriod <= 0) {
   2092             nBurstLEDOnPeriod = 300;
   2093         }
   2094     }
   2095 
   2096     set(KEY_QC_SNAPSHOT_BURST_LED_ON_PERIOD, nBurstLEDOnPeriod);
   2097     m_nBurstLEDOnPeriod = nBurstLEDOnPeriod;
   2098     LOGH("Burst LED on period  %u", m_nBurstLEDOnPeriod);
   2099     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_BURST_LED_ON_PERIOD,
   2100             (uint32_t)nBurstLEDOnPeriod)) {
   2101         return BAD_VALUE;
   2102     }
   2103 
   2104     return NO_ERROR;
   2105 }
   2106 
   2107 
   2108 
   2109 /*===========================================================================
   2110  * FUNCTION   : setRetroActiveBurstNum
   2111  *
   2112  * DESCRIPTION: set retro active burst num
   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::setRetroActiveBurstNum(
   2122         const QCameraParameters& params)
   2123 {
   2124     int32_t nBurstNum = params.getInt(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER);
   2125     LOGH("m_nRetroBurstNum = %d", m_nRetroBurstNum);
   2126     if (nBurstNum <= 0) {
   2127         // if burst number is not set in parameters,
   2128         // read from sys prop
   2129         char prop[PROPERTY_VALUE_MAX];
   2130         memset(prop, 0, sizeof(prop));
   2131         property_get("persist.camera.retro.number", prop, "0");
   2132         nBurstNum = atoi(prop);
   2133         if (nBurstNum < 0) {
   2134             nBurstNum = 0;
   2135         }
   2136     }
   2137 
   2138     set(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER, nBurstNum);
   2139 
   2140     m_nRetroBurstNum = nBurstNum;
   2141     LOGH("m_nRetroBurstNum = %d", m_nRetroBurstNum);
   2142     return NO_ERROR;
   2143 }
   2144 
   2145 /*===========================================================================
   2146  * FUNCTION   : setJpegQuality
   2147  *
   2148  * DESCRIPTION: set jpeg encpding quality from user setting
   2149  *
   2150  * PARAMETERS :
   2151  *   @params  : user setting parameters
   2152  *
   2153  * RETURN     : int32_t type of status
   2154  *              NO_ERROR  -- success
   2155  *              none-zero failure code
   2156  *==========================================================================*/
   2157 int32_t QCameraParameters::setJpegQuality(const QCameraParameters& params)
   2158 {
   2159     int32_t rc = NO_ERROR;
   2160     int quality = params.getInt(KEY_JPEG_QUALITY);
   2161     if (quality >= 0 && quality <= 100) {
   2162         set(KEY_JPEG_QUALITY, quality);
   2163     } else {
   2164         LOGE("Invalid jpeg quality=%d", quality);
   2165         rc = BAD_VALUE;
   2166     }
   2167 
   2168     quality = params.getInt(KEY_JPEG_THUMBNAIL_QUALITY);
   2169     if (quality >= 0 && quality <= 100) {
   2170         set(KEY_JPEG_THUMBNAIL_QUALITY, quality);
   2171     } else {
   2172         LOGE("Invalid jpeg thumbnail quality=%d", quality);
   2173         rc = BAD_VALUE;
   2174     }
   2175     return rc;
   2176 }
   2177 
   2178 /*===========================================================================
   2179  * FUNCTION   : setOrientaion
   2180  *
   2181  * DESCRIPTION: set orientaion from user setting
   2182  *
   2183  * PARAMETERS :
   2184  *   @params  : user setting parameters
   2185  *
   2186  * RETURN     : int32_t type of status
   2187  *              NO_ERROR  -- success
   2188  *              none-zero failure code
   2189  *==========================================================================*/
   2190 int32_t QCameraParameters::setOrientation(const QCameraParameters& params)
   2191 {
   2192     const char *str = params.get(KEY_QC_ORIENTATION);
   2193 
   2194     if (str != NULL) {
   2195         if (strcmp(str, portrait) == 0 || strcmp(str, landscape) == 0) {
   2196             // Camera service needs this to decide if the preview frames and raw
   2197             // pictures should be rotated.
   2198             set(KEY_QC_ORIENTATION, str);
   2199         } else {
   2200             LOGE("Invalid orientation value: %s", str);
   2201             return BAD_VALUE;
   2202         }
   2203     }
   2204     return NO_ERROR;
   2205 }
   2206 
   2207 /*===========================================================================
   2208  * FUNCTION   : setAutoExposure
   2209  *
   2210  * DESCRIPTION: set auto exposure value from user setting
   2211  *
   2212  * PARAMETERS :
   2213  *   @params  : user setting parameters
   2214  *
   2215  * RETURN     : int32_t type of status
   2216  *              NO_ERROR  -- success
   2217  *              none-zero failure code
   2218  *==========================================================================*/
   2219 int32_t QCameraParameters::setAutoExposure(const QCameraParameters& params)
   2220 {
   2221     const char *str = params.get(KEY_QC_AUTO_EXPOSURE);
   2222     const char *prev_str = get(KEY_QC_AUTO_EXPOSURE);
   2223     if (str != NULL) {
   2224         if (prev_str == NULL ||
   2225             strcmp(str, prev_str) != 0) {
   2226             return setAutoExposure(str);
   2227         }
   2228     }
   2229     return NO_ERROR;
   2230 }
   2231 
   2232 /*===========================================================================
   2233  * FUNCTION   : setPreviewFpsRange
   2234  *
   2235  * DESCRIPTION: set preview FPS range from user setting
   2236  *
   2237  * PARAMETERS :
   2238  *   @params  : user setting parameters
   2239  *
   2240  * RETURN     : int32_t type of status
   2241  *              NO_ERROR  -- success
   2242  *              none-zero failure code
   2243  *==========================================================================*/
   2244 int32_t QCameraParameters::setPreviewFpsRange(const QCameraParameters& params)
   2245 {
   2246     int minFps,maxFps;
   2247     int prevMinFps, prevMaxFps, vidMinFps, vidMaxFps;
   2248     int rc = NO_ERROR;
   2249     bool found = false, updateNeeded = false;
   2250 
   2251     CameraParameters::getPreviewFpsRange(&prevMinFps, &prevMaxFps);
   2252     params.getPreviewFpsRange(&minFps, &maxFps);
   2253 
   2254     LOGH("FpsRange Values:(%d, %d)", prevMinFps, prevMaxFps);
   2255     LOGH("Requested FpsRange Values:(%d, %d)", minFps, maxFps);
   2256 
   2257     //first check if we need to change fps because of HFR mode change
   2258     updateNeeded = UpdateHFRFrameRate(params);
   2259     if (updateNeeded) {
   2260         m_bNeedRestart = true;
   2261         rc = setHighFrameRate(mHfrMode);
   2262         if (rc != NO_ERROR) goto end;
   2263     }
   2264     LOGH("UpdateHFRFrameRate %d", updateNeeded);
   2265 
   2266     vidMinFps = (int)m_hfrFpsRange.video_min_fps;
   2267     vidMaxFps = (int)m_hfrFpsRange.video_max_fps;
   2268 
   2269     if(minFps == prevMinFps && maxFps == prevMaxFps) {
   2270         if ( m_bFixedFrameRateSet ) {
   2271             minFps = params.getPreviewFrameRate() * 1000;
   2272             maxFps = params.getPreviewFrameRate() * 1000;
   2273             m_bFixedFrameRateSet = false;
   2274         } else if (!updateNeeded) {
   2275             LOGH("No change in FpsRange");
   2276             rc = NO_ERROR;
   2277             goto end;
   2278         }
   2279     }
   2280     for(size_t i = 0; i < m_pCapability->fps_ranges_tbl_cnt; i++) {
   2281         // if the value is in the supported list
   2282         if (minFps >= m_pCapability->fps_ranges_tbl[i].min_fps * 1000 &&
   2283                 maxFps <= m_pCapability->fps_ranges_tbl[i].max_fps * 1000) {
   2284             found = true;
   2285             LOGH("FPS i=%d : minFps = %d, maxFps = %d"
   2286                     " vidMinFps = %d, vidMaxFps = %d",
   2287                      i, minFps, maxFps,
   2288                     (int)m_hfrFpsRange.video_min_fps,
   2289                     (int)m_hfrFpsRange.video_max_fps);
   2290             if ((0.0f >= m_hfrFpsRange.video_min_fps) ||
   2291                     (0.0f >= m_hfrFpsRange.video_max_fps)) {
   2292                 vidMinFps = minFps;
   2293                 vidMaxFps = maxFps;
   2294             }
   2295             else {
   2296                 vidMinFps = (int)m_hfrFpsRange.video_min_fps;
   2297                 vidMaxFps = (int)m_hfrFpsRange.video_max_fps;
   2298             }
   2299 
   2300             setPreviewFpsRange(minFps, maxFps, vidMinFps, vidMaxFps);
   2301             break;
   2302         }
   2303     }
   2304     if(found == false){
   2305         LOGE("error: FPS range value not supported");
   2306         rc = BAD_VALUE;
   2307     }
   2308 end:
   2309     return rc;
   2310 }
   2311 
   2312 /*===========================================================================
   2313  * FUNCTION   : UpdateHFRFrameRate
   2314  *
   2315  * DESCRIPTION: set preview FPS range based on HFR setting
   2316  *
   2317  * PARAMETERS :
   2318  *   @params  : user setting parameters
   2319  *
   2320  * RETURN     : bool true/false
   2321  *                  true -if HAL needs to overwrite FPS range set by app, false otherwise.
   2322  *==========================================================================*/
   2323 
   2324 bool QCameraParameters::UpdateHFRFrameRate(const QCameraParameters& params)
   2325 {
   2326     bool updateNeeded = false;
   2327     int min_fps, max_fps;
   2328     int32_t hfrMode = CAM_HFR_MODE_OFF;
   2329     int32_t newHfrMode = CAM_HFR_MODE_OFF;
   2330 
   2331     int parm_minfps,parm_maxfps;
   2332     int prevMinFps, prevMaxFps;
   2333     CameraParameters::getPreviewFpsRange(&prevMinFps, &prevMaxFps);
   2334     params.getPreviewFpsRange(&parm_minfps, &parm_maxfps);
   2335     LOGH("CameraParameters - : minFps = %d, maxFps = %d ",
   2336                  prevMinFps, prevMaxFps);
   2337     LOGH("Requested params - : minFps = %d, maxFps = %d ",
   2338                  parm_minfps, parm_maxfps);
   2339 
   2340     const char *hfrStr = params.get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
   2341     const char *hsrStr = params.get(KEY_QC_VIDEO_HIGH_SPEED_RECORDING);
   2342 
   2343     const char *prev_hfrStr = CameraParameters::get(KEY_QC_VIDEO_HIGH_FRAME_RATE);
   2344     const char *prev_hsrStr = CameraParameters::get(KEY_QC_VIDEO_HIGH_SPEED_RECORDING);
   2345 
   2346     if ((hfrStr != NULL) && (prev_hfrStr != NULL) && strcmp(hfrStr, prev_hfrStr)) {
   2347         updateParamEntry(KEY_QC_VIDEO_HIGH_FRAME_RATE, hfrStr);
   2348     }
   2349 
   2350     if ((hsrStr != NULL) && (prev_hsrStr != NULL) && strcmp(hsrStr, prev_hsrStr)) {
   2351         updateParamEntry(KEY_QC_VIDEO_HIGH_SPEED_RECORDING, hsrStr);
   2352 
   2353     }
   2354 
   2355     // check if HFR is enabled
   2356     if ((hfrStr != NULL) && strcmp(hfrStr, "off")) {
   2357         hfrMode = lookupAttr(HFR_MODES_MAP, PARAM_MAP_SIZE(HFR_MODES_MAP), hfrStr);
   2358         if (NAME_NOT_FOUND != hfrMode) newHfrMode = hfrMode;
   2359     }
   2360     // check if HSR is enabled
   2361     else if ((hsrStr != NULL) && strcmp(hsrStr, "off")) {
   2362         hfrMode = lookupAttr(HFR_MODES_MAP, PARAM_MAP_SIZE(HFR_MODES_MAP), hsrStr);
   2363         if (NAME_NOT_FOUND != hfrMode) newHfrMode = hfrMode;
   2364     }
   2365     LOGH("prevHfrMode - %d, currentHfrMode = %d ",
   2366                  mHfrMode, newHfrMode);
   2367 
   2368     if (mHfrMode != newHfrMode) {
   2369         updateNeeded = true;
   2370         mHfrMode = newHfrMode;
   2371         switch (mHfrMode) {
   2372             case CAM_HFR_MODE_60FPS:
   2373                 min_fps = 60000;
   2374                 max_fps = 60000;
   2375                 break;
   2376             case CAM_HFR_MODE_90FPS:
   2377                 min_fps = 90000;
   2378                 max_fps = 90000;
   2379                 break;
   2380             case CAM_HFR_MODE_120FPS:
   2381                 min_fps = 120000;
   2382                 max_fps = 120000;
   2383                 break;
   2384             case CAM_HFR_MODE_150FPS:
   2385                 min_fps = 150000;
   2386                 max_fps = 150000;
   2387                 break;
   2388             case CAM_HFR_MODE_180FPS:
   2389                 min_fps = 180000;
   2390                 max_fps = 180000;
   2391                 break;
   2392             case CAM_HFR_MODE_210FPS:
   2393                 min_fps = 210000;
   2394                 max_fps = 210000;
   2395                 break;
   2396             case CAM_HFR_MODE_240FPS:
   2397                 min_fps = 240000;
   2398                 max_fps = 240000;
   2399                 break;
   2400             case CAM_HFR_MODE_480FPS:
   2401                 min_fps = 480000;
   2402                 max_fps = 480000;
   2403                 break;
   2404             case CAM_HFR_MODE_OFF:
   2405             default:
   2406                 // Set Video Fps to zero
   2407                 min_fps = 0;
   2408                 max_fps = 0;
   2409                 break;
   2410         }
   2411         m_hfrFpsRange.video_min_fps = (float)min_fps;
   2412         m_hfrFpsRange.video_max_fps = (float)max_fps;
   2413 
   2414         LOGH("HFR mode (%d) Set video FPS : minFps = %d, maxFps = %d ",
   2415                  mHfrMode, min_fps, max_fps);
   2416     }
   2417 
   2418     // Remember if HFR mode is ON
   2419     if ((mHfrMode > CAM_HFR_MODE_OFF) && (mHfrMode < CAM_HFR_MODE_MAX)) {
   2420         LOGH("HFR mode is ON");
   2421         m_bHfrMode = true;
   2422     } else {
   2423         m_hfrFpsRange.video_min_fps = 0;
   2424         m_hfrFpsRange.video_max_fps = 0;
   2425         m_bHfrMode = false;
   2426         LOGH("HFR mode is OFF");
   2427     }
   2428     m_hfrFpsRange.min_fps = (float)parm_minfps;
   2429     m_hfrFpsRange.max_fps = (float)parm_maxfps;
   2430 
   2431     if (m_bHfrMode && (mHfrMode > CAM_HFR_MODE_120FPS)
   2432             && (parm_maxfps != 0)) {
   2433         //Configure buffer batch count to use batch mode for higher fps
   2434         setBufBatchCount((int8_t)(m_hfrFpsRange.video_max_fps / parm_maxfps));
   2435     } else {
   2436         //Reset batch count and update KEY for encoder
   2437         setBufBatchCount(0);
   2438     }
   2439     return updateNeeded;
   2440 }
   2441 
   2442 /*===========================================================================
   2443  * FUNCTION   : setPreviewFrameRate
   2444  *
   2445  * DESCRIPTION: set preview frame rate from user setting
   2446  *
   2447  * PARAMETERS :
   2448  *   @params  : user setting parameters
   2449  *
   2450  * RETURN     : int32_t type of status
   2451  *              NO_ERROR  -- success
   2452  *              none-zero failure code
   2453  *==========================================================================*/
   2454 int32_t QCameraParameters::setPreviewFrameRate(const QCameraParameters& params)
   2455 {
   2456     const char *str = params.get(KEY_PREVIEW_FRAME_RATE);
   2457     const char *prev_str = get(KEY_PREVIEW_FRAME_RATE);
   2458 
   2459     if ( str ) {
   2460         if ( prev_str &&
   2461              strcmp(str, prev_str)) {
   2462             LOGD("Requested Fixed Frame Rate %s", str);
   2463             updateParamEntry(KEY_PREVIEW_FRAME_RATE, str);
   2464             m_bFixedFrameRateSet = true;
   2465         }
   2466     }
   2467     return NO_ERROR;
   2468 }
   2469 
   2470 /*===========================================================================
   2471  * FUNCTION   : setEffect
   2472  *
   2473  * DESCRIPTION: set effect value from user setting
   2474  *
   2475  * PARAMETERS :
   2476  *   @params  : user setting parameters
   2477  *
   2478  * RETURN     : int32_t type of status
   2479  *              NO_ERROR  -- success
   2480  *              none-zero failure code
   2481  *==========================================================================*/
   2482 int32_t QCameraParameters::setEffect(const QCameraParameters& params)
   2483 {
   2484     const char *str = params.get(KEY_EFFECT);
   2485     const char *prev_str = get(KEY_EFFECT);
   2486 
   2487     char prop[PROPERTY_VALUE_MAX];
   2488     memset(prop, 0, sizeof(prop));
   2489     property_get("persist.camera.effect", prop, "none");
   2490 
   2491     if (strcmp(prop, "none")) {
   2492         if ((prev_str == NULL) ||
   2493                 (strcmp(prop, prev_str) != 0) ||
   2494                 (m_bUpdateEffects == true)) {
   2495             m_bUpdateEffects = false;
   2496             return setEffect(prop);
   2497         }
   2498     } else if (str != NULL) {
   2499         if ((prev_str == NULL) ||
   2500                 (strcmp(str, prev_str) != 0) ||
   2501                 (m_bUpdateEffects == true)) {
   2502             m_bUpdateEffects = false;
   2503             return setEffect(str);
   2504         }
   2505     }
   2506     return NO_ERROR;
   2507 }
   2508 
   2509 /*===========================================================================
   2510  * FUNCTION   : setFocusMode
   2511  *
   2512  * DESCRIPTION: set focus mode from user setting
   2513  *
   2514  * PARAMETERS :
   2515  *   @params  : user setting parameters
   2516  *
   2517  * RETURN     : int32_t type of status
   2518  *              NO_ERROR  -- success
   2519  *              none-zero failure code
   2520  *==========================================================================*/
   2521 int32_t QCameraParameters::setFocusMode(const QCameraParameters& params)
   2522 {
   2523     const char *str = params.get(KEY_FOCUS_MODE);
   2524     const char *prev_str = get(KEY_FOCUS_MODE);
   2525     if (str != NULL) {
   2526         if (prev_str == NULL ||
   2527             strcmp(str, prev_str) != 0) {
   2528             return setFocusMode(str);
   2529         }
   2530     }
   2531     return NO_ERROR;
   2532 }
   2533 
   2534 /*===========================================================================
   2535  * FUNCTION   : setFocusPosition
   2536  *
   2537  * DESCRIPTION: set focus position from user setting
   2538  *
   2539  * PARAMETERS :
   2540  *   @params  : user setting parameters
   2541  *
   2542  * RETURN     : int32_t type of status
   2543  *              NO_ERROR  -- success
   2544  *              none-zero failure code
   2545  *==========================================================================*/
   2546 int32_t  QCameraParameters::setFocusPosition(const QCameraParameters& params)
   2547 {
   2548     const char *focus_str = params.get(KEY_FOCUS_MODE);
   2549     const char *prev_focus_str = get(KEY_FOCUS_MODE);
   2550 
   2551     if (NULL == focus_str) {
   2552         return NO_ERROR;
   2553     }
   2554 
   2555     LOGD("current focus mode: %s", focus_str);
   2556     if (strcmp(focus_str, FOCUS_MODE_MANUAL_POSITION)) {
   2557         LOGH(", dont set focus pos to back-end!");
   2558         return NO_ERROR;
   2559     }
   2560 
   2561     const char *pos = params.get(KEY_QC_MANUAL_FOCUS_POSITION);
   2562     const char *prev_pos = get(KEY_QC_MANUAL_FOCUS_POSITION);
   2563     const char *type = params.get(KEY_QC_MANUAL_FOCUS_POS_TYPE);
   2564     const char *prev_type = get(KEY_QC_MANUAL_FOCUS_POS_TYPE);
   2565 
   2566     if ((pos != NULL) && (type != NULL) && (focus_str != NULL)) {
   2567         if (prev_pos  == NULL || (strcmp(pos, prev_pos) != 0) ||
   2568             prev_type == NULL || (strcmp(type, prev_type) != 0) ||
   2569             prev_focus_str == NULL || (strcmp(focus_str, prev_focus_str) != 0)) {
   2570             return setFocusPosition(type, pos);
   2571         }
   2572     }
   2573 
   2574     return NO_ERROR;
   2575 }
   2576 
   2577 /*===========================================================================
   2578  * FUNCTION   : setBrightness
   2579  *
   2580  * DESCRIPTION: set brightness control value from user setting
   2581  *
   2582  * PARAMETERS :
   2583  *   @params  : user setting parameters
   2584  *
   2585  * RETURN     : int32_t type of status
   2586  *              NO_ERROR  -- success
   2587  *              none-zero failure code
   2588  *==========================================================================*/
   2589 int32_t QCameraParameters::setBrightness(const QCameraParameters& params)
   2590 {
   2591     int currentBrightness = getInt(KEY_QC_BRIGHTNESS);
   2592     int brightness = params.getInt(KEY_QC_BRIGHTNESS);
   2593 
   2594     if(params.get(KEY_QC_BRIGHTNESS) == NULL) {
   2595        LOGH("Brigtness not set by App ");
   2596        return NO_ERROR;
   2597     }
   2598     if (currentBrightness !=  brightness) {
   2599         if (brightness >= m_pCapability->brightness_ctrl.min_value &&
   2600             brightness <= m_pCapability->brightness_ctrl.max_value) {
   2601             LOGD("new brightness value : %d ", brightness);
   2602             return setBrightness(brightness);
   2603         } else {
   2604             LOGE("invalid value %d out of (%d, %d)",
   2605                    brightness,
   2606                   m_pCapability->brightness_ctrl.min_value,
   2607                   m_pCapability->brightness_ctrl.max_value);
   2608             return BAD_VALUE;
   2609         }
   2610     } else {
   2611         LOGD("No brightness value changed.");
   2612         return NO_ERROR;
   2613     }
   2614 }
   2615 
   2616 /*===========================================================================
   2617  * FUNCTION   : getBrightness
   2618  *
   2619  * DESCRIPTION: get brightness control value from user setting
   2620  *
   2621  * PARAMETERS :
   2622  *   @params  : user setting parameters
   2623  *
   2624  * RETURN     : int32_t type of status
   2625  *              NO_ERROR  -- success
   2626  *              none-zero failure code
   2627  *==========================================================================*/
   2628 int QCameraParameters::getBrightness()
   2629 {
   2630     return getInt(KEY_QC_BRIGHTNESS);
   2631 }
   2632 
   2633 /*===========================================================================
   2634  * FUNCTION   : setSharpness
   2635  *
   2636  * DESCRIPTION: set sharpness control value from user setting
   2637  *
   2638  * PARAMETERS :
   2639  *   @params  : user setting parameters
   2640  *
   2641  * RETURN     : int32_t type of status
   2642  *              NO_ERROR  -- success
   2643  *              none-zero failure code
   2644  *==========================================================================*/
   2645 int32_t QCameraParameters::setSharpness(const QCameraParameters& params)
   2646 {
   2647     int shaprness = params.getInt(KEY_QC_SHARPNESS);
   2648     int prev_sharp = getInt(KEY_QC_SHARPNESS);
   2649 
   2650     if(params.get(KEY_QC_SHARPNESS) == NULL) {
   2651        LOGH("Sharpness not set by App ");
   2652        return NO_ERROR;
   2653     }
   2654     if (prev_sharp !=  shaprness) {
   2655         if((shaprness >= m_pCapability->sharpness_ctrl.min_value) &&
   2656            (shaprness <= m_pCapability->sharpness_ctrl.max_value)) {
   2657             LOGD("new sharpness value : %d ", shaprness);
   2658             return setSharpness(shaprness);
   2659         } else {
   2660             LOGE("invalid value %d out of (%d, %d)",
   2661                    shaprness,
   2662                   m_pCapability->sharpness_ctrl.min_value,
   2663                   m_pCapability->sharpness_ctrl.max_value);
   2664             return BAD_VALUE;
   2665         }
   2666     } else {
   2667         LOGD("No value change in shaprness");
   2668         return NO_ERROR;
   2669     }
   2670 }
   2671 
   2672 /*===========================================================================
   2673  * FUNCTION   : setSkintoneEnahancement
   2674  *
   2675  * DESCRIPTION: set skin tone enhancement factor from user setting
   2676  *
   2677  * PARAMETERS :
   2678  *   @params  : user setting parameters
   2679  *
   2680  * RETURN     : int32_t type of status
   2681  *              NO_ERROR  -- success
   2682  *              none-zero failure code
   2683  *==========================================================================*/
   2684 int32_t QCameraParameters::setSkinToneEnhancement(const QCameraParameters& params)
   2685 {
   2686     int sceFactor = params.getInt(KEY_QC_SCE_FACTOR);
   2687     int prev_sceFactor = getInt(KEY_QC_SCE_FACTOR);
   2688 
   2689     if(params.get(KEY_QC_SCE_FACTOR) == NULL) {
   2690        LOGH("Skintone enhancement not set by App ");
   2691        return NO_ERROR;
   2692     }
   2693     if (prev_sceFactor != sceFactor) {
   2694         if((sceFactor >= m_pCapability->sce_ctrl.min_value) &&
   2695            (sceFactor <= m_pCapability->sce_ctrl.max_value)) {
   2696             LOGD("new Skintone Enhancement value : %d ", sceFactor);
   2697             return setSkinToneEnhancement(sceFactor);
   2698         } else {
   2699             LOGE("invalid value %d out of (%d, %d)",
   2700                    sceFactor,
   2701                   m_pCapability->sce_ctrl.min_value,
   2702                   m_pCapability->sce_ctrl.max_value);
   2703             return BAD_VALUE;
   2704         }
   2705     } else {
   2706         LOGD("No value change in skintone enhancement factor");
   2707         return NO_ERROR;
   2708     }
   2709 }
   2710 
   2711 /*===========================================================================
   2712  * FUNCTION   : setSaturation
   2713  *
   2714  * DESCRIPTION: set saturation control value from user setting
   2715  *
   2716  * PARAMETERS :
   2717  *   @params  : user setting parameters
   2718  *
   2719  * RETURN     : int32_t type of status
   2720  *              NO_ERROR  -- success
   2721  *              none-zero failure code
   2722  *==========================================================================*/
   2723 int32_t QCameraParameters::setSaturation(const QCameraParameters& params)
   2724 {
   2725     int saturation = params.getInt(KEY_QC_SATURATION);
   2726     int prev_sat = getInt(KEY_QC_SATURATION);
   2727 
   2728     if(params.get(KEY_QC_SATURATION) == NULL) {
   2729        LOGH("Saturation not set by App ");
   2730        return NO_ERROR;
   2731     }
   2732     if (prev_sat !=  saturation) {
   2733         if((saturation >= m_pCapability->saturation_ctrl.min_value) &&
   2734            (saturation <= m_pCapability->saturation_ctrl.max_value)) {
   2735             LOGD("new saturation value : %d ", saturation);
   2736             return setSaturation(saturation);
   2737         } else {
   2738             LOGE("invalid value %d out of (%d, %d)",
   2739                    saturation,
   2740                   m_pCapability->saturation_ctrl.min_value,
   2741                   m_pCapability->saturation_ctrl.max_value);
   2742             return BAD_VALUE;
   2743         }
   2744     } else {
   2745         LOGD("No value change in saturation factor");
   2746         return NO_ERROR;
   2747     }
   2748 }
   2749 
   2750 /*===========================================================================
   2751  * FUNCTION   : setContrast
   2752  *
   2753  * DESCRIPTION: set contrast control value from user setting
   2754  *
   2755  * PARAMETERS :
   2756  *   @params  : user setting parameters
   2757  *
   2758  * RETURN     : int32_t type of status
   2759  *              NO_ERROR  -- success
   2760  *              none-zero failure code
   2761  *==========================================================================*/
   2762 int32_t QCameraParameters::setContrast(const QCameraParameters& params)
   2763 {
   2764     int contrast = params.getInt(KEY_QC_CONTRAST);
   2765     int prev_contrast = getInt(KEY_QC_CONTRAST);
   2766 
   2767     if(params.get(KEY_QC_CONTRAST) == NULL) {
   2768        LOGH("Contrast not set by App ");
   2769        return NO_ERROR;
   2770     }
   2771     if (prev_contrast !=  contrast) {
   2772         if((contrast >= m_pCapability->contrast_ctrl.min_value) &&
   2773            (contrast <= m_pCapability->contrast_ctrl.max_value)) {
   2774             LOGD("new contrast value : %d ", contrast);
   2775             int32_t rc = setContrast(contrast);
   2776             return rc;
   2777         } else {
   2778             LOGE("invalid value %d out of (%d, %d)",
   2779                    contrast,
   2780                   m_pCapability->contrast_ctrl.min_value,
   2781                   m_pCapability->contrast_ctrl.max_value);
   2782             return BAD_VALUE;
   2783         }
   2784     } else {
   2785         LOGD("No value change in contrast");
   2786         return NO_ERROR;
   2787     }
   2788 }
   2789 
   2790 /*===========================================================================
   2791  * FUNCTION   : setExposureCompensation
   2792  *
   2793  * DESCRIPTION: set exposure compensation value from user setting
   2794  *
   2795  * PARAMETERS :
   2796  *   @params  : user setting parameters
   2797  *
   2798  * RETURN     : int32_t type of status
   2799  *              NO_ERROR  -- success
   2800  *              none-zero failure code
   2801  *==========================================================================*/
   2802 int32_t QCameraParameters::setExposureCompensation(const QCameraParameters & params)
   2803 {
   2804     int expComp = params.getInt(KEY_EXPOSURE_COMPENSATION);
   2805     int prev_expComp = getInt(KEY_EXPOSURE_COMPENSATION);
   2806 
   2807     if(params.get(KEY_EXPOSURE_COMPENSATION) == NULL) {
   2808        LOGH("Exposure compensation not set by App ");
   2809        return NO_ERROR;
   2810     }
   2811     if (prev_expComp != expComp) {
   2812         if((expComp >= m_pCapability->exposure_compensation_min) &&
   2813            (expComp <= m_pCapability->exposure_compensation_max)) {
   2814             LOGD("new Exposure Compensation value : %d ", expComp);
   2815             return setExposureCompensation(expComp);
   2816         } else {
   2817             LOGE("invalid value %d out of (%d, %d)",
   2818                    expComp,
   2819                   m_pCapability->exposure_compensation_min,
   2820                   m_pCapability->exposure_compensation_max);
   2821             return BAD_VALUE;
   2822         }
   2823     } else {
   2824         LOGD("No value change in Exposure Compensation");
   2825         return NO_ERROR;
   2826     }
   2827 }
   2828 
   2829 /*===========================================================================
   2830  * FUNCTION   : setWhiteBalance
   2831  *
   2832  * DESCRIPTION: set white balance value from user setting
   2833  *
   2834  * PARAMETERS :
   2835  *   @params  : user setting parameters
   2836  *
   2837  * RETURN     : int32_t type of status
   2838  *              NO_ERROR  -- success
   2839  *              none-zero failure code
   2840  *==========================================================================*/
   2841 int32_t QCameraParameters::setWhiteBalance(const QCameraParameters& params)
   2842 {
   2843     const char *str = params.get(KEY_WHITE_BALANCE);
   2844     const char *prev_str = get(KEY_WHITE_BALANCE);
   2845     if (str != NULL) {
   2846         if (prev_str == NULL ||
   2847             strcmp(str, prev_str) != 0) {
   2848             return setWhiteBalance(str);
   2849         }
   2850     }
   2851     return NO_ERROR;
   2852 }
   2853 
   2854 /*===========================================================================
   2855  * FUNCTION   : setManualWhiteBalance
   2856  *
   2857  * DESCRIPTION: set manual white balance from user setting
   2858  *
   2859  * PARAMETERS :
   2860  *   @params  : user setting parameters
   2861  *
   2862  * RETURN     : int32_t type of status
   2863  *              NO_ERROR  -- success
   2864  *              none-zero failure code
   2865  *==========================================================================*/
   2866 int32_t  QCameraParameters::setManualWhiteBalance(const QCameraParameters& params)
   2867 {
   2868     int32_t rc = NO_ERROR;
   2869     const char *wb_str = params.get(KEY_WHITE_BALANCE);
   2870     const char *prev_wb_str = get(KEY_WHITE_BALANCE);
   2871     LOGD("current wb mode: %s", wb_str);
   2872 
   2873     if (wb_str != NULL) {
   2874         if (strcmp(wb_str, WHITE_BALANCE_MANUAL)) {
   2875             LOGD("dont set cct to back-end.");
   2876             return NO_ERROR;
   2877         }
   2878     }
   2879 
   2880     const char *value = params.get(KEY_QC_MANUAL_WB_VALUE);
   2881     const char *prev_value = get(KEY_QC_MANUAL_WB_VALUE);
   2882     const char *type = params.get(KEY_QC_MANUAL_WB_TYPE);
   2883     const char *prev_type = get(KEY_QC_MANUAL_WB_TYPE);
   2884 
   2885     if ((value != NULL) && (type != NULL) && (wb_str != NULL)) {
   2886         if (prev_value  == NULL || (strcmp(value, prev_value) != 0) ||
   2887             prev_type == NULL || (strcmp(type, prev_type) != 0) ||
   2888             prev_wb_str == NULL || (strcmp(wb_str, prev_wb_str) != 0)) {
   2889             updateParamEntry(KEY_QC_MANUAL_WB_TYPE, type);
   2890             updateParamEntry(KEY_QC_MANUAL_WB_VALUE, value);
   2891             int32_t wb_type = atoi(type);
   2892             if (wb_type == CAM_MANUAL_WB_MODE_CCT) {
   2893                 rc = setWBManualCCT(value);
   2894             } else if (wb_type == CAM_MANUAL_WB_MODE_GAIN) {
   2895                 rc = setManualWBGains(value);
   2896             } else {
   2897                 rc = BAD_VALUE;
   2898             }
   2899         }
   2900     }
   2901     return rc;
   2902 }
   2903 
   2904 /*===========================================================================
   2905  * FUNCTION   : setAntibanding
   2906  *
   2907  * DESCRIPTION: set antibanding value from user setting
   2908  *
   2909  * PARAMETERS :
   2910  *   @params  : user setting parameters
   2911  *
   2912  * RETURN     : int32_t type of status
   2913  *              NO_ERROR  -- success
   2914  *              none-zero failure code
   2915  *==========================================================================*/
   2916 int32_t QCameraParameters::setAntibanding(const QCameraParameters& params)
   2917 {
   2918     const char *str = params.get(KEY_ANTIBANDING);
   2919     const char *prev_str = get(KEY_ANTIBANDING);
   2920     if (str != NULL) {
   2921         if (prev_str == NULL ||
   2922             strcmp(str, prev_str) != 0) {
   2923             return setAntibanding(str);
   2924         }
   2925     }
   2926     return NO_ERROR;
   2927 }
   2928 
   2929 /*===========================================================================
   2930  * FUNCTION   : setStatsDebugMask
   2931  *
   2932  * DESCRIPTION: get the value from persist file in Stats module that will
   2933  *              control funtionality in the module
   2934  *
   2935  * PARAMETERS : none
   2936  *
   2937  * RETURN     : int32_t type of status
   2938  *              NO_ERROR  -- success
   2939  *              none-zero failure code
   2940  *==========================================================================*/
   2941 int32_t QCameraParameters::setStatsDebugMask()
   2942 {
   2943     uint32_t mask = 0;
   2944     char value[PROPERTY_VALUE_MAX];
   2945 
   2946     property_get("persist.camera.stats.debug.mask", value, "0");
   2947     mask = (uint32_t)atoi(value);
   2948 
   2949     LOGH("ctrl mask :%d", mask);
   2950 
   2951     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_STATS_DEBUG_MASK, mask)) {
   2952         return BAD_VALUE;
   2953     }
   2954 
   2955     return NO_ERROR;
   2956 }
   2957 
   2958 /*===========================================================================
   2959  * FUNCTION   : setPAAF
   2960  *
   2961  * DESCRIPTION: get the value from persist file in Stats module that will
   2962  *              control the preview assisted AF in the module
   2963  *
   2964  * PARAMETERS : none
   2965  *
   2966  * RETURN     : int32_t type of status
   2967  *              NO_ERROR  -- success
   2968  *              none-zero failure code
   2969  *==========================================================================*/
   2970 int32_t QCameraParameters::setPAAF()
   2971 {
   2972     uint32_t paaf = 0;
   2973     char value[PROPERTY_VALUE_MAX];
   2974 
   2975     property_get("persist.camera.stats.af.paaf", value, "1");
   2976     paaf = (uint32_t)atoi(value);
   2977 
   2978     LOGH("PAAF is: %s", paaf ? "ON": "OFF");
   2979 
   2980     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_STATS_AF_PAAF, paaf)) {
   2981         return BAD_VALUE;
   2982     }
   2983 
   2984     return NO_ERROR;
   2985 }
   2986 
   2987 /*===========================================================================
   2988  * FUNCTION   : setSceneDetect
   2989  *
   2990  * DESCRIPTION: set scenen detect value from user setting
   2991  *
   2992  * PARAMETERS :
   2993  *   @params  : user setting parameters
   2994  *
   2995  * RETURN     : int32_t type of status
   2996  *              NO_ERROR  -- success
   2997  *              none-zero failure code
   2998  *==========================================================================*/
   2999 int32_t QCameraParameters::setSceneDetect(const QCameraParameters& params)
   3000 {
   3001     const char *str = params.get(KEY_QC_SCENE_DETECT);
   3002     const char *prev_str = get(KEY_QC_SCENE_DETECT);
   3003     if (str != NULL) {
   3004         if (prev_str == NULL ||
   3005             strcmp(str, prev_str) != 0) {
   3006             return setSceneDetect(str);
   3007         }
   3008     }
   3009     return NO_ERROR;
   3010 }
   3011 
   3012 /*===========================================================================
   3013  * FUNCTION   : setVideoHDR
   3014  *
   3015  * DESCRIPTION: set video HDR value from user setting
   3016  *
   3017  * PARAMETERS :
   3018  *   @params  : user setting parameters
   3019  *
   3020  * RETURN     : int32_t type of status
   3021  *              NO_ERROR  -- success
   3022  *              none-zero failure code
   3023  *==========================================================================*/
   3024 int32_t QCameraParameters::setVideoHDR(const QCameraParameters& params)
   3025 {
   3026     const char *str = params.get(KEY_QC_VIDEO_HDR);
   3027     const char *prev_str = get(KEY_QC_VIDEO_HDR);
   3028     if (str != NULL) {
   3029         if (prev_str == NULL ||
   3030             strcmp(str, prev_str) != 0) {
   3031             return setVideoHDR(str);
   3032         }
   3033     }
   3034     return NO_ERROR;
   3035 }
   3036 
   3037 /*===========================================================================
   3038  * FUNCTION   : setVtEnable
   3039  *
   3040  * DESCRIPTION: set vt Time Stamp enable from user setting
   3041  *
   3042  * PARAMETERS :
   3043  *   @params  : user setting parameters
   3044  *
   3045  * RETURN     : int32_t type of status
   3046  *              NO_ERROR  -- success
   3047  *              none-zero failure code
   3048  *==========================================================================*/
   3049 int32_t QCameraParameters::setVtEnable(const QCameraParameters& params)
   3050 {
   3051     const char *str = params.get(KEY_QC_VT_ENABLE);
   3052     const char *prev_str = get(KEY_QC_VT_ENABLE);
   3053     if (str != NULL) {
   3054         if (prev_str == NULL ||
   3055             strcmp(str, prev_str) != 0) {
   3056             return setVtEnable(str);
   3057         }
   3058     }
   3059     return NO_ERROR;
   3060 }
   3061 
   3062 /*===========================================================================
   3063  * FUNCTION   : setFaceRecognition
   3064  *
   3065  * DESCRIPTION: set face recognition mode from user setting
   3066  *
   3067  * PARAMETERS :
   3068  *   @params  : user setting parameters
   3069  *
   3070  * RETURN     : int32_t type of status
   3071  *              NO_ERROR  -- success
   3072  *              none-zero failure code
   3073  *==========================================================================*/
   3074 int32_t QCameraParameters::setFaceRecognition(const QCameraParameters& params)
   3075 {
   3076     const char *str = params.get(KEY_QC_FACE_RECOGNITION);
   3077     const char *prev_str = get(KEY_QC_FACE_RECOGNITION);
   3078     if (str != NULL) {
   3079         if (prev_str == NULL ||
   3080             strcmp(str, prev_str) != 0) {
   3081             uint32_t maxFaces = (uint32_t)params.getInt(KEY_QC_MAX_NUM_REQUESTED_FACES);
   3082             return setFaceRecognition(str, maxFaces);
   3083         }
   3084     }
   3085     return NO_ERROR;
   3086 }
   3087 
   3088 /*===========================================================================
   3089  * FUNCTION   : setZoom
   3090  *
   3091  * DESCRIPTION: set zoom value from user setting
   3092  *
   3093  * PARAMETERS :
   3094  *   @params  : user setting parameters
   3095  *
   3096  * RETURN     : int32_t type of status
   3097  *              NO_ERROR  -- success
   3098  *              none-zero failure code
   3099  *==========================================================================*/
   3100 int32_t QCameraParameters::setZoom(const QCameraParameters& params)
   3101 {
   3102     if ((m_pCapability->zoom_supported == 0 ||
   3103          m_pCapability->zoom_ratio_tbl_cnt == 0)) {
   3104         LOGH("no zoom support");
   3105         return NO_ERROR;
   3106     }
   3107 
   3108     int zoomLevel = params.getInt(KEY_ZOOM);
   3109     mParmZoomLevel = zoomLevel;
   3110     if ((zoomLevel < 0) || (zoomLevel >= (int)m_pCapability->zoom_ratio_tbl_cnt)) {
   3111         LOGE("invalid value %d out of (%d, %d)",
   3112                zoomLevel,
   3113               0, m_pCapability->zoom_ratio_tbl_cnt-1);
   3114         return BAD_VALUE;
   3115     }
   3116 
   3117     int prevZoomLevel = getInt(KEY_ZOOM);
   3118     if (prevZoomLevel == zoomLevel) {
   3119         LOGD("No value change in zoom %d %d", prevZoomLevel, zoomLevel);
   3120         m_bZoomChanged = false;
   3121         return NO_ERROR;
   3122     }
   3123     m_bZoomChanged = true;
   3124 
   3125     return setZoom(zoomLevel);
   3126 }
   3127 
   3128 /*===========================================================================
   3129  * FUNCTION   : setISOValue
   3130  *
   3131  * DESCRIPTION: set ISO value from user setting
   3132  *
   3133  * PARAMETERS :
   3134  *   @params  : user setting parameters
   3135  *
   3136  * RETURN     : int32_t type of status
   3137  *              NO_ERROR  -- success
   3138  *              none-zero failure code
   3139  *==========================================================================*/
   3140 int32_t  QCameraParameters::setISOValue(const QCameraParameters& params)
   3141 {
   3142     const char *str = params.get(KEY_QC_ISO_MODE);
   3143     const char *prev_str = get(KEY_QC_ISO_MODE);
   3144 
   3145     if(getManualCaptureMode()) {
   3146         char iso_val[PROPERTY_VALUE_MAX];
   3147 
   3148         property_get("persist.camera.iso", iso_val, "");
   3149         if (strlen(iso_val) > 0) {
   3150             if (prev_str == NULL ||
   3151                     strcmp(iso_val, prev_str) != 0) {
   3152                 return setISOValue(iso_val);
   3153             }
   3154         }
   3155     } else if (str != NULL) {
   3156         if (prev_str == NULL ||
   3157             strcmp(str, prev_str) != 0) {
   3158             return setISOValue(str);
   3159         }
   3160     }
   3161     return NO_ERROR;
   3162 }
   3163 
   3164 /*===========================================================================
   3165  * FUNCTION   : setContinuousISO
   3166  *
   3167  * DESCRIPTION: set ISO value from user setting
   3168  *
   3169  * PARAMETERS :
   3170  *   @params  : user setting parameters
   3171  *
   3172  * RETURN     : int32_t type of status
   3173  *              NO_ERROR  -- success
   3174  *              none-zero failure code
   3175  *==========================================================================*/
   3176 int32_t  QCameraParameters::setContinuousISO(const char *isoValue)
   3177 {
   3178     char iso[PROPERTY_VALUE_MAX];
   3179     int32_t continous_iso = 0;
   3180 
   3181     // Check if continuous ISO is set through setproperty
   3182     property_get("persist.camera.continuous.iso", iso, "");
   3183     if (strlen(iso) > 0) {
   3184         continous_iso = atoi(iso);
   3185     } else {
   3186         continous_iso = atoi(isoValue);
   3187     }
   3188 
   3189     if ((continous_iso >= 0) &&
   3190             (continous_iso <= m_pCapability->sensitivity_range.max_sensitivity)) {
   3191         LOGH("Setting continuous ISO value %d", continous_iso);
   3192         updateParamEntry(KEY_QC_CONTINUOUS_ISO, isoValue);
   3193 
   3194         cam_intf_parm_manual_3a_t iso_settings;
   3195         memset(&iso_settings, 0, sizeof(cam_intf_parm_manual_3a_t));
   3196         iso_settings.previewOnly = FALSE;
   3197         iso_settings.value = continous_iso;
   3198         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ISO, iso_settings)) {
   3199             return BAD_VALUE;
   3200         }
   3201         return NO_ERROR;
   3202     }
   3203     LOGE("Invalid iso value: %d", continous_iso);
   3204     return BAD_VALUE;
   3205 }
   3206 
   3207 /*===========================================================================
   3208  * FUNCTION   : setExposureTime
   3209  *
   3210  * DESCRIPTION: set exposure time from user setting
   3211  *
   3212  * PARAMETERS :
   3213  *   @params  : user setting parameters
   3214  *
   3215  * RETURN     : int32_t type of status
   3216  *              NO_ERROR  -- success
   3217  *              none-zero failure code
   3218  *==========================================================================*/
   3219 int32_t  QCameraParameters::setExposureTime(const QCameraParameters& params)
   3220 {
   3221     const char *str = params.get(KEY_QC_EXPOSURE_TIME);
   3222     const char *prev_str = get(KEY_QC_EXPOSURE_TIME);
   3223     if (str != NULL) {
   3224         if (prev_str == NULL ||
   3225                 strcmp(str, prev_str) != 0) {
   3226             return setExposureTime(str);
   3227         }
   3228     } else if(getManualCaptureMode()) {
   3229         char expTime[PROPERTY_VALUE_MAX];
   3230 
   3231         property_get("persist.camera.exposure.time", expTime, "");
   3232         if (strlen(expTime) > 0) {
   3233             if (prev_str == NULL ||
   3234                     strcmp(expTime, prev_str) != 0) {
   3235                 return setExposureTime(expTime);
   3236             }
   3237         }
   3238     }
   3239 
   3240     return NO_ERROR;
   3241 }
   3242 
   3243 /*===========================================================================
   3244  * FUNCTION   : setVideoRotation
   3245  *
   3246  * DESCRIPTION: set rotation value from user setting
   3247  *
   3248  * PARAMETERS :
   3249  *   @params  : user setting parameters
   3250  *
   3251  * RETURN     : int32_t type of status
   3252  *              NO_ERROR  -- success
   3253  *              none-zero failure code
   3254  *==========================================================================*/
   3255 int32_t QCameraParameters::setVideoRotation(const QCameraParameters& params)
   3256 {
   3257     const char *str = params.get(KEY_QC_VIDEO_ROTATION);
   3258     if(str != NULL) {
   3259         int value = lookupAttr(VIDEO_ROTATION_MODES_MAP,
   3260                 PARAM_MAP_SIZE(VIDEO_ROTATION_MODES_MAP), str);
   3261         if (value != NAME_NOT_FOUND) {
   3262             updateParamEntry(KEY_QC_VIDEO_ROTATION, str);
   3263             LOGL("setVideoRotation:  %s %d: ", str, value);
   3264         } else {
   3265             LOGE("Invalid rotation value: %d", value);
   3266             return BAD_VALUE;
   3267         }
   3268 
   3269     }
   3270     return NO_ERROR;
   3271 }
   3272 
   3273 /*===========================================================================
   3274  * FUNCTION   : setRotation
   3275  *
   3276  * DESCRIPTION: set rotation value from user setting
   3277  *
   3278  * PARAMETERS :
   3279  *   @params  : user setting parameters
   3280  *
   3281  * RETURN     : int32_t type of status
   3282  *              NO_ERROR  -- success
   3283  *              none-zero failure code
   3284  *==========================================================================*/
   3285 int32_t QCameraParameters::setRotation(const QCameraParameters& params)
   3286 {
   3287     int32_t rotation = params.getInt(KEY_ROTATION);
   3288     if (rotation != -1) {
   3289         if (rotation == 0 || rotation == 90 ||
   3290             rotation == 180 || rotation == 270) {
   3291             set(KEY_ROTATION, rotation);
   3292 
   3293             ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_META_JPEG_ORIENTATION,
   3294                     rotation);
   3295             mRotation = rotation;
   3296         } else {
   3297             LOGE("Invalid rotation value: %d", rotation);
   3298             return BAD_VALUE;
   3299         }
   3300     }
   3301     return NO_ERROR;
   3302 }
   3303 
   3304 /*===========================================================================
   3305  * FUNCTION   : setFlash
   3306  *
   3307  * DESCRIPTION: set flash mode from user setting
   3308  *
   3309  * PARAMETERS :
   3310  *   @params  : user setting parameters
   3311  *
   3312  * RETURN     : int32_t type of status
   3313  *              NO_ERROR  -- success
   3314  *              none-zero failure code
   3315  *==========================================================================*/
   3316 int32_t QCameraParameters::setFlash(const QCameraParameters& params)
   3317 {
   3318     const char *str = params.get(KEY_FLASH_MODE);
   3319     const char *prev_str = get(KEY_FLASH_MODE);
   3320     if (str != NULL) {
   3321         if (prev_str == NULL ||
   3322             strcmp(str, prev_str) != 0) {
   3323             return setFlash(str);
   3324         }
   3325     }
   3326     return NO_ERROR;
   3327 }
   3328 
   3329 /*===========================================================================
   3330  * FUNCTION   : setAecLock
   3331  *
   3332  * DESCRIPTION: set AEC lock value from user setting
   3333  *
   3334  * PARAMETERS :
   3335  *   @params  : user setting parameters
   3336  *
   3337  * RETURN     : int32_t type of status
   3338  *              NO_ERROR  -- success
   3339  *              none-zero failure code
   3340  *==========================================================================*/
   3341 int32_t QCameraParameters::setAecLock(const QCameraParameters& params)
   3342 {
   3343     const char *str = params.get(KEY_AUTO_EXPOSURE_LOCK);
   3344     const char *prev_str = get(KEY_AUTO_EXPOSURE_LOCK);
   3345     if (str != NULL) {
   3346         if (prev_str == NULL ||
   3347             strcmp(str, prev_str) != 0) {
   3348             return setAecLock(str);
   3349         }
   3350     }
   3351     return NO_ERROR;
   3352 }
   3353 
   3354 /*===========================================================================
   3355  * FUNCTION   : setAwbLock
   3356  *
   3357  * DESCRIPTION: set AWB lock from user setting
   3358  *
   3359  * PARAMETERS :
   3360  *   @params  : user setting parameters
   3361  *
   3362  * RETURN     : int32_t type of status
   3363  *              NO_ERROR  -- success
   3364  *              none-zero failure code
   3365  *==========================================================================*/
   3366 int32_t QCameraParameters::setAwbLock(const QCameraParameters& params)
   3367 {
   3368     const char *str = params.get(KEY_AUTO_WHITEBALANCE_LOCK);
   3369     const char *prev_str = get(KEY_AUTO_WHITEBALANCE_LOCK);
   3370     if (str != NULL) {
   3371         if (prev_str == NULL ||
   3372             strcmp(str, prev_str) != 0) {
   3373             return setAwbLock(str);
   3374         }
   3375     }
   3376     return NO_ERROR;
   3377 }
   3378 
   3379 /*===========================================================================
   3380  * FUNCTION   : setAutoHDR
   3381  *
   3382  * DESCRIPTION: Enable/disable auto HDR
   3383  *
   3384  * PARAMETERS :
   3385  *   @params  : user setting parameters
   3386  *
   3387  * RETURN     : int32_t type of status
   3388  *              NO_ERROR  -- success
   3389  *              none-zero failure code
   3390  *==========================================================================*/
   3391 int32_t QCameraParameters::setAutoHDR(const QCameraParameters& params)
   3392 {
   3393     const char *str = params.get(KEY_QC_AUTO_HDR_ENABLE);
   3394     const char *prev_str = get(KEY_QC_AUTO_HDR_ENABLE);
   3395     char prop[PROPERTY_VALUE_MAX];
   3396 
   3397     memset(prop, 0, sizeof(prop));
   3398     property_get("persist.camera.auto.hdr.enable", prop, VALUE_DISABLE);
   3399     if (str != NULL) {
   3400        if (prev_str == NULL ||
   3401            strcmp(str, prev_str) != 0) {
   3402            LOGH("Auto HDR set to: %s", str);
   3403            return updateParamEntry(KEY_QC_AUTO_HDR_ENABLE, str);
   3404        }
   3405     } else {
   3406        if (prev_str == NULL ||
   3407            strcmp(prev_str, prop) != 0 ) {
   3408            LOGH("Auto HDR set to: %s", prop);
   3409            updateParamEntry(KEY_QC_AUTO_HDR_ENABLE, prop);
   3410        }
   3411     }
   3412 
   3413        return NO_ERROR;
   3414 }
   3415 
   3416 /*===========================================================================
   3417 * FUNCTION   : isAutoHDREnabled
   3418 *
   3419 * DESCRIPTION: Query auto HDR status
   3420 *
   3421 * PARAMETERS : None
   3422 *
   3423 * RETURN     : bool true/false
   3424 *==========================================================================*/
   3425 bool QCameraParameters::isAutoHDREnabled()
   3426 {
   3427     const char *str = get(KEY_QC_AUTO_HDR_ENABLE);
   3428     if (str != NULL) {
   3429         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   3430                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), str);
   3431         if (value == NAME_NOT_FOUND) {
   3432             LOGE("Invalid Auto HDR value %s", str);
   3433             return false;
   3434         }
   3435 
   3436         LOGH("Auto HDR status is: %d", value);
   3437         return value ? true : false;
   3438     }
   3439 
   3440     LOGH("Auto HDR status not set!");
   3441     return false;
   3442 }
   3443 
   3444 /*===========================================================================
   3445  * FUNCTION   : setMCEValue
   3446  *
   3447  * DESCRIPTION: set memory color enhancement value from user setting
   3448  *
   3449  * PARAMETERS :
   3450  *   @params  : user setting parameters
   3451  *
   3452  * RETURN     : int32_t type of status
   3453  *              NO_ERROR  -- success
   3454  *              none-zero failure code
   3455  *==========================================================================*/
   3456 int32_t QCameraParameters::setMCEValue(const QCameraParameters& params)
   3457 {
   3458     const char *str = params.get(KEY_QC_MEMORY_COLOR_ENHANCEMENT);
   3459     const char *prev_str = get(KEY_QC_MEMORY_COLOR_ENHANCEMENT);
   3460     if (str != NULL) {
   3461         if (prev_str == NULL ||
   3462             strcmp(str, prev_str) != 0) {
   3463             return setMCEValue(str);
   3464         }
   3465     }
   3466     return NO_ERROR;
   3467 }
   3468 
   3469 /*===========================================================================
   3470  * FUNCTION   : setDISValue
   3471  *
   3472  * DESCRIPTION: enable/disable DIS from user setting
   3473  *
   3474  * PARAMETERS :
   3475  *   @params  : user setting parameters
   3476  *
   3477  * RETURN     : int32_t type of status
   3478  *              NO_ERROR  -- success
   3479  *              none-zero failure code
   3480  *==========================================================================*/
   3481 int32_t QCameraParameters::setDISValue(const QCameraParameters& params)
   3482 {
   3483     const char *str = params.get(KEY_QC_DIS);
   3484     const char *prev_str = get(KEY_QC_DIS);
   3485     if (str != NULL) {
   3486         if (prev_str == NULL ||
   3487             strcmp(str, prev_str) != 0) {
   3488             return setDISValue(str);
   3489         }
   3490     }
   3491     return NO_ERROR;
   3492 }
   3493 
   3494 /*===========================================================================
   3495  * FUNCTION   : setLensShadeValue
   3496  *
   3497  * DESCRIPTION: set lens shade value from user setting
   3498  *
   3499  * PARAMETERS :
   3500  *   @params  : user setting parameters
   3501  *
   3502  * RETURN     : int32_t type of status
   3503  *              NO_ERROR  -- success
   3504  *              none-zero failure code
   3505  *==========================================================================*/
   3506 int32_t QCameraParameters::setLensShadeValue(const QCameraParameters& params)
   3507 {
   3508     const char *str = params.get(KEY_QC_LENSSHADE);
   3509     const char *prev_str = get(KEY_QC_LENSSHADE);
   3510     if (str != NULL) {
   3511         if (prev_str == NULL ||
   3512             strcmp(str, prev_str) != 0) {
   3513             return setLensShadeValue(str);
   3514         }
   3515     }
   3516     return NO_ERROR;
   3517 }
   3518 
   3519 /*===========================================================================
   3520  * FUNCTION   : setFocusAreas
   3521  *
   3522  * DESCRIPTION: set focus areas from user setting
   3523  *
   3524  * PARAMETERS :
   3525  *   @params  : user setting parameters
   3526  *
   3527  * RETURN     : int32_t type of status
   3528  *              NO_ERROR  -- success
   3529  *              none-zero failure code
   3530  *==========================================================================*/
   3531 int32_t QCameraParameters::setFocusAreas(const QCameraParameters& params)
   3532 {
   3533     const char *str = params.get(KEY_FOCUS_AREAS);
   3534 
   3535     if (getRelatedCamSyncInfo()->mode == CAM_MODE_SECONDARY) {
   3536         // Ignore focus areas for secondary camera
   3537         LOGH("Ignore focus areas for secondary camera!! ");
   3538         return NO_ERROR;
   3539     }
   3540     if (str != NULL) {
   3541         int max_num_af_areas = getInt(KEY_MAX_NUM_FOCUS_AREAS);
   3542         if(max_num_af_areas == 0) {
   3543             LOGE("max num of AF area is 0, cannot set focus areas");
   3544             return BAD_VALUE;
   3545         }
   3546 
   3547         const char *prev_str = get(KEY_FOCUS_AREAS);
   3548         if (prev_str == NULL ||
   3549             strcmp(str, prev_str) != 0) {
   3550             return setFocusAreas(str);
   3551         }
   3552     }
   3553     return NO_ERROR;
   3554 }
   3555 
   3556 /*===========================================================================
   3557  * FUNCTION   : setMeteringAreas
   3558  *
   3559  * DESCRIPTION: set metering areas from user setting
   3560  *
   3561  * PARAMETERS :
   3562  *   @params  : user setting parameters
   3563  *
   3564  * RETURN     : int32_t type of status
   3565  *              NO_ERROR  -- success
   3566  *              none-zero failure code
   3567  *==========================================================================*/
   3568 int32_t QCameraParameters::setMeteringAreas(const QCameraParameters& params)
   3569 {
   3570     const char *str = params.get(KEY_METERING_AREAS);
   3571     if (str != NULL) {
   3572         int max_num_mtr_areas = getInt(KEY_MAX_NUM_METERING_AREAS);
   3573         if(max_num_mtr_areas == 0) {
   3574             LOGE("max num of metering areas is 0, cannot set focus areas");
   3575             return BAD_VALUE;
   3576         }
   3577 
   3578         const char *prev_str = get(KEY_METERING_AREAS);
   3579         if (prev_str == NULL ||
   3580             strcmp(str, prev_str) != 0 ||
   3581             (m_bNeedRestart == true)) {
   3582             return setMeteringAreas(str);
   3583         }
   3584     }
   3585     return NO_ERROR;
   3586 }
   3587 
   3588 /*===========================================================================
   3589  * FUNCTION   : setSceneMode
   3590  *
   3591  * DESCRIPTION: set scenen mode from user setting
   3592  *
   3593  * PARAMETERS :
   3594  *   @params  : user setting parameters
   3595  *
   3596  * RETURN     : int32_t type of status
   3597  *              NO_ERROR  -- success
   3598  *              none-zero failure code
   3599  *==========================================================================*/
   3600 int32_t QCameraParameters::setSceneMode(const QCameraParameters& params)
   3601 {
   3602     const char *str = params.get(KEY_SCENE_MODE);
   3603     const char *prev_str = get(KEY_SCENE_MODE);
   3604     LOGH("str - %s, prev_str - %s", str, prev_str);
   3605 
   3606     // HDR & Recording are mutually exclusive and so disable HDR if recording hint is set
   3607     if (m_bRecordingHint_new && m_bHDREnabled) {
   3608         LOGH("Disable the HDR and set it to Auto");
   3609         str = SCENE_MODE_AUTO;
   3610         m_bLocalHDREnabled = true;
   3611     } else if (!m_bRecordingHint_new && m_bLocalHDREnabled) {
   3612         LOGH("Restore the HDR from Auto scene mode");
   3613         str = SCENE_MODE_HDR;
   3614         m_bLocalHDREnabled = false;
   3615     }
   3616 
   3617     if (str != NULL) {
   3618         if (prev_str == NULL ||
   3619             strcmp(str, prev_str) != 0) {
   3620 
   3621             if(strcmp(str, SCENE_MODE_AUTO) == 0) {
   3622                 m_bSceneTransitionAuto = true;
   3623             }
   3624             if (strcmp(str, SCENE_MODE_HDR) == 0) {
   3625 
   3626                 // If HDR is set from client  and the feature is not enabled in the backend, ignore it.
   3627                 if (m_bHDRModeSensor && isSupportedSensorHdrSize(params)) {
   3628                     m_bSensorHDREnabled = true;
   3629                     m_bHDREnabled = false;
   3630                     LOGH("Sensor HDR mode Enabled");
   3631                 } else {
   3632                     m_bHDREnabled = true;
   3633                     LOGH("S/W HDR Enabled");
   3634                 }
   3635             } else {
   3636                 m_bHDREnabled = false;
   3637                 if (m_bSensorHDREnabled) {
   3638                     m_bSensorHDREnabled = false;
   3639                     m_bNeedRestart = true;
   3640                     setSensorSnapshotHDR("off");
   3641                 }
   3642             }
   3643 
   3644             if (m_bSensorHDREnabled) {
   3645                 setSensorSnapshotHDR("on");
   3646                 m_bNeedRestart = true;
   3647             } else if ((m_bHDREnabled) ||
   3648                 ((prev_str != NULL) && (strcmp(prev_str, SCENE_MODE_HDR) == 0))) {
   3649                 LOGH("scene mode changed between HDR and non-HDR, need restart");
   3650                 m_bNeedRestart = true;
   3651             }
   3652 
   3653             return setSceneMode(str);
   3654         }
   3655     }
   3656     return NO_ERROR;
   3657 }
   3658 
   3659 /*===========================================================================
   3660  * FUNCTION   : setSelectableZoneAf
   3661  *
   3662  * DESCRIPTION: set selectable zone auto focus value from user setting
   3663  *
   3664  * PARAMETERS :
   3665  *   @params  : user setting parameters
   3666  *
   3667  * RETURN     : int32_t type of status
   3668  *              NO_ERROR  -- success
   3669  *              none-zero failure code
   3670  *==========================================================================*/
   3671 int32_t QCameraParameters::setSelectableZoneAf(const QCameraParameters& params)
   3672 {
   3673     const char *str = params.get(KEY_QC_SELECTABLE_ZONE_AF);
   3674     const char *prev_str = get(KEY_QC_SELECTABLE_ZONE_AF);
   3675     if (str != NULL) {
   3676         if (prev_str == NULL ||
   3677             strcmp(str, prev_str) != 0) {
   3678             return setSelectableZoneAf(str);
   3679         }
   3680     }
   3681     return NO_ERROR;
   3682 }
   3683 
   3684 /*===========================================================================
   3685  * FUNCTION   : setAEBracket
   3686  *
   3687  * DESCRIPTION: set AE bracket from user setting
   3688  *
   3689  * PARAMETERS :
   3690  *   @params  : user setting parameters
   3691  *
   3692  * RETURN     : int32_t type of status
   3693  *              NO_ERROR  -- success
   3694  *              none-zero failure code
   3695  *==========================================================================*/
   3696 int32_t QCameraParameters::setAEBracket(const QCameraParameters& params)
   3697 {
   3698     if (isHDREnabled()) {
   3699         LOGH("scene mode is HDR, overwrite AE bracket setting to off");
   3700         return setAEBracket(AE_BRACKET_OFF);
   3701     }
   3702 
   3703     const char *expStr = params.get(KEY_QC_CAPTURE_BURST_EXPOSURE);
   3704     if (NULL != expStr && strlen(expStr) > 0) {
   3705         set(KEY_QC_CAPTURE_BURST_EXPOSURE, expStr);
   3706     } else {
   3707         char prop[PROPERTY_VALUE_MAX];
   3708         memset(prop, 0, sizeof(prop));
   3709         property_get("persist.capture.burst.exposures", prop, "");
   3710         if (strlen(prop) > 0) {
   3711             set(KEY_QC_CAPTURE_BURST_EXPOSURE, prop);
   3712         } else {
   3713             remove(KEY_QC_CAPTURE_BURST_EXPOSURE);
   3714         }
   3715     }
   3716 
   3717     const char *str = params.get(KEY_QC_AE_BRACKET_HDR);
   3718     const char *prev_str = get(KEY_QC_AE_BRACKET_HDR);
   3719     if (str != NULL) {
   3720         if (prev_str == NULL ||
   3721             strcmp(str, prev_str) != 0) {
   3722             return setAEBracket(str);
   3723         }
   3724     }
   3725     return NO_ERROR;
   3726 }
   3727 
   3728 /*===========================================================================
   3729  * FUNCTION   : setAFBracket
   3730  *
   3731  * DESCRIPTION: set AF bracket from user setting
   3732  *
   3733  * PARAMETERS :
   3734  *   @params  : user setting parameters
   3735  *
   3736  * RETURN     : int32_t type of status
   3737  *              NO_ERROR  -- success
   3738  *              none-zero failure code
   3739  *==========================================================================*/
   3740 int32_t QCameraParameters::setAFBracket(const QCameraParameters& params)
   3741 {
   3742     if ((m_pCapability->qcom_supported_feature_mask &
   3743             (CAM_QCOM_FEATURE_REFOCUS | CAM_QCOM_FEATURE_UBIFOCUS)) == 0) {
   3744         LOGH("AF Bracketing is not supported");
   3745         return NO_ERROR;
   3746     }
   3747     const char *str = params.get(KEY_QC_AF_BRACKET);
   3748     const char *prev_str = get(KEY_QC_AF_BRACKET);
   3749     LOGH("str =%s & prev_str =%s", str, prev_str);
   3750     if (str != NULL) {
   3751         if (prev_str == NULL ||
   3752             strcmp(str, prev_str) != 0) {
   3753             m_bNeedRestart = true;
   3754             return setAFBracket(str);
   3755         }
   3756     }
   3757     return NO_ERROR;
   3758 }
   3759 
   3760 /*===========================================================================
   3761  * FUNCTION   : setReFocus
   3762  *
   3763  * DESCRIPTION: set refocus from user setting
   3764  *
   3765  * PARAMETERS :
   3766  *   @params  : user setting parameters
   3767  *
   3768  * RETURN     : int32_t type of status
   3769  *              NO_ERROR  -- success
   3770  *              none-zero failure code
   3771  *==========================================================================*/
   3772 int32_t QCameraParameters::setReFocus(const QCameraParameters& params)
   3773 {
   3774     if ((m_pCapability->qcom_supported_feature_mask &
   3775             (CAM_QCOM_FEATURE_REFOCUS | CAM_QCOM_FEATURE_UBIFOCUS)) == 0) {
   3776         LOGD("AF Bracketing is not supported");
   3777         return NO_ERROR;
   3778     }
   3779     const char *str = params.get(KEY_QC_RE_FOCUS);
   3780     const char *prev_str = get(KEY_QC_RE_FOCUS);
   3781     LOGH("str =%s & prev_str =%s", str, prev_str);
   3782     if (str != NULL) {
   3783         if (prev_str == NULL ||
   3784             strcmp(str, prev_str) != 0) {
   3785             m_bNeedRestart = true;
   3786             return setReFocus(str);
   3787         }
   3788     }
   3789     return NO_ERROR;
   3790 }
   3791 
   3792 /*===========================================================================
   3793  * FUNCTION   : setChromaFlash
   3794  *
   3795  * DESCRIPTION: set chroma flash from user setting
   3796  *
   3797  * PARAMETERS :
   3798  *   @params  : user setting parameters
   3799  *
   3800  * RETURN     : int32_t type of status
   3801  *              NO_ERROR  -- success
   3802  *              none-zero failure code
   3803  *==========================================================================*/
   3804 int32_t QCameraParameters::setChromaFlash(const QCameraParameters& params)
   3805 {
   3806     if ((m_pCapability->qcom_supported_feature_mask &
   3807         CAM_QCOM_FEATURE_CHROMA_FLASH) == 0) {
   3808         LOGH("Chroma Flash is not supported");
   3809         return NO_ERROR;
   3810     }
   3811     const char *str = params.get(KEY_QC_CHROMA_FLASH);
   3812     const char *prev_str = get(KEY_QC_CHROMA_FLASH);
   3813     LOGH("str =%s & prev_str =%s", str, prev_str);
   3814     if (str != NULL) {
   3815         if (prev_str == NULL ||
   3816             strcmp(str, prev_str) != 0) {
   3817             m_bNeedRestart = true;
   3818             return setChromaFlash(str);
   3819         }
   3820     }
   3821     return NO_ERROR;
   3822 }
   3823 
   3824 /*===========================================================================
   3825  * FUNCTION   : setOptiZoom
   3826  *
   3827  * DESCRIPTION: set opti zoom from user setting
   3828  *
   3829  * PARAMETERS :
   3830  *   @params  : user setting parameters
   3831  *
   3832  * RETURN     : int32_t type of status
   3833  *              NO_ERROR  -- success
   3834  *              none-zero failure code
   3835  *==========================================================================*/
   3836 int32_t QCameraParameters::setOptiZoom(const QCameraParameters& params)
   3837 {
   3838     if ((m_pCapability->qcom_supported_feature_mask &
   3839         CAM_QCOM_FEATURE_OPTIZOOM) == 0){
   3840         LOGH("Opti Zoom is not supported");
   3841         return NO_ERROR;
   3842     }
   3843     const char *str = params.get(KEY_QC_OPTI_ZOOM);
   3844     const char *prev_str = get(KEY_QC_OPTI_ZOOM);
   3845     LOGH("str =%s & prev_str =%s", str, prev_str);
   3846     if (str != NULL) {
   3847         if (prev_str == NULL ||
   3848             strcmp(str, prev_str) != 0) {
   3849             m_bNeedRestart = true;
   3850             return setOptiZoom(str);
   3851         }
   3852     }
   3853     return NO_ERROR;
   3854 }
   3855 
   3856 /*===========================================================================
   3857  * FUNCTION   : setTruePortrait
   3858  *
   3859  * DESCRIPTION: set true portrait from user setting
   3860  *
   3861  * PARAMETERS :
   3862  *   @params  : user setting parameters
   3863  *
   3864  * RETURN     : int32_t type of status
   3865  *              NO_ERROR  -- success
   3866  *              none-zero failure code
   3867  *==========================================================================*/
   3868 int32_t QCameraParameters::setTruePortrait(const QCameraParameters& params)
   3869 {
   3870     if ((m_pCapability->qcom_supported_feature_mask &
   3871             CAM_QCOM_FEATURE_TRUEPORTRAIT) == 0) {
   3872         LOGD("True Portrait is not supported");
   3873         return NO_ERROR;
   3874     }
   3875     const char *str = params.get(KEY_QC_TRUE_PORTRAIT);
   3876     const char *prev_str = get(KEY_QC_TRUE_PORTRAIT);
   3877     LOGH("str =%s & prev_str =%s", str, prev_str);
   3878     if (str != NULL) {
   3879         if (prev_str == NULL ||
   3880             strcmp(str, prev_str) != 0) {
   3881             return setTruePortrait(str);
   3882         }
   3883     }
   3884     return NO_ERROR;
   3885 }
   3886 
   3887 /*===========================================================================
   3888  * FUNCTION   : setHDRMode
   3889  *
   3890  * DESCRIPTION: set HDR mode from user setting
   3891  *
   3892  * PARAMETERS :
   3893  *   @params  : user setting parameters
   3894  *
   3895  * RETURN     : int32_t type of status
   3896  *              NO_ERROR  -- success
   3897  *              none-zero failure code
   3898  *==========================================================================*/
   3899 int32_t QCameraParameters::setHDRMode(const QCameraParameters& params)
   3900 {
   3901     const char *str = params.get(KEY_QC_HDR_MODE);
   3902     const char *prev_str = get(KEY_QC_HDR_MODE);
   3903     uint32_t supported_hdr_modes = m_pCapability->qcom_supported_feature_mask &
   3904           (CAM_QCOM_FEATURE_SENSOR_HDR | CAM_QCOM_FEATURE_HDR);
   3905 
   3906     LOGH("str =%s & prev_str =%s", str, prev_str);
   3907     if (str != NULL) {
   3908         if ((CAM_QCOM_FEATURE_SENSOR_HDR == supported_hdr_modes) &&
   3909                 (strncmp(str, HDR_MODE_SENSOR, strlen(HDR_MODE_SENSOR)))) {
   3910             LOGH("Only sensor HDR is supported");
   3911             return NO_ERROR;
   3912         } else if  ((CAM_QCOM_FEATURE_HDR == supported_hdr_modes) &&
   3913                 (strncmp(str, HDR_MODE_SENSOR, strlen(HDR_MODE_MULTI_FRAME)))) {
   3914             LOGH("Only multi frame HDR is supported");
   3915             return NO_ERROR;
   3916         } else if (!supported_hdr_modes) {
   3917             LOGH("HDR is not supported");
   3918             return NO_ERROR;
   3919         }
   3920         if (prev_str == NULL ||
   3921                 strcmp(str, prev_str) != 0) {
   3922             return setHDRMode(str);
   3923         }
   3924     }
   3925 
   3926     return NO_ERROR;
   3927 }
   3928 
   3929 /*===========================================================================
   3930  * FUNCTION   : setHDRNeed1x
   3931  *
   3932  * DESCRIPTION: set HDR need 1x from user setting
   3933  *
   3934  * PARAMETERS :
   3935  *   @params  : user setting parameters
   3936  *
   3937  * RETURN     : int32_t type of status
   3938  *              NO_ERROR  -- success
   3939  *              none-zero failure code
   3940  *==========================================================================*/
   3941 int32_t QCameraParameters::setHDRNeed1x(const QCameraParameters& params)
   3942 {
   3943     const char *str = params.get(KEY_QC_HDR_NEED_1X);
   3944     const char *prev_str = get(KEY_QC_HDR_NEED_1X);
   3945 
   3946     LOGH("str =%s & prev_str =%s", str, prev_str);
   3947     if (str != NULL) {
   3948         if (m_bHDRModeSensor) {
   3949             LOGH("Only multi frame HDR supports 1x frame");
   3950             return NO_ERROR;
   3951         }
   3952         if ((prev_str == NULL) || (strcmp(str, prev_str) != 0)) {
   3953             return setHDRNeed1x(str);
   3954         }
   3955     }
   3956     return NO_ERROR;
   3957 }
   3958 
   3959 /*===========================================================================
   3960  * FUNCTION   : setQuadraCfaMode
   3961  *
   3962  * DESCRIPTION: enable or disable Quadra CFA mode
   3963  *
   3964  * PARAMETERS :
   3965  *   @enable : enable: 1; disable 0
   3966  *   @initCommit: if configuration list needs to be initialized and commited
   3967  *
   3968  * RETURN     : int32_t type of status
   3969  *              NO_ERROR  -- success
   3970  *              none-zero failure code
   3971  *==========================================================================*/
   3972 int32_t QCameraParameters::setQuadraCfaMode(uint32_t enable, bool initCommit) {
   3973 
   3974    int32_t rc = NO_ERROR;
   3975 
   3976     if (getQuadraCfa()) {
   3977         if (enable) {
   3978             setOfflineRAW(TRUE);
   3979         } else  {
   3980             setOfflineRAW(FALSE);
   3981         }
   3982         if (initCommit) {
   3983             if (initBatchUpdate() < 0) {
   3984                 LOGE("Failed to initialize group update table");
   3985                 return FAILED_TRANSACTION;
   3986             }
   3987         }
   3988         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_QUADRA_CFA, enable)) {
   3989             LOGE("Failed to update Quadra CFA mode");
   3990             return BAD_VALUE;
   3991         }
   3992         if (initCommit) {
   3993             rc = commitSetBatch();
   3994             if (rc != NO_ERROR) {
   3995                 LOGE("Failed to commit Quadra CFA mode");
   3996                 return rc;
   3997             }
   3998         }
   3999         LOGI("Quadra CFA mode %d ", enable);
   4000     }
   4001     return rc;
   4002 }
   4003 
   4004 /*===========================================================================
   4005  * FUNCTION   : setQuadraCFA
   4006  *
   4007  * DESCRIPTION: set Quadra CFA mode
   4008  *
   4009  * PARAMETERS :
   4010  *   @params  : user setting parameters
   4011  *
   4012  * RETURN     : int32_t type of status
   4013  *              NO_ERROR  -- success
   4014  *              none-zero failure code
   4015  *==========================================================================*/
   4016 int32_t QCameraParameters::setQuadraCfa(const QCameraParameters& params)
   4017 {
   4018 
   4019     int32_t width = 0,height = 0;
   4020     bool prev_quadracfa = getQuadraCfa();
   4021     int32_t rc = NO_ERROR;
   4022     int32_t value;
   4023 
   4024     if (!m_pCapability->is_remosaic_lib_present) {
   4025         LOGD("Quadra CFA mode not supported");
   4026         return rc;
   4027     }
   4028 
   4029     /*Checking if the user selected dim is more than maximum dim supported by
   4030     Quadra sensor in normal mode. If more then switch to Quadra CFA mode else
   4031     remain in normal zsl mode */
   4032     params.getPictureSize(&width, &height);
   4033     if (width > m_pCapability->raw_dim[0].width ||
   4034         height > m_pCapability->raw_dim[0].height) {
   4035         LOGI("Quadra CFA mode selected");
   4036         m_bQuadraCfa = TRUE;
   4037     } else {
   4038         LOGI("Quadra CFA mode not selected");
   4039         m_bQuadraCfa = FALSE;
   4040     }
   4041     value = m_bQuadraCfa;
   4042     if (prev_quadracfa == m_bQuadraCfa) {
   4043         LOGD("No change in Quadra CFA mode");
   4044     } else {
   4045         if (m_bZslMode && m_bQuadraCfa) {
   4046             m_bNeedRestart = TRUE;
   4047             setZslMode(FALSE);
   4048         } else {
   4049             const char *str_val  = params.get(KEY_QC_ZSL);
   4050             int32_t value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP),
   4051                     str_val);
   4052             if (value != NAME_NOT_FOUND && value) {
   4053                 rc = setZslMode(value);
   4054                 // ZSL mode changed, need restart preview
   4055                 m_bNeedRestart = true;
   4056             }
   4057         }
   4058         setReprocCount();
   4059     }
   4060     LOGH("Quadra CFA mode = %d", m_bQuadraCfa);
   4061     return rc;
   4062 }
   4063 /*===========================================================================
   4064  * FUNCTION   : setSeeMore
   4065  *
   4066  * DESCRIPTION: set see more (llvd) from user setting
   4067  *
   4068  * PARAMETERS :
   4069  *   @params  : user setting parameters
   4070  *
   4071  * RETURN     : int32_t type of status
   4072  *              NO_ERROR  -- success
   4073  *              none-zero failure code
   4074  *==========================================================================*/
   4075 int32_t QCameraParameters::setSeeMore(const QCameraParameters& params)
   4076 {
   4077     if ((m_pCapability->qcom_supported_feature_mask &
   4078             CAM_QCOM_FEATURE_LLVD) == 0) {
   4079         LOGD("See more is not supported");
   4080         return NO_ERROR;
   4081     }
   4082     const char *str = params.get(KEY_QC_SEE_MORE);
   4083     const char *prev_str = get(KEY_QC_SEE_MORE);
   4084     LOGH("str =%s & prev_str =%s", str, prev_str);
   4085     if (str != NULL) {
   4086         if (prev_str == NULL || strcmp(str, prev_str) != 0) {
   4087             m_bNeedRestart = true;
   4088             return setSeeMore(str);
   4089         }
   4090     }
   4091     return NO_ERROR;
   4092 }
   4093 
   4094 /*===========================================================================
   4095  * FUNCTION   : setNoiseReductionMode
   4096  *
   4097  * DESCRIPTION: set noise reduction mode from user setting
   4098  *
   4099  * PARAMETERS :
   4100  *   @params  : user setting parameters
   4101  *
   4102  * RETURN     : int32_t type of status
   4103  *              NO_ERROR  -- success
   4104  *              none-zero failure code
   4105  *==========================================================================*/
   4106 int32_t QCameraParameters::setNoiseReductionMode(const QCameraParameters& params)
   4107 {
   4108     if ((m_pCapability->qcom_supported_feature_mask & CAM_QTI_FEATURE_SW_TNR) == 0) {
   4109         LOGD("SW TNR is not supported");
   4110         return NO_ERROR;
   4111     }
   4112     const char *str = params.get(KEY_QC_NOISE_REDUCTION_MODE);
   4113     const char *prev_str = get(KEY_QC_NOISE_REDUCTION_MODE);
   4114     LOGH("str =%s & prev_str =%s", str, prev_str);
   4115     if (str != NULL) {
   4116         if (prev_str == NULL || strcmp(str, prev_str) != 0) {
   4117             m_bNeedRestart = true;
   4118             return setNoiseReductionMode(str);
   4119         }
   4120     }
   4121     return NO_ERROR;
   4122 }
   4123 
   4124 /*===========================================================================
   4125  * FUNCTION   : setStillMore
   4126  *
   4127  * DESCRIPTION: set stillmore from user setting
   4128  *
   4129  * PARAMETERS :
   4130  *   @params  : user setting parameters
   4131  *
   4132  * RETURN     : int32_t type of status
   4133  *              NO_ERROR  -- success
   4134  *              none-zero failure code
   4135  *==========================================================================*/
   4136 int32_t QCameraParameters::setStillMore(const QCameraParameters& params)
   4137 {
   4138     if ((m_pCapability->qcom_supported_feature_mask &
   4139             CAM_QCOM_FEATURE_STILLMORE) == 0) {
   4140         LOGD("Stillmore is not supported");
   4141         return NO_ERROR;
   4142     }
   4143     const char *str = params.get(KEY_QC_STILL_MORE);
   4144     const char *prev_str = get(KEY_QC_STILL_MORE);
   4145     LOGH("str =%s & prev_str =%s", str, prev_str);
   4146     if (str != NULL) {
   4147         if (prev_str == NULL || strcmp(str, prev_str) != 0) {
   4148             m_bNeedRestart = true;
   4149             return setStillMore(str);
   4150         }
   4151     }
   4152     return NO_ERROR;
   4153 }
   4154 
   4155 #ifdef TARGET_TS_MAKEUP
   4156 
   4157 /*===========================================================================
   4158  * FUNCTION   : setTsMakeup
   4159  *
   4160  * DESCRIPTION: set setTsMakeup from user setting
   4161  *
   4162  * PARAMETERS :
   4163  *   @params  : user setting parameters
   4164  *
   4165  * RETURN     : int32_t type of status
   4166  *              NO_ERROR  -- success
   4167  *              none-zero failure code
   4168  *==========================================================================*/
   4169 int32_t QCameraParameters::setTsMakeup(const QCameraParameters& params)
   4170 {
   4171     const char *str = params.get(KEY_TS_MAKEUP);
   4172     const char *prev_str = get(KEY_TS_MAKEUP);
   4173     LOGH("str =%s & prev_str =%s", str, prev_str);
   4174     if (str != NULL) {
   4175         if (prev_str == NULL || strcmp(str, prev_str) != 0) {
   4176             m_bNeedRestart = true;
   4177             set(KEY_TS_MAKEUP, str);
   4178         }
   4179         str = params.get(KEY_TS_MAKEUP_WHITEN);
   4180         prev_str = get(KEY_TS_MAKEUP_WHITEN);
   4181         if (str != NULL) {
   4182             if (prev_str == NULL || strcmp(str, prev_str) != 0) {
   4183                 set(KEY_TS_MAKEUP_WHITEN, str);
   4184             }
   4185         }
   4186         str = params.get(KEY_TS_MAKEUP_CLEAN);
   4187         prev_str = get(KEY_TS_MAKEUP_CLEAN);
   4188         if (str != NULL) {
   4189             if (prev_str == NULL || strcmp(str, prev_str) != 0) {
   4190                 set(KEY_TS_MAKEUP_CLEAN, str);
   4191             }
   4192         }
   4193     }
   4194     return NO_ERROR;
   4195 }
   4196 
   4197 #endif
   4198 
   4199 /*===========================================================================
   4200  * FUNCTION   : setRedeyeReduction
   4201  *
   4202  * DESCRIPTION: set red eye reduction setting from user setting
   4203  *
   4204  * PARAMETERS :
   4205  *   @params  : user setting parameters
   4206  *
   4207  * RETURN     : int32_t type of status
   4208  *              NO_ERROR  -- success
   4209  *              none-zero failure code
   4210  *==========================================================================*/
   4211 int32_t QCameraParameters::setRedeyeReduction(const QCameraParameters& params)
   4212 {
   4213     const char *str = params.get(KEY_QC_REDEYE_REDUCTION);
   4214     const char *prev_str = get(KEY_QC_REDEYE_REDUCTION);
   4215     if (str != NULL) {
   4216         if (prev_str == NULL ||
   4217             strcmp(str, prev_str) != 0) {
   4218             return setRedeyeReduction(str);
   4219         }
   4220     }
   4221     return NO_ERROR;
   4222 }
   4223 
   4224 /*===========================================================================
   4225  * FUNCTION   : setGpsLocation
   4226  *
   4227  * DESCRIPTION: set GPS location information from user setting
   4228  *
   4229  * PARAMETERS :
   4230  *   @params  : user setting parameters
   4231  *
   4232  * RETURN     : int32_t type of status
   4233  *              NO_ERROR  -- success
   4234  *              none-zero failure code
   4235  *==========================================================================*/
   4236 int32_t QCameraParameters::setGpsLocation(const QCameraParameters& params)
   4237 {
   4238     const char *method = params.get(KEY_GPS_PROCESSING_METHOD);
   4239     if (method) {
   4240         set(KEY_GPS_PROCESSING_METHOD, method);
   4241     }else {
   4242         remove(KEY_GPS_PROCESSING_METHOD);
   4243     }
   4244 
   4245     const char *latitude = params.get(KEY_GPS_LATITUDE);
   4246     if (latitude) {
   4247         set(KEY_GPS_LATITUDE, latitude);
   4248     }else {
   4249         remove(KEY_GPS_LATITUDE);
   4250     }
   4251 
   4252     const char *latitudeRef = params.get(KEY_QC_GPS_LATITUDE_REF);
   4253     if (latitudeRef) {
   4254         set(KEY_QC_GPS_LATITUDE_REF, latitudeRef);
   4255     }else {
   4256         remove(KEY_QC_GPS_LATITUDE_REF);
   4257     }
   4258 
   4259     const char *longitude = params.get(KEY_GPS_LONGITUDE);
   4260     if (longitude) {
   4261         set(KEY_GPS_LONGITUDE, longitude);
   4262     }else {
   4263         remove(KEY_GPS_LONGITUDE);
   4264     }
   4265 
   4266     const char *longitudeRef = params.get(KEY_QC_GPS_LONGITUDE_REF);
   4267     if (longitudeRef) {
   4268         set(KEY_QC_GPS_LONGITUDE_REF, longitudeRef);
   4269     }else {
   4270         remove(KEY_QC_GPS_LONGITUDE_REF);
   4271     }
   4272 
   4273     const char *altitudeRef = params.get(KEY_QC_GPS_ALTITUDE_REF);
   4274     if (altitudeRef) {
   4275         set(KEY_QC_GPS_ALTITUDE_REF, altitudeRef);
   4276     }else {
   4277         remove(KEY_QC_GPS_ALTITUDE_REF);
   4278     }
   4279 
   4280     const char *altitude = params.get(KEY_GPS_ALTITUDE);
   4281     if (altitude) {
   4282         set(KEY_GPS_ALTITUDE, altitude);
   4283     }else {
   4284         remove(KEY_GPS_ALTITUDE);
   4285     }
   4286 
   4287     const char *status = params.get(KEY_QC_GPS_STATUS);
   4288     if (status) {
   4289         set(KEY_QC_GPS_STATUS, status);
   4290     } else {
   4291         remove(KEY_QC_GPS_STATUS);
   4292     }
   4293 
   4294     const char *timestamp = params.get(KEY_GPS_TIMESTAMP);
   4295     if (timestamp) {
   4296         set(KEY_GPS_TIMESTAMP, timestamp);
   4297     }else {
   4298         remove(KEY_GPS_TIMESTAMP);
   4299     }
   4300     return NO_ERROR;
   4301 }
   4302 
   4303 /*===========================================================================
   4304  * FUNCTION   : setNumOfSnapshot
   4305  *
   4306  * DESCRIPTION: set number of snapshot per shutter from user setting
   4307  *
   4308  * PARAMETERS : none
   4309  *
   4310  * RETURN     : int32_t type of status
   4311  *              NO_ERROR  -- success
   4312  *              none-zero failure code
   4313  *==========================================================================*/
   4314 int32_t QCameraParameters::setNumOfSnapshot()
   4315 {
   4316     int nBurstNum = 1;
   4317     int nExpnum = 0;
   4318 
   4319     const char *bracket_str = get(KEY_QC_AE_BRACKET_HDR);
   4320     if (bracket_str != NULL && strlen(bracket_str) > 0) {
   4321         int value = lookupAttr(BRACKETING_MODES_MAP, PARAM_MAP_SIZE(BRACKETING_MODES_MAP),
   4322                 bracket_str);
   4323         switch (value) {
   4324         case CAM_EXP_BRACKETING_ON:
   4325             {
   4326                 nExpnum = 0;
   4327                 const char *str_val = get(KEY_QC_CAPTURE_BURST_EXPOSURE);
   4328                 if ((str_val != NULL) && (strlen(str_val) > 0)) {
   4329                     char prop[PROPERTY_VALUE_MAX];
   4330                     memset(prop, 0, sizeof(prop));
   4331                     strlcpy(prop, str_val, PROPERTY_VALUE_MAX);
   4332                     char *saveptr = NULL;
   4333                     char *token = strtok_r(prop, ",", &saveptr);
   4334                     while (token != NULL) {
   4335                         token = strtok_r(NULL, ",", &saveptr);
   4336                         nExpnum++;
   4337                     }
   4338                 }
   4339                 if (nExpnum == 0) {
   4340                     nExpnum = 1;
   4341                 }
   4342             }
   4343             break;
   4344         default:
   4345             nExpnum = 1 + getNumOfExtraHDROutBufsIfNeeded();
   4346             break;
   4347         }
   4348     }
   4349 
   4350     if (isUbiRefocus()) {
   4351         nBurstNum = m_pCapability->refocus_af_bracketing_need.output_count + 1;
   4352     }
   4353 
   4354     if (mActiveCameras == MM_CAMERA_DUAL_CAM && mbundledSnapshot) {
   4355         int dualfov_snap_num = 1;
   4356         char prop[PROPERTY_VALUE_MAX];
   4357         memset(prop, 0, sizeof(prop));
   4358         property_get("persist.camera.dualfov.jpegnum", prop, "1");
   4359         dualfov_snap_num = atoi(prop);
   4360 
   4361         memset(prop, 0, sizeof(prop));
   4362         property_get("persist.camera.halpp", prop, "0");
   4363         int halpp_enabled = atoi(prop);
   4364         if(halpp_enabled == 0) {
   4365             dualfov_snap_num = MM_CAMERA_MAX_CAM_CNT;
   4366         }
   4367         dualfov_snap_num = (dualfov_snap_num == 0) ? 1 : dualfov_snap_num;
   4368 
   4369         set(KEY_QC_NUM_SNAPSHOT_PER_SHUTTER, (nBurstNum * nExpnum * dualfov_snap_num));
   4370         LOGH("nBurstNum = %d, nExpnum = %d snapshots = %d", nBurstNum, nExpnum,
   4371                 getInt(KEY_QC_NUM_SNAPSHOT_PER_SHUTTER));
   4372     } else {
   4373         set(KEY_QC_NUM_SNAPSHOT_PER_SHUTTER, (nBurstNum * nExpnum));
   4374         LOGH("nBurstNum = %d, nExpnum = %d snapshots = %d", nBurstNum, nExpnum,
   4375                 (nBurstNum * nExpnum * MM_CAMERA_MAX_CAM_CNT));
   4376     }
   4377 
   4378     return NO_ERROR;
   4379 }
   4380 
   4381 /*===========================================================================
   4382  * FUNCTION   : setRecordingHint
   4383  *
   4384  * DESCRIPTION: set recording hint value from user setting
   4385  *
   4386  * PARAMETERS :
   4387  *   @params  : user setting parameters
   4388  *
   4389  * RETURN     : int32_t type of status
   4390  *              NO_ERROR  -- success
   4391  *              none-zero failure code
   4392  *==========================================================================*/
   4393 int32_t QCameraParameters::setRecordingHint(const QCameraParameters& params)
   4394 {
   4395     const char * str = params.get(KEY_RECORDING_HINT);
   4396     const char *prev_str = get(KEY_RECORDING_HINT);
   4397     if (str != NULL) {
   4398         if (prev_str == NULL || strcmp(str, prev_str) != 0) {
   4399             int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP, PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP),
   4400                     str);
   4401             if(value != NAME_NOT_FOUND){
   4402                 updateParamEntry(KEY_RECORDING_HINT, str);
   4403                 setRecordingHintValue(value);
   4404                 if (getFaceDetectionOption() == true) {
   4405                     if (!fdModeInVideo()) {
   4406                         setFaceDetection(value > 0 ? false : true, false);
   4407                     } else {
   4408                         setFaceDetection(true, false);
   4409                     }
   4410                 }
   4411                 if (m_bDISEnabled) {
   4412                     LOGH("Setting DIS value again");
   4413                     setDISValue(VALUE_ENABLE);
   4414                 }
   4415                 return NO_ERROR;
   4416             } else {
   4417                 LOGE("Invalid recording hint value: %s", str);
   4418                 return BAD_VALUE;
   4419             }
   4420         }
   4421     }
   4422     return NO_ERROR;
   4423 }
   4424 
   4425 /*===========================================================================
   4426  * FUNCTION   : setNoDisplayMode
   4427  *
   4428  * DESCRIPTION: set no display mode from user setting
   4429  *
   4430  * PARAMETERS :
   4431  *   @params  : user setting parameters
   4432  *
   4433  * RETURN     : int32_t type of status
   4434  *              NO_ERROR  -- success
   4435  *              none-zero failure code
   4436  *==========================================================================*/
   4437 int32_t QCameraParameters::setNoDisplayMode(const QCameraParameters& params)
   4438 {
   4439     const char *str_val  = params.get(KEY_QC_NO_DISPLAY_MODE);
   4440     const char *prev_str = get(KEY_QC_NO_DISPLAY_MODE);
   4441     char prop[PROPERTY_VALUE_MAX];
   4442     LOGD("str_val: %s, prev_str: %s", str_val, prev_str);
   4443 
   4444     // Aux Camera Mode, set no display mode
   4445     if (m_relCamSyncInfo.mode == CAM_MODE_SECONDARY) {
   4446         if (!m_bNoDisplayMode) {
   4447             set(KEY_QC_NO_DISPLAY_MODE, 1);
   4448             m_bNoDisplayMode = true;
   4449             m_bNeedRestart = true;
   4450         }
   4451         return NO_ERROR;
   4452     }
   4453 
   4454     if(str_val && strlen(str_val) > 0) {
   4455         if (prev_str == NULL || strcmp(str_val, prev_str) != 0) {
   4456             m_bNoDisplayMode = atoi(str_val);
   4457             set(KEY_QC_NO_DISPLAY_MODE, str_val);
   4458             m_bNeedRestart = true;
   4459         }
   4460     } else {
   4461         memset(prop, 0, sizeof(prop));
   4462         property_get("persist.camera.no-display", prop, "0");
   4463         m_bNoDisplayMode = atoi(prop);
   4464     }
   4465     LOGH("Param m_bNoDisplayMode = %d", m_bNoDisplayMode);
   4466     return NO_ERROR;
   4467 }
   4468 
   4469 /*===========================================================================
   4470  * FUNCTION   : setZslMode
   4471  *
   4472  * DESCRIPTION: set ZSL mode from user setting
   4473  *
   4474  * PARAMETERS :
   4475  *   @params  : user setting parameters
   4476  *
   4477  * RETURN     : int32_t type of status
   4478  *              NO_ERROR  -- success
   4479  *              none-zero failure code
   4480  *==========================================================================*/
   4481 int32_t QCameraParameters::setZslMode(const QCameraParameters& params)
   4482 {
   4483     const char *str_val  = params.get(KEY_QC_ZSL);
   4484     const char *prev_val  = get(KEY_QC_ZSL);
   4485     int32_t rc = NO_ERROR;
   4486 
   4487     if(m_bForceZslMode) {
   4488         if (!m_bZslMode) {
   4489             // Force ZSL mode to ON
   4490             set(KEY_QC_ZSL, VALUE_ON);
   4491             setZslMode(TRUE);
   4492             LOGH("ZSL Mode forced to be enabled");
   4493         }
   4494     } else if (str_val != NULL) {
   4495         if (prev_val == NULL || strcmp(str_val, prev_val) != 0) {
   4496             int32_t value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP),
   4497                     str_val);
   4498             if (value != NAME_NOT_FOUND) {
   4499                 set(KEY_QC_ZSL, str_val);
   4500                 rc = setZslMode(value);
   4501                 // ZSL mode changed, need restart preview
   4502                 m_bNeedRestart = true;
   4503             } else {
   4504                 LOGE("Invalid ZSL mode value: %s", str_val);
   4505                 rc = BAD_VALUE;
   4506             }
   4507         }
   4508     }
   4509     return rc;
   4510 }
   4511 
   4512 /*===========================================================================
   4513  * FUNCTION   : setZslMode
   4514  *
   4515  * DESCRIPTION: set ZSL mode from user setting
   4516  *
   4517  * PARAMETERS :
   4518  *   @value  : ZSL mode value
   4519  *
   4520  * RETURN     : int32_t type of status
   4521  *              NO_ERROR  -- success
   4522  *              none-zero failure code
   4523  *==========================================================================*/
   4524 int32_t QCameraParameters::setZslMode(bool value)
   4525 {
   4526     int32_t rc = NO_ERROR;
   4527     if(m_bForceZslMode) {
   4528         if (!m_bZslMode) {
   4529             // Force ZSL mode to ON
   4530             set(KEY_QC_ZSL, VALUE_ON);
   4531             m_bZslMode_new = true;
   4532             m_bZslMode = true;
   4533             m_bNeedRestart = true;
   4534 
   4535             int32_t value = m_bForceZslMode;
   4536             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ZSL_MODE, value)) {
   4537                 rc = BAD_VALUE;
   4538             }
   4539 
   4540             LOGI("ZSL Mode forced to be enabled");
   4541         }
   4542     } else {
   4543         m_bZslMode_new = (value > 0)? true : false;
   4544         LOGI("ZSL Mode  -> %s", m_bZslMode_new ? "Enabled" : "Disabled");
   4545         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ZSL_MODE, value)) {
   4546             rc = BAD_VALUE;
   4547         }
   4548     }
   4549     LOGH("enabled: %d rc = %d", m_bZslMode_new, rc);
   4550     return rc;
   4551 }
   4552 
   4553 /*===========================================================================
   4554  * FUNCTION   : updateZSLModeValue
   4555  *
   4556  * DESCRIPTION: update zsl mode value locally and to daemon
   4557  *
   4558  * PARAMETERS :
   4559  *   @value   : zsl mode value
   4560  *
   4561  * RETURN     : int32_t type of status
   4562  *              NO_ERROR  -- success
   4563  *              none-zero failure code
   4564  *==========================================================================*/
   4565 int32_t QCameraParameters::updateZSLModeValue(bool value)
   4566 {
   4567     int32_t rc = NO_ERROR;
   4568     if(initBatchUpdate() < 0 ) {
   4569         LOGE("Failed to initialize group update table");
   4570         return BAD_TYPE;
   4571     }
   4572 
   4573     rc = setZslMode(value);
   4574     if (rc != NO_ERROR) {
   4575         LOGE("Failed to ZSL value");
   4576         return rc;
   4577     }
   4578 
   4579     rc = commitSetBatch();
   4580     if (rc != NO_ERROR) {
   4581         LOGE("Failed to update recording hint");
   4582         return rc;
   4583     }
   4584 
   4585     return rc;
   4586 }
   4587 
   4588 /*===========================================================================
   4589  * FUNCTION   : setWaveletDenoise
   4590  *
   4591  * DESCRIPTION: set wavelet denoise value from user setting
   4592  *
   4593  * PARAMETERS :
   4594  *   @params  : user setting parameters
   4595  *
   4596  * RETURN     : int32_t type of status
   4597  *              NO_ERROR  -- success
   4598  *              none-zero failure code
   4599  *==========================================================================*/
   4600 int32_t QCameraParameters::setWaveletDenoise(const QCameraParameters& params)
   4601 {
   4602     const char *str = params.get(KEY_QC_DENOISE);
   4603     const char *prev_str = get(KEY_QC_DENOISE);
   4604     if (str != NULL) {
   4605         if (prev_str == NULL ||
   4606             strcmp(str, prev_str) != 0) {
   4607             return setWaveletDenoise(str);
   4608         }
   4609     }
   4610     return NO_ERROR;
   4611 }
   4612 
   4613 /*===========================================================================
   4614  * FUNCTION   : setTemporalDenoise
   4615  *
   4616  * DESCRIPTION: set temporal denoise value from properties
   4617  *
   4618  * PARAMETERS : none
   4619  *
   4620  * RETURN     : int32_t type of status
   4621  *              NO_ERROR  -- success
   4622  *              none-zero failure code
   4623  *==========================================================================*/
   4624 int32_t QCameraParameters::setTemporalDenoise(const QCameraParameters& params)
   4625 {
   4626     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_CPP_TNR) == 0) {
   4627         LOGH("TNR is not supported");
   4628         return NO_ERROR;
   4629     }
   4630 
   4631     const char *str = params.get(KEY_QC_TNR_MODE);
   4632     const char *prev_str = get(KEY_QC_TNR_MODE);
   4633     const char *video_str = params.get(KEY_QC_VIDEO_TNR_MODE);
   4634     const char *video_prev_str = get(KEY_QC_VIDEO_TNR_MODE);
   4635     char video_value[PROPERTY_VALUE_MAX];
   4636     char preview_value[PROPERTY_VALUE_MAX];
   4637     bool prev_video_tnr = m_bTNRVideoOn;
   4638     bool prev_preview_tnr = m_bTNRPreviewOn;
   4639     bool prev_snap_tnr = m_bTNRSnapshotOn;
   4640 
   4641     char value[PROPERTY_VALUE_MAX];
   4642     memset(value, 0, sizeof(value));
   4643     property_get("persist.camera.tnr_cds", value, "0");
   4644     uint8_t tnr_cds = (uint8_t)atoi(value);
   4645 
   4646     if (m_bRecordingHint_new == true) {
   4647         if (video_str) {
   4648             if ((video_prev_str == NULL) || (strcmp(video_str, video_prev_str) != 0)) {
   4649                 if (!strcmp(video_str, VALUE_ON)) {
   4650                     m_bTNRVideoOn = true;
   4651                     m_bTNRPreviewOn = true;
   4652                 } else {
   4653                     m_bTNRVideoOn = false;
   4654                     m_bTNRPreviewOn = false;
   4655                 }
   4656                 updateParamEntry(KEY_QC_VIDEO_TNR_MODE, video_str);
   4657             } else {
   4658                 return NO_ERROR;
   4659             }
   4660         }
   4661     } else {
   4662         if (str) {
   4663             if ((prev_str == NULL) || (strcmp(str, prev_str) != 0)) {
   4664                 if (!strcmp(str, VALUE_ON)) {
   4665                     m_bTNRPreviewOn = true;
   4666                 } else {
   4667                     m_bTNRPreviewOn = false;
   4668                 }
   4669                 updateParamEntry(KEY_QC_TNR_MODE, str);
   4670             } else {
   4671                 return NO_ERROR;
   4672             }
   4673         }
   4674     }
   4675 
   4676     //Read setprops only if UI is not present or disabled.
   4677     if ((m_bRecordingHint_new == true)
   4678             && ((video_str == NULL)
   4679             || (strcmp(video_str, VALUE_ON)))) {
   4680         memset(video_value, 0, sizeof(video_value));
   4681         property_get("persist.camera.tnr.video", video_value, VALUE_OFF);
   4682         if (!strcmp(video_value, VALUE_ON)) {
   4683             m_bTNRVideoOn = true;
   4684         } else {
   4685             m_bTNRVideoOn = false;
   4686         }
   4687         updateParamEntry(KEY_QC_VIDEO_TNR_MODE, video_value);
   4688 
   4689         memset(preview_value, 0, sizeof(preview_value));
   4690         property_get("persist.camera.tnr.preview", preview_value, VALUE_OFF);
   4691         if (!strcmp(preview_value, VALUE_ON)) {
   4692             m_bTNRPreviewOn = true;
   4693         } else {
   4694             m_bTNRPreviewOn = false;
   4695         }
   4696         updateParamEntry(KEY_QC_TNR_MODE, preview_value);
   4697     } else if ((m_bRecordingHint_new != true)
   4698             && ((str == NULL) || (strcmp(str, VALUE_ON)))) {
   4699         memset(preview_value, 0, sizeof(preview_value));
   4700         property_get("persist.camera.tnr.preview", preview_value, VALUE_OFF);
   4701         if (!strcmp(preview_value, VALUE_ON)) {
   4702             m_bTNRPreviewOn = true;
   4703         } else {
   4704             m_bTNRPreviewOn = false;
   4705         }
   4706         updateParamEntry(KEY_QC_TNR_MODE, preview_value);
   4707     }
   4708 
   4709     memset(value, 0, sizeof(value));
   4710     property_get("persist.camera.tnr.snapshot", value, VALUE_OFF);
   4711     if (!strcmp(value, VALUE_ON)) {
   4712         m_bTNRSnapshotOn = true;
   4713         LOGD("TNR enabled for SNAPSHOT stream");
   4714     } else {
   4715         m_bTNRSnapshotOn = false;
   4716     }
   4717 
   4718     cam_denoise_param_t temp;
   4719     memset(&temp, 0, sizeof(temp));
   4720     if (m_bTNRVideoOn || m_bTNRPreviewOn || m_bTNRSnapshotOn) {
   4721         temp.denoise_enable = 1;
   4722         temp.process_plates = getDenoiseProcessPlate(
   4723                 CAM_INTF_PARM_TEMPORAL_DENOISE);
   4724 
   4725         if (!tnr_cds) {
   4726             int32_t cds_mode = lookupAttr(CDS_MODES_MAP,
   4727                     PARAM_MAP_SIZE(CDS_MODES_MAP), CDS_MODE_OFF);
   4728 
   4729             if (cds_mode != NAME_NOT_FOUND) {
   4730                 updateParamEntry(KEY_QC_VIDEO_CDS_MODE, CDS_MODE_OFF);
   4731                 if (m_bTNRPreviewOn) {
   4732                     updateParamEntry(KEY_QC_CDS_MODE, CDS_MODE_OFF);
   4733                 }
   4734                 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   4735                         CAM_INTF_PARM_CDS_MODE, cds_mode)) {
   4736                     LOGE("Failed CDS MODE to update table");
   4737                     return BAD_VALUE;
   4738                 }
   4739                 LOGD("CDS is set to = %s when TNR is enabled",
   4740                          CDS_MODE_OFF);
   4741                 mCds_mode = cds_mode;
   4742             } else {
   4743                 LOGE("Invalid argument for video CDS MODE %d",
   4744                          cds_mode);
   4745             }
   4746         } else {
   4747             LOGH("Enabled TNR with CDS");
   4748         }
   4749     }
   4750 
   4751     if ((m_bTNRVideoOn != prev_video_tnr)
   4752             || (m_bTNRPreviewOn != prev_preview_tnr)
   4753             || (prev_snap_tnr != m_bTNRSnapshotOn)) {
   4754         LOGD("TNR enabled = %d, plates = %d",
   4755                 temp.denoise_enable, temp.process_plates);
   4756         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   4757                 CAM_INTF_PARM_TEMPORAL_DENOISE, temp)) {
   4758             return BAD_VALUE;
   4759         }
   4760     }
   4761 
   4762     return NO_ERROR;
   4763 }
   4764 
   4765 /*===========================================================================
   4766  * FUNCTION   : setCameraMode
   4767  *
   4768  * DESCRIPTION: set camera mode from user setting
   4769  *
   4770  * PARAMETERS :
   4771  *   @params  : user setting parameters
   4772  *
   4773  * RETURN     : int32_t type of status
   4774  *              NO_ERROR  -- success
   4775  *              none-zero failure code
   4776  *==========================================================================*/
   4777 int32_t QCameraParameters::setCameraMode(const QCameraParameters& params)
   4778 {
   4779     const char *str = params.get(KEY_QC_CAMERA_MODE);
   4780     if (str != NULL) {
   4781         set(KEY_QC_CAMERA_MODE, str);
   4782     } else {
   4783         remove(KEY_QC_CAMERA_MODE);
   4784     }
   4785     return NO_ERROR;
   4786 }
   4787 
   4788 /*===========================================================================
   4789  * FUNCTION   : setSceneSelectionMode
   4790  *
   4791  * DESCRIPTION: set scene selection mode from user setting
   4792  *
   4793  * PARAMETERS :
   4794  *   @params  : user setting parameters
   4795  *
   4796  * RETURN     : int32_t type of status
   4797  *              NO_ERROR  -- success
   4798  *              none-zero failure code
   4799  *==========================================================================*/
   4800 int32_t QCameraParameters::setSceneSelectionMode(const QCameraParameters& params)
   4801 {
   4802     const char *str = params.get(KEY_QC_SCENE_SELECTION);
   4803     const char *prev_str = get(KEY_QC_SCENE_SELECTION);
   4804     if (NULL != str) {
   4805         if ((NULL == prev_str) || (strcmp(str, prev_str) != 0)) {
   4806             int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   4807                     PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), str);
   4808             if (value != NAME_NOT_FOUND) {
   4809                 LOGD("Setting selection value %s", str);
   4810                 if (value && m_bZslMode_new) {
   4811                     updateParamEntry(KEY_QC_SCENE_SELECTION, str);
   4812                     m_bNeedRestart = true;
   4813                     m_bSceneSelection = true;
   4814                 } else if (!value) {
   4815                     updateParamEntry(KEY_QC_SCENE_SELECTION, str);
   4816                     m_bNeedRestart = true;
   4817                     m_bSceneSelection = false;
   4818                 } else {
   4819                     LOGE("Trying to enable scene selection in non ZSL mode!!!");
   4820                     return BAD_VALUE;
   4821                 }
   4822             } else {
   4823                 LOGE("Trying to configure invalid scene selection value: %s",
   4824                         str);
   4825                 return BAD_VALUE;
   4826             }
   4827         }
   4828     }
   4829 
   4830     return NO_ERROR;
   4831 }
   4832 
   4833 /*===========================================================================
   4834  * FUNCTION   : setSelectedScene
   4835  *
   4836  * DESCRIPTION: select specific scene
   4837  *
   4838  * PARAMETERS :
   4839  *   @scene   : scene mode
   4840  *
   4841  * RETURN     : int32_t type of status
   4842  *              NO_ERROR  -- success
   4843  *              none-zero failure code
   4844  *==========================================================================*/
   4845 int32_t QCameraParameters::setSelectedScene(cam_scene_mode_type scene)
   4846 {
   4847     Mutex::Autolock l(m_SceneSelectLock);
   4848     m_SelectedScene = scene;
   4849     return NO_ERROR;
   4850 }
   4851 
   4852 /*===========================================================================
   4853  * FUNCTION   : getSelectedScene
   4854  *
   4855  * DESCRIPTION: get selected scene
   4856  *
   4857  * PARAMETERS :
   4858  *
   4859  * RETURN     : currently selected scene
   4860  *==========================================================================*/
   4861 cam_scene_mode_type QCameraParameters::getSelectedScene()
   4862 {
   4863     Mutex::Autolock l(m_SceneSelectLock);
   4864     return m_SelectedScene;
   4865 }
   4866 
   4867 /*==========================================================
   4868  * FUNCTION   : setRdiMode
   4869  *
   4870  * DESCRIPTION: set Rdi mode from user setting
   4871  *
   4872  * PARAMETERS :
   4873  *   @params  : user setting parameters
   4874  *
   4875  * RETURN     : int32_t type of status
   4876  *              NO_ERROR  -- success
   4877  *              none-zero failure code
   4878  *===========================================================*/
   4879 int32_t QCameraParameters::setRdiMode(const QCameraParameters& params)
   4880 {
   4881     const char *str = params.get(KEY_QC_RDI_MODE);
   4882     const char *prev_str = get(KEY_QC_RDI_MODE);
   4883     char prop[PROPERTY_VALUE_MAX];
   4884     memset(prop, 0, sizeof(prop));
   4885 
   4886     property_get("persist.camera.rdi.mode", prop, VALUE_DISABLE);
   4887     if ((str != NULL) && (prev_str == NULL || strcmp(str, prev_str) != 0)) {
   4888         LOGD("RDI mode set to %s", str);
   4889         setRdiMode(str);
   4890     } else if (prev_str == NULL || strcmp(prev_str, prop) != 0 ) {
   4891         LOGD("RDI mode set to prop: %s", prop);
   4892         setRdiMode(prop);
   4893     }
   4894     return NO_ERROR;
   4895 }
   4896 
   4897 /*==========================================================
   4898  * FUNCTION   : setSecureMode
   4899  *
   4900  * DESCRIPTION: set secure mode from user setting
   4901  *
   4902  * PARAMETERS :
   4903  *   @params  : user setting parameters
   4904  *
   4905  * RETURN     : int32_t type of status
   4906  *              NO_ERROR  -- success
   4907  *              none-zero failure code
   4908  *===========================================================*/
   4909 
   4910 int32_t QCameraParameters::setSecureMode(const QCameraParameters& params)
   4911 {
   4912     const char *str = params.get(KEY_QC_SECURE_MODE);
   4913     const char *prev_str = get(KEY_QC_SECURE_MODE);
   4914     char prop[PROPERTY_VALUE_MAX];
   4915     memset(prop, 0, sizeof(prop));
   4916 
   4917     property_get("persist.camera.secure.mode", prop, VALUE_DISABLE);
   4918     if ((str != NULL) && (prev_str == NULL || strcmp(str, prev_str) != 0)) {
   4919         LOGD("Secure mode set to KEY: %s", str);
   4920         setSecureMode(str);
   4921         updateParamEntry(KEY_QC_SECURE_MODE, str);
   4922     } else if (prev_str == NULL || strcmp(prev_str, prop) != 0 ) {
   4923         LOGD("Secure mode set to prop: %s", prop);
   4924         setSecureMode(prop);
   4925     }
   4926 
   4927     if (isSecureMode() && (m_bZslMode || m_bZslMode_new)) {
   4928         //Enable NZSl if secure mode
   4929         setZslMode(FALSE);
   4930         m_bNeedRestart = true;
   4931     }
   4932 
   4933     if (get_cam_type(m_pCapability->camera_index) & CAM_TYPE_SECURE) {
   4934         LOGD("Secure steam type is CAM_STREAM_TYPE_RAW");
   4935         mSecureStraemType = CAM_STREAM_TYPE_RAW;
   4936     } else {
   4937         LOGD("Secure steam type is CAM_STREAM_TYPE_PREVIEW");
   4938         mSecureStraemType = CAM_STREAM_TYPE_PREVIEW;
   4939     }
   4940 
   4941     return NO_ERROR;
   4942 }
   4943 
   4944 /*===========================================================================
   4945  * FUNCTION   : setZslAttributes
   4946  *
   4947  * DESCRIPTION: set ZSL related attributes from user setting
   4948  *
   4949  * PARAMETERS :
   4950  *   @params  : user setting parameters
   4951  *
   4952  * RETURN     : int32_t type of status
   4953  *              NO_ERROR  -- success
   4954  *              none-zero failure code
   4955  *==========================================================================*/
   4956 int32_t QCameraParameters::setZslAttributes(const QCameraParameters& params)
   4957 {
   4958     // TODO: may switch to pure param instead of sysprop
   4959     char prop[PROPERTY_VALUE_MAX];
   4960 
   4961     const char *str = params.get(KEY_QC_ZSL_BURST_INTERVAL);
   4962     if (str != NULL) {
   4963         set(KEY_QC_ZSL_BURST_INTERVAL, str);
   4964     } else {
   4965         memset(prop, 0, sizeof(prop));
   4966         property_get("persist.camera.zsl.interval", prop, "1");
   4967         set(KEY_QC_ZSL_BURST_INTERVAL, prop);
   4968         LOGH("burst interval: %s", prop);
   4969     }
   4970 
   4971     str = params.get(KEY_QC_ZSL_BURST_LOOKBACK);
   4972     if (str != NULL) {
   4973         set(KEY_QC_ZSL_BURST_LOOKBACK, str);
   4974     } else {
   4975         memset(prop, 0, sizeof(prop));
   4976         property_get("persist.camera.zsl.backlookcnt", prop, "2");
   4977         uint32_t look_back_cnt = atoi(prop);
   4978         if (m_bFrameSyncEnabled) {
   4979             look_back_cnt += EXTRA_FRAME_SYNC_BUFFERS;
   4980         }
   4981         set(KEY_QC_ZSL_BURST_LOOKBACK, look_back_cnt);
   4982         LOGH("look back count: %s", prop);
   4983     }
   4984 
   4985     str = params.get(KEY_QC_ZSL_QUEUE_DEPTH);
   4986     if (str != NULL) {
   4987         set(KEY_QC_ZSL_QUEUE_DEPTH, str);
   4988     } else {
   4989         memset(prop, 0, sizeof(prop));
   4990         property_get("persist.camera.zsl.queuedepth", prop, "2");
   4991         uint32_t queue_depth = atoi(prop);
   4992         if (m_bFrameSyncEnabled) {
   4993             queue_depth += EXTRA_FRAME_SYNC_BUFFERS;
   4994         }
   4995         set(KEY_QC_ZSL_QUEUE_DEPTH, queue_depth);
   4996         LOGH("queue depth: %s", prop);
   4997     }
   4998 
   4999     return NO_ERROR;
   5000 }
   5001 
   5002 /*===========================================================================
   5003  * FUNCTION   : setFlip
   5004  *
   5005  * DESCRIPTION: set preview/ video/ picture flip mode from user setting
   5006  *
   5007  * PARAMETERS :
   5008  *   @params  : user setting parameters
   5009  *
   5010  * RETURN     : int32_t type of status
   5011  *              NO_ERROR  -- success
   5012  *              none-zero failure code
   5013  *==========================================================================*/
   5014 int32_t QCameraParameters::setFlip(const QCameraParameters& params)
   5015 {
   5016     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_FLIP) == 0) {
   5017         LOGH("flip is not supported.");
   5018         return NO_ERROR;
   5019     }
   5020 
   5021     //check preview flip setting
   5022     const char *str = params.get(KEY_QC_PREVIEW_FLIP);
   5023     const char *prev_val = get(KEY_QC_PREVIEW_FLIP);
   5024     if(str != NULL){
   5025         if (prev_val == NULL || strcmp(str, prev_val) != 0) {
   5026             int32_t value = lookupAttr(FLIP_MODES_MAP, PARAM_MAP_SIZE(FLIP_MODES_MAP), str);
   5027             if(value != NAME_NOT_FOUND){
   5028                 set(KEY_QC_PREVIEW_FLIP, str);
   5029                 m_bPreviewFlipChanged = true;
   5030             }
   5031         }
   5032     }
   5033 
   5034     // check video filp setting
   5035     str = params.get(KEY_QC_VIDEO_FLIP);
   5036     prev_val = get(KEY_QC_VIDEO_FLIP);
   5037     if(str != NULL){
   5038         if (prev_val == NULL || strcmp(str, prev_val) != 0) {
   5039             int32_t value = lookupAttr(FLIP_MODES_MAP, PARAM_MAP_SIZE(FLIP_MODES_MAP), str);
   5040             if(value != NAME_NOT_FOUND){
   5041                 set(KEY_QC_VIDEO_FLIP, str);
   5042                 m_bVideoFlipChanged = true;
   5043             }
   5044         }
   5045     }
   5046 
   5047     // check picture filp setting
   5048     str = params.get(KEY_QC_SNAPSHOT_PICTURE_FLIP);
   5049     prev_val = get(KEY_QC_SNAPSHOT_PICTURE_FLIP);
   5050     if(str != NULL){
   5051         if (prev_val == NULL || strcmp(str, prev_val) != 0) {
   5052             int32_t value = lookupAttr(FLIP_MODES_MAP, PARAM_MAP_SIZE(FLIP_MODES_MAP), str);
   5053             if(value != NAME_NOT_FOUND){
   5054                 set(KEY_QC_SNAPSHOT_PICTURE_FLIP, str);
   5055                 m_bSnapshotFlipChanged = true;
   5056             }
   5057         }
   5058     }
   5059 
   5060     return NO_ERROR;
   5061 }
   5062 
   5063 /*===========================================================================
   5064  * FUNCTION   : setSnapshotFDReq
   5065  *
   5066  * DESCRIPTION: set requirement of Face Detection Metadata in Snapshot mode.
   5067  *
   5068  * PARAMETERS :
   5069  *   @params  : user setting parameters
   5070  *
   5071  * RETURN     : int32_t type of status
   5072  *              NO_ERROR  -- success
   5073  *              none-zero failure code
   5074  *==========================================================================*/
   5075 int32_t QCameraParameters::setSnapshotFDReq(const QCameraParameters& params)
   5076 {
   5077     char prop[PROPERTY_VALUE_MAX];
   5078     const char *str = params.get(KEY_QC_SNAPSHOT_FD_DATA);
   5079 
   5080     if(str != NULL){
   5081         set(KEY_QC_SNAPSHOT_FD_DATA, str);
   5082     }else{
   5083         memset(prop, 0, sizeof(prop));
   5084         property_get("persist.camera.snapshot.fd", prop, "0");
   5085         set(KEY_QC_SNAPSHOT_FD_DATA, prop);
   5086     }
   5087     return NO_ERROR;
   5088 }
   5089 
   5090 /*===========================================================================
   5091  * FUNCTION   : setMobicat
   5092  *
   5093  * DESCRIPTION: set Mobicat on/off.
   5094  *
   5095  * PARAMETERS :
   5096  *   @params  : user setting parameters
   5097  *
   5098  * RETURN     : int32_t type of status
   5099  *              NO_ERROR  -- success
   5100  *              none-zero failure code
   5101  *==========================================================================*/
   5102 int32_t QCameraParameters::setMobicat(const QCameraParameters& )
   5103 {
   5104     char value [PROPERTY_VALUE_MAX];
   5105     property_get("persist.camera.mobicat", value, "0");
   5106     int32_t ret = NO_ERROR;
   5107     uint8_t enableMobi = (uint8_t)atoi(value);
   5108 
   5109     if (enableMobi) {
   5110         tune_cmd_t tune_cmd;
   5111         tune_cmd.type = 2;
   5112         tune_cmd.module = 0;
   5113         tune_cmd.value = 1;
   5114         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SET_VFE_COMMAND, tune_cmd)) {
   5115             return BAD_VALUE;
   5116         }
   5117         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SET_PP_COMMAND, tune_cmd)) {
   5118             ret = BAD_VALUE;
   5119         }
   5120     }
   5121     m_MobiMask = enableMobi;
   5122 
   5123     return ret;
   5124 }
   5125 
   5126 /*===========================================================================
   5127  * FUNCTION   : setLongshotParam
   5128  *
   5129  * DESCRIPTION: set Longshot on/off.
   5130  *
   5131  * PARAMETERS :
   5132  *   @params  : user setting parameters
   5133  *
   5134  * RETURN     : int32_t type of status
   5135  *              NO_ERROR  -- success
   5136  *              none-zero failure code
   5137  *==========================================================================*/
   5138 int32_t QCameraParameters::setLongshotParam(const QCameraParameters& params)
   5139 {
   5140     const char *str = params.get(KEY_QC_LONG_SHOT);
   5141     const char *prev_str = get(KEY_QC_LONG_SHOT);
   5142 
   5143     if (str != NULL) {
   5144         if (prev_str == NULL || strcmp(str, prev_str) != 0) {
   5145             set(KEY_QC_LONG_SHOT, str);
   5146             if (prev_str && !strcmp(str, "off") && !strcmp(prev_str, "on")) {
   5147                 // We restart here, to reset the FPS and no
   5148                 // of buffers as per the requirement of single snapshot usecase.
   5149                 // Here restart happens when continuous shot is changed to off from on.
   5150                 // In case of continuous shot on, restart is taken care when actual
   5151                 // longshot command is triggered through sendCommand.
   5152                 m_bNeedRestart = true;
   5153             }
   5154         }
   5155     }
   5156 
   5157     return NO_ERROR;
   5158 }
   5159 
   5160 /*===========================================================================
   5161  * FUNCTION   : checkFeatureConcurrency
   5162  *
   5163  * DESCRIPTION: check if there is a feature concurrency issue with advanced
   5164  *              camera features
   5165  *
   5166  * PARAMETERS : None
   5167  *
   5168  * RETURN     : int32_t type of status
   5169  *              NO_ERROR  -- success
   5170  *              none-zero failure code
   5171  *==========================================================================*/
   5172 int32_t QCameraParameters::checkFeatureConcurrency()
   5173 {
   5174     int32_t rc = NO_ERROR;
   5175     uint32_t advancedFeatEnableBit = 0;
   5176 
   5177     if (isStillMoreEnabled()) {
   5178         advancedFeatEnableBit |= CAM_QCOM_FEATURE_STILLMORE;
   5179     }
   5180     if (isHDREnabled()) {
   5181         advancedFeatEnableBit |= CAM_QCOM_FEATURE_HDR;
   5182     }
   5183     if (isChromaFlashEnabled()) {
   5184         advancedFeatEnableBit |= CAM_QCOM_FEATURE_CHROMA_FLASH;
   5185     }
   5186     if (isUbiFocusEnabled()) {
   5187         advancedFeatEnableBit |= CAM_QCOM_FEATURE_UBIFOCUS;
   5188     }
   5189     if (isTruePortraitEnabled()) {
   5190         advancedFeatEnableBit |= CAM_QCOM_FEATURE_TRUEPORTRAIT;
   5191     }
   5192     if (isOptiZoomEnabled()) {
   5193         advancedFeatEnableBit |= CAM_QCOM_FEATURE_OPTIZOOM;
   5194     }
   5195     if (isUbiRefocus()) {
   5196         advancedFeatEnableBit |= CAM_QCOM_FEATURE_REFOCUS;
   5197     }
   5198 
   5199    if (m_bLongshotEnabled && advancedFeatEnableBit) {
   5200         LOGE("Failed Longshot mode bit 0x%x",
   5201                     advancedFeatEnableBit);
   5202         rc = BAD_TYPE;
   5203         return rc;
   5204     }
   5205 
   5206     if(m_bRecordingHint_new) {
   5207         advancedFeatEnableBit &= ~CAM_QCOM_FEATURE_STILLMORE;
   5208 
   5209         if (advancedFeatEnableBit) {
   5210             LOGE("Failed recording mode bit 0x%x",
   5211                     advancedFeatEnableBit);
   5212             rc = BAD_TYPE;
   5213         }
   5214     } else if (m_bZslMode_new) {
   5215         /* ZSL mode check if 2 bits are set */
   5216         if (advancedFeatEnableBit & (advancedFeatEnableBit - 1)) {
   5217             LOGE("Failed ZSL mode bit 0x%x", advancedFeatEnableBit);
   5218             rc = BAD_TYPE;
   5219         }
   5220     } else { /* non-ZSL mode */
   5221         advancedFeatEnableBit &= ~CAM_QCOM_FEATURE_HDR;
   5222 
   5223         /* non-ZSL mode check if 1 bit is set */
   5224         if (advancedFeatEnableBit) {
   5225             LOGE("Failed non-ZSL mode bit 0x%x", advancedFeatEnableBit);
   5226             rc = BAD_TYPE;
   5227         }
   5228     }
   5229     LOGI("Advance feature enabled 0x%x", advancedFeatEnableBit);
   5230     return rc;
   5231 }
   5232 
   5233 /*===========================================================================
   5234  * FUNCTION   : updateParameters
   5235  *
   5236  * DESCRIPTION: update parameters from user setting
   5237  *
   5238  * PARAMETERS :
   5239  *   @params  : user setting parameters
   5240  *   @needRestart : [output] if preview need restart upon setting changes
   5241  *
   5242  * RETURN     : int32_t type of status
   5243  *              NO_ERROR  -- success
   5244  *              none-zero failure code
   5245  *==========================================================================*/
   5246 int32_t QCameraParameters::updateParameters(const String8& p,
   5247         bool &needRestart)
   5248 {
   5249     int32_t final_rc = NO_ERROR;
   5250     int32_t rc;
   5251     m_bNeedRestart = false;
   5252     QCameraParameters params(p);
   5253 
   5254     if(initBatchUpdate() < 0 ) {
   5255         LOGE("Failed to initialize group update table");
   5256         rc = BAD_TYPE;
   5257         goto UPDATE_PARAM_DONE;
   5258     }
   5259 
   5260     if ((rc = setPreviewSize(params)))                  final_rc = rc;
   5261     if ((rc = setVideoSize(params)))                    final_rc = rc;
   5262     if ((rc = setPictureSize(params)))                  final_rc = rc;
   5263     if ((rc = setPreviewFormat(params)))                final_rc = rc;
   5264     if ((rc = setPictureFormat(params)))                final_rc = rc;
   5265     if ((rc = setJpegQuality(params)))                  final_rc = rc;
   5266     if ((rc = setOrientation(params)))                  final_rc = rc;
   5267     if ((rc = setRotation(params)))                     final_rc = rc;
   5268     if ((rc = setVideoRotation(params)))                final_rc = rc;
   5269     if ((rc = setNoDisplayMode(params)))                final_rc = rc;
   5270     if ((rc = setZslMode(params)))                      final_rc = rc;
   5271     if ((rc = setZslAttributes(params)))                final_rc = rc;
   5272     if ((rc = setCameraMode(params)))                   final_rc = rc;
   5273     if ((rc = setSceneSelectionMode(params)))           final_rc = rc;
   5274     if ((rc = setRecordingHint(params)))                final_rc = rc;
   5275     if ((rc = setRdiMode(params)))                      final_rc = rc;
   5276     if ((rc = setSecureMode(params)))                   final_rc = rc;
   5277     if ((rc = setPreviewFrameRate(params)))             final_rc = rc;
   5278     if ((rc = setPreviewFpsRange(params)))              final_rc = rc;
   5279     if ((rc = setAutoExposure(params)))                 final_rc = rc;
   5280     if ((rc = setEffect(params)))                       final_rc = rc;
   5281     if ((rc = setBrightness(params)))                   final_rc = rc;
   5282     if ((rc = setZoom(params)))                         final_rc = rc;
   5283     if ((rc = setSharpness(params)))                    final_rc = rc;
   5284     if ((rc = setSaturation(params)))                   final_rc = rc;
   5285     if ((rc = setContrast(params)))                     final_rc = rc;
   5286     if ((rc = setFocusMode(params)))                    final_rc = rc;
   5287     if ((rc = setISOValue(params)))                     final_rc = rc;
   5288     if ((rc = setContinuousISO(params)))                final_rc = rc;
   5289     if ((rc = setExposureTime(params)))                 final_rc = rc;
   5290     if ((rc = setSkinToneEnhancement(params)))          final_rc = rc;
   5291     if ((rc = setFlash(params)))                        final_rc = rc;
   5292     if ((rc = setAecLock(params)))                      final_rc = rc;
   5293     if ((rc = setAwbLock(params)))                      final_rc = rc;
   5294     if ((rc = setLensShadeValue(params)))               final_rc = rc;
   5295     if ((rc = setMCEValue(params)))                     final_rc = rc;
   5296     if ((rc = setDISValue(params)))                     final_rc = rc;
   5297     if ((rc = setAntibanding(params)))                  final_rc = rc;
   5298     if ((rc = setExposureCompensation(params)))         final_rc = rc;
   5299     if ((rc = setWhiteBalance(params)))                 final_rc = rc;
   5300     if ((rc = setHDRMode(params)))                      final_rc = rc;
   5301     if ((rc = setHDRNeed1x(params)))                    final_rc = rc;
   5302     if ((rc = setManualWhiteBalance(params)))           final_rc = rc;
   5303     if ((rc = setSceneMode(params)))                    final_rc = rc;
   5304     if ((rc = setFocusAreas(params)))                   final_rc = rc;
   5305     if ((rc = setFocusPosition(params)))                final_rc = rc;
   5306     if ((rc = setMeteringAreas(params)))                final_rc = rc;
   5307     if ((rc = setSelectableZoneAf(params)))             final_rc = rc;
   5308     if ((rc = setRedeyeReduction(params)))              final_rc = rc;
   5309     if ((rc = setAEBracket(params)))                    final_rc = rc;
   5310     if ((rc = setAutoHDR(params)))                      final_rc = rc;
   5311     if ((rc = setGpsLocation(params)))                  final_rc = rc;
   5312     if ((rc = setWaveletDenoise(params)))               final_rc = rc;
   5313     if ((rc = setFaceRecognition(params)))              final_rc = rc;
   5314     if ((rc = setFlip(params)))                         final_rc = rc;
   5315     if ((rc = setVideoHDR(params)))                     final_rc = rc;
   5316     if ((rc = setVtEnable(params)))                     final_rc = rc;
   5317     if ((rc = setAFBracket(params)))                    final_rc = rc;
   5318     if ((rc = setReFocus(params)))                      final_rc = rc;
   5319     if ((rc = setChromaFlash(params)))                  final_rc = rc;
   5320     if ((rc = setTruePortrait(params)))                 final_rc = rc;
   5321     if ((rc = setOptiZoom(params)))                     final_rc = rc;
   5322     if ((rc = setBurstLEDOnPeriod(params)))             final_rc = rc;
   5323     if ((rc = setRetroActiveBurstNum(params)))          final_rc = rc;
   5324     if ((rc = setSnapshotFDReq(params)))                final_rc = rc;
   5325     if ((rc = setTintlessValue(params)))                final_rc = rc;
   5326     if ((rc = setCDSMode(params)))                      final_rc = rc;
   5327     if ((rc = setTemporalDenoise(params)))              final_rc = rc;
   5328     if ((rc = setCacheVideoBuffers(params)))            final_rc = rc;
   5329     if ((rc = setInitialExposureIndex(params)))         final_rc = rc;
   5330     if ((rc = setInstantCapture(params)))               final_rc = rc;
   5331     if ((rc = setInstantAEC(params)))                   final_rc = rc;
   5332 
   5333     // update live snapshot size after all other parameters are set
   5334     if ((rc = setLiveSnapshotSize(params)))             final_rc = rc;
   5335     if ((rc = setJpegThumbnailSize(params)))            final_rc = rc;
   5336     if ((rc = setStatsDebugMask()))                     final_rc = rc;
   5337     if ((rc = setPAAF()))                               final_rc = rc;
   5338     if ((rc = setMobicat(params)))                      final_rc = rc;
   5339     if ((rc = setSeeMore(params)))                      final_rc = rc;
   5340     if ((rc = setStillMore(params)))                    final_rc = rc;
   5341     if ((rc = setCustomParams(params)))                 final_rc = rc;
   5342     if ((rc = setNoiseReductionMode(params)))           final_rc = rc;
   5343 
   5344     if ((rc = setLongshotParam(params)))                final_rc = rc;
   5345     if ((rc = setDualLedCalibration(params)))           final_rc = rc;
   5346 
   5347     setQuadraCfa(params);
   5348     setVideoBatchSize();
   5349     setLowLightCapture();
   5350     setAsymmetricSnapMode();
   5351 
   5352     if ((rc = updateFlash(false)))                      final_rc = rc;
   5353 #ifdef TARGET_TS_MAKEUP
   5354     if ((rc = setTsMakeup(params)))                     final_rc = rc;
   5355 #endif
   5356     if ((rc = setAdvancedCaptureMode()))                final_rc = rc;
   5357 UPDATE_PARAM_DONE:
   5358     needRestart = m_bNeedRestart;
   5359     return final_rc;
   5360 }
   5361 
   5362 /*===========================================================================
   5363  * FUNCTION   : commitParameters
   5364  *
   5365  * DESCRIPTION: commit parameter changes to backend
   5366  *
   5367  * PARAMETERS : none
   5368  *
   5369  * RETURN     : int32_t type of status
   5370  *              NO_ERROR  -- success
   5371  *              none-zero failure code
   5372  *==========================================================================*/
   5373 int32_t QCameraParameters::commitParameters()
   5374 {
   5375     return commitSetBatch();
   5376 }
   5377 
   5378 /*===========================================================================
   5379  * FUNCTION   : initDefaultParameters
   5380  *
   5381  * DESCRIPTION: initialize default parameters for the first time
   5382  *
   5383  * PARAMETERS : none
   5384  *
   5385  * RETURN     : int32_t type of status
   5386  *              NO_ERROR  -- success
   5387  *              none-zero failure code
   5388  *==========================================================================*/
   5389 int32_t QCameraParameters::initDefaultParameters()
   5390 {
   5391     if(initBatchUpdate() < 0 ) {
   5392         LOGE("Failed to initialize group update table");
   5393         return BAD_TYPE;
   5394     }
   5395     int32_t hal_version = CAM_HAL_V1;
   5396     ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HAL_VERSION, hal_version);
   5397 
   5398     /*************************Initialize Values******************************/
   5399     // Set read only parameters from camera capability
   5400     set(KEY_SMOOTH_ZOOM_SUPPORTED,
   5401         m_pCapability->smooth_zoom_supported? VALUE_TRUE : VALUE_FALSE);
   5402     set(KEY_ZOOM_SUPPORTED,
   5403         m_pCapability->zoom_supported? VALUE_TRUE : VALUE_FALSE);
   5404     set(KEY_VIDEO_SNAPSHOT_SUPPORTED,
   5405         m_pCapability->video_snapshot_supported? VALUE_TRUE : VALUE_FALSE);
   5406     set(KEY_VIDEO_STABILIZATION_SUPPORTED,
   5407         m_pCapability->video_stablization_supported? VALUE_TRUE : VALUE_FALSE);
   5408     set(KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
   5409         m_pCapability->auto_exposure_lock_supported? VALUE_TRUE : VALUE_FALSE);
   5410     set(KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
   5411         m_pCapability->auto_wb_lock_supported? VALUE_TRUE : VALUE_FALSE);
   5412     set(KEY_MAX_NUM_DETECTED_FACES_HW, m_pCapability->max_num_roi);
   5413     set(KEY_MAX_NUM_DETECTED_FACES_SW, m_pCapability->max_num_roi);
   5414     set(KEY_QC_MAX_NUM_REQUESTED_FACES, m_pCapability->max_num_roi);
   5415     // Set focal length, horizontal view angle, and vertical view angle
   5416     setFloat(KEY_FOCAL_LENGTH, m_pCapability->focal_length);
   5417     setFloat(KEY_HORIZONTAL_VIEW_ANGLE, m_pCapability->hor_view_angle);
   5418     setFloat(KEY_VERTICAL_VIEW_ANGLE, m_pCapability->ver_view_angle);
   5419     set(QCameraParameters::KEY_FOCUS_DISTANCES, "Infinity,Infinity,Infinity");
   5420     set(KEY_QC_AUTO_HDR_SUPPORTED,
   5421         (m_pCapability->auto_hdr_supported)? VALUE_TRUE : VALUE_FALSE);
   5422     // Set supported preview sizes
   5423     if (m_pCapability->preview_sizes_tbl_cnt > 0 &&
   5424         m_pCapability->preview_sizes_tbl_cnt <= MAX_SIZES_CNT) {
   5425         String8 previewSizeValues = createSizesString(
   5426                 m_pCapability->preview_sizes_tbl, m_pCapability->preview_sizes_tbl_cnt);
   5427         set(KEY_SUPPORTED_PREVIEW_SIZES, previewSizeValues.string());
   5428         LOGH("supported preview sizes: %s", previewSizeValues.string());
   5429         // Set default preview size
   5430         CameraParameters::setPreviewSize(m_pCapability->preview_sizes_tbl[0].width,
   5431                                          m_pCapability->preview_sizes_tbl[0].height);
   5432     } else {
   5433         LOGW("supported preview sizes cnt is 0 or exceeds max!!!");
   5434     }
   5435 
   5436     // Set supported video sizes
   5437     if (m_pCapability->video_sizes_tbl_cnt > 0 &&
   5438         m_pCapability->video_sizes_tbl_cnt <= MAX_SIZES_CNT) {
   5439         String8 videoSizeValues = createSizesString(
   5440                 m_pCapability->video_sizes_tbl, m_pCapability->video_sizes_tbl_cnt);
   5441         set(KEY_SUPPORTED_VIDEO_SIZES, videoSizeValues.string());
   5442         LOGH("supported video sizes: %s", videoSizeValues.string());
   5443         // Set default video size
   5444         CameraParameters::setVideoSize(m_pCapability->video_sizes_tbl[0].width,
   5445                                        m_pCapability->video_sizes_tbl[0].height);
   5446 
   5447         //Set preferred Preview size for video
   5448         String8 vSize = createSizesString(&m_pCapability->preview_sizes_tbl[0], 1);
   5449         set(KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, vSize.string());
   5450     } else {
   5451         LOGW("supported video sizes cnt is 0 or exceeds max!!!");
   5452     }
   5453 
   5454     // Set supported picture sizes
   5455     if (m_pCapability->picture_sizes_tbl_cnt > 0 &&
   5456         m_pCapability->picture_sizes_tbl_cnt <= MAX_SIZES_CNT) {
   5457         String8 pictureSizeValues = createSizesString(
   5458                 m_pCapability->picture_sizes_tbl, m_pCapability->picture_sizes_tbl_cnt);
   5459         set(KEY_SUPPORTED_PICTURE_SIZES, pictureSizeValues.string());
   5460         LOGH("supported pic sizes: %s", pictureSizeValues.string());
   5461         // Set default picture size to the smallest resolution
   5462         CameraParameters::setPictureSize(
   5463            m_pCapability->picture_sizes_tbl[m_pCapability->picture_sizes_tbl_cnt-1].width,
   5464            m_pCapability->picture_sizes_tbl[m_pCapability->picture_sizes_tbl_cnt-1].height);
   5465     } else {
   5466         LOGW("supported picture sizes cnt is 0 or exceeds max!!!");
   5467     }
   5468 
   5469     // Need check if scale should be enabled
   5470     if (m_pCapability->scale_picture_sizes_cnt > 0 &&
   5471         m_pCapability->scale_picture_sizes_cnt <= MAX_SCALE_SIZES_CNT){
   5472         //get scale size, enable scaling. And re-set picture size table with scale sizes
   5473         m_reprocScaleParam.setScaleEnable(true);
   5474         int rc_s = m_reprocScaleParam.setScaleSizeTbl(
   5475             m_pCapability->scale_picture_sizes_cnt, m_pCapability->scale_picture_sizes,
   5476             m_pCapability->picture_sizes_tbl_cnt, m_pCapability->picture_sizes_tbl);
   5477         if(rc_s == NO_ERROR){
   5478             cam_dimension_t *totalSizeTbl = m_reprocScaleParam.getTotalSizeTbl();
   5479             size_t totalSizeCnt = m_reprocScaleParam.getTotalSizeTblCnt();
   5480             String8 pictureSizeValues = createSizesString(totalSizeTbl, totalSizeCnt);
   5481             set(KEY_SUPPORTED_PICTURE_SIZES, pictureSizeValues.string());
   5482             LOGH("scaled supported pic sizes: %s", pictureSizeValues.string());
   5483         }else{
   5484             m_reprocScaleParam.setScaleEnable(false);
   5485             LOGW("reset scaled picture size table failed.");
   5486         }
   5487     }else{
   5488         m_reprocScaleParam.setScaleEnable(false);
   5489     }
   5490 
   5491     // Set supported thumbnail sizes
   5492     String8 thumbnailSizeValues = createSizesString(
   5493             THUMBNAIL_SIZES_MAP,
   5494             PARAM_MAP_SIZE(THUMBNAIL_SIZES_MAP));
   5495     set(KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, thumbnailSizeValues.string());
   5496     // Set default thumnail size
   5497     set(KEY_JPEG_THUMBNAIL_WIDTH, THUMBNAIL_SIZES_MAP[0].width);
   5498     set(KEY_JPEG_THUMBNAIL_HEIGHT, THUMBNAIL_SIZES_MAP[0].height);
   5499 
   5500     // Set supported livesnapshot sizes
   5501     if (m_pCapability->livesnapshot_sizes_tbl_cnt > 0 &&
   5502         m_pCapability->livesnapshot_sizes_tbl_cnt <= MAX_SIZES_CNT) {
   5503         String8 liveSnpashotSizeValues = createSizesString(
   5504                 m_pCapability->livesnapshot_sizes_tbl,
   5505                 m_pCapability->livesnapshot_sizes_tbl_cnt);
   5506         set(KEY_QC_SUPPORTED_LIVESNAPSHOT_SIZES, liveSnpashotSizeValues.string());
   5507         LOGD("supported live snapshot sizes: %s", liveSnpashotSizeValues.string());
   5508         m_LiveSnapshotSize =
   5509             m_pCapability->livesnapshot_sizes_tbl[m_pCapability->livesnapshot_sizes_tbl_cnt-1];
   5510     }
   5511 
   5512     // Set supported preview formats
   5513     String8 previewFormatValues = createValuesString(
   5514             m_pCapability->supported_preview_fmts,
   5515             m_pCapability->supported_preview_fmt_cnt,
   5516             PREVIEW_FORMATS_MAP,
   5517             PARAM_MAP_SIZE(PREVIEW_FORMATS_MAP));
   5518     set(KEY_SUPPORTED_PREVIEW_FORMATS, previewFormatValues.string());
   5519     // Set default preview format
   5520     CameraParameters::setPreviewFormat(PIXEL_FORMAT_YUV420SP);
   5521 
   5522     // Set default Video Format as OPAQUE
   5523     // Internally both Video and Camera subsystems use NV21_VENUS
   5524     set(KEY_VIDEO_FRAME_FORMAT, PIXEL_FORMAT_ANDROID_OPAQUE);
   5525 
   5526     // Set supported picture formats
   5527     String8 pictureTypeValues(PIXEL_FORMAT_JPEG);
   5528     String8 str = createValuesString(
   5529             m_pCapability->supported_raw_fmts,
   5530             m_pCapability->supported_raw_fmt_cnt,
   5531             PICTURE_TYPES_MAP,
   5532             PARAM_MAP_SIZE(PICTURE_TYPES_MAP));
   5533     if (str.string() != NULL) {
   5534         pictureTypeValues.append(",");
   5535         pictureTypeValues.append(str);
   5536     }
   5537 
   5538     set(KEY_SUPPORTED_PICTURE_FORMATS, pictureTypeValues.string());
   5539     // Set default picture Format
   5540     CameraParameters::setPictureFormat(PIXEL_FORMAT_JPEG);
   5541     // Set raw image size
   5542     char raw_size_str[32];
   5543     snprintf(raw_size_str, sizeof(raw_size_str), "%dx%d",
   5544              m_pCapability->raw_dim[0].width, m_pCapability->raw_dim[0].height);
   5545     set(KEY_QC_RAW_PICUTRE_SIZE, raw_size_str);
   5546     LOGD("KEY_QC_RAW_PICUTRE_SIZE: w: %d, h: %d ",
   5547        m_pCapability->raw_dim[0].width, m_pCapability->raw_dim[0].height);
   5548 
   5549     //set default jpeg quality and thumbnail quality
   5550     set(KEY_JPEG_QUALITY, 85);
   5551     set(KEY_JPEG_THUMBNAIL_QUALITY, 85);
   5552 
   5553     // Set FPS ranges
   5554     if (m_pCapability->fps_ranges_tbl_cnt > 0 &&
   5555         m_pCapability->fps_ranges_tbl_cnt <= MAX_SIZES_CNT) {
   5556         int default_fps_index = 0;
   5557         String8 fpsRangeValues = createFpsRangeString(m_pCapability->fps_ranges_tbl,
   5558                                                       m_pCapability->fps_ranges_tbl_cnt,
   5559                                                       default_fps_index);
   5560         set(KEY_SUPPORTED_PREVIEW_FPS_RANGE, fpsRangeValues.string());
   5561 
   5562         int min_fps =
   5563             int(m_pCapability->fps_ranges_tbl[default_fps_index].min_fps * 1000);
   5564         int max_fps =
   5565             int(m_pCapability->fps_ranges_tbl[default_fps_index].max_fps * 1000);
   5566         m_default_fps_range = m_pCapability->fps_ranges_tbl[default_fps_index];
   5567         //Set video fps same as preview fps
   5568         setPreviewFpsRange(min_fps, max_fps, min_fps, max_fps);
   5569 
   5570         // Set legacy preview fps
   5571         String8 fpsValues = createFpsString(m_pCapability->fps_ranges_tbl[default_fps_index]);
   5572         set(KEY_SUPPORTED_PREVIEW_FRAME_RATES, fpsValues.string());
   5573         LOGH("supported fps rates: %s", fpsValues.string());
   5574         CameraParameters::setPreviewFrameRate(int(m_pCapability->fps_ranges_tbl[default_fps_index].max_fps));
   5575     } else {
   5576         LOGW("supported fps ranges cnt is 0 or exceeds max!!!");
   5577     }
   5578 
   5579     // Set supported focus modes
   5580     if (m_pCapability->supported_focus_modes_cnt > 0) {
   5581         String8 focusModeValues = createValuesString(
   5582                 m_pCapability->supported_focus_modes,
   5583                 m_pCapability->supported_focus_modes_cnt,
   5584                 FOCUS_MODES_MAP,
   5585                 PARAM_MAP_SIZE(FOCUS_MODES_MAP));
   5586         set(KEY_SUPPORTED_FOCUS_MODES, focusModeValues);
   5587 
   5588         // Set default focus mode and update corresponding parameter buf
   5589         const char *focusMode = lookupNameByValue(FOCUS_MODES_MAP,
   5590                 PARAM_MAP_SIZE(FOCUS_MODES_MAP),
   5591                 m_pCapability->supported_focus_modes[0]);
   5592         if (focusMode != NULL) {
   5593             setFocusMode(focusMode);
   5594         } else {
   5595             setFocusMode(FOCUS_MODE_FIXED);
   5596         }
   5597     } else {
   5598         LOGW("supported focus modes cnt is 0!!!");
   5599     }
   5600 
   5601     // Set focus areas
   5602     if (m_pCapability->max_num_focus_areas > MAX_ROI) {
   5603         m_pCapability->max_num_focus_areas = MAX_ROI;
   5604     }
   5605     set(KEY_MAX_NUM_FOCUS_AREAS, m_pCapability->max_num_focus_areas);
   5606     if (m_pCapability->max_num_focus_areas > 0) {
   5607         setFocusAreas(DEFAULT_CAMERA_AREA);
   5608     }
   5609 
   5610     // Set metering areas
   5611     if (m_pCapability->max_num_metering_areas > MAX_ROI) {
   5612         m_pCapability->max_num_metering_areas = MAX_ROI;
   5613     }
   5614     set(KEY_MAX_NUM_METERING_AREAS, m_pCapability->max_num_metering_areas);
   5615     if (m_pCapability->max_num_metering_areas > 0) {
   5616         setMeteringAreas(DEFAULT_CAMERA_AREA);
   5617     }
   5618 
   5619     // set focus position, we should get them from m_pCapability
   5620     m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_INDEX] = 0;
   5621     m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_INDEX] = 1023;
   5622     set(KEY_QC_MIN_FOCUS_POS_INDEX,
   5623             (int) m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_INDEX]);
   5624     set(KEY_QC_MAX_FOCUS_POS_INDEX,
   5625             (int) m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_INDEX]);
   5626 
   5627     m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_DAC_CODE] = 0;
   5628     m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_DAC_CODE] = 1023;
   5629     set(KEY_QC_MIN_FOCUS_POS_DAC,
   5630             (int) m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_DAC_CODE]);
   5631     set(KEY_QC_MAX_FOCUS_POS_DAC,
   5632             (int) m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_DAC_CODE]);
   5633 
   5634     m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_RATIO] = 0;
   5635     m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_RATIO] = 100;
   5636     set(KEY_QC_MIN_FOCUS_POS_RATIO,
   5637             (int) m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_RATIO]);
   5638     set(KEY_QC_MAX_FOCUS_POS_RATIO,
   5639             (int) m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_RATIO]);
   5640 
   5641     m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_DIOPTER] = 0;
   5642     if (m_pCapability->min_focus_distance > 0) {
   5643         m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_DIOPTER] =
   5644                 m_pCapability->min_focus_distance;
   5645     } else {
   5646         m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_DIOPTER] = 0;
   5647     }
   5648     setFloat(KEY_QC_MIN_FOCUS_POS_DIOPTER,
   5649             m_pCapability->min_focus_pos[CAM_MANUAL_FOCUS_MODE_DIOPTER]);
   5650     setFloat(KEY_QC_MAX_FOCUS_POS_DIOPTER,
   5651             m_pCapability->max_focus_pos[CAM_MANUAL_FOCUS_MODE_DIOPTER]);
   5652 
   5653     //set supported manual focus modes
   5654     String8 manualFocusModes(VALUE_OFF);
   5655     if (m_pCapability->supported_focus_modes_cnt > 1 &&
   5656         m_pCapability->min_focus_distance > 0) {
   5657         manualFocusModes.append(",");
   5658         manualFocusModes.append(KEY_QC_FOCUS_SCALE_MODE);
   5659         manualFocusModes.append(",");
   5660         manualFocusModes.append(KEY_QC_FOCUS_DIOPTER_MODE);
   5661     }
   5662     set(KEY_QC_SUPPORTED_MANUAL_FOCUS_MODES, manualFocusModes.string());
   5663 
   5664     // Set Saturation
   5665     set(KEY_QC_MIN_SATURATION, m_pCapability->saturation_ctrl.min_value);
   5666     set(KEY_QC_MAX_SATURATION, m_pCapability->saturation_ctrl.max_value);
   5667     set(KEY_QC_SATURATION_STEP, m_pCapability->saturation_ctrl.step);
   5668     setSaturation(m_pCapability->saturation_ctrl.def_value);
   5669 
   5670     // Set Sharpness
   5671     set(KEY_QC_MIN_SHARPNESS, m_pCapability->sharpness_ctrl.min_value);
   5672     set(KEY_QC_MAX_SHARPNESS, m_pCapability->sharpness_ctrl.max_value);
   5673     set(KEY_QC_SHARPNESS_STEP, m_pCapability->sharpness_ctrl.step);
   5674     setSharpness(m_pCapability->sharpness_ctrl.def_value);
   5675 
   5676     // Set Contrast
   5677     set(KEY_QC_MIN_CONTRAST, m_pCapability->contrast_ctrl.min_value);
   5678     set(KEY_QC_MAX_CONTRAST, m_pCapability->contrast_ctrl.max_value);
   5679     set(KEY_QC_CONTRAST_STEP, m_pCapability->contrast_ctrl.step);
   5680     setContrast(m_pCapability->contrast_ctrl.def_value);
   5681 
   5682     // Set SCE factor
   5683     set(KEY_QC_MIN_SCE_FACTOR, m_pCapability->sce_ctrl.min_value); // -100
   5684     set(KEY_QC_MAX_SCE_FACTOR, m_pCapability->sce_ctrl.max_value); // 100
   5685     set(KEY_QC_SCE_FACTOR_STEP, m_pCapability->sce_ctrl.step);     // 10
   5686     setSkinToneEnhancement(m_pCapability->sce_ctrl.def_value);     // 0
   5687 
   5688     // Set Brightness
   5689     set(KEY_QC_MIN_BRIGHTNESS, m_pCapability->brightness_ctrl.min_value); // 0
   5690     set(KEY_QC_MAX_BRIGHTNESS, m_pCapability->brightness_ctrl.max_value); // 6
   5691     set(KEY_QC_BRIGHTNESS_STEP, m_pCapability->brightness_ctrl.step);     // 1
   5692     setBrightness(m_pCapability->brightness_ctrl.def_value);
   5693 
   5694     // Set Auto exposure
   5695     String8 autoExposureValues = createValuesString(
   5696             m_pCapability->supported_aec_modes,
   5697             m_pCapability->supported_aec_modes_cnt,
   5698             AUTO_EXPOSURE_MAP,
   5699             PARAM_MAP_SIZE(AUTO_EXPOSURE_MAP));
   5700     set(KEY_QC_SUPPORTED_AUTO_EXPOSURE, autoExposureValues.string());
   5701     setAutoExposure(AUTO_EXPOSURE_FRAME_AVG);
   5702 
   5703     // Set Exposure Compensation
   5704     set(KEY_MAX_EXPOSURE_COMPENSATION, m_pCapability->exposure_compensation_max); // 12
   5705     set(KEY_MIN_EXPOSURE_COMPENSATION, m_pCapability->exposure_compensation_min); // -12
   5706     setFloat(KEY_EXPOSURE_COMPENSATION_STEP, m_pCapability->exposure_compensation_step); // 1/6
   5707     setExposureCompensation(m_pCapability->exposure_compensation_default); // 0
   5708 
   5709     // Set Instant AEC modes
   5710     String8 instantAECModes = createValuesString(
   5711             m_pCapability->supported_instant_aec_modes,
   5712             m_pCapability->supported_instant_aec_modes_cnt,
   5713             INSTANT_AEC_MODES_MAP,
   5714             PARAM_MAP_SIZE(INSTANT_AEC_MODES_MAP));
   5715     set(KEY_QC_INSTANT_AEC_SUPPORTED_MODES, instantAECModes.string());
   5716 
   5717     // Set Instant Capture modes
   5718     String8 instantCaptureModes = createValuesString(
   5719             m_pCapability->supported_instant_aec_modes,
   5720             m_pCapability->supported_instant_aec_modes_cnt,
   5721             INSTANT_CAPTURE_MODES_MAP,
   5722             PARAM_MAP_SIZE(INSTANT_CAPTURE_MODES_MAP));
   5723     set(KEY_QC_INSTANT_CAPTURE_SUPPORTED_MODES, instantCaptureModes.string());
   5724 
   5725 
   5726     // Set Antibanding
   5727     String8 antibandingValues = createValuesString(
   5728             m_pCapability->supported_antibandings,
   5729             m_pCapability->supported_antibandings_cnt,
   5730             ANTIBANDING_MODES_MAP,
   5731             PARAM_MAP_SIZE(ANTIBANDING_MODES_MAP));
   5732     set(KEY_SUPPORTED_ANTIBANDING, antibandingValues);
   5733     setAntibanding(ANTIBANDING_OFF);
   5734 
   5735     // Set Effect
   5736     String8 effectValues = createValuesString(
   5737             m_pCapability->supported_effects,
   5738             m_pCapability->supported_effects_cnt,
   5739             EFFECT_MODES_MAP,
   5740             PARAM_MAP_SIZE(EFFECT_MODES_MAP));
   5741 
   5742     if (m_pCapability->supported_effects_cnt > 0) {
   5743         set(KEY_SUPPORTED_EFFECTS, effectValues);
   5744     } else {
   5745         LOGW("Color effects are not available");
   5746         set(KEY_SUPPORTED_EFFECTS, EFFECT_NONE);
   5747     }
   5748     setEffect(EFFECT_NONE);
   5749 
   5750     // Set WhiteBalance
   5751     String8 whitebalanceValues = createValuesString(
   5752             m_pCapability->supported_white_balances,
   5753             m_pCapability->supported_white_balances_cnt,
   5754             WHITE_BALANCE_MODES_MAP,
   5755             PARAM_MAP_SIZE(WHITE_BALANCE_MODES_MAP));
   5756     set(KEY_SUPPORTED_WHITE_BALANCE, whitebalanceValues);
   5757     setWhiteBalance(WHITE_BALANCE_AUTO);
   5758 
   5759     // set supported wb cct, we should get them from m_pCapability
   5760     m_pCapability->min_wb_cct = 2000;
   5761     m_pCapability->max_wb_cct = 8000;
   5762     set(KEY_QC_MIN_WB_CCT, m_pCapability->min_wb_cct);
   5763     set(KEY_QC_MAX_WB_CCT, m_pCapability->max_wb_cct);
   5764 
   5765     // set supported wb rgb gains, ideally we should get them from m_pCapability
   5766     //but for now hardcode.
   5767     m_pCapability->min_wb_gain = 1.0;
   5768     m_pCapability->max_wb_gain = 4.0;
   5769     setFloat(KEY_QC_MIN_WB_GAIN, m_pCapability->min_wb_gain);
   5770     setFloat(KEY_QC_MAX_WB_GAIN, m_pCapability->max_wb_gain);
   5771 
   5772     //set supported manual wb modes
   5773     String8 manualWBModes(VALUE_OFF);
   5774     if(m_pCapability->sensor_type.sens_type != CAM_SENSOR_YUV) {
   5775         manualWBModes.append(",");
   5776         manualWBModes.append(KEY_QC_WB_CCT_MODE);
   5777         manualWBModes.append(",");
   5778         manualWBModes.append(KEY_QC_WB_GAIN_MODE);
   5779     }
   5780     set(KEY_QC_SUPPORTED_MANUAL_WB_MODES, manualWBModes.string());
   5781 
   5782     // Set Flash mode
   5783     if(m_pCapability->supported_flash_modes_cnt > 0) {
   5784        String8 flashValues = createValuesString(
   5785                m_pCapability->supported_flash_modes,
   5786                m_pCapability->supported_flash_modes_cnt,
   5787                FLASH_MODES_MAP,
   5788                PARAM_MAP_SIZE(FLASH_MODES_MAP));
   5789        set(KEY_SUPPORTED_FLASH_MODES, flashValues);
   5790        setFlash(FLASH_MODE_OFF);
   5791     } else {
   5792         LOGW("supported flash modes cnt is 0!!!");
   5793     }
   5794 
   5795     // Set Scene Mode
   5796     String8 sceneModeValues = createValuesString(
   5797             m_pCapability->supported_scene_modes,
   5798             m_pCapability->supported_scene_modes_cnt,
   5799             SCENE_MODES_MAP,
   5800             PARAM_MAP_SIZE(SCENE_MODES_MAP));
   5801     set(KEY_SUPPORTED_SCENE_MODES, sceneModeValues);
   5802     setSceneMode(SCENE_MODE_AUTO);
   5803 
   5804     // Set CDS Mode
   5805     String8 cdsModeValues = createValuesStringFromMap(
   5806             CDS_MODES_MAP,
   5807             PARAM_MAP_SIZE(CDS_MODES_MAP));
   5808     set(KEY_QC_SUPPORTED_CDS_MODES, cdsModeValues);
   5809 
   5810     // Set video CDS Mode
   5811     String8 videoCdsModeValues = createValuesStringFromMap(
   5812             CDS_MODES_MAP,
   5813             PARAM_MAP_SIZE(CDS_MODES_MAP));
   5814     set(KEY_QC_SUPPORTED_VIDEO_CDS_MODES, videoCdsModeValues);
   5815 
   5816     // Set TNR Mode
   5817     String8 tnrModeValues = createValuesStringFromMap(
   5818             ON_OFF_MODES_MAP,
   5819             PARAM_MAP_SIZE(ON_OFF_MODES_MAP));
   5820     set(KEY_QC_SUPPORTED_TNR_MODES, tnrModeValues);
   5821 
   5822     // Set video TNR Mode
   5823     String8 videoTnrModeValues = createValuesStringFromMap(
   5824             ON_OFF_MODES_MAP,
   5825             PARAM_MAP_SIZE(ON_OFF_MODES_MAP));
   5826     set(KEY_QC_SUPPORTED_VIDEO_TNR_MODES, videoTnrModeValues);
   5827 
   5828     // Set ISO Mode
   5829     String8 isoValues = createValuesString(
   5830             m_pCapability->supported_iso_modes,
   5831             m_pCapability->supported_iso_modes_cnt,
   5832             ISO_MODES_MAP,
   5833             PARAM_MAP_SIZE(ISO_MODES_MAP));
   5834     set(KEY_QC_SUPPORTED_ISO_MODES, isoValues);
   5835     setISOValue(ISO_AUTO);
   5836 
   5837     // Set exposure time
   5838     String8 manualExpModes(VALUE_OFF);
   5839     bool expTimeSupported = false;
   5840     bool manualISOSupported = false;
   5841     //capability values are in nano sec, convert to milli sec for upper layers
   5842     char expTimeStr[20];
   5843     double min_exp_time = (double) m_pCapability->exposure_time_range[0] / 1000000.0;
   5844     double max_exp_time = (double) m_pCapability->exposure_time_range[1] / 1000000.0;
   5845     snprintf(expTimeStr, sizeof(expTimeStr), "%f", min_exp_time);
   5846     set(KEY_QC_MIN_EXPOSURE_TIME, expTimeStr);
   5847     snprintf(expTimeStr, sizeof(expTimeStr), "%f", max_exp_time);
   5848     set(KEY_QC_MAX_EXPOSURE_TIME, expTimeStr);
   5849     if ((min_exp_time > 0) && (max_exp_time > min_exp_time)) {
   5850         manualExpModes.append(",");
   5851         manualExpModes.append(KEY_QC_EXP_TIME_PRIORITY);
   5852         expTimeSupported = true;
   5853     }
   5854     LOGH(", Exposure time min %f ms, max %f ms",
   5855             min_exp_time, max_exp_time);
   5856 
   5857     // Set iso
   5858     set(KEY_QC_MIN_ISO, m_pCapability->sensitivity_range.min_sensitivity);
   5859     set(KEY_QC_MAX_ISO, m_pCapability->sensitivity_range.max_sensitivity);
   5860     LOGH(", ISO min %d, max %d",
   5861             m_pCapability->sensitivity_range.min_sensitivity,
   5862             m_pCapability->sensitivity_range.max_sensitivity);
   5863     if ((m_pCapability->sensitivity_range.min_sensitivity > 0) &&
   5864             (m_pCapability->sensitivity_range.max_sensitivity >
   5865                     m_pCapability->sensitivity_range.min_sensitivity)) {
   5866         manualExpModes.append(",");
   5867         manualExpModes.append(KEY_QC_ISO_PRIORITY);
   5868         manualISOSupported = true;
   5869     }
   5870     if (expTimeSupported && manualISOSupported) {
   5871         manualExpModes.append(",");
   5872         manualExpModes.append(KEY_QC_USER_SETTING);
   5873     }
   5874     //finally set supported manual exposure modes
   5875     set(KEY_QC_SUPPORTED_MANUAL_EXPOSURE_MODES, manualExpModes.string());
   5876 
   5877     // Set HFR
   5878     String8 hfrValues = createHfrValuesString(
   5879             m_pCapability->hfr_tbl,
   5880             m_pCapability->hfr_tbl_cnt,
   5881             HFR_MODES_MAP,
   5882             PARAM_MAP_SIZE(HFR_MODES_MAP));
   5883     set(KEY_QC_SUPPORTED_VIDEO_HIGH_FRAME_RATE_MODES, hfrValues.string());
   5884     set(KEY_QC_VIDEO_HIGH_SPEED_RECORDING, "off");
   5885     set(KEY_QC_VIDEO_HIGH_FRAME_RATE, "off");
   5886     String8 hfrSizeValues = createHfrSizesString(
   5887             m_pCapability->hfr_tbl,
   5888             m_pCapability->hfr_tbl_cnt);
   5889     set(KEY_QC_SUPPORTED_HFR_SIZES, hfrSizeValues.string());
   5890     LOGD("HFR values = %s HFR Sizes = %s", hfrValues.string(), hfrSizeValues.string());
   5891     setHighFrameRate(CAM_HFR_MODE_OFF);
   5892 
   5893     // Set Focus algorithms
   5894     String8 focusAlgoValues = createValuesString(
   5895             m_pCapability->supported_focus_algos,
   5896             m_pCapability->supported_focus_algos_cnt,
   5897             FOCUS_ALGO_MAP,
   5898             PARAM_MAP_SIZE(FOCUS_ALGO_MAP));
   5899     set(KEY_QC_SUPPORTED_FOCUS_ALGOS, focusAlgoValues);
   5900     setSelectableZoneAf(FOCUS_ALGO_AUTO);
   5901 
   5902     // Set Zoom Ratios
   5903     if (m_pCapability->zoom_supported > 0) {
   5904         String8 zoomRatioValues = createZoomRatioValuesString(
   5905                 m_pCapability->zoom_ratio_tbl,
   5906                 m_pCapability->zoom_ratio_tbl_cnt);
   5907         set(KEY_ZOOM_RATIOS, zoomRatioValues);
   5908         set(KEY_MAX_ZOOM, (int)(m_pCapability->zoom_ratio_tbl_cnt - 1));
   5909         setZoom(0);
   5910     }
   5911 
   5912     // Set Bracketing/HDR
   5913     char prop[PROPERTY_VALUE_MAX];
   5914     memset(prop, 0, sizeof(prop));
   5915     property_get("persist.capture.burst.exposures", prop, "");
   5916     if (strlen(prop) > 0) {
   5917         set(KEY_QC_CAPTURE_BURST_EXPOSURE, prop);
   5918     }
   5919     String8 bracketingValues = createValuesStringFromMap(
   5920             BRACKETING_MODES_MAP,
   5921             PARAM_MAP_SIZE(BRACKETING_MODES_MAP));
   5922     set(KEY_QC_SUPPORTED_AE_BRACKET_MODES, bracketingValues);
   5923     setAEBracket(AE_BRACKET_OFF);
   5924 
   5925     //Set AF Bracketing.
   5926     for (size_t i = 0; i < m_pCapability->supported_focus_modes_cnt; i++) {
   5927         if ((CAM_FOCUS_MODE_AUTO == m_pCapability->supported_focus_modes[i]) &&
   5928                 ((m_pCapability->qcom_supported_feature_mask &
   5929                         CAM_QCOM_FEATURE_UBIFOCUS) > 0)) {
   5930             String8 afBracketingValues = createValuesStringFromMap(
   5931                     AF_BRACKETING_MODES_MAP,
   5932                     PARAM_MAP_SIZE(AF_BRACKETING_MODES_MAP));
   5933             set(KEY_QC_SUPPORTED_AF_BRACKET_MODES, afBracketingValues);
   5934             setAFBracket(AF_BRACKET_OFF);
   5935             break;
   5936          }
   5937     }
   5938 
   5939     //Set Refocus.
   5940     //Re-use ubifocus flag for now.
   5941     for (size_t i = 0; i < m_pCapability->supported_focus_modes_cnt; i++) {
   5942         if ((CAM_FOCUS_MODE_AUTO == m_pCapability->supported_focus_modes[i]) &&
   5943                 (m_pCapability->qcom_supported_feature_mask &
   5944                     CAM_QCOM_FEATURE_REFOCUS) > 0) {
   5945             String8 reFocusValues = createValuesStringFromMap(
   5946                     RE_FOCUS_MODES_MAP,
   5947                     PARAM_MAP_SIZE(RE_FOCUS_MODES_MAP));
   5948             set(KEY_QC_SUPPORTED_RE_FOCUS_MODES, reFocusValues);
   5949             setReFocus(RE_FOCUS_OFF);
   5950         }
   5951     }
   5952 
   5953     //Set Chroma Flash.
   5954     if ((m_pCapability->supported_flash_modes_cnt > 0) &&
   5955             (m_pCapability->qcom_supported_feature_mask &
   5956             CAM_QCOM_FEATURE_CHROMA_FLASH) > 0) {
   5957         String8 chromaFlashValues = createValuesStringFromMap(
   5958                 CHROMA_FLASH_MODES_MAP,
   5959                 PARAM_MAP_SIZE(CHROMA_FLASH_MODES_MAP));
   5960         set(KEY_QC_SUPPORTED_CHROMA_FLASH_MODES, chromaFlashValues);
   5961         setChromaFlash(CHROMA_FLASH_OFF);
   5962     }
   5963 
   5964     //Set Opti Zoom.
   5965     if (m_pCapability->zoom_supported &&
   5966             (m_pCapability->qcom_supported_feature_mask &
   5967             CAM_QCOM_FEATURE_OPTIZOOM) > 0){
   5968         String8 optiZoomValues = createValuesStringFromMap(
   5969                 OPTI_ZOOM_MODES_MAP,
   5970                 PARAM_MAP_SIZE(OPTI_ZOOM_MODES_MAP));
   5971         set(KEY_QC_SUPPORTED_OPTI_ZOOM_MODES, optiZoomValues);
   5972         setOptiZoom(OPTI_ZOOM_OFF);
   5973     }
   5974 
   5975     //Set HDR Type
   5976     uint32_t supported_hdr_modes = m_pCapability->qcom_supported_feature_mask &
   5977             (CAM_QCOM_FEATURE_SENSOR_HDR | CAM_QCOM_FEATURE_HDR);
   5978     if (supported_hdr_modes) {
   5979         if (CAM_QCOM_FEATURE_SENSOR_HDR == supported_hdr_modes) {
   5980             String8 hdrModeValues;
   5981             hdrModeValues.append(HDR_MODE_SENSOR);
   5982             set(KEY_QC_SUPPORTED_KEY_QC_HDR_MODES, hdrModeValues);
   5983             setHDRMode(HDR_MODE_SENSOR);
   5984         } else if (CAM_QCOM_FEATURE_HDR == supported_hdr_modes) {
   5985             String8 hdrModeValues;
   5986             hdrModeValues.append(HDR_MODE_MULTI_FRAME);
   5987             set(KEY_QC_SUPPORTED_KEY_QC_HDR_MODES, hdrModeValues);
   5988             setHDRMode(HDR_MODE_MULTI_FRAME);
   5989         } else {
   5990             String8 hdrModeValues = createValuesStringFromMap(
   5991                     HDR_MODES_MAP,
   5992                     PARAM_MAP_SIZE(HDR_MODES_MAP));
   5993             set(KEY_QC_SUPPORTED_KEY_QC_HDR_MODES, hdrModeValues);
   5994             setHDRMode(HDR_MODE_MULTI_FRAME);
   5995         }
   5996     }
   5997 
   5998     //Set HDR need 1x
   5999     String8 hdrNeed1xValues;
   6000     if (!m_bHDRModeSensor) {
   6001         hdrNeed1xValues = createValuesStringFromMap(TRUE_FALSE_MODES_MAP,
   6002                 PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP));
   6003     } else {
   6004         hdrNeed1xValues.append(VALUE_FALSE);
   6005     }
   6006     setHDRNeed1x(VALUE_FALSE);
   6007     set(KEY_QC_SUPPORTED_HDR_NEED_1X, hdrNeed1xValues);
   6008 
   6009     //Set True Portrait
   6010     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_TRUEPORTRAIT) > 0) {
   6011         String8 truePortraitValues = createValuesStringFromMap(
   6012                 TRUE_PORTRAIT_MODES_MAP,
   6013                 PARAM_MAP_SIZE(TRUE_PORTRAIT_MODES_MAP));
   6014         set(KEY_QC_SUPPORTED_TRUE_PORTRAIT_MODES, truePortraitValues);
   6015     }
   6016 
   6017     // Set Denoise
   6018     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_DENOISE2D) > 0){
   6019     String8 denoiseValues = createValuesStringFromMap(
   6020         DENOISE_ON_OFF_MODES_MAP, PARAM_MAP_SIZE(DENOISE_ON_OFF_MODES_MAP));
   6021     set(KEY_QC_SUPPORTED_DENOISE, denoiseValues.string());
   6022 #ifdef DEFAULT_DENOISE_MODE_ON
   6023     setWaveletDenoise(DENOISE_ON);
   6024 #else
   6025     setWaveletDenoise(DENOISE_OFF);
   6026 #endif
   6027     }
   6028 
   6029     // Set feature enable/disable
   6030     String8 enableDisableValues = createValuesStringFromMap(
   6031             ENABLE_DISABLE_MODES_MAP, PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP));
   6032 
   6033     // Set Lens Shading
   6034     set(KEY_QC_SUPPORTED_LENSSHADE_MODES, enableDisableValues);
   6035     setLensShadeValue(VALUE_ENABLE);
   6036     // Set MCE
   6037     set(KEY_QC_SUPPORTED_MEM_COLOR_ENHANCE_MODES, enableDisableValues);
   6038     setMCEValue(VALUE_ENABLE);
   6039 
   6040     // Set DIS
   6041     set(KEY_QC_SUPPORTED_DIS_MODES, enableDisableValues);
   6042     setDISValue(VALUE_DISABLE);
   6043 
   6044     // Set Histogram
   6045     set(KEY_QC_SUPPORTED_HISTOGRAM_MODES,
   6046         m_pCapability->histogram_supported ? enableDisableValues : "");
   6047     set(KEY_QC_HISTOGRAM, VALUE_DISABLE);
   6048 
   6049     //Set Red Eye Reduction
   6050     set(KEY_QC_SUPPORTED_REDEYE_REDUCTION, enableDisableValues);
   6051     setRedeyeReduction(VALUE_DISABLE);
   6052 
   6053     //Set SkinTone Enhancement
   6054     set(KEY_QC_SUPPORTED_SKIN_TONE_ENHANCEMENT_MODES, enableDisableValues);
   6055 
   6056     // Enable LTM by default and disable it in HDR & SeeMore usecases
   6057     setToneMapMode(true, false);
   6058 
   6059     // Set feature on/off
   6060     String8 onOffValues = createValuesStringFromMap(
   6061             ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP));
   6062 
   6063     //Set See more (LLVD)
   6064     if (m_pCapability->qcom_supported_feature_mask &
   6065             CAM_QCOM_FEATURE_LLVD) {
   6066         set(KEY_QC_SUPPORTED_SEE_MORE_MODES, onOffValues);
   6067         setSeeMore(VALUE_OFF);
   6068     }
   6069 
   6070     //Set Still more
   6071     if (m_pCapability->qcom_supported_feature_mask &
   6072             CAM_QCOM_FEATURE_STILLMORE) {
   6073         String8 stillMoreValues = createValuesStringFromMap(
   6074                 STILL_MORE_MODES_MAP,
   6075                 PARAM_MAP_SIZE(STILL_MORE_MODES_MAP));
   6076         set(KEY_QC_SUPPORTED_STILL_MORE_MODES, stillMoreValues);
   6077         setStillMore(STILL_MORE_OFF);
   6078     }
   6079 
   6080     //Set Noise Reduction mode
   6081     if (m_pCapability->qcom_supported_feature_mask &
   6082             CAM_QTI_FEATURE_SW_TNR) {
   6083         String8 noiseReductionModesValues = createValuesStringFromMap(
   6084                 NOISE_REDUCTION_MODES_MAP, PARAM_MAP_SIZE(NOISE_REDUCTION_MODES_MAP));
   6085         set(KEY_QC_NOISE_REDUCTION_MODE_VALUES, noiseReductionModesValues);
   6086         setNoiseReductionMode(VALUE_OFF);
   6087     }
   6088 
   6089     //Set Scene Detection
   6090     set(KEY_QC_SUPPORTED_SCENE_DETECT, onOffValues);
   6091     setSceneDetect(VALUE_OFF);
   6092     m_bHDREnabled = false;
   6093     m_bHDR1xFrameEnabled = false;
   6094 
   6095     m_bHDRThumbnailProcessNeeded = false;
   6096     m_bHDR1xExtraBufferNeeded = true;
   6097     for (uint32_t i=0; i<m_pCapability->hdr_bracketing_setting.num_frames; i++) {
   6098         if (0 == m_pCapability->hdr_bracketing_setting.exp_val.values[i]) {
   6099             m_bHDR1xExtraBufferNeeded = false;
   6100             break;
   6101         }
   6102     }
   6103 
   6104     // Set HDR output scaling
   6105     char value[PROPERTY_VALUE_MAX];
   6106 
   6107     property_get("persist.camera.hdr.outcrop", value, VALUE_DISABLE);
   6108     if (strncmp(VALUE_ENABLE, value, sizeof(VALUE_ENABLE))) {
   6109       m_bHDROutputCropEnabled = false;
   6110     } else {
   6111       m_bHDROutputCropEnabled = true;
   6112     }
   6113 
   6114     //Set Face Detection
   6115     set(KEY_QC_SUPPORTED_FACE_DETECTION, onOffValues);
   6116     set(KEY_QC_FACE_DETECTION, VALUE_OFF);
   6117 
   6118     //Set Face Recognition
   6119     //set(KEY_QC_SUPPORTED_FACE_RECOGNITION, onOffValues);
   6120     //set(KEY_QC_FACE_RECOGNITION, VALUE_OFF);
   6121 
   6122     //Set ZSL
   6123     set(KEY_QC_SUPPORTED_ZSL_MODES, onOffValues);
   6124 #ifdef DEFAULT_ZSL_MODE_ON
   6125     set(KEY_QC_ZSL, VALUE_ON);
   6126     m_bZslMode = true;
   6127 #else
   6128     set(KEY_QC_ZSL, VALUE_OFF);
   6129     m_bZslMode = false;
   6130 #endif
   6131 
   6132     // Check if zsl mode property is enabled.
   6133     // If yes, force the camera to be in zsl mode
   6134     // and force zsl mode to be enabled in dual camera mode.
   6135     memset(value, 0x0, PROPERTY_VALUE_MAX);
   6136     property_get("persist.camera.zsl.mode", value, "0");
   6137     int32_t zsl_mode = atoi(value);
   6138     if((zsl_mode == 1) ||
   6139             (m_bZslMode == true) ||
   6140             (m_relCamSyncInfo.sync_control == CAM_SYNC_RELATED_SENSORS_ON)) {
   6141         LOGH("%d: Forcing Camera to ZSL mode enabled");
   6142         set(KEY_QC_ZSL, VALUE_ON);
   6143         m_bForceZslMode = true;
   6144         m_bZslMode = true;
   6145         int32_t value = m_bForceZslMode;
   6146         ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ZSL_MODE, value);
   6147     }
   6148     m_bZslMode_new = m_bZslMode;
   6149 
   6150     set(KEY_QC_SCENE_SELECTION, VALUE_DISABLE);
   6151 
   6152     // Rdi mode
   6153     set(KEY_QC_SUPPORTED_RDI_MODES, enableDisableValues);
   6154     setRdiMode(VALUE_DISABLE);
   6155 
   6156     // Secure mode
   6157     set(KEY_QC_SUPPORTED_SECURE_MODES, enableDisableValues);
   6158     setSecureMode(VALUE_DISABLE);
   6159 
   6160     //Set video HDR
   6161     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_VIDEO_HDR) > 0) {
   6162         set(KEY_QC_SUPPORTED_VIDEO_HDR_MODES, onOffValues);
   6163         set(KEY_QC_VIDEO_HDR, VALUE_OFF);
   6164     }
   6165 
   6166     //Set HW Sensor Snapshot HDR
   6167     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_SENSOR_HDR)> 0) {
   6168         set(KEY_QC_SUPPORTED_SENSOR_HDR_MODES, onOffValues);
   6169         set(KEY_QC_SENSOR_HDR, VALUE_OFF);
   6170         m_bSensorHDREnabled = false;
   6171     }
   6172 
   6173     // Set VT TimeStamp
   6174     set(KEY_QC_VT_ENABLE, VALUE_DISABLE);
   6175     //Set Touch AF/AEC
   6176     String8 touchValues = createValuesStringFromMap(
   6177             TOUCH_AF_AEC_MODES_MAP, PARAM_MAP_SIZE(TOUCH_AF_AEC_MODES_MAP));
   6178 
   6179     set(KEY_QC_SUPPORTED_TOUCH_AF_AEC, touchValues);
   6180     set(KEY_QC_TOUCH_AF_AEC, TOUCH_AF_AEC_OFF);
   6181 
   6182     //set flip mode
   6183     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_FLIP) > 0) {
   6184         String8 flipModes = createValuesStringFromMap(
   6185                 FLIP_MODES_MAP, PARAM_MAP_SIZE(FLIP_MODES_MAP));
   6186         set(KEY_QC_SUPPORTED_FLIP_MODES, flipModes);
   6187         set(KEY_QC_PREVIEW_FLIP, FLIP_MODE_OFF);
   6188         set(KEY_QC_VIDEO_FLIP, FLIP_MODE_OFF);
   6189         set(KEY_QC_SNAPSHOT_PICTURE_FLIP, FLIP_MODE_OFF);
   6190     }
   6191 
   6192     // Set default Auto Exposure lock value
   6193     setAecLock(VALUE_FALSE);
   6194 
   6195     // Set default AWB_LOCK lock value
   6196     setAwbLock(VALUE_FALSE);
   6197 
   6198     // Set default Camera mode
   6199     set(KEY_QC_CAMERA_MODE, 0);
   6200 
   6201     // Add support for internal preview restart
   6202     set(KEY_INTERNAL_PERVIEW_RESTART, VALUE_TRUE);
   6203     // Set default burst number
   6204     set(KEY_QC_SNAPSHOT_BURST_NUM, 0);
   6205     set(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER, 0);
   6206 
   6207     //Get RAM size and disable features which are memory rich
   6208     struct sysinfo info;
   6209     sysinfo(&info);
   6210 
   6211     LOGH("totalram = %ld, freeram = %ld ", info.totalram,
   6212         info.freeram);
   6213     if (info.totalram > TOTAL_RAM_SIZE_512MB) {
   6214         set(KEY_QC_ZSL_HDR_SUPPORTED, VALUE_TRUE);
   6215     } else {
   6216         m_bIsLowMemoryDevice = true;
   6217         set(KEY_QC_ZSL_HDR_SUPPORTED, VALUE_FALSE);
   6218     }
   6219 
   6220     setOfflineRAW();
   6221     memset(mStreamPpMask, 0, sizeof(cam_feature_mask_t)*CAM_STREAM_TYPE_MAX);
   6222     //Set video buffers as uncached by default
   6223     set(KEY_QC_CACHE_VIDEO_BUFFERS, VALUE_DISABLE);
   6224 
   6225     // Set default longshot mode
   6226     set(KEY_QC_LONG_SHOT, "off");
   6227     //Enable longshot by default
   6228     set(KEY_QC_LONGSHOT_SUPPORTED, VALUE_TRUE);
   6229 
   6230     int32_t rc = commitParameters();
   6231     if (rc == NO_ERROR) {
   6232         rc = setNumOfSnapshot();
   6233     }
   6234 
   6235     //Set Video Rotation
   6236     String8 videoRotationValues;
   6237     if (m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) {
   6238         videoRotationValues = createValuesStringFromMap(VIDEO_ROTATION_MODES_MAP,
   6239                 PARAM_MAP_SIZE(VIDEO_ROTATION_MODES_MAP));
   6240         set(KEY_QC_SUPPORTED_VIDEO_ROTATION_VALUES, videoRotationValues.string());
   6241     }
   6242     set(KEY_QC_VIDEO_ROTATION, VIDEO_ROTATION_0);
   6243 
   6244     String8 metadataTypeValues = createValuesStringFromMap(METADATA_TYPES_MAP,
   6245         PARAM_MAP_SIZE(METADATA_TYPES_MAP));
   6246     set(KEY_QC_SUPPORTED_METADATA_TYPES, metadataTypeValues);
   6247 
   6248     //Check for EZTune
   6249     setEztune();
   6250     //Default set for video batch size
   6251     set(KEY_QC_VIDEO_BATCH_SIZE, 0);
   6252 
   6253     //Setup dual-camera
   6254     setDcrf();
   6255     setSyncDCParams();
   6256 
   6257     // For Aux Camera of dual camera Mode,
   6258     // by default set no display mode
   6259     if (m_relCamSyncInfo.mode == CAM_MODE_SECONDARY) {
   6260         set(KEY_QC_NO_DISPLAY_MODE, 1);
   6261         m_bNoDisplayMode = true;
   6262     }
   6263 
   6264     cam_dimension_t pic_dim;
   6265     pic_dim.width = 0;
   6266     pic_dim.height = 0;
   6267 
   6268     if (m_pCapability->picture_sizes_tbl_cnt > 0 &&
   6269         m_pCapability->picture_sizes_tbl_cnt <= MAX_SIZES_CNT) {
   6270         for(uint32_t i = 0;
   6271                 i < m_pCapability->picture_sizes_tbl_cnt; i++) {
   6272             if ((pic_dim.width * pic_dim.height) <
   6273                     (int32_t)(m_pCapability->picture_sizes_tbl[i].width *
   6274                     m_pCapability->picture_sizes_tbl[i].height)) {
   6275                 pic_dim.width =
   6276                         m_pCapability->picture_sizes_tbl[i].width;
   6277                 pic_dim.height =
   6278                         m_pCapability->picture_sizes_tbl[i].height;
   6279             }
   6280         }
   6281         LOGD("max pic size = %d %d", pic_dim.width,
   6282                 pic_dim.height);
   6283         setMaxPicSize(pic_dim);
   6284     } else {
   6285         LOGW("supported picture sizes cnt is 0 or exceeds max!!!");
   6286     }
   6287 
   6288     setManualCaptureMode(CAM_MANUAL_CAPTURE_TYPE_OFF);
   6289     return rc;
   6290 }
   6291 
   6292 /*===========================================================================
   6293  * FUNCTION   : allocate
   6294  *
   6295  * DESCRIPTION: Allocate buffer memory for parameter obj (if necessary)
   6296  *
   6297  * PARAMETERS : none
   6298  *
   6299  * RETURN     : int32_t type of status
   6300  *              NO_ERROR  -- success
   6301  *              none-zero failure code
   6302  *==========================================================================*/
   6303 int32_t QCameraParameters::allocate(uint8_t bufCount)
   6304 {
   6305     int32_t rc = NO_ERROR;
   6306 
   6307     if (m_pParamHeap != NULL) {
   6308         return rc;
   6309     }
   6310 
   6311     //Allocate Set Param Buffer
   6312     m_pParamHeap = new QCameraHeapMemory(QCAMERA_ION_USE_CACHE);
   6313     if (m_pParamHeap == NULL) {
   6314         return NO_MEMORY;
   6315     }
   6316 
   6317     rc = m_pParamHeap->allocate(bufCount, sizeof(parm_buffer_t));
   6318     if(rc != OK) {
   6319         rc = NO_MEMORY;
   6320         LOGE("Error!! Param buffers have not been allocated");
   6321         delete m_pParamHeap;
   6322         m_pParamHeap = NULL;
   6323     }
   6324     return rc;
   6325 }
   6326 
   6327 /*===========================================================================
   6328  * FUNCTION   : init
   6329  *
   6330  * DESCRIPTION: initialize parameter obj
   6331  *
   6332  * PARAMETERS :
   6333  *   @capabilities  : ptr to camera capabilities
   6334  *   @mmops         : ptr to memory ops table for mapping/unmapping
   6335  *   @adjustFPS     : object reference for additional (possibly thermal)
   6336  *                    framerate adjustment
   6337  *
   6338  * RETURN     : int32_t type of status
   6339  *              NO_ERROR  -- success
   6340  *              none-zero failure code
   6341  *==========================================================================*/
   6342 int32_t QCameraParameters::init(cam_capability_t *capabilities, mm_camera_vtbl_t *mmOps,
   6343         QCameraAdjustFPS *adjustFPS, QCameraFOVControl *fovControl)
   6344 {
   6345     int32_t rc = NO_ERROR;
   6346     uint8_t buf_cnt = 1;
   6347 
   6348     m_pCapability = capabilities;
   6349     m_pCamOpsTbl  = mmOps;
   6350     m_AdjustFPS   = adjustFPS;
   6351     m_pFovControl = fovControl;
   6352 
   6353     if (m_pParamHeap == NULL) {
   6354         LOGE("Parameter buffers have not been allocated");
   6355         rc = UNKNOWN_ERROR;
   6356         goto TRANS_INIT_ERROR1;
   6357     }
   6358 
   6359     m_bDualCamera = is_dual_camera_by_handle(mmOps->camera_handle);
   6360     cam_buf_map_type_list bufMapList;
   6361     rc = QCameraBufferMaps::makeSingletonBufMapList(
   6362             CAM_MAPPING_BUF_TYPE_PARM_BUF, 0 /*stream id*/,
   6363             0 /*buffer index*/, -1 /*plane index*/, 0 /*cookie*/,
   6364             m_pParamHeap->getFd(0), sizeof(parm_buffer_t), bufMapList,
   6365                     m_pParamHeap->getPtr(0));
   6366     if (rc == NO_ERROR) {
   6367         rc = m_pCamOpsTbl->ops->map_bufs(m_pCamOpsTbl->camera_handle,
   6368                 &bufMapList);
   6369     }
   6370     if(rc < 0) {
   6371         LOGE("failed to map SETPARM buffer");
   6372         rc = FAILED_TRANSACTION;
   6373         goto TRANS_INIT_ERROR2;
   6374     }
   6375 
   6376     m_pParamBuf = (parm_buffer_t*) DATA_PTR(m_pParamHeap, 0);
   6377     mActiveCameras = MM_CAMERA_TYPE_MAIN;
   6378     if (isDualCamera()) {
   6379         mActiveCameras |= MM_CAMERA_TYPE_AUX;
   6380         memset(&bufMapList, 0, sizeof(cam_buf_map_type_list));
   6381         rc = QCameraBufferMaps::makeSingletonBufMapList(
   6382                 CAM_MAPPING_BUF_TYPE_PARM_BUF, 0 /*stream id*/,
   6383                 0 /*buffer index*/, -1 /*plane index*/, 0 /*cookie*/,
   6384                 m_pParamHeap->getFd(1), sizeof(parm_buffer_t), bufMapList,
   6385                         m_pParamHeap->getPtr(1));
   6386         if (rc == NO_ERROR) {
   6387             rc = m_pCamOpsTbl->ops->map_bufs(
   6388                     get_aux_camera_handle(m_pCamOpsTbl->camera_handle),
   6389                     &bufMapList);
   6390         }
   6391         if(rc < 0) {
   6392             LOGE("failed to map SETPARM buffer");
   6393             rc = FAILED_TRANSACTION;
   6394             goto TRANS_INIT_ERROR2;
   6395         }
   6396         m_pParamBufAux = (parm_buffer_t*)DATA_PTR(m_pParamHeap, 1);
   6397     }
   6398 
   6399     //Handle Dual camera cmd buffer
   6400     if (m_bDualCamera) {
   6401         buf_cnt = MM_CAMERA_MAX_CAM_CNT;
   6402     }
   6403 
   6404     m_pDualCamCmdHeap = new QCameraHeapMemory(QCAMERA_ION_USE_CACHE);
   6405     rc = m_pDualCamCmdHeap->allocate(buf_cnt,
   6406             sizeof(cam_dual_camera_cmd_info_t));
   6407     if(rc != OK) {
   6408         rc = NO_MEMORY;
   6409         LOGE("Failed to allocate dual cam Heap memory");
   6410         goto TRANS_INIT_ERROR3;
   6411     }
   6412 
   6413     for (int i = 0; i < buf_cnt; i++) {
   6414         m_pDualCamCmdPtr[i] = (cam_dual_camera_cmd_info_t *)
   6415                 DATA_PTR(m_pDualCamCmdHeap, i);
   6416     }
   6417 
   6418     //Map memory for related cam sync buffer
   6419     rc = m_pCamOpsTbl->ops->map_buf(
   6420             get_main_camera_handle(m_pCamOpsTbl->camera_handle),
   6421             CAM_MAPPING_BUF_TYPE_DUAL_CAM_CMD_BUF,
   6422             m_pDualCamCmdHeap->getFd(0),
   6423             sizeof(cam_dual_camera_cmd_info_t),
   6424             m_pDualCamCmdPtr[0]);
   6425     if(rc < 0) {
   6426         LOGE("failed to map Related cam sync buffer");
   6427         rc = FAILED_TRANSACTION;
   6428         goto TRANS_INIT_ERROR4;
   6429     }
   6430 
   6431     if (m_bDualCamera) {
   6432         rc = m_pCamOpsTbl->ops->map_buf(
   6433                 get_aux_camera_handle(m_pCamOpsTbl->camera_handle),
   6434                 CAM_MAPPING_BUF_TYPE_DUAL_CAM_CMD_BUF,
   6435                 m_pDualCamCmdHeap->getFd(1),
   6436                 sizeof(cam_dual_camera_cmd_info_t),
   6437                 m_pDualCamCmdPtr[1]);
   6438         if(rc < 0) {
   6439             LOGE("failed to map Related cam sync buffer");
   6440             rc = FAILED_TRANSACTION;
   6441             goto TRANS_INIT_ERROR4;
   6442         }
   6443     }
   6444     rc = m_pCamOpsTbl->ops->get_session_id(m_pCamOpsTbl->camera_handle,
   6445             &sessionId[m_pCapability->camera_index]);
   6446 
   6447     initDefaultParameters();
   6448     mCommon.init(capabilities);
   6449     m_bInited = true;
   6450 
   6451     goto TRANS_INIT_DONE;
   6452 
   6453 TRANS_INIT_ERROR4:
   6454     m_pDualCamCmdHeap->deallocate();
   6455 
   6456 TRANS_INIT_ERROR3:
   6457     delete m_pDualCamCmdHeap;
   6458     m_pDualCamCmdHeap = NULL;
   6459 
   6460 TRANS_INIT_ERROR2:
   6461     m_pParamHeap->deallocate();
   6462     delete m_pParamHeap;
   6463     m_pParamHeap = NULL;
   6464 
   6465 TRANS_INIT_ERROR1:
   6466     m_pCapability = NULL;
   6467     m_pCamOpsTbl = NULL;
   6468     m_AdjustFPS = NULL;
   6469 
   6470 TRANS_INIT_DONE:
   6471     return rc;
   6472 }
   6473 
   6474 /*===========================================================================
   6475  * FUNCTION   : deinit
   6476  *
   6477  * DESCRIPTION: deinitialize
   6478  *
   6479  * PARAMETERS : none
   6480  *
   6481  * RETURN     : none
   6482  *==========================================================================*/
   6483 void QCameraParameters::deinit()
   6484 {
   6485     if (NULL != m_pParamHeap) {
   6486         m_pParamHeap->deallocate();
   6487         delete m_pParamHeap;
   6488         m_pParamHeap = NULL;
   6489         m_pParamBuf = NULL;
   6490         m_pParamBufAux = NULL;
   6491     }
   6492 
   6493     if (!m_bInited) {
   6494         return;
   6495     }
   6496 
   6497     //clear all entries in the map
   6498     String8 emptyStr;
   6499     QCameraParameters::unflatten(emptyStr);
   6500 
   6501     if ((NULL != m_pCamOpsTbl) && (m_pCamOpsTbl->ops != NULL)) {
   6502         m_pCamOpsTbl->ops->unmap_buf(
   6503                              m_pCamOpsTbl->camera_handle,
   6504                              CAM_MAPPING_BUF_TYPE_PARM_BUF);
   6505         m_pCamOpsTbl->ops->unmap_buf(
   6506                 get_main_camera_handle(m_pCamOpsTbl->camera_handle),
   6507                 CAM_MAPPING_BUF_TYPE_DUAL_CAM_CMD_BUF);
   6508         if (isDualCamera()) {
   6509             m_pCamOpsTbl->ops->unmap_buf(
   6510                     get_aux_camera_handle(m_pCamOpsTbl->camera_handle),
   6511                     CAM_MAPPING_BUF_TYPE_DUAL_CAM_CMD_BUF);
   6512         }
   6513     }
   6514 
   6515     m_pCapability = NULL;
   6516     if (NULL != m_pDualCamCmdHeap) {
   6517         m_pDualCamCmdHeap->deallocate();
   6518         delete m_pDualCamCmdHeap;
   6519         m_pDualCamCmdHeap = NULL;
   6520         memset(m_pDualCamCmdPtr, 0, sizeof(m_pDualCamCmdPtr));
   6521     }
   6522 
   6523     m_tempMap.clear();
   6524     m_pCamOpsTbl = NULL;
   6525     m_AdjustFPS = NULL;
   6526 
   6527     m_bInited = false;
   6528 }
   6529 
   6530 /*===========================================================================
   6531  * FUNCTION   : parse_pair
   6532  *
   6533  * DESCRIPTION: helper function to parse string like "640x480" or "10000,20000"
   6534  *
   6535  * PARAMETERS :
   6536  *   @str     : input string to be parse
   6537  *   @first   : [output] first value of the pair
   6538  *   @second  : [output]  second value of the pair
   6539  *   @delim   : [input] delimeter to seperate the pair
   6540  *   @endptr  : [output] ptr to the end of the pair string
   6541  *
   6542  * RETURN     : int32_t type of status
   6543  *              NO_ERROR  -- success
   6544  *              none-zero failure code
   6545  *==========================================================================*/
   6546 int32_t QCameraParameters::parse_pair(const char *str,
   6547                                       int *first,
   6548                                       int *second,
   6549                                       char delim,
   6550                                       char **endptr = NULL)
   6551 {
   6552     // Find the first integer.
   6553     char *end;
   6554     int w = (int)strtol(str, &end, 10);
   6555     // If a delimeter does not immediately follow, give up.
   6556     if (*end != delim) {
   6557         LOGE("Cannot find delimeter (%c) in str=%s", delim, str);
   6558         return BAD_VALUE;
   6559     }
   6560 
   6561     // Find the second integer, immediately after the delimeter.
   6562     int h = (int)strtol(end+1, &end, 10);
   6563 
   6564     *first = w;
   6565     *second = h;
   6566 
   6567     if (endptr) {
   6568         *endptr = end;
   6569     }
   6570 
   6571     return NO_ERROR;
   6572 }
   6573 
   6574 /*===========================================================================
   6575  * FUNCTION   : parseSizesList
   6576  *
   6577  * DESCRIPTION: helper function to parse string containing sizes
   6578  *
   6579  * PARAMETERS :
   6580  *   @sizesStr: [input] input string to be parse
   6581  *   @sizes   : [output] reference to store parsed sizes
   6582  *
   6583  * RETURN     : none
   6584  *==========================================================================*/
   6585 void QCameraParameters::parseSizesList(const char *sizesStr, Vector<Size> &sizes)
   6586 {
   6587     if (sizesStr == 0) {
   6588         return;
   6589     }
   6590 
   6591     char *sizeStartPtr = (char *)sizesStr;
   6592 
   6593     while (true) {
   6594         int width, height;
   6595         int success = parse_pair(sizeStartPtr, &width, &height, 'x',
   6596                                  &sizeStartPtr);
   6597         if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) {
   6598             LOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
   6599             return;
   6600         }
   6601         sizes.push(Size(width, height));
   6602 
   6603         if (*sizeStartPtr == '\0') {
   6604             return;
   6605         }
   6606         sizeStartPtr++;
   6607     }
   6608 }
   6609 
   6610 /*===========================================================================
   6611  * FUNCTION   : adjustPreviewFpsRange
   6612  *
   6613  * DESCRIPTION: adjust preview FPS ranges
   6614  *              according to external events
   6615  *
   6616  * PARAMETERS :
   6617  *   @minFPS  : min FPS value
   6618  *   @maxFPS  : max FPS value
   6619  *
   6620  * RETURN     : int32_t type of status
   6621  *              NO_ERROR  -- success
   6622  *              none-zero failure code
   6623  *==========================================================================*/
   6624 int32_t QCameraParameters::adjustPreviewFpsRange(cam_fps_range_t *fpsRange)
   6625 {
   6626     if ( fpsRange == NULL ) {
   6627         return BAD_VALUE;
   6628     }
   6629 
   6630     if ( m_pParamBuf == NULL ) {
   6631         return NO_INIT;
   6632     }
   6633 
   6634     int32_t rc = initBatchUpdate();
   6635     if ( rc != NO_ERROR ) {
   6636         LOGE("Failed to initialize group update table");
   6637         return rc;
   6638     }
   6639 
   6640     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FPS_RANGE, *fpsRange)) {
   6641         LOGE("Parameters batch failed");
   6642         return BAD_VALUE;
   6643     }
   6644 
   6645     rc = commitSetBatch();
   6646     if ( rc != NO_ERROR ) {
   6647         LOGE("Failed to commit batch parameters");
   6648         return rc;
   6649     }
   6650 
   6651     return rc;
   6652 }
   6653 
   6654 /*===========================================================================
   6655  * FUNCTION   : setPreviewFpsRanges
   6656  *
   6657  * DESCRIPTION: set preview FPS ranges
   6658  *
   6659  * PARAMETERS :
   6660  *   @minFPS  : min FPS value
   6661  *   @maxFPS  : max FPS value
   6662  *
   6663  * RETURN     : int32_t type of status
   6664  *              NO_ERROR  -- success
   6665  *              none-zero failure code
   6666  *==========================================================================*/
   6667 int32_t QCameraParameters::setPreviewFpsRange(int min_fps,
   6668         int max_fps, int vid_min_fps,int vid_max_fps)
   6669 {
   6670     char str[32];
   6671     char value[PROPERTY_VALUE_MAX];
   6672     int fixedFpsValue;
   6673     /*This property get value should be the fps that user needs*/
   6674     property_get("persist.debug.set.fixedfps", value, "0");
   6675     fixedFpsValue = atoi(value);
   6676 
   6677     LOGD("E minFps = %d, maxFps = %d , vid minFps = %d, vid maxFps = %d",
   6678                  min_fps, max_fps, vid_min_fps, vid_max_fps);
   6679 
   6680     if(fixedFpsValue != 0) {
   6681         min_fps = max_fps = fixedFpsValue*1000;
   6682         if (!isHfrMode()) {
   6683              vid_min_fps = vid_max_fps = fixedFpsValue*1000;
   6684         }
   6685     }
   6686     snprintf(str, sizeof(str), "%d,%d", min_fps, max_fps);
   6687     LOGH("Setting preview fps range %s", str);
   6688     updateParamEntry(KEY_PREVIEW_FPS_RANGE, str);
   6689     cam_fps_range_t fps_range;
   6690     memset(&fps_range, 0x00, sizeof(cam_fps_range_t));
   6691     fps_range.min_fps = (float)min_fps / 1000.0f;
   6692     fps_range.max_fps = (float)max_fps / 1000.0f;
   6693     fps_range.video_min_fps = (float)vid_min_fps / 1000.0f;
   6694     fps_range.video_max_fps = (float)vid_max_fps / 1000.0f;
   6695 
   6696     LOGH("Updated: minFps = %d, maxFps = %d ,"
   6697             " vid minFps = %d, vid maxFps = %d",
   6698              min_fps, max_fps, vid_min_fps, vid_max_fps);
   6699 
   6700     if ( NULL != m_AdjustFPS ) {
   6701         if (m_ThermalMode == QCAMERA_THERMAL_ADJUST_FPS &&
   6702                 !m_bRecordingHint_new) {
   6703             float minVideoFps = min_fps, maxVideoFps = max_fps;
   6704             if (isHfrMode()) {
   6705                 minVideoFps = m_hfrFpsRange.video_min_fps;
   6706                 maxVideoFps = m_hfrFpsRange.video_max_fps;
   6707             }
   6708             m_AdjustFPS->recalcFPSRange(min_fps, max_fps, minVideoFps,
   6709                                          maxVideoFps, fps_range, m_bRecordingHint_new);
   6710             LOGH("Thermal adjusted Preview fps range %3.2f,%3.2f, %3.2f, %3.2f",
   6711                    fps_range.min_fps, fps_range.max_fps,
   6712                   fps_range.video_min_fps, fps_range.video_max_fps);
   6713         }
   6714     }
   6715 
   6716     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FPS_RANGE, fps_range)) {
   6717         return BAD_VALUE;
   6718     }
   6719 
   6720     return NO_ERROR;
   6721 }
   6722 
   6723 
   6724 
   6725 /*===========================================================================
   6726  * FUNCTION   : setAutoExposure
   6727  *
   6728  * DESCRIPTION: set auto exposure
   6729  *
   6730  * PARAMETERS :
   6731  *   @autoExp : auto exposure value string
   6732  *
   6733  * RETURN     : int32_t type of status
   6734  *              NO_ERROR  -- success
   6735  *              none-zero failure code
   6736  *==========================================================================*/
   6737 int32_t QCameraParameters::setAutoExposure(const char *autoExp)
   6738 {
   6739     if (autoExp != NULL) {
   6740         int32_t value = lookupAttr(AUTO_EXPOSURE_MAP, PARAM_MAP_SIZE(AUTO_EXPOSURE_MAP), autoExp);
   6741         if (value != NAME_NOT_FOUND) {
   6742             LOGH("Setting auto exposure %s", autoExp);
   6743             updateParamEntry(KEY_QC_AUTO_EXPOSURE, autoExp);
   6744             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_AEC_ALGO_TYPE, value)) {
   6745                 return BAD_VALUE;
   6746             }
   6747             return NO_ERROR;
   6748         }
   6749     }
   6750     LOGE("Invalid auto exposure value: %s", (autoExp == NULL) ? "NULL" : autoExp);
   6751     return BAD_VALUE;
   6752 }
   6753 
   6754 /*===========================================================================
   6755  * FUNCTION   : setEffect
   6756  *
   6757  * DESCRIPTION: set effect
   6758  *
   6759  * PARAMETERS :
   6760  *   @effect  : effect value string
   6761  *
   6762  * RETURN     : int32_t type of status
   6763  *              NO_ERROR  -- success
   6764  *              none-zero failure code
   6765  *==========================================================================*/
   6766 int32_t QCameraParameters::setEffect(const char *effect)
   6767 {
   6768     if (effect != NULL) {
   6769         int32_t value = lookupAttr(EFFECT_MODES_MAP, PARAM_MAP_SIZE(EFFECT_MODES_MAP), effect);
   6770         if (value != NAME_NOT_FOUND) {
   6771             LOGH("Setting effect %s", effect);
   6772             updateParamEntry(KEY_EFFECT, effect);
   6773             uint8_t prmEffect = static_cast<uint8_t>(value);
   6774             mParmEffect = prmEffect;
   6775             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_EFFECT, prmEffect)) {
   6776                 return BAD_VALUE;
   6777             }
   6778             return NO_ERROR;
   6779         }
   6780     }
   6781     LOGE("Invalid effect value: %s", (effect == NULL) ? "NULL" : effect);
   6782     return BAD_VALUE;
   6783 }
   6784 
   6785 /*===========================================================================
   6786  * FUNCTION   : setBrightness
   6787  *
   6788  * DESCRIPTION: set brightness control value
   6789  *
   6790  * PARAMETERS :
   6791  *   @brightness  : brightness control value
   6792  *
   6793  * RETURN     : int32_t type of status
   6794  *              NO_ERROR  -- success
   6795  *              none-zero failure code
   6796  *==========================================================================*/
   6797 int32_t QCameraParameters::setBrightness(int brightness)
   6798 {
   6799     char val[16];
   6800     snprintf(val, sizeof(val), "%d", brightness);
   6801     updateParamEntry(KEY_QC_BRIGHTNESS, val);
   6802 
   6803     LOGH("Setting brightness %s", val);
   6804     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_BRIGHTNESS, brightness)) {
   6805         return BAD_VALUE;
   6806     }
   6807 
   6808     return NO_ERROR;
   6809 }
   6810 
   6811 /*===========================================================================
   6812  * FUNCTION   : setFocusMode
   6813  *
   6814  * DESCRIPTION: set focus mode
   6815  *
   6816  * PARAMETERS :
   6817  *   @focusMode  : focus mode value string
   6818  *
   6819  * RETURN     : int32_t type of status
   6820  *              NO_ERROR  -- success
   6821  *              none-zero failure code
   6822  *==========================================================================*/
   6823 int32_t QCameraParameters::setFocusMode(const char *focusMode)
   6824 {
   6825     if (focusMode != NULL) {
   6826         int32_t value = lookupAttr(FOCUS_MODES_MAP, PARAM_MAP_SIZE(FOCUS_MODES_MAP), focusMode);
   6827         if (value != NAME_NOT_FOUND) {
   6828             int32_t rc = NO_ERROR;
   6829             LOGH("Setting focus mode %s", focusMode);
   6830             mFocusMode = (cam_focus_mode_type)value;
   6831 
   6832             updateParamEntry(KEY_FOCUS_MODE, focusMode);
   6833             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   6834                     CAM_INTF_PARM_FOCUS_MODE, (uint8_t)value)) {
   6835                 rc = BAD_VALUE;
   6836             }
   6837             if (strcmp(focusMode,"infinity")==0){
   6838                 set(QCameraParameters::KEY_FOCUS_DISTANCES, "Infinity,Infinity,Infinity");
   6839             }
   6840             return rc;
   6841         }
   6842     }
   6843     LOGE("Invalid focus mode value: %s", (focusMode == NULL) ? "NULL" : focusMode);
   6844     return BAD_VALUE;
   6845 }
   6846 
   6847 /*===========================================================================
   6848  * FUNCTION   : setFocusPosition
   6849  *
   6850  * DESCRIPTION: set focus position
   6851  *
   6852  * PARAMETERS :
   6853  *   @typeStr : focus position type, index or dac_code
   6854  *   @posStr : focus positon.
   6855  *
   6856  * RETURN     : int32_t type of status
   6857  *              NO_ERROR  -- success
   6858  *              none-zero failure code
   6859  *==========================================================================*/
   6860 int32_t  QCameraParameters::setFocusPosition(const char *typeStr, const char *posStr)
   6861 {
   6862     LOGH(", type:%s, pos: %s", typeStr, posStr);
   6863     int32_t type = atoi(typeStr);
   6864     float pos = (float) atof(posStr);
   6865 
   6866     if ((type >= CAM_MANUAL_FOCUS_MODE_INDEX) &&
   6867             (type < CAM_MANUAL_FOCUS_MODE_MAX)) {
   6868         // get max and min focus position from m_pCapability
   6869         float minFocusPos = m_pCapability->min_focus_pos[type];
   6870         float maxFocusPos = m_pCapability->max_focus_pos[type];
   6871         LOGH(", focusPos min: %f, max: %f", minFocusPos, maxFocusPos);
   6872 
   6873         if (pos >= minFocusPos && pos <= maxFocusPos) {
   6874             updateParamEntry(KEY_QC_MANUAL_FOCUS_POS_TYPE, typeStr);
   6875             updateParamEntry(KEY_QC_MANUAL_FOCUS_POSITION, posStr);
   6876 
   6877             cam_manual_focus_parm_t manual_focus;
   6878             manual_focus.flag = (cam_manual_focus_mode_type)type;
   6879             if (manual_focus.flag == CAM_MANUAL_FOCUS_MODE_DIOPTER) {
   6880                 manual_focus.af_manual_diopter = pos;
   6881             } else if (manual_focus.flag == CAM_MANUAL_FOCUS_MODE_RATIO) {
   6882                 manual_focus.af_manual_lens_position_ratio = (int32_t) pos;
   6883             } else if (manual_focus.flag == CAM_MANUAL_FOCUS_MODE_INDEX) {
   6884                 manual_focus.af_manual_lens_position_index = (int32_t) pos;
   6885             } else {
   6886                 manual_focus.af_manual_lens_position_dac = (int32_t) pos;
   6887             }
   6888 
   6889             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_MANUAL_FOCUS_POS,
   6890                     manual_focus)) {
   6891                 return BAD_VALUE;
   6892             }
   6893             return NO_ERROR;
   6894         }
   6895     }
   6896 
   6897     LOGE("invalid params, type:%d, pos: %f", type, pos);
   6898     return BAD_VALUE;
   6899 }
   6900 
   6901 /*===========================================================================
   6902  * FUNCTION   : updateAEInfo
   6903  *
   6904  * DESCRIPTION: update exposure information from metadata callback
   6905  *
   6906  * PARAMETERS :
   6907  *   @ae_params : auto exposure params
   6908  *
   6909  * RETURN     : void
   6910  *==========================================================================*/
   6911 void  QCameraParameters::updateAEInfo(cam_3a_params_t &ae_params)
   6912 {
   6913     const char *prevExpTime = get(KEY_QC_CURRENT_EXPOSURE_TIME);
   6914     char newExpTime[15];
   6915     snprintf(newExpTime, sizeof(newExpTime), "%f", ae_params.exp_time*1000.0);
   6916 
   6917     if (prevExpTime == NULL || strcmp(prevExpTime, newExpTime)) {
   6918         LOGD("update exposure time: old: %s, new: %s", prevExpTime, newExpTime);
   6919         set(KEY_QC_CURRENT_EXPOSURE_TIME, newExpTime);
   6920     }
   6921 
   6922     int32_t prevISO = getInt(KEY_QC_CURRENT_ISO);
   6923     int32_t newISO = ae_params.iso_value;
   6924     if (prevISO != newISO) {
   6925         LOGD("update iso: old:%d, new:%d", prevISO, newISO);
   6926         set(KEY_QC_CURRENT_ISO, newISO);
   6927     }
   6928 }
   6929 
   6930 /*===========================================================================
   6931  * FUNCTION   : updateCurrentFocusPosition
   6932  *
   6933  * DESCRIPTION: update current focus position from metadata callback
   6934  *
   6935  * PARAMETERS :
   6936  *   @pos : current focus position
   6937  *
   6938  * RETURN     : void
   6939  *==========================================================================*/
   6940 void  QCameraParameters::updateCurrentFocusPosition(cam_focus_pos_info_t &cur_pos_info)
   6941 {
   6942     int prevScalePos = getInt(KEY_QC_FOCUS_POSITION_SCALE);
   6943     int newScalePos = (int) cur_pos_info.scale;
   6944     if (prevScalePos != newScalePos) {
   6945         LOGD("update focus scale: old:%d, new:%d", prevScalePos, newScalePos);
   6946         set(KEY_QC_FOCUS_POSITION_SCALE, newScalePos);
   6947     }
   6948 
   6949     float prevDiopterPos = getFloat(KEY_QC_FOCUS_POSITION_DIOPTER);
   6950     float newDiopterPos = cur_pos_info.diopter;
   6951     if (prevDiopterPos != newDiopterPos) {
   6952         LOGD("update focus diopter: old:%f, new:%f", prevDiopterPos, newDiopterPos);
   6953         setFloat(KEY_QC_FOCUS_POSITION_DIOPTER, newDiopterPos);
   6954     }
   6955 }
   6956 
   6957 /*===========================================================================
   6958  * FUNCTION   : setSharpness
   6959  *
   6960  * DESCRIPTION: set sharpness control value
   6961  *
   6962  * PARAMETERS :
   6963  *   @sharpness  : sharpness control value
   6964  *
   6965  * RETURN     : int32_t type of status
   6966  *              NO_ERROR  -- success
   6967  *              none-zero failure code
   6968  *==========================================================================*/
   6969 int32_t QCameraParameters::setSharpness(int sharpness)
   6970 {
   6971     char val[16];
   6972     snprintf(val, sizeof(val), "%d", sharpness);
   6973     updateParamEntry(KEY_QC_SHARPNESS, val);
   6974     LOGH("Setting sharpness %s", val);
   6975     m_nSharpness = sharpness;
   6976     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SHARPNESS, m_nSharpness)) {
   6977         return BAD_VALUE;
   6978     }
   6979 
   6980     return NO_ERROR;
   6981 }
   6982 
   6983 /*===========================================================================
   6984  * FUNCTION   : setSkinToneEnhancement
   6985  *
   6986  * DESCRIPTION: set skin tone enhancement value
   6987  *
   6988  * PARAMETERS :
   6989  *   @sceFactore  : skin tone enhancement factor value
   6990  *
   6991  * RETURN     : int32_t type of status
   6992  *              NO_ERROR  -- success
   6993  *              none-zero failure code
   6994  *==========================================================================*/
   6995 int32_t QCameraParameters::setSkinToneEnhancement(int sceFactor)
   6996 {
   6997     char val[16];
   6998     snprintf(val, sizeof(val), "%d", sceFactor);
   6999     updateParamEntry(KEY_QC_SCE_FACTOR, val);
   7000     LOGH("Setting skintone enhancement %s", val);
   7001 
   7002     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SCE_FACTOR, sceFactor)) {
   7003         return BAD_VALUE;
   7004     }
   7005 
   7006     return NO_ERROR;
   7007 }
   7008 
   7009 /*===========================================================================
   7010  * FUNCTION   : setSaturation
   7011  *
   7012  * DESCRIPTION: set saturation control value
   7013  *
   7014  * PARAMETERS :
   7015  *   @saturation : saturation control value
   7016  *
   7017  * RETURN     : int32_t type of status
   7018  *              NO_ERROR  -- success
   7019  *              none-zero failure code
   7020  *==========================================================================*/
   7021 int32_t QCameraParameters::setSaturation(int saturation)
   7022 {
   7023     char val[16];
   7024     snprintf(val, sizeof(val), "%d", saturation);
   7025     updateParamEntry(KEY_QC_SATURATION, val);
   7026     LOGH("Setting saturation %s", val);
   7027 
   7028     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SATURATION, saturation)) {
   7029         return BAD_VALUE;
   7030     }
   7031 
   7032     return NO_ERROR;
   7033 }
   7034 
   7035 /*===========================================================================
   7036  * FUNCTION   : setContrast
   7037  *
   7038  * DESCRIPTION: set contrast control value
   7039  *
   7040  * PARAMETERS :
   7041  *   @contrast : contrast control value
   7042  *
   7043  * RETURN     : int32_t type of status
   7044  *              NO_ERROR  -- success
   7045  *              none-zero failure code
   7046  *==========================================================================*/
   7047 int32_t QCameraParameters::setContrast(int contrast)
   7048 {
   7049     char val[16];
   7050     snprintf(val, sizeof(val), "%d", contrast);
   7051     updateParamEntry(KEY_QC_CONTRAST, val);
   7052     LOGH("Setting contrast %s", val);
   7053 
   7054     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CONTRAST, contrast)) {
   7055         return BAD_VALUE;
   7056     }
   7057 
   7058     return NO_ERROR;
   7059 }
   7060 
   7061 /*===========================================================================
   7062  * FUNCTION   : setSceneDetect
   7063  *
   7064  * DESCRIPTION: set scenen detect value
   7065  *
   7066  * PARAMETERS :
   7067  *   @sceneDetect  : scene detect value string
   7068  *
   7069  * RETURN     : int32_t type of status
   7070  *              NO_ERROR  -- success
   7071  *              none-zero failure code
   7072  *==========================================================================*/
   7073 int32_t QCameraParameters::setSceneDetect(const char *sceneDetect)
   7074 {
   7075     if (sceneDetect != NULL) {
   7076         int32_t value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP),
   7077                 sceneDetect);
   7078         if (value != NAME_NOT_FOUND) {
   7079             LOGH("Setting Scene Detect %s", sceneDetect);
   7080             updateParamEntry(KEY_QC_SCENE_DETECT, sceneDetect);
   7081             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ASD_ENABLE, value)) {
   7082                 return BAD_VALUE;
   7083             }
   7084             return NO_ERROR;
   7085         }
   7086     }
   7087     LOGE("Invalid Scene Detect value: %s",
   7088           (sceneDetect == NULL) ? "NULL" : sceneDetect);
   7089     return BAD_VALUE;
   7090 }
   7091 
   7092 /*===========================================================================
   7093  * FUNCTION   : setSensorSnapshotHDR
   7094  *
   7095  * DESCRIPTION: set snapshot HDR value
   7096  *
   7097  * PARAMETERS :
   7098  *   @snapshotHDR  : snapshot HDR value string
   7099  *
   7100  * RETURN     : int32_t type of status
   7101  *              NO_ERROR  -- success
   7102  *              none-zero failure code
   7103  *==========================================================================*/
   7104 int32_t QCameraParameters::setSensorSnapshotHDR(const char *snapshotHDR)
   7105 {
   7106     if (snapshotHDR != NULL) {
   7107         int32_t value = (cam_sensor_hdr_type_t) lookupAttr(ON_OFF_MODES_MAP,
   7108                 PARAM_MAP_SIZE(ON_OFF_MODES_MAP), snapshotHDR);
   7109         if (value != NAME_NOT_FOUND) {
   7110             LOGH("Setting Sensor Snapshot HDR %s", snapshotHDR);
   7111             updateParamEntry(KEY_QC_SENSOR_HDR, snapshotHDR);
   7112 
   7113             char zz_prop[PROPERTY_VALUE_MAX];
   7114             memset(zz_prop, 0, sizeof(zz_prop));
   7115             property_get("persist.camera.zzhdr.enable", zz_prop, "0");
   7116             uint8_t zzhdr_enable = (uint8_t)atoi(zz_prop);
   7117 
   7118             if (zzhdr_enable && (value != CAM_SENSOR_HDR_OFF)) {
   7119                 value = CAM_SENSOR_HDR_ZIGZAG;
   7120                 LOGH("%s: Overriding to ZZ HDR Mode", __func__);
   7121             }
   7122 
   7123             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SENSOR_HDR, (cam_sensor_hdr_type_t)value)) {
   7124                 return BAD_VALUE;
   7125             }
   7126             return NO_ERROR;
   7127         }
   7128     }
   7129     LOGE("Invalid Snapshot HDR value: %s",
   7130           (snapshotHDR == NULL) ? "NULL" : snapshotHDR);
   7131     return BAD_VALUE;
   7132 
   7133 }
   7134 
   7135 
   7136 /*===========================================================================
   7137  * FUNCTION   : setVideoHDR
   7138  *
   7139  * DESCRIPTION: set video HDR value
   7140  *
   7141  * PARAMETERS :
   7142  *   @videoHDR  : svideo HDR value string
   7143  *
   7144  * RETURN     : int32_t type of status
   7145  *              NO_ERROR  -- success
   7146  *              none-zero failure code
   7147  *==========================================================================*/
   7148 int32_t QCameraParameters::setVideoHDR(const char *videoHDR)
   7149 {
   7150     if (videoHDR != NULL) {
   7151         int32_t value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP), videoHDR);
   7152         if (value != NAME_NOT_FOUND) {
   7153 
   7154             char zz_prop[PROPERTY_VALUE_MAX];
   7155             memset(zz_prop, 0, sizeof(zz_prop));
   7156             property_get("persist.camera.hdr.video", zz_prop, "0");
   7157             uint8_t use_zzhdr_video = (uint8_t)atoi(zz_prop);
   7158 
   7159             if (use_zzhdr_video == CAM_SENSOR_HDR_ZIGZAG) {
   7160                 LOGH("%s: Using ZZ HDR for video mode", __func__);
   7161                 if (value)
   7162                     value = CAM_SENSOR_HDR_ZIGZAG;
   7163                 else
   7164                     value = CAM_SENSOR_HDR_OFF;
   7165                 LOGH("%s: Overriding to sensor HDR Mode to:%d", __func__, value);
   7166                 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SENSOR_HDR, (cam_sensor_hdr_type_t) value)) {
   7167                     LOGE("%s: Override to sensor HDR mode for video HDR failed", __func__);
   7168                     return BAD_VALUE;
   7169                 }
   7170                 updateParamEntry(KEY_QC_VIDEO_HDR, videoHDR);
   7171             } else {
   7172                 LOGH("%s: Setting Video HDR %s", __func__, videoHDR);
   7173                 updateParamEntry(KEY_QC_VIDEO_HDR, videoHDR);
   7174                 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_VIDEO_HDR, value)) {
   7175                     return BAD_VALUE;
   7176                 }
   7177             }
   7178 
   7179             return NO_ERROR;
   7180         }
   7181     }
   7182     LOGE("Invalid Video HDR value: %s",
   7183           (videoHDR == NULL) ? "NULL" : videoHDR);
   7184     return BAD_VALUE;
   7185 }
   7186 
   7187 
   7188 
   7189 /*===========================================================================
   7190  * FUNCTION   : setVtEnable
   7191  *
   7192  * DESCRIPTION: set vt Enable value
   7193  *
   7194  * PARAMETERS :
   7195  *   @videoHDR  : svtEnable value string
   7196  *
   7197  * RETURN     : int32_t type of status
   7198  *              NO_ERROR  -- success
   7199  *              none-zero failure code
   7200  *==========================================================================*/
   7201 int32_t QCameraParameters::setVtEnable(const char *vtEnable)
   7202 {
   7203     if (vtEnable != NULL) {
   7204         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   7205                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), vtEnable);
   7206         if (value != NAME_NOT_FOUND) {
   7207             LOGI("Setting Vt Enable %s", vtEnable);
   7208             m_bAVTimerEnabled = true;
   7209             updateParamEntry(KEY_QC_VT_ENABLE, vtEnable);
   7210             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_VT, value)) {
   7211                 return BAD_VALUE;
   7212             }
   7213             return NO_ERROR;
   7214         }
   7215     }
   7216     LOGE("Invalid Vt Enable value: %s",
   7217           (vtEnable == NULL) ? "NULL" : vtEnable);
   7218     m_bAVTimerEnabled = false;
   7219     return BAD_VALUE;
   7220 }
   7221 
   7222 /*===========================================================================
   7223  * FUNCTION   : setFaceRecognition
   7224  *
   7225  * DESCRIPTION: set face recognition value
   7226  *
   7227  * PARAMETERS :
   7228  *   @faceRecog  : face recognition value string
   7229  *   @maxFaces   : number of max faces to be detected/recognized
   7230  *
   7231  * RETURN     : int32_t type of status
   7232  *              NO_ERROR  -- success
   7233  *              none-zero failure code
   7234  *==========================================================================*/
   7235 int32_t QCameraParameters::setFaceRecognition(const char *faceRecog,
   7236         uint32_t maxFaces)
   7237 {
   7238     if (faceRecog != NULL) {
   7239         int32_t value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP), faceRecog);
   7240         if (value != NAME_NOT_FOUND) {
   7241             LOGH("Setting face recognition %s", faceRecog);
   7242             updateParamEntry(KEY_QC_FACE_RECOGNITION, faceRecog);
   7243 
   7244             uint32_t faceProcMask = m_nFaceProcMask;
   7245             if (value > 0) {
   7246                 faceProcMask |= CAM_FACE_PROCESS_MASK_RECOGNITION;
   7247             } else {
   7248                 faceProcMask &= (uint32_t)(~CAM_FACE_PROCESS_MASK_RECOGNITION);
   7249             }
   7250 
   7251             if(m_nFaceProcMask == faceProcMask) {
   7252                 LOGH("face process mask not changed, no ops here");
   7253                 return NO_ERROR;
   7254             }
   7255             m_nFaceProcMask = faceProcMask;
   7256             LOGH("FaceProcMask -> %d", m_nFaceProcMask);
   7257 
   7258             // set parm for face process
   7259             cam_fd_set_parm_t fd_set_parm;
   7260             memset(&fd_set_parm, 0, sizeof(cam_fd_set_parm_t));
   7261             fd_set_parm.fd_mode = m_nFaceProcMask;
   7262             fd_set_parm.num_fd = maxFaces;
   7263 
   7264             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FD, fd_set_parm)) {
   7265                 return BAD_VALUE;
   7266             }
   7267             return NO_ERROR;
   7268         }
   7269     }
   7270     LOGE("Invalid face recognition value: %s", (faceRecog == NULL) ? "NULL" : faceRecog);
   7271     return BAD_VALUE;
   7272 }
   7273 
   7274 /*===========================================================================
   7275  * FUNCTION   : setZoom
   7276  *
   7277  * DESCRIPTION: set zoom level
   7278  *
   7279  * PARAMETERS :
   7280  *   @zoom_level : zoom level
   7281  *
   7282  * RETURN     : int32_t type of status
   7283  *              NO_ERROR  -- success
   7284  *              none-zero failure code
   7285  *==========================================================================*/
   7286 int32_t QCameraParameters::setZoom(int zoom_level)
   7287 {
   7288     char val[16];
   7289     snprintf(val, sizeof(val), "%d", zoom_level);
   7290     updateParamEntry(KEY_ZOOM, val);
   7291     LOGH("zoom level: %d", zoom_level);
   7292     mZoomLevel = zoom_level;
   7293     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ZOOM, zoom_level)) {
   7294         return BAD_VALUE;
   7295     }
   7296 
   7297     return NO_ERROR;
   7298 }
   7299 
   7300 /*===========================================================================
   7301  * FUNCTION   : setISOValue
   7302  *
   7303  * DESCRIPTION: set ISO value
   7304  *
   7305  * PARAMETERS :
   7306  *   @isoValue : ISO value string
   7307  *
   7308  * RETURN     : int32_t type of status
   7309  *              NO_ERROR  -- success
   7310  *              none-zero failure code
   7311  *==========================================================================*/
   7312 int32_t  QCameraParameters::setISOValue(const char *isoValue)
   7313 {
   7314     if (isoValue != NULL) {
   7315         if (!strcmp(isoValue, ISO_MANUAL)) {
   7316             LOGD("iso manual mode - use continuous iso");
   7317             updateParamEntry(KEY_QC_ISO_MODE, isoValue);
   7318             return NO_ERROR;
   7319         }
   7320         int32_t value = lookupAttr(ISO_MODES_MAP, PARAM_MAP_SIZE(ISO_MODES_MAP), isoValue);
   7321         if (value != NAME_NOT_FOUND) {
   7322             LOGH("Setting ISO value %s", isoValue);
   7323             updateParamEntry(KEY_QC_ISO_MODE, isoValue);
   7324 
   7325             cam_intf_parm_manual_3a_t iso_settings;
   7326             memset(&iso_settings, 0, sizeof(cam_intf_parm_manual_3a_t));
   7327             iso_settings.previewOnly = FALSE;
   7328             iso_settings.value = value;
   7329             if (getManualCaptureMode() != CAM_MANUAL_CAPTURE_TYPE_OFF) {
   7330                 iso_settings.previewOnly = TRUE;
   7331             }
   7332 
   7333             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ISO, iso_settings)) {
   7334                 return BAD_VALUE;
   7335             }
   7336             m_isoValue = value;
   7337             return NO_ERROR;
   7338         }
   7339     }
   7340     LOGE("Invalid ISO value: %s",
   7341           (isoValue == NULL) ? "NULL" : isoValue);
   7342     return BAD_VALUE;
   7343 }
   7344 
   7345 
   7346 /*===========================================================================
   7347  * FUNCTION   : setContinuousISO
   7348  *
   7349  * DESCRIPTION: set continuous ISO value
   7350  *
   7351  * PARAMETERS :
   7352  *   @params : ISO value parameter
   7353  *
   7354  * RETURN     : int32_t type of status
   7355  *              NO_ERROR  -- success
   7356  *              none-zero failure code
   7357  *==========================================================================*/
   7358 int32_t  QCameraParameters::setContinuousISO(const QCameraParameters& params)
   7359 {
   7360     const char *iso = params.get(KEY_QC_ISO_MODE);
   7361     LOGD("current iso mode: %s", iso);
   7362 
   7363     if (iso != NULL) {
   7364         if (strcmp(iso, ISO_MANUAL)) {
   7365             LOGD("dont set iso to back-end.");
   7366             return NO_ERROR;
   7367         }
   7368     }
   7369 
   7370     const char *str = params.get(KEY_QC_CONTINUOUS_ISO);
   7371     const char *prev_str = get(KEY_QC_CONTINUOUS_ISO);
   7372     if (str != NULL) {
   7373         if (prev_str == NULL ||
   7374             strcmp(str, prev_str) != 0) {
   7375             return setContinuousISO(str);
   7376         }
   7377     }
   7378     return NO_ERROR;
   7379 }
   7380 
   7381 /*===========================================================================
   7382  * FUNCTION   : setExposureTime
   7383  *
   7384  * DESCRIPTION: set exposure time
   7385  *
   7386  * PARAMETERS :
   7387  *   @expTimeStr : string of exposure time in ms
   7388  *
   7389  * RETURN     : int32_t type of status
   7390  *              NO_ERROR  -- success
   7391  *              none-zero failure code
   7392  *==========================================================================*/
   7393 int32_t  QCameraParameters::setExposureTime(const char *expTimeStr)
   7394 {
   7395     if (expTimeStr != NULL) {
   7396         double expTimeMs = atof(expTimeStr);
   7397         //input is in milli seconds. Convert to nano sec for backend
   7398         int64_t expTimeNs = (int64_t)(expTimeMs*1000000L);
   7399 
   7400         // expTime == 0 means not to use manual exposure time.
   7401         if ((0 <= expTimeNs) &&
   7402                 ((expTimeNs == 0) ||
   7403                 ((expTimeNs >= m_pCapability->exposure_time_range[0]) &&
   7404                 (expTimeNs <= m_pCapability->exposure_time_range[1])))) {
   7405             LOGH(", exposure time: %f ms", expTimeMs);
   7406             updateParamEntry(KEY_QC_EXPOSURE_TIME, expTimeStr);
   7407 
   7408             cam_intf_parm_manual_3a_t exp_settings;
   7409             memset(&exp_settings, 0, sizeof(cam_intf_parm_manual_3a_t));
   7410             if (getManualCaptureMode() != CAM_MANUAL_CAPTURE_TYPE_OFF) {
   7411                 exp_settings.previewOnly = TRUE;
   7412                 if (expTimeMs < QCAMERA_MAX_EXP_TIME_LEVEL1) {
   7413                     exp_settings.value = expTimeNs;
   7414                 } else {
   7415                     exp_settings.value =
   7416                             (int64_t)(QCAMERA_MAX_EXP_TIME_LEVEL1*1000000L);
   7417                 }
   7418             } else {
   7419                 exp_settings.previewOnly = FALSE;
   7420                 exp_settings.value = expTimeNs;
   7421             }
   7422 
   7423             //Based on exposure values we can decide the capture type here
   7424             if (getManualCaptureMode() != CAM_MANUAL_CAPTURE_TYPE_OFF) {
   7425                 if (expTimeMs < QCAMERA_MAX_EXP_TIME_LEVEL1) {
   7426                     setManualCaptureMode(CAM_MANUAL_CAPTURE_TYPE_1);
   7427                 } else if (expTimeMs < QCAMERA_MAX_EXP_TIME_LEVEL2) {
   7428                     setManualCaptureMode(CAM_MANUAL_CAPTURE_TYPE_2);
   7429                 } else if (expTimeMs < QCAMERA_MAX_EXP_TIME_LEVEL4) {
   7430                     setManualCaptureMode(CAM_MANUAL_CAPTURE_TYPE_3);
   7431                 } else {
   7432                     setManualCaptureMode(CAM_MANUAL_CAPTURE_TYPE_OFF);
   7433                 }
   7434             }
   7435 
   7436             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_EXPOSURE_TIME,
   7437                     exp_settings)) {
   7438                 return BAD_VALUE;
   7439             }
   7440             m_expTime = expTimeNs;
   7441 
   7442             return NO_ERROR;
   7443         }
   7444     }
   7445 
   7446     LOGE("Invalid exposure time, value: %s",
   7447           (expTimeStr == NULL) ? "NULL" : expTimeStr);
   7448     return BAD_VALUE;
   7449 }
   7450 
   7451 /*===========================================================================
   7452  * FUNCTION   : setLongshotEnable
   7453  *
   7454  * DESCRIPTION: set a flag indicating longshot mode
   7455  *
   7456  * PARAMETERS :
   7457  *   @enable  : true - Longshot enabled
   7458  *              false - Longshot disabled
   7459  *
   7460  * RETURN     : int32_t type of status
   7461  *              NO_ERROR  -- success
   7462  *              none-zero failure code
   7463  *==========================================================================*/
   7464 int32_t QCameraParameters::setLongshotEnable(bool enable)
   7465 {
   7466     int32_t rc = NO_ERROR;
   7467     int8_t value = enable ? 1 : 0;
   7468 
   7469     if(initBatchUpdate() < 0 ) {
   7470         LOGE("Failed to initialize group update table");
   7471         return BAD_TYPE;
   7472     }
   7473 
   7474     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_LONGSHOT_ENABLE, value)) {
   7475         LOGE("Failed to update table");
   7476         return BAD_VALUE;
   7477     }
   7478 
   7479     rc = commitSetBatch();
   7480     if (rc != NO_ERROR) {
   7481         LOGE("Failed to parameter changes");
   7482         return rc;
   7483     }
   7484 
   7485     m_bLongshotEnabled = enable;
   7486 
   7487     return rc;
   7488 }
   7489 
   7490 /*===========================================================================
   7491  * FUNCTION   : setFlash
   7492  *
   7493  * DESCRIPTION: set flash mode
   7494  *
   7495  * PARAMETERS :
   7496  *   @flashStr : LED flash mode value string
   7497  *
   7498  * RETURN     : int32_t type of status
   7499  *              NO_ERROR  -- success
   7500  *              none-zero failure code
   7501  *==========================================================================*/
   7502 int32_t QCameraParameters::setFlash(const char *flashStr)
   7503 {
   7504     if (flashStr != NULL) {
   7505         int32_t value = lookupAttr(FLASH_MODES_MAP, PARAM_MAP_SIZE(FLASH_MODES_MAP), flashStr);
   7506         if (value != NAME_NOT_FOUND) {
   7507             LOGH("Setting Flash value %s", flashStr);
   7508             updateParamEntry(KEY_FLASH_MODE, flashStr);
   7509             mFlashValue = value;
   7510             return NO_ERROR;
   7511         }
   7512     }
   7513     LOGE("Invalid flash value: %s", (flashStr == NULL) ? "NULL" : flashStr);
   7514     return BAD_VALUE;
   7515 }
   7516 
   7517 /*===========================================================================
   7518  * FUNCTION   : updateFlashMode
   7519  *
   7520  * DESCRIPTION: update flash mode
   7521  *
   7522  * PARAMETERS :
   7523  *   @flashStr : LED flash mode value
   7524  *
   7525  * RETURN     : int32_t type of status
   7526  *              NO_ERROR  -- success
   7527  *              none-zero failure code
   7528  *==========================================================================*/
   7529 int32_t QCameraParameters::updateFlashMode(cam_flash_mode_t flash_mode)
   7530 {
   7531     int32_t rc = NO_ERROR;
   7532     if (flash_mode >= CAM_FLASH_MODE_MAX) {
   7533         LOGH("Error!! Invalid flash mode (%d)", flash_mode);
   7534         return BAD_VALUE;
   7535     }
   7536     LOGH("Setting Flash mode from EZTune %d", flash_mode);
   7537 
   7538     const char *flash_mode_str = lookupNameByValue(FLASH_MODES_MAP,
   7539             PARAM_MAP_SIZE(FLASH_MODES_MAP), flash_mode);
   7540     if(initBatchUpdate() < 0 ) {
   7541         LOGE("Failed to initialize group update table");
   7542         return BAD_TYPE;
   7543     }
   7544     rc = setFlash(flash_mode_str);
   7545     if (rc != NO_ERROR) {
   7546         LOGE("Failed to update Flash mode");
   7547         return rc;
   7548     }
   7549 
   7550     LOGH("Setting Flash mode %d", mFlashValue);
   7551     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_LED_MODE, mFlashValue)) {
   7552         LOGE("Failed to set led mode");
   7553         return BAD_VALUE;
   7554     }
   7555 
   7556     rc = commitSetBatch();
   7557     if (rc != NO_ERROR) {
   7558         LOGE("Failed to commit parameters");
   7559         return rc;
   7560     }
   7561 
   7562     return NO_ERROR;
   7563 }
   7564 
   7565 
   7566 /*===========================================================================
   7567  * FUNCTION   : configureFlash
   7568  *
   7569  * DESCRIPTION: configure Flash Bracketing.
   7570  *
   7571  * PARAMETERS :
   7572  *    @frame_config : output configuration structure to fill in.
   7573  *
   7574  * RETURN     : int32_t type of status
   7575  *              NO_ERROR  -- success
   7576  *              none-zero failure code
   7577  *==========================================================================*/
   7578 int32_t QCameraParameters::configureFlash(cam_capture_frame_config_t &frame_config)
   7579 {
   7580     LOGH("E");
   7581     int32_t rc = NO_ERROR;
   7582     uint32_t i = 0;
   7583 
   7584     if (isChromaFlashEnabled()) {
   7585 
   7586         rc = setToneMapMode(false, false);
   7587         if (rc != NO_ERROR) {
   7588             LOGE("Failed to configure tone map");
   7589             return rc;
   7590         }
   7591 
   7592         rc = setCDSMode(CAM_CDS_MODE_OFF, false);
   7593         if (rc != NO_ERROR) {
   7594             LOGE("Failed to configure csd mode");
   7595             return rc;
   7596         }
   7597 
   7598         LOGH("Enable Chroma Flash capture");
   7599         cam_flash_mode_t flash_mode = CAM_FLASH_MODE_OFF;
   7600         frame_config.num_batch =
   7601                 m_pCapability->chroma_flash_settings_need.burst_count;
   7602         if (frame_config.num_batch > CAM_MAX_FLASH_BRACKETING) {
   7603             frame_config.num_batch = CAM_MAX_FLASH_BRACKETING;
   7604         }
   7605         for (i = 0; i < frame_config.num_batch; i++) {
   7606             flash_mode = (m_pCapability->chroma_flash_settings_need.flash_bracketing[i]) ?
   7607                     CAM_FLASH_MODE_ON:CAM_FLASH_MODE_OFF;
   7608             frame_config.configs[i].num_frames = 1;
   7609             frame_config.configs[i].type = CAM_CAPTURE_FLASH;
   7610             frame_config.configs[i].flash_mode = flash_mode;
   7611         }
   7612     } else if (mFlashValue != CAM_FLASH_MODE_OFF) {
   7613         frame_config.num_batch = 1;
   7614         for (i = 0; i < frame_config.num_batch; i++) {
   7615             frame_config.configs[i].num_frames = getNumOfSnapshots();
   7616             frame_config.configs[i].type = CAM_CAPTURE_FLASH;
   7617             frame_config.configs[i].flash_mode =(cam_flash_mode_t)mFlashValue;
   7618         }
   7619     }
   7620 
   7621     LOGD("Flash frame batch cnt = %d",frame_config.num_batch);
   7622     return rc;
   7623 }
   7624 
   7625 /*===========================================================================
   7626  * FUNCTION   : configureHDRBracketing
   7627  *
   7628  * DESCRIPTION: configure HDR Bracketing.
   7629  *
   7630  * PARAMETERS :
   7631  *    @frame_config : output configuration structure to fill in.
   7632  *
   7633  * RETURN     : int32_t type of status
   7634  *              NO_ERROR  -- success
   7635  *              none-zero failure code
   7636  *==========================================================================*/
   7637 int32_t QCameraParameters::configureHDRBracketing(cam_capture_frame_config_t &frame_config)
   7638 {
   7639     LOGH("E");
   7640     int32_t rc = NO_ERROR;
   7641     uint32_t i = 0;
   7642 
   7643     uint32_t hdrFrameCount = m_pCapability->hdr_bracketing_setting.num_frames;
   7644     LOGH("HDR values %d, %d frame count: %u",
   7645           (int8_t) m_pCapability->hdr_bracketing_setting.exp_val.values[0],
   7646           (int8_t) m_pCapability->hdr_bracketing_setting.exp_val.values[1],
   7647           hdrFrameCount);
   7648 
   7649     frame_config.num_batch = hdrFrameCount;
   7650 
   7651     cam_bracket_mode mode =
   7652             m_pCapability->hdr_bracketing_setting.exp_val.mode;
   7653     if (mode == CAM_EXP_BRACKETING_ON) {
   7654         rc = setToneMapMode(false, true);
   7655         if (rc != NO_ERROR) {
   7656             LOGW("Failed to disable tone map during HDR");
   7657         }
   7658     }
   7659     for (i = 0; i < frame_config.num_batch; i++) {
   7660         frame_config.configs[i].num_frames = 1;
   7661         frame_config.configs[i].type = CAM_CAPTURE_BRACKETING;
   7662         frame_config.configs[i].hdr_mode.mode = mode;
   7663         frame_config.configs[i].hdr_mode.values =
   7664                 m_pCapability->hdr_bracketing_setting.exp_val.values[i];
   7665         LOGD("exp values %d",
   7666                 (int)frame_config.configs[i].hdr_mode.values);
   7667     }
   7668     return rc;
   7669 }
   7670 
   7671 /*===========================================================================
   7672  * FUNCTION   : configureAEBracketing
   7673  *
   7674  * DESCRIPTION: configure AE Bracketing.
   7675  *
   7676  * PARAMETERS :
   7677  *    @frame_config : output configuration structure to fill in.
   7678  *
   7679  * RETURN     : int32_t type of status
   7680  *              NO_ERROR  -- success
   7681  *              none-zero failure code
   7682  *==========================================================================*/
   7683 int32_t QCameraParameters::configureAEBracketing(cam_capture_frame_config_t &frame_config)
   7684 {
   7685     LOGH("E");
   7686     int32_t rc = NO_ERROR;
   7687     uint32_t i = 0;
   7688     char exp_value[MAX_EXP_BRACKETING_LENGTH];
   7689 
   7690     rc = setToneMapMode(false, true);
   7691     if (rc != NO_ERROR) {
   7692         LOGH("Failed to disable tone map during AEBracketing");
   7693     }
   7694 
   7695     uint32_t burstCount = 0;
   7696     const char *str_val = m_AEBracketingClient.values;
   7697     if ((str_val != NULL) && (strlen(str_val) > 0)) {
   7698         char prop[PROPERTY_VALUE_MAX];
   7699         memset(prop, 0, sizeof(prop));
   7700         strlcpy(prop, str_val, PROPERTY_VALUE_MAX);
   7701         char *saveptr = NULL;
   7702         char *token = strtok_r(prop, ",", &saveptr);
   7703         if (token != NULL) {
   7704             exp_value[burstCount++] = (char)atoi(token);
   7705             while (token != NULL) {
   7706                 token = strtok_r(NULL, ",", &saveptr);
   7707                 if (token != NULL) {
   7708                     exp_value[burstCount++] = (char)atoi(token);
   7709                 }
   7710             }
   7711         }
   7712     }
   7713 
   7714     frame_config.num_batch = burstCount;
   7715     cam_bracket_mode mode = m_AEBracketingClient.mode;
   7716 
   7717     for (i = 0; i < frame_config.num_batch; i++) {
   7718         frame_config.configs[i].num_frames = 1;
   7719         frame_config.configs[i].type = CAM_CAPTURE_BRACKETING;
   7720         frame_config.configs[i].hdr_mode.mode = mode;
   7721         frame_config.configs[i].hdr_mode.values =
   7722                 m_AEBracketingClient.values[i];
   7723         LOGD("exp values %d", (int)m_AEBracketingClient.values[i]);
   7724     }
   7725 
   7726     LOGH("num_frame = %d X", burstCount);
   7727     return rc;
   7728 }
   7729 
   7730 /*===========================================================================
   7731  * FUNCTION   : configureLowLight
   7732  *
   7733  * DESCRIPTION: configure low light frame capture use case.
   7734  *
   7735  * PARAMETERS :
   7736  *    @frame_config : output configuration structure to fill in.
   7737  *
   7738  * RETURN     : int32_t type of status
   7739  *              NO_ERROR  -- success
   7740  *              none-zero failure code
   7741  *==========================================================================*/
   7742 int32_t QCameraParameters::configureLowLight(cam_capture_frame_config_t &frame_config)
   7743 {
   7744     int32_t rc = NO_ERROR;
   7745 
   7746     frame_config.num_batch = 1;
   7747     frame_config.configs[0].num_frames = getNumOfSnapshots();
   7748     frame_config.configs[0].type = CAM_CAPTURE_LOW_LIGHT;
   7749     frame_config.configs[0].low_light_mode = CAM_LOW_LIGHT_ON;
   7750     LOGH("Snapshot Count: %d", frame_config.configs[0].num_frames);
   7751     return rc;
   7752 }
   7753 
   7754 /*===========================================================================
   7755  * FUNCTION   : configureManualCapture
   7756  *
   7757  * DESCRIPTION: configure manual capture.
   7758  *
   7759  * PARAMETERS :
   7760  *    @frame_config : output configaration structure to fill in.
   7761  *
   7762  * RETURN     : int32_t type of status
   7763  *              NO_ERROR  -- success
   7764  *              none-zero failure code
   7765  *==========================================================================*/
   7766 int32_t QCameraParameters::configureManualCapture(cam_capture_frame_config_t &frame_config)
   7767 {
   7768     int32_t rc = NO_ERROR;
   7769     uint32_t i = 0;
   7770 
   7771     LOGD("E");
   7772     if (getManualCaptureMode()) {
   7773         frame_config.num_batch = 1;
   7774         for (i = 0; i < frame_config.num_batch; i++) {
   7775             frame_config.configs[i].num_frames = getNumOfSnapshots();
   7776             frame_config.configs[i].type = CAM_CAPTURE_MANUAL_3A;
   7777             if (m_expTime != 0) {
   7778                 frame_config.configs[i].manual_3A_mode.exp_mode = CAM_SETTINGS_TYPE_ON;
   7779                 frame_config.configs[i].manual_3A_mode.exp_time = m_expTime;
   7780             } else {
   7781                 frame_config.configs[i].manual_3A_mode.exp_mode = CAM_SETTINGS_TYPE_AUTO;
   7782                 frame_config.configs[i].manual_3A_mode.exp_time = 0;
   7783             }
   7784 
   7785             if (m_isoValue != 0) {
   7786                 frame_config.configs[i].manual_3A_mode.iso_mode = CAM_SETTINGS_TYPE_ON;
   7787                 frame_config.configs[i].manual_3A_mode.iso_value = m_isoValue;
   7788             } else {
   7789                 frame_config.configs[i].manual_3A_mode.iso_mode = CAM_SETTINGS_TYPE_AUTO;
   7790                 frame_config.configs[i].manual_3A_mode.iso_value = 0;
   7791             }
   7792         }
   7793     }
   7794     LOGD("X: batch cnt = %d", frame_config.num_batch);
   7795     return rc;
   7796 }
   7797 
   7798 /*===========================================================================
   7799  * FUNCTION   : configFrameCapture
   7800  *
   7801  * DESCRIPTION: configuration for ZSL special captures (FLASH/HDR etc)
   7802  *
   7803  * PARAMETERS :
   7804  *   @commitSettings : flag to enable or disable commit this this settings
   7805  *
   7806  * RETURN     : int32_t type of status
   7807  *              NO_ERROR  -- success
   7808  *              none-zero failure code
   7809  *==========================================================================*/
   7810 int32_t QCameraParameters::configFrameCapture(bool commitSettings)
   7811 {
   7812     int32_t rc = NO_ERROR;
   7813     int32_t value;
   7814 
   7815     memset(&m_captureFrameConfig, 0, sizeof(cam_capture_frame_config_t));
   7816 
   7817     if (commitSettings) {
   7818         if(initBatchUpdate() < 0 ) {
   7819             LOGE("Failed to initialize group update table");
   7820             return BAD_TYPE;
   7821         }
   7822     }
   7823 
   7824     if (isHDREnabled() || m_bAeBracketingEnabled || m_bAFBracketingOn ||
   7825           m_bOptiZoomOn || m_bReFocusOn || getManualCaptureMode()) {
   7826         value = CAM_FLASH_MODE_OFF;
   7827     } else if (isChromaFlashEnabled()) {
   7828         value = CAM_FLASH_MODE_ON;
   7829     } else {
   7830         value = mFlashValue;
   7831     }
   7832 
   7833     if (m_LowLightLevel && (value != CAM_FLASH_MODE_ON)) {
   7834         configureLowLight (m_captureFrameConfig);
   7835 
   7836         //Added reset capture type as a last batch for back-end to restore settings.
   7837         int32_t batch_count = m_captureFrameConfig.num_batch;
   7838         m_captureFrameConfig.configs[batch_count].type = CAM_CAPTURE_RESET;
   7839         m_captureFrameConfig.configs[batch_count].num_frames = 0;
   7840         m_captureFrameConfig.num_batch++;
   7841     } else if (value != CAM_FLASH_MODE_OFF) {
   7842         configureFlash(m_captureFrameConfig);
   7843     } else if(isHDREnabled()) {
   7844         configureHDRBracketing (m_captureFrameConfig);
   7845     } else if(isAEBracketEnabled()) {
   7846         configureAEBracketing (m_captureFrameConfig);
   7847     } else if (getManualCaptureMode() >= CAM_MANUAL_CAPTURE_TYPE_2){
   7848         rc = configureManualCapture (m_captureFrameConfig);
   7849         //Added reset capture type as a last batch for back-end to restore settings.
   7850         int32_t batch_count = m_captureFrameConfig.num_batch;
   7851         m_captureFrameConfig.configs[batch_count].type = CAM_CAPTURE_RESET;
   7852         m_captureFrameConfig.configs[batch_count].num_frames = 0;
   7853         m_captureFrameConfig.num_batch++;
   7854     }
   7855 
   7856     rc = ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CAPTURE_FRAME_CONFIG,
   7857             (cam_capture_frame_config_t)m_captureFrameConfig);
   7858     if (rc != NO_ERROR) {
   7859         rc = BAD_VALUE;
   7860         LOGE("Failed to set capture settings");
   7861         return rc;
   7862     }
   7863 
   7864     if (commitSettings) {
   7865         rc = commitSetBatch();
   7866         if (rc != NO_ERROR) {
   7867             LOGE("Failed to commit parameters");
   7868             return rc;
   7869         }
   7870     }
   7871     return rc;
   7872 }
   7873 
   7874 /*===========================================================================
   7875  * FUNCTION   : resetFrameCapture
   7876  *
   7877  * DESCRIPTION: reset special captures settings(FLASH/HDR etc)
   7878  *
   7879  * PARAMETERS :
   7880  *   @commitSettings : flag to enable or disable commit this this settings
   7881  *   @lowLightEnabled: flag to indicate if low light scene detected
   7882  *
   7883  * RETURN     : int32_t type of status
   7884  *              NO_ERROR  -- success
   7885  *              none-zero failure code
   7886  *==========================================================================*/
   7887 int32_t QCameraParameters::resetFrameCapture(bool commitSettings, bool lowLightEnabled)
   7888 {
   7889     int32_t rc = NO_ERROR;
   7890     memset(&m_captureFrameConfig, 0, sizeof(cam_capture_frame_config_t));
   7891 
   7892     if (commitSettings) {
   7893         if(initBatchUpdate() < 0 ) {
   7894             LOGE("Failed to initialize group update table");
   7895             return BAD_TYPE;
   7896         }
   7897     }
   7898 
   7899     if (isHDREnabled() || isAEBracketEnabled()) {
   7900         rc = setToneMapMode(true, true);
   7901         if (rc != NO_ERROR) {
   7902             LOGH("Failed to enable tone map during HDR/AEBracketing");
   7903         }
   7904         rc = stopAEBracket();
   7905     } else if ((isChromaFlashEnabled()) || (mFlashValue != CAM_FLASH_MODE_OFF)
   7906             || (lowLightEnabled == true)) {
   7907         rc = setToneMapMode(true, false);
   7908         if (rc != NO_ERROR) {
   7909             LOGH("Failed to enable tone map during chroma flash");
   7910         }
   7911 
   7912         rc = setCDSMode(mCds_mode, false);
   7913         if (rc != NO_ERROR) {
   7914             LOGE("Failed to configure csd mode");
   7915             return rc;
   7916         }
   7917     }
   7918 
   7919     rc = ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CAPTURE_FRAME_CONFIG,
   7920             (cam_capture_frame_config_t)m_captureFrameConfig);
   7921     if (rc != NO_ERROR) {
   7922         rc = BAD_VALUE;
   7923         LOGE("Failed to set capture settings");
   7924         return rc;
   7925     }
   7926 
   7927     if (commitSettings) {
   7928         rc = commitSetBatch();
   7929         if (rc != NO_ERROR) {
   7930             LOGE("Failed to commit parameters");
   7931             return rc;
   7932         }
   7933     }
   7934     return rc;
   7935 }
   7936 
   7937 /*===========================================================================
   7938  * FUNCTION   : setAecLock
   7939  *
   7940  * DESCRIPTION: set AEC lock value
   7941  *
   7942  * PARAMETERS :
   7943  *   @aecLockStr : AEC lock value string
   7944  *
   7945  * RETURN     : int32_t type of status
   7946  *              NO_ERROR  -- success
   7947  *              none-zero failure code
   7948  *==========================================================================*/
   7949 int32_t QCameraParameters::setAecLock(const char *aecLockStr)
   7950 {
   7951     if (aecLockStr != NULL) {
   7952         int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP, PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP),
   7953                 aecLockStr);
   7954         if (value != NAME_NOT_FOUND) {
   7955             LOGH("Setting AECLock value %s", aecLockStr);
   7956             updateParamEntry(KEY_AUTO_EXPOSURE_LOCK, aecLockStr);
   7957             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   7958                     CAM_INTF_PARM_AEC_LOCK, (uint32_t)value)) {
   7959                 return BAD_VALUE;
   7960             }
   7961             return NO_ERROR;
   7962         }
   7963     }
   7964     LOGE("Invalid AECLock value: %s",
   7965         (aecLockStr == NULL) ? "NULL" : aecLockStr);
   7966     return BAD_VALUE;
   7967 }
   7968 
   7969 /*===========================================================================
   7970  * FUNCTION   : setAwbLock
   7971  *
   7972  * DESCRIPTION: set AWB lock value
   7973  *
   7974  * PARAMETERS :
   7975  *   @awbLockStr : AWB lock value string
   7976  *
   7977  * RETURN     : int32_t type of status
   7978  *              NO_ERROR  -- success
   7979  *              none-zero failure code
   7980  *==========================================================================*/
   7981 int32_t QCameraParameters::setAwbLock(const char *awbLockStr)
   7982 {
   7983     if (awbLockStr != NULL) {
   7984         int32_t value = lookupAttr(TRUE_FALSE_MODES_MAP, PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP),
   7985                 awbLockStr);
   7986         if (value != NAME_NOT_FOUND) {
   7987             LOGH("Setting AWBLock value %s", awbLockStr);
   7988             updateParamEntry(KEY_AUTO_WHITEBALANCE_LOCK, awbLockStr);
   7989             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   7990                     CAM_INTF_PARM_AWB_LOCK, (uint32_t)value)) {
   7991                 return BAD_VALUE;
   7992             }
   7993             return NO_ERROR;
   7994         }
   7995     }
   7996     LOGE("Invalid AWBLock value: %s", (awbLockStr == NULL) ? "NULL" : awbLockStr);
   7997     return BAD_VALUE;
   7998 }
   7999 
   8000 /*===========================================================================
   8001  * FUNCTION   : setMCEValue
   8002  *
   8003  * DESCRIPTION: set memory color enhancement value
   8004  *
   8005  * PARAMETERS :
   8006  *   @mceStr : MCE value string
   8007  *
   8008  * RETURN     : int32_t type of status
   8009  *              NO_ERROR  -- success
   8010  *              none-zero failure code
   8011  *==========================================================================*/
   8012 int32_t QCameraParameters::setMCEValue(const char *mceStr)
   8013 {
   8014     if (mceStr != NULL) {
   8015         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   8016                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), mceStr);
   8017         if (value != NAME_NOT_FOUND) {
   8018             LOGH("Setting AWBLock value %s", mceStr);
   8019             updateParamEntry(KEY_QC_MEMORY_COLOR_ENHANCEMENT, mceStr);
   8020             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_MCE, value)) {
   8021                 return BAD_VALUE;
   8022             }
   8023             return NO_ERROR;
   8024         }
   8025     }
   8026     LOGE("Invalid MCE value: %s", (mceStr == NULL) ? "NULL" : mceStr);
   8027     return BAD_VALUE;
   8028 }
   8029 
   8030 /*===========================================================================
   8031  * FUNCTION   : setTintlessValue
   8032  *
   8033  * DESCRIPTION: enable/disable tintless from user setting
   8034  *
   8035  * PARAMETERS :
   8036  *   @params  : user setting parameters
   8037  *
   8038  * RETURN     : int32_t type of status
   8039  *              NO_ERROR  -- success
   8040  *              none-zero failure code
   8041  *==========================================================================*/
   8042 int32_t QCameraParameters::setTintlessValue(const QCameraParameters& params)
   8043 {
   8044     const char *str = params.get(KEY_QC_TINTLESS_ENABLE);
   8045     const char *prev_str = get(KEY_QC_TINTLESS_ENABLE);
   8046     char prop[PROPERTY_VALUE_MAX];
   8047 
   8048     memset(prop, 0, sizeof(prop));
   8049     property_get("persist.camera.tintless", prop, VALUE_ENABLE);
   8050     if (str != NULL) {
   8051         if (prev_str == NULL ||
   8052             strcmp(str, prev_str) != 0) {
   8053             return setTintlessValue(str);
   8054         }
   8055     } else {
   8056         if (prev_str == NULL ||
   8057             strcmp(prev_str, prop) != 0 ) {
   8058             setTintlessValue(prop);
   8059         }
   8060     }
   8061 
   8062     return NO_ERROR;
   8063 }
   8064 
   8065 /*===========================================================================
   8066  * FUNCTION   : setTintless
   8067  *
   8068  * DESCRIPTION: set tintless mode
   8069  *
   8070  * PARAMETERS :
   8071  *   @enable : 1 = enable, 0 = disable
   8072  *
   8073  * RETURN     : int32_t type of status
   8074  *              NO_ERROR  -- success
   8075  *              none-zero failure code
   8076  *==========================================================================*/
   8077 void QCameraParameters::setTintless(bool enable)
   8078 {
   8079     if (enable) {
   8080         setTintlessValue(VALUE_ENABLE);
   8081     } else {
   8082         setTintlessValue(VALUE_DISABLE);
   8083     }
   8084 }
   8085 
   8086 /*===========================================================================
   8087  * FUNCTION   : setTintlessValue
   8088  *
   8089  * DESCRIPTION: set tintless value
   8090  *
   8091  * PARAMETERS :
   8092  *   @tintStr : Tintless value string
   8093  *
   8094  * RETURN     : int32_t type of status
   8095  *              NO_ERROR  -- success
   8096  *              none-zero failure code
   8097  *==========================================================================*/
   8098 int32_t QCameraParameters::setTintlessValue(const char *tintStr)
   8099 {
   8100     if (tintStr != NULL) {
   8101         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   8102                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), tintStr);
   8103         if (value != NAME_NOT_FOUND) {
   8104             LOGH("Setting Tintless value %s", tintStr);
   8105             updateParamEntry(KEY_QC_TINTLESS_ENABLE, tintStr);
   8106             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_TINTLESS, value)) {
   8107                 return BAD_VALUE;
   8108             }
   8109             return NO_ERROR;
   8110         }
   8111     }
   8112     LOGE("Invalid Tintless value: %s", (tintStr == NULL) ? "NULL" : tintStr);
   8113     return BAD_VALUE;
   8114 }
   8115 
   8116 /*===========================================================================
   8117  * FUNCTION   : setCDSMode
   8118  *
   8119  * DESCRIPTION: Set CDS mode
   8120  *
   8121  * PARAMETERS :
   8122  *   @params  : user setting parameters
   8123  *
   8124  * RETURN     : int32_t type of status
   8125  *              NO_ERROR  -- success
   8126  *              none-zero failure code
   8127  *==========================================================================*/
   8128 int32_t QCameraParameters::setCDSMode(const QCameraParameters& params)
   8129 {
   8130     const char *str = params.get(KEY_QC_CDS_MODE);
   8131     const char *prev_str = get(KEY_QC_CDS_MODE);
   8132     const char *video_str = params.get(KEY_QC_VIDEO_CDS_MODE);
   8133     const char *video_prev_str = get(KEY_QC_VIDEO_CDS_MODE);
   8134     int32_t rc = NO_ERROR;
   8135 
   8136     if (m_bRecordingHint_new == true) {
   8137         if (video_str) {
   8138             if ((video_prev_str == NULL) || (strcmp(video_str, video_prev_str) != 0)) {
   8139                 int32_t cds_mode = lookupAttr(CDS_MODES_MAP, PARAM_MAP_SIZE(CDS_MODES_MAP),
   8140                         video_str);
   8141                 if (cds_mode != NAME_NOT_FOUND) {
   8142                     updateParamEntry(KEY_QC_VIDEO_CDS_MODE, video_str);
   8143                     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
   8144                         LOGE("Failed CDS MODE to update table");
   8145                         rc = BAD_VALUE;
   8146                     } else {
   8147                         LOGD("Set CDS in video mode = %d", cds_mode);
   8148                         mCds_mode = cds_mode;
   8149                         m_bNeedRestart = true;
   8150                     }
   8151                 } else {
   8152                     LOGE("Invalid argument for video CDS MODE %d",  cds_mode);
   8153                     rc = BAD_VALUE;
   8154                 }
   8155             }
   8156         } else {
   8157             char video_prop[PROPERTY_VALUE_MAX];
   8158             memset(video_prop, 0, sizeof(video_prop));
   8159             property_get("persist.camera.video.CDS", video_prop, CDS_MODE_ON);
   8160             int32_t cds_mode = lookupAttr(CDS_MODES_MAP, PARAM_MAP_SIZE(CDS_MODES_MAP),
   8161                     video_prop);
   8162             if (cds_mode != NAME_NOT_FOUND) {
   8163                 updateParamEntry(KEY_QC_VIDEO_CDS_MODE, video_prop);
   8164                 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
   8165                     LOGE("Failed CDS MODE to update table");
   8166                     rc = BAD_VALUE;
   8167                 } else {
   8168                     LOGD("Set CDS in video mode from setprop = %d", cds_mode);
   8169                     mCds_mode = cds_mode;
   8170                 }
   8171             } else {
   8172                 LOGE("Invalid prop for video CDS MODE %d",  cds_mode);
   8173                 rc = BAD_VALUE;
   8174             }
   8175         }
   8176     } else {
   8177         if (str) {
   8178             if ((prev_str == NULL) || (strcmp(str, prev_str) != 0)) {
   8179                 int32_t cds_mode = lookupAttr(CDS_MODES_MAP, PARAM_MAP_SIZE(CDS_MODES_MAP),
   8180                         str);
   8181                 if (cds_mode != NAME_NOT_FOUND) {
   8182                     updateParamEntry(KEY_QC_CDS_MODE, str);
   8183                     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
   8184                         LOGE("Failed CDS MODE to update table");
   8185                         rc = BAD_VALUE;
   8186                     } else {
   8187                         LOGD("Set CDS in capture mode = %d", cds_mode);
   8188                         mCds_mode = cds_mode;
   8189                         m_bNeedRestart = true;
   8190                     }
   8191                 } else {
   8192                     LOGE("Invalid argument for snapshot CDS MODE %d",  cds_mode);
   8193                     rc = BAD_VALUE;
   8194                 }
   8195             }
   8196         } else {
   8197             char prop[PROPERTY_VALUE_MAX];
   8198             memset(prop, 0, sizeof(prop));
   8199             property_get("persist.camera.CDS", prop, CDS_MODE_ON);
   8200             int32_t cds_mode = lookupAttr(CDS_MODES_MAP, PARAM_MAP_SIZE(CDS_MODES_MAP),
   8201                     prop);
   8202             if (cds_mode != NAME_NOT_FOUND) {
   8203                 updateParamEntry(KEY_QC_CDS_MODE, prop);
   8204                 if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
   8205                     LOGE("Failed CDS MODE to update table");
   8206                     rc = BAD_VALUE;
   8207                 } else {
   8208                     LOGD("Set CDS in snapshot mode from setprop = %d", cds_mode);
   8209                     mCds_mode = cds_mode;
   8210                 }
   8211             } else {
   8212                 LOGE("Invalid prop for snapshot CDS MODE %d",  cds_mode);
   8213                 rc = BAD_VALUE;
   8214             }
   8215         }
   8216     }
   8217 
   8218     return rc;
   8219 }
   8220 
   8221 /*===========================================================================
   8222  * FUNCTION   : setInitialExposureIndex
   8223  *
   8224  * DESCRIPTION: Set initial exposure index value
   8225  *
   8226  * PARAMETERS :
   8227  *   @params  : user setting parameters
   8228  *
   8229  * RETURN     : int32_t type of status
   8230  *              NO_ERROR  -- success
   8231  *              none-zero failure code
   8232  *==========================================================================*/
   8233 int32_t QCameraParameters::setInitialExposureIndex(const QCameraParameters& params)
   8234 {
   8235     int32_t rc = NO_ERROR;
   8236     int value = -1;
   8237     const char *str = params.get(KEY_QC_INITIAL_EXPOSURE_INDEX);
   8238     const char *prev_str = get(KEY_QC_INITIAL_EXPOSURE_INDEX);
   8239     if (str) {
   8240         if ((prev_str == NULL) || (strcmp(str, prev_str) != 0)) {
   8241             value = atoi(str);
   8242             LOGD("Set initial exposure index value from param = %d", value);
   8243             if (value >= 0) {
   8244                 updateParamEntry(KEY_QC_INITIAL_EXPOSURE_INDEX, str);
   8245             }
   8246         }
   8247     } else {
   8248         char prop[PROPERTY_VALUE_MAX];
   8249         memset(prop, 0, sizeof(prop));
   8250         property_get("persist.camera.initial.exp.val", prop, "");
   8251         if ((strlen(prop) > 0) &&
   8252                 ( (prev_str == NULL) || (strcmp(prop, prev_str) != 0))) {
   8253             value = atoi(prop);
   8254             LOGD("Set initial exposure index value from setprop = %d", value);
   8255             if (value >= 0) {
   8256                 updateParamEntry(KEY_QC_INITIAL_EXPOSURE_INDEX, prop);
   8257             }
   8258         }
   8259     }
   8260 
   8261     if (value >= 0) {
   8262         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   8263                 CAM_INTF_PARM_INITIAL_EXPOSURE_INDEX, (uint32_t)value)) {
   8264             LOGE("Failed to update initial exposure index value");
   8265             rc = BAD_VALUE;
   8266         }
   8267     } else {
   8268         LOGD("Invalid value for initial exposure index value %d", value);
   8269     }
   8270 
   8271     return rc;
   8272 }
   8273 
   8274 /*===========================================================================
   8275  * FUNCTION   : setInstantCapture
   8276  *
   8277  * DESCRIPTION: Set Instant Capture related params
   8278  *
   8279  * PARAMETERS :
   8280  *   @params  : user setting parameters
   8281  *
   8282  * RETURN     : int32_t type of status
   8283  *              NO_ERROR  -- success
   8284  *              none-zero failure code
   8285  *==========================================================================*/
   8286 int32_t QCameraParameters::setInstantCapture(const QCameraParameters& params)
   8287 {
   8288     int32_t rc = NO_ERROR;
   8289     int value = -1;
   8290     // Check for instant capture, this will enable instant AEC as well.
   8291     // This param will trigger the instant AEC param to backend
   8292     // And also will be useful for instant capture.
   8293     const char *str = params.get(KEY_QC_INSTANT_CAPTURE);
   8294     const char *prev_str = get(KEY_QC_INSTANT_CAPTURE);
   8295     if (str) {
   8296         if ((prev_str == NULL) || (strcmp(str, prev_str) != 0)) {
   8297             value = lookupAttr(INSTANT_CAPTURE_MODES_MAP,
   8298                     PARAM_MAP_SIZE(INSTANT_CAPTURE_MODES_MAP), str);
   8299             LOGD("Set instant Capture from param = %d", value);
   8300             if(value != NAME_NOT_FOUND) {
   8301                 updateParamEntry(KEY_QC_INSTANT_CAPTURE, str);
   8302             } else {
   8303                 LOGE("Invalid value for instant capture %s", str);
   8304                 return BAD_VALUE;
   8305             }
   8306         }
   8307     } else {
   8308         char prop[PROPERTY_VALUE_MAX];
   8309         memset(prop, 0, sizeof(prop));
   8310         property_get("persist.camera.instant.capture", prop, KEY_QC_INSTANT_CAPTURE_DISABLE);
   8311         if ((prev_str == NULL) || (strcmp(prop, prev_str) != 0)) {
   8312             value = lookupAttr(INSTANT_CAPTURE_MODES_MAP,
   8313                     PARAM_MAP_SIZE(INSTANT_CAPTURE_MODES_MAP), prop);
   8314             LOGD("Set instant capture from setprop = %d", value);
   8315             if (value != NAME_NOT_FOUND) {
   8316                 updateParamEntry(KEY_QC_INSTANT_CAPTURE, prop);
   8317             } else {
   8318                 LOGE("Invalid value for instant capture %s", prop);
   8319                 return BAD_VALUE;
   8320             }
   8321         }
   8322     }
   8323 
   8324     // Set instant AEC param to the backend for either instant capture or instant AEC
   8325     // 0 - disbale (normal AEC)
   8326     // 1 - Aggressive AEC (algo used in backend)
   8327     // 2 - Fast AEC (algo used in backend)
   8328     if (value != NAME_NOT_FOUND && value != -1) {
   8329         m_bInstantCapture = (value > 0)? true : false;
   8330         setInstantAEC((uint8_t)value, false);
   8331     }
   8332 
   8333 
   8334     // get frame aec bound value from setprop.
   8335     // This value indicates the number of frames, camera interface
   8336     // will wait for getting the instant capture frame.
   8337     // Default value set to 7.
   8338     // This value also indicates the number of frames, that HAL
   8339     // will not display and will not send preview frames to app
   8340     // This will be applicable only if instant capture is set.
   8341     if (m_bInstantCapture) {
   8342         char prop[PROPERTY_VALUE_MAX];
   8343         memset(prop, 0, sizeof(prop));
   8344         property_get("persist.camera.ae.capture.bound", prop, "7");
   8345         int32_t frame_bound = atoi(prop);
   8346         if (frame_bound >= 0) {
   8347             mAecFrameBound = (uint8_t)frame_bound;
   8348         } else {
   8349             LOGE("Invalid prop for aec frame bound %d", frame_bound);
   8350             rc = BAD_VALUE;
   8351         }
   8352     }
   8353     return rc;
   8354 }
   8355 
   8356 /*===========================================================================
   8357  * FUNCTION   : setInstantAEC
   8358  *
   8359  * DESCRIPTION: Set Instant AEC related params
   8360  *
   8361  * PARAMETERS :
   8362  *   @params  : user setting parameters
   8363  *
   8364  * RETURN     : int32_t type of status
   8365  *              NO_ERROR  -- success
   8366  *              none-zero failure code
   8367  *==========================================================================*/
   8368 int32_t QCameraParameters::setInstantAEC(const QCameraParameters& params)
   8369 {
   8370     int32_t rc = NO_ERROR;
   8371     int value = -1;
   8372 
   8373     // Check for instant AEC only when instant capture is not enabled.
   8374     // Instant capture already takes care of the instant AEC as well.
   8375     if (!m_bInstantCapture) {
   8376         // Check for instant AEC. Instant AEC will only enable fast AEC.
   8377         // It will not enable instant capture.
   8378         // This param will trigger the instant AEC param to backend
   8379         // Instant AEC param is session based param,
   8380         // the param change will be applicable for next camera open/close session.
   8381         const char *str = params.get(KEY_QC_INSTANT_AEC);
   8382         const char *prev_str = get(KEY_QC_INSTANT_AEC);
   8383         if (str) {
   8384             if ((prev_str == NULL) || (strcmp(str, prev_str) != 0)) {
   8385                 value = lookupAttr(INSTANT_AEC_MODES_MAP,
   8386                         PARAM_MAP_SIZE(INSTANT_AEC_MODES_MAP), str);
   8387                 LOGD("Set instant AEC from param = %d", value);
   8388                 if(value != NAME_NOT_FOUND) {
   8389                     updateParamEntry(KEY_QC_INSTANT_AEC, str);
   8390                 } else {
   8391                     LOGE("Invalid value for instant AEC %s", str);
   8392                     return BAD_VALUE;
   8393                 }
   8394             }
   8395         } else {
   8396             char prop[PROPERTY_VALUE_MAX];
   8397             memset(prop, 0, sizeof(prop));
   8398             property_get("persist.camera.instant.aec", prop, KEY_QC_INSTANT_AEC_DISABLE);
   8399             if ((prev_str == NULL) || (strcmp(prop, prev_str) != 0)) {
   8400                 value = lookupAttr(INSTANT_AEC_MODES_MAP,
   8401                         PARAM_MAP_SIZE(INSTANT_AEC_MODES_MAP), prop);
   8402                 LOGD("Set instant AEC from setprop = %d", value);
   8403                 if(value != NAME_NOT_FOUND) {
   8404                     updateParamEntry(KEY_QC_INSTANT_AEC, prop);
   8405                 } else {
   8406                     LOGE("Invalid value for instant AEC %s", prop);
   8407                     return BAD_VALUE;
   8408                 }
   8409             }
   8410         }
   8411 
   8412         // Set instant AEC param to the backend for either instant capture or instant AEC
   8413         // 0 - disbale (normal AEC)
   8414         // 1 - Aggressive AEC (algo used in backend)
   8415         // 2 - Fast AEC (algo used in backend)
   8416         if (value != NAME_NOT_FOUND && value != -1) {
   8417             setInstantAEC((uint8_t)value, false);
   8418         }
   8419 
   8420     }
   8421 
   8422     // get frame aec preview skip count from setprop.
   8423     // This value indicates the number of frames, that HAL
   8424     // will not display and will not send preview frames to app
   8425     // Default value set to 7.
   8426     // This will be applicable only if instant aec is set.
   8427     if (m_bInstantAEC) {
   8428         char prop[PROPERTY_VALUE_MAX];
   8429         memset(prop, 0, sizeof(prop));
   8430         property_get("persist.camera.ae.instant.bound", prop, "7");
   8431         int32_t aec_frame_skip_cnt = atoi(prop);
   8432         if (aec_frame_skip_cnt >= 0) {
   8433             mAecSkipDisplayFrameBound = (uint8_t)aec_frame_skip_cnt;
   8434         } else {
   8435             LOGE("Invalid prop for aec frame bound %d", aec_frame_skip_cnt);
   8436             rc = BAD_VALUE;
   8437         }
   8438     }
   8439     return rc;
   8440 }
   8441 
   8442 /*===========================================================================
   8443  * FUNCTION   : setDISValue
   8444  *
   8445  * DESCRIPTION: set DIS value
   8446  *
   8447  * PARAMETERS :
   8448  *   @disStr : DIS value string
   8449  *
   8450  * RETURN     : int32_t type of status
   8451  *              NO_ERROR  -- success
   8452  *              none-zero failure code
   8453  *==========================================================================*/
   8454 int32_t QCameraParameters::setDISValue(const char *disStr)
   8455 {
   8456     if (disStr != NULL) {
   8457         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   8458                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), disStr);
   8459         if (value != NAME_NOT_FOUND) {
   8460             //For some IS types (like EIS 2.0), when DIS value is changed, we need to restart
   8461             //preview because of topology change in backend. But, for now, restart preview
   8462             //for all IS types.
   8463             m_bNeedRestart = true;
   8464             LOGH("Setting DIS value %s", disStr);
   8465             updateParamEntry(KEY_QC_DIS, disStr);
   8466             if (!(strcmp(disStr,"enable"))) {
   8467                 m_bDISEnabled = true;
   8468             } else {
   8469                 m_bDISEnabled = false;
   8470             }
   8471             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_DIS_ENABLE, value)) {
   8472                 return BAD_VALUE;
   8473             }
   8474             return NO_ERROR;
   8475         }
   8476     }
   8477     LOGE("Invalid DIS value: %s", (disStr == NULL) ? "NULL" : disStr);
   8478     m_bDISEnabled = false;
   8479     return BAD_VALUE;
   8480 }
   8481 
   8482 /*===========================================================================
   8483  * FUNCTION   : updateOisValue
   8484  *
   8485  * DESCRIPTION: update OIS value
   8486  *
   8487  * PARAMETERS :
   8488  *   @oisValue : OIS value TRUE/FALSE
   8489  *
   8490  * RETURN     : int32_t type of status
   8491  *              NO_ERROR  -- success
   8492  *              none-zero failure code
   8493  *==========================================================================*/
   8494 int32_t QCameraParameters::updateOisValue(bool oisValue)
   8495 {
   8496     uint8_t enable = 0;
   8497     int32_t rc = NO_ERROR;
   8498 
   8499     // Check for OIS disable
   8500     char ois_prop[PROPERTY_VALUE_MAX];
   8501     memset(ois_prop, 0, sizeof(ois_prop));
   8502     property_get("persist.camera.ois.disable", ois_prop, "0");
   8503     uint8_t ois_disable = (uint8_t)atoi(ois_prop);
   8504 
   8505     //Enable OIS if it is camera mode or Camcoder 4K mode
   8506     if (!m_bRecordingHint || (is4k2kVideoResolution() && m_bRecordingHint)) {
   8507         enable = 1;
   8508         LOGH("Valid OIS mode!! ");
   8509     }
   8510     // Disable OIS if setprop is set
   8511     if (ois_disable || !oisValue) {
   8512         //Disable OIS
   8513         enable = 0;
   8514         LOGH("Disable OIS mode!! ois_disable(%d) oisValue(%d)",
   8515                  ois_disable, oisValue);
   8516 
   8517     }
   8518     m_bOISEnabled = enable;
   8519     if (m_bOISEnabled) {
   8520         updateParamEntry(KEY_QC_OIS, VALUE_ENABLE);
   8521     } else {
   8522         updateParamEntry(KEY_QC_OIS, VALUE_DISABLE);
   8523     }
   8524 
   8525     if (initBatchUpdate() < 0 ) {
   8526         LOGE("Failed to initialize group update table");
   8527         return BAD_TYPE;
   8528     }
   8529 
   8530     LOGH("Sending OIS mode (%d)", enable);
   8531     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_META_LENS_OPT_STAB_MODE, enable)) {
   8532         LOGE("Failed to update table");
   8533         return BAD_VALUE;
   8534     }
   8535 
   8536     rc = commitSetBatch();
   8537     if (rc != NO_ERROR) {
   8538         LOGE("Failed to parameter changes");
   8539         return rc;
   8540     }
   8541 
   8542     return rc;
   8543 }
   8544 
   8545 /*===========================================================================
   8546  * FUNCTION   : setHighFrameRate
   8547  *
   8548  * DESCRIPTION: set high frame rate
   8549  *
   8550  * PARAMETERS :
   8551  *   @hfrMode : HFR mode
   8552  *
   8553  * RETURN     : int32_t type of status
   8554  *              NO_ERROR  -- success
   8555  *              none-zero failure code
   8556  *==========================================================================*/
   8557 int32_t QCameraParameters::setHighFrameRate(const int32_t hfrMode)
   8558 {
   8559     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HFR, hfrMode)) {
   8560         return BAD_VALUE;
   8561     }
   8562 
   8563     return NO_ERROR;
   8564 }
   8565 
   8566 /*===========================================================================
   8567  * FUNCTION   : setLensShadeValue
   8568  *
   8569  * DESCRIPTION: set lens shade value
   8570  *
   8571  * PARAMETERS :
   8572  *   @lensSahdeStr : lens shade value string
   8573  *
   8574  * RETURN     : int32_t type of status
   8575  *              NO_ERROR  -- success
   8576  *              none-zero failure code
   8577  *==========================================================================*/
   8578 int32_t QCameraParameters::setLensShadeValue(const char *lensShadeStr)
   8579 {
   8580     if (lensShadeStr != NULL) {
   8581         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   8582                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), lensShadeStr);
   8583         if (value != NAME_NOT_FOUND) {
   8584             LOGH("Setting LensShade value %s", lensShadeStr);
   8585             updateParamEntry(KEY_QC_LENSSHADE, lensShadeStr);
   8586             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ROLLOFF, value)) {
   8587                 return BAD_VALUE;
   8588             }
   8589             return NO_ERROR;
   8590         }
   8591     }
   8592     LOGE("Invalid LensShade value: %s",
   8593           (lensShadeStr == NULL) ? "NULL" : lensShadeStr);
   8594     return BAD_VALUE;
   8595 }
   8596 
   8597 /*===========================================================================
   8598  * FUNCTION   : setExposureCompensation
   8599  *
   8600  * DESCRIPTION: set exposure compensation value
   8601  *
   8602  * PARAMETERS :
   8603  *   @expComp : exposure compensation value
   8604  *
   8605  * RETURN     : int32_t type of status
   8606  *              NO_ERROR  -- success
   8607  *              none-zero failure code
   8608  *==========================================================================*/
   8609 int32_t QCameraParameters::setExposureCompensation(int expComp)
   8610 {
   8611     char val[16];
   8612     snprintf(val, sizeof(val), "%d", expComp);
   8613     updateParamEntry(KEY_EXPOSURE_COMPENSATION, val);
   8614 
   8615     // Don't need to pass step as part of setParameter because
   8616     // camera daemon is already aware of it.
   8617     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_EXPOSURE_COMPENSATION, expComp)) {
   8618         return BAD_VALUE;
   8619     }
   8620 
   8621     return NO_ERROR;
   8622 }
   8623 
   8624 /*===========================================================================
   8625  * FUNCTION   : setWhiteBalance
   8626  *
   8627  * DESCRIPTION: set white balance mode
   8628  *
   8629  * PARAMETERS :
   8630  *   @wbStr   : white balance mode value string
   8631  *
   8632  * RETURN     : int32_t type of status
   8633  *              NO_ERROR  -- success
   8634  *              none-zero failure code
   8635  *==========================================================================*/
   8636 int32_t QCameraParameters::setWhiteBalance(const char *wbStr)
   8637 {
   8638     if (wbStr != NULL) {
   8639         int32_t value = lookupAttr(WHITE_BALANCE_MODES_MAP,
   8640                 PARAM_MAP_SIZE(WHITE_BALANCE_MODES_MAP), wbStr);
   8641         if (value != NAME_NOT_FOUND) {
   8642             LOGH("Setting WhiteBalance value %s", wbStr);
   8643             updateParamEntry(KEY_WHITE_BALANCE, wbStr);
   8644             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_WHITE_BALANCE, value)) {
   8645                 return BAD_VALUE;
   8646             }
   8647             return NO_ERROR;
   8648         }
   8649     }
   8650     LOGE("Invalid WhiteBalance value: %s", (wbStr == NULL) ? "NULL" : wbStr);
   8651     return BAD_VALUE;
   8652 }
   8653 
   8654 /*===========================================================================
   8655  * FUNCTION   : setWBManualCCT
   8656  *
   8657  * DESCRIPTION: set setWBManualCCT time
   8658  *
   8659  * PARAMETERS :
   8660  *   @cctStr : string of wb cct, range (2000, 8000) in K.
   8661  *
   8662  * RETURN     : int32_t type of status
   8663  *              NO_ERROR  -- success
   8664  *              none-zero failure code
   8665  *==========================================================================*/
   8666 int32_t  QCameraParameters::setWBManualCCT(const char *cctStr)
   8667 {
   8668     if (cctStr != NULL) {
   8669         int32_t cctVal = atoi(cctStr);
   8670         int32_t minCct = m_pCapability->min_wb_cct; /* 2000K */
   8671         int32_t maxCct = m_pCapability->max_wb_cct; /* 8000K */
   8672 
   8673         if (cctVal >= minCct && cctVal <= maxCct) {
   8674             LOGH(", cct value: %d", cctVal);
   8675             updateParamEntry(KEY_QC_WB_MANUAL_CCT, cctStr);
   8676             cam_manual_wb_parm_t manual_wb;
   8677             manual_wb.type = CAM_MANUAL_WB_MODE_CCT;
   8678             manual_wb.cct = cctVal;
   8679             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_WB_MANUAL, manual_wb)) {
   8680                 return BAD_VALUE;
   8681             }
   8682             return NO_ERROR;
   8683         }
   8684     }
   8685 
   8686     LOGE("Invalid cct, value: %s",
   8687             (cctStr == NULL) ? "NULL" : cctStr);
   8688     return BAD_VALUE;
   8689 }
   8690 
   8691 /*===========================================================================
   8692  * FUNCTION   : updateAWBParams
   8693  *
   8694  * DESCRIPTION: update CCT parameters key
   8695  *
   8696  * PARAMETERS :
   8697  *   @awb_params : WB parameters
   8698  *
   8699  * RETURN     : int32_t type of status
   8700  *              NO_ERROR  -- success
   8701  *              none-zero failure code
   8702  *==========================================================================*/
   8703 int32_t QCameraParameters::updateAWBParams(cam_awb_params_t &awb_params)
   8704 {
   8705     //check and update CCT
   8706     int32_t prev_cct = getInt(KEY_QC_WB_MANUAL_CCT);
   8707     if (prev_cct != awb_params.cct_value) {
   8708         LOGD("update current cct value. old:%d, now:%d",
   8709                 prev_cct, awb_params.cct_value);
   8710         set(KEY_QC_WB_MANUAL_CCT, awb_params.cct_value);
   8711     }
   8712 
   8713     //check and update WB gains
   8714     const char *prev_gains = get(KEY_QC_MANUAL_WB_GAINS);
   8715     char gainStr[30];
   8716     snprintf(gainStr, sizeof(gainStr), "%f,%f,%f", awb_params.rgb_gains.r_gain,
   8717         awb_params.rgb_gains.g_gain, awb_params.rgb_gains.b_gain);
   8718 
   8719     if (prev_gains == NULL || strcmp(prev_gains, gainStr)) {
   8720         set(KEY_QC_MANUAL_WB_GAINS, gainStr);
   8721         LOGD("update currernt RGB gains: old %s new %s", prev_gains, gainStr);
   8722     }
   8723     return NO_ERROR;
   8724 }
   8725 
   8726 /*===========================================================================
   8727  * FUNCTION   : parseGains
   8728  *
   8729  * DESCRIPTION: parse WB gains
   8730  *
   8731  * PARAMETERS :
   8732  *   @gainStr : WB result string
   8733  *   @r_gain  : WB red gain
   8734  *   @g_gain  : WB green gain
   8735  *   @b_gain  : WB blue gain
   8736  *
   8737  * RETURN     : int32_t type of status
   8738  *              NO_ERROR  -- success
   8739  *              none-zero failure code
   8740  *==========================================================================*/
   8741 int32_t QCameraParameters::parseGains(const char *gainStr, double &r_gain,
   8742                                           double &g_gain, double &b_gain)
   8743 {
   8744     int32_t rc = NO_ERROR;
   8745     char *saveptr = NULL;
   8746     size_t gains_size = strlen(gainStr) + 1;
   8747     char* gains = (char*) calloc(1, gains_size);
   8748     if (NULL == gains) {
   8749         LOGE("No memory for gains");
   8750         return NO_MEMORY;
   8751     }
   8752     strlcpy(gains, gainStr, gains_size);
   8753     char *token = strtok_r(gains, ",", &saveptr);
   8754 
   8755     if (NULL != token) {
   8756         r_gain = (float) atof(token);
   8757         token = strtok_r(NULL, ",", &saveptr);
   8758     }
   8759 
   8760     if (NULL != token) {
   8761         g_gain = (float) atof(token);
   8762         token = strtok_r(NULL, ",", &saveptr);
   8763     }
   8764 
   8765     if (NULL != token) {
   8766         b_gain = (float) atof(token);
   8767     } else {
   8768         LOGE("Malformed string for gains");
   8769         rc = BAD_VALUE;
   8770     }
   8771 
   8772     free(gains);
   8773     return rc;
   8774 }
   8775 
   8776 /*===========================================================================
   8777  * FUNCTION   : setManualWBGains
   8778  *
   8779  * DESCRIPTION: set manual wb gains for r,g,b
   8780  *
   8781  * PARAMETERS :
   8782  *   @cctStr : string of wb gains, range (1.0, 4.0).
   8783  *
   8784  * RETURN     : int32_t type of status
   8785  *              NO_ERROR  -- success
   8786  *              none-zero failure code
   8787  *==========================================================================*/
   8788 int32_t QCameraParameters::setManualWBGains(const char *gainStr)
   8789 {
   8790     int32_t rc = NO_ERROR;
   8791     if (gainStr != NULL) {
   8792         double r_gain,g_gain,b_gain;
   8793         rc = parseGains(gainStr, r_gain, g_gain, b_gain);
   8794         if (rc != NO_ERROR) {
   8795             return rc;
   8796         }
   8797 
   8798         double minGain = m_pCapability->min_wb_gain;
   8799         double maxGain = m_pCapability->max_wb_gain;
   8800 
   8801         if (r_gain >= minGain && r_gain <= maxGain &&
   8802             g_gain >= minGain && g_gain <= maxGain &&
   8803             b_gain >= minGain && b_gain <= maxGain) {
   8804             LOGH(", setting rgb gains: r = %lf g = %lf b = %lf",
   8805                      r_gain, g_gain, b_gain);
   8806             updateParamEntry(KEY_QC_MANUAL_WB_GAINS, gainStr);
   8807             cam_manual_wb_parm_t manual_wb;
   8808             manual_wb.type = CAM_MANUAL_WB_MODE_GAIN;
   8809             manual_wb.gains.r_gain = r_gain;
   8810             manual_wb.gains.g_gain = g_gain;
   8811             manual_wb.gains.b_gain = b_gain;
   8812             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_WB_MANUAL, manual_wb)) {
   8813                 return BAD_VALUE;
   8814             }
   8815             return NO_ERROR;
   8816         }
   8817     }
   8818 
   8819     LOGH("Invalid manual wb gains: %s",
   8820           (gainStr == NULL) ? "NULL" : gainStr);
   8821     return BAD_VALUE;
   8822 }
   8823 
   8824 int QCameraParameters::getAutoFlickerMode()
   8825 {
   8826     /* Enable Advanced Auto Antibanding where we can set
   8827        any of the following option
   8828        ie. CAM_ANTIBANDING_MODE_AUTO
   8829            CAM_ANTIBANDING_MODE_AUTO_50HZ
   8830            CAM_ANTIBANDING_MODE_AUTO_60HZ
   8831       Currently setting it to default    */
   8832     char prop[PROPERTY_VALUE_MAX];
   8833     memset(prop, 0, sizeof(prop));
   8834     property_get("persist.camera.set.afd", prop, "3");
   8835     return atoi(prop);
   8836 }
   8837 
   8838 /*===========================================================================
   8839  * FUNCTION   : setAntibanding
   8840  *
   8841  * DESCRIPTION: set antibanding value
   8842  *
   8843  * PARAMETERS :
   8844  *   @antiBandingStr : antibanding value string
   8845  *
   8846  * RETURN     : int32_t type of status
   8847  *              NO_ERROR  -- success
   8848  *              none-zero failure code
   8849  *==========================================================================*/
   8850 int32_t QCameraParameters::setAntibanding(const char *antiBandingStr)
   8851 {
   8852     if (antiBandingStr != NULL) {
   8853         int32_t value = lookupAttr(ANTIBANDING_MODES_MAP, PARAM_MAP_SIZE(ANTIBANDING_MODES_MAP),
   8854                 antiBandingStr);
   8855         if (value != NAME_NOT_FOUND) {
   8856             LOGH("Setting AntiBanding value %s", antiBandingStr);
   8857             updateParamEntry(KEY_ANTIBANDING, antiBandingStr);
   8858             if(value == CAM_ANTIBANDING_MODE_AUTO) {
   8859                value = getAutoFlickerMode();
   8860             }
   8861             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   8862                     CAM_INTF_PARM_ANTIBANDING, (uint32_t)value)) {
   8863                 return BAD_VALUE;
   8864             }
   8865             return NO_ERROR;
   8866         }
   8867     }
   8868     LOGE("Invalid AntiBanding value: %s",
   8869           (antiBandingStr == NULL) ? "NULL" : antiBandingStr);
   8870     return BAD_VALUE;
   8871 }
   8872 
   8873 /*===========================================================================
   8874  * FUNCTION   : setFocusAreas
   8875  *
   8876  * DESCRIPTION: set focus areas
   8877  *
   8878  * PARAMETERS :
   8879  *   @focusAreasStr : focus areas value string
   8880  *
   8881  * RETURN     : int32_t type of status
   8882  *              NO_ERROR  -- success
   8883  *              none-zero failure code
   8884  *==========================================================================*/
   8885 int32_t QCameraParameters::setFocusAreas(const char *focusAreasStr)
   8886 {
   8887     if (m_pCapability->max_num_focus_areas == 0 ||
   8888         focusAreasStr == NULL) {
   8889         LOGD("Parameter string is null");
   8890         return NO_ERROR;
   8891     }
   8892 
   8893     cam_area_t *areas = (cam_area_t *)malloc(sizeof(cam_area_t) * m_pCapability->max_num_focus_areas);
   8894     if (NULL == areas) {
   8895         LOGE("No memory for areas");
   8896         return NO_MEMORY;
   8897     }
   8898     memset(areas, 0, sizeof(cam_area_t) * m_pCapability->max_num_focus_areas);
   8899     int num_areas_found = 0;
   8900     if (parseCameraAreaString(focusAreasStr,
   8901                               m_pCapability->max_num_focus_areas,
   8902                               areas,
   8903                               num_areas_found) != NO_ERROR) {
   8904         LOGE("Failed to parse the string: %s", focusAreasStr);
   8905         free(areas);
   8906         return BAD_VALUE;
   8907     }
   8908 
   8909     if (validateCameraAreas(areas, num_areas_found) == false) {
   8910         LOGE("invalid areas specified : %s", focusAreasStr);
   8911         free(areas);
   8912         return BAD_VALUE;
   8913     }
   8914 
   8915     updateParamEntry(KEY_FOCUS_AREAS, focusAreasStr);
   8916 
   8917     //for special area string (0, 0, 0, 0, 0), set the num_areas_found to 0,
   8918     //so no action is takenby the lower layer
   8919     if (num_areas_found == 1 &&
   8920         areas[0].rect.left == 0 &&
   8921         areas[0].rect.top == 0 &&
   8922         areas[0].rect.width == 0 &&
   8923         areas[0].rect.height == 0 &&
   8924         areas[0].weight == 0) {
   8925         num_areas_found = 0;
   8926     }
   8927 
   8928     int previewWidth, previewHeight;
   8929     getPreviewSize(&previewWidth, &previewHeight);
   8930     cam_roi_info_t af_roi_value;
   8931     memset(&af_roi_value, 0, sizeof(cam_roi_info_t));
   8932     af_roi_value.num_roi = (uint8_t)num_areas_found;
   8933     for (int i = 0; i < num_areas_found; i++) {
   8934         LOGH("FocusArea[%d] = (%d, %d, %d, %d)",
   8935                i, (areas[i].rect.top), (areas[i].rect.left),
   8936               (areas[i].rect.width), (areas[i].rect.height));
   8937 
   8938         // Transform the coords from (-1000, 1000)
   8939         // to (0, previewWidth or previewHeight).
   8940         af_roi_value.roi[i].left =
   8941                 (int32_t)(((double)areas[i].rect.left + 1000.0) *
   8942                     ((double)previewWidth / 2000.0));
   8943         af_roi_value.roi[i].top =
   8944                 (int32_t)(((double)areas[i].rect.top + 1000.0) *
   8945                     ((double)previewHeight / 2000.0));
   8946         af_roi_value.roi[i].width =
   8947                 (int32_t)((double)areas[i].rect.width *
   8948                     (double)previewWidth / 2000.0);
   8949         af_roi_value.roi[i].height =
   8950                 (int32_t)((double)areas[i].rect.height *
   8951                     (double)previewHeight / 2000.0);
   8952         af_roi_value.weight[i] = areas[i].weight;
   8953     }
   8954     free(areas);
   8955     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_AF_ROI, af_roi_value)) {
   8956         return BAD_VALUE;
   8957     }
   8958 
   8959     return NO_ERROR;
   8960 }
   8961 
   8962 /*===========================================================================
   8963  * FUNCTION   : setMeteringAreas
   8964  *
   8965  * DESCRIPTION: set metering areas value
   8966  *
   8967  * PARAMETERS :
   8968  *   @meteringAreasStr : metering areas value string
   8969  *
   8970  * RETURN     : int32_t type of status
   8971  *              NO_ERROR  -- success
   8972  *              none-zero failure code
   8973  *==========================================================================*/
   8974 int32_t QCameraParameters::setMeteringAreas(const char *meteringAreasStr)
   8975 {
   8976     if (m_pCapability->max_num_metering_areas == 0 ||
   8977         meteringAreasStr == NULL) {
   8978         LOGD("Parameter string is null");
   8979         return NO_ERROR;
   8980     }
   8981 
   8982     cam_area_t *areas = (cam_area_t *)malloc(sizeof(cam_area_t) * m_pCapability->max_num_metering_areas);
   8983     if (NULL == areas) {
   8984         LOGE("No memory for areas");
   8985         return NO_MEMORY;
   8986     }
   8987     memset(areas, 0, sizeof(cam_area_t) * m_pCapability->max_num_metering_areas);
   8988     int num_areas_found = 0;
   8989     if (parseCameraAreaString(meteringAreasStr,
   8990                               m_pCapability->max_num_metering_areas,
   8991                               areas,
   8992                               num_areas_found) < 0) {
   8993         LOGE("Failed to parse the string: %s", meteringAreasStr);
   8994         free(areas);
   8995         return BAD_VALUE;
   8996     }
   8997 
   8998     if (validateCameraAreas(areas, num_areas_found) == false) {
   8999         LOGE("invalid areas specified : %s", meteringAreasStr);
   9000         free(areas);
   9001         return BAD_VALUE;
   9002     }
   9003 
   9004     updateParamEntry(KEY_METERING_AREAS, meteringAreasStr);
   9005 
   9006     //for special area string (0, 0, 0, 0, 0), set the num_areas_found to 0,
   9007     //so no action is takenby the lower layer
   9008     if (num_areas_found == 1 &&
   9009         areas[0].rect.left == 0 &&
   9010         areas[0].rect.top == 0 &&
   9011         areas[0].rect.width == 0 &&
   9012         areas[0].rect.height == 0 &&
   9013         areas[0].weight == 0) {
   9014         num_areas_found = 0;
   9015     }
   9016     cam_set_aec_roi_t aec_roi_value;
   9017     int previewWidth, previewHeight;
   9018     getPreviewSize(&previewWidth, &previewHeight);
   9019 
   9020     memset(&aec_roi_value, 0, sizeof(cam_set_aec_roi_t));
   9021     aec_roi_value.num_roi = num_areas_found;
   9022     if (num_areas_found > 0) {
   9023         aec_roi_value.aec_roi_enable = CAM_AEC_ROI_ON;
   9024         aec_roi_value.aec_roi_type = CAM_AEC_ROI_BY_COORDINATE;
   9025 
   9026         for (int i = 0; i < num_areas_found; i++) {
   9027             LOGH("MeteringArea[%d] = (%d, %d, %d, %d)",
   9028                    i, (areas[i].rect.top), (areas[i].rect.left),
   9029                   (areas[i].rect.width), (areas[i].rect.height));
   9030 
   9031             // Transform the coords from (-1000, 1000) to
   9032             // (0, previewWidth or previewHeight).
   9033             aec_roi_value.cam_aec_roi_position.coordinate[i].x =
   9034                     (uint32_t)((((double)areas[i].rect.left +
   9035                         (double)areas[i].rect.width / 2.0) + 1000.0) *
   9036                             (double)previewWidth / 2000.0);
   9037             aec_roi_value.cam_aec_roi_position.coordinate[i].y =
   9038                     (uint32_t)((((double)areas[i].rect.top +
   9039                         (double)areas[i].rect.height / 2.0) + 1000.0) *
   9040                             (double)previewHeight / 2000.0);
   9041         }
   9042     } else {
   9043         aec_roi_value.aec_roi_enable = CAM_AEC_ROI_OFF;
   9044     }
   9045     free(areas);
   9046     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_AEC_ROI, aec_roi_value)) {
   9047         return BAD_VALUE;
   9048     }
   9049 
   9050     return NO_ERROR;
   9051 }
   9052 
   9053 
   9054 /*===========================================================================
   9055  * FUNCTION   : isSupportedSensorHdrSize
   9056  *
   9057  * DESCRIPTION: Checks if the requested snapshot size is compatible with currently
   9058  *              configured HDR mode, currently primary target for validation is
   9059  *              zzhdr however this function can be extended in the future to vet
   9060  *              all sensor based HDR configs
   9061  *
   9062  * PARAMETERS :
   9063  *   @params  : CameraParameters object
   9064  *
   9065  * RETURN     : boolean type
   9066  *              True  -- indicates supported config
   9067  *              False -- indicated unsupported config should fallback to other
   9068  *              available HDR modes
   9069  *==========================================================================*/
   9070 bool QCameraParameters::isSupportedSensorHdrSize(const QCameraParameters& params)
   9071 {
   9072     char value[PROPERTY_VALUE_MAX];
   9073     memset(value, 0, sizeof(value));
   9074     property_get("persist.camera.zzhdr.enable", value, "0");
   9075     uint8_t zzhdr_enable = (uint8_t)atoi(value);
   9076 
   9077     if (zzhdr_enable) {
   9078 
   9079         int req_w, req_h;
   9080         params.getPictureSize(&req_w, &req_h);
   9081 
   9082         // Check if requested w x h is in zzhdr supported list
   9083         for (size_t i = 0; i< m_pCapability->zzhdr_sizes_tbl_cnt; ++i) {
   9084 
   9085             if (req_w == m_pCapability->zzhdr_sizes_tbl[i].width &&
   9086                     req_h == m_pCapability->zzhdr_sizes_tbl[i].height) {
   9087                 LOGD("%s: Found match for %d x %d", __func__, req_w, req_h);
   9088                 return true;
   9089             }
   9090         }
   9091         LOGH("%s: %d x %d is not supported for zzhdr mode", __func__, req_w, req_h);
   9092         return false;
   9093     }
   9094 
   9095     return true;
   9096 }
   9097 
   9098 /*===========================================================================
   9099  * FUNCTION   : setSceneMode
   9100  *
   9101  * DESCRIPTION: set scene mode
   9102  *
   9103  * PARAMETERS :
   9104  *   @sceneModeStr : scene mode value string
   9105  *
   9106  * RETURN     : int32_t type of status
   9107  *              NO_ERROR  -- success
   9108  *              none-zero failure code
   9109  *==========================================================================*/
   9110 int32_t QCameraParameters::setSceneMode(const char *sceneModeStr)
   9111 {
   9112     if (sceneModeStr != NULL) {
   9113         int32_t value = lookupAttr(SCENE_MODES_MAP, PARAM_MAP_SIZE(SCENE_MODES_MAP), sceneModeStr);
   9114         if (value != NAME_NOT_FOUND) {
   9115             LOGD("Setting SceneMode %s", sceneModeStr);
   9116             updateParamEntry(KEY_SCENE_MODE, sceneModeStr);
   9117             if (m_bSensorHDREnabled) {
   9118               // Incase of HW HDR mode, we do not update the same as Best shot mode.
   9119               LOGH("H/W HDR mode enabled. Do not set Best Shot Mode");
   9120               return NO_ERROR;
   9121             }
   9122             if (m_bSceneSelection) {
   9123                 setSelectedScene((cam_scene_mode_type) value);
   9124             }
   9125             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_BESTSHOT_MODE,
   9126                     (uint32_t)value)) {
   9127                 return BAD_VALUE;
   9128             }
   9129             return NO_ERROR;
   9130         }
   9131     }
   9132     LOGE("Invalid Secene Mode: %s",
   9133            (sceneModeStr == NULL) ? "NULL" : sceneModeStr);
   9134     return BAD_VALUE;
   9135 }
   9136 
   9137 /*===========================================================================
   9138  * FUNCTION   : setSelectableZoneAf
   9139  *
   9140  * DESCRIPTION: set selectable zone AF algorithm
   9141  *
   9142  * PARAMETERS :
   9143  *   @selZoneAFStr : selectable zone AF algorithm value string
   9144  *
   9145  * RETURN     : int32_t type of status
   9146  *              NO_ERROR  -- success
   9147  *              none-zero failure code
   9148  *==========================================================================*/
   9149 int32_t QCameraParameters::setSelectableZoneAf(const char *selZoneAFStr)
   9150 {
   9151     if (selZoneAFStr != NULL) {
   9152         int32_t value = lookupAttr(FOCUS_ALGO_MAP, PARAM_MAP_SIZE(FOCUS_ALGO_MAP), selZoneAFStr);
   9153         if (value != NAME_NOT_FOUND) {
   9154             LOGD("Setting Selectable Zone AF value %s", selZoneAFStr);
   9155             updateParamEntry(KEY_QC_SELECTABLE_ZONE_AF, selZoneAFStr);
   9156             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FOCUS_ALGO_TYPE, value)) {
   9157                 return BAD_VALUE;
   9158             }
   9159             return NO_ERROR;
   9160         }
   9161     }
   9162     LOGE("Invalid selectable zone af value: %s",
   9163            (selZoneAFStr == NULL) ? "NULL" : selZoneAFStr);
   9164     return BAD_VALUE;
   9165 }
   9166 
   9167 /*===========================================================================
   9168  * FUNCTION   : isAEBracketEnabled
   9169  *
   9170  * DESCRIPTION: checks if AE bracketing is enabled
   9171  *
   9172  * PARAMETERS :
   9173  *
   9174  * RETURN     : TRUE/FALSE
   9175  *==========================================================================*/
   9176 bool QCameraParameters::isAEBracketEnabled()
   9177 {
   9178     const char *str = get(KEY_QC_AE_BRACKET_HDR);
   9179     if (str != NULL) {
   9180         if (strcmp(str, AE_BRACKET_OFF) != 0) {
   9181             return true;
   9182         }
   9183     }
   9184     return false;
   9185 }
   9186 
   9187 /*===========================================================================
   9188  * FUNCTION   : setAEBracket
   9189  *
   9190  * DESCRIPTION: set AE bracket value
   9191  *
   9192  * PARAMETERS :
   9193  *   @aecBracketStr : AE bracket value string
   9194  *
   9195  * RETURN     : int32_t type of status
   9196  *              NO_ERROR  -- success
   9197  *              none-zero failure code
   9198  *==========================================================================*/
   9199 int32_t QCameraParameters::setAEBracket(const char *aecBracketStr)
   9200 {
   9201     if (aecBracketStr == NULL) {
   9202         LOGD("setAEBracket with NULL value");
   9203         return NO_ERROR;
   9204     }
   9205 
   9206     cam_exp_bracketing_t expBracket;
   9207     memset(&expBracket, 0, sizeof(expBracket));
   9208 
   9209     int value = lookupAttr(BRACKETING_MODES_MAP, PARAM_MAP_SIZE(BRACKETING_MODES_MAP),
   9210             aecBracketStr);
   9211     switch (value) {
   9212     case CAM_EXP_BRACKETING_ON:
   9213         {
   9214             LOGD("EXP_BRACKETING_ON");
   9215             const char *str_val = get(KEY_QC_CAPTURE_BURST_EXPOSURE);
   9216             if ((str_val != NULL) && (strlen(str_val)>0)) {
   9217                 expBracket.mode = CAM_EXP_BRACKETING_ON;
   9218                 m_bAeBracketingEnabled = true;
   9219                 strlcpy(expBracket.values, str_val, MAX_EXP_BRACKETING_LENGTH);
   9220                 LOGD("setting Exposure Bracketing value of %s",
   9221                        expBracket.values);
   9222             }
   9223             else {
   9224                 /* Apps not set capture-burst-exposures, error case fall into bracketing off mode */
   9225                 LOGD("capture-burst-exposures not set, back to HDR OFF mode");
   9226                 m_bAeBracketingEnabled = false;
   9227                 expBracket.mode = CAM_EXP_BRACKETING_OFF;
   9228             }
   9229         }
   9230         break;
   9231     default:
   9232         {
   9233             m_bAeBracketingEnabled = false;
   9234             LOGH(", EXP_BRACKETING_OFF");
   9235             expBracket.mode = CAM_EXP_BRACKETING_OFF;
   9236         }
   9237         break;
   9238     }
   9239 
   9240     // Cache client AE bracketing configuration
   9241     memcpy(&m_AEBracketingClient, &expBracket, sizeof(cam_exp_bracketing_t));
   9242 
   9243     /* save the value*/
   9244     updateParamEntry(KEY_QC_AE_BRACKET_HDR, aecBracketStr);
   9245     return NO_ERROR;
   9246 }
   9247 
   9248 /*===========================================================================
   9249  * FUNCTION   : set3ALock
   9250  *
   9251  * DESCRIPTION: enable/disable 3A lock.
   9252  *
   9253  * PARAMETERS :
   9254  *   @lock3A  : lock or unlock
   9255  *
   9256  * RETURN     : int32_t type of status
   9257  *              NO_ERROR  -- success
   9258  *              none-zero failure code
   9259  *==========================================================================*/
   9260 int32_t QCameraParameters::set3ALock(bool lock3A)
   9261 {
   9262     int32_t rc = NO_ERROR;
   9263     LOGH("Setting Lock %d", lock3A);
   9264     if(initBatchUpdate() < 0 ) {
   9265         LOGE("Failed to initialize group update table");
   9266         return BAD_TYPE;
   9267     }
   9268     uint32_t focus_mode = CAM_FOCUS_MODE_AUTO;
   9269     if (lock3A) {
   9270         if (isUbiFocusEnabled() || isUbiRefocus()) {
   9271             //For Ubi focus move focus to infinity.
   9272             focus_mode = CAM_FOCUS_MODE_INFINITY;
   9273         } else if (isOptiZoomEnabled() || isStillMoreEnabled()) {
   9274             //For optizoom and stillmore, set focus as fixed.
   9275             focus_mode = CAM_FOCUS_MODE_FIXED;
   9276         }
   9277     } else {
   9278         // retrieve previous focus value.
   9279         const char *focus = get(KEY_FOCUS_MODE);
   9280         int val = lookupAttr(FOCUS_MODES_MAP, PARAM_MAP_SIZE(FOCUS_MODES_MAP), focus);
   9281         if (val != NAME_NOT_FOUND) {
   9282             focus_mode = (uint32_t) val;
   9283             LOGD("focus mode %s", focus);
   9284         }
   9285     }
   9286     //Lock AWB
   9287     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_AWB_LOCK, (uint32_t)lock3A)) {
   9288         return BAD_VALUE;
   9289     }
   9290     //Lock AEC
   9291     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_AEC_LOCK, (uint32_t)lock3A)) {
   9292         return BAD_VALUE;
   9293     }
   9294     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FOCUS_MODE, focus_mode)) {
   9295         return BAD_VALUE;
   9296     }
   9297 
   9298     rc = commitSetBatch();
   9299     if (rc != NO_ERROR) {
   9300         LOGE("Failed to commit batch");
   9301     }
   9302     return rc;
   9303 }
   9304 
   9305 /*===========================================================================
   9306  * FUNCTION   : setAndCommitZoom
   9307  *
   9308  * DESCRIPTION: set zoom.
   9309  *
   9310  * PARAMETERS :
   9311  *     @zoom_level : zoom level to set.
   9312  *
   9313  * RETURN     : int32_t type of status
   9314  *              NO_ERROR  -- success
   9315  *              none-zero failure code
   9316  *==========================================================================*/
   9317 int32_t QCameraParameters::setAndCommitZoom(int zoom_level)
   9318 {
   9319     LOGH("E");
   9320     int32_t rc = NO_ERROR;
   9321     if (initBatchUpdate() < 0 ) {
   9322         LOGE("Failed to initialize group update table");
   9323         return BAD_TYPE;
   9324     }
   9325 
   9326     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ZOOM, zoom_level)) {
   9327         LOGE("Failed to update table");
   9328         return BAD_VALUE;
   9329     }
   9330 
   9331     rc = commitSetBatch();
   9332     if (rc != NO_ERROR) {
   9333         LOGE("Failed to set Flash value");
   9334     }
   9335 
   9336     mZoomLevel = zoom_level;
   9337     LOGH("X");
   9338 
   9339     return rc;
   9340 }
   9341 
   9342 /*===========================================================================
   9343  * FUNCTION   : isOptiZoomEnabled
   9344  *
   9345  * DESCRIPTION: checks whether optizoom is enabled
   9346  *
   9347  * PARAMETERS :
   9348  *
   9349  * RETURN     : true - enabled, false - disabled
   9350  *
   9351  *==========================================================================*/
   9352 bool QCameraParameters::isOptiZoomEnabled()
   9353 {
   9354     if (m_bOptiZoomOn && (0 <= mParmZoomLevel)) {
   9355         uint32_t zoom_level = (uint32_t) mParmZoomLevel;
   9356         cam_opti_zoom_t *opti_zoom_settings_need =
   9357                 &(m_pCapability->opti_zoom_settings_need);
   9358         uint32_t zoom_threshold = (uint32_t) opti_zoom_settings_need->zoom_threshold;
   9359         LOGH("current zoom level =%u & zoom_threshold =%u",
   9360                  zoom_level, zoom_threshold);
   9361 
   9362         if (zoom_level >= zoom_threshold) {
   9363             return true;
   9364         }
   9365     }
   9366 
   9367     return false;
   9368 }
   9369 
   9370 /*===========================================================================
   9371  * FUNCTION   : setNoiseReductionMode
   9372  *
   9373  * DESCRIPTION: set noise reduction mode
   9374  *
   9375  * PARAMETERS :
   9376  *   @noiseReductionModeStr : noise reduction mode
   9377  *
   9378  * RETURN     : int32_t type of status
   9379  *              NO_ERROR  -- success
   9380  *              none-zero failure code
   9381  *==========================================================================*/
   9382 int32_t QCameraParameters::setNoiseReductionMode(const char *noiseReductionModeStr)
   9383 {
   9384     LOGH("noiseReductionModeStr = %s", noiseReductionModeStr);
   9385     if (noiseReductionModeStr != NULL) {
   9386         int value = lookupAttr(NOISE_REDUCTION_MODES_MAP, PARAM_MAP_SIZE(NOISE_REDUCTION_MODES_MAP),
   9387                 noiseReductionModeStr);
   9388         if (value != NAME_NOT_FOUND) {
   9389             m_bHighQualityNoiseReductionMode =
   9390                     !strncmp(VALUE_HIGH_QUALITY, noiseReductionModeStr, strlen(VALUE_HIGH_QUALITY));
   9391             updateParamEntry(KEY_QC_NOISE_REDUCTION_MODE, noiseReductionModeStr);
   9392             return NO_ERROR;
   9393         }
   9394     }
   9395     LOGE("Invalid noise reduction mode value: %s",
   9396             (noiseReductionModeStr == NULL) ? "NULL" : noiseReductionModeStr);
   9397     return BAD_VALUE;
   9398 }
   9399 
   9400 /*===========================================================================
   9401  * FUNCTION   : commitAFBracket
   9402  *
   9403  * DESCRIPTION: commit AF Bracket.
   9404  *
   9405  * PARAMETERS :
   9406  *   @AFBracket : AF bracketing configuration
   9407  *
   9408  * RETURN     : int32_t type of status
   9409  *              NO_ERROR  -- success
   9410  *              none-zero failure code
   9411  *==========================================================================*/
   9412 int32_t QCameraParameters::commitAFBracket(cam_af_bracketing_t afBracket)
   9413 {
   9414 
   9415     int32_t rc = NO_ERROR;
   9416     if(initBatchUpdate() < 0 ) {
   9417         LOGE("Failed to initialize group update table");
   9418         return BAD_TYPE;
   9419     }
   9420 
   9421     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FOCUS_BRACKETING, afBracket)) {
   9422         LOGE("Failed to update table");
   9423         return BAD_VALUE;
   9424     }
   9425 
   9426     rc = commitSetBatch();
   9427     if (rc != NO_ERROR) {
   9428         LOGE("Failed to commit batch");
   9429         return rc;
   9430     }
   9431 
   9432     return rc;
   9433 }
   9434 
   9435 /*===========================================================================
   9436  * FUNCTION   : setAFBracket
   9437  *
   9438  * DESCRIPTION: set AF bracket value
   9439  *
   9440  * PARAMETERS :
   9441  *   @afBracketStr : AF bracket value string
   9442  *
   9443  * RETURN     : int32_t type of status
   9444  *              NO_ERROR  -- success
   9445  *              none-zero failure code
   9446  *==========================================================================*/
   9447 int32_t QCameraParameters::setAFBracket(const char *afBracketStr)
   9448 {
   9449     LOGH("afBracketStr =%s",afBracketStr);
   9450 
   9451     if(afBracketStr != NULL) {
   9452         int value = lookupAttr(AF_BRACKETING_MODES_MAP, PARAM_MAP_SIZE(AF_BRACKETING_MODES_MAP),
   9453                 afBracketStr);
   9454         if (value != NAME_NOT_FOUND) {
   9455             m_bAFBracketingOn = (value != 0);
   9456             updateParamEntry(KEY_QC_AF_BRACKET, afBracketStr);
   9457 
   9458             return NO_ERROR;
   9459         }
   9460     }
   9461 
   9462     LOGE("Invalid af bracket value: %s",
   9463         (afBracketStr == NULL) ? "NULL" : afBracketStr);
   9464     return BAD_VALUE;
   9465 }
   9466 
   9467 /*===========================================================================
   9468  * FUNCTION   : setReFocus
   9469  *
   9470  * DESCRIPTION: set refocus value
   9471  *
   9472  * PARAMETERS :
   9473  *   @afBracketStr : refocus value string
   9474  *
   9475  * RETURN     : int32_t type of status
   9476  *              NO_ERROR  -- success
   9477  *              none-zero failure code
   9478  *==========================================================================*/
   9479 int32_t QCameraParameters::setReFocus(const char *reFocusStr)
   9480 {
   9481     LOGH("reFocusStr =%s",reFocusStr);
   9482 
   9483     if (reFocusStr != NULL) {
   9484         int value = lookupAttr(RE_FOCUS_MODES_MAP, PARAM_MAP_SIZE(RE_FOCUS_MODES_MAP),
   9485                 reFocusStr);
   9486         if (value != NAME_NOT_FOUND) {
   9487             m_bReFocusOn = (value != 0);
   9488             updateParamEntry(KEY_QC_RE_FOCUS, reFocusStr);
   9489             return NO_ERROR;
   9490         }
   9491     }
   9492 
   9493     return NO_ERROR;
   9494 }
   9495 
   9496 /*===========================================================================
   9497  * FUNCTION   : setChromaFlash
   9498  *
   9499  * DESCRIPTION: set chroma flash value
   9500  *
   9501  * PARAMETERS :
   9502  *   @aecBracketStr : chroma flash value string
   9503  *
   9504  * RETURN     : int32_t type of status
   9505  *              NO_ERROR  -- success
   9506  *              none-zero failure code
   9507  *==========================================================================*/
   9508 int32_t QCameraParameters::setChromaFlash(const char *chromaFlashStr)
   9509 {
   9510     LOGH("chromaFlashStr =%s",chromaFlashStr);
   9511     if(chromaFlashStr != NULL) {
   9512         int value = lookupAttr(CHROMA_FLASH_MODES_MAP, PARAM_MAP_SIZE(CHROMA_FLASH_MODES_MAP),
   9513                 chromaFlashStr);
   9514         if(value != NAME_NOT_FOUND) {
   9515             m_bChromaFlashOn = (value != 0);
   9516             updateParamEntry(KEY_QC_CHROMA_FLASH, chromaFlashStr);
   9517 
   9518             return NO_ERROR;
   9519         }
   9520     }
   9521 
   9522     LOGE("Invalid chroma flash value: %s",
   9523         (chromaFlashStr == NULL) ? "NULL" : chromaFlashStr);
   9524     return BAD_VALUE;
   9525 }
   9526 
   9527 /*===========================================================================
   9528  * FUNCTION   : setOptiZoom
   9529  *
   9530  * DESCRIPTION: set opti zoom value
   9531  *
   9532  * PARAMETERS :
   9533  *   @optiZoomStr : opti zoom value string
   9534  *
   9535  * RETURN     : int32_t type of status
   9536  *              NO_ERROR  -- success
   9537  *              none-zero failure code
   9538  *==========================================================================*/
   9539 int32_t QCameraParameters::setOptiZoom(const char *optiZoomStr)
   9540 {
   9541     LOGH("optiZoomStr =%s",optiZoomStr);
   9542     if(optiZoomStr != NULL) {
   9543         int value = lookupAttr(OPTI_ZOOM_MODES_MAP, PARAM_MAP_SIZE(OPTI_ZOOM_MODES_MAP),
   9544                 optiZoomStr);
   9545         if(value != NAME_NOT_FOUND) {
   9546             m_bOptiZoomOn = (value != 0);
   9547             updateParamEntry(KEY_QC_OPTI_ZOOM, optiZoomStr);
   9548 
   9549             return NO_ERROR;
   9550         }
   9551     }
   9552     LOGE("Invalid opti zoom value: %s",
   9553         (optiZoomStr == NULL) ? "NULL" : optiZoomStr);
   9554     return BAD_VALUE;
   9555 }
   9556 
   9557 /*===========================================================================
   9558  * FUNCTION   : setTruePortrait
   9559  *
   9560  * DESCRIPTION: set true portrait value
   9561  *
   9562  * PARAMETERS :
   9563  *   @optiZoomStr : true portrait value string
   9564  *
   9565  * RETURN     : int32_t type of status
   9566  *              NO_ERROR  -- success
   9567  *              none-zero failure code
   9568  *==========================================================================*/
   9569 int32_t QCameraParameters::setTruePortrait(const char *truePortraitStr)
   9570 {
   9571     LOGH("truePortraitStr =%s", truePortraitStr);
   9572     if (truePortraitStr != NULL) {
   9573         int value = lookupAttr(TRUE_PORTRAIT_MODES_MAP,
   9574                 PARAM_MAP_SIZE(TRUE_PORTRAIT_MODES_MAP),
   9575                 truePortraitStr);
   9576         if (value != NAME_NOT_FOUND) {
   9577             m_bTruePortraitOn = (value != 0);
   9578             updateParamEntry(KEY_QC_TRUE_PORTRAIT, truePortraitStr);
   9579             setFaceDetection(m_bFaceDetectionOn, false);
   9580             return NO_ERROR;
   9581         }
   9582     }
   9583     LOGH("Invalid true portrait value: %s",
   9584             (truePortraitStr == NULL) ? "NULL" : truePortraitStr);
   9585     return BAD_VALUE;
   9586 }
   9587 
   9588 /*===========================================================================
   9589  * FUNCTION   : setHDRMode
   9590  *
   9591  * DESCRIPTION: set hdr mode value
   9592  *
   9593  * PARAMETERS :
   9594  *   @hdrModeStr : hdr mode value string
   9595  *
   9596  * RETURN     : int32_t type of status
   9597  *              NO_ERROR  -- success
   9598  *              none-zero failure code
   9599  *==========================================================================*/
   9600 int32_t QCameraParameters::setHDRMode(const char *hdrModeStr)
   9601 {
   9602     LOGH("hdrModeStr =%s", hdrModeStr);
   9603     if (hdrModeStr != NULL) {
   9604         int value = lookupAttr(HDR_MODES_MAP, PARAM_MAP_SIZE(HDR_MODES_MAP), hdrModeStr);
   9605         if (value != NAME_NOT_FOUND) {
   9606             const char *str = get(KEY_SCENE_MODE);
   9607 
   9608             m_bHDRModeSensor = !strncmp(hdrModeStr, HDR_MODE_SENSOR, strlen(HDR_MODE_SENSOR));
   9609 
   9610             updateParamEntry(KEY_QC_HDR_MODE, hdrModeStr);
   9611 
   9612             // If hdr is already selected, need to deselect it in local cache
   9613             // So the new hdr mode will be applied
   9614             if (str && !strncmp(str, SCENE_MODE_HDR, strlen(SCENE_MODE_HDR))) {
   9615                 updateParamEntry(KEY_SCENE_MODE, SCENE_MODE_AUTO);
   9616                 m_bNeedRestart = true;
   9617             }
   9618 
   9619             return NO_ERROR;
   9620         }
   9621     }
   9622     LOGH("Invalid hdr mode value: %s",
   9623             (hdrModeStr == NULL) ? "NULL" : hdrModeStr);
   9624     return BAD_VALUE;
   9625 }
   9626 
   9627 /*===========================================================================
   9628  * FUNCTION   : setSeeMore
   9629  *
   9630  * DESCRIPTION: set see more value
   9631  *
   9632  * PARAMETERS :
   9633  *   @seeMoreStr : see more value string
   9634  *
   9635  * RETURN     : int32_t type of status
   9636  *              NO_ERROR  -- success
   9637  *              none-zero failure code
   9638  *==========================================================================*/
   9639 int32_t QCameraParameters::setSeeMore(const char *seeMoreStr)
   9640 {
   9641     int32_t rc = NO_ERROR;
   9642 
   9643     LOGH("seeMoreStr =%s", seeMoreStr);
   9644     if (seeMoreStr != NULL) {
   9645         int value = lookupAttr(ON_OFF_MODES_MAP,
   9646                 PARAM_MAP_SIZE(ON_OFF_MODES_MAP),
   9647                 seeMoreStr);
   9648         if (value != NAME_NOT_FOUND) {
   9649             m_bSeeMoreOn = (value != 0);
   9650 
   9651             // If SeeMore is enabled, enable StillMore for live snapshot
   9652             // and disable tone map
   9653             if (m_bSeeMoreOn) {
   9654                 m_bStillMoreOn = TRUE;
   9655                 if (!m_bLtmForSeeMoreEnabled) {
   9656                     rc = setToneMapMode(false, false);
   9657                 }
   9658                 if (rc != NO_ERROR) {
   9659                     LOGH("Failed to disable tone map during SeeMore");
   9660                 }
   9661             } else {
   9662                 m_bStillMoreOn = FALSE;
   9663                 if (!m_bLtmForSeeMoreEnabled) {
   9664                     rc = setToneMapMode(true, false);
   9665                 }
   9666                 if (rc != NO_ERROR) {
   9667                     LOGH("Failed to enable tone map during SeeMore");
   9668                 }
   9669             }
   9670             updateParamEntry(KEY_QC_SEE_MORE, seeMoreStr);
   9671             return NO_ERROR;
   9672         }
   9673     }
   9674     LOGE("Invalid see more value: %s",
   9675             (seeMoreStr == NULL) ? "NULL" : seeMoreStr);
   9676     return BAD_VALUE;
   9677 }
   9678 
   9679 /*===========================================================================
   9680  * FUNCTION   : setStillMore
   9681  *
   9682  * DESCRIPTION: set still more value
   9683  *
   9684  * PARAMETERS :
   9685  *   @seeMoreStr : still more value string
   9686  *
   9687  * RETURN     : int32_t type of status
   9688  *              NO_ERROR  -- success
   9689  *              none-zero failure code
   9690  *==========================================================================*/
   9691 int32_t QCameraParameters::setStillMore(const char *stillMoreStr)
   9692 {
   9693     LOGH("stillMoreStr =%s", stillMoreStr);
   9694     if (stillMoreStr != NULL) {
   9695         int value = lookupAttr(STILL_MORE_MODES_MAP, PARAM_MAP_SIZE(STILL_MORE_MODES_MAP),
   9696                 stillMoreStr);
   9697         if (value != NAME_NOT_FOUND) {
   9698             m_bStillMoreOn = (value != 0);
   9699             updateParamEntry(KEY_QC_STILL_MORE, stillMoreStr);
   9700 
   9701             return NO_ERROR;
   9702         }
   9703     }
   9704     LOGE("Invalid still more value: %s",
   9705             (stillMoreStr == NULL) ? "NULL" : stillMoreStr);
   9706     return BAD_VALUE;
   9707 }
   9708 
   9709 /*===========================================================================
   9710  * FUNCTION   : setHDRNeed1x
   9711  *
   9712  * DESCRIPTION: set hdr need 1x value
   9713  *
   9714  * PARAMETERS :
   9715  *   @hdrModeStr : hdr need 1x value string
   9716  *
   9717  * RETURN     : int32_t type of status
   9718  *              NO_ERROR  -- success
   9719  *              none-zero failure code
   9720  *==========================================================================*/
   9721 int32_t QCameraParameters::setHDRNeed1x(const char *hdrNeed1xStr)
   9722 {
   9723     LOGH("hdrNeed1xStr =%s", hdrNeed1xStr);
   9724     if (hdrNeed1xStr != NULL) {
   9725         int value = lookupAttr(TRUE_FALSE_MODES_MAP, PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP),
   9726                 hdrNeed1xStr);
   9727         if (value != NAME_NOT_FOUND) {
   9728             updateParamEntry(KEY_QC_HDR_NEED_1X, hdrNeed1xStr);
   9729             m_bHDR1xFrameEnabled = !strncmp(hdrNeed1xStr, VALUE_TRUE, strlen(VALUE_TRUE));
   9730             m_bNeedRestart = true;
   9731 
   9732             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HDR_NEED_1X,
   9733                     m_bHDR1xFrameEnabled)) {
   9734                 return BAD_VALUE;
   9735             }
   9736             return NO_ERROR;
   9737         }
   9738     }
   9739 
   9740     LOGH("Invalid hdr need 1x value: %s",
   9741             (hdrNeed1xStr == NULL) ? "NULL" : hdrNeed1xStr);
   9742     return BAD_VALUE;
   9743 }
   9744 
   9745 /*===========================================================================
   9746  * FUNCTION   : setAEBracketing
   9747  *
   9748  * DESCRIPTION: enables AE bracketing
   9749  *
   9750  * PARAMETERS :
   9751  *
   9752  * RETURN     : int32_t type of status
   9753  *              NO_ERROR  -- success
   9754  *              none-zero failure code
   9755  *==========================================================================*/
   9756 int32_t QCameraParameters::setAEBracketing()
   9757 {
   9758     int32_t rc = NO_ERROR;
   9759     if(initBatchUpdate() < 0 ) {
   9760         LOGE("Failed to initialize group update table");
   9761         return BAD_TYPE;
   9762     }
   9763 
   9764     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HDR, m_AEBracketingClient)) {
   9765         LOGE("Failed to update AE bracketing");
   9766         return BAD_VALUE;
   9767     }
   9768 
   9769     rc = commitSetBatch();
   9770     if (rc != NO_ERROR) {
   9771         LOGE("Failed to configure AE bracketing");
   9772         return rc;
   9773     }
   9774 
   9775     return rc;
   9776 }
   9777 
   9778 /*===========================================================================
   9779  * FUNCTION   : setHDRAEBracket
   9780  *
   9781  * DESCRIPTION: enables AE bracketing for HDR
   9782  *
   9783  * PARAMETERS :
   9784  *   @hdrBracket : HDR bracketing configuration
   9785  *
   9786  * RETURN     : int32_t type of status
   9787  *              NO_ERROR  -- success
   9788  *              none-zero failure code
   9789  *==========================================================================*/
   9790 int32_t QCameraParameters::setHDRAEBracket(cam_exp_bracketing_t hdrBracket)
   9791 {
   9792     int32_t rc = NO_ERROR;
   9793     if(initBatchUpdate() < 0 ) {
   9794         LOGE("Failed to initialize group update table");
   9795         return BAD_TYPE;
   9796     }
   9797 
   9798     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HDR, hdrBracket)) {
   9799         LOGE("Failed to update table");
   9800         return BAD_TYPE;
   9801     }
   9802 
   9803     rc = commitSetBatch();
   9804     if (rc != NO_ERROR) {
   9805         LOGE("Failed to configure HDR bracketing");
   9806         return rc;
   9807     }
   9808 
   9809     return rc;
   9810 }
   9811 
   9812 /*===========================================================================
   9813  * FUNCTION   : setCacheVideoBuffers
   9814  *
   9815  * DESCRIPTION: set cache video buffers value
   9816  *
   9817  * PARAMETERS :
   9818  *   @cacheVideoStr : cache video buffer value string
   9819  *
   9820  * RETURN     : int32_t type of status
   9821  *              NO_ERROR  -- success
   9822  *              none-zero failure code
   9823  *==========================================================================*/
   9824 int32_t QCameraParameters::setCacheVideoBuffers(const char *cacheVideoBufStr)
   9825 {
   9826     if (cacheVideoBufStr != NULL) {
   9827         int8_t cacheVideoBuf = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   9828                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), cacheVideoBufStr);
   9829         char prop[PROPERTY_VALUE_MAX];
   9830         memset(prop, 0, sizeof(prop));
   9831         property_get("persist.camera.mem.usecache", prop, "");
   9832         if (strlen(prop) > 0) {
   9833             cacheVideoBuf = atoi(prop);
   9834         }
   9835         if (cacheVideoBuf != NAME_NOT_FOUND) {
   9836             const char *cacheStr = (strlen(prop)>0) ? prop : cacheVideoBufStr;
   9837             LOGD("Setting video buffer %s",
   9838                     (cacheVideoBuf == 0) ? "UnCached" : "Cached");
   9839             return updateParamEntry(KEY_QC_CACHE_VIDEO_BUFFERS, cacheStr);
   9840         }
   9841         LOGE("Cache video buffers not set correctly");
   9842     }
   9843     return BAD_VALUE;
   9844 }
   9845 
   9846 
   9847 /*===========================================================================
   9848  * FUNCTION   : setCacheVideoBuffers
   9849  *
   9850  * DESCRIPTION: Set buffers as Cache/Uncache Memory
   9851  *
   9852  * PARAMETERS :
   9853  *   @params  : user setting parameters
   9854  *
   9855  * RETURN     : int32_t type of status
   9856  *              NO_ERROR  -- success
   9857  *              none-zero failure code
   9858  *==========================================================================*/
   9859 int32_t QCameraParameters::setCacheVideoBuffers(const QCameraParameters& params)
   9860 {
   9861     const char *str = params.get(KEY_QC_CACHE_VIDEO_BUFFERS);;
   9862     const char *prev_str = get(KEY_QC_CACHE_VIDEO_BUFFERS);
   9863 
   9864     if (str != NULL) {
   9865         if (prev_str == NULL ||
   9866                 strcmp(str, prev_str) != 0) {
   9867             return setCacheVideoBuffers(str);
   9868         }
   9869     }
   9870     return NO_ERROR;
   9871 }
   9872 
   9873 /*===========================================================================
   9874  * FUNCTION   : restoreAEBracket
   9875  *
   9876  * DESCRIPTION: restores client AE bracketing configuration after HDR is done
   9877  *
   9878  * PARAMETERS :
   9879  *
   9880  * RETURN     : int32_t type of status
   9881  *              NO_ERROR  -- success
   9882  *              none-zero failure code
   9883  *==========================================================================*/
   9884 int32_t QCameraParameters::stopAEBracket()
   9885 {
   9886   cam_exp_bracketing_t bracketing;
   9887 
   9888   bracketing.mode = CAM_EXP_BRACKETING_OFF;
   9889 
   9890   return setHDRAEBracket(bracketing);
   9891 }
   9892 
   9893 /*===========================================================================
   9894  * FUNCTION   : updateFlash
   9895  *
   9896  * DESCRIPTION: restores client flash configuration or disables flash
   9897  *
   9898  * PARAMETERS :
   9899  *   @commitSettings : flag indicating whether settings need to be commited
   9900  *
   9901  * RETURN     : int32_t type of status
   9902  *              NO_ERROR  -- success
   9903  *              none-zero failure code
   9904  *==========================================================================*/
   9905 int32_t QCameraParameters::updateFlash(bool commitSettings)
   9906 {
   9907     int32_t rc = NO_ERROR;
   9908     int32_t value;
   9909 
   9910     if (commitSettings) {
   9911       if(initBatchUpdate() < 0 ) {
   9912           LOGE("Failed to initialize group update table");
   9913           return BAD_TYPE;
   9914       }
   9915     }
   9916     // Turn Off Flash if any of the below AOST features are enabled
   9917     if (isHDREnabled() || m_bAeBracketingEnabled || m_bAFBracketingOn ||
   9918           m_bOptiZoomOn || m_bReFocusOn || (m_bStillMoreOn && !m_bSeeMoreOn)) {
   9919         value = CAM_FLASH_MODE_OFF;
   9920     } else if (m_bChromaFlashOn) {
   9921         value = CAM_FLASH_MODE_ON;
   9922     } else {
   9923         value = mFlashValue;
   9924     }
   9925 
   9926     if (value != mFlashDaemonValue) {
   9927         LOGD("Setting Flash value %d", value);
   9928         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_LED_MODE, value)) {
   9929             LOGE("Failed to set led mode");
   9930             return BAD_VALUE;
   9931         }
   9932         mFlashDaemonValue = value;
   9933     } else {
   9934         rc = NO_ERROR;
   9935     }
   9936 
   9937     if (commitSettings) {
   9938         rc = commitSetBatch();
   9939         if (rc != NO_ERROR) {
   9940             LOGE("Failed to configure HDR bracketing");
   9941             return rc;
   9942         }
   9943     }
   9944 
   9945     return rc;
   9946 }
   9947 
   9948 /*===========================================================================
   9949  * FUNCTION   : setRedeyeReduction
   9950  *
   9951  * DESCRIPTION: set red eye reduction value
   9952  *
   9953  * PARAMETERS :
   9954  *   @redeyeStr : red eye reduction value string
   9955  *
   9956  * RETURN     : int32_t type of status
   9957  *              NO_ERROR  -- success
   9958  *              none-zero failure code
   9959  *==========================================================================*/
   9960 int32_t QCameraParameters::setRedeyeReduction(const char *redeyeStr)
   9961 {
   9962     if (redeyeStr != NULL) {
   9963         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   9964                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), redeyeStr);
   9965         if (value != NAME_NOT_FOUND) {
   9966             LOGD("Setting RedEye Reduce value %s", redeyeStr);
   9967             updateParamEntry(KEY_QC_REDEYE_REDUCTION, redeyeStr);
   9968             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   9969                     CAM_INTF_PARM_REDEYE_REDUCTION, value)) {
   9970                 return BAD_VALUE;
   9971             }
   9972             return NO_ERROR;
   9973         }
   9974     }
   9975     LOGE("Invalid RedEye Reduce value: %s",
   9976            (redeyeStr == NULL) ? "NULL" : redeyeStr);
   9977     return BAD_VALUE;
   9978 }
   9979 
   9980 /*===========================================================================
   9981  * FUNCTION   : getDenoiseProcessPlate
   9982  *
   9983  * DESCRIPTION: query denoise process plate
   9984  *
   9985  * PARAMETERS : None
   9986  *
   9987  * RETURN     : NR process plate vlaue
   9988  *==========================================================================*/
   9989 cam_denoise_process_type_t
   9990         QCameraParameters::getDenoiseProcessPlate(cam_intf_parm_type_t type)
   9991 {
   9992     char prop[PROPERTY_VALUE_MAX];
   9993     memset(prop, 0, sizeof(prop));
   9994     cam_denoise_process_type_t processPlate = CAM_WAVELET_DENOISE_CBCR_ONLY;
   9995     if (CAM_INTF_PARM_WAVELET_DENOISE == type) {
   9996         property_get("persist.denoise.process.plates", prop, "");
   9997     } else if (CAM_INTF_PARM_TEMPORAL_DENOISE == type) {
   9998         property_get("persist.tnr.process.plates", prop, "");
   9999     } else {
   10000         LOGW("Type not supported");
   10001         prop[0] = '\0';
   10002     }
   10003     if (strlen(prop) > 0) {
   10004         switch(atoi(prop)) {
   10005         case 0:
   10006             processPlate = CAM_WAVELET_DENOISE_YCBCR_PLANE;
   10007             break;
   10008         case 1:
   10009             processPlate = CAM_WAVELET_DENOISE_CBCR_ONLY;
   10010             break;
   10011         case 2:
   10012             processPlate = CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
   10013             break;
   10014         case 3:
   10015             processPlate = CAM_WAVELET_DENOISE_STREAMLINED_CBCR;
   10016             break;
   10017         default:
   10018             processPlate = CAM_WAVELET_DENOISE_CBCR_ONLY;
   10019             break;
   10020         }
   10021     }
   10022     return processPlate;
   10023 }
   10024 
   10025 /*===========================================================================
   10026  * FUNCTION   : setWaveletDenoise
   10027  *
   10028  * DESCRIPTION: set wavelet denoise value
   10029  *
   10030  * PARAMETERS :
   10031  *   @wnrStr : wavelet denoise value string
   10032  *
   10033  * RETURN     : int32_t type of status
   10034  *              NO_ERROR  -- success
   10035  *              none-zero failure code
   10036  *==========================================================================*/
   10037 int32_t QCameraParameters::setWaveletDenoise(const char *wnrStr)
   10038 {
   10039     if ((m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_DENOISE2D) == 0){
   10040         LOGH("WNR is not supported");
   10041         return NO_ERROR;
   10042     }
   10043 
   10044     if (wnrStr != NULL) {
   10045         int value = lookupAttr(DENOISE_ON_OFF_MODES_MAP,
   10046                 PARAM_MAP_SIZE(DENOISE_ON_OFF_MODES_MAP), wnrStr);
   10047         if (value != NAME_NOT_FOUND) {
   10048             updateParamEntry(KEY_QC_DENOISE, wnrStr);
   10049 
   10050             cam_denoise_param_t temp;
   10051             memset(&temp, 0, sizeof(temp));
   10052             temp.denoise_enable = (uint8_t)value;
   10053             m_bWNROn = (value != 0);
   10054             if (m_bWNROn) {
   10055                 temp.process_plates = getDenoiseProcessPlate(CAM_INTF_PARM_WAVELET_DENOISE);
   10056             }
   10057             LOGD("Denoise enable=%d, plates=%d",
   10058                    temp.denoise_enable, temp.process_plates);
   10059             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_WAVELET_DENOISE, temp)) {
   10060                 return BAD_VALUE;
   10061             }
   10062             return NO_ERROR;
   10063         }
   10064     }
   10065     LOGE("Invalid Denoise value: %s", (wnrStr == NULL) ? "NULL" : wnrStr);
   10066     return BAD_VALUE;
   10067 }
   10068 
   10069 /*===========================================================================
   10070  * FUNCTION   : setRdiMode
   10071  *
   10072  * DESCRIPTION: set rdi mode value
   10073  *
   10074  * PARAMETERS :
   10075  *   @str     : rdi mode value string
   10076  *
   10077  * RETURN     : int32_t type of status
   10078  *              NO_ERROR  -- success
   10079  *              none-zero failure code
   10080  *==========================================================================*/
   10081 int32_t QCameraParameters::setRdiMode(const char *str)
   10082 {
   10083     LOGD("RDI_DEBUG  rdi mode value: %s", str);
   10084 
   10085     if (str != NULL) {
   10086         int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   10087                 PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), str);
   10088         if (value != NAME_NOT_FOUND) {
   10089             updateParamEntry(KEY_QC_RDI_MODE, str);
   10090             m_bRdiMode = (value == 0) ? false : true;
   10091             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_RDI_MODE, value)) {
   10092                 return BAD_VALUE;
   10093             }
   10094             return NO_ERROR;
   10095         }
   10096     }
   10097     LOGE("Invalid rdi mode value: %s", (str == NULL) ? "NULL" : str);
   10098     return BAD_VALUE;
   10099 }
   10100 
   10101 
   10102 /*===========================================================================
   10103  * FUNCTION   : setSecureMode
   10104  *
   10105  * DESCRIPTION: set secure mode value
   10106  *
   10107  * PARAMETERS :
   10108  *   @str     : secure mode value string
   10109  *
   10110  * RETURN     : int32_t type of status
   10111  *              NO_ERROR  -- success
   10112  *              none-zero failure code
   10113  *==========================================================================*/
   10114 int32_t QCameraParameters::setSecureMode(const char *str)
   10115 {
   10116   LOGD("Secure mode value: %s", str);
   10117 
   10118   if (str != NULL) {
   10119     int32_t value = lookupAttr(ENABLE_DISABLE_MODES_MAP,
   10120             PARAM_MAP_SIZE(ENABLE_DISABLE_MODES_MAP), str);
   10121     if (value != NAME_NOT_FOUND) {
   10122         m_bSecureMode = (value == 0)? false : true;
   10123         return NO_ERROR;
   10124     }
   10125   }
   10126   LOGE("Invalid Secure mode value: %s",
   10127      (str == NULL) ? "NULL" : str);
   10128   return BAD_VALUE;
   10129 }
   10130 
   10131 /*===========================================================================
   10132  * FUNCTION   : getStreamRotation
   10133  *
   10134  * DESCRIPTION: get stream rotation by its type
   10135  *
   10136  * PARAMETERS :
   10137  *   @streamType        : stream type
   10138  *
   10139  * RETURN     : rotation value for stream
   10140  *==========================================================================*/
   10141 cam_rotation_t QCameraParameters::getStreamRotation(cam_stream_type_t streamType)
   10142 {
   10143     cam_rotation_t rotation = ROTATE_0;
   10144     const char *str = get(KEY_QC_VIDEO_ROTATION);
   10145     int rotationParam = lookupAttr(VIDEO_ROTATION_MODES_MAP,
   10146             PARAM_MAP_SIZE(VIDEO_ROTATION_MODES_MAP), str);
   10147     switch (streamType) {
   10148         case CAM_STREAM_TYPE_VIDEO:
   10149             switch(rotationParam) {
   10150                 case 90:
   10151                     rotation = ROTATE_90;
   10152                     break;
   10153                 case 180:
   10154                     rotation = ROTATE_180;
   10155                     break;
   10156                 case 270:
   10157                     rotation = ROTATE_270;
   10158                     break;
   10159                 default:
   10160                     rotation = ROTATE_0;
   10161             }
   10162             break;
   10163         default:
   10164             break;
   10165     }
   10166     return rotation;
   10167 }
   10168 
   10169 /*===========================================================================
   10170  * FUNCTION   : getStreamRotation
   10171  *
   10172  * DESCRIPTION: get stream rotation by its type
   10173  *
   10174  * PARAMETERS :
   10175  *   @streamType        : stream type
   10176  *   @featureConfig     : stream feature config structure
   10177  *   @dim               : stream dimension
   10178  *
   10179  * RETURN     : int32_t type of status
   10180  *              NO_ERROR  -- success
   10181  *              none-zero failure code
   10182  *==========================================================================*/
   10183 int32_t QCameraParameters::getStreamRotation(cam_stream_type_t streamType,
   10184                                             cam_pp_feature_config_t &featureConfig,
   10185                                             cam_dimension_t &dim)
   10186 {
   10187     int32_t ret = NO_ERROR;
   10188 
   10189     cam_rotation_t rotation = getStreamRotation(streamType);
   10190     featureConfig.rotation = ROTATE_0;
   10191     int swapDim = 0;
   10192     switch (streamType) {
   10193         case CAM_STREAM_TYPE_VIDEO:
   10194             switch(rotation) {
   10195                 case ROTATE_90:
   10196                     featureConfig.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
   10197                     featureConfig.rotation = ROTATE_90;
   10198                     swapDim = 1;
   10199                     break;
   10200                 case ROTATE_180:
   10201                     featureConfig.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
   10202                     featureConfig.rotation = ROTATE_180;
   10203                     break;
   10204                 case ROTATE_270:
   10205                     featureConfig.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
   10206                     featureConfig.rotation = ROTATE_270;
   10207                     swapDim = 1;
   10208                     break;
   10209                 default:
   10210                     featureConfig.rotation = ROTATE_0;
   10211             }
   10212             break;
   10213         case CAM_STREAM_TYPE_PREVIEW:
   10214         case CAM_STREAM_TYPE_POSTVIEW:
   10215         case CAM_STREAM_TYPE_SNAPSHOT:
   10216         case CAM_STREAM_TYPE_RAW:
   10217         case CAM_STREAM_TYPE_METADATA:
   10218         case CAM_STREAM_TYPE_OFFLINE_PROC:
   10219         case CAM_STREAM_TYPE_DEFAULT:
   10220         default:
   10221             break;
   10222     }
   10223 
   10224     if (swapDim > 0) {
   10225         int w = 0;
   10226         w = dim.width;
   10227         dim.width = dim.height;
   10228         dim.height = w;
   10229     }
   10230     return ret;
   10231 }
   10232 
   10233 int32_t QCameraParameters::getStreamSubFormat(cam_stream_type_t streamType,
   10234                             cam_sub_format_type_t &sub_format)
   10235 {
   10236     int32_t ret = NO_ERROR;
   10237     sub_format = CAM_FORMAT_SUBTYPE_MAX;
   10238 
   10239     switch (streamType) {
   10240         case CAM_STREAM_TYPE_RAW: {
   10241           char raw_sub_format[PROPERTY_VALUE_MAX];
   10242           int rawSubFormat;
   10243           memset(raw_sub_format, 0, sizeof(raw_sub_format));
   10244           /*Default value is CAM_FORMAT_SUBTYPE_PDAF_STATS*/
   10245           property_get("persist.camera.raw.subformat", raw_sub_format, "1");
   10246           rawSubFormat = atoi(raw_sub_format);
   10247           sub_format = (cam_sub_format_type_t)rawSubFormat;
   10248           LOGH("Subformat for raw stream = %d", sub_format);
   10249         }
   10250             break;
   10251         default:
   10252             break;
   10253     }
   10254     return ret;
   10255 }
   10256 /*===========================================================================
   10257  * FUNCTION   : getStreamFormat
   10258  *
   10259  * DESCRIPTION: get stream format by its type
   10260  *
   10261  * PARAMETERS :
   10262  *   @streamType : [input] stream type
   10263  *   @format     : [output] stream format
   10264  *
   10265  * RETURN     : int32_t type of status
   10266  *              NO_ERROR  -- success
   10267  *              none-zero failure code
   10268  *==========================================================================*/
   10269 int32_t QCameraParameters::getStreamFormat(cam_stream_type_t streamType,
   10270                                             cam_format_t &format)
   10271 {
   10272     int32_t ret = NO_ERROR;
   10273     format = CAM_FORMAT_MAX;
   10274     switch (streamType) {
   10275     case CAM_STREAM_TYPE_PREVIEW:
   10276         if (!isUBWCEnabled()) {
   10277 #if VENUS_PRESENT
   10278             cam_dimension_t preview;
   10279             cam_dimension_t video;
   10280             getStreamDimension(CAM_STREAM_TYPE_VIDEO , video);
   10281             getStreamDimension(CAM_STREAM_TYPE_PREVIEW, preview);
   10282             if (getRecordingHintValue() == true &&
   10283                     video.width == preview.width &&
   10284                     video.height == preview.height &&
   10285                     mPreviewFormat == CAM_FORMAT_YUV_420_NV21) {
   10286                 format = CAM_FORMAT_YUV_420_NV21_VENUS;
   10287             } else
   10288 #endif
   10289             format = mPreviewFormat;
   10290         } else {
   10291             cam_dimension_t preview;
   10292             cam_dimension_t video;
   10293             getStreamDimension(CAM_STREAM_TYPE_VIDEO , video);
   10294             getStreamDimension(CAM_STREAM_TYPE_PREVIEW, preview);
   10295             /* Disable UBWC for preview, though supported, to take advantage of CPP duplication*/
   10296             if (getRecordingHintValue() == true && (!QCameraCommon::isVideoUBWCEnabled()) &&
   10297                 (video.width == preview.width) &&
   10298                 (video.height == preview.height)) {
   10299 #if VENUS_PRESENT
   10300             format = CAM_FORMAT_YUV_420_NV21_VENUS;
   10301 #else
   10302             format = CAM_FORMAT_YUV_420_NV21;
   10303 #endif
   10304             }else {
   10305                 format = mPreviewFormat;
   10306             }
   10307         }
   10308         break;
   10309     case CAM_STREAM_TYPE_POSTVIEW:
   10310     case CAM_STREAM_TYPE_CALLBACK:
   10311         format = mAppPreviewFormat;
   10312         break;
   10313     case CAM_STREAM_TYPE_ANALYSIS:
   10314         cam_analysis_info_t analysisInfo;
   10315         cam_feature_mask_t featureMask;
   10316 
   10317         featureMask = 0;
   10318         getStreamPpMask(CAM_STREAM_TYPE_ANALYSIS, featureMask);
   10319         ret = getAnalysisInfo(
   10320                 ((getRecordingHintValue() == true) && fdModeInVideo()),
   10321                 featureMask,
   10322                 &analysisInfo);
   10323         if (ret != NO_ERROR) {
   10324             LOGE("getAnalysisInfo failed, ret = %d", ret);
   10325             return ret;
   10326         }
   10327 
   10328         if (analysisInfo.hw_analysis_supported &&
   10329                 analysisInfo.analysis_format == CAM_FORMAT_Y_ONLY) {
   10330             format = analysisInfo.analysis_format;
   10331         } else {
   10332             if (analysisInfo.hw_analysis_supported) {
   10333                 LOGW("Invalid analysis_format %d\n",
   10334                         analysisInfo.analysis_format);
   10335             }
   10336             format = mAppPreviewFormat;
   10337         }
   10338         break;
   10339     case CAM_STREAM_TYPE_SNAPSHOT:
   10340         if ( mPictureFormat == CAM_FORMAT_YUV_422_NV16 ) {
   10341             format = CAM_FORMAT_YUV_422_NV16;
   10342         } else {
   10343             char prop[PROPERTY_VALUE_MAX];
   10344             int snapshotFormat;
   10345             memset(prop, 0, sizeof(prop));
   10346             property_get("persist.camera.snap.format", prop, "0");
   10347             snapshotFormat = atoi(prop);
   10348             if(snapshotFormat == 1) {
   10349                 format = CAM_FORMAT_YUV_422_NV61;
   10350             } else {
   10351                 format = CAM_FORMAT_YUV_420_NV21;
   10352             }
   10353         }
   10354         break;
   10355     case CAM_STREAM_TYPE_VIDEO:
   10356         if (isUBWCEnabled()) {
   10357             if (QCameraCommon::isVideoUBWCEnabled()) {
   10358                 format = CAM_FORMAT_YUV_420_NV12_UBWC;
   10359             } else {
   10360                 format = CAM_FORMAT_YUV_420_NV21_VENUS;
   10361             }
   10362         } else{
   10363 #if VENUS_PRESENT
   10364             format = CAM_FORMAT_YUV_420_NV21_VENUS;
   10365 #else
   10366             format = CAM_FORMAT_YUV_420_NV21;
   10367 #endif
   10368         }
   10369         break;
   10370     case CAM_STREAM_TYPE_RAW:
   10371         if ((isRdiMode()) || (getofflineRAW())|| (getQuadraCfa()) || (isSecureMode())) {
   10372             format = m_pCapability->rdi_mode_stream_fmt;
   10373         } else if (mPictureFormat >= CAM_FORMAT_YUV_RAW_8BIT_YUYV) {
   10374             format = (cam_format_t)mPictureFormat;
   10375         } else {
   10376             char raw_format[PROPERTY_VALUE_MAX];
   10377             int rawFormat;
   10378             memset(raw_format, 0, sizeof(raw_format));
   10379             /*Default value is CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GBRG*/
   10380             property_get("persist.camera.raw.format", raw_format, "17");
   10381             rawFormat = atoi(raw_format);
   10382             format = (cam_format_t)rawFormat;
   10383             LOGH("Raw stream format %d bundled with snapshot",
   10384                     format);
   10385         }
   10386         break;
   10387     case CAM_STREAM_TYPE_OFFLINE_PROC:
   10388         if (getQuadraCfa()) {
   10389             if (m_pCapability->color_arrangement == CAM_FILTER_ARRANGEMENT_BGGR) {
   10390                 format = CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_BGGR;
   10391             } else if (m_pCapability->color_arrangement == CAM_FILTER_ARRANGEMENT_GBRG) {
   10392                 format = CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_GBRG;
   10393             } else if (m_pCapability->color_arrangement == CAM_FILTER_ARRANGEMENT_GRBG) {
   10394                 format = CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_GRBG;
   10395             } else if (m_pCapability->color_arrangement == CAM_FILTER_ARRANGEMENT_RGGB) {
   10396                 format = CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_RGGB;
   10397             } else {
   10398                 LOGW("Unrecognized format set by sensor, setting default");
   10399                 format = m_pCapability->quadra_cfa_format;
   10400             }
   10401         }
   10402         break;
   10403     case CAM_STREAM_TYPE_METADATA:
   10404     case CAM_STREAM_TYPE_DEFAULT:
   10405     default:
   10406         break;
   10407     }
   10408 
   10409     LOGD("Stream type = %d Stream Format = %d", streamType, format);
   10410     return ret;
   10411 }
   10412 
   10413 /*===========================================================================
   10414  * FUNCTION   : getFlipMode
   10415  *
   10416  * DESCRIPTION: get flip mode
   10417  *
   10418  * PARAMETERS :
   10419  *   @cam_intf_parm_type_t : [input] stream type
   10420  *
   10421  * RETURN     : int type of flip mode
   10422  *              0 - no filp
   10423  *              1 - FLIP_H
   10424  *              2 - FLIP_V
   10425  *              3 - FLIP_H | FLIP_V
   10426  *==========================================================================*/
   10427 int QCameraParameters::getFlipMode(cam_stream_type_t type)
   10428 {
   10429     const char *str = NULL;
   10430     int flipMode = 0; // no flip
   10431 
   10432     switch(type){
   10433     case CAM_STREAM_TYPE_PREVIEW:
   10434         if (!isRdiMode()) {
   10435             str = get(KEY_QC_PREVIEW_FLIP);
   10436         }
   10437         break;
   10438     case CAM_STREAM_TYPE_VIDEO:
   10439         str = get(KEY_QC_VIDEO_FLIP);
   10440         break;
   10441     case CAM_STREAM_TYPE_SNAPSHOT:
   10442     case CAM_STREAM_TYPE_POSTVIEW:
   10443         str = get(KEY_QC_SNAPSHOT_PICTURE_FLIP);
   10444         break;
   10445     default:
   10446         LOGD("No flip mode for stream type %d", type);
   10447         break;
   10448     }
   10449 
   10450     if(str != NULL){
   10451         //Need give corresponding filp value based on flip mode strings
   10452         int value = lookupAttr(FLIP_MODES_MAP, PARAM_MAP_SIZE(FLIP_MODES_MAP), str);
   10453         if(value != NAME_NOT_FOUND)
   10454             flipMode = value;
   10455         }
   10456 
   10457     LOGH("the filp mode of stream type %d is %d .", type, flipMode);
   10458     return flipMode;
   10459 }
   10460 
   10461 /*===========================================================================
   10462  * FUNCTION   : isSnapshotFDNeeded
   10463  *
   10464  * DESCRIPTION: check whether Face Detection Metadata is needed
   10465  *
   10466  * PARAMETERS : none
   10467  *
   10468  * RETURN     : bool type of status
   10469  *              0 - need
   10470  *              1 - not need
   10471  *==========================================================================*/
   10472 bool QCameraParameters::isSnapshotFDNeeded()
   10473 {
   10474     return getInt(KEY_QC_SNAPSHOT_FD_DATA);
   10475 }
   10476 
   10477 /*===========================================================================
   10478  * FUNCTION   : getStreamDimension
   10479  *
   10480  * DESCRIPTION: get stream dimension by its type
   10481  *
   10482  * PARAMETERS :
   10483  *   @streamType : [input] stream type
   10484  *   @dim             : [output] stream dimension
   10485  *   @cam_type    : Camera type in case of dual camera
   10486  *
   10487  * RETURN     : int32_t type of status
   10488  *              NO_ERROR  -- success
   10489  *              none-zero failure code
   10490  *==========================================================================*/
   10491 int32_t QCameraParameters::getStreamDimension(cam_stream_type_t streamType,
   10492         cam_dimension_t &dim, uint32_t cam_type)
   10493 {
   10494     int32_t ret = NO_ERROR;
   10495     memset(&dim, 0, sizeof(cam_dimension_t));
   10496 
   10497     switch (streamType) {
   10498     case CAM_STREAM_TYPE_PREVIEW:
   10499     case CAM_STREAM_TYPE_CALLBACK:
   10500         getPreviewSize(&dim.width, &dim.height);
   10501         break;
   10502     case CAM_STREAM_TYPE_POSTVIEW:
   10503         getPreviewSize(&dim.width, &dim.height);
   10504         break;
   10505     case CAM_STREAM_TYPE_SNAPSHOT:
   10506         if (isPostProcScaling()) {
   10507             getMaxPicSize(dim);
   10508         } else if (getRecordingHintValue()) {
   10509             // live snapshot
   10510             getLiveSnapshotSize(dim);
   10511         } else {
   10512             getPictureSize(&dim.width, &dim.height);
   10513         }
   10514         if (isDCmAsymmetricSnapMode()) {
   10515             int32_t supportedWidth = 0, supportedHeight = 0;
   10516             if (cam_type & MM_CAMERA_TYPE_MAIN) {
   10517                 supportedWidth = m_pCapability->main_cam_cap->picture_sizes_tbl[0].width;
   10518                 supportedHeight = m_pCapability->main_cam_cap->picture_sizes_tbl[0].height;
   10519             } else {
   10520                 supportedWidth = m_pCapability->aux_cam_cap->picture_sizes_tbl[0].width;
   10521                 supportedHeight = m_pCapability->aux_cam_cap->picture_sizes_tbl[0].height;
   10522             }
   10523             if ((dim.width * dim.height) >
   10524                     (supportedWidth * supportedHeight)){
   10525                 dim.width = supportedWidth;
   10526                 dim.height = supportedHeight;
   10527             }
   10528         }
   10529         break;
   10530     case CAM_STREAM_TYPE_VIDEO:
   10531         getVideoSize(&dim.width, &dim.height);
   10532         break;
   10533     case CAM_STREAM_TYPE_RAW:
   10534         //dim = m_pCapability->raw_dim;
   10535         getRawSize(dim);
   10536         break;
   10537     case CAM_STREAM_TYPE_METADATA:
   10538         dim.width = (int32_t)sizeof(metadata_buffer_t);
   10539         dim.height = 1;
   10540         break;
   10541     case CAM_STREAM_TYPE_OFFLINE_PROC:
   10542         if (isPostProcScaling() || isDCmAsymmetricSnapMode()) {
   10543             if (getRecordingHintValue()) {
   10544                 // live snapshot
   10545                 getLiveSnapshotSize(dim);
   10546             } else {
   10547                 getPictureSize(&dim.width, &dim.height);
   10548             }
   10549         }
   10550         break;
   10551     case CAM_STREAM_TYPE_ANALYSIS:
   10552         cam_dimension_t prv_dim;
   10553 
   10554         /* Analysis stream need aspect ratio as preview stream */
   10555         getPreviewSize(&prv_dim.width, &prv_dim.height);
   10556 
   10557         cam_analysis_info_t analysisInfo;
   10558         cam_feature_mask_t featureMask;
   10559 
   10560         featureMask = 0;
   10561         getStreamPpMask(CAM_STREAM_TYPE_ANALYSIS, featureMask);
   10562         ret = getAnalysisInfo(
   10563                 ((getRecordingHintValue() == true) && fdModeInVideo()),
   10564                 featureMask,
   10565                 &analysisInfo);
   10566         if (ret != NO_ERROR) {
   10567             LOGE("getAnalysisInfo failed, ret = %d", ret);
   10568             return ret;
   10569         }
   10570 
   10571         dim = mCommon.getMatchingDimension(
   10572                 prv_dim, analysisInfo.analysis_recommended_res);
   10573         break;
   10574     case CAM_STREAM_TYPE_DEFAULT:
   10575     default:
   10576         LOGE("no dimension for unsupported stream type %d",
   10577                streamType);
   10578         ret = BAD_VALUE;
   10579         break;
   10580     }
   10581 
   10582     LOGD("Stream type = %d Stream Dimension = %d X %d",
   10583              streamType, dim.width, dim.height);
   10584     return ret;
   10585 }
   10586 
   10587 /*===========================================================================
   10588  * FUNCTION   : getParameters
   10589  *
   10590  * DESCRIPTION: Return a C string containing the parameters
   10591  *
   10592  * PARAMETERS : none
   10593  *
   10594  * RETURN     : a string containing parameter pairs
   10595  *==========================================================================*/
   10596 char* QCameraParameters::getParameters()
   10597 {
   10598     char* strParams = NULL;
   10599     String8 str;
   10600 
   10601     int cur_width, cur_height;
   10602     //Need take care Scale picture size
   10603     if(m_reprocScaleParam.isScaleEnabled() &&
   10604         m_reprocScaleParam.isUnderScaling()){
   10605         int scale_width, scale_height;
   10606 
   10607         m_reprocScaleParam.getPicSizeFromAPK(scale_width,scale_height);
   10608         getPictureSize(&cur_width, &cur_height);
   10609 
   10610         String8 pic_size;
   10611         char buffer[32];
   10612         snprintf(buffer, sizeof(buffer), "%dx%d", scale_width, scale_height);
   10613         pic_size.append(buffer);
   10614         set(CameraParameters::KEY_PICTURE_SIZE, pic_size);
   10615     }
   10616 
   10617     str = flatten();
   10618     strParams = (char *)malloc(sizeof(char)*(str.length()+1));
   10619     if(strParams != NULL){
   10620         memset(strParams, 0, sizeof(char)*(str.length()+1));
   10621         strlcpy(strParams, str.string(), str.length()+1);
   10622         strParams[str.length()] = 0;
   10623     }
   10624 
   10625     if(m_reprocScaleParam.isScaleEnabled() &&
   10626         m_reprocScaleParam.isUnderScaling()){
   10627         //need set back picture size
   10628         String8 pic_size;
   10629         char buffer[32];
   10630         snprintf(buffer, sizeof(buffer), "%dx%d", cur_width, cur_height);
   10631         pic_size.append(buffer);
   10632         set(CameraParameters::KEY_PICTURE_SIZE, pic_size);
   10633     }
   10634     return strParams;
   10635 }
   10636 
   10637 #ifdef TARGET_TS_MAKEUP
   10638 /*===========================================================================
   10639  * FUNCTION   : getTsMakeupInfo
   10640  *
   10641  * DESCRIPTION: get TsMakeup info
   10642  *
   10643  * PARAMETERS :
   10644  *   @whiteLevel : [output] white level
   10645  *   @cleanLevel : [output] clean level
   10646 
   10647  * RETURN     : Whether makeup is enabled or not
   10648  *==========================================================================*/
   10649 bool QCameraParameters::getTsMakeupInfo(int &whiteLevel, int &cleanLevel) const
   10650 {
   10651     const char* pch_makeup_enable = get(QCameraParameters::KEY_TS_MAKEUP);
   10652     if (pch_makeup_enable == NULL) {
   10653         LOGH("pch_makeup_enable = null");
   10654         return false;
   10655     }
   10656     bool enableMakeup =
   10657             (strcmp(pch_makeup_enable,"On") == 0);
   10658     if (enableMakeup) {
   10659         whiteLevel = getInt(QCameraParameters::KEY_TS_MAKEUP_WHITEN);
   10660         cleanLevel = getInt(QCameraParameters::KEY_TS_MAKEUP_CLEAN);
   10661     }
   10662     return enableMakeup;
   10663 }
   10664 #endif
   10665 
   10666 /*===========================================================================
   10667  * FUNCTION   : getPreviewHalPixelFormat
   10668  *
   10669  * DESCRIPTION: get preview HAL pixel format
   10670  *
   10671  * PARAMETERS : none
   10672  *
   10673  * RETURN     : HAL pixel format
   10674  *==========================================================================*/
   10675 int QCameraParameters::getPreviewHalPixelFormat()
   10676 {
   10677     int32_t halPixelFormat;
   10678     cam_format_t fmt;
   10679     getStreamFormat(CAM_STREAM_TYPE_PREVIEW,fmt);
   10680 
   10681     switch (fmt) {
   10682     case CAM_FORMAT_YUV_420_NV12:
   10683         halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
   10684         break;
   10685     case CAM_FORMAT_YUV_420_NV21:
   10686         halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
   10687         break;
   10688     case CAM_FORMAT_YUV_420_NV21_ADRENO:
   10689         halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
   10690         break;
   10691     case CAM_FORMAT_YUV_420_YV12:
   10692         halPixelFormat = HAL_PIXEL_FORMAT_YV12;
   10693         break;
   10694     case CAM_FORMAT_YUV_420_NV12_VENUS:
   10695         halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS;
   10696         break;
   10697     case CAM_FORMAT_YUV_420_NV21_VENUS:
   10698         halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS;
   10699         break;
   10700     case CAM_FORMAT_YUV_420_NV12_UBWC:
   10701         halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC;
   10702         break;
   10703     case CAM_FORMAT_YUV_422_NV16:
   10704     case CAM_FORMAT_YUV_422_NV61:
   10705     default:
   10706         halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
   10707         break;
   10708     }
   10709     LOGH("format %d\n", halPixelFormat);
   10710     return halPixelFormat;
   10711 }
   10712 
   10713 /*===========================================================================
   10714  * FUNCTION   : getQuadraCFA
   10715  *
   10716  * DESCRIPTION: get QuadraCFA mode
   10717  *
   10718  * PARAMETERS :
   10719  *
   10720  * RETURN     : none
   10721  *==========================================================================*/
   10722 bool QCameraParameters::getQuadraCfa()
   10723 {
   10724     return m_bQuadraCfa;
   10725 }
   10726 /*===========================================================================
   10727  * FUNCTION   : getthumbnailSize
   10728  *
   10729  * DESCRIPTION: get thumbnail size
   10730  *
   10731  * PARAMETERS :
   10732  *   @width, height : [output] thumbnail width and height
   10733  *
   10734  * RETURN     : none
   10735  *==========================================================================*/
   10736 void QCameraParameters::getThumbnailSize(int *width, int *height) const
   10737 {
   10738     *width = getInt(KEY_JPEG_THUMBNAIL_WIDTH);
   10739     *height = getInt(KEY_JPEG_THUMBNAIL_HEIGHT);
   10740 }
   10741 
   10742 /*===========================================================================
   10743  * FUNCTION   : getZSLBurstInterval
   10744  *
   10745  * DESCRIPTION: get ZSL burst interval setting
   10746  *
   10747  * PARAMETERS : none
   10748  *
   10749  * RETURN     : ZSL burst interval value
   10750  *==========================================================================*/
   10751 uint8_t QCameraParameters::getZSLBurstInterval()
   10752 {
   10753     int interval = getInt(KEY_QC_ZSL_BURST_INTERVAL);
   10754     if (interval < 0) {
   10755         interval = 1;
   10756     }
   10757     return (uint8_t)interval;
   10758 }
   10759 
   10760 /*===========================================================================
   10761  * FUNCTION   : getZSLQueueDepth
   10762  *
   10763  * DESCRIPTION: get ZSL queue depth
   10764  *
   10765  * PARAMETERS : none
   10766  *
   10767  * RETURN     : ZSL queue depth value
   10768  *==========================================================================*/
   10769 uint8_t QCameraParameters::getZSLQueueDepth()
   10770 {
   10771     int qdepth = getInt(KEY_QC_ZSL_QUEUE_DEPTH);
   10772     if (qdepth < 0) {
   10773         qdepth = 2;
   10774     }
   10775     if (isLowMemoryDevice()) {
   10776         qdepth = 1;
   10777     }
   10778     return (uint8_t)qdepth;
   10779 }
   10780 
   10781 /*===========================================================================
   10782  * FUNCTION   : getZSLBackLookCount
   10783  *
   10784  * DESCRIPTION: get ZSL backlook count setting
   10785  *
   10786  * PARAMETERS : none
   10787  *
   10788  * RETURN     : ZSL backlook count value
   10789  *==========================================================================*/
   10790 uint8_t QCameraParameters::getZSLBackLookCount()
   10791 {
   10792     int look_back = getInt(KEY_QC_ZSL_BURST_LOOKBACK);
   10793     if (look_back < 0) {
   10794         look_back = 2;
   10795     }
   10796     if (isLowMemoryDevice()) {
   10797         look_back = 1;
   10798     }
   10799     return (uint8_t)look_back;
   10800 }
   10801 /*===========================================================================
   10802  * FUNCTION   : isVideoBuffersCached
   10803  *
   10804  * DESCRIPTION: Query buffers are cached /un cached
   10805  *
   10806  * PARAMETERS : None
   10807  *
   10808  * RETURN     : buffers are cached /un cached
   10809  *==========================================================================*/
   10810 bool QCameraParameters::isVideoBuffersCached()
   10811 {
   10812     const char *cached_mem  = get(KEY_QC_CACHE_VIDEO_BUFFERS);
   10813     if (cached_mem != NULL) {
   10814         if (strcmp(cached_mem, VALUE_DISABLE) != 0) {
   10815             return true;
   10816         }
   10817     }
   10818     return false;
   10819 }
   10820 /*===========================================================================
   10821  * FUNCTION   : getZSLMaxUnmatchedFrames
   10822  *
   10823  * DESCRIPTION: get allowed ZSL max unmatched frames number
   10824  *
   10825  * PARAMETERS : none
   10826  *
   10827  * RETURN     : ZSL backlook count value
   10828  *==========================================================================*/
   10829 uint8_t QCameraParameters::getMaxUnmatchedFramesInQueue()
   10830 {
   10831     return (uint8_t)(m_pCapability->min_num_pp_bufs);
   10832 }
   10833 
   10834 /*===========================================================================
   10835  * FUNCTION   : setRecordingHintValue
   10836  *
   10837  * DESCRIPTION: set recording hint
   10838  *
   10839  * PARAMETERS :
   10840  *   @value   : video hint value
   10841  *
   10842  * RETURN     : int32_t type of status
   10843  *              NO_ERROR  -- success
   10844  *              none-zero failure code
   10845  *==========================================================================*/
   10846 int QCameraParameters::setRecordingHintValue(int32_t value)
   10847 {
   10848     LOGH("VideoHint = %d", value);
   10849     bool newValue = (value > 0)? true : false;
   10850 
   10851     if ( m_bRecordingHint != newValue ) {
   10852         m_bNeedRestart = true;
   10853         m_bRecordingHint_new = newValue;
   10854     } else {
   10855         m_bRecordingHint_new = m_bRecordingHint;
   10856     }
   10857     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_RECORDING_HINT, value)) {
   10858         return BAD_VALUE;
   10859     }
   10860 
   10861     return NO_ERROR;
   10862 }
   10863 
   10864 /*===========================================================================
   10865  * FUNCTION   : getNumOfSnapshots
   10866  *
   10867  * DESCRIPTION: get number of snapshot per shutter
   10868  *
   10869  * PARAMETERS : none
   10870  *
   10871  * RETURN     : number of snapshot per shutter
   10872  *==========================================================================*/
   10873 uint8_t QCameraParameters::getNumOfSnapshots()
   10874 {
   10875     uint8_t numOfSnapshot = 1;
   10876     int val = getInt(KEY_QC_NUM_SNAPSHOT_PER_SHUTTER);
   10877     if (0 < val) {
   10878         numOfSnapshot = (uint8_t)val;
   10879     }
   10880 
   10881     return (uint8_t)numOfSnapshot;
   10882 }
   10883 
   10884 /*===========================================================================
   10885  * FUNCTION   : getBurstCountForAdvancedCapture
   10886  *
   10887  * DESCRIPTION: get burst count for advanced capture.
   10888  *
   10889  * PARAMETERS : none
   10890  *
   10891  * RETURN     : number of snapshot required for advanced capture.
   10892  *==========================================================================*/
   10893 uint8_t QCameraParameters::getBurstCountForAdvancedCapture()
   10894 {
   10895     uint32_t burstCount = 0;
   10896     if (isUbiFocusEnabled()) {
   10897         //number of snapshots required for Ubi Focus.
   10898         burstCount = m_pCapability->ubifocus_af_bracketing_need.burst_count;
   10899     } else if (isUbiRefocus()) {
   10900         //number of snapshots required for Opti Zoom.
   10901         burstCount = m_pCapability->refocus_af_bracketing_need.burst_count;
   10902     } else if (isOptiZoomEnabled()) {
   10903         //number of snapshots required for Opti Zoom.
   10904         burstCount = m_pCapability->opti_zoom_settings_need.burst_count;
   10905     } else if (isChromaFlashEnabled()) {
   10906         //number of snapshots required for Chroma Flash.
   10907         burstCount = m_pCapability->chroma_flash_settings_need.burst_count;
   10908     } else if (isStillMoreEnabled()) {
   10909         //number of snapshots required for Still More.
   10910         if (isSeeMoreEnabled()) {
   10911             burstCount = 1;
   10912         } else if ((m_stillmore_config.burst_count >=
   10913                 m_pCapability->stillmore_settings_need.min_burst_count) &&
   10914                 (m_stillmore_config.burst_count <=
   10915                 m_pCapability->stillmore_settings_need.max_burst_count)) {
   10916             burstCount = m_stillmore_config.burst_count;
   10917         } else {
   10918             burstCount = m_pCapability->stillmore_settings_need.burst_count;
   10919         }
   10920     } else if (isHDREnabled()) {
   10921         //number of snapshots required for HDR.
   10922         burstCount = m_pCapability->hdr_bracketing_setting.num_frames;
   10923     } else if (isAEBracketEnabled()) {
   10924       burstCount = 0;
   10925       const char *str_val = m_AEBracketingClient.values;
   10926       if ((str_val != NULL) && (strlen(str_val) > 0)) {
   10927           char prop[PROPERTY_VALUE_MAX];
   10928           memset(prop, 0, sizeof(prop));
   10929           strlcpy(prop, str_val, PROPERTY_VALUE_MAX);
   10930           char *saveptr = NULL;
   10931           char *token = strtok_r(prop, ",", &saveptr);
   10932           while (token != NULL) {
   10933               token = strtok_r(NULL, ",", &saveptr);
   10934               burstCount++;
   10935           }
   10936       }
   10937     }
   10938 
   10939     if (burstCount <= 0) {
   10940         burstCount = getNumOfSnapshots();
   10941     }
   10942 
   10943     LOGH("Snapshot burst count = %d", burstCount);
   10944     return (uint8_t)burstCount;
   10945 }
   10946 
   10947 /*===========================================================================
   10948  * FUNCTION   : getNumOfRetroSnapshots
   10949  *
   10950  * DESCRIPTION: get number of retro active snapshots per shutter
   10951  *
   10952  * PARAMETERS : none
   10953  *
   10954  * RETURN     : number of retro active snapshots per shutter
   10955  *==========================================================================*/
   10956 uint8_t QCameraParameters::getNumOfRetroSnapshots()
   10957 {
   10958     int numOfRetroSnapshots = getInt(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER);
   10959     if (numOfRetroSnapshots < 0) {
   10960         numOfRetroSnapshots = 0;
   10961     }
   10962     LOGH("numOfRetroSnaps - %d", numOfRetroSnapshots);
   10963     return (uint8_t)numOfRetroSnapshots;
   10964 }
   10965 
   10966 /*===========================================================================
   10967  * FUNCTION   : getNumOfExtraHDRInBufsIfNeeded
   10968  *
   10969  * DESCRIPTION: get number of extra input buffers needed by HDR
   10970  *
   10971  * PARAMETERS : none
   10972  *
   10973  * RETURN     : number of extra buffers needed by HDR; 0 if not HDR enabled
   10974  *==========================================================================*/
   10975 uint8_t QCameraParameters::getNumOfExtraHDRInBufsIfNeeded()
   10976 {
   10977     unsigned int numOfBufs = 0;
   10978 
   10979     if (isHDREnabled()) {
   10980         numOfBufs += m_pCapability->hdr_bracketing_setting.num_frames;
   10981         if (isHDR1xFrameEnabled() && isHDR1xExtraBufferNeeded()) {
   10982             numOfBufs++;
   10983         }
   10984         numOfBufs--; // Only additional buffers need to be returned
   10985     }
   10986 
   10987     return (uint8_t)(numOfBufs);
   10988 }
   10989 
   10990 /*===========================================================================
   10991  * FUNCTION   : getNumOfExtraHDROutBufsIfNeeded
   10992  *
   10993  * DESCRIPTION: get number of extra output buffers needed by HDR
   10994  *
   10995  * PARAMETERS : none
   10996  *
   10997  * RETURN     : number of extra buffers needed by HDR; 0 if not HDR enabled
   10998  *==========================================================================*/
   10999 uint8_t QCameraParameters::getNumOfExtraHDROutBufsIfNeeded()
   11000 {
   11001     int numOfBufs = 0;
   11002 
   11003     if (isHDREnabled() && isHDR1xFrameEnabled()) {
   11004         numOfBufs++;
   11005     }
   11006 
   11007     return (uint8_t)(numOfBufs);
   11008 }
   11009 
   11010 /*===========================================================================
   11011  * FUNCTION   : getJpegQuality
   11012  *
   11013  * DESCRIPTION: get jpeg encoding quality
   11014  *
   11015  * PARAMETERS : none
   11016  *
   11017  * RETURN     : jpeg encoding quality
   11018  *==========================================================================*/
   11019 uint32_t QCameraParameters::getJpegQuality()
   11020 {
   11021     int quality = getInt(KEY_JPEG_QUALITY);
   11022     if (quality < 0) {
   11023         quality = 85; // set to default quality value
   11024     }
   11025     return (uint32_t)quality;
   11026 }
   11027 
   11028 /*===========================================================================
   11029  * FUNCTION   : getRotation
   11030  *
   11031  * DESCRIPTION: get application configured rotation
   11032  *
   11033  * PARAMETERS : none
   11034  *
   11035  * RETURN     : rotation value
   11036  *==========================================================================*/
   11037 uint32_t QCameraParameters::getRotation() {
   11038     int rotation = 0;
   11039 
   11040     //If exif rotation is set, do not rotate captured image
   11041     if (!useJpegExifRotation()) {
   11042         rotation = mRotation;
   11043         if (rotation < 0) {
   11044             rotation = 0;
   11045         }
   11046     }
   11047     return (uint32_t)rotation;
   11048 }
   11049 
   11050 /*===========================================================================
   11051  * FUNCTION   : setJpegRotation
   11052  *
   11053  * DESCRIPTION: set jpeg rotation value configured internally
   11054  *
   11055  * PARAMETERS : none
   11056  *
   11057  * RETURN     : jpeg rotation value
   11058  *==========================================================================*/
   11059 void QCameraParameters::setJpegRotation(int rotation) {
   11060     if (rotation == 0 || rotation == 90 ||
   11061             rotation == 180 || rotation == 270) {
   11062         mJpegRotation = (uint32_t)rotation;
   11063     }
   11064 }
   11065 
   11066 /*===========================================================================
   11067  * FUNCTION   : getDeviceRotation
   11068  *
   11069  * DESCRIPTION: get device rotation value
   11070  *
   11071  * PARAMETERS : none
   11072  *
   11073  * RETURN     : device rotation value
   11074  *==========================================================================*/
   11075 uint32_t QCameraParameters::getDeviceRotation() {
   11076     int rotation = 0;
   11077 
   11078     rotation = mRotation;
   11079     if (rotation < 0) {
   11080         rotation = 0;
   11081     }
   11082 
   11083     return (uint32_t)rotation;
   11084 }
   11085 
   11086 /*===========================================================================
   11087  * FUNCTION   : getJpegExifRotation
   11088  *
   11089  * DESCRIPTION: get exif rotation value
   11090  *
   11091  * PARAMETERS : none
   11092  *
   11093  * RETURN     : rotation value
   11094  *==========================================================================*/
   11095 uint32_t QCameraParameters::getJpegExifRotation() {
   11096     int rotation = 0;
   11097 
   11098     if (useJpegExifRotation()) {
   11099         rotation = mRotation;
   11100         if (rotation < 0) {
   11101             rotation = 0;
   11102         }
   11103     }
   11104     return (uint32_t)rotation;
   11105 }
   11106 
   11107 /*===========================================================================
   11108  * FUNCTION   : useJpegExifRotation
   11109  *
   11110  * DESCRIPTION: Check if jpeg exif rotation need to be used
   11111  *
   11112  * PARAMETERS : none
   11113  *
   11114  * RETURN     : true if jpeg exif rotation need to be used
   11115  *==========================================================================*/
   11116 bool QCameraParameters::useJpegExifRotation() {
   11117     char exifRotation[PROPERTY_VALUE_MAX];
   11118 
   11119     property_get("persist.camera.exif.rotation", exifRotation, "off");
   11120 
   11121     if (!strcmp(exifRotation, "on")) {
   11122         return true;
   11123     }
   11124 
   11125     if (!(m_pCapability->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION)) {
   11126         return true;
   11127     }
   11128 
   11129     return false;
   11130 }
   11131 
   11132 /*===========================================================================
   11133  * FUNCTION   : getEffectValue
   11134  *
   11135  * DESCRIPTION: get effect value
   11136  *
   11137  * PARAMETERS : none
   11138  *
   11139  * RETURN     : effect value
   11140  *==========================================================================*/
   11141 int32_t QCameraParameters::getEffectValue()
   11142 {
   11143     uint32_t cnt = 0;
   11144     const char *effect = get(KEY_EFFECT);
   11145     if (effect) {
   11146         while (NULL != EFFECT_MODES_MAP[cnt].desc) {
   11147             if (!strcmp(EFFECT_MODES_MAP[cnt].desc, effect)) {
   11148                 return EFFECT_MODES_MAP[cnt].val;
   11149             }
   11150             cnt++;
   11151         }
   11152     } else {
   11153         LOGW("Missing effect value");
   11154     }
   11155     return CAM_EFFECT_MODE_OFF;
   11156 }
   11157 
   11158 /*===========================================================================
   11159  * FUNCTION   : parseGPSCoordinate
   11160  *
   11161  * DESCRIPTION: parse GPS coordinate string
   11162  *
   11163  * PARAMETERS :
   11164  *   @coord_str : [input] coordinate string
   11165  *   @coord     : [output]  ptr to struct to store coordinate
   11166  *
   11167  * RETURN     : int32_t type of status
   11168  *              NO_ERROR  -- success
   11169  *              none-zero failure code
   11170  *==========================================================================*/
   11171 int QCameraParameters::parseGPSCoordinate(const char *coord_str, rat_t* coord)
   11172 {
   11173     if(coord == NULL) {
   11174         LOGE("error, invalid argument coord == NULL");
   11175         return BAD_VALUE;
   11176     }
   11177     double degF = atof(coord_str);
   11178     if (degF < 0) {
   11179         degF = -degF;
   11180     }
   11181     double minF = (degF - (double)(int) degF) * 60.0;
   11182     double secF = (minF - (double)(int) minF) * 60.0;
   11183 
   11184     getRational(&coord[0], (int)degF, 1);
   11185     getRational(&coord[1], (int)minF, 1);
   11186     getRational(&coord[2], (int)(secF * 10000.0), 10000);
   11187     return NO_ERROR;
   11188 }
   11189 
   11190 /*===========================================================================
   11191  * FUNCTION   : getExifDateTime
   11192  *
   11193  * DESCRIPTION: query exif date time
   11194  *
   11195  * PARAMETERS :
   11196  *   @dateTime    : String to store exif date time.
   11197  *                  Should be leaved unchanged in case of error.
   11198  *   @subsecTime  : String to store exif time nanoseconds.
   11199  *                  Should be leaved unchanged in case of error.
   11200  *
   11201  * RETURN     : int32_t type of status
   11202  *              NO_ERROR  -- success
   11203  *              none-zero failure code
   11204  *==========================================================================*/
   11205 int32_t QCameraParameters::getExifDateTime(String8 &dateTime, String8 &subsecTime)
   11206 {
   11207     int32_t ret = NO_ERROR;
   11208 
   11209     //get time and date from system
   11210     struct timeval tv;
   11211     struct tm timeinfo_data;
   11212 
   11213     int res = gettimeofday(&tv, NULL);
   11214     if (0 == res) {
   11215         struct tm *timeinfo = localtime_r(&tv.tv_sec, &timeinfo_data);
   11216         if (NULL != timeinfo) {
   11217             //Write datetime according to EXIF Spec
   11218             //"YYYY:MM:DD HH:MM:SS" (20 chars including \0)
   11219             dateTime = String8::format("%04d:%02d:%02d %02d:%02d:%02d",
   11220                     timeinfo->tm_year + 1900, timeinfo->tm_mon + 1,
   11221                     timeinfo->tm_mday, timeinfo->tm_hour,
   11222                     timeinfo->tm_min, timeinfo->tm_sec);
   11223             //Write subsec according to EXIF Sepc
   11224             subsecTime = String8::format("%06ld", tv.tv_usec);
   11225         } else {
   11226             LOGE("localtime_r() error");
   11227             ret = UNKNOWN_ERROR;
   11228         }
   11229     } else if (-1 == res) {
   11230         LOGE("gettimeofday() error: %s", strerror(errno));
   11231         ret = UNKNOWN_ERROR;
   11232     } else {
   11233         LOGE("gettimeofday() unexpected return code: %d", res);
   11234         ret = UNKNOWN_ERROR;
   11235     }
   11236 
   11237     return ret;
   11238 }
   11239 
   11240 /*===========================================================================
   11241  * FUNCTION   : getRational
   11242  *
   11243  * DESCRIPTION: compose rational struct
   11244  *
   11245  * PARAMETERS :
   11246  *   @rat     : ptr to struct to store rational info
   11247  *   @num     :num of the rational
   11248  *   @denom   : denom of the rational
   11249  *
   11250  * RETURN     : int32_t type of status
   11251  *              NO_ERROR  -- success
   11252  *              none-zero failure code
   11253  *==========================================================================*/
   11254 int32_t QCameraParameters::getRational(rat_t *rat, int num, int denom)
   11255 {
   11256     if ((0 > num) || (0 > denom)) {
   11257         LOGE("Negative values");
   11258         return BAD_VALUE;
   11259     }
   11260     if (NULL == rat) {
   11261         LOGE("NULL rat input");
   11262         return BAD_VALUE;
   11263     }
   11264     rat->num = (uint32_t)num;
   11265     rat->denom = (uint32_t)denom;
   11266     return NO_ERROR;
   11267 }
   11268 
   11269 /*===========================================================================
   11270  * FUNCTION   : getExifFocalLength
   11271  *
   11272  * DESCRIPTION: get exif focal lenght
   11273  *
   11274  * PARAMETERS :
   11275  *   @focalLength : ptr to rational strcut to store focal lenght
   11276  *
   11277  * RETURN     : int32_t type of status
   11278  *              NO_ERROR  -- success
   11279  *              none-zero failure code
   11280  *==========================================================================*/
   11281 int32_t QCameraParameters::getExifFocalLength(rat_t *focalLength)
   11282 {
   11283     int focalLengthValue =
   11284         (int)(getFloat(QCameraParameters::KEY_FOCAL_LENGTH) * FOCAL_LENGTH_DECIMAL_PRECISION);
   11285     return getRational(focalLength, focalLengthValue, FOCAL_LENGTH_DECIMAL_PRECISION);
   11286 }
   11287 
   11288 /*===========================================================================
   11289  * FUNCTION   : getExifIsoSpeed
   11290  *
   11291  * DESCRIPTION: get exif ISO speed
   11292  *
   11293  * PARAMETERS : none
   11294  *
   11295  * RETURN     : ISO speed value
   11296  *==========================================================================*/
   11297 uint16_t QCameraParameters::getExifIsoSpeed()
   11298 {
   11299     uint16_t isoSpeed = 0;
   11300     const char *iso_str = get(QCameraParameters::KEY_QC_ISO_MODE);
   11301     int iso_index = lookupAttr(ISO_MODES_MAP, PARAM_MAP_SIZE(ISO_MODES_MAP), iso_str);
   11302     switch (iso_index) {
   11303     case CAM_ISO_MODE_AUTO:
   11304         isoSpeed = 0;
   11305         break;
   11306     case CAM_ISO_MODE_DEBLUR:
   11307         isoSpeed = 1;
   11308         break;
   11309     case CAM_ISO_MODE_100:
   11310         isoSpeed = 100;
   11311         break;
   11312     case CAM_ISO_MODE_200:
   11313         isoSpeed = 200;
   11314         break;
   11315     case CAM_ISO_MODE_400:
   11316         isoSpeed = 400;
   11317         break;
   11318     case CAM_ISO_MODE_800:
   11319         isoSpeed = 800;
   11320         break;
   11321     case CAM_ISO_MODE_1600:
   11322         isoSpeed = 1600;
   11323         break;
   11324     case CAM_ISO_MODE_3200:
   11325         isoSpeed = 3200;
   11326         break;
   11327     }
   11328     return isoSpeed;
   11329 }
   11330 
   11331 /*===========================================================================
   11332  * FUNCTION   : getExifGpsProcessingMethod
   11333  *
   11334  * DESCRIPTION: get GPS processing method
   11335  *
   11336  * PARAMETERS :
   11337  *   @gpsProcessingMethod : string to store GPS process method
   11338  *   @count               : lenght of the string
   11339  *
   11340  * RETURN     : int32_t type of status
   11341  *              NO_ERROR  -- success
   11342  *              none-zero failure code
   11343  *==========================================================================*/
   11344 int32_t QCameraParameters::getExifGpsProcessingMethod(char *gpsProcessingMethod,
   11345                                                       uint32_t &count)
   11346 {
   11347     const char *str = get(KEY_GPS_PROCESSING_METHOD);
   11348     if(str != NULL) {
   11349         memcpy(gpsProcessingMethod, ExifAsciiPrefix, EXIF_ASCII_PREFIX_SIZE);
   11350         count = EXIF_ASCII_PREFIX_SIZE;
   11351         strlcpy(gpsProcessingMethod + EXIF_ASCII_PREFIX_SIZE, str, GPS_PROCESSING_METHOD_SIZE);
   11352         count += (uint32_t)strlen(str);
   11353         gpsProcessingMethod[count++] = '\0'; // increase 1 for the last NULL char
   11354         return NO_ERROR;
   11355     } else {
   11356         return BAD_VALUE;
   11357     }
   11358 }
   11359 
   11360 /*===========================================================================
   11361  * FUNCTION   : getExifLatitude
   11362  *
   11363  * DESCRIPTION: get exif latitude
   11364  *
   11365  * PARAMETERS :
   11366  *   @latitude : ptr to rational struct to store latitude info
   11367  *   @ladRef   : charater to indicate latitude reference
   11368  *
   11369  * RETURN     : int32_t type of status
   11370  *              NO_ERROR  -- success
   11371  *              none-zero failure code
   11372  *==========================================================================*/
   11373 int32_t QCameraParameters::getExifLatitude(rat_t *latitude,
   11374                                            char *latRef)
   11375 {
   11376     const char *str = get(KEY_GPS_LATITUDE);
   11377     if(str != NULL) {
   11378         parseGPSCoordinate(str, latitude);
   11379 
   11380         //set Latitude Ref
   11381         float latitudeValue = getFloat(KEY_GPS_LATITUDE);
   11382         if(latitudeValue < 0.0f) {
   11383             latRef[0] = 'S';
   11384         } else {
   11385             latRef[0] = 'N';
   11386         }
   11387         latRef[1] = '\0';
   11388         return NO_ERROR;
   11389     }else{
   11390         return BAD_VALUE;
   11391     }
   11392 }
   11393 
   11394 /*===========================================================================
   11395  * FUNCTION   : getExifLongitude
   11396  *
   11397  * DESCRIPTION: get exif longitude
   11398  *
   11399  * PARAMETERS :
   11400  *   @longitude : ptr to rational struct to store longitude info
   11401  *   @lonRef    : charater to indicate longitude reference
   11402  *
   11403  * RETURN     : int32_t type of status
   11404  *              NO_ERROR  -- success
   11405  *              none-zero failure code
   11406  *==========================================================================*/
   11407 int32_t QCameraParameters::getExifLongitude(rat_t *longitude,
   11408                                             char *lonRef)
   11409 {
   11410     const char *str = get(KEY_GPS_LONGITUDE);
   11411     if(str != NULL) {
   11412         parseGPSCoordinate(str, longitude);
   11413 
   11414         //set Longitude Ref
   11415         float longitudeValue = getFloat(KEY_GPS_LONGITUDE);
   11416         if(longitudeValue < 0.0f) {
   11417             lonRef[0] = 'W';
   11418         } else {
   11419             lonRef[0] = 'E';
   11420         }
   11421         lonRef[1] = '\0';
   11422         return NO_ERROR;
   11423     }else{
   11424         return BAD_VALUE;
   11425     }
   11426 }
   11427 
   11428 /*===========================================================================
   11429  * FUNCTION   : getExifAltitude
   11430  *
   11431  * DESCRIPTION: get exif altitude
   11432  *
   11433  * PARAMETERS :
   11434  *   @altitude : ptr to rational struct to store altitude info
   11435  *   @altRef   : charater to indicate altitude reference
   11436  *
   11437  * RETURN     : int32_t type of status
   11438  *              NO_ERROR  -- success
   11439  *              none-zero failure code
   11440  *==========================================================================*/
   11441 int32_t QCameraParameters::getExifAltitude(rat_t *altitude,
   11442                                            char *altRef)
   11443 {
   11444     const char *str = get(KEY_GPS_ALTITUDE);
   11445     if(str != NULL) {
   11446         double value = atof(str);
   11447         *altRef = 0;
   11448         if(value < 0){
   11449             *altRef = 1;
   11450             value = -value;
   11451         }
   11452         return getRational(altitude, (int)(value*1000), 1000);
   11453     }else{
   11454         return BAD_VALUE;
   11455     }
   11456 }
   11457 
   11458 /*===========================================================================
   11459  * FUNCTION   : getExifGpsDateTimeStamp
   11460  *
   11461  * DESCRIPTION: get exif GPS date time stamp
   11462  *
   11463  * PARAMETERS :
   11464  *   @gpsDateStamp : GPS date time stamp string
   11465  *   @bufLen       : length of the string
   11466  *   @gpsTimeStamp : ptr to rational struct to store time stamp info
   11467  *
   11468  * RETURN     : int32_t type of status
   11469  *              NO_ERROR  -- success
   11470  *              none-zero failure code
   11471  *==========================================================================*/
   11472 int32_t QCameraParameters::getExifGpsDateTimeStamp(char *gpsDateStamp,
   11473                                                    uint32_t bufLen,
   11474                                                    rat_t *gpsTimeStamp)
   11475 {
   11476     const char *str = get(KEY_GPS_TIMESTAMP);
   11477     if(str != NULL) {
   11478         time_t unixTime = (time_t)atol(str);
   11479         struct tm *UTCTimestamp = gmtime(&unixTime);
   11480 
   11481         if(!UTCTimestamp) {
   11482             LOGE("UTCTimestamp is null\n");
   11483             return BAD_VALUE;
   11484         }
   11485 
   11486         strftime(gpsDateStamp, bufLen, "%Y:%m:%d", UTCTimestamp);
   11487 
   11488         getRational(&gpsTimeStamp[0], UTCTimestamp->tm_hour, 1);
   11489         getRational(&gpsTimeStamp[1], UTCTimestamp->tm_min, 1);
   11490         getRational(&gpsTimeStamp[2], UTCTimestamp->tm_sec, 1);
   11491 
   11492         return NO_ERROR;
   11493     } else {
   11494         return BAD_VALUE;
   11495     }
   11496 }
   11497 
   11498 /*===========================================================================
   11499  * FUNCTION   : updateFocusDistances
   11500  *
   11501  * DESCRIPTION: update focus distances
   11502  *
   11503  * PARAMETERS :
   11504  *   @focusDistances : ptr to focus distance info
   11505  *
   11506  * RETURN     : int32_t type of status
   11507  *              NO_ERROR  -- success
   11508  *              none-zero failure code
   11509  *==========================================================================*/
   11510 int32_t QCameraParameters::updateFocusDistances(cam_focus_distances_info_t *focusDistances)
   11511 {
   11512     String8 str;
   11513     char buffer[32] = {0};
   11514     //set all distances to infinity if focus mode is infinity
   11515     if(mFocusMode == CAM_FOCUS_MODE_INFINITY) {
   11516         str.append("Infinity,Infinity,Infinity");
   11517     } else {
   11518         if (focusDistances->focus_distance[0] < FOCUS_PERCISION) {
   11519             str.append("Infinity");
   11520         } else {
   11521             snprintf(buffer, sizeof(buffer), "%f", 1.0/focusDistances->focus_distance[0]);
   11522             str.append(buffer);
   11523         }
   11524         if (focusDistances->focus_distance[1] < FOCUS_PERCISION) {
   11525             str.append(",Infinity");
   11526         } else {
   11527             snprintf(buffer, sizeof(buffer), ",%f", 1.0/focusDistances->focus_distance[1]);
   11528             str.append(buffer);
   11529         }
   11530         if (focusDistances->focus_distance[2] < FOCUS_PERCISION) {
   11531             str.append(",Infinity");
   11532         } else {
   11533             snprintf(buffer, sizeof(buffer), ",%f", 1.0/focusDistances->focus_distance[2]);
   11534             str.append(buffer);
   11535         }
   11536     }
   11537     LOGH("setting KEY_FOCUS_DISTANCES as %s", __FUNCTION__, str.string());
   11538     set(QCameraParameters::KEY_FOCUS_DISTANCES, str.string());
   11539     return NO_ERROR;
   11540 }
   11541 
   11542 /*===========================================================================
   11543  * FUNCTION   : updateRecordingHintValue
   11544  *
   11545  * DESCRIPTION: update recording hint locally and to daemon
   11546  *
   11547  * PARAMETERS :
   11548  *   @value   : video hint value
   11549  *
   11550  * RETURN     : int32_t type of status
   11551  *              NO_ERROR  -- success
   11552  *              none-zero failure code
   11553  *==========================================================================*/
   11554 int32_t QCameraParameters::updateRecordingHintValue(int32_t value)
   11555 {
   11556     int32_t rc = NO_ERROR;
   11557     if(initBatchUpdate() < 0 ) {
   11558         LOGE("Failed to initialize group update table");
   11559         return BAD_TYPE;
   11560     }
   11561 
   11562     rc = setRecordingHintValue(value);
   11563     if (rc != NO_ERROR) {
   11564         LOGE("Failed to update table");
   11565         return rc;
   11566     }
   11567 
   11568     if(m_bDISEnabled && (value==1)) {
   11569         LOGH("%d: Setting DIS value again!!");
   11570         setDISValue(VALUE_ENABLE);
   11571     }
   11572 
   11573     rc = commitSetBatch();
   11574     if (rc != NO_ERROR) {
   11575         LOGE("Failed to update recording hint");
   11576         return rc;
   11577     }
   11578 
   11579     return rc;
   11580 }
   11581 
   11582 /*===========================================================================
   11583  * FUNCTION   : setHistogram
   11584  *
   11585  * DESCRIPTION: set histogram
   11586  *
   11587  * PARAMETERS :
   11588  *   @enabled : if histogram is enabled
   11589  *
   11590  * RETURN     : int32_t type of status
   11591  *              NO_ERROR  -- success
   11592  *              none-zero failure code
   11593  *==========================================================================*/
   11594 int32_t QCameraParameters::setHistogram(bool enabled)
   11595 {
   11596     if(m_bHistogramEnabled == enabled) {
   11597         LOGH("histogram flag not changed, no ops here");
   11598         return NO_ERROR;
   11599     }
   11600 
   11601     // set parm for histogram
   11602     if(initBatchUpdate() < 0 ) {
   11603         LOGE("Failed to initialize group update table");
   11604         return BAD_TYPE;
   11605     }
   11606 
   11607     int32_t value = enabled ? 1 : 0;
   11608     int32_t rc = NO_ERROR;
   11609     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_HISTOGRAM, value)) {
   11610         LOGE("Failed to update table");
   11611         return BAD_VALUE;
   11612     }
   11613 
   11614     rc = commitSetBatch();
   11615     if (rc != NO_ERROR) {
   11616         LOGE("Failed to set histogram");
   11617         return rc;
   11618     }
   11619 
   11620     m_bHistogramEnabled = enabled;
   11621 
   11622     LOGH("Histogram -> %s", m_bHistogramEnabled ? "Enabled" : "Disabled");
   11623 
   11624     return rc;
   11625 }
   11626 
   11627 /*===========================================================================
   11628  * FUNCTION   : setIntEvent
   11629  *
   11630  * DESCRIPTION: set setIntEvent
   11631  *
   11632  * PARAMETERS :
   11633  *   @params : image size and dimensions
   11634  *
   11635  * RETURN     : int32_t type of status
   11636  *              NO_ERROR  -- success
   11637  *              none-zero failure code
   11638  *==========================================================================*/
   11639 int32_t QCameraParameters::setIntEvent(cam_int_evt_params_t params)
   11640 {
   11641     int32_t rc = NO_ERROR;
   11642 
   11643     if ( m_pParamBuf == NULL ) {
   11644         return NO_INIT;
   11645     }
   11646 
   11647     if(initBatchUpdate() < 0 ) {
   11648         LOGE("Failed to initialize group update table");
   11649         return BAD_TYPE;
   11650     }
   11651 
   11652     //Sending snapshot taken notification back to Eztune"
   11653     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_INT_EVT, params)) {
   11654         LOGE("Failed to update table");
   11655         return BAD_VALUE;
   11656     }
   11657 
   11658     rc = commitSetBatch();
   11659     if (rc != NO_ERROR) {
   11660         LOGE("Failed to set frameskip info parm");
   11661         return rc;
   11662     }
   11663 
   11664     return rc;
   11665 }
   11666 
   11667 /*===========================================================================
   11668  * FUNCTION   : setFaceDetectionOption
   11669  *
   11670  * DESCRIPTION: set if face detection is enabled by SendCommand
   11671  *
   11672  * PARAMETERS :
   11673  *   @enabled : bool flag if face detection should be enabled
   11674  *
   11675  * RETURN     : int32_t type of status
   11676  *              NO_ERROR  -- success
   11677  *              none-zero failure code
   11678  *==========================================================================*/
   11679  int32_t QCameraParameters::setFaceDetectionOption(bool enabled)
   11680 {
   11681     m_bFaceDetectionOn = enabled;
   11682     return NO_ERROR;
   11683 }
   11684 
   11685 /*===========================================================================
   11686  * FUNCTION   : setFaceDetection
   11687  *
   11688  * DESCRIPTION: set face detection
   11689  *
   11690  * PARAMETERS :
   11691  *   @enabled : if face detection is enabled
   11692  *   @initCommit : if configuration list need to be initialized and commited
   11693  *
   11694  * RETURN     : int32_t type of status
   11695  *              NO_ERROR  -- success
   11696  *              none-zero failure code
   11697  *==========================================================================*/
   11698 int32_t QCameraParameters::setFaceDetection(bool enabled, bool initCommit)
   11699 {
   11700     uint32_t faceProcMask = m_nFaceProcMask;
   11701     // set face detection mask
   11702     if (enabled) {
   11703         if (m_pCapability->max_num_roi == 0) {
   11704             LOGE("Face detection is not support becuase max number of face is 0");
   11705             return BAD_VALUE;
   11706         }
   11707         faceProcMask |= CAM_FACE_PROCESS_MASK_DETECTION;
   11708         if (getRecordingHintValue() > 0) {
   11709             faceProcMask = 0;
   11710             faceProcMask |= CAM_FACE_PROCESS_MASK_FOCUS;
   11711             if (fdModeInVideo() == CAM_FACE_PROCESS_MASK_DETECTION) {
   11712                 faceProcMask |= CAM_FACE_PROCESS_MASK_DETECTION;
   11713             }
   11714         } else {
   11715             faceProcMask |= CAM_FACE_PROCESS_MASK_FOCUS;
   11716             faceProcMask |= CAM_FACE_PROCESS_MASK_DETECTION;
   11717         }
   11718         if (isTruePortraitEnabled()) {
   11719             LOGL("QCameraParameters::setFaceDetection trueportrait enabled");
   11720             faceProcMask |= CAM_FACE_PROCESS_MASK_GAZE;
   11721         } else {
   11722             LOGL("QCameraParameters::setFaceDetection trueportrait disabled");
   11723             faceProcMask &= ~CAM_FACE_PROCESS_MASK_GAZE;
   11724         }
   11725     } else {
   11726         faceProcMask &= ~(CAM_FACE_PROCESS_MASK_DETECTION
   11727                 | CAM_FACE_PROCESS_MASK_FOCUS
   11728                 | CAM_FACE_PROCESS_MASK_GAZE);
   11729     }
   11730 
   11731     if(m_nFaceProcMask == faceProcMask) {
   11732         LOGH("face process mask not changed, no ops here");
   11733         return NO_ERROR;
   11734     }
   11735 
   11736     m_nFaceProcMask = faceProcMask;
   11737 
   11738     // set parm for face detection
   11739     uint32_t requested_faces = (uint32_t)getInt(KEY_QC_MAX_NUM_REQUESTED_FACES);
   11740     cam_fd_set_parm_t fd_set_parm;
   11741     memset(&fd_set_parm, 0, sizeof(cam_fd_set_parm_t));
   11742     fd_set_parm.fd_mode = faceProcMask;
   11743     fd_set_parm.num_fd = requested_faces;
   11744 
   11745     LOGH("[KPI Perf]: PROFILE_FACE_DETECTION_VALUE = %d num_fd = %d",
   11746            faceProcMask,requested_faces);
   11747 
   11748     if (initCommit) {
   11749         if(initBatchUpdate() < 0 ) {
   11750             LOGE("Failed to initialize group update table");
   11751             return BAD_TYPE;
   11752         }
   11753     }
   11754 
   11755     int32_t rc = NO_ERROR;
   11756 
   11757     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FD, fd_set_parm)) {
   11758         LOGE("Failed to update table");
   11759         return BAD_VALUE;
   11760     }
   11761 
   11762     if (initCommit) {
   11763         rc = commitSetBatch();
   11764         if (rc != NO_ERROR) {
   11765             LOGE("Failed to set face detection parm");
   11766             return rc;
   11767         }
   11768     }
   11769 
   11770     LOGH("FaceProcMask -> %d", m_nFaceProcMask);
   11771 
   11772     return rc;
   11773 }
   11774 
   11775 /*===========================================================================
   11776  * FUNCTION   : setFrameSkip
   11777  *
   11778  * DESCRIPTION: send ISP frame skip pattern to camera daemon
   11779  *
   11780  * PARAMETERS :
   11781  *   @pattern : skip pattern for ISP
   11782  *
   11783  * RETURN     : int32_t type of status
   11784  *              NO_ERROR  -- success
   11785  *              none-zero failure code
   11786  *==========================================================================*/
   11787 int32_t QCameraParameters::setFrameSkip(enum msm_vfe_frame_skip_pattern pattern)
   11788 {
   11789     int32_t rc = NO_ERROR;
   11790 
   11791     if ( m_pParamBuf == NULL ) {
   11792         return NO_INIT;
   11793     }
   11794 
   11795     if(initBatchUpdate() < 0 ) {
   11796         LOGE("Failed to initialize group update table");
   11797         return BAD_TYPE;
   11798     }
   11799 
   11800     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_FRAMESKIP, (int32_t)pattern)) {
   11801         LOGE("Failed to update table");
   11802         return BAD_VALUE;
   11803     }
   11804 
   11805     rc = commitSetBatch();
   11806     if (rc != NO_ERROR) {
   11807         LOGE("Failed to set frameskip info parm");
   11808         return rc;
   11809     }
   11810 
   11811     return rc;
   11812 }
   11813 
   11814 /*===========================================================================
   11815  * FUNCTION   : getSensorOutputSize
   11816  *
   11817  * DESCRIPTION: Query sensor output size based on maximum stream dimension
   11818  *
   11819  * PARAMETERS :
   11820  *   @max_dim    : maximum stream dimension
   11821  *   @sensor_dim : sensor dimension
   11822  *   @cam_type   : camera type in case of dual camera
   11823  *
   11824  * RETURN     : int32_t type of status
   11825  *              NO_ERROR  -- success
   11826  *              none-zero failure code
   11827  *==========================================================================*/
   11828 int32_t QCameraParameters::getSensorOutputSize(cam_dimension_t max_dim,
   11829         cam_dimension_t &sensor_dim, uint32_t cam_type)
   11830 {
   11831     int32_t rc = NO_ERROR;
   11832     cam_sensor_mode_info_t modeInfo;
   11833     cam_dimension_t pic_dim;
   11834 
   11835     //No need to update RAW dimensions if meta raw is enabled.
   11836     if (m_bMetaRawEnabled) {
   11837         return rc;
   11838     }
   11839     // If offline raw is enabled, check the dimensions from Picture size since snapshot
   11840     // stream is not added but final JPEG is required of snapshot size
   11841     if (getofflineRAW()) {
   11842         if (getQuadraCfa()) {
   11843             max_dim.width = m_pCapability->quadra_cfa_dim[0].width;
   11844             max_dim.height = m_pCapability->quadra_cfa_dim[0].height;
   11845         } else {
   11846             getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT, pic_dim);
   11847             if (pic_dim.width > max_dim.width) {
   11848                 max_dim.width = pic_dim.width;
   11849             }
   11850             if (pic_dim.height > max_dim.height) {
   11851                 max_dim.height = pic_dim.height;
   11852             }
   11853         }
   11854     }
   11855 
   11856     if (max_dim.width == 0 || max_dim.height == 0) {
   11857         max_dim = m_pCapability->raw_dim[0];
   11858     }
   11859 
   11860     if(initBatchUpdate() < 0 ) {
   11861         LOGE("Failed to initialize group update table");
   11862         return BAD_TYPE;
   11863     }
   11864 
   11865     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_MAX_DIMENSION, max_dim)) {
   11866         LOGE("Failed to update table for CAM_INTF_PARM_MAX_DIMENSION ");
   11867         return BAD_VALUE;
   11868     }
   11869 
   11870     rc = commitSetBatch();
   11871     if (rc != NO_ERROR) {
   11872         LOGE("Failed to set lock CAM_INTF_PARM_MAX_DIMENSION parm");
   11873         return rc;
   11874     }
   11875 
   11876     if(initBatchUpdate() < 0 ) {
   11877         LOGE("Failed to initialize group update table");
   11878         return BAD_TYPE;
   11879     }
   11880 
   11881     ADD_GET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_SENSOR_MODE_INFO);
   11882 
   11883     rc = commitGetBatch();
   11884     if (rc != NO_ERROR) {
   11885         LOGE("Failed to get commit CAM_INTF_PARM_SENSOR_MODE_INFO");
   11886         return rc;
   11887     }
   11888 
   11889     READ_PARAM_ENTRY(m_pParamBuf, CAM_INTF_PARM_SENSOR_MODE_INFO, modeInfo);
   11890     sensor_dim = modeInfo.active_array_size;
   11891 
   11892 #if 0 // Update to 07.01.01.253.071
   11893     if (cam_type == MM_CAMERA_TYPE_AUX) {
   11894         READ_PARAM_ENTRY(m_pParamBufAux, CAM_INTF_PARM_RAW_DIMENSION, sensor_dim);
   11895     } else {
   11896         READ_PARAM_ENTRY(m_pParamBuf, CAM_INTF_PARM_RAW_DIMENSION, sensor_dim);
   11897     }
   11898 #else
   11899     (void) cam_type;
   11900 #endif // Update to 07.01.01.253.071
   11901 
   11902     LOGH("RAW Dimension = %d X %d",sensor_dim.width,sensor_dim.height);
   11903     if (sensor_dim.width == 0 || sensor_dim.height == 0) {
   11904         LOGW("Error getting RAW size. Setting to Capability value");
   11905         if (getQuadraCfa()) {
   11906             sensor_dim = m_pCapability->quadra_cfa_dim[0];
   11907         } else {
   11908             sensor_dim = m_pCapability->raw_dim[0];
   11909         }
   11910     }
   11911     return rc;
   11912 }
   11913 
   11914 /*===========================================================================
   11915  * FUNCTION   : updateRAW
   11916  *
   11917  * DESCRIPTION: get sensor output size and update
   11918  *
   11919  * PARAMETERS :
   11920  *   @max_dim : maximum stream dimension
   11921  *
   11922  * RETURN     : int32_t type of status
   11923  *              NO_ERROR  -- success
   11924  *              none-zero failure code
   11925  *==========================================================================*/
   11926 int32_t QCameraParameters::updateRAW(cam_dimension_t max_dim)
   11927 {
   11928     int32_t rc = NO_ERROR;
   11929     cam_dimension_t raw_dim;
   11930 
   11931     getSensorOutputSize(max_dim,raw_dim);
   11932     setRawSize(raw_dim);
   11933     return rc;
   11934 }
   11935 
   11936 /*===========================================================================
   11937  * FUNCTION   : setHDRSceneEnable
   11938  *
   11939  * DESCRIPTION: sets hdr scene deteced flag
   11940  *
   11941  * PARAMETERS :
   11942  *   @bflag : hdr scene deteced
   11943  *
   11944  * RETURN     : nothing
   11945  *==========================================================================*/
   11946 void QCameraParameters::setHDRSceneEnable(bool bflag)
   11947 {
   11948     bool bupdate = false;
   11949     if (m_HDRSceneEnabled != bflag) {
   11950         bupdate = true;
   11951     }
   11952     m_HDRSceneEnabled = bflag;
   11953 
   11954     if (bupdate) {
   11955         updateFlash(true);
   11956     }
   11957 }
   11958 
   11959 /*===========================================================================
   11960  * FUNCTION   : getASDStateString
   11961  *
   11962  * DESCRIPTION: get ASD result in string format
   11963  *
   11964  * PARAMETERS :
   11965  *   @scene : selected scene mode
   11966  *
   11967  * RETURN     : int32_t type of status
   11968  *              NO_ERROR  -- success
   11969  *              none-zero failure code
   11970  *==========================================================================*/
   11971  const char *QCameraParameters::getASDStateString(cam_auto_scene_t scene)
   11972 {
   11973     switch (scene) {
   11974       case S_NORMAL :
   11975         return "Normal";
   11976       case S_SCENERY:
   11977         return "Scenery";
   11978       case S_PORTRAIT:
   11979         return "Portrait";
   11980       case S_PORTRAIT_BACKLIGHT:
   11981         return "Portrait-Backlight";
   11982       case S_SCENERY_BACKLIGHT:
   11983         return "Scenery-Backlight";
   11984       case S_BACKLIGHT:
   11985         return "Backlight";
   11986       default:
   11987         return "<Unknown!>";
   11988       }
   11989 }
   11990 
   11991 /*===========================================================================
   11992  * FUNCTION   : parseNDimVector
   11993  *
   11994  * DESCRIPTION: helper function to parse a string like "(1, 2, 3, 4, ..., N)"
   11995  *              into N-dimension vector
   11996  *
   11997  * PARAMETERS :
   11998  *   @str     : string to be parsed
   11999  *   @num     : output array of size N to store vector element values
   12000  *   @N       : number of dimension
   12001  *   @delim   : delimeter to seperete string
   12002  *
   12003  * RETURN     : int32_t type of status
   12004  *              NO_ERROR  -- success
   12005  *              none-zero failure code
   12006  *==========================================================================*/
   12007 int32_t QCameraParameters::parseNDimVector(const char *str, int *num, int N, char delim = ',')
   12008 {
   12009     char *start, *end;
   12010     if (num == NULL) {
   12011         LOGE("Invalid output array (num == NULL)");
   12012         return BAD_VALUE;
   12013     }
   12014 
   12015     //check if string starts and ends with parantheses
   12016     if(str[0] != '(' || str[strlen(str)-1] != ')') {
   12017         LOGE("Invalid format of string %s, valid format is (n1, n2, n3, n4 ...)",
   12018                str);
   12019         return BAD_VALUE;
   12020     }
   12021     start = (char*) str;
   12022     start++;
   12023     for(int i=0; i<N; i++) {
   12024         *(num+i) = (int) strtol(start, &end, 10);
   12025         if(*end != delim && i < N-1) {
   12026             LOGE("Cannot find delimeter '%c' in string \"%s\". end = %c",
   12027                    delim, str, *end);
   12028             return -1;
   12029         }
   12030         start = end+1;
   12031     }
   12032     return NO_ERROR;
   12033 }
   12034 
   12035 /*===========================================================================
   12036  * FUNCTION   : parseCameraAreaString
   12037  *
   12038  * DESCRIPTION: helper function to parse a string of camera areas like
   12039  *              "(1, 2, 3, 4, 5),(1, 2, 3, 4, 5),..."
   12040  *
   12041  * PARAMETERS :
   12042  *   @str             : string to be parsed
   12043  *   @max_num_areas   : max number of areas
   12044  *   @pAreas          : ptr to struct to store areas
   12045  *   @num_areas_found : number of areas found
   12046  *
   12047  * RETURN     : int32_t type of status
   12048  *              NO_ERROR  -- success
   12049  *              none-zero failure code
   12050  *==========================================================================*/
   12051 int32_t QCameraParameters::parseCameraAreaString(const char *str,
   12052                                                  int max_num_areas,
   12053                                                  cam_area_t *pAreas,
   12054                                                  int& num_areas_found)
   12055 {
   12056     char area_str[32];
   12057     const char *start, *end, *p;
   12058     start = str; end = NULL;
   12059     int values[5], index=0;
   12060     num_areas_found = 0;
   12061 
   12062     memset(values, 0, sizeof(values));
   12063     while(start != NULL) {
   12064        if(*start != '(') {
   12065             LOGE("error: Ill formatted area string: %s", str);
   12066             return BAD_VALUE;
   12067        }
   12068        end = strchr(start, ')');
   12069        if(end == NULL) {
   12070             LOGE("error: Ill formatted area string: %s", str);
   12071             return BAD_VALUE;
   12072        }
   12073        int i;
   12074        for (i=0,p=start; p<=end; p++, i++) {
   12075            area_str[i] = *p;
   12076        }
   12077        area_str[i] = '\0';
   12078        if(parseNDimVector(area_str, values, 5) < 0){
   12079             LOGE("error: Failed to parse the area string: %s", area_str);
   12080             return BAD_VALUE;
   12081        }
   12082        // no more areas than max_num_areas are accepted.
   12083        if(index >= max_num_areas) {
   12084             LOGE("error: too many areas specified %s", str);
   12085             return BAD_VALUE;
   12086        }
   12087        pAreas[index].rect.left = values[0];
   12088        pAreas[index].rect.top = values[1];
   12089        pAreas[index].rect.width = values[2] - values[0];
   12090        pAreas[index].rect.height = values[3] - values[1];
   12091        pAreas[index].weight = values[4];
   12092 
   12093        index++;
   12094        start = strchr(end, '('); // serach for next '('
   12095     }
   12096     num_areas_found = index;
   12097     return 0;
   12098 }
   12099 
   12100 /*===========================================================================
   12101  * FUNCTION   : validateCameraAreas
   12102  *
   12103  * DESCRIPTION: helper function to validate camera areas within (-1000, 1000)
   12104  *
   12105  * PARAMETERS :
   12106  *   @areas     : ptr to array of areas
   12107  *   @num_areas : number of areas
   12108  *
   12109  * RETURN     : true --  area is in valid range
   12110  *              false -- not valid
   12111  *==========================================================================*/
   12112 bool QCameraParameters::validateCameraAreas(cam_area_t *areas, int num_areas)
   12113 {
   12114     // special case: default area
   12115     if (num_areas == 1 &&
   12116         areas[0].rect.left == 0 &&
   12117         areas[0].rect.top == 0 &&
   12118         areas[0].rect.width == 0 &&
   12119         areas[0].rect.height == 0 &&
   12120         areas[0].weight == 0) {
   12121         return true;
   12122     }
   12123 
   12124     for(int i = 0; i < num_areas; i++) {
   12125         // left should be >= -1000
   12126         if(areas[i].rect.left < -1000) {
   12127             return false;
   12128         }
   12129 
   12130         // top  should be >= -1000
   12131         if(areas[i].rect.top < -1000) {
   12132             return false;
   12133         }
   12134 
   12135         // width or height should be > 0
   12136         if (areas[i].rect.width <= 0 || areas[i].rect.height <= 0) {
   12137             return false;
   12138         }
   12139 
   12140         // right  should be <= 1000
   12141         if(areas[i].rect.left + areas[i].rect.width > 1000) {
   12142             return false;
   12143         }
   12144 
   12145         // bottom should be <= 1000
   12146         if(areas[i].rect.top + areas[i].rect.height > 1000) {
   12147             return false;
   12148         }
   12149 
   12150         // weight should be within (1, 1000)
   12151         if (areas[i].weight < 1 || areas[i].weight > 1000) {
   12152             return false;
   12153         }
   12154     }
   12155     return true;
   12156 }
   12157 
   12158 /*===========================================================================
   12159  * FUNCTION   : isYUVFrameInfoNeeded
   12160  *
   12161  * DESCRIPTION: In AE-Bracket mode, we need set yuv buffer information for up-layer
   12162  *
   12163  * PARAMETERS : none
   12164  *
   12165  * RETURN     : true: needed
   12166  *              false: no need
   12167  *==========================================================================*/
   12168 bool QCameraParameters::isYUVFrameInfoNeeded()
   12169 {
   12170     //In AE-Bracket mode, we need set raw buffer information for up-layer
   12171     if(!isNV21PictureFormat() && !isNV16PictureFormat()){
   12172         return false;
   12173     }
   12174     const char *aecBracketStr =  get(KEY_QC_AE_BRACKET_HDR);
   12175 
   12176     int value = lookupAttr(BRACKETING_MODES_MAP, PARAM_MAP_SIZE(BRACKETING_MODES_MAP),
   12177             aecBracketStr);
   12178     LOGH("aecBracketStr=%s, value=%d.", aecBracketStr, value);
   12179     return (value == CAM_EXP_BRACKETING_ON);
   12180 }
   12181 
   12182 /*===========================================================================
   12183  * FUNCTION   : getFrameFmtString
   12184  *
   12185  * DESCRIPTION: get string name of frame format
   12186  *
   12187  * PARAMETERS :
   12188  *   @frame   : frame format
   12189  *
   12190  * RETURN     : string name of frame format
   12191  *==========================================================================*/
   12192 const char *QCameraParameters::getFrameFmtString(cam_format_t fmt)
   12193 {
   12194     return lookupNameByValue(PICTURE_TYPES_MAP, PARAM_MAP_SIZE(PICTURE_TYPES_MAP), fmt);
   12195 }
   12196 
   12197 /*===========================================================================
   12198  * FUNCTION   : setDcrf
   12199  *
   12200  * DESCRIPTION: Enable/Disable DCRF (dual-camera-range-finding)
   12201  *
   12202  * RETURN     : none
   12203  *==========================================================================*/
   12204 void QCameraParameters::setDcrf()
   12205 {
   12206     char prop[PROPERTY_VALUE_MAX];
   12207     memset(prop, 0, sizeof(prop));
   12208 
   12209     // Set DCRF to off by default (assuming single-camera mode)
   12210     m_bDcrfEnabled = 0;
   12211 
   12212     // In dual-cam mode, get sysprop and set it to on by default
   12213     if(m_relCamSyncInfo.sync_control == CAM_SYNC_RELATED_SENSORS_ON) {
   12214         property_get("persist.camera.dcrf.enable", prop, "1");
   12215         m_bDcrfEnabled = atoi(prop);
   12216     }
   12217 }
   12218 
   12219 /*===========================================================================
   12220  * FUNCTION   : setRelatedCamSyncInfo
   12221  *
   12222  * DESCRIPTION: set the related cam info parameters
   12223  * the related cam info is cached into params to make some decisions beforehand
   12224  *
   12225  * PARAMETERS :
   12226  *   @info  : ptr to related cam info parameters
   12227  *
   12228  * RETURN     : int32_t type of status
   12229  *              NO_ERROR  -- success
   12230  *              none-zero failure code
   12231  *==========================================================================*/
   12232 int32_t QCameraParameters::setRelatedCamSyncInfo(
   12233         cam_sync_related_sensors_event_info_t* info)
   12234 {
   12235     if(info != NULL){
   12236         memcpy(&m_relCamSyncInfo, info,
   12237                 sizeof(cam_sync_related_sensors_event_info_t));
   12238         return NO_ERROR;
   12239     } else {
   12240         LOGE("info buffer is null");
   12241         return UNKNOWN_ERROR;
   12242     }
   12243 }
   12244 
   12245 /*===========================================================================
   12246  * FUNCTION   : getRelatedCamSyncInfo
   12247  *
   12248  * DESCRIPTION:returns the related cam sync info for this HWI instance
   12249  *
   12250  * PARAMETERS :none
   12251  *
   12252  * RETURN     : const pointer to cam_sync_related_sensors_event_info_t
   12253  *==========================================================================*/
   12254 const cam_sync_related_sensors_event_info_t*
   12255         QCameraParameters::getRelatedCamSyncInfo(void)
   12256 {
   12257     return &m_relCamSyncInfo;
   12258 }
   12259 
   12260 /*===========================================================================
   12261  * FUNCTION   : setFrameSyncEnabled
   12262  *
   12263  * DESCRIPTION: sets whether frame sync is enabled
   12264  *
   12265  * PARAMETERS :
   12266  *   @enable  : flag whether to enable or disable frame sync
   12267  *
   12268  * RETURN     : int32_t type of status
   12269  *              NO_ERROR  -- success
   12270  *              none-zero failure code
   12271  *==========================================================================*/
   12272 int32_t QCameraParameters::setFrameSyncEnabled(bool enable)
   12273 {
   12274     m_bFrameSyncEnabled = enable;
   12275     return NO_ERROR;
   12276 }
   12277 
   12278 /*===========================================================================
   12279  * FUNCTION   : isFrameSyncEnabled
   12280  *
   12281  * DESCRIPTION: returns whether frame sync is enabled
   12282  *
   12283  * PARAMETERS :none
   12284  *
   12285  * RETURN     : bool indicating whether frame sync is enabled
   12286  *==========================================================================*/
   12287 bool QCameraParameters::isFrameSyncEnabled(void)
   12288 {
   12289     return m_bFrameSyncEnabled;
   12290 }
   12291 
   12292 /*===========================================================================
   12293  * FUNCTION   : sendDualCamBundle
   12294  *
   12295  * DESCRIPTION: send trigger for bundling related camera sessions in the server
   12296  *
   12297  * PARAMETERS :
   12298  *   @sync_enable :indicates whether syncing is On or Off
   12299  *   @sessionid   :session id for other camera session
   12300  *
   12301  * RETURN     : int32_t type of status
   12302  *              NO_ERROR  -- success
   12303  *              none-zero failure code
   12304  *NOTE: This bundle info needs to called only once per session.
   12305  * Should be called after open and before start stream.
   12306  * Application can trigger this function to enable module SYNC in dual camera case
   12307  *==========================================================================*/
   12308 int32_t QCameraParameters::setDualCamBundleInfo(bool enable_sync,
   12309         uint8_t bundle_cam_idx)
   12310 {
   12311     int32_t rc = NO_ERROR;
   12312     cam_dual_camera_bundle_info_t bundle_info;
   12313     uint8_t num_cam = 0;
   12314     int32_t sync = 0;
   12315     uint32_t mode, type, role = 0;
   12316     cam_3a_sync_mode_t sync_3a_mode = CAM_3A_SYNC_FOLLOW;
   12317     char prop[PROPERTY_VALUE_MAX];
   12318     memset(prop, 0, sizeof(prop));
   12319 
   12320     if(enable_sync) {
   12321         sync = (int32_t)CAM_SYNC_RELATED_SENSORS_ON;
   12322     } else {
   12323         sync = (int32_t)CAM_SYNC_RELATED_SENSORS_OFF;
   12324     }
   12325 
   12326     property_get("persist.camera.stats.test.2outs", prop, "0");
   12327     sync_3a_mode = (atoi(prop) > 0) ? CAM_3A_SYNC_ALGO_CTRL : sync_3a_mode;
   12328 
   12329     if (m_pCapability->position == CAM_POSITION_BACK_AUX) {
   12330         mode = CAM_MODE_SECONDARY;
   12331         type = CAM_TYPE_AUX;
   12332     } else {
   12333         mode = CAM_MODE_PRIMARY;
   12334         type = CAM_TYPE_MAIN;
   12335     }
   12336 
   12337     if (m_pCapability->lens_type == CAM_LENS_WIDE) {
   12338         role = CAM_ROLE_WIDE;
   12339     } else if (m_pCapability->lens_type == CAM_LENS_TELE) {
   12340         role = CAM_ROLE_TELE;
   12341     }
   12342     bundle_info.sync_control =
   12343             (cam_sync_related_sensors_control_t)sync;
   12344     bundle_info.mode = (cam_sync_mode_t)mode;
   12345     bundle_info.type = (cam_sync_type_t)type;
   12346     bundle_info.cam_role = (cam_dual_camera_role_t)role;
   12347     bundle_info.related_sensor_session_id = sessionId[bundle_cam_idx];
   12348     bundle_info.perf_mode = getLowPowerMode(bundle_info.type);
   12349     bundle_info.is_hw_sync_enabled = DUALCAM_HW_SYNC_ENABLED;
   12350     num_cam++;
   12351 
   12352     rc = sendDualCamCmd(CAM_DUAL_CAMERA_BUNDLE_INFO,
   12353             num_cam, &bundle_info);
   12354     return rc;
   12355 }
   12356 
   12357 /*===========================================================================
   12358  * FUNCTION   : sendDualCamCmd
   12359  *
   12360  * DESCRIPTION: send dual camera related commands
   12361  *
   12362  * PARAMETERS :
   12363  *   @sync_enable        :indicates whether syncing is On or Off
   12364  *   @sessionid  :session id for other camera session
   12365  *
   12366  * RETURN     : int32_t type of status
   12367  *              NO_ERROR  -- success
   12368  *              none-zero failure code
   12369  *NOTE: This bundle info needs to called only once per session.
   12370  * Should be called after open and before start stream.
   12371  *==========================================================================*/
   12372 int32_t QCameraParameters::sendDualCamCmd(cam_dual_camera_cmd_type type,
   12373         uint8_t num_cam, void *cmd_value)
   12374 {
   12375     int32_t rc = NO_ERROR;
   12376     if (NULL == m_pCamOpsTbl) {
   12377         LOGE("Ops not initialized");
   12378         return NO_INIT;
   12379     }
   12380 
   12381     if (cmd_value == NULL || num_cam > MM_CAMERA_MAX_CAM_CNT
   12382             || m_pDualCamCmdPtr[0] == NULL) {
   12383         LOGE("Invalid argument = %d, %p", num_cam, cmd_value);
   12384         return BAD_VALUE;
   12385     }
   12386 
   12387     for (int i = 0; i < MM_CAMERA_MAX_CAM_CNT; i++) {
   12388         memset(m_pDualCamCmdPtr[i], 0,
   12389                 sizeof(cam_dual_camera_cmd_info_t));
   12390     }
   12391 
   12392     switch(type) {
   12393         case CAM_DUAL_CAMERA_BUNDLE_INFO: {
   12394             for (int i = 0; i < num_cam; i++) {
   12395                 cam_dual_camera_bundle_info_t *info =
   12396                         (cam_dual_camera_bundle_info_t *)cmd_value;
   12397                 m_pDualCamCmdPtr[i]->cmd_type = type;
   12398                 memcpy(&m_pDualCamCmdPtr[i]->bundle_info,
   12399                         &info[i],
   12400                         sizeof(cam_dual_camera_bundle_info_t));
   12401                 LOGH("SYNC CMD %d: cmd %d mode %d type %d hw-sync %d session - %d", i,
   12402                         m_pDualCamCmdPtr[i]->cmd_type,
   12403                         m_pDualCamCmdPtr[i]->bundle_info.mode,
   12404                         m_pDualCamCmdPtr[i]->bundle_info.type,
   12405                         m_pDualCamCmdPtr[i]->bundle_info.is_hw_sync_enabled,
   12406                         m_pDualCamCmdPtr[i]->bundle_info.related_sensor_session_id);
   12407             }
   12408         }
   12409         break;
   12410 
   12411         case CAM_DUAL_CAMERA_LOW_POWER_MODE: {
   12412             for (int i = 0; i < num_cam; i++) {
   12413                 cam_dual_camera_perf_control_t *info =
   12414                         (cam_dual_camera_perf_control_t *)cmd_value;
   12415                 m_pDualCamCmdPtr[i]->cmd_type = type;
   12416                 memcpy(&m_pDualCamCmdPtr[i]->value,
   12417                         &info[i],
   12418                         sizeof(cam_dual_camera_perf_control_t));
   12419                 LOGH("LPM CMD %d: cmd %d LPM Enable - %d mode = %d", i,
   12420                         m_pDualCamCmdPtr[i]->cmd_type,
   12421                         m_pDualCamCmdPtr[i]->value.enable,
   12422                         m_pDualCamCmdPtr[i]->value.perf_mode);
   12423             }
   12424         }
   12425         break;
   12426 
   12427         case CAM_DUAL_CAMERA_MASTER_INFO: {
   12428             for (int i = 0; i < num_cam; i++) {
   12429                 cam_dual_camera_master_info_t *info =
   12430                         (cam_dual_camera_master_info_t *)cmd_value;
   12431                 m_pDualCamCmdPtr[i]->cmd_type = type;
   12432                 memcpy(&m_pDualCamCmdPtr[i]->mode,
   12433                         &info[i],
   12434                         sizeof(cam_dual_camera_master_info_t));
   12435                 LOGH("MASTER INFO CMD %d: cmd %d value %d", i,
   12436                         m_pDualCamCmdPtr[i]->cmd_type,
   12437                         m_pDualCamCmdPtr[i]->mode);
   12438             }
   12439         }
   12440         break;
   12441 
   12442         case CAM_DUAL_CAMERA_DEFER_INFO: {
   12443             cam_dual_camera_defer_cmd_t *info =
   12444                     (cam_dual_camera_defer_cmd_t *)cmd_value;
   12445             for (int i = 0; i < num_cam; i++) {
   12446                 m_pDualCamCmdPtr[i]->cmd_type = type;
   12447                 memcpy(&m_pDualCamCmdPtr[i]->defer_cmd,
   12448                         &info[i],
   12449                         sizeof(cam_dual_camera_master_info_t));
   12450                 LOGH("DEFER INFO CMD %d: cmd %d value %d", i,
   12451                         m_pDualCamCmdPtr[i]->cmd_type,
   12452                         m_pDualCamCmdPtr[i]->defer_cmd);
   12453             }
   12454         }
   12455         break;
   12456         default :
   12457         break;
   12458     }
   12459 
   12460     rc = m_pCamOpsTbl->ops->set_dual_cam_cmd(m_pCamOpsTbl->camera_handle);
   12461     return rc;
   12462 }
   12463 
   12464 /*===========================================================================
   12465  * FUNCTION   : bundleRelatedCameras
   12466  *
   12467  * DESCRIPTION: send trigger for bundling related camera sessions in the server
   12468  *
   12469  * PARAMETERS :
   12470  *   @sync        :indicates whether syncing is On or Off
   12471  *   @sessionid  :session id for other camera session
   12472  *
   12473  * RETURN     : int32_t type of status
   12474  *              NO_ERROR  -- success
   12475  *              none-zero failure code
   12476  *==========================================================================*/
   12477 int32_t QCameraParameters::bundleRelatedCameras(bool sync)
   12478 {
   12479     int32_t rc = NO_ERROR;
   12480     setDualCamBundleInfo(sync, m_pCapability->camera_index);
   12481     return rc;
   12482 }
   12483 
   12484 /*===========================================================================
   12485  * FUNCTION   : getRelatedCamCalibration
   12486  *
   12487  * DESCRIPTION: fetch the related camera subsystem calibration data
   12488  *
   12489  * PARAMETERS :
   12490  *   @calib  : calibration data fetched
   12491  *
   12492  * RETURN     : int32_t type of status
   12493  *              NO_ERROR  -- success
   12494  *              none-zero failure code
   12495  *==========================================================================*/
   12496 int32_t QCameraParameters::getRelatedCamCalibration(
   12497         cam_related_system_calibration_data_t* calib)
   12498 {
   12499     int32_t rc = NO_ERROR;
   12500 
   12501     if(!calib) {
   12502         return BAD_TYPE;
   12503     }
   12504 
   12505     if(initBatchUpdate() < 0 ) {
   12506         LOGE("Failed to initialize group update table");
   12507         return BAD_TYPE;
   12508     }
   12509 
   12510     ADD_GET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   12511             CAM_INTF_PARM_RELATED_SENSORS_CALIBRATION);
   12512 
   12513     rc = commitGetBatch();
   12514     if (rc != NO_ERROR) {
   12515         LOGE("Failed to get related cam calibration info");
   12516         return rc;
   12517     }
   12518 
   12519     READ_PARAM_ENTRY(m_pParamBuf,
   12520             CAM_INTF_PARM_RELATED_SENSORS_CALIBRATION, *calib);
   12521 
   12522     LOGD("CALIB version %d ", calib->calibration_format_version);
   12523     LOGD("CALIB normalized_focal_length %f ",
   12524             calib->main_cam_specific_calibration.normalized_focal_length);
   12525     LOGD("CALIB native_sensor_resolution_width %d ",
   12526             calib->main_cam_specific_calibration.native_sensor_resolution_width);
   12527     LOGD("CALIB native_sensor_resolution_height %d ",
   12528             calib->main_cam_specific_calibration.native_sensor_resolution_height);
   12529     LOGD("CALIB sensor_resolution_width %d ",
   12530             calib->main_cam_specific_calibration.calibration_sensor_resolution_width);
   12531     LOGD("CALIB sensor_resolution_height %d ",
   12532             calib->main_cam_specific_calibration.calibration_sensor_resolution_height);
   12533     LOGD("CALIB focal_length_ratio %f ",
   12534             calib->main_cam_specific_calibration.focal_length_ratio);
   12535 
   12536     return rc;
   12537 }
   12538 
   12539 /*===========================================================================
   12540  * FUNCTION   : setSyncDCParams
   12541  *
   12542  * DESCRIPTION: Enable/Disable sync Dual-camera Parameters
   12543  *              Set this parameter when Dual camera needs to sync
   12544  *
   12545  * RETURN     : none
   12546  *==========================================================================*/
   12547 void QCameraParameters::setSyncDCParams()
   12548 {
   12549     uint32_t temp_mSyncDCParam = 0;
   12550     char prop[PROPERTY_VALUE_MAX];
   12551     memset(prop, 0, sizeof(prop));
   12552 
   12553     //Keep it enable by default.
   12554     //It will be used for Dual camera sync parameters
   12555     property_get("persist.camera.syncDCParams.en", prop, "1");
   12556     temp_mSyncDCParam = atoi(prop);
   12557 
   12558     if (MM_CAMERA_DUAL_CAM == mActiveCameras) {
   12559         mSyncDCParam = temp_mSyncDCParam;
   12560     }
   12561 }
   12562 
   12563 
   12564 /*===========================================================================
   12565  * FUNCTION   : SyncDCParams
   12566  *
   12567  * DESCRIPTION: Add sync dual camera parameter if this super parameter applies
   12568  *              to all related camera.
   12569                 This is the indication to MCT that this parameter needs to
   12570  *              synchronized. There will be another parameter entry in
   12571                 other camera with different values
   12572  *
   12573  * PARAMETERS : none
   12574  *
   12575  * RETURN     : int32_t type of status
   12576  *              NO_ERROR  -- success
   12577  *              none-zero failure code
   12578  *==========================================================================*/
   12579 int32_t QCameraParameters::SyncDCParams()
   12580 {
   12581     //Add dual-parameter in parameters
   12582     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   12583         CAM_INTF_PARM_SYNC_DC_PARAMETERS, mSyncDCParam)) {
   12584         LOGE("Failed to update table");
   12585         return BAD_VALUE;
   12586     }
   12587     return NO_ERROR;
   12588 }
   12589 
   12590 /*===========================================================================
   12591  * FUNCTION   : updateFrameNumber
   12592  *
   12593  * DESCRIPTION: update frame number and add frame number in parameters
   12594  *
   12595  * PARAMETERS : none
   12596  *
   12597  * RETURN     : int32_t type of status
   12598  *              NO_ERROR  -- success
   12599  *              none-zero failure code
   12600  *==========================================================================*/
   12601 int32_t QCameraParameters::updateFrameNumber()
   12602 {
   12603     mFrameNumber++;
   12604     //Add frame number in parameters
   12605     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_META_FRAME_NUMBER,
   12606             mFrameNumber)) {
   12607         LOGE("Failed to update table");
   12608         return BAD_VALUE;
   12609     }
   12610     return NO_ERROR;
   12611 }
   12612 
   12613 /*===========================================================================
   12614  * FUNCTION   : initBatchUpdate
   12615  *
   12616  * DESCRIPTION: init camera parameters buf entries
   12617  *
   12618  * PARAMETERS :
   12619  *   @p_table : ptr to parameter buffer
   12620  *
   12621  * RETURN     : int32_t type of status
   12622  *              NO_ERROR  -- success
   12623  *              none-zero failure code
   12624  *==========================================================================*/
   12625 int32_t QCameraParameters::initBatchUpdate()
   12626 {
   12627     m_tempMap.clear();
   12628     clear_metadata_buffer(m_pParamBuf);
   12629     clear_metadata_buffer(m_pParamBufAux);
   12630     return NO_ERROR;
   12631 }
   12632 
   12633 /*===========================================================================
   12634 * FUNCTION   : setAuxParameters
   12635 *
   12636 * DESCRIPTION: Parameter only required for auxillary camera is set.
   12637 *
   12638 * PARAMETERS : none
   12639 *
   12640 * RETURN     : none
   12641 *NOTE: We can use this function configure auxillary camera related parameters.
   12642 *==========================================================================*/
   12643 void QCameraParameters::setAuxParameters()
   12644 {
   12645     void *aux_param = NULL;
   12646     if (m_pParamBufAux->is_valid[CAM_INTF_META_STREAM_INFO]) {
   12647         aux_param = POINTER_OF_META(CAM_INTF_META_STREAM_INFO, m_pParamBufAux);
   12648         if (aux_param) {
   12649             cam_stream_size_info_t *info = (cam_stream_size_info_t *)aux_param;
   12650             info->sync_type = CAM_TYPE_AUX;
   12651 
   12652             if (isDCmAsymmetricSnapMode()) {
   12653                 for (uint32_t i = 0; i < info->num_streams; i++) {
   12654                     if (info->type[i] == CAM_STREAM_TYPE_SNAPSHOT) {
   12655                         getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,
   12656                                 info->stream_sizes[i], CAM_TYPE_AUX);
   12657                         break;
   12658                     }
   12659                 }
   12660             }
   12661         }
   12662     }
   12663 }
   12664 
   12665 /*===========================================================================
   12666  * FUNCTION   : commitSetBatch
   12667  *
   12668  * DESCRIPTION: commit all set parameters in the batch work to backend
   12669  *
   12670  * PARAMETERS : none
   12671  *
   12672  * RETURN     : int32_t type of status
   12673  *              NO_ERROR  -- success
   12674  *              none-zero failure code
   12675  *==========================================================================*/
   12676 int32_t QCameraParameters::commitSetBatch()
   12677 {
   12678     int32_t rc = NO_ERROR;
   12679     int32_t i = 0;
   12680 
   12681     if (NULL == m_pParamBuf) {
   12682         LOGE("Params not initialized");
   12683         return NO_INIT;
   12684     }
   12685 
   12686     /* Loop to check if atleast one entry is valid */
   12687     for(i = 0; i < CAM_INTF_PARM_MAX; i++){
   12688         if(m_pParamBuf->is_valid[i])
   12689             break;
   12690     }
   12691 
   12692     if (NULL == m_pCamOpsTbl) {
   12693         LOGE("Ops not initialized");
   12694         return NO_INIT;
   12695     }
   12696     if (isDualCamera()) {
   12697         /* Add frame number logic for HAL1 in dual camera
   12698          * to synchronize parameters in MCT
   12699          */
   12700         updateFrameNumber();
   12701         SyncDCParams();
   12702     }
   12703     if (i < CAM_INTF_PARM_MAX) {
   12704         rc = m_pCamOpsTbl->ops->set_parms(get_main_camera_handle(m_pCamOpsTbl->camera_handle),
   12705             m_pParamBuf);
   12706     }
   12707 
   12708     if ((i < CAM_INTF_PARM_MAX) && isDualCamera()) {
   12709         // Translate input parameters from main camera to create parameter set for aux camera
   12710         rc = m_pFovControl->translateInputParams(m_pParamBuf, m_pParamBufAux);
   12711 
   12712         if (rc != NO_ERROR) {
   12713             LOGE("FOV-control: Failed to translate params for aux camera");
   12714             return rc;
   12715         }
   12716 
   12717         rc = commitSetBatchAux();
   12718         if (rc != NO_ERROR) {
   12719             LOGE("FOV-control: Failed to set params for Aux camera");
   12720             return rc;
   12721         }
   12722     }
   12723 
   12724     if (rc == NO_ERROR) {
   12725         // commit change from temp storage into param map
   12726         rc = commitParamChanges();
   12727     }
   12728     return rc;
   12729 }
   12730 
   12731 /*===========================================================================
   12732  * FUNCTION   : commitSetBatchAux
   12733  *
   12734  * DESCRIPTION: commit all Aux set parameters in the batch work to backend
   12735  *
   12736  * PARAMETERS : none
   12737  *
   12738  * RETURN     : int32_t type of status
   12739  *              NO_ERROR  -- success
   12740  *              none-zero failure code
   12741  *==========================================================================*/
   12742 int32_t QCameraParameters::commitSetBatchAux()
   12743 {
   12744     int32_t rc = NO_ERROR;
   12745 
   12746     if (NULL == m_pParamBufAux || NULL == m_pParamBuf) {
   12747         LOGE("Params not initialized");
   12748         return NO_INIT;
   12749     }
   12750 
   12751     if (NULL == m_pCamOpsTbl->ops) {
   12752         LOGE("Ops not initialized");
   12753         return NO_INIT;
   12754     }
   12755 
   12756     setAuxParameters();
   12757     rc = m_pCamOpsTbl->ops->set_parms(
   12758             get_aux_camera_handle(m_pCamOpsTbl->camera_handle),
   12759             m_pParamBufAux);
   12760     return rc;
   12761 }
   12762 
   12763 /*===========================================================================
   12764  * FUNCTION   : commitGetBatch
   12765  *
   12766  * DESCRIPTION: commit all get parameters in the batch work to backend
   12767  *
   12768  * PARAMETERS : none
   12769  *
   12770  * RETURN     : int32_t type of status
   12771  *              NO_ERROR  -- success
   12772  *              none-zero failure code
   12773  *==========================================================================*/
   12774 int32_t QCameraParameters::commitGetBatch()
   12775 {
   12776     int32_t rc = NO_ERROR;
   12777     int32_t i = 0;
   12778 
   12779     if (NULL == m_pParamBuf) {
   12780         LOGE("Params not initialized");
   12781         return NO_INIT;
   12782     }
   12783 
   12784     /* Loop to check if atleast one entry is valid */
   12785     for(i = 0; i < CAM_INTF_PARM_MAX; i++){
   12786         if(m_pParamBuf->is_valid[i])
   12787             break;
   12788     }
   12789 
   12790     if (NULL == m_pCamOpsTbl) {
   12791         LOGE("Ops not initialized");
   12792         return NO_INIT;
   12793     }
   12794 
   12795     if (i < CAM_INTF_PARM_MAX) {
   12796         return m_pCamOpsTbl->ops->get_parms(m_pCamOpsTbl->camera_handle, m_pParamBuf);
   12797     } else {
   12798         return NO_ERROR;
   12799     }
   12800 
   12801     if (i < CAM_INTF_PARM_MAX &&
   12802         is_dual_camera_by_handle(m_pCamOpsTbl->camera_handle)) {
   12803         rc = commitGetBatchAux();
   12804         if (rc != NO_ERROR) {
   12805             LOGE("Failed to get parma for Aux camera");
   12806             return rc;
   12807         }
   12808     }
   12809     return rc;
   12810 }
   12811 
   12812 /*===========================================================================
   12813  * FUNCTION   : commitGetBatchAux
   12814  *
   12815  * DESCRIPTION: commit all Aux get parameters in the batch work to backend
   12816  *
   12817  * PARAMETERS : none
   12818  *
   12819  * RETURN     : int32_t type of status
   12820  *              NO_ERROR  -- success
   12821  *              none-zero failure code
   12822  *==========================================================================*/
   12823 int32_t QCameraParameters::commitGetBatchAux()
   12824 {
   12825     int32_t rc = NO_ERROR;
   12826     int32_t i = 0;
   12827 
   12828     if (NULL == m_pParamBufAux) {
   12829         LOGE("Params not initialized");
   12830         return NO_INIT;
   12831     }
   12832 
   12833     /* Loop to check if atleast one entry is valid */
   12834     for(i = 0; i < CAM_INTF_PARM_MAX; i++){
   12835         if(m_pParamBufAux->is_valid[i])
   12836             break;
   12837     }
   12838 
   12839     if (NULL == m_pCamOpsTbl->ops) {
   12840         LOGE("Ops not initialized");
   12841         return NO_INIT;
   12842     }
   12843 
   12844     if (i < CAM_INTF_PARM_MAX) {
   12845         return m_pCamOpsTbl->ops->get_parms(
   12846                 get_aux_camera_handle(m_pCamOpsTbl->camera_handle),
   12847                 m_pParamBufAux);
   12848     } else {
   12849         return NO_ERROR;
   12850     }
   12851     return rc;
   12852 }
   12853 
   12854 /*===========================================================================
   12855  * FUNCTION   : updateParamEntry
   12856  *
   12857  * DESCRIPTION: update a parameter entry in the local temp map obj
   12858  *
   12859  * PARAMETERS :
   12860  *   @key     : key of the entry
   12861  *   @value   : value of the entry
   12862  *
   12863  * RETURN     : int32_t type of status
   12864  *              NO_ERROR  -- success
   12865  *              none-zero failure code
   12866  *==========================================================================*/
   12867 int32_t QCameraParameters::updateParamEntry(const char *key, const char *value)
   12868 {
   12869     m_tempMap.replaceValueFor(String8(key), String8(value));
   12870     return NO_ERROR;
   12871 }
   12872 
   12873 /*===========================================================================
   12874  * FUNCTION   : commitParamChanges
   12875  *
   12876  * DESCRIPTION: commit all changes in local temp map obj into parameter obj
   12877  *
   12878  * PARAMETERS : none
   12879  *
   12880  * RETURN     : int32_t type of status
   12881  *              NO_ERROR  -- success
   12882  *              none-zero failure code
   12883  *==========================================================================*/
   12884 int32_t QCameraParameters::commitParamChanges()
   12885 {
   12886     size_t size = m_tempMap.size();
   12887     for (size_t i = 0; i < size; i++) {
   12888         String8 k, v;
   12889         k = m_tempMap.keyAt(i);
   12890         v = m_tempMap.valueAt(i);
   12891         set(k, v);
   12892     }
   12893     m_tempMap.clear();
   12894 
   12895     // update local changes
   12896     m_bRecordingHint = m_bRecordingHint_new;
   12897     m_bZslMode = m_bZslMode_new;
   12898 
   12899     /* After applying scene mode auto,
   12900       Camera effects need to be reapplied */
   12901     if ( m_bSceneTransitionAuto ) {
   12902         m_bUpdateEffects = true;
   12903         m_bSceneTransitionAuto = false;
   12904     }
   12905 
   12906 
   12907     return NO_ERROR;
   12908 }
   12909 
   12910 /*===========================================================================
   12911  * FUNCTION   : QCameraReprocScaleParam
   12912  *
   12913  * DESCRIPTION: constructor of QCameraReprocScaleParam
   12914  *
   12915  * PARAMETERS : none
   12916  *
   12917  * RETURN     : none
   12918  *==========================================================================*/
   12919 QCameraParameters::QCameraReprocScaleParam::QCameraReprocScaleParam()
   12920   : mScaleEnabled(false),
   12921     mIsUnderScaling(false),
   12922     mNeedScaleCnt(0),
   12923     mSensorSizeTblCnt(0),
   12924     mSensorSizeTbl(NULL),
   12925     mTotalSizeTblCnt(0)
   12926 {
   12927     mPicSizeFromAPK.width = 0;
   12928     mPicSizeFromAPK.height = 0;
   12929     mPicSizeSetted.width = 0;
   12930     mPicSizeSetted.height = 0;
   12931     memset(mNeedScaledSizeTbl, 0, sizeof(mNeedScaledSizeTbl));
   12932     memset(mTotalSizeTbl, 0, sizeof(mTotalSizeTbl));
   12933 }
   12934 
   12935 /*===========================================================================
   12936  * FUNCTION   : ~~QCameraReprocScaleParam
   12937  *
   12938  * DESCRIPTION: destructor of QCameraReprocScaleParam
   12939  *
   12940  * PARAMETERS : none
   12941  *
   12942  * RETURN     : none
   12943  *==========================================================================*/
   12944 QCameraParameters::QCameraReprocScaleParam::~QCameraReprocScaleParam()
   12945 {
   12946     //do nothing now.
   12947 }
   12948 
   12949 /*===========================================================================
   12950  * FUNCTION   : setScaledSizeTbl
   12951  *
   12952  * DESCRIPTION: re-set picture size table with dimensions that need scaling if Reproc Scale is enabled
   12953  *
   12954  * PARAMETERS :
   12955  *   @scale_cnt   : count of picture sizes that want scale
   12956  *   @scale_tbl    : picture size table that want scale
   12957  *   @org_cnt     : sensor supported picture size count
   12958  *   @org_tbl      : sensor supported picture size table
   12959  *
   12960  * RETURN     : int32_t type of status
   12961  *              NO_ERROR  -- success
   12962  *              none-zero failure code
   12963  *==========================================================================*/
   12964 int32_t QCameraParameters::QCameraReprocScaleParam::setScaleSizeTbl(size_t scale_cnt,
   12965         cam_dimension_t *scale_tbl, size_t org_cnt, cam_dimension_t *org_tbl)
   12966 {
   12967     int32_t rc = NO_ERROR;
   12968     size_t i;
   12969     mNeedScaleCnt = 0;
   12970 
   12971     if(!mScaleEnabled || scale_cnt <=0 || scale_tbl == NULL || org_cnt <=0 || org_tbl == NULL){
   12972         return BAD_VALUE;    // Do not need scale, so also need not reset picture size table
   12973     }
   12974 
   12975     mSensorSizeTblCnt = org_cnt;
   12976     mSensorSizeTbl = org_tbl;
   12977     mNeedScaleCnt = checkScaleSizeTable(scale_cnt, scale_tbl, org_cnt, org_tbl);
   12978     if(mNeedScaleCnt <= 0){
   12979         LOGE("do not have picture sizes need scaling.");
   12980         return BAD_VALUE;
   12981     }
   12982 
   12983     if(mNeedScaleCnt + org_cnt > MAX_SIZES_CNT){
   12984         LOGE("picture size list exceed the max count.");
   12985         return BAD_VALUE;
   12986     }
   12987 
   12988     //get the total picture size table
   12989     mTotalSizeTblCnt = mNeedScaleCnt + org_cnt;
   12990 
   12991     if (mNeedScaleCnt > MAX_SCALE_SIZES_CNT) {
   12992         LOGE("Error!! mNeedScaleCnt (%d) is more than MAX_SCALE_SIZES_CNT",
   12993                  mNeedScaleCnt);
   12994         return BAD_VALUE;
   12995     }
   12996 
   12997     for(i = 0; i < mNeedScaleCnt; i++){
   12998         mTotalSizeTbl[i].width = mNeedScaledSizeTbl[i].width;
   12999         mTotalSizeTbl[i].height = mNeedScaledSizeTbl[i].height;
   13000         LOGH("scale picture size: i =%d, width=%d, height=%d.",
   13001             i, mTotalSizeTbl[i].width, mTotalSizeTbl[i].height);
   13002     }
   13003     for(; i < mTotalSizeTblCnt; i++){
   13004         mTotalSizeTbl[i].width = org_tbl[i-mNeedScaleCnt].width;
   13005         mTotalSizeTbl[i].height = org_tbl[i-mNeedScaleCnt].height;
   13006         LOGH("sensor supportted picture size: i =%d, width=%d, height=%d.",
   13007             i, mTotalSizeTbl[i].width, mTotalSizeTbl[i].height);
   13008     }
   13009     return rc;
   13010 }
   13011 
   13012 /*===========================================================================
   13013  * FUNCTION   : getScaledSizeTblCnt
   13014  *
   13015  * DESCRIPTION: get picture size cnt that need scale
   13016  *
   13017  * PARAMETERS : none
   13018  *
   13019  * RETURN     : uint8_t type of picture size count
   13020  *==========================================================================*/
   13021 size_t QCameraParameters::QCameraReprocScaleParam::getScaleSizeTblCnt()
   13022 {
   13023     return mNeedScaleCnt;
   13024 }
   13025 
   13026 /*===========================================================================
   13027  * FUNCTION   : getScaledSizeTbl
   13028  *
   13029  * DESCRIPTION: get picture size table that need scale
   13030  *
   13031  * PARAMETERS :  none
   13032  *
   13033  * RETURN     : cam_dimension_t list of picture size table
   13034  *==========================================================================*/
   13035 cam_dimension_t *QCameraParameters::QCameraReprocScaleParam::getScaledSizeTbl()
   13036 {
   13037     if(!mScaleEnabled)
   13038         return NULL;
   13039 
   13040     return mNeedScaledSizeTbl;
   13041 }
   13042 
   13043 /*===========================================================================
   13044  * FUNCTION   : setScaleEnable
   13045  *
   13046  * DESCRIPTION: enable or disable Reproc Scale
   13047  *
   13048  * PARAMETERS :
   13049  *   @enabled : enable: 1; disable 0
   13050  *
   13051  * RETURN     : none
   13052  *==========================================================================*/
   13053 void QCameraParameters::QCameraReprocScaleParam::setScaleEnable(bool enabled)
   13054 {
   13055     mScaleEnabled = enabled;
   13056 }
   13057 
   13058 /*===========================================================================
   13059  * FUNCTION   : isScaleEnabled
   13060  *
   13061  * DESCRIPTION: check if Reproc Scale is enabled
   13062  *
   13063  * PARAMETERS :  none
   13064  *
   13065  * RETURN     : bool type of status
   13066  *==========================================================================*/
   13067 bool QCameraParameters::QCameraReprocScaleParam::isScaleEnabled()
   13068 {
   13069     return mScaleEnabled;
   13070 }
   13071 
   13072 /*===========================================================================
   13073  * FUNCTION   : isScalePicSize
   13074  *
   13075  * DESCRIPTION: check if current picture size is from Scale Table
   13076  *
   13077  * PARAMETERS :
   13078  *   @width     : current picture width
   13079  *   @height    : current picture height
   13080  *
   13081  * RETURN     : bool type of status
   13082  *==========================================================================*/
   13083 bool QCameraParameters::QCameraReprocScaleParam::isScalePicSize(int width, int height)
   13084 {
   13085     //Check if the picture size is in scale table
   13086     if(mNeedScaleCnt <= 0)
   13087         return FALSE;
   13088 
   13089     for (size_t i = 0; i < mNeedScaleCnt; i++) {
   13090         if ((mNeedScaledSizeTbl[i].width == width) && (mNeedScaledSizeTbl[i].height == height)) {
   13091             //found match
   13092             return TRUE;
   13093         }
   13094     }
   13095 
   13096     LOGE("Not in scale picture size table.");
   13097     return FALSE;
   13098 }
   13099 
   13100 /*===========================================================================
   13101  * FUNCTION   : isValidatePicSize
   13102  *
   13103  * DESCRIPTION: check if current picture size is validate
   13104  *
   13105  * PARAMETERS :
   13106  *   @width     : current picture width
   13107  *   @height    : current picture height
   13108  *
   13109  * RETURN     : bool type of status
   13110  *==========================================================================*/
   13111 bool QCameraParameters::QCameraReprocScaleParam::isValidatePicSize(int width, int height)
   13112 {
   13113     size_t i = 0;
   13114 
   13115     for(i = 0; i < mSensorSizeTblCnt; i++){
   13116         if(mSensorSizeTbl[i].width == width
   13117             && mSensorSizeTbl[i].height== height){
   13118             return TRUE;
   13119         }
   13120     }
   13121 
   13122     for(i = 0; i < mNeedScaleCnt; i++){
   13123         if(mNeedScaledSizeTbl[i].width == width
   13124             && mNeedScaledSizeTbl[i].height== height){
   13125             return TRUE;
   13126         }
   13127     }
   13128 
   13129     LOGE("Invalidate input picture size.");
   13130     return FALSE;
   13131 }
   13132 
   13133 /*===========================================================================
   13134  * FUNCTION   : setSensorSupportedPicSize
   13135  *
   13136  * DESCRIPTION: set sensor supported picture size.
   13137  *    For Snapshot stream size configuration, we need use sensor supported size.
   13138  *    We will use CPP to do Scaling based on output Snapshot stream.
   13139  *
   13140  * PARAMETERS : none
   13141  *
   13142  * RETURN     : int32_t type of status
   13143  *              NO_ERROR  -- success
   13144  *              none-zero failure code
   13145  *==========================================================================*/
   13146 int32_t QCameraParameters::QCameraReprocScaleParam::setSensorSupportedPicSize()
   13147 {
   13148     //will find a suitable picture size (here we leave a prossibility to add other scale requirement)
   13149     //Currently we only focus on upscaling, and checkScaleSizeTable() has guaranteed the dimension ratio.
   13150 
   13151     if(!mIsUnderScaling || mSensorSizeTblCnt <= 0)
   13152         return BAD_VALUE;
   13153 
   13154     //We just get the max sensor supported size here.
   13155     mPicSizeSetted.width = mSensorSizeTbl[0].width;
   13156     mPicSizeSetted.height = mSensorSizeTbl[0].height;
   13157 
   13158     return NO_ERROR;
   13159 }
   13160 
   13161 
   13162 /*===========================================================================
   13163  * FUNCTION   : setValidatePicSize
   13164  *
   13165  * DESCRIPTION: set sensor supported size and change scale status.
   13166  *
   13167  * PARAMETERS :
   13168  *   @width    : input picture width
   13169  *   @height   : input picture height
   13170  *
   13171  * RETURN     : int32_t type of status
   13172  *              NO_ERROR  -- success
   13173  *              none-zero failure code
   13174  *==========================================================================*/
   13175 int32_t QCameraParameters::QCameraReprocScaleParam::setValidatePicSize(int &width,int &height)
   13176 {
   13177     if(!mScaleEnabled)
   13178         return BAD_VALUE;
   13179 
   13180     mIsUnderScaling = FALSE; //default: not under scale
   13181 
   13182     if(isScalePicSize(width, height)){
   13183         // input picture size need scaling operation. Record size from APK and setted
   13184         mIsUnderScaling = TRUE;
   13185         mPicSizeFromAPK.width = width;
   13186         mPicSizeFromAPK.height = height;
   13187 
   13188         if(setSensorSupportedPicSize() != NO_ERROR)
   13189             return BAD_VALUE;
   13190 
   13191         //re-set picture size to sensor supported size
   13192         width = mPicSizeSetted.width;
   13193         height = mPicSizeSetted.height;
   13194         LOGH("mPicSizeFromAPK- with=%d, height=%d, mPicSizeSetted- with =%d, height=%d.",
   13195              mPicSizeFromAPK.width, mPicSizeFromAPK.height, mPicSizeSetted.width, mPicSizeSetted.height);
   13196     }else{
   13197         mIsUnderScaling = FALSE;
   13198         //no scale is needed for input picture size
   13199         if(!isValidatePicSize(width, height)){
   13200             LOGE("invalidate input picture size.");
   13201             return BAD_VALUE;
   13202         }
   13203         mPicSizeSetted.width = width;
   13204         mPicSizeSetted.height = height;
   13205     }
   13206 
   13207     LOGH("X. mIsUnderScaling=%d, width=%d, height=%d.", mIsUnderScaling, width, height);
   13208     return NO_ERROR;
   13209 }
   13210 
   13211 /*===========================================================================
   13212  * FUNCTION   : getPicSizeFromAPK
   13213  *
   13214  * DESCRIPTION: get picture size that get from APK
   13215  *
   13216  * PARAMETERS :
   13217  *   @width     : input width
   13218  *   @height    : input height
   13219  *
   13220  * RETURN     : int32_t type of status
   13221  *              NO_ERROR  -- success
   13222  *              none-zero failure code
   13223  *==========================================================================*/
   13224 int32_t QCameraParameters::QCameraReprocScaleParam::getPicSizeFromAPK(int &width, int &height)
   13225 {
   13226     if(!mIsUnderScaling)
   13227         return BAD_VALUE;
   13228 
   13229     width = mPicSizeFromAPK.width;
   13230     height = mPicSizeFromAPK.height;
   13231     return NO_ERROR;
   13232 }
   13233 
   13234 /*===========================================================================
   13235  * FUNCTION   : getPicSizeSetted
   13236  *
   13237  * DESCRIPTION: get picture size that setted into mm-camera
   13238  *
   13239  * PARAMETERS :
   13240  *   @width     : input width
   13241  *   @height    : input height
   13242  *
   13243  * RETURN     : int32_t type of status
   13244  *              NO_ERROR  -- success
   13245  *              none-zero failure code
   13246  *==========================================================================*/
   13247 int32_t QCameraParameters::QCameraReprocScaleParam::getPicSizeSetted(int &width, int &height)
   13248 {
   13249     width = mPicSizeSetted.width;
   13250     height = mPicSizeSetted.height;
   13251     return NO_ERROR;
   13252 }
   13253 
   13254 /*===========================================================================
   13255  * FUNCTION   : isUnderScaling
   13256  *
   13257  * DESCRIPTION: check if we are in Reproc Scaling requirment
   13258  *
   13259  * PARAMETERS :  none
   13260  *
   13261  * RETURN     : bool type of status
   13262  *==========================================================================*/
   13263 bool QCameraParameters::QCameraReprocScaleParam::isUnderScaling()
   13264 {
   13265     return mIsUnderScaling;
   13266 }
   13267 
   13268 /*===========================================================================
   13269  * FUNCTION   : checkScaleSizeTable
   13270  *
   13271  * DESCRIPTION: check PICTURE_SIZE_NEED_SCALE to choose
   13272  *
   13273  * PARAMETERS :
   13274  *   @scale_cnt   : count of picture sizes that want scale
   13275  *   @scale_tbl    : picture size table that want scale
   13276  *   @org_cnt     : sensor supported picture size count
   13277  *   @org_tbl      : sensor supported picture size table
   13278  *
   13279  * RETURN     : bool type of status
   13280  *==========================================================================*/
   13281 size_t QCameraParameters::QCameraReprocScaleParam::checkScaleSizeTable(size_t scale_cnt,
   13282         cam_dimension_t *scale_tbl, size_t org_cnt, cam_dimension_t *org_tbl)
   13283 {
   13284     size_t stbl_cnt = 0;
   13285     size_t temp_cnt = 0;
   13286     ssize_t i = 0;
   13287     if(scale_cnt <=0 || scale_tbl == NULL || org_tbl == NULL || org_cnt <= 0)
   13288         return stbl_cnt;
   13289 
   13290     //get validate scale size table. Currently we only support:
   13291     // 1. upscale. The scale size must larger than max sensor supported size
   13292     // 2. Scale dimension ratio must be same as the max sensor supported size.
   13293     temp_cnt = scale_cnt;
   13294     for (i = (ssize_t)(scale_cnt - 1); i >= 0; i--) {
   13295         if (scale_tbl[i].width > org_tbl[0].width ||
   13296                 (scale_tbl[i].width == org_tbl[0].width &&
   13297                     scale_tbl[i].height > org_tbl[0].height)) {
   13298             //get the smallest scale size
   13299             break;
   13300         }
   13301         temp_cnt--;
   13302     }
   13303 
   13304     //check dimension ratio
   13305     double supported_ratio = (double)org_tbl[0].width / (double)org_tbl[0].height;
   13306     for (i = 0; i < (ssize_t)temp_cnt; i++) {
   13307         double cur_ratio = (double)scale_tbl[i].width / (double)scale_tbl[i].height;
   13308         if (fabs(supported_ratio - cur_ratio) > ASPECT_TOLERANCE) {
   13309             continue;
   13310         }
   13311         mNeedScaledSizeTbl[stbl_cnt].width = scale_tbl[i].width;
   13312         mNeedScaledSizeTbl[stbl_cnt].height= scale_tbl[i].height;
   13313         stbl_cnt++;
   13314     }
   13315 
   13316     return stbl_cnt;
   13317 }
   13318 
   13319 /*===========================================================================
   13320  * FUNCTION   : getTotalSizeTblCnt
   13321  *
   13322  * DESCRIPTION: get total picture size count after adding dimensions that need scaling
   13323  *
   13324  * PARAMETERS : none
   13325  *
   13326  * RETURN     : uint8_t type of picture size count
   13327  *==========================================================================*/
   13328 size_t QCameraParameters::QCameraReprocScaleParam::getTotalSizeTblCnt()
   13329 {
   13330     return mTotalSizeTblCnt;
   13331 }
   13332 
   13333 /*===========================================================================
   13334  * FUNCTION   : getTotalSizeTbl
   13335  *
   13336  * DESCRIPTION: get picture size table after adding dimensions that need scaling
   13337  *
   13338  * PARAMETERS :  none
   13339  *
   13340  * RETURN     : cam_dimension_t list of picture size table
   13341  *==========================================================================*/
   13342 cam_dimension_t *QCameraParameters::QCameraReprocScaleParam::getTotalSizeTbl()
   13343 {
   13344     if(!mScaleEnabled)
   13345         return NULL;
   13346 
   13347     return mTotalSizeTbl;
   13348 }
   13349 
   13350 /*===========================================================================
   13351  * FUNCTION   : setEztune
   13352  *
   13353  * DESCRIPTION: Enable/Disable EZtune
   13354  *
   13355  *==========================================================================*/
   13356 int32_t QCameraParameters::setEztune()
   13357 {
   13358     char prop[PROPERTY_VALUE_MAX];
   13359     memset(prop, 0, sizeof(prop));
   13360     property_get("persist.camera.eztune.enable", prop, "0");
   13361     m_bEztuneEnabled = atoi(prop);
   13362     return NO_ERROR;
   13363 }
   13364 
   13365 /*===========================================================================
   13366  * FUNCTION   : isHDREnabled
   13367  *
   13368  * DESCRIPTION: if HDR is enabled
   13369  *
   13370  * PARAMETERS : none
   13371  *
   13372  * RETURN     : true: needed
   13373  *              false: no need
   13374  *==========================================================================*/
   13375 bool QCameraParameters::isHDREnabled()
   13376 {
   13377     return ((m_bHDREnabled || m_HDRSceneEnabled));
   13378 }
   13379 
   13380 /*===========================================================================
   13381  * FUNCTION   : isAVTimerEnabled
   13382  *
   13383  * DESCRIPTION: if AVTimer is enabled
   13384  *
   13385  * PARAMETERS : none
   13386  *
   13387  * RETURN     : true: needed
   13388  *              false: no need
   13389  *==========================================================================*/
   13390 bool QCameraParameters::isAVTimerEnabled()
   13391 {
   13392     return m_bAVTimerEnabled;
   13393 }
   13394 
   13395 /*===========================================================================
   13396 * FUNCTION   : isDISEnabled
   13397 *
   13398 * DESCRIPTION: if DIS is enabled
   13399 *
   13400 * PARAMETERS : none
   13401 *
   13402 * RETURN    : true: needed
   13403 *               false: no need
   13404 *==========================================================================*/
   13405 bool QCameraParameters::isDISEnabled()
   13406 {
   13407     return m_bDISEnabled;
   13408 }
   13409 
   13410 /*===========================================================================
   13411 * FUNCTION   : setISType
   13412 *
   13413 * DESCRIPTION: Set both Preview & Video IS type by reading the correspoding setprop's
   13414 *
   13415 * PARAMETERS : none
   13416 *
   13417 * RETURN     : IS type
   13418 *
   13419 *==========================================================================*/
   13420 int32_t QCameraParameters::setISType()
   13421 {
   13422     bool eisSupported = false, eis3Supported = false;
   13423     for (size_t i = 0; i < m_pCapability->supported_is_types_cnt; i++) {
   13424         if ((m_pCapability->supported_is_types[i] == IS_TYPE_EIS_2_0) ||
   13425                 (m_pCapability->supported_is_types[i] == IS_TYPE_EIS_3_0)) {
   13426             eisSupported = true;
   13427         }
   13428         if (m_pCapability->supported_is_types[i] == IS_TYPE_EIS_3_0) {
   13429             eis3Supported = TRUE;
   13430         }
   13431     }
   13432     if (m_bDISEnabled && eisSupported) {
   13433         char value[PROPERTY_VALUE_MAX];
   13434         // Make default value for Video IS_TYPE as IS_TYPE_EIS_2_0
   13435         property_get("persist.camera.is_type", value, "4");
   13436         mIsTypeVideo = static_cast<cam_is_type_t>(atoi(value));
   13437         if ( (mIsTypeVideo == IS_TYPE_EIS_3_0) && (eis3Supported == FALSE) ) {
   13438             LOGW("EIS_3.0 is not supported and so setting EIS_2.0");
   13439             mIsTypeVideo = IS_TYPE_EIS_2_0;
   13440         }
   13441         // Make default value for preview IS_TYPE as IS_TYPE_EIS_2_0
   13442         property_get("persist.camera.is_type_preview", value, "4");
   13443         mIsTypePreview = static_cast<cam_is_type_t>(atoi(value));
   13444     } else if (m_bDISEnabled) {
   13445         char value[PROPERTY_VALUE_MAX];
   13446         // Make default value for Video IS_TYPE as IS_TYPE_DIS
   13447         property_get("persist.camera.is_type", value, "2");
   13448         mIsTypeVideo = static_cast<cam_is_type_t>(atoi(value));
   13449         if (mIsTypeVideo >= IS_TYPE_DIS) {
   13450             LOGW("EIS is not supported and so setting DIS");
   13451             mIsTypeVideo = IS_TYPE_DIS;
   13452         }
   13453         // Make default value for preview IS_TYPE as IS_TYPE_DIS
   13454         property_get("persist.camera.is_type_preview", value, "2");
   13455         mIsTypePreview = static_cast<cam_is_type_t>(atoi(value));
   13456         if (mIsTypePreview >= IS_TYPE_DIS) {
   13457             LOGW("EIS is not supported and so setting DIS");
   13458             mIsTypePreview = IS_TYPE_DIS;
   13459         }
   13460     } else {
   13461         mIsTypeVideo = IS_TYPE_NONE;
   13462         mIsTypePreview = IS_TYPE_NONE;
   13463     }
   13464     return NO_ERROR;
   13465 }
   13466 /*===========================================================================
   13467 * FUNCTION   : setSmallJpegSize
   13468 *
   13469 * DESCRIPTION: Picture ratio greater than VFE down scale factor
   13470 *              set SmallJpegSize flag
   13471 *
   13472 * PARAMETERS :
   13473 *  @cam_dimension_t: sensor dimension
   13474 *                    Snapshot sream dimension
   13475 *
   13476 * RETURN     : None
   13477 *==========================================================================*/
   13478 void QCameraParameters::setSmallJpegSize(cam_dimension_t sensor_dim, cam_dimension_t snap_dim)
   13479 {
   13480     uint32_t width_ratio;
   13481     uint32_t height_ratio;
   13482 
   13483     //Picture ratio is greater than max downscale factor set small jpeg flag
   13484     width_ratio = CEIL_DIVISION(sensor_dim.width,snap_dim.width);
   13485     height_ratio = CEIL_DIVISION(sensor_dim.height,snap_dim.height);
   13486     FATAL_IF(m_pCapability->max_downscale_factor == 0,
   13487             "FATAL: max_downscale_factor cannot be zero and so assert");
   13488     if ( (width_ratio > m_pCapability->max_downscale_factor) ||
   13489           (height_ratio > m_pCapability->max_downscale_factor)) {
   13490           LOGH("Setting small jpeg size flag to true");
   13491           m_bSmallJpegSize = true;
   13492     } else {
   13493           m_bSmallJpegSize = false;
   13494     }
   13495 }
   13496 
   13497 /*===========================================================================
   13498 * FUNCTION   : updateSnapshotPpMask
   13499 *
   13500 * DESCRIPTION: Update PP mask for sanpshot stream
   13501 *
   13502 * PARAMETERS :
   13503 *  @stream_config_info: Stream config information
   13504 *
   13505 * RETURN     : int32_t type of status
   13506 *              NO_ERROR  -- success
   13507 *              none-zero failure code
   13508 *==========================================================================*/
   13509 int32_t QCameraParameters::updateSnapshotPpMask(cam_stream_size_info_t &stream_config_info)
   13510 
   13511 {
   13512     int32_t rc = NO_ERROR;
   13513     cam_dimension_t sensor_dim, snap_dim;
   13514     cam_dimension_t max_dim = {0,0};
   13515 
   13516     // Find the Maximum dimension among all the streams
   13517     for (uint32_t j = 0; j < stream_config_info.num_streams; j++) {
   13518          if (stream_config_info.stream_sizes[j].width > max_dim.width) {
   13519                max_dim.width = stream_config_info.stream_sizes[j].width;
   13520          }
   13521          if (stream_config_info.stream_sizes[j].height > max_dim.height) {
   13522                max_dim.height = stream_config_info.stream_sizes[j].height;
   13523          }
   13524     }
   13525     LOGH("Max Dimension = %d X %d", max_dim.width, max_dim.height);
   13526     getSensorOutputSize(max_dim,sensor_dim);
   13527     getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT, snap_dim);
   13528     setSmallJpegSize(sensor_dim,snap_dim);
   13529 
   13530     //Picture ratio is greater than VFE downscale factor.So, link CPP
   13531     if ( isSmallJpegSizeEnabled() ) {
   13532          for (uint32_t k = 0; k < stream_config_info.num_streams; k++) {
   13533               if( stream_config_info.type[k] == CAM_STREAM_TYPE_SNAPSHOT) {
   13534                   updatePpFeatureMask(CAM_STREAM_TYPE_SNAPSHOT);
   13535                   stream_config_info.postprocess_mask[k] =
   13536                       mStreamPpMask[CAM_STREAM_TYPE_SNAPSHOT];
   13537                   LOGI("STREAM INFO : type %d, wxh: %d x %d, pp_mask: 0x%llx \
   13538                         Format = %d, dt =%d cid =%d subformat =%d, is_type %d",
   13539                         stream_config_info.type[k],
   13540                         stream_config_info.stream_sizes[k].width,
   13541                         stream_config_info.stream_sizes[k].height,
   13542                         stream_config_info.postprocess_mask[k],
   13543                         stream_config_info.format[k],
   13544                         stream_config_info.dt[k],
   13545                         stream_config_info.vc[k],
   13546                         stream_config_info.sub_format_type[k],
   13547                         stream_config_info.is_type[k]);
   13548                   rc = sendStreamConfigInfo(stream_config_info);
   13549               }
   13550          }
   13551     }
   13552 
   13553     return rc;
   13554 }
   13555 
   13556 /*===========================================================================
   13557 * FUNCTION   : getISType
   13558 *
   13559 * DESCRIPTION: returns IS type
   13560 *
   13561 * PARAMETERS : none
   13562 *
   13563 * RETURN     : IS type
   13564 *
   13565 *==========================================================================*/
   13566 cam_is_type_t QCameraParameters::getVideoISType()
   13567 {
   13568     return mIsTypeVideo;
   13569 }
   13570 
   13571 /*===========================================================================
   13572 * FUNCTION   : getPreviewISType
   13573 *
   13574 * DESCRIPTION: returns IS type for preview
   13575 *
   13576 * PARAMETERS : none
   13577 *
   13578 * RETURN     : IS type
   13579 *
   13580 *==========================================================================*/
   13581 cam_is_type_t QCameraParameters::getPreviewISType()
   13582 {
   13583     return mIsTypePreview;
   13584 }
   13585 
   13586 /*===========================================================================
   13587  * FUNCTION   : MobicatMask
   13588  *
   13589  * DESCRIPTION: returns mobicat mask
   13590  *
   13591  * PARAMETERS : none
   13592  *
   13593  * RETURN     : mobicat mask
   13594  *
   13595  *==========================================================================*/
   13596 uint8_t QCameraParameters::getMobicatMask()
   13597 {
   13598     return m_MobiMask;
   13599 }
   13600 
   13601 /*===========================================================================
   13602  * FUNCTION   : sendStreamConfigInfo
   13603  *
   13604  * DESCRIPTION: send Stream config info.
   13605  *
   13606  * PARAMETERS :
   13607  *   @stream_config_info: Stream config information
   13608  *
   13609  * RETURN     : int32_t type of status
   13610  *              NO_ERROR  -- success
   13611  *              none-zero failure code
   13612  *==========================================================================*/
   13613 bool QCameraParameters::sendStreamConfigInfo(cam_stream_size_info_t &stream_config_info) {
   13614     int32_t rc = NO_ERROR;
   13615     cam_dimension_t sensor_dim_main = {0,0};
   13616     cam_dimension_t sensor_dim_aux  = {0,0};
   13617 
   13618     if (isDualCamera()) {
   13619         // Get the sensor output dimensions for main and aux cameras.
   13620         cam_dimension_t max_dim = {0,0};
   13621         for (uint32_t i = 0; i < stream_config_info.num_streams; i++) {
   13622             // Find the max dimension among all the streams
   13623             if (stream_config_info.stream_sizes[i].width > max_dim.width) {
   13624                max_dim.width = stream_config_info.stream_sizes[i].width;
   13625             }
   13626             if (stream_config_info.stream_sizes[i].height > max_dim.height) {
   13627                max_dim.height = stream_config_info.stream_sizes[i].height;
   13628             }
   13629         }
   13630         getSensorOutputSize(max_dim, sensor_dim_main, MM_CAMERA_TYPE_MAIN);
   13631         getSensorOutputSize(max_dim, sensor_dim_aux,  MM_CAMERA_TYPE_AUX);
   13632     }
   13633 
   13634     if(initBatchUpdate() < 0 ) {
   13635         LOGE("Failed to initialize group update table");
   13636         return BAD_TYPE;
   13637     }
   13638 
   13639     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   13640             CAM_INTF_META_STREAM_INFO, stream_config_info)) {
   13641         LOGE("Failed to update table");
   13642         return BAD_VALUE;
   13643     }
   13644 
   13645     rc = commitSetBatch();
   13646     if (rc != NO_ERROR) {
   13647         LOGE("Failed to set stream info parm");
   13648         return rc;
   13649     }
   13650 
   13651     if (isDualCamera()) {
   13652 #if 0 // Update to 07.01.01.253.071
   13653         if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   13654                 CAM_INTF_PARM_RAW_DIMENSION, sensor_dim_main) ||
   13655                 ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBufAux,
   13656                     CAM_INTF_PARM_RAW_DIMENSION, sensor_dim_aux)) {
   13657             LOGE("Failed to update table for CAM_INTF_PARM_RAW_DIMENSION");
   13658             return BAD_VALUE;
   13659         }
   13660 #endif // Update to 07.01.01.253.071
   13661 
   13662         // Update FOV-control config settings due to the change in the configuration
   13663         rc = m_pFovControl->updateConfigSettings(m_pParamBuf, m_pParamBufAux);
   13664 
   13665         if (rc != NO_ERROR) {
   13666             LOGE("Failed to update FOV-control config settings");
   13667             return rc;
   13668         }
   13669     }
   13670 
   13671     return rc;
   13672 }
   13673 
   13674 /*===========================================================================
   13675  * FUNCTION   : setStreamConfigure
   13676  *
   13677  * DESCRIPTION: set stream type, stream dimension for all configured streams.
   13678  *
   13679  * PARAMETERS :
   13680  *   @isCapture: Whether this configureation is for an image capture
   13681  *   @previewAsPostview: Use preview as postview
   13682  *
   13683  * RETURN     : int32_t type of status
   13684  *              NO_ERROR  -- success
   13685  *              none-zero failure code
   13686  *==========================================================================*/
   13687 bool QCameraParameters::setStreamConfigure(bool isCapture,
   13688         bool previewAsPostview, bool resetConfig) {
   13689 
   13690     int32_t rc = NO_ERROR;
   13691     cam_stream_size_info_t stream_config_info;
   13692     char value[PROPERTY_VALUE_MAX];
   13693     bool raw_yuv = false;
   13694     bool raw_capture = false;
   13695 
   13696     if ( m_pParamBuf == NULL ) {
   13697         return NO_INIT;
   13698     }
   13699 
   13700     memset(&stream_config_info, 0, sizeof(stream_config_info));
   13701     stream_config_info.num_streams = 0;
   13702 
   13703     if (resetConfig) {
   13704         LOGH("Reset stream config!!");
   13705         rc = sendStreamConfigInfo(stream_config_info);
   13706         LOGH("Done Resetting stream config!!");
   13707         return rc;
   13708     }
   13709 
   13710     stream_config_info.hfr_mode       = static_cast<cam_hfr_mode_t>(mHfrMode);
   13711     stream_config_info.buf_alignment  = m_pCapability->buf_alignment;
   13712     stream_config_info.min_stride     = m_pCapability->min_stride;
   13713     stream_config_info.min_scanline   = m_pCapability->min_scanline;
   13714     stream_config_info.batch_size = getBufBatchCount();
   13715     m_bSmallJpegSize = false;
   13716 
   13717     stream_config_info.is_secure = isSecureMode() ? 1 : 0;
   13718 
   13719     LOGH("buf_alignment=%d stride X scan=%dx%d batch size = %d\n",
   13720             m_pCapability->buf_alignment,
   13721             m_pCapability->min_stride,
   13722             m_pCapability->min_scanline,
   13723             stream_config_info.batch_size);
   13724 
   13725     property_get("persist.camera.raw_yuv", value, "0");
   13726     raw_yuv = atoi(value) > 0 ? true : false;
   13727 
   13728     if (isZSLMode() && getRecordingHintValue() != true) {
   13729         stream_config_info.type[stream_config_info.num_streams] =
   13730             CAM_STREAM_TYPE_PREVIEW;
   13731         getStreamDimension(CAM_STREAM_TYPE_PREVIEW,
   13732                 stream_config_info.stream_sizes[stream_config_info.num_streams]);
   13733         updatePpFeatureMask(CAM_STREAM_TYPE_PREVIEW);
   13734         stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   13735                 mStreamPpMask[CAM_STREAM_TYPE_PREVIEW];
   13736         getStreamFormat(CAM_STREAM_TYPE_PREVIEW,
   13737                 stream_config_info.format[stream_config_info.num_streams]);
   13738         stream_config_info.rotation[stream_config_info.num_streams] =
   13739                 getStreamRotation(CAM_STREAM_TYPE_PREVIEW);
   13740         stream_config_info.num_streams++;
   13741 
   13742         stream_config_info.type[stream_config_info.num_streams] =
   13743                 CAM_STREAM_TYPE_ANALYSIS;
   13744         updatePpFeatureMask(CAM_STREAM_TYPE_ANALYSIS);
   13745         getStreamDimension(CAM_STREAM_TYPE_ANALYSIS,
   13746                 stream_config_info.stream_sizes[stream_config_info.num_streams]);
   13747         stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   13748                 mStreamPpMask[CAM_STREAM_TYPE_ANALYSIS];
   13749         getStreamFormat(CAM_STREAM_TYPE_ANALYSIS,
   13750                 stream_config_info.format[stream_config_info.num_streams]);
   13751         stream_config_info.rotation[stream_config_info.num_streams] =
   13752                 getStreamRotation(CAM_STREAM_TYPE_ANALYSIS);
   13753         stream_config_info.num_streams++;
   13754 
   13755         stream_config_info.type[stream_config_info.num_streams] =
   13756                 CAM_STREAM_TYPE_SNAPSHOT;
   13757         getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,
   13758                 stream_config_info.stream_sizes[stream_config_info.num_streams]);
   13759         updatePpFeatureMask(CAM_STREAM_TYPE_SNAPSHOT);
   13760         stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   13761                 mStreamPpMask[CAM_STREAM_TYPE_SNAPSHOT];
   13762         getStreamFormat(CAM_STREAM_TYPE_SNAPSHOT,
   13763                 stream_config_info.format[stream_config_info.num_streams]);
   13764         stream_config_info.rotation[stream_config_info.num_streams] =
   13765                 getStreamRotation(CAM_STREAM_TYPE_SNAPSHOT);
   13766         stream_config_info.num_streams++;
   13767 
   13768         if (isUBWCEnabled() && getRecordingHintValue() != true) {
   13769             cam_format_t fmt;
   13770             getStreamFormat(CAM_STREAM_TYPE_PREVIEW,fmt);
   13771             if (fmt == CAM_FORMAT_YUV_420_NV12_UBWC) {
   13772                 stream_config_info.type[stream_config_info.num_streams] =
   13773                         CAM_STREAM_TYPE_CALLBACK;
   13774                 getStreamDimension(CAM_STREAM_TYPE_CALLBACK,
   13775                         stream_config_info.stream_sizes[stream_config_info.num_streams]);
   13776                 updatePpFeatureMask(CAM_STREAM_TYPE_CALLBACK);
   13777                 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   13778                         mStreamPpMask[CAM_STREAM_TYPE_CALLBACK];
   13779                 getStreamFormat(CAM_STREAM_TYPE_CALLBACK,
   13780                         stream_config_info.format[stream_config_info.num_streams]);
   13781                 stream_config_info.rotation[stream_config_info.num_streams] =
   13782                         getStreamRotation(CAM_STREAM_TYPE_CALLBACK);
   13783                 stream_config_info.num_streams++;
   13784             }
   13785         }
   13786     }  else if(isSecureMode()) {
   13787         if (mSecureStraemType == CAM_STREAM_TYPE_RAW) {
   13788             raw_capture = true;
   13789             cam_dimension_t max_dim = {0,0};
   13790             updateRAW(max_dim);
   13791             stream_config_info.type[stream_config_info.num_streams] =
   13792                     CAM_STREAM_TYPE_RAW;
   13793             getStreamDimension(CAM_STREAM_TYPE_RAW,
   13794                     stream_config_info.stream_sizes[stream_config_info.num_streams]);
   13795             updatePpFeatureMask(CAM_STREAM_TYPE_RAW);
   13796             stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   13797                     mStreamPpMask[CAM_STREAM_TYPE_RAW];
   13798             getStreamFormat(CAM_STREAM_TYPE_RAW,
   13799                     stream_config_info.format[stream_config_info.num_streams]);
   13800         }else {
   13801             stream_config_info.type[stream_config_info.num_streams] =
   13802                     CAM_STREAM_TYPE_PREVIEW;
   13803             getStreamDimension(CAM_STREAM_TYPE_PREVIEW,
   13804                     stream_config_info.stream_sizes[stream_config_info.num_streams]);
   13805             setStreamPpMask(CAM_STREAM_TYPE_PREVIEW, CAM_QCOM_FEATURE_NONE);
   13806             stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   13807                     mStreamPpMask[CAM_STREAM_TYPE_PREVIEW];
   13808             getStreamFormat(CAM_STREAM_TYPE_PREVIEW,
   13809                     stream_config_info.format[stream_config_info.num_streams]);
   13810             stream_config_info.is_type[stream_config_info.num_streams] = mIsTypePreview;
   13811         }
   13812         stream_config_info.num_streams++;
   13813     } else if (!isCapture) {
   13814         if (m_bRecordingHint) {
   13815             setISType();
   13816             mIsTypeVideo = getVideoISType();
   13817             mIsTypePreview = getPreviewISType();
   13818             stream_config_info.is_type[stream_config_info.num_streams] = IS_TYPE_NONE;
   13819             stream_config_info.type[stream_config_info.num_streams] =
   13820                     CAM_STREAM_TYPE_SNAPSHOT;
   13821             getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,
   13822                     stream_config_info.stream_sizes[stream_config_info.num_streams]);
   13823             updatePpFeatureMask(CAM_STREAM_TYPE_SNAPSHOT);
   13824             stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   13825                     mStreamPpMask[CAM_STREAM_TYPE_SNAPSHOT];
   13826             getStreamFormat(CAM_STREAM_TYPE_SNAPSHOT,
   13827                         stream_config_info.format[stream_config_info.num_streams]);
   13828             stream_config_info.rotation[stream_config_info.num_streams] =
   13829                         getStreamRotation(CAM_STREAM_TYPE_SNAPSHOT);
   13830             stream_config_info.num_streams++;
   13831 
   13832             stream_config_info.is_type[stream_config_info.num_streams] = mIsTypeVideo;
   13833             stream_config_info.type[stream_config_info.num_streams] =
   13834                     CAM_STREAM_TYPE_VIDEO;
   13835             getStreamDimension(CAM_STREAM_TYPE_VIDEO,
   13836                     stream_config_info.stream_sizes[stream_config_info.num_streams]);
   13837             updatePpFeatureMask(CAM_STREAM_TYPE_VIDEO);
   13838             stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   13839                     mStreamPpMask[CAM_STREAM_TYPE_VIDEO];
   13840             getStreamFormat(CAM_STREAM_TYPE_VIDEO,
   13841                     stream_config_info.format[stream_config_info.num_streams]);
   13842             stream_config_info.rotation[stream_config_info.num_streams] =
   13843                         getStreamRotation(CAM_STREAM_TYPE_VIDEO);
   13844             stream_config_info.num_streams++;
   13845         }
   13846 
   13847         /* Analysis stream is needed by DCRF regardless of recording hint */
   13848         if ((getDcrf() == true) ||
   13849                 (getRecordingHintValue() != true) ||
   13850                 (fdModeInVideo())) {
   13851             stream_config_info.type[stream_config_info.num_streams] =
   13852                     CAM_STREAM_TYPE_ANALYSIS;
   13853             updatePpFeatureMask(CAM_STREAM_TYPE_ANALYSIS);
   13854             getStreamDimension(CAM_STREAM_TYPE_ANALYSIS,
   13855                     stream_config_info.stream_sizes[stream_config_info.num_streams]);
   13856             stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   13857                     mStreamPpMask[CAM_STREAM_TYPE_ANALYSIS];
   13858             getStreamFormat(CAM_STREAM_TYPE_ANALYSIS,
   13859                     stream_config_info.format[stream_config_info.num_streams]);
   13860             stream_config_info.rotation[stream_config_info.num_streams] =
   13861                     getStreamRotation(CAM_STREAM_TYPE_ANALYSIS);
   13862             stream_config_info.num_streams++;
   13863         }
   13864 
   13865         stream_config_info.type[stream_config_info.num_streams] =
   13866                 CAM_STREAM_TYPE_PREVIEW;
   13867         getStreamDimension(CAM_STREAM_TYPE_PREVIEW,
   13868                 stream_config_info.stream_sizes[stream_config_info.num_streams]);
   13869         updatePpFeatureMask(CAM_STREAM_TYPE_PREVIEW);
   13870         stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   13871                 mStreamPpMask[CAM_STREAM_TYPE_PREVIEW];
   13872         getStreamFormat(CAM_STREAM_TYPE_PREVIEW,
   13873                     stream_config_info.format[stream_config_info.num_streams]);
   13874         stream_config_info.is_type[stream_config_info.num_streams] = mIsTypePreview;
   13875         stream_config_info.rotation[stream_config_info.num_streams] =
   13876                 getStreamRotation(CAM_STREAM_TYPE_PREVIEW);
   13877         stream_config_info.num_streams++;
   13878 
   13879         if (isUBWCEnabled() && getRecordingHintValue() != true) {
   13880             cam_format_t fmt;
   13881             getStreamFormat(CAM_STREAM_TYPE_PREVIEW,fmt);
   13882             if (fmt == CAM_FORMAT_YUV_420_NV12_UBWC) {
   13883                 stream_config_info.type[stream_config_info.num_streams] =
   13884                         CAM_STREAM_TYPE_CALLBACK;
   13885                 getStreamDimension(CAM_STREAM_TYPE_CALLBACK,
   13886                         stream_config_info.stream_sizes[stream_config_info.num_streams]);
   13887                 updatePpFeatureMask(CAM_STREAM_TYPE_CALLBACK);
   13888                 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   13889                         mStreamPpMask[CAM_STREAM_TYPE_CALLBACK];
   13890                 getStreamFormat(CAM_STREAM_TYPE_CALLBACK,
   13891                         stream_config_info.format[stream_config_info.num_streams]);
   13892                 stream_config_info.is_type[stream_config_info.num_streams] = IS_TYPE_NONE;
   13893                 stream_config_info.rotation[stream_config_info.num_streams] =
   13894                         getStreamRotation(CAM_STREAM_TYPE_CALLBACK);
   13895                 stream_config_info.num_streams++;
   13896             }
   13897         }
   13898 
   13899     } else {
   13900         if (isJpegPictureFormat() || isNV16PictureFormat() || isNV21PictureFormat()) {
   13901             if (!getofflineRAW()) {
   13902                 stream_config_info.type[stream_config_info.num_streams] =
   13903                         CAM_STREAM_TYPE_SNAPSHOT;
   13904                 getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,
   13905                         stream_config_info.stream_sizes[stream_config_info.num_streams]);
   13906                 updatePpFeatureMask(CAM_STREAM_TYPE_SNAPSHOT);
   13907                 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   13908                         mStreamPpMask[CAM_STREAM_TYPE_SNAPSHOT];
   13909                 getStreamFormat(CAM_STREAM_TYPE_SNAPSHOT,
   13910                         stream_config_info.format[stream_config_info.num_streams]);
   13911                 stream_config_info.is_type[stream_config_info.num_streams] = IS_TYPE_NONE;
   13912                 stream_config_info.rotation[stream_config_info.num_streams] =
   13913                         getStreamRotation(CAM_STREAM_TYPE_SNAPSHOT);
   13914                 stream_config_info.num_streams++;
   13915             }
   13916 
   13917             if (previewAsPostview) {
   13918                 stream_config_info.type[stream_config_info.num_streams] =
   13919                         CAM_STREAM_TYPE_PREVIEW;
   13920                 getStreamDimension(CAM_STREAM_TYPE_PREVIEW,
   13921                         stream_config_info.stream_sizes[stream_config_info.num_streams]);
   13922                 updatePpFeatureMask(CAM_STREAM_TYPE_PREVIEW);
   13923                 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   13924                         mStreamPpMask[CAM_STREAM_TYPE_PREVIEW];
   13925                 getStreamFormat(CAM_STREAM_TYPE_PREVIEW,
   13926                         stream_config_info.format[stream_config_info.num_streams]);
   13927                 stream_config_info.is_type[stream_config_info.num_streams] = IS_TYPE_NONE;
   13928                 stream_config_info.rotation[stream_config_info.num_streams] =
   13929                         getStreamRotation(CAM_STREAM_TYPE_PREVIEW);
   13930                 stream_config_info.num_streams++;
   13931             } else if(!getQuadraCfa()) {
   13932                 stream_config_info.type[stream_config_info.num_streams] =
   13933                         CAM_STREAM_TYPE_POSTVIEW;
   13934                 getStreamDimension(CAM_STREAM_TYPE_POSTVIEW,
   13935                         stream_config_info.stream_sizes[stream_config_info.num_streams]);
   13936                 updatePpFeatureMask(CAM_STREAM_TYPE_POSTVIEW);
   13937                 stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   13938                         mStreamPpMask[CAM_STREAM_TYPE_POSTVIEW];
   13939                 getStreamFormat(CAM_STREAM_TYPE_POSTVIEW,
   13940                         stream_config_info.format[stream_config_info.num_streams]);
   13941                 stream_config_info.is_type[stream_config_info.num_streams] = IS_TYPE_NONE;
   13942                 stream_config_info.rotation[stream_config_info.num_streams] =
   13943                         getStreamRotation(CAM_STREAM_TYPE_POSTVIEW);
   13944                 stream_config_info.num_streams++;
   13945             }
   13946         } else {
   13947             raw_capture = true;
   13948             stream_config_info.type[stream_config_info.num_streams] =
   13949                     CAM_STREAM_TYPE_RAW;
   13950             getStreamDimension(CAM_STREAM_TYPE_RAW,
   13951                     stream_config_info.stream_sizes[stream_config_info.num_streams]);
   13952             updatePpFeatureMask(CAM_STREAM_TYPE_RAW);
   13953             stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   13954                     mStreamPpMask[CAM_STREAM_TYPE_RAW];
   13955             getStreamFormat(CAM_STREAM_TYPE_RAW,
   13956                     stream_config_info.format[stream_config_info.num_streams]);
   13957             stream_config_info.is_type[stream_config_info.num_streams] = IS_TYPE_NONE;
   13958             stream_config_info.rotation[stream_config_info.num_streams] =
   13959                         getStreamRotation(CAM_STREAM_TYPE_RAW);
   13960             stream_config_info.num_streams++;
   13961         }
   13962     }
   13963 
   13964     if ((!raw_capture) && ((getofflineRAW() && !getRecordingHintValue())
   13965             || (raw_yuv))) {
   13966         cam_dimension_t max_dim = {0,0};
   13967 
   13968         if (!getQuadraCfa()) {
   13969             // Find the Maximum dimension admong all the streams
   13970             for (uint32_t j = 0; j < stream_config_info.num_streams; j++) {
   13971                 if (stream_config_info.stream_sizes[j].width > max_dim.width) {
   13972                     max_dim.width = stream_config_info.stream_sizes[j].width;
   13973                 }
   13974                 if (stream_config_info.stream_sizes[j].height > max_dim.height) {
   13975                     max_dim.height = stream_config_info.stream_sizes[j].height;
   13976                 }
   13977             }
   13978         } else {
   13979             max_dim.width = m_pCapability->quadra_cfa_dim[0].width;
   13980             max_dim.height = m_pCapability->quadra_cfa_dim[0].height;
   13981         }
   13982         LOGH("Max Dimension = %d X %d", max_dim.width, max_dim.height);
   13983         stream_config_info.type[stream_config_info.num_streams] =
   13984             CAM_STREAM_TYPE_RAW;
   13985         getStreamFormat(CAM_STREAM_TYPE_RAW,
   13986                 stream_config_info.format[stream_config_info.num_streams]);
   13987         if (CAM_FORMAT_META_RAW_10BIT ==
   13988             stream_config_info.format[stream_config_info.num_streams]) {
   13989             int32_t dt = 0;
   13990             int32_t vc = 0;
   13991             cam_stream_size_info_t temp_stream_config_info;
   13992             getStreamSubFormat(CAM_STREAM_TYPE_RAW,
   13993                 stream_config_info.sub_format_type[
   13994                 stream_config_info.num_streams]);
   13995             /* Sending separate meta_stream_info so that other modules do
   13996              * not confuse with original sendStreamConfigInfo(). This is only
   13997              * for sensor where sensor can run pick resolusion for meta raw.
   13998              */
   13999             updateDtVc(&dt, &vc);
   14000             stream_config_info.dt[stream_config_info.num_streams] = dt;
   14001             stream_config_info.vc[stream_config_info.num_streams] = vc;
   14002             memcpy(&temp_stream_config_info, &stream_config_info,
   14003                 sizeof(temp_stream_config_info));
   14004             temp_stream_config_info.num_streams++;
   14005             sendStreamConfigForPickRes(temp_stream_config_info);
   14006             getMetaRawInfo();
   14007         } else {
   14008             updateRAW(max_dim);
   14009         }
   14010         getStreamDimension(CAM_STREAM_TYPE_RAW, stream_config_info.stream_sizes[
   14011                 stream_config_info.num_streams]);
   14012         updatePpFeatureMask(CAM_STREAM_TYPE_RAW);
   14013         stream_config_info.postprocess_mask[stream_config_info.num_streams] =
   14014                 mStreamPpMask[CAM_STREAM_TYPE_RAW];
   14015         stream_config_info.num_streams++;
   14016     }
   14017 
   14018     //For dual camera.
   14019     stream_config_info.sync_type = CAM_TYPE_MAIN;
   14020 
   14021     for (uint32_t k = 0; k < stream_config_info.num_streams; k++) {
   14022         LOGI("STREAM INFO : type %d, wxh: %d x %d, pp_mask: 0x%llx \
   14023                 Format = %d, dt =%d cid =%d subformat =%d, is_type %d",
   14024                 stream_config_info.type[k],
   14025                 stream_config_info.stream_sizes[k].width,
   14026                 stream_config_info.stream_sizes[k].height,
   14027                 stream_config_info.postprocess_mask[k],
   14028                 stream_config_info.format[k],
   14029                 stream_config_info.dt[k],
   14030                 stream_config_info.vc[k],
   14031                 stream_config_info.sub_format_type[k],
   14032                 stream_config_info.is_type[k]);
   14033     }
   14034 
   14035     if (rc == NO_ERROR && isDualCamera()) {
   14036         //Trigger dual camera Link command before Meta info
   14037         cam_3a_sync_mode_t sync_3a_mode = CAM_3A_SYNC_FOLLOW;
   14038         char prop[PROPERTY_VALUE_MAX];
   14039         memset(prop, 0, sizeof(prop));
   14040         cam_dual_camera_bundle_info_t bundle_info[MM_CAMERA_MAX_CAM_CNT];
   14041         uint8_t num_cam = 0;
   14042         uint32_t sessionID = 0;
   14043 
   14044         property_get("persist.camera.stats.test.2outs", prop, "0");
   14045         sync_3a_mode = (atoi(prop) > 0) ? CAM_3A_SYNC_ALGO_CTRL : sync_3a_mode;
   14046 
   14047         bundle_info[num_cam].sync_control = CAM_SYNC_RELATED_SENSORS_ON;
   14048         bundle_info[num_cam].type = CAM_TYPE_MAIN;
   14049         bundle_info[num_cam].mode = CAM_MODE_PRIMARY;
   14050         bundle_info[num_cam].cam_role = CAM_ROLE_WIDE;
   14051         bundle_info[num_cam].sync_3a_mode = sync_3a_mode;
   14052         m_pCamOpsTbl->ops->get_session_id(
   14053                 get_aux_camera_handle(m_pCamOpsTbl->camera_handle),
   14054                 &sessionID);
   14055         bundle_info[num_cam].related_sensor_session_id = sessionID;
   14056         bundle_info[num_cam].perf_mode = getLowPowerMode(CAM_TYPE_MAIN);
   14057         bundle_info[num_cam].is_hw_sync_enabled = DUALCAM_HW_SYNC_ENABLED;
   14058         num_cam++;
   14059         bundle_info[num_cam].sync_control = CAM_SYNC_RELATED_SENSORS_ON;
   14060         bundle_info[num_cam].type = CAM_TYPE_AUX;
   14061         bundle_info[num_cam].mode = CAM_MODE_SECONDARY;
   14062         bundle_info[num_cam].cam_role = CAM_ROLE_TELE;
   14063         bundle_info[num_cam].sync_3a_mode = sync_3a_mode;
   14064         m_pCamOpsTbl->ops->get_session_id(
   14065                 get_main_camera_handle(m_pCamOpsTbl->camera_handle),
   14066                 &sessionID);
   14067         bundle_info[num_cam].related_sensor_session_id = sessionID;
   14068         bundle_info[num_cam].perf_mode = getLowPowerMode(CAM_TYPE_AUX);
   14069         bundle_info[num_cam].is_hw_sync_enabled = DUALCAM_HW_SYNC_ENABLED;
   14070         num_cam++;
   14071         rc = sendDualCamCmd(CAM_DUAL_CAMERA_BUNDLE_INFO,
   14072                 num_cam, &bundle_info[0]);
   14073 
   14074         // Send dual cam cmd for master camera info
   14075         setSwitchCamera(mMasterCamera);
   14076     }
   14077 
   14078     rc = sendStreamConfigInfo(stream_config_info);
   14079     updateSnapshotPpMask(stream_config_info);
   14080 
   14081     return rc;
   14082 }
   14083 
   14084 /*===========================================================================
   14085  * FUNCTION   : addOnlineRotation
   14086  *
   14087  * DESCRIPTION: send additional rotation information for specific stream
   14088  *
   14089  * PARAMETERS :
   14090  *   @rotation: rotation
   14091  *   @streamId: internal stream id
   14092  *   @device_rotation: device rotation
   14093  *
   14094  * RETURN     : int32_t type of status
   14095  *              NO_ERROR  -- success
   14096  *              none-zero failure code
   14097  *==========================================================================*/
   14098 int32_t QCameraParameters::addOnlineRotation(uint32_t rotation, uint32_t streamId,
   14099         int32_t device_rotation)
   14100 {
   14101     int32_t rc = NO_ERROR;
   14102     cam_rotation_info_t rotation_info;
   14103     memset(&rotation_info, 0, sizeof(cam_rotation_info_t));
   14104 
   14105     /* Add jpeg rotation information */
   14106     if (rotation == 0) {
   14107         rotation_info.rotation = ROTATE_0;
   14108     } else if (rotation == 90) {
   14109         rotation_info.rotation = ROTATE_90;
   14110     } else if (rotation == 180) {
   14111         rotation_info.rotation = ROTATE_180;
   14112     } else if (rotation == 270) {
   14113         rotation_info.rotation = ROTATE_270;
   14114     } else {
   14115         rotation_info.rotation = ROTATE_0;
   14116     }
   14117     rotation_info.streamId = streamId;
   14118 
   14119     /* Add device rotation information */
   14120     if (device_rotation == 0) {
   14121         rotation_info.device_rotation = ROTATE_0;
   14122     } else if (device_rotation == 90) {
   14123         rotation_info.device_rotation = ROTATE_90;
   14124     } else if (device_rotation == 180) {
   14125         rotation_info.device_rotation = ROTATE_180;
   14126     } else if (device_rotation == 270) {
   14127         rotation_info.device_rotation = ROTATE_270;
   14128     } else {
   14129         rotation_info.device_rotation = ROTATE_0;
   14130     }
   14131 
   14132     if(initBatchUpdate() < 0 ) {
   14133         LOGE("Failed to initialize group update table");
   14134         return BAD_TYPE;
   14135     }
   14136 
   14137     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_ROTATION, rotation_info)) {
   14138         LOGE("Failed to update table");
   14139         return BAD_VALUE;
   14140     }
   14141 
   14142     rc = commitSetBatch();
   14143     if (rc != NO_ERROR) {
   14144         LOGE("Failed to set stream info parm");
   14145         return rc;
   14146     }
   14147 
   14148     return rc;
   14149 }
   14150 
   14151 /*===========================================================================
   14152  * FUNCTION   : needThumbnailReprocess
   14153  *
   14154  * DESCRIPTION: Check if thumbnail reprocessing is needed
   14155  *
   14156  * PARAMETERS : @pFeatureMask - feature mask
   14157  *
   14158  * RETURN     : true: needed
   14159  *              false: no need
   14160  *==========================================================================*/
   14161 bool QCameraParameters::needThumbnailReprocess(cam_feature_mask_t *pFeatureMask)
   14162 {
   14163     if (isUbiFocusEnabled() || isChromaFlashEnabled() ||
   14164             isOptiZoomEnabled() || isUbiRefocus() ||
   14165             isStillMoreEnabled() ||
   14166             (isHDREnabled() && !isHDRThumbnailProcessNeeded())
   14167             || isUBWCEnabled()|| getQuadraCfa() ||
   14168             isDualCamera()) {
   14169         *pFeatureMask &= ~CAM_QCOM_FEATURE_CHROMA_FLASH;
   14170         *pFeatureMask &= ~CAM_QCOM_FEATURE_UBIFOCUS;
   14171         *pFeatureMask &= ~CAM_QCOM_FEATURE_REFOCUS;
   14172         *pFeatureMask &= ~CAM_QCOM_FEATURE_OPTIZOOM;
   14173         *pFeatureMask &= ~CAM_QCOM_FEATURE_STILLMORE;
   14174         *pFeatureMask &= ~CAM_QCOM_FEATURE_HDR;
   14175         return false;
   14176     } else {
   14177         cam_dimension_t thumb_dim;
   14178         getThumbnailSize(&(thumb_dim.width), &(thumb_dim.height));
   14179         if (thumb_dim.width == 0 || thumb_dim.height == 0) {
   14180             return false;
   14181         }
   14182         else {
   14183             return true;
   14184         }
   14185     }
   14186 }
   14187 
   14188 /*===========================================================================
   14189  * FUNCTION   : getNumOfExtraBuffersForImageProc
   14190  *
   14191  * DESCRIPTION: get number of extra input buffers needed by image processing
   14192  *
   14193  * PARAMETERS : none
   14194  *
   14195  * RETURN     : number of extra buffers needed by ImageProc;
   14196  *              0 if not ImageProc enabled
   14197  *==========================================================================*/
   14198 uint8_t QCameraParameters::getNumOfExtraBuffersForImageProc()
   14199 {
   14200     int numOfBufs = 0;
   14201 
   14202     if (isUbiRefocus()) {
   14203         return (uint8_t)(m_pCapability->refocus_af_bracketing_need.burst_count - 1);
   14204     } else if (isUbiFocusEnabled()) {
   14205         numOfBufs += m_pCapability->ubifocus_af_bracketing_need.burst_count - 1;
   14206     } else if (m_bOptiZoomOn) {
   14207         numOfBufs += m_pCapability->opti_zoom_settings_need.burst_count - 1;
   14208     } else if (isChromaFlashEnabled()) {
   14209         numOfBufs += m_pCapability->chroma_flash_settings_need.burst_count - 1;
   14210     } else if (isStillMoreEnabled()) {
   14211         if (isSeeMoreEnabled()) {
   14212             m_stillmore_config.burst_count = 1;
   14213         } else if ((m_stillmore_config.burst_count >=
   14214                 m_pCapability->stillmore_settings_need.min_burst_count) &&
   14215                 (m_stillmore_config.burst_count <=
   14216                 m_pCapability->stillmore_settings_need.max_burst_count)) {
   14217             numOfBufs += m_stillmore_config.burst_count - 1;
   14218         } else {
   14219             numOfBufs += m_pCapability->stillmore_settings_need.burst_count - 1;
   14220         }
   14221     } else if (isOEMFeatEnabled()) {
   14222         numOfBufs += 4;
   14223     }
   14224 
   14225     if (getQuadraCfa()) {
   14226         numOfBufs += 1;
   14227     }
   14228 
   14229     return (uint8_t)(numOfBufs);
   14230 }
   14231 
   14232 /*===========================================================================
   14233  * FUNCTION   : getExifBufIndex
   14234  *
   14235  * DESCRIPTION: get index of metadata to be used for EXIF
   14236  *
   14237  * PARAMETERS : @captureIndex - index of current captured frame
   14238  *
   14239  * RETURN     : index of metadata to be used for EXIF
   14240  *==========================================================================*/
   14241 uint32_t QCameraParameters::getExifBufIndex(uint32_t captureIndex)
   14242 {
   14243     uint32_t index = captureIndex;
   14244 
   14245     if (isUbiRefocus()) {
   14246         if (captureIndex < m_pCapability->refocus_af_bracketing_need.burst_count) {
   14247             index = captureIndex;
   14248         } else {
   14249             index = 0;
   14250         }
   14251     } else if (isChromaFlashEnabled()) {
   14252         index = m_pCapability->chroma_flash_settings_need.metadata_index;
   14253     } else if (isHDREnabled()) {
   14254         if (isHDR1xFrameEnabled() && isHDR1xExtraBufferNeeded()) {
   14255             index = m_pCapability->hdr_bracketing_setting.num_frames;
   14256         } else {
   14257             for (index = 0; index < m_pCapability->hdr_bracketing_setting.num_frames; index++) {
   14258                 if (0 == m_pCapability->hdr_bracketing_setting.exp_val.values[index]) {
   14259                     break;
   14260                 }
   14261             }
   14262             if (index == m_pCapability->hdr_bracketing_setting.num_frames) {
   14263                 index = captureIndex;
   14264             }
   14265         }
   14266     }
   14267 
   14268     return index;
   14269 }
   14270 
   14271 /*===========================================================================
   14272  * FUNCTION   : getNumberInBufsForSingleShot
   14273  *
   14274  * DESCRIPTION: get number of input buffers for single shot
   14275  *
   14276  * PARAMETERS : none
   14277  *
   14278  * RETURN     : number of input buffers for single shot
   14279  *==========================================================================*/
   14280 uint32_t QCameraParameters::getNumberInBufsForSingleShot()
   14281 {
   14282     uint32_t numOfBufs = 1;
   14283 
   14284     if (isUbiRefocus()) {
   14285         numOfBufs = m_pCapability->refocus_af_bracketing_need.burst_count;
   14286     } else if (isUbiFocusEnabled()) {
   14287         numOfBufs = m_pCapability->ubifocus_af_bracketing_need.burst_count;
   14288     } else if (m_bOptiZoomOn) {
   14289         numOfBufs = m_pCapability->opti_zoom_settings_need.burst_count;
   14290     } else if (isChromaFlashEnabled()) {
   14291         numOfBufs = m_pCapability->chroma_flash_settings_need.burst_count;
   14292     } else if (isHDREnabled()) {
   14293         numOfBufs = m_pCapability->hdr_bracketing_setting.num_frames;
   14294         if (isHDR1xFrameEnabled() && isHDR1xExtraBufferNeeded()) {
   14295             numOfBufs++;
   14296         }
   14297     } else if (isStillMoreEnabled()) {
   14298         if (isSeeMoreEnabled()) {
   14299             m_stillmore_config.burst_count = 1;
   14300             numOfBufs = m_stillmore_config.burst_count;
   14301         } else if ((m_stillmore_config.burst_count >=
   14302                 m_pCapability->stillmore_settings_need.min_burst_count) &&
   14303                 (m_stillmore_config.burst_count <=
   14304                 m_pCapability->stillmore_settings_need.max_burst_count)) {
   14305             numOfBufs = m_stillmore_config.burst_count;
   14306         } else {
   14307             numOfBufs = m_pCapability->stillmore_settings_need.burst_count;
   14308         }
   14309     }
   14310 
   14311     return numOfBufs;
   14312 }
   14313 
   14314 /*===========================================================================
   14315  * FUNCTION   : getNumberOutBufsForSingleShot
   14316  *
   14317  * DESCRIPTION: get number of output buffers for single shot
   14318  *
   14319  * PARAMETERS : none
   14320  *
   14321  * RETURN     : number of output buffers for single shot
   14322  *==========================================================================*/
   14323 uint32_t QCameraParameters::getNumberOutBufsForSingleShot()
   14324 {
   14325     uint32_t numOfBufs = 1;
   14326 
   14327     if (isUbiRefocus()) {
   14328         numOfBufs = m_pCapability->refocus_af_bracketing_need.output_count;
   14329     } else if (isHDREnabled()) {
   14330         if (isHDR1xFrameEnabled()) {
   14331             numOfBufs++;
   14332         }
   14333     }
   14334 
   14335     return numOfBufs;
   14336 }
   14337 
   14338 /*===========================================================================
   14339  * FUNCTION   : is4k2kVideoResolution
   14340  *
   14341  * DESCRIPTION: if resolution is 4k x 2k or true 4k x 2k
   14342  *
   14343  * PARAMETERS : none
   14344  *
   14345  * RETURN     : true: video resolution is 4k x 2k
   14346  *              false: video resolution is not 4k x 2k
   14347  *==========================================================================*/
   14348 bool QCameraParameters::is4k2kVideoResolution()
   14349 {
   14350    bool enabled = false;
   14351    cam_dimension_t resolution;
   14352    getVideoSize(&resolution.width, &resolution.height);
   14353    if (!(resolution.width < 3840 && resolution.height < 2160)) {
   14354       enabled = true;
   14355    }
   14356 
   14357    return enabled;
   14358 }
   14359 
   14360 /*===========================================================================
   14361  * FUNCTION   : isPreviewSeeMoreRequired
   14362  *
   14363  * DESCRIPTION: This function checks whether SeeMmore(SW TNR) needs to be applied for
   14364  *              preview stream depending on video resoluion and setprop
   14365  *
   14366  * PARAMETERS : none
   14367  *
   14368  * RETURN     : true: If SeeMore needs to apply
   14369  *              false: No need to apply
   14370  *==========================================================================*/
   14371 bool QCameraParameters::isPreviewSeeMoreRequired()
   14372 {
   14373    cam_dimension_t dim;
   14374    char prop[PROPERTY_VALUE_MAX];
   14375 
   14376    getVideoSize(&dim.width, &dim.height);
   14377    memset(prop, 0, sizeof(prop));
   14378    property_get("persist.camera.preview.seemore", prop, "0");
   14379    int enable = atoi(prop);
   14380 
   14381    // Enable SeeMore for preview stream if :
   14382    // 1. Video resolution <= (1920x1080)  (or)
   14383    // 2. persist.camera.preview.seemore is set
   14384    LOGD("width=%d, height=%d, enable=%d", dim.width, dim.height, enable);
   14385    return (((dim.width * dim.height) <= (1920 * 1080)) || enable);
   14386 }
   14387 
   14388 /*===========================================================================
   14389  * FUNCTION   : updateDebugLevel
   14390  *
   14391  * DESCRIPTION: send CAM_INTF_PARM_UPDATE_DEBUG_LEVEL to backend
   14392  *
   14393  * PARAMETERS : none
   14394  *
   14395  * RETURN     : NO_ERROR --success
   14396  *              int32_t type of status
   14397  *==========================================================================*/
   14398 int32_t QCameraParameters::updateDebugLevel()
   14399 {
   14400     if ( m_pParamBuf == NULL ) {
   14401         return NO_INIT;
   14402     }
   14403 
   14404     int32_t rc = initBatchUpdate();
   14405     if ( rc != NO_ERROR ) {
   14406         LOGE("Failed to initialize group update table");
   14407         return rc;
   14408     }
   14409 
   14410     uint32_t dummyDebugLevel = 0;
   14411     /* The value of dummyDebugLevel is irrelavent. On
   14412      * CAM_INTF_PARM_UPDATE_DEBUG_LEVEL, read debug property */
   14413     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_UPDATE_DEBUG_LEVEL, dummyDebugLevel)) {
   14414         LOGE("Parameters batch failed");
   14415         return BAD_VALUE;
   14416     }
   14417 
   14418     rc = commitSetBatch();
   14419     if ( rc != NO_ERROR ) {
   14420         LOGE("Failed to commit batch parameters");
   14421         return rc;
   14422     }
   14423 
   14424     return NO_ERROR;
   14425 }
   14426 
   14427 /*===========================================================================
   14428  * FUNCTION   : setOfflineRAW
   14429  *
   14430  * DESCRIPTION: Function to decide Offline RAW feature.
   14431  *
   14432  * PARAMETERS :
   14433  *  @raw_value: offline raw value to set.
   14434  *
   14435  * RETURN     : none
   14436  *==========================================================================*/
   14437 void QCameraParameters::setOfflineRAW(bool raw_value)
   14438 {
   14439     char value[PROPERTY_VALUE_MAX];
   14440     bool raw_yuv = false;
   14441     bool offlineRaw = false;
   14442 
   14443     if (raw_value) {
   14444         mOfflineRAW = true;
   14445         LOGH("Offline Raw  %d", mOfflineRAW);
   14446         return;
   14447     }
   14448 
   14449     property_get("persist.camera.raw_yuv", value, "0");
   14450     raw_yuv = atoi(value) > 0 ? true : false;
   14451     property_get("persist.camera.offlineraw", value, "0");
   14452     offlineRaw = atoi(value) > 0 ? true : false;
   14453     if ((raw_yuv || isRdiMode()) && offlineRaw) {
   14454         mOfflineRAW = true;
   14455     } else {
   14456         mOfflineRAW = false;
   14457     }
   14458     LOGH("Offline Raw  %d", mOfflineRAW);
   14459 }
   14460 
   14461 /*===========================================================================
   14462  * FUNCTION   : updatePpFeatureMask
   14463  *
   14464  * DESCRIPTION: Updates the feature mask for a particular stream depending
   14465  *              on current client configuration.
   14466  *
   14467  * PARAMETERS :
   14468  *  @stream_type: Camera stream type
   14469  *
   14470  * RETURN     : NO_ERROR --success
   14471  *              int32_t type of status
   14472  *==========================================================================*/
   14473 int32_t QCameraParameters::updatePpFeatureMask(cam_stream_type_t stream_type) {
   14474 
   14475     cam_feature_mask_t feature_mask = 0;
   14476 
   14477     if (stream_type >= CAM_STREAM_TYPE_MAX) {
   14478         LOGE("Error!! stream type: %d not valid", stream_type);
   14479         return -1;
   14480     }
   14481 
   14482     // Update feature mask for SeeMore in video and video preview
   14483     if (isSeeMoreEnabled() && ((stream_type == CAM_STREAM_TYPE_VIDEO) ||
   14484             (stream_type == CAM_STREAM_TYPE_PREVIEW && getRecordingHintValue() &&
   14485             isPreviewSeeMoreRequired()))) {
   14486        feature_mask |= CAM_QCOM_FEATURE_LLVD;
   14487     }
   14488 
   14489     if (isHighQualityNoiseReductionMode() &&
   14490             ((stream_type == CAM_STREAM_TYPE_VIDEO) ||
   14491             (stream_type == CAM_STREAM_TYPE_PREVIEW && getRecordingHintValue() &&
   14492             isPreviewSeeMoreRequired()))) {
   14493         feature_mask |= CAM_QTI_FEATURE_SW_TNR;
   14494     }
   14495 
   14496     // Do not enable feature mask for ZSL/non-ZSL/liveshot except for 4K2k case
   14497     // Enable feature mask for small Jpeg resolutions
   14498     if ((getRecordingHintValue() &&
   14499             (stream_type == CAM_STREAM_TYPE_SNAPSHOT) && is4k2kVideoResolution()) ||
   14500             (stream_type != CAM_STREAM_TYPE_SNAPSHOT) ||
   14501             ((stream_type == CAM_STREAM_TYPE_SNAPSHOT) && isSmallJpegSizeEnabled())) {
   14502         if ((m_nMinRequiredPpMask & CAM_QCOM_FEATURE_SHARPNESS) &&
   14503                 !isOptiZoomEnabled()) {
   14504             feature_mask |= CAM_QCOM_FEATURE_SHARPNESS;
   14505         }
   14506 
   14507         if (m_nMinRequiredPpMask & CAM_QCOM_FEATURE_EFFECT) {
   14508             feature_mask |= CAM_QCOM_FEATURE_EFFECT;
   14509         }
   14510         if (isWNREnabled()) {
   14511             feature_mask |= CAM_QCOM_FEATURE_DENOISE2D;
   14512         }
   14513 
   14514         //Set flip mode based on Stream type;
   14515         int flipMode = getFlipMode(stream_type);
   14516         if (flipMode > 0) {
   14517             feature_mask |= CAM_QCOM_FEATURE_FLIP;
   14518         }
   14519     }
   14520 
   14521     if ((isTNRVideoEnabled() && (CAM_STREAM_TYPE_VIDEO == stream_type))
   14522             || (isTNRPreviewEnabled() && (CAM_STREAM_TYPE_PREVIEW == stream_type))) {
   14523         feature_mask |= CAM_QCOM_FEATURE_CPP_TNR;
   14524     }
   14525     if (isEztuneEnabled() &&
   14526             ((CAM_STREAM_TYPE_PREVIEW == stream_type) ||
   14527             (CAM_STREAM_TYPE_SNAPSHOT == stream_type))) {
   14528         feature_mask |= CAM_QCOM_FEATURE_EZTUNE;
   14529     }
   14530 
   14531     if ((getCDSMode() != CAM_CDS_MODE_OFF) &&
   14532             ((CAM_STREAM_TYPE_PREVIEW == stream_type) ||
   14533             (CAM_STREAM_TYPE_VIDEO == stream_type) ||
   14534             (CAM_STREAM_TYPE_CALLBACK == stream_type) ||
   14535             (CAM_STREAM_TYPE_POSTVIEW == stream_type) ||
   14536             ((CAM_STREAM_TYPE_SNAPSHOT == stream_type) &&
   14537             getRecordingHintValue() && is4k2kVideoResolution()))) {
   14538          if (m_nMinRequiredPpMask & CAM_QCOM_FEATURE_DSDN) {
   14539              feature_mask |= CAM_QCOM_FEATURE_DSDN;
   14540          } else {
   14541              feature_mask |= CAM_QCOM_FEATURE_CDS;
   14542          }
   14543     }
   14544 
   14545     if (isTNRSnapshotEnabled() && (CAM_STREAM_TYPE_SNAPSHOT == stream_type)
   14546             && (isZSLMode() || getRecordingHintValue())) {
   14547         feature_mask |= CAM_QCOM_FEATURE_CPP_TNR;
   14548     }
   14549 
   14550     //Rotation could also have an effect on pp feature mask
   14551     cam_pp_feature_config_t config;
   14552     cam_dimension_t dim;
   14553     memset(&config, 0, sizeof(cam_pp_feature_config_t));
   14554     getStreamRotation(stream_type, config, dim);
   14555     feature_mask |= config.feature_mask;
   14556 
   14557     // Dual Camera scenarios
   14558     // all feature masks are disabled for preview and analysis streams for aux session
   14559     // all required feature masks for aux session preview and analysis streams need
   14560     // to be enabled explicitly here
   14561     ///@note When aux camera is of bayer type, keep pp mask as is or we'd run
   14562     ///      into stream mapping problems. YUV sensor is marked as interleaved and has
   14563     ///      preferred mapping setup so we don't see any mapping issues.
   14564     if (m_relCamSyncInfo.sync_control == CAM_SYNC_RELATED_SENSORS_ON) {
   14565         if (((CAM_STREAM_TYPE_ANALYSIS == stream_type) ||
   14566                 (CAM_STREAM_TYPE_PREVIEW == stream_type)) &&
   14567                 (m_relCamSyncInfo.mode == CAM_MODE_SECONDARY) &&
   14568                 (m_pCapability->sensor_type.sens_type == CAM_SENSOR_YUV)) {
   14569             LOGH("Disabling all pp feature masks for aux preview and "
   14570                     "analysis streams");
   14571             feature_mask = 0;
   14572         }
   14573 
   14574         // all feature masks need to be enabled here
   14575         // enable DCRF feature mask on analysis stream in case of dual camera
   14576         if (m_bDcrfEnabled && (CAM_STREAM_TYPE_ANALYSIS == stream_type)) {
   14577             feature_mask |= CAM_QCOM_FEATURE_DCRF;
   14578         } else {
   14579             feature_mask &= ~CAM_QCOM_FEATURE_DCRF;
   14580         }
   14581     }
   14582 
   14583     // Preview assisted autofocus needs to be supported for
   14584     // callback, preview, or video streams
   14585     cam_color_filter_arrangement_t filter_arrangement;
   14586     filter_arrangement = m_pCapability->color_arrangement;
   14587     switch (filter_arrangement) {
   14588     case CAM_FILTER_ARRANGEMENT_RGGB:
   14589     case CAM_FILTER_ARRANGEMENT_GRBG:
   14590     case CAM_FILTER_ARRANGEMENT_GBRG:
   14591     case CAM_FILTER_ARRANGEMENT_BGGR:
   14592         if ((stream_type == CAM_STREAM_TYPE_CALLBACK) ||
   14593             (stream_type == CAM_STREAM_TYPE_PREVIEW)) {
   14594             feature_mask |= CAM_QCOM_FEATURE_PAAF;
   14595         } else if (stream_type == CAM_STREAM_TYPE_VIDEO) {
   14596             if (getVideoISType() != IS_TYPE_EIS_3_0)
   14597                 feature_mask |= CAM_QCOM_FEATURE_PAAF;
   14598         }
   14599         break;
   14600     case CAM_FILTER_ARRANGEMENT_Y:
   14601         if (stream_type == CAM_STREAM_TYPE_ANALYSIS) {
   14602             feature_mask |= CAM_QCOM_FEATURE_PAAF;
   14603             LOGH("add PAAF mask to feature_mask for mono device");
   14604         }
   14605         break;
   14606     default:
   14607         break;
   14608     }
   14609 
   14610     // Enable PPEISCORE for EIS 3.0
   14611     if ((stream_type == CAM_STREAM_TYPE_VIDEO) &&
   14612             (getVideoISType() == IS_TYPE_EIS_3_0)) {
   14613         feature_mask |= CAM_QTI_FEATURE_PPEISCORE;
   14614     }
   14615 
   14616     if(isDualCamera()) {
   14617         char prop[PROPERTY_VALUE_MAX];
   14618         bool satEnabledFlag = FALSE;
   14619         bool sacEnabledFlag = FALSE;
   14620         bool rtbdmEnabledFlag = FALSE;
   14621         bool rtbEnabledFlag = FALSE;
   14622         memset(prop, 0, sizeof(prop));
   14623         property_get("persist.camera.sat.enable", prop, "0");
   14624         satEnabledFlag = atoi(prop);
   14625 
   14626         if (satEnabledFlag) {
   14627         LOGH("SAT flag enabled");
   14628             if (stream_type == CAM_STREAM_TYPE_VIDEO &&
   14629                 !is4k2kVideoResolution()) {
   14630                 feature_mask |= CAM_QTI_FEATURE_SAT;
   14631                 LOGH("SAT feature mask set");
   14632             } else if ((stream_type == CAM_STREAM_TYPE_PREVIEW)||
   14633                 (stream_type == CAM_STREAM_TYPE_CALLBACK)) {
   14634                 feature_mask |= CAM_QTI_FEATURE_SAT;
   14635                 LOGH("SAT feature mask set");
   14636             }
   14637         }
   14638 
   14639         memset(prop, 0, sizeof(prop));
   14640         property_get("persist.camera.sac.enable", prop, "0");
   14641         sacEnabledFlag = atoi(prop);
   14642 
   14643         if (sacEnabledFlag) {
   14644         LOGH("SAC flag enabled");
   14645             if (stream_type == CAM_STREAM_TYPE_ANALYSIS) {
   14646                 feature_mask |= CAM_QTI_FEATURE_SAC;
   14647                 LOGH("SAC feature mask set");
   14648             }
   14649         }
   14650 
   14651         memset(prop, 0, sizeof(prop));
   14652         property_get("persist.camera.rtbdm.enable", prop, "0");
   14653         rtbdmEnabledFlag = atoi(prop);
   14654 
   14655         if (rtbdmEnabledFlag) {
   14656         LOGH("RTBDM flag enabled");
   14657             if (stream_type == CAM_STREAM_TYPE_ANALYSIS) {
   14658                 feature_mask |= CAM_QTI_FEATURE_RTBDM;
   14659                 LOGH("RTBDM feature mask set");
   14660             }
   14661         }
   14662 
   14663         memset(prop, 0, sizeof(prop));
   14664         property_get("persist.camera.rtb.enable", prop, "0");
   14665         rtbEnabledFlag = atoi(prop);
   14666 
   14667         if (rtbEnabledFlag) {
   14668         LOGH("RTB flag enabled");
   14669             if ((stream_type == CAM_STREAM_TYPE_PREVIEW)||
   14670                 (stream_type == CAM_STREAM_TYPE_CALLBACK)) {
   14671                 feature_mask |= CAM_QTI_FEATURE_RTB;
   14672                 LOGH("RTB feature mask set");
   14673             }
   14674         }
   14675     }
   14676 
   14677     if (stream_type == CAM_STREAM_TYPE_VIDEO ||
   14678         stream_type == CAM_STREAM_TYPE_PREVIEW) {
   14679         char prop[PROPERTY_VALUE_MAX];
   14680         memset(prop, 0, sizeof(prop));
   14681         int32_t fixedFOVCenabled = FALSE;
   14682         property_get("persist.camera.fovc.enable", prop, "0");
   14683         fixedFOVCenabled = atoi(prop);
   14684         if (fixedFOVCenabled == 1) {
   14685             LOGH("Fixed FOVC feature mask set for stream type %d", stream_type);
   14686             feature_mask |= CAM_QTI_FEATURE_FIXED_FOVC;
   14687         }
   14688     }
   14689 
   14690     // Store stream feature mask
   14691     setStreamPpMask(stream_type, feature_mask);
   14692     LOGH("stream type: %d, pp_mask: 0x%llx", stream_type, feature_mask);
   14693 
   14694     return NO_ERROR;
   14695 }
   14696 
   14697 /*===========================================================================
   14698  * FUNCTION   : setStreamPpMask
   14699  *
   14700  * DESCRIPTION: Stores a particular feature mask for a given camera stream
   14701  *
   14702  * PARAMETERS :
   14703  *  @stream_type: Camera stream type
   14704  *  @pp_mask  : Feature mask
   14705  *
   14706  * RETURN     : NO_ERROR --success
   14707  *              int32_t type of status
   14708  *==========================================================================*/
   14709 int32_t QCameraParameters::setStreamPpMask(cam_stream_type_t stream_type,
   14710         cam_feature_mask_t pp_mask) {
   14711 
   14712     if(stream_type >= CAM_STREAM_TYPE_MAX) {
   14713         return BAD_TYPE;
   14714     }
   14715 
   14716     mStreamPpMask[stream_type] = pp_mask;
   14717     return NO_ERROR;
   14718 }
   14719 
   14720 /*===========================================================================
   14721  * FUNCTION   : getStreamPpMask
   14722  *
   14723  * DESCRIPTION: Retrieves the feature mask for a given camera stream
   14724  *
   14725  * PARAMETERS :
   14726  *  @stream_type: Camera stream type
   14727  *  @pp_mask  : Feature mask
   14728  *
   14729  * RETURN     : NO_ERROR --success
   14730  *              int32_t type of status
   14731  *==========================================================================*/
   14732 int32_t QCameraParameters::getStreamPpMask(cam_stream_type_t stream_type,
   14733         cam_feature_mask_t &pp_mask) {
   14734 
   14735     if(stream_type >= CAM_STREAM_TYPE_MAX) {
   14736         return BAD_TYPE;
   14737     }
   14738 
   14739     pp_mask = mStreamPpMask[stream_type];
   14740     return NO_ERROR;
   14741 }
   14742 
   14743 /*===========================================================================
   14744  * FUNCTION   : isMultiPassReprocessing
   14745  *
   14746  * DESCRIPTION: Read setprop to enable/disable multipass
   14747  *
   14748  * PARAMETERS : none
   14749  *
   14750  * RETURN     : TRUE  -- If enabled
   14751  *              FALSE  -- disabled
   14752  *==========================================================================*/
   14753 bool QCameraParameters::isMultiPassReprocessing()
   14754 {
   14755     char value[PROPERTY_VALUE_MAX];
   14756     int multpass = 0;
   14757 
   14758     if (getQuadraCfa()) {
   14759         multpass = TRUE;
   14760         return TRUE;
   14761     }
   14762 
   14763     property_get("persist.camera.multi_pass", value, "0");
   14764     multpass = atoi(value);
   14765 
   14766     return (multpass == 0)? FALSE : TRUE;
   14767 }
   14768 
   14769 /*===========================================================================
   14770  * FUNCTION   : setReprocCount
   14771  *
   14772  * DESCRIPTION: Set total reprocessing pass count
   14773  *
   14774  * PARAMETERS : none
   14775  *
   14776  * RETURN     : None
   14777  *==========================================================================*/
   14778 void QCameraParameters::setReprocCount()
   14779 {
   14780     mTotalPPCount = 1; //Default reprocessing Pass count
   14781 
   14782     if (getManualCaptureMode() >=
   14783             CAM_MANUAL_CAPTURE_TYPE_3) {
   14784         LOGD("Additional post processing enabled for manual capture");
   14785         mTotalPPCount++;
   14786     }
   14787 
   14788     if (!isMultiPassReprocessing()) {
   14789         return;
   14790     }
   14791 
   14792     if ((getZoomLevel() != 0 && !getQuadraCfa())
   14793             && (getBurstCountForAdvancedCapture()
   14794             == getNumOfSnapshots())) {
   14795         LOGD("2 Pass postprocessing enabled");
   14796         mTotalPPCount++;
   14797     }
   14798 
   14799     if (getQuadraCfa()) {
   14800         mTotalPPCount++;
   14801     }
   14802 }
   14803 
   14804 /*===========================================================================
   14805  * FUNCTION   : isUBWCEnabled
   14806  *
   14807  * DESCRIPTION: Function to get UBWC hardware support.
   14808  *
   14809  * PARAMETERS : None
   14810  *
   14811  * RETURN     : TRUE -- UBWC format supported
   14812  *              FALSE -- UBWC is not supported.
   14813  *==========================================================================*/
   14814 bool QCameraParameters::isUBWCEnabled()
   14815 {
   14816 #ifdef UBWC_PRESENT
   14817     char value[PROPERTY_VALUE_MAX];
   14818     int prop_value = 0;
   14819     memset(value, 0, sizeof(value));
   14820     property_get("debug.gralloc.gfx_ubwc_disable", value, "0");
   14821     prop_value = atoi(value);
   14822     if (prop_value) {
   14823         return FALSE;
   14824     }
   14825 
   14826     //Disable UBWC if it is YUV sensor.
   14827     if ((m_pCapability != NULL) &&
   14828             (m_pCapability->sensor_type.sens_type == CAM_SENSOR_YUV)) {
   14829         return FALSE;
   14830     }
   14831 
   14832     //Disable UBWC if Eztune is enabled
   14833     // Eztune works on CPP output and cannot understand UBWC buffer.
   14834     memset(value, 0, sizeof(value));
   14835     property_get("persist.camera.eztune.enable", value, "0");
   14836     prop_value = atoi(value);
   14837     if (prop_value) {
   14838         return FALSE;
   14839     }
   14840     return TRUE;
   14841 #else
   14842     return FALSE;
   14843 #endif
   14844 }
   14845 
   14846 /*===========================================================================
   14847  * FUNCTION   : isPostProcScaling
   14848  *
   14849  * DESCRIPTION: is scaling to be done by CPP?
   14850  *
   14851  * PARAMETERS : none
   14852  *
   14853  * RETURN     : TRUE  : If CPP scaling enabled
   14854  *              FALSE : If VFE scaling enabled
   14855  *==========================================================================*/
   14856 bool QCameraParameters::isPostProcScaling()
   14857 {
   14858     char value[PROPERTY_VALUE_MAX];
   14859     bool cpp_scaling = FALSE;
   14860 
   14861     if (getRecordingHintValue()) {
   14862         return FALSE;
   14863     }
   14864 
   14865     property_get("persist.camera.pp_scaling", value, "0");
   14866     cpp_scaling = atoi(value) > 0 ? TRUE : FALSE;
   14867 
   14868     LOGH("Post proc scaling enabled : %d",
   14869              cpp_scaling);
   14870     return cpp_scaling;
   14871 }
   14872 
   14873 /*===========================================================================
   14874  * FUNCTION   : isLLNoiseEnabled
   14875  *
   14876  * DESCRIPTION: Low light noise change
   14877  *
   14878  * PARAMETERS : none
   14879  *
   14880  * RETURN     : TRUE  : If low light noise enabled
   14881  *              FALSE : If low light noise disabled
   14882  *==========================================================================*/
   14883 bool QCameraParameters::isLLNoiseEnabled()
   14884 {
   14885     char value[PROPERTY_VALUE_MAX];
   14886     bool llnoise = FALSE;
   14887 
   14888     if (!isWNREnabled()) {
   14889         return FALSE;
   14890     }
   14891 
   14892     property_get("persist.camera.llnoise", value, "0");
   14893     llnoise = atoi(value) > 0 ? TRUE : FALSE;
   14894 
   14895     LOGH("Low light noise enabled : %d",
   14896              llnoise);
   14897     return llnoise;
   14898 }
   14899 
   14900 /*===========================================================================
   14901  * FUNCTION   : setBufBatchCount
   14902  *
   14903  * DESCRIPTION: Function to configure batch buffer
   14904  *
   14905  * PARAMETERS : int8_t buf_cnt
   14906  *                     Buffer batch count
   14907  *
   14908  * RETURN     :  None
   14909  *==========================================================================*/
   14910 void QCameraParameters::setBufBatchCount(int8_t buf_cnt)
   14911 {
   14912     mBufBatchCnt = 0;
   14913     char value[PROPERTY_VALUE_MAX];
   14914     int8_t count = 0;
   14915 
   14916     property_get("persist.camera.batchcount", value, "0");
   14917     count = atoi(value);
   14918 
   14919     if (!(count != 0 || buf_cnt > CAMERA_MIN_BATCH_COUNT)) {
   14920         LOGH("Buffer batch count = %d", mBufBatchCnt);
   14921         set(KEY_QC_VIDEO_BATCH_SIZE, mBufBatchCnt);
   14922         return;
   14923     }
   14924 
   14925     while((m_pCapability->max_batch_bufs_supported != 0)
   14926             && (m_pCapability->max_batch_bufs_supported < buf_cnt)) {
   14927         buf_cnt = buf_cnt / 2;
   14928     }
   14929 
   14930     if (count > 0) {
   14931         mBufBatchCnt = count;
   14932         LOGH("Buffer batch count = %d", mBufBatchCnt);
   14933         set(KEY_QC_VIDEO_BATCH_SIZE, mBufBatchCnt);
   14934         return;
   14935     }
   14936 
   14937     if (buf_cnt > CAMERA_MIN_BATCH_COUNT) {
   14938         mBufBatchCnt = buf_cnt;
   14939         LOGH("Buffer batch count = %d", mBufBatchCnt);
   14940         set(KEY_QC_VIDEO_BATCH_SIZE, mBufBatchCnt);
   14941         return;
   14942     }
   14943 }
   14944 
   14945 /*===========================================================================
   14946  * FUNCTION   : setVideoBatch()
   14947  *
   14948  * DESCRIPTION: Function to batching for video.
   14949  *
   14950  * PARAMETERS : none
   14951  *
   14952  * RETURN     :  None
   14953  *==========================================================================*/
   14954 void QCameraParameters::setVideoBatchSize()
   14955 {
   14956     char value[PROPERTY_VALUE_MAX];
   14957     int8_t minBatchcnt = 2; //Batching enabled only if batch size if greater than 2;
   14958     int32_t width = 0, height = 0;
   14959     mVideoBatchSize = 0;
   14960 
   14961     if (getBufBatchCount()) {
   14962         //We don't need HAL to HAL batching if camera batching enabled.
   14963         return;
   14964     }
   14965 
   14966     getVideoSize(&width, &height);
   14967     if ((width > 1920) || (height > 1080)) {
   14968         //Cannot enable batch mode for video size bigger than 1080p
   14969         return;
   14970     }
   14971 
   14972     //Batch size "6" is the recommended and gives optimal power saving.
   14973     property_get("persist.camera.video.batchsize", value, "0");
   14974     mVideoBatchSize = atoi(value);
   14975 
   14976     if (mVideoBatchSize > CAMERA_MAX_CONSUMER_BATCH_BUFFER_SIZE) {
   14977         mVideoBatchSize = CAMERA_MAX_CONSUMER_BATCH_BUFFER_SIZE;
   14978     } else if (mVideoBatchSize <= minBatchcnt) {
   14979         //Batching enabled only if batch size is greater than 2.
   14980         mVideoBatchSize = 0;
   14981     }
   14982     LOGD("mVideoBatchSize = %d", mVideoBatchSize);
   14983     set(KEY_QC_VIDEO_BATCH_SIZE, mVideoBatchSize);
   14984 }
   14985 
   14986 /*===========================================================================
   14987  * FUNCTION   : setCustomParams
   14988  *
   14989  * DESCRIPTION: Function to update OEM specific custom parameter
   14990  *
   14991  * PARAMETERS : params: Input Parameter object
   14992  *
   14993  * RETURN     :  error value
   14994  *==========================================================================*/
   14995 int32_t QCameraParameters::setCustomParams(__unused const QCameraParameters& params)
   14996 {
   14997     int32_t rc = NO_ERROR;
   14998 
   14999     /* Application specific parameter can be read from "params" and update m_pParamBuf
   15000        We can also update internal OEM custom parameters in this funcion.
   15001        "CAM_CUSTOM_PARM_EXAMPLE" is used as a example */
   15002 
   15003     /*Get the pointer of shared buffer for custom parameter*/
   15004     custom_parm_buffer_t *customParam =
   15005             (custom_parm_buffer_t *)POINTER_OF_META(CAM_INTF_PARM_CUSTOM, m_pParamBuf);
   15006 
   15007 
   15008     /*start updating custom parameter values*/
   15009     if (ADD_SET_PARAM_ENTRY_TO_BATCH(customParam, CAM_CUSTOM_PARM_EXAMPLE, 1)) {
   15010         LOGE("Failed to update CAM_CUSTOM_PARM_DUMMY");
   15011         return BAD_VALUE;
   15012     }
   15013 
   15014     /*set custom parameter values to main parameter buffer. Update isvalid flag*/
   15015     ADD_GET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CUSTOM);
   15016 
   15017     return rc;
   15018 }
   15019 
   15020 /*===========================================================================
   15021  * FUNCTION   : dump
   15022  *
   15023  * DESCRIPTION: Composes a string based on current configuration
   15024  *
   15025  * PARAMETERS : none
   15026  *
   15027  * RETURN     : Formatted string
   15028  *==========================================================================*/
   15029 String8 QCameraParameters::dump()
   15030 {
   15031     String8 str("\n");
   15032     char s[128];
   15033 
   15034     snprintf(s, 128, "Preview Pixel Fmt: %d\n", getPreviewHalPixelFormat());
   15035     str += s;
   15036 
   15037     snprintf(s, 128, "ZSL Burst Interval: %d\n", getZSLBurstInterval());
   15038     str += s;
   15039 
   15040     snprintf(s, 128, "ZSL Queue Depth: %d\n", getZSLQueueDepth());
   15041     str += s;
   15042 
   15043     snprintf(s, 128, "ZSL Back Look Count %d\n", getZSLBackLookCount());
   15044     str += s;
   15045 
   15046     snprintf(s, 128, "Max Unmatched Frames In Queue: %d\n",
   15047         getMaxUnmatchedFramesInQueue());
   15048     str += s;
   15049 
   15050     snprintf(s, 128, "Is ZSL Mode: %d\n", isZSLMode());
   15051     str += s;
   15052 
   15053     snprintf(s, 128, "Is No Display Mode: %d\n", isNoDisplayMode());
   15054     str += s;
   15055 
   15056     snprintf(s, 128, "Is WNR Enabled: %d\n", isWNREnabled());
   15057     str += s;
   15058 
   15059     snprintf(s, 128, "isHfrMode: %d\n", isHfrMode());
   15060     str += s;
   15061 
   15062     snprintf(s, 128, "getNumOfSnapshots: %d\n", getNumOfSnapshots());
   15063     str += s;
   15064 
   15065     snprintf(s, 128, "getNumOfExtraHDRInBufsIfNeeded: %d\n",
   15066         getNumOfExtraHDRInBufsIfNeeded());
   15067     str += s;
   15068 
   15069     snprintf(s, 128, "getNumOfExtraHDROutBufsIfNeeded: %d\n",
   15070         getNumOfExtraHDROutBufsIfNeeded());
   15071     str += s;
   15072 
   15073     snprintf(s, 128, "getRecordingHintValue: %d\n", getRecordingHintValue());
   15074     str += s;
   15075 
   15076     snprintf(s, 128, "getJpegQuality: %u\n", getJpegQuality());
   15077     str += s;
   15078 
   15079     snprintf(s, 128, "getJpegRotation: %u\n", getJpegRotation());
   15080     str += s;
   15081 
   15082     snprintf(s, 128, "isHistogramEnabled: %d\n", isHistogramEnabled());
   15083     str += s;
   15084 
   15085     snprintf(s, 128, "isFaceDetectionEnabled: %d\n", isFaceDetectionEnabled());
   15086     str += s;
   15087 
   15088     snprintf(s, 128, "isHDREnabled: %d\n", isHDREnabled());
   15089     str += s;
   15090 
   15091     snprintf(s, 128, "isAutoHDREnabled: %d\n", isAutoHDREnabled());
   15092     str += s;
   15093 
   15094     snprintf(s, 128, "isAVTimerEnabled: %d\n", isAVTimerEnabled());
   15095     str += s;
   15096 
   15097     snprintf(s, 128, "getFocusMode: %d\n", getFocusMode());
   15098     str += s;
   15099 
   15100     snprintf(s, 128, "isJpegPictureFormat: %d\n", isJpegPictureFormat());
   15101     str += s;
   15102 
   15103     snprintf(s, 128, "isNV16PictureFormat: %d\n", isNV16PictureFormat());
   15104     str += s;
   15105 
   15106     snprintf(s, 128, "isNV21PictureFormat: %d\n", isNV21PictureFormat());
   15107     str += s;
   15108 
   15109     snprintf(s, 128, "isSnapshotFDNeeded: %d\n", isSnapshotFDNeeded());
   15110     str += s;
   15111 
   15112     snprintf(s, 128, "isHDR1xFrameEnabled: %d\n", isHDR1xFrameEnabled());
   15113     str += s;
   15114 
   15115     snprintf(s, 128, "isYUVFrameInfoNeeded: %d\n", isYUVFrameInfoNeeded());
   15116     str += s;
   15117 
   15118     snprintf(s, 128, "isHDR1xExtraBufferNeeded: %d\n",
   15119         isHDR1xExtraBufferNeeded());
   15120     str += s;
   15121 
   15122     snprintf(s, 128, "isHDROutputCropEnabled: %d\n", isHDROutputCropEnabled());
   15123     str += s;
   15124 
   15125     snprintf(s, 128, "isPreviewFlipChanged: %d\n", isPreviewFlipChanged());
   15126     str += s;
   15127 
   15128     snprintf(s, 128, "isVideoFlipChanged: %d\n", isVideoFlipChanged());
   15129     str += s;
   15130 
   15131     snprintf(s, 128, "isSnapshotFlipChanged: %d\n", isSnapshotFlipChanged());
   15132     str += s;
   15133 
   15134     snprintf(s, 128, "isHDRThumbnailProcessNeeded: %d\n",
   15135         isHDRThumbnailProcessNeeded());
   15136     str += s;
   15137 
   15138     snprintf(s, 128, "getAutoFlickerMode: %d\n", getAutoFlickerMode());
   15139     str += s;
   15140 
   15141     snprintf(s, 128, "getNumOfExtraBuffersForImageProc: %d\n",
   15142         getNumOfExtraBuffersForImageProc());
   15143     str += s;
   15144 
   15145     snprintf(s, 128, "isUbiFocusEnabled: %d\n", isUbiFocusEnabled());
   15146     str += s;
   15147 
   15148     snprintf(s, 128, "isChromaFlashEnabled: %d\n", isChromaFlashEnabled());
   15149     str += s;
   15150 
   15151     snprintf(s, 128, "isOptiZoomEnabled: %d\n", isOptiZoomEnabled());
   15152     str += s;
   15153 
   15154     snprintf(s, 128, "isStillMoreEnabled: %d\n", isStillMoreEnabled());
   15155     str += s;
   15156 
   15157     snprintf(s, 128, "getBurstCountForAdvancedCapture: %d\n",
   15158         getBurstCountForAdvancedCapture());
   15159     str += s;
   15160 
   15161     return str;
   15162 }
   15163 
   15164 /*===========================================================================
   15165  * FUNCTION   : getNumOfExtraBuffersForVideo
   15166  *
   15167  * DESCRIPTION: get number of extra buffers needed by image processing
   15168  *
   15169  * PARAMETERS : none
   15170  *
   15171  * RETURN     : number of extra buffers needed by ImageProc;
   15172  *              0 if not ImageProc enabled
   15173  *==========================================================================*/
   15174 uint8_t QCameraParameters::getNumOfExtraBuffersForVideo()
   15175 {
   15176     uint8_t numOfBufs = 0;
   15177 
   15178     if (isSeeMoreEnabled() || isHighQualityNoiseReductionMode()) {
   15179         numOfBufs = 1;
   15180     }
   15181 
   15182     return numOfBufs;
   15183 }
   15184 
   15185 /*===========================================================================
   15186  * FUNCTION   : getNumOfExtraBuffersForPreview
   15187  *
   15188  * DESCRIPTION: get number of extra buffers needed by image processing
   15189  *
   15190  * PARAMETERS : none
   15191  *
   15192  * RETURN     : number of extra buffers needed by ImageProc;
   15193  *              0 if not ImageProc enabled
   15194  *==========================================================================*/
   15195 uint8_t QCameraParameters::getNumOfExtraBuffersForPreview()
   15196 {
   15197     uint8_t numOfBufs = 0;
   15198 
   15199     if ((isSeeMoreEnabled() || isHighQualityNoiseReductionMode())
   15200             && !isZSLMode() && getRecordingHintValue()) {
   15201         numOfBufs = 1;
   15202     }
   15203 
   15204     return numOfBufs;
   15205 }
   15206 
   15207 /*===========================================================================
   15208  * FUNCTION   : setToneMapMode
   15209  *
   15210  * DESCRIPTION: enable or disable tone map
   15211  *
   15212  * PARAMETERS :
   15213  *   @enable : enable: 1; disable 0
   15214  *   @initCommit: if configuration list needs to be initialized and commited
   15215  *
   15216  * RETURN     : int32_t type of status
   15217  *              NO_ERROR  -- success
   15218  *              none-zero failure code
   15219  *==========================================================================*/
   15220 int32_t QCameraParameters::setToneMapMode(uint32_t enable, bool initCommit)
   15221 {
   15222     int32_t rc = NO_ERROR;
   15223     LOGH("tone map mode %d ", enable);
   15224 
   15225     if (initCommit) {
   15226         if (initBatchUpdate() < 0) {
   15227             LOGE("Failed to initialize group update table");
   15228             return FAILED_TRANSACTION;
   15229         }
   15230     }
   15231 
   15232     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_TONE_MAP_MODE, enable)) {
   15233         LOGE("Failed to update tone map mode");
   15234         return BAD_VALUE;
   15235     }
   15236 
   15237     if (initCommit) {
   15238         rc = commitSetBatch();
   15239         if (rc != NO_ERROR) {
   15240             LOGE("Failed to commit tone map mode");
   15241             return rc;
   15242         }
   15243     }
   15244 
   15245     return rc;
   15246 }
   15247 
   15248 /*===========================================================================
   15249  * FUNCTION   : getLongshotStages
   15250  *
   15251  * DESCRIPTION: get number of stages for longshot
   15252  *
   15253  * PARAMETERS : none
   15254  *
   15255  * RETURN     : number of stages
   15256  *==========================================================================*/
   15257 uint8_t QCameraParameters::getLongshotStages()
   15258 {
   15259     uint8_t numStages =
   15260             isLowMemoryDevice() ? CAMERA_MIN_LONGSHOT_STAGES : CAMERA_DEFAULT_LONGSHOT_STAGES;
   15261 
   15262     char prop[PROPERTY_VALUE_MAX];
   15263     memset(prop, 0, sizeof(prop));
   15264     property_get("persist.camera.longshot.stages", prop, "0");
   15265     uint8_t propStages = atoi(prop);
   15266     if (propStages > 0 && propStages <= CAMERA_DEFAULT_LONGSHOT_STAGES) {
   15267         numStages = propStages;
   15268     }
   15269     return numStages;
   15270 }
   15271 
   15272 /*===========================================================================
   15273  * FUNCTION   : setCDSMode
   15274  *
   15275  * DESCRIPTION: set CDS mode
   15276  *
   15277  * PARAMETERS :
   15278  *   @cds_mode : cds mode
   15279  *   @initCommit: if configuration list needs to be initialized and commited
   15280  *
   15281  * RETURN     : int32_t type of status
   15282  *              NO_ERROR  -- success
   15283  *              none-zero failure code
   15284  *==========================================================================*/
   15285 int32_t QCameraParameters::setCDSMode(int32_t cds_mode, bool initCommit)
   15286 {
   15287     if (initCommit) {
   15288         if (initBatchUpdate() < 0) {
   15289             LOGE("Failed to initialize group update table");
   15290             return FAILED_TRANSACTION;
   15291         }
   15292     }
   15293 
   15294     int32_t rc = NO_ERROR;
   15295     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_CDS_MODE, cds_mode)) {
   15296         LOGE("Failed to update cds mode");
   15297         return BAD_VALUE;
   15298     }
   15299 
   15300     if (initCommit) {
   15301         rc = commitSetBatch();
   15302         if (NO_ERROR != rc) {
   15303             LOGE("Failed to set cds mode");
   15304             return rc;
   15305         }
   15306     }
   15307 
   15308     LOGH("cds mode -> %d", cds_mode);
   15309 
   15310     return rc;
   15311 }
   15312 
   15313 /*===========================================================================
   15314  * FUNCTION   : setLowLightCapture
   15315  *
   15316  * DESCRIPTION: Function to enable low light capture
   15317  *==========================================================================*/
   15318 void QCameraParameters::setLowLightCapture()
   15319 {
   15320     char prop[PROPERTY_VALUE_MAX];
   15321     memset(prop, 0, sizeof(prop));
   15322     property_get("persist.camera.llc", prop, "0");
   15323     m_LLCaptureEnabled = (atoi(prop) > 0) ? TRUE : FALSE;
   15324 
   15325     if (!m_LLCaptureEnabled) {
   15326         m_LowLightLevel = CAM_LOW_LIGHT_OFF;
   15327     }
   15328 }
   15329 
   15330 /*===========================================================================
   15331  * FUNCTION   : fdModeInVideo
   15332  *
   15333  * DESCRIPTION: FD in Video change
   15334  *
   15335  * PARAMETERS : none
   15336  *
   15337  * RETURN     : FD Mode in Video
   15338  *              0 : If FD in Video disabled
   15339  *              1 : If FD in Video enabled for Detection, focus
   15340  *              2 : If FD in Video enabled only for focus
   15341  *==========================================================================*/
   15342 uint8_t QCameraParameters::fdModeInVideo()
   15343 {
   15344     char value[PROPERTY_VALUE_MAX];
   15345     uint8_t fdvideo = 0;
   15346 
   15347     property_get("persist.camera.fdvideo", value, "0");
   15348     fdvideo = (atoi(value) > 0) ? atoi(value) : 0;
   15349 
   15350     LOGD("FD mode in Video : %d", fdvideo);
   15351     return fdvideo;
   15352 }
   15353 
   15354 /*===========================================================================
   15355  * FUNCTION   : isOEMFeatFrameSkipEnabled
   15356  *
   15357  * DESCRIPTION: If OEMFeat processcess alternate frame
   15358  *
   15359  * PARAMETERS : none
   15360  *
   15361  * RETURN     : boolean
   15362  *==========================================================================*/
   15363 uint8_t QCameraParameters::isOEMFeatFrameSkipEnabled()
   15364 {
   15365     char value[PROPERTY_VALUE_MAX];
   15366     uint8_t oemfeatframeskipenabled = 0;
   15367 
   15368     property_get("persist.camera.imglib.of1.skip", value, "0");
   15369     oemfeatframeskipenabled = (atoi(value) > 0) ? atoi(value) : 0;
   15370 
   15371     LOGD("isOEMFeatFrameSkipEnabled %d", oemfeatframeskipenabled);
   15372     return oemfeatframeskipenabled;
   15373 }
   15374 
   15375 /*===========================================================================
   15376  * FUNCTION   : setManualCaptureMode
   15377  *
   15378  * DESCRIPTION: Function to set Manual capture modes
   15379  *
   15380  * PARAMETERS :
   15381  *   @mode : Capture mode configured
   15382  *
   15383  * RETURN     : int32_t type of status
   15384  *              NO_ERROR  -- success
   15385  *              none-zero failure code
   15386  *==========================================================================*/
   15387 int32_t QCameraParameters::setManualCaptureMode(QCameraManualCaptureModes mode)
   15388 {
   15389     int32_t rc = NO_ERROR;
   15390     char value[PROPERTY_VALUE_MAX];
   15391     int8_t count = 0;
   15392 
   15393     property_get("persist.camera.manual.capture", value, "0");
   15394     count = atoi(value);
   15395 
   15396     if (count) {
   15397         if (mode == CAM_MANUAL_CAPTURE_TYPE_OFF) {
   15398             m_ManualCaptureMode = CAM_MANUAL_CAPTURE_TYPE_1;
   15399         } else {
   15400             m_ManualCaptureMode = mode;
   15401         }
   15402     } else {
   15403         m_ManualCaptureMode = CAM_MANUAL_CAPTURE_TYPE_OFF;
   15404     }
   15405 
   15406     if (m_ManualCaptureMode == CAM_MANUAL_CAPTURE_TYPE_2) {
   15407         setOfflineRAW(FALSE);
   15408     } else if (m_ManualCaptureMode >= CAM_MANUAL_CAPTURE_TYPE_3) {
   15409         setOfflineRAW(TRUE);
   15410     } else {
   15411         setOfflineRAW(FALSE);
   15412     }
   15413     setReprocCount();
   15414     LOGH("Manual capture mode - %d", m_ManualCaptureMode);
   15415     return rc;
   15416 }
   15417 
   15418 /*===========================================================================
   15419  * FUNCTION   : isReprocScaleEnabled
   15420  *
   15421  * DESCRIPTION: Whether reprocess scale is enabled or not
   15422  *
   15423  * PARAMETERS : none
   15424  *
   15425  * RETURN     : TRUE  : Reprocess scale is enabled
   15426  *              FALSE : Reprocess scale is not enabled
   15427  *==========================================================================*/
   15428 bool QCameraParameters::isReprocScaleEnabled()
   15429 {
   15430     return m_reprocScaleParam.isScaleEnabled();
   15431 }
   15432 
   15433 /*===========================================================================
   15434  * FUNCTION   : isUnderReprocScaling
   15435  *
   15436  * DESCRIPTION: Whether image is under reprocess scaling
   15437  *
   15438  * PARAMETERS : none
   15439  *
   15440  * RETURN     : TRUE  : Image is under reprocess scaling
   15441  *              FALSE : Image is not under reprocess scaling
   15442  *==========================================================================*/
   15443 bool QCameraParameters::isUnderReprocScaling()
   15444 {
   15445     return m_reprocScaleParam.isUnderScaling();
   15446 }
   15447 
   15448 /*===========================================================================
   15449  * FUNCTION   : getPicSizeFromAPK
   15450  *
   15451  * DESCRIPTION: Get picture size set from application.
   15452  *
   15453  * PARAMETERS :
   15454  *   @width   : with set by application
   15455  *   @height  : height set by application
   15456  *
   15457  * RETURN     : int32_t type of status
   15458  *              NO_ERROR  -- success
   15459  *              none-zero failure code
   15460  *==========================================================================*/
   15461 int32_t QCameraParameters::getPicSizeFromAPK(int &width, int &height)
   15462 {
   15463     return m_reprocScaleParam.getPicSizeFromAPK(width, height);
   15464 }
   15465 
   15466 /*===========================================================================
   15467  * FUNCTION   : setDualLedCalibration
   15468  *
   15469  * DESCRIPTION: set dual led calibration
   15470  *
   15471  * PARAMETERS :
   15472  *   @params  : user setting parameters
   15473  *
   15474  * RETURN     : int32_t type of status
   15475  *              NO_ERROR  -- success
   15476  *              none-zero failure code
   15477  *==========================================================================*/
   15478 int32_t QCameraParameters::setDualLedCalibration(const QCameraParameters& params)
   15479 {
   15480     const char *str = params.get(KEY_QC_LED_CALIBRATION);
   15481     const char *prev_str = get(KEY_QC_LED_CALIBRATION);
   15482     char prop[PROPERTY_VALUE_MAX];
   15483 
   15484     property_get("persist.camera.dualled_calib", prop, "");
   15485     if (strlen(prop) > 0) {
   15486         if (prev_str == NULL || strcmp(prop, prev_str) != 0) {
   15487             return setDualLedCalibration(prop);
   15488         }
   15489     } else if (str != NULL) {
   15490         if (prev_str == NULL || strcmp(str, prev_str) != 0) {
   15491             return setDualLedCalibration(str);
   15492         }
   15493     }
   15494     return NO_ERROR;
   15495 }
   15496 
   15497 /*===========================================================================
   15498  * FUNCTION   : setDualLedCalibration
   15499  *
   15500  * DESCRIPTION: set Dual Led Calibration
   15501  *
   15502  * PARAMETERS :
   15503  *   @calibration_mode : calibration enable string
   15504  *
   15505  * RETURN     : int32_t type of status
   15506  *              NO_ERROR  -- success
   15507  *              none-zero failure code
   15508  *==========================================================================*/
   15509 int32_t QCameraParameters::setDualLedCalibration(const char *str)
   15510 {
   15511     if (str != NULL) {
   15512         int32_t value = lookupAttr(ON_OFF_MODES_MAP,
   15513             PARAM_MAP_SIZE(ON_OFF_MODES_MAP), str);
   15514         if (value != NAME_NOT_FOUND) {
   15515             LOGD("Setting led calibration mode %d", value);
   15516             updateParamEntry(KEY_QC_LED_CALIBRATION, str);
   15517 
   15518             if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   15519                     CAM_INTF_PARM_DUAL_LED_CALIBRATION, value)) {
   15520                 LOGE("Failed to update led calibration param");
   15521                 return BAD_VALUE;
   15522             }
   15523             m_dualLedCalibration = value;
   15524             return NO_ERROR;
   15525         }
   15526     }
   15527     LOGE("Invalid Calibraon Mode value: %s",
   15528             (str == NULL) ? "NULL" : str);
   15529     return BAD_VALUE;
   15530 }
   15531 
   15532 /*===========================================================================
   15533  * FUNCTION   : setinstantAEC
   15534  *
   15535  * DESCRIPTION: set instant AEC value to backend
   15536  *
   15537  * PARAMETERS :
   15538  *   @value : instant aec enabled or not.
   15539  *            0 - disable
   15540  *            1 - Enable and set agressive AEC algo to the backend
   15541  *            2 - Enable and set fast AEC algo to the backend
   15542  *
   15543  * RETURN     : int32_t type of status
   15544  *              NO_ERROR  -- success
   15545  *              none-zero failure code
   15546  *==========================================================================*/
   15547 int32_t QCameraParameters::setInstantAEC(uint8_t value, bool initCommit)
   15548 {
   15549     if (initCommit) {
   15550         if (initBatchUpdate() < 0) {
   15551             LOGE("Failed to initialize group update table");
   15552             return FAILED_TRANSACTION;
   15553         }
   15554     }
   15555 
   15556     int32_t rc = NO_ERROR;
   15557     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_PARM_INSTANT_AEC, value)) {
   15558         LOGE("Failed to instant aec value");
   15559         return BAD_VALUE;
   15560     }
   15561 
   15562     if (initCommit) {
   15563         rc = commitSetBatch();
   15564         if (NO_ERROR != rc) {
   15565             LOGE("Failed to instant aec value");
   15566             return rc;
   15567         }
   15568     }
   15569 
   15570     LOGD(" Instant AEC value set to backend %d", value);
   15571     m_bInstantAEC = value;
   15572     return rc;
   15573 }
   15574 
   15575 /*===========================================================================
   15576  * FUNCTION   : setAdvancedCaptureMode
   15577  *
   15578  * DESCRIPTION: set advanced capture mode
   15579  *
   15580  * PARAMETERS : none
   15581  *
   15582  * RETURN     : int32_t type of status
   15583  *              NO_ERROR  -- success
   15584  *              none-zero failure code
   15585  *==========================================================================*/
   15586 int32_t QCameraParameters::setAdvancedCaptureMode()
   15587 {
   15588     uint8_t value = isAdvCamFeaturesEnabled();
   15589     LOGD("updating advanced capture mode value to %d",value);
   15590     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   15591             CAM_INTF_PARM_ADV_CAPTURE_MODE, value)) {
   15592         LOGE("Failed to set advanced capture mode param");
   15593         return BAD_VALUE;
   15594     }
   15595     return NO_ERROR;
   15596 }
   15597 
   15598 /*===========================================================================
   15599  * FUNCTION   : getAnalysisInfo
   15600  *
   15601  * DESCRIPTION: Get the Analysis information based on
   15602  *     current mode and feature mask
   15603  *
   15604  * PARAMETERS :
   15605  *   @fdVideoEnabled : Whether fdVideo enabled currently
   15606  *   @videoEnabled   : Whether hal3 or hal1
   15607  *   @featureMask    : Feature mask
   15608  *   @analysis_info  : Analysis info to be filled
   15609  *
   15610  * RETURN     : int32_t type of status
   15611  *              NO_ERROR  -- success
   15612  *              none-zero failure code
   15613  *==========================================================================*/
   15614 int32_t QCameraParameters::getAnalysisInfo(
   15615         bool fdVideoEnabled,
   15616         cam_feature_mask_t featureMask,
   15617         cam_analysis_info_t *pAnalysisInfo)
   15618 {
   15619     return mCommon.getAnalysisInfo(fdVideoEnabled, featureMask, pAnalysisInfo);
   15620 }
   15621 
   15622 /*===========================================================================
   15623  * FUNCTION   : getMetaRawInfo
   15624  *
   15625  * DESCRIPTION: fetch meta raw dimension
   15626  *
   15627  * PARAMETERS :
   15628  *   @dim  : get dimension for meta raw stream
   15629  *
   15630  * RETURN     : int32_t type of status
   15631  *              NO_ERROR  -- success
   15632  *              none-zero failure code
   15633  *==========================================================================*/
   15634 int32_t QCameraParameters::getMetaRawInfo()
   15635 {
   15636     int32_t rc = NO_ERROR;
   15637     cam_dimension_t meta_stream_size;
   15638 
   15639     if(initBatchUpdate() < 0 ) {
   15640         LOGE("Failed to initialize group update table");
   15641         return BAD_TYPE;
   15642     }
   15643 
   15644     ADD_GET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   15645             CAM_INTF_META_RAW);
   15646 
   15647     rc = commitGetBatch();
   15648     if (rc != NO_ERROR) {
   15649         LOGE("Failed to get extened RAW info");
   15650         return rc;
   15651     }
   15652 
   15653     READ_PARAM_ENTRY(m_pParamBuf,
   15654             CAM_INTF_META_RAW, meta_stream_size);
   15655 
   15656     if (meta_stream_size.width == 0 || meta_stream_size.height == 0) {
   15657         LOGE("Error getting RAW size. Setting to Capability value");
   15658         meta_stream_size = m_pCapability->raw_meta_dim[0];
   15659     }
   15660     LOGH("RAW meta size. width =%d height =%d",
   15661       meta_stream_size.width, meta_stream_size.height);
   15662 
   15663     setRawSize(meta_stream_size);
   15664     m_bMetaRawEnabled = true;
   15665     return rc;
   15666 }
   15667 /*===========================================================================
   15668  * FUNCTION   : sendStreamConfigForPickRes
   15669  *
   15670  * DESCRIPTION: send Stream config info.
   15671  *
   15672  * PARAMETERS :
   15673  *   @stream_config_info: Stream config information
   15674  * RETURN     : int32_t type of status
   15675  *              NO_ERROR  -- success
   15676  *              none-zero failure code
   15677  *==========================================================================*/
   15678 bool QCameraParameters::sendStreamConfigForPickRes
   15679     (cam_stream_size_info_t &stream_config_info) {
   15680     int32_t rc = NO_ERROR;
   15681     if(initBatchUpdate() < 0 ) {
   15682         LOGE("Failed to initialize group update table");
   15683         return BAD_TYPE;
   15684     }
   15685 
   15686     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
   15687             CAM_INTF_META_STREAM_INFO_FOR_PIC_RES, stream_config_info)) {
   15688         LOGE("%s:Failed to update table");
   15689         return BAD_VALUE;
   15690     }
   15691 
   15692     rc = commitSetBatch();
   15693     if (rc != NO_ERROR) {
   15694         LOGE("Failed to set stream info parm");
   15695         return rc;
   15696     }
   15697     return rc;
   15698 }
   15699 
   15700 /*===========================================================================
   15701  * FUNCTION   : updateDtVc
   15702  *
   15703  * DESCRIPTION: Update DT and Vc from capabilities
   15704  *
   15705  * PARAMETERS :
   15706  *
   15707  * RETURN     : int32_t type of status
   15708  *              NO_ERROR  -- success
   15709  *              none-zero failure code
   15710  *==========================================================================*/
   15711 int32_t QCameraParameters::updateDtVc(int32_t *dt, int32_t *vc)
   15712 {
   15713     int32_t rc = NO_ERROR;
   15714     char prop[PROPERTY_VALUE_MAX];
   15715 
   15716     int dt_val = 0;
   15717     int vc_val = 0;
   15718 
   15719     /* Setting Dt from setprop or capability */
   15720     property_get("persist.camera.dt", prop, "0");
   15721     dt_val = atoi(prop);
   15722     if (dt_val == 0) {
   15723         dt_val = m_pCapability->dt[0];
   15724     }
   15725     *dt = dt_val;
   15726 
   15727     /*Setting vc from setprop or capability */
   15728     property_get("persist.camera.vc", prop, "-1");
   15729     vc_val = atoi(prop);
   15730     if (vc_val== -1) {
   15731         vc_val = m_pCapability->vc[0];
   15732     }
   15733     *vc = vc_val;
   15734 
   15735     LOGH("dt=%d vc=%d",*dt, *vc);
   15736     return rc;
   15737 }
   15738 /*===========================================================================
   15739  * FUNCTION   : isLinkPreviewForLiveShot()
   15740  *
   15741  * DESCRIPTION: Function to check whether link preview for liveshot or not
   15742  *
   15743  * PARAMETERS : none
   15744  *
   15745  * RETURN     : true: Thumbnail is generated from Preview stream
   15746  *              false: Thumbnail is generated from main image
   15747  *==========================================================================*/
   15748 bool QCameraParameters::isLinkPreviewForLiveShot()
   15749 {
   15750 
   15751    char prop[PROPERTY_VALUE_MAX];
   15752 
   15753    memset(prop, 0, sizeof(prop));
   15754    // 0. Thumbnail is generated from main image  (or)
   15755    // 1. Thumbnail is generated from Preview stream
   15756    property_get("persist.camera.linkpreview", prop, "1");
   15757    bool enable = atoi(prop) > 0 ? TRUE : FALSE;
   15758 
   15759    LOGD("Link preview for thumbnail %d", enable);
   15760    return enable;
   15761 }
   15762 
   15763 /*===========================================================================
   15764  * FUNCTION   : SetDualCamera
   15765  *
   15766  * DESCRIPTION: set Dual Camera
   15767  *
   15768  * PARAMETERS : bool dual camera value
   15769  *
   15770  * RETURN     : NO_ERROR  -- success
   15771  *              none-zero failure code
   15772  *==========================================================================*/
   15773 int32_t QCameraParameters::SetDualCamera(bool value)
   15774 {
   15775     LOGD("value = %d", value);
   15776     m_bDualCamera = value;
   15777     return NO_ERROR;
   15778 }
   15779 
   15780 /*===========================================================================
   15781  * FUNCTION   : setSwitchCamera
   15782  *
   15783  * DESCRIPTION: Trigger event to inform about camera role switch
   15784  *
   15785  * PARAMETERS :
   15786  *         @camMaster : Master camera
   15787  *
   15788  * RETURN     : NO_ERROR  -- success
   15789  *              none-zero failure code
   15790  *==========================================================================*/
   15791 int32_t QCameraParameters::setSwitchCamera(uint32_t camMaster)
   15792 {
   15793     int32_t rc = NO_ERROR;
   15794     cam_dual_camera_master_info_t camState[MM_CAMERA_MAX_CAM_CNT];
   15795     uint8_t num_cam = 0;
   15796 
   15797     if (camMaster == MM_CAMERA_TYPE_MAIN) {
   15798         camState[0].mode = CAM_MODE_PRIMARY;
   15799         camState[1].mode = CAM_MODE_SECONDARY;
   15800     } else if (camMaster == MM_CAMERA_TYPE_AUX) {
   15801         camState[0].mode = CAM_MODE_SECONDARY;
   15802         camState[1].mode = CAM_MODE_PRIMARY;
   15803     } else {
   15804         LOGW("Invalid master camera info");
   15805         return rc;
   15806     }
   15807 
   15808     // Update master camera
   15809     mMasterCamera = camMaster;
   15810 
   15811     num_cam = MM_CAMERA_MAX_CAM_CNT;
   15812     rc = sendDualCamCmd(CAM_DUAL_CAMERA_MASTER_INFO,
   15813               num_cam, &camState[0]);
   15814     return rc;
   15815 }
   15816 
   15817 /*===========================================================================
   15818  * FUNCTION   : setDeferCamera
   15819  *
   15820  * DESCRIPTION: configure camera in background for KPI in dual camera
   15821  *
   15822  * PARAMETERS :
   15823  *         @type : Type of defer command
   15824  *
   15825  * RETURN     : NO_ERROR  -- success
   15826  *              none-zero failure code
   15827  *==========================================================================*/
   15828 int32_t QCameraParameters::setDeferCamera(cam_dual_camera_defer_cmd_t type)
   15829 {
   15830     int32_t rc = NO_ERROR;
   15831     char prop[PROPERTY_VALUE_MAX];
   15832     int value = 0;
   15833 
   15834     property_get("persist.dualcam.defer.cam", prop, "1");
   15835     value = atoi(prop);
   15836 
   15837     cam_dual_camera_defer_cmd_t defer_val[MM_CAMERA_MAX_CAM_CNT];
   15838     memset(&defer_val[0], 0, sizeof(defer_val));
   15839 
   15840     if (value >= 0 && value < MM_CAMERA_MAX_CAM_CNT) {
   15841         defer_val[value] = type;
   15842     }
   15843     sendDualCamCmd(CAM_DUAL_CAMERA_DEFER_INFO,MM_CAMERA_MAX_CAM_CNT,
   15844             &defer_val[0]);
   15845     return rc;
   15846 }
   15847 
   15848 /*===========================================================================
   15849  * FUNCTION   : getLowPowerMode
   15850  *
   15851  * DESCRIPTION: Get Low Power Mode for the given camera
   15852  *
   15853  * PARAMETERS :
   15854  * @cam       : Camera type for which Low Power Mode is queried
   15855  *
   15856  * RETURN     : Low Power Mode with type cam_dual_camera_perf_mode_t
   15857  *==========================================================================*/
   15858 cam_dual_camera_perf_mode_t QCameraParameters::getLowPowerMode(cam_sync_type_t cam)
   15859 {
   15860     char prop[PROPERTY_VALUE_MAX];
   15861     int32_t lpm = 0;
   15862     int32_t lpmConfig = 0;
   15863 
   15864     if (cam == CAM_TYPE_MAIN) {
   15865         property_get("persist.dualcam.lpm.main", prop, "0");
   15866         lpm = atoi(prop);
   15867         lpmConfig = DUALCAM_LPM_MAIN;
   15868     } else if (cam == CAM_TYPE_AUX) {
   15869         property_get("persist.dualcam.lpm.aux", prop, "0");
   15870         lpm = atoi(prop);
   15871         lpmConfig = DUALCAM_LPM_AUX;
   15872     } else {
   15873         LOGE("Invalid camera type queried for LPM");
   15874         return CAM_PERF_NONE;
   15875     }
   15876 
   15877     if (lpm == 0) {
   15878         switch(lpmConfig) {
   15879             case SENSOR_SLEEP:
   15880                 lpm = CAM_PERF_SENSOR_SUSPEND;
   15881                 break;
   15882             case ISPIF_FRAME_DROP:
   15883                 lpm = CAM_PERF_ISPIF_FRAME_DROP;
   15884                 break;
   15885             case NONE:
   15886             default:
   15887                 lpm = CAM_PERF_NONE;
   15888                 break;
   15889         }
   15890     }
   15891     LOGD("LPM for %s camera: %d", cam == CAM_TYPE_MAIN ? "main" : "aux", lpm);
   15892     return (cam_dual_camera_perf_mode_t)lpm;
   15893 }
   15894 
   15895 
   15896 /*===========================================================================
   15897  * FUNCTION   : setCameraControls
   15898  *
   15899  * DESCRIPTION: activate or deactive camera's
   15900  *
   15901  * PARAMETERS :
   15902  *         @controls : Flag with camera bit field set in case of dual camera
   15903  *
   15904  * RETURN     : NO_ERROR  -- success
   15905  *              none-zero failure code
   15906  *==========================================================================*/
   15907 int32_t QCameraParameters::setCameraControls(int32_t state)
   15908 {
   15909     int32_t rc = NO_ERROR;
   15910     int32_t cameraControl[MM_CAMERA_MAX_CAM_CNT] = {0};
   15911     char prop[PROPERTY_VALUE_MAX];
   15912     int lpmEnable = 1;
   15913     cam_dual_camera_perf_mode_t lpmMain = CAM_PERF_NONE;
   15914     cam_dual_camera_perf_mode_t lpmAux  = CAM_PERF_NONE;
   15915 
   15916     cam_dual_camera_perf_control_t perf_value[MM_CAMERA_MAX_CAM_CNT];
   15917     uint8_t num_cam = 0;
   15918 
   15919     lpmMain = getLowPowerMode(CAM_TYPE_MAIN);
   15920     lpmAux  = getLowPowerMode(CAM_TYPE_AUX);
   15921 
   15922     // Keep the camera active if indicated by the active state or if LPM is NONE
   15923     if ((state & MM_CAMERA_TYPE_MAIN) ||
   15924             (lpmMain == CAM_PERF_NONE)) {
   15925         cameraControl[0] = 1;
   15926     } else {
   15927         cameraControl[0] = 0;
   15928     }
   15929 
   15930     // Keep the camera active if indicated by the active state or if LPM is NONE
   15931     if ((state & MM_CAMERA_TYPE_AUX)  ||
   15932             (lpmAux == CAM_PERF_NONE)) {
   15933         cameraControl[1] = 1;
   15934     } else {
   15935         cameraControl[1] = 0;
   15936     }
   15937 
   15938     perf_value[num_cam].perf_mode = lpmMain;
   15939     perf_value[num_cam].enable = cameraControl[0] ? 0 : 1;
   15940     perf_value[num_cam].priority = 0;
   15941     num_cam++;
   15942     perf_value[num_cam].perf_mode = lpmAux;
   15943     perf_value[num_cam].enable = cameraControl[1] ? 0 : 1;
   15944     perf_value[num_cam].priority = 0;
   15945     num_cam++;
   15946 
   15947     // LPM is enabled by default.
   15948     // It can disabled at the compile time using DUALCAM_LPM_ENABLE from QCameraDualCamSettings.h
   15949     // It can be disabled dynamically using the setprop persist.dualcam.lpm.enable.
   15950     property_get("persist.dualcam.lpm.enable", prop, "1");
   15951     lpmEnable = atoi(prop);
   15952 
   15953     if (DUALCAM_LPM_ENABLE == 0) {
   15954         lpmEnable = 0;
   15955     }
   15956 
   15957     if (lpmEnable == 0) {
   15958         LOGD("Dual camera: Low Power Mode disabled");
   15959         for (int i = 0; i < num_cam; ++i) {
   15960             perf_value[i].enable = 0;
   15961         }
   15962     }
   15963 
   15964     rc = sendDualCamCmd(CAM_DUAL_CAMERA_LOW_POWER_MODE,
   15965           num_cam, &perf_value[0]);
   15966 
   15967     mActiveCameras = state;
   15968 
   15969     return rc;
   15970 }
   15971 
   15972 /*===========================================================================
   15973  * FUNCTION   : setAsymmetricSnapMode
   15974  *
   15975  * DESCRIPTION: Function to detect Asymmetric Snapshot mode
   15976  *
   15977  * PARAMETERS :
   15978  *
   15979  * RETURN     :
   15980  *==========================================================================*/
   15981 void QCameraParameters::setAsymmetricSnapMode()
   15982 {
   15983     int width, height, maxWidth, maxHeight;
   15984 
   15985     if (!isDualCamera()) {
   15986         mAsymmetricSnapMode = false;
   15987         return;
   15988     }
   15989 
   15990     getPictureSize(&width, &height);
   15991     maxWidth = m_pCapability->main_cam_cap->picture_sizes_tbl[0].width;
   15992     maxHeight = m_pCapability->main_cam_cap->picture_sizes_tbl[0].height;
   15993 
   15994     if ((maxWidth * maxHeight) < (width * height)) {
   15995         mAsymmetricSnapMode = true;
   15996         return;
   15997     }
   15998 
   15999     maxWidth = m_pCapability->aux_cam_cap->picture_sizes_tbl[0].width;
   16000     maxHeight = m_pCapability->aux_cam_cap->picture_sizes_tbl[0].height;
   16001     if ((maxWidth * maxHeight) < (width * height)) {
   16002         mAsymmetricSnapMode = true;
   16003         return;
   16004     }
   16005     mAsymmetricSnapMode = false;
   16006 }
   16007 
   16008 }; // namespace qcamera
   16009