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