• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2008, The Android Open Source Project
3  * Copyright 2010, Samsung Electronics Co. LTD
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed toggle an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 /*!
19  * \file      ExynosCamera.cpp
20  * \brief     source file for CAMERA HAL MODULE
21  * \author    thun.hwang(thun.hwang@samsung.com)
22  * \date      2010/06/03
23  *
24  * <b>Revision History: </b>
25  * - 2011/12/31 : thun.hwang(thun.hwang@samsung.com) \n
26  *   Initial version
27  *
28  * - 2012/01/18 : Sangwoo, Park(sw5771.park@samsung.com) \n
29  *   Adjust Doxygen Document
30  *
31  * - 2012/02/01 : Sangwoo, Park(sw5771.park@samsung.com) \n
32  *   Adjust libv4l2
33  *   Adjust struct ExynosCameraInfo
34  *   External ISP feature
35  *
36  * - 2012/03/14 : sangwoo.park(sw5771.park@samsung.com) \n
37  *   Change file, class name to ExynosXXX.
38  */
39 
40 /**
41  * @page ExynosCamera
42  *
43  * @section Introduction
44  * ExynosCamera is for camera preview,takePicture and recording.
45  * (Currently libseccamera is included in Android Camera HAL(libcamera.so).
46  *
47  * @section Copyright
48  *  Copyright (c) 2008-2011 Samsung Electronics Co., Ltd.All rights reserved. \n
49  *  Proprietary and Confidential
50  *
51  * @image html samsung.png
52  */
53 
54 //#define LOG_NDEBUG 0
55 #define LOG_TAG "ExynosCamera"
56 
57 /* FIXME: This define will be removed when functions are stable */
58 //#define USE_DIS
59 //#define USE_3DNR
60 //#define USE_ODC
61 
62 #include <utils/Log.h>
63 
64 #include "ExynosCamera.h"
65 #include "exynos_format.h"
66 
67 using namespace android;
68 
69 namespace android {
70 
ExynosCameraInfo()71 ExynosCameraInfo::ExynosCameraInfo()
72 {
73     previewW = 2560;
74     previewH = 1920;
75     previewColorFormat = V4L2_PIX_FMT_NV21;
76     videoW = 1920;
77     videoH = 1080;
78     prefVideoPreviewW = 640;
79     prefVideoPreviewH = 360;
80     videoColorFormat = V4L2_PIX_FMT_NV12M;
81     pictureW = 2560;
82     pictureH = 1920;
83     pictureColorFormat = V4L2_PIX_FMT_YUYV;
84     thumbnailW = 320;
85     thumbnailH = 240;
86 
87     antiBandingList =
88           ExynosCamera::ANTIBANDING_OFF
89         | ExynosCamera::ANTIBANDING_50HZ
90         | ExynosCamera::ANTIBANDING_60HZ
91         | ExynosCamera::ANTIBANDING_OFF;
92     antiBanding = ExynosCamera::ANTIBANDING_OFF;
93 
94     effectList =
95           ExynosCamera::EFFECT_NONE
96         | ExynosCamera::EFFECT_MONO
97         | ExynosCamera::EFFECT_NEGATIVE
98         | ExynosCamera::EFFECT_SOLARIZE
99         | ExynosCamera::EFFECT_SEPIA
100         | ExynosCamera::EFFECT_POSTERIZE
101         | ExynosCamera::EFFECT_WHITEBOARD
102         | ExynosCamera::EFFECT_BLACKBOARD
103         | ExynosCamera::EFFECT_AQUA;
104     effect = ExynosCamera::EFFECT_NONE;
105 
106     flashModeList =
107           ExynosCamera::FLASH_MODE_OFF
108         | ExynosCamera::FLASH_MODE_AUTO
109         | ExynosCamera::FLASH_MODE_ON
110         | ExynosCamera::FLASH_MODE_RED_EYE
111         | ExynosCamera::FLASH_MODE_TORCH;
112     flashMode = ExynosCamera::FLASH_MODE_OFF;
113 
114     focusModeList =
115           ExynosCamera::FOCUS_MODE_AUTO
116         | ExynosCamera::FOCUS_MODE_INFINITY
117         | ExynosCamera::FOCUS_MODE_MACRO
118         | ExynosCamera::FOCUS_MODE_FIXED
119         | ExynosCamera::FOCUS_MODE_EDOF
120         | ExynosCamera::FOCUS_MODE_CONTINUOUS_VIDEO
121         | ExynosCamera::FOCUS_MODE_CONTINUOUS_PICTURE
122         | ExynosCamera::FOCUS_MODE_TOUCH;
123     focusMode = ExynosCamera::FOCUS_MODE_AUTO;
124 
125     sceneModeList =
126           ExynosCamera::SCENE_MODE_AUTO
127         | ExynosCamera::SCENE_MODE_ACTION
128         | ExynosCamera::SCENE_MODE_PORTRAIT
129         | ExynosCamera::SCENE_MODE_LANDSCAPE
130         | ExynosCamera::SCENE_MODE_NIGHT
131         | ExynosCamera::SCENE_MODE_NIGHT_PORTRAIT
132         | ExynosCamera::SCENE_MODE_THEATRE
133         | ExynosCamera::SCENE_MODE_BEACH
134         | ExynosCamera::SCENE_MODE_SNOW
135         | ExynosCamera::SCENE_MODE_SUNSET
136         | ExynosCamera::SCENE_MODE_STEADYPHOTO
137         | ExynosCamera::SCENE_MODE_FIREWORKS
138         | ExynosCamera::SCENE_MODE_SPORTS
139         | ExynosCamera::SCENE_MODE_PARTY
140         | ExynosCamera::SCENE_MODE_CANDLELIGHT;
141     sceneMode = ExynosCamera::SCENE_MODE_AUTO;
142 
143     whiteBalanceList =
144           ExynosCamera::WHITE_BALANCE_AUTO
145         | ExynosCamera::WHITE_BALANCE_INCANDESCENT
146         | ExynosCamera::WHITE_BALANCE_FLUORESCENT
147         | ExynosCamera::WHITE_BALANCE_WARM_FLUORESCENT
148         | ExynosCamera::WHITE_BALANCE_DAYLIGHT
149         | ExynosCamera::WHITE_BALANCE_CLOUDY_DAYLIGHT
150         | ExynosCamera::WHITE_BALANCE_TWILIGHT
151         | ExynosCamera::WHITE_BALANCE_SHADE;
152     whiteBalance = ExynosCamera::WHITE_BALANCE_AUTO;
153 
154     autoWhiteBalanceLockSupported = false;
155     autoWhiteBalanceLock = false;
156 
157     rotation = 0;
158     minExposure = -2;
159     maxExposure = 2;
160     exposure = 0;
161 
162     autoExposureLockSupported = false;
163     autoExposureLock = false;
164 
165     fps = 30;
166     focalLengthNum = 9;
167     focalLengthDen = 10;
168     supportVideoStabilization = false;
169     applyVideoStabilization = false;
170     videoStabilization = false;
171     maxNumMeteringAreas = 0;
172     maxNumDetectedFaces = 0;
173     maxNumFocusAreas = 0;
174     maxZoom = ZOOM_LEVEL_MAX;
175     hwZoomSupported = false;
176     zoom = 0;
177     gpsAltitude = 0;
178     gpsLatitude = 0;
179     gpsLongitude = 0;
180     gpsTimestamp = 0;
181 
182     // Additional API default Value.
183     angle = 0;
184     antiShake = false;
185     beautyShot = false;
186     brightness = 0;
187     contrast = ExynosCamera::CONTRAST_DEFAULT;
188     gamma = false;
189     hue = 2; // 2 is default;
190     iso = 0;
191     metering = ExynosCamera::METERING_MODE_CENTER;
192     objectTracking = false;
193     objectTrackingStart = false;
194     saturation = 0;
195     sharpness = 0;
196     shotMode = ExynosCamera::SHOT_MODE_SINGLE;
197     slowAE = false;
198     smartAuto = false;
199     touchAfStart = false;
200     wdr = false;
201     tdnr = false;
202     odc = false;
203 }
204 
ExynosCameraInfoM5M0()205 ExynosCameraInfoM5M0::ExynosCameraInfoM5M0()
206 {
207     previewW = 1280;
208     previewH = 720;
209     previewColorFormat = V4L2_PIX_FMT_YVU420M;
210     videoW = 1280;
211     videoH = 720;
212     prefVideoPreviewW = 640;
213     prefVideoPreviewH = 360;
214     videoColorFormat = V4L2_PIX_FMT_NV12M;
215     pictureW = 1280;
216     pictureH = 720;
217     pictureColorFormat = V4L2_PIX_FMT_YUYV;
218     thumbnailW = 320;
219     thumbnailH = 240;
220 
221     antiBandingList = ExynosCamera::ANTIBANDING_OFF;
222     antiBanding = ExynosCamera::ANTIBANDING_OFF;
223 
224     effectList =
225           ExynosCamera::EFFECT_NONE
226         | ExynosCamera::EFFECT_MONO
227         | ExynosCamera::EFFECT_NEGATIVE
228         //| ExynosCamera::EFFECT_SOLARIZE
229         | ExynosCamera::EFFECT_SEPIA
230         //| ExynosCamera::EFFECT_POSTERIZE
231         //| ExynosCamera::EFFECT_WHITEBOARD
232         //| ExynosCamera::EFFECT_BLACKBOARD
233         | ExynosCamera::EFFECT_AQUA;
234     effect = ExynosCamera::EFFECT_NONE;
235 
236     flashModeList =
237           ExynosCamera::FLASH_MODE_OFF
238         | ExynosCamera::FLASH_MODE_AUTO
239         | ExynosCamera::FLASH_MODE_ON
240         | ExynosCamera::FLASH_MODE_RED_EYE
241         | ExynosCamera::FLASH_MODE_TORCH;
242     flashMode = ExynosCamera::FLASH_MODE_OFF;
243 
244     focusModeList =
245           ExynosCamera::FOCUS_MODE_AUTO
246         | ExynosCamera::FOCUS_MODE_INFINITY
247         | ExynosCamera::FOCUS_MODE_MACRO
248         //| ExynosCamera::FOCUS_MODE_FIXED
249         //| ExynosCamera::FOCUS_MODE_EDOF
250         //| ExynosCamera::FOCUS_MODE_CONTINUOUS_VIDEO
251         //| ExynosCamera::FOCUS_MODE_CONTINUOUS_PICTURE
252         //| ExynosCamera::FOCUS_MODE_TOUCH
253         ;
254     focusMode = ExynosCamera::FOCUS_MODE_AUTO;
255 
256     sceneModeList =
257           ExynosCamera::SCENE_MODE_AUTO
258         //| ExynosCamera::SCENE_MODE_ACTION
259         | ExynosCamera::SCENE_MODE_PORTRAIT
260         | ExynosCamera::SCENE_MODE_LANDSCAPE
261         | ExynosCamera::SCENE_MODE_NIGHT
262         //| ExynosCamera::SCENE_MODE_NIGHT_PORTRAIT
263         //| ExynosCamera::SCENE_MODE_THEATRE
264         | ExynosCamera::SCENE_MODE_BEACH
265         | ExynosCamera::SCENE_MODE_SNOW
266         | ExynosCamera::SCENE_MODE_SUNSET
267         //| ExynosCamera::SCENE_MODE_STEADYPHOTO
268         | ExynosCamera::SCENE_MODE_FIREWORKS
269         | ExynosCamera::SCENE_MODE_SPORTS
270         | ExynosCamera::SCENE_MODE_PARTY
271         | ExynosCamera::SCENE_MODE_CANDLELIGHT;
272     sceneMode = ExynosCamera::SCENE_MODE_AUTO;
273 
274     whiteBalanceList =
275           ExynosCamera::WHITE_BALANCE_AUTO
276         | ExynosCamera::WHITE_BALANCE_INCANDESCENT
277         | ExynosCamera::WHITE_BALANCE_FLUORESCENT
278         //| ExynosCamera::WHITE_BALANCE_WARM_FLUORESCENT
279         | ExynosCamera::WHITE_BALANCE_DAYLIGHT
280         | ExynosCamera::WHITE_BALANCE_CLOUDY_DAYLIGHT
281         //| ExynosCamera::WHITE_BALANCE_TWILIGHT
282         //| ExynosCamera::WHITE_BALANCE_SHADE
283         ;
284     whiteBalance = ExynosCamera::WHITE_BALANCE_AUTO;
285 
286     autoWhiteBalanceLockSupported = false;
287     autoWhiteBalanceLock = false;
288 
289     rotation = 0;
290     minExposure = -2;
291     maxExposure = 2;
292     exposure = 0;
293 
294     autoExposureLockSupported = false;
295     autoExposureLock = false;
296 
297     fps = 30;
298     focalLengthNum = 343;
299     focalLengthDen = 100;
300     supportVideoStabilization = false;
301     applyVideoStabilization = false;
302     videoStabilization = false;
303     maxNumMeteringAreas = 64;
304     maxNumDetectedFaces = 16;
305     maxNumFocusAreas = 2;
306     maxZoom = ZOOM_LEVEL_MAX;
307     hwZoomSupported = false;
308     zoom = 0;
309     gpsAltitude = 0;
310     gpsLatitude = 0;
311     gpsLongitude = 0;
312     gpsTimestamp = 0;
313 }
314 
ExynosCameraInfoS5K6A3()315 ExynosCameraInfoS5K6A3::ExynosCameraInfoS5K6A3()
316 {
317     previewW = 1280;
318     previewH =  720;
319     previewColorFormat = V4L2_PIX_FMT_YVU420M;
320     videoW = 1280;
321     videoH =  720;
322     prefVideoPreviewW = 640;
323     prefVideoPreviewH = 360;
324     videoColorFormat = V4L2_PIX_FMT_NV12M;
325     pictureW = 1280;
326     pictureH =  720;
327     pictureColorFormat = V4L2_PIX_FMT_YUYV;
328     thumbnailW = 320;
329     thumbnailH = 240;
330 
331     antiBandingList =
332           ExynosCamera::ANTIBANDING_OFF
333         | ExynosCamera::ANTIBANDING_50HZ
334         | ExynosCamera::ANTIBANDING_60HZ
335         | ExynosCamera::ANTIBANDING_OFF;
336     antiBanding = ExynosCamera::ANTIBANDING_OFF;
337 
338     effectList =
339           ExynosCamera::EFFECT_NONE
340         | ExynosCamera::EFFECT_MONO
341         | ExynosCamera::EFFECT_NEGATIVE
342         //| ExynosCamera::EFFECT_SOLARIZE
343         | ExynosCamera::EFFECT_SEPIA
344         //| ExynosCamera::EFFECT_POSTERIZE
345         //| ExynosCamera::EFFECT_WHITEBOARD
346         //| ExynosCamera::EFFECT_BLACKBOARD
347         //| ExynosCamera::EFFECT_AQUA
348         ;
349     effect = ExynosCamera::EFFECT_NONE;
350 
351     flashModeList =
352           ExynosCamera::FLASH_MODE_OFF
353         //| ExynosCamera::FLASH_MODE_AUTO
354         //| ExynosCamera::FLASH_MODE_ON
355         //| ExynosCamera::FLASH_MODE_RED_EYE
356         //| ExynosCamera::FLASH_MODE_TORCH
357         ;
358     flashMode = ExynosCamera::FLASH_MODE_OFF;
359 
360     focusModeList =
361         //  ExynosCamera::FOCUS_MODE_AUTO
362         //| ExynosCamera::FOCUS_MODE_INFINITY
363         //| ExynosCamera::FOCUS_MODE_MACRO
364         //|
365         ExynosCamera::FOCUS_MODE_FIXED
366         //| ExynosCamera::FOCUS_MODE_EDOF
367         //| ExynosCamera::FOCUS_MODE_CONTINUOUS_VIDEO
368         //| ExynosCamera::FOCUS_MODE_CONTINUOUS_PICTURE
369         //| ExynosCamera::FOCUS_MODE_TOUCH
370         ;
371     focusMode = ExynosCamera::FOCUS_MODE_FIXED;
372 
373     sceneModeList =
374           ExynosCamera::SCENE_MODE_AUTO
375         //| ExynosCamera::SCENE_MODE_ACTION
376         | ExynosCamera::SCENE_MODE_PORTRAIT
377         | ExynosCamera::SCENE_MODE_LANDSCAPE
378         | ExynosCamera::SCENE_MODE_NIGHT
379         //| ExynosCamera::SCENE_MODE_NIGHT_PORTRAIT
380         //| ExynosCamera::SCENE_MODE_THEATRE
381         | ExynosCamera::SCENE_MODE_BEACH
382         | ExynosCamera::SCENE_MODE_SNOW
383         | ExynosCamera::SCENE_MODE_SUNSET
384         | ExynosCamera::SCENE_MODE_STEADYPHOTO
385         | ExynosCamera::SCENE_MODE_FIREWORKS
386         | ExynosCamera::SCENE_MODE_SPORTS
387         | ExynosCamera::SCENE_MODE_PARTY
388         | ExynosCamera::SCENE_MODE_CANDLELIGHT;
389     sceneMode = ExynosCamera::SCENE_MODE_AUTO;
390 
391     whiteBalanceList =
392           ExynosCamera::WHITE_BALANCE_AUTO
393         | ExynosCamera::WHITE_BALANCE_INCANDESCENT
394         | ExynosCamera::WHITE_BALANCE_FLUORESCENT
395         //| ExynosCamera::WHITE_BALANCE_WARM_FLUORESCENT
396         | ExynosCamera::WHITE_BALANCE_DAYLIGHT
397         | ExynosCamera::WHITE_BALANCE_CLOUDY_DAYLIGHT
398         //| ExynosCamera::WHITE_BALANCE_TWILIGHT
399         //| ExynosCamera::WHITE_BALANCE_SHADE
400         ;
401     whiteBalance = ExynosCamera::WHITE_BALANCE_AUTO;
402 
403     autoWhiteBalanceLockSupported = true;
404     autoWhiteBalanceLock = false;
405 
406     rotation = 0;
407     minExposure = -2;
408     maxExposure = 2;
409     exposure = 0;
410 
411     autoExposureLockSupported = true;
412     autoExposureLock = false;
413 
414     fps = 30;
415     focalLengthNum = 9;
416     focalLengthDen = 10;
417     supportVideoStabilization = false;
418     applyVideoStabilization = false;
419     videoStabilization = false;
420     maxNumMeteringAreas = 64;
421     maxNumDetectedFaces = 16;
422     maxNumFocusAreas = 0;
423     maxZoom = ZOOM_LEVEL_MAX;
424     hwZoomSupported = false;
425     zoom = 0;
426     gpsAltitude = 0;
427     gpsLatitude = 0;
428     gpsLongitude = 0;
429     gpsTimestamp = 0;
430 }
431 
ExynosCameraInfoS5K4E5()432 ExynosCameraInfoS5K4E5::ExynosCameraInfoS5K4E5()
433 {
434     previewW = 1920;
435     previewH = 1080;
436     previewColorFormat = V4L2_PIX_FMT_YVU420M;
437     videoW = 1920;
438     videoH = 1080;
439     prefVideoPreviewW = 640;
440     prefVideoPreviewH = 360;
441     videoColorFormat = V4L2_PIX_FMT_NV12M;
442     pictureW = 2560;
443     pictureH = 1920;
444     pictureColorFormat = V4L2_PIX_FMT_YUYV;
445     thumbnailW = 320;
446     thumbnailH = 240;
447 
448     antiBandingList =
449           ExynosCamera::ANTIBANDING_OFF
450         | ExynosCamera::ANTIBANDING_50HZ
451         | ExynosCamera::ANTIBANDING_60HZ
452         | ExynosCamera::ANTIBANDING_OFF;
453     antiBanding = ExynosCamera::ANTIBANDING_OFF;
454 
455     effectList =
456           ExynosCamera::EFFECT_NONE
457         | ExynosCamera::EFFECT_MONO
458         | ExynosCamera::EFFECT_NEGATIVE
459         //| ExynosCamera::EFFECT_SOLARIZE
460         | ExynosCamera::EFFECT_SEPIA
461         //| ExynosCamera::EFFECT_POSTERIZE
462         //| ExynosCamera::EFFECT_WHITEBOARD
463         //| ExynosCamera::EFFECT_BLACKBOARD
464         //| ExynosCamera::EFFECT_AQUA
465         ;
466     effect = ExynosCamera::EFFECT_NONE;
467 
468     flashModeList =
469           ExynosCamera::FLASH_MODE_OFF
470         | ExynosCamera::FLASH_MODE_AUTO
471         | ExynosCamera::FLASH_MODE_ON
472         //| ExynosCamera::FLASH_MODE_RED_EYE
473         | ExynosCamera::FLASH_MODE_TORCH;
474     flashMode = ExynosCamera::FLASH_MODE_OFF;
475 
476     focusModeList =
477           ExynosCamera::FOCUS_MODE_AUTO
478         | ExynosCamera::FOCUS_MODE_INFINITY
479         | ExynosCamera::FOCUS_MODE_MACRO
480         //| ExynosCamera::FOCUS_MODE_FIXED
481         //| ExynosCamera::FOCUS_MODE_EDOF
482         | ExynosCamera::FOCUS_MODE_CONTINUOUS_VIDEO
483     //    | ExynosCamera::FOCUS_MODE_CONTINUOUS_PICTURE
484         | ExynosCamera::FOCUS_MODE_TOUCH
485         ;
486     focusMode = ExynosCamera::FOCUS_MODE_AUTO;
487 
488     sceneModeList =
489           ExynosCamera::SCENE_MODE_AUTO
490         //| ExynosCamera::SCENE_MODE_ACTION
491         | ExynosCamera::SCENE_MODE_PORTRAIT
492         | ExynosCamera::SCENE_MODE_LANDSCAPE
493         | ExynosCamera::SCENE_MODE_NIGHT
494         //| ExynosCamera::SCENE_MODE_NIGHT_PORTRAIT
495         //| ExynosCamera::SCENE_MODE_THEATRE
496         | ExynosCamera::SCENE_MODE_BEACH
497         | ExynosCamera::SCENE_MODE_SNOW
498         | ExynosCamera::SCENE_MODE_SUNSET
499         | ExynosCamera::SCENE_MODE_STEADYPHOTO
500         | ExynosCamera::SCENE_MODE_FIREWORKS
501         | ExynosCamera::SCENE_MODE_SPORTS
502         | ExynosCamera::SCENE_MODE_PARTY
503         | ExynosCamera::SCENE_MODE_CANDLELIGHT;
504     sceneMode = ExynosCamera::SCENE_MODE_AUTO;
505 
506     whiteBalanceList =
507           ExynosCamera::WHITE_BALANCE_AUTO
508         | ExynosCamera::WHITE_BALANCE_INCANDESCENT
509         | ExynosCamera::WHITE_BALANCE_FLUORESCENT
510         //| ExynosCamera::WHITE_BALANCE_WARM_FLUORESCENT
511         | ExynosCamera::WHITE_BALANCE_DAYLIGHT
512         | ExynosCamera::WHITE_BALANCE_CLOUDY_DAYLIGHT
513         //| ExynosCamera::WHITE_BALANCE_TWILIGHT
514         //| ExynosCamera::WHITE_BALANCE_SHADE
515         ;
516     whiteBalance = ExynosCamera::WHITE_BALANCE_AUTO;
517 
518     autoWhiteBalanceLockSupported = true;
519     autoWhiteBalanceLock = false;
520 
521     rotation = 0;
522     minExposure = -2;
523     maxExposure = 2;
524     exposure = 0;
525 
526     autoExposureLockSupported = true;
527     autoExposureLock = false;
528 
529     fps = 30;
530     focalLengthNum = 9;
531     focalLengthDen = 10;
532     supportVideoStabilization = true;
533     applyVideoStabilization = false;
534     videoStabilization = false;
535     maxNumMeteringAreas = 64;
536     maxNumDetectedFaces = 16;
537     maxNumFocusAreas = 2;
538     maxZoom = ZOOM_LEVEL_MAX;
539     hwZoomSupported = false;
540     zoom = 0;
541     gpsAltitude = 0;
542     gpsLatitude = 0;
543     gpsLongitude = 0;
544     gpsTimestamp = 0;
545 }
546 
547 //////////////////////////////////////////////////
548 
549 #define PFX_NODE                            "/dev/video"
550 
551 #define M5MOLS_ENTITY_NAME                  "M5MOLS 5-001f"
552 #define PFX_SUBDEV_ENTITY_MIPI_CSIS         "s5p-mipi-csis"
553 #define PFX_SUBDEV_ENTITY_FLITE             "flite-subdev"
554 #define PFX_SUBDEV_ENTITY_GSC_CAP           "gsc-cap-subdev"
555 #define PFX_VIDEODEV_ENTITY_FLITE           "exynos-fimc-lite"
556 #define PFX_VIDEODEV_ENTITY_GSC_CAP         "exynos-gsc"
557 
558 #define MEDIA_DEV_INTERNAL_ISP              "/dev/media2"
559 #define MEDIA_DEV_EXTERNAL_ISP              "/dev/media1"
560 #define ISP_VD_NODE_OFFSET                  (40)              //INTERNAL_ISP
561 #define FLITE_VD_NODE_OFFSET                (36)              //External ISP
562 
563 #define VIDEO_NODE_PREVIEW_ID               (3)
564 #define VIDEO_NODE_RECODING_ID              (2)
565 #define VIDEO_NODE_SNAPSHOT_ID              (1)
566 
567 #define ISP_SENSOR_MAX_ENTITIES             1
568 #define ISP_SENSOR_PAD_SOURCE_FRONT         0
569 #define ISP_SENSOR_PADS_NUM                 1
570 
571 #define ISP_FRONT_MAX_ENTITIES              1
572 #define ISP_FRONT_PAD_SINK                  0
573 #define ISP_FRONT_PAD_SOURCE_BACK           1
574 #define ISP_FRONT_PAD_SOURCE_BAYER          2
575 #define ISP_FRONT_PAD_SOURCE_SCALERC        3
576 #define ISP_FRONT_PADS_NUM                  4
577 
578 #define ISP_BACK_MAX_ENTITIES               1
579 #define ISP_BACK_PAD_SINK                   0
580 #define ISP_BACK_PAD_SOURCE_3DNR            1
581 #define ISP_BACK_PAD_SOURCE_SCALERP         2
582 #define ISP_BACK_PADS_NUM                   3
583 
584 #define ISP_MODULE_NAME                     "exynos5-fimc-is"
585 #define ISP_SENSOR_ENTITY_NAME              "exynos5-fimc-is-sensor"
586 #define ISP_FRONT_ENTITY_NAME               "exynos5-fimc-is-front"
587 #define ISP_BACK_ENTITY_NAME                "exynos5-fimc-is-back"
588 #define ISP_VIDEO_BAYER_NAME                "exynos5-fimc-is-bayer"
589 #define ISP_VIDEO_SCALERC_NAME              "exynos5-fimc-is-scalerc"
590 #define ISP_VIDEO_3DNR_NAME                 "exynos5-fimc-is-3dnr"
591 #define ISP_VIDEO_SCALERP_NAME              "exynos5-fimc-is-scalerp"
592 
593 #define MIPI_NUM                            1
594 #define FLITE_NUM                           1
595 #define GSC_NUM                             0
596 
597 #define PFX_SUBDEV_NODE                     "/dev/v4l-subdev"
598 
599 /*
600  * V 4 L 2   F I M C   E X T E N S I O N S
601  *
602  */
603 #define V4L2_CID_ROTATION                   (V4L2_CID_PRIVATE_BASE + 0)
604 #define V4L2_CID_PADDR_Y                    (V4L2_CID_PRIVATE_BASE + 1)
605 #define V4L2_CID_PADDR_CB                   (V4L2_CID_PRIVATE_BASE + 2)
606 #define V4L2_CID_PADDR_CR                   (V4L2_CID_PRIVATE_BASE + 3)
607 #define V4L2_CID_PADDR_CBCR                 (V4L2_CID_PRIVATE_BASE + 4)
608 #define V4L2_CID_STREAM_PAUSE               (V4L2_CID_PRIVATE_BASE + 53)
609 
610 #define V4L2_CID_CAM_JPEG_MAIN_SIZE         (V4L2_CID_PRIVATE_BASE + 32)
611 #define V4L2_CID_CAM_JPEG_MAIN_OFFSET       (V4L2_CID_PRIVATE_BASE + 33)
612 #define V4L2_CID_CAM_JPEG_THUMB_SIZE        (V4L2_CID_PRIVATE_BASE + 34)
613 #define V4L2_CID_CAM_JPEG_THUMB_OFFSET      (V4L2_CID_PRIVATE_BASE + 35)
614 #define V4L2_CID_CAM_JPEG_POSTVIEW_OFFSET   (V4L2_CID_PRIVATE_BASE + 36)
615 #define V4L2_CID_CAM_JPEG_QUALITY           (V4L2_CID_PRIVATE_BASE + 37)
616 
617 #define V4L2_PIX_FMT_YVYU           v4l2_fourcc('Y', 'V', 'Y', 'U')
618 
619 /* FOURCC for FIMC specific */
620 #define V4L2_PIX_FMT_VYUY           v4l2_fourcc('V', 'Y', 'U', 'Y')
621 #define V4L2_PIX_FMT_NV16           v4l2_fourcc('N', 'V', '1', '6')
622 #define V4L2_PIX_FMT_NV61           v4l2_fourcc('N', 'V', '6', '1')
623 #define V4L2_PIX_FMT_NV12T          v4l2_fourcc('T', 'V', '1', '2')
624 
625 ///////////////////////////////////////////////////
626 // Google Official API : Camera.Parameters
627 // http://developer.android.com/reference/android/hardware/Camera.Parameters.html
628 ///////////////////////////////////////////////////
629 
ExynosCamera()630 ExynosCamera::ExynosCamera() :
631         m_flagCreate(false),
632         m_cameraId(CAMERA_ID_BACK),
633         m_defaultCameraInfo(NULL),
634         m_curCameraInfo(NULL),
635         m_jpegQuality(100),
636         m_jpegThumbnailQuality(100),
637         m_currentZoom(-1)
638 {
639     memset(&m_sensorDev, 0, sizeof(struct devInfo));
640     memset(&m_mipiDev, 0, sizeof(struct devInfo));
641     memset(&m_fliteDev, 0, sizeof(struct devInfo));
642     memset(&m_gscPreviewDev, 0, sizeof(struct devInfo));
643     memset(&m_gscVideoDev, 0, sizeof(struct devInfo));
644     memset(&m_gscPictureDev, 0, sizeof(struct devInfo));
645 
646     m_previewDev = NULL;
647     m_videoDev   = NULL;
648     m_pictureDev = NULL;
649 
650     m_tryPreviewStop = true;
651     m_tryVideoStop   = true;
652     m_tryPictureStop = true;
653 
654     m_flagStartFaceDetection = false;
655     m_flagAutoFocusRunning = false;
656 
657     m_sensorEntity = NULL;
658     m_mipiEntity = NULL;
659     m_fliteSdEntity = NULL;
660     m_fliteVdEntity = NULL;
661     m_gscSdEntity = NULL;
662     m_gscVdEntity = NULL;
663     m_ispSensorEntity = NULL;
664     m_ispFrontEntity = NULL;
665     m_ispBackEntity = NULL;
666     m_ispScalercEntity = NULL;
667     m_ispScalerpEntity = NULL;
668     m_isp3dnrEntity = NULL;
669 
670 
671     for (int i = 0; i < VIDEO_MAX_FRAME; i++) {
672         m_validPreviewBuf[i] = false;
673         m_validVideoBuf  [i] = false;
674         m_validPictureBuf[i] = false;
675     }
676 
677     memset((void *)m_cameraName, 0, 32);
678 
679     m_internalISP = true;
680     m_media = NULL;
681 
682     memset(&mExifInfo, 0, sizeof(mExifInfo));
683 }
684 
~ExynosCamera()685 ExynosCamera::~ExynosCamera()
686 {
687     if (m_flagCreate == true)
688         destroy();
689 }
690 
create(int cameraId)691 bool ExynosCamera::create(int cameraId)
692 {
693     int ret = 0;
694     unsigned int i;
695     int devNum;
696     char node[30];
697 
698     struct media_link   *links = NULL;
699 
700     if (m_flagCreate == true) {
701         ALOGE("ERR(%s):Already created", __func__);
702         return false;
703     }
704 
705     m_cameraId = cameraId;
706 
707     ExynosBuffer nullBuf;
708 
709     for (int i = 0; i < VIDEO_MAX_FRAME; i++) {
710         m_validPreviewBuf[i] = false;
711         m_validVideoBuf  [i] = false;
712         m_validPictureBuf[i] = false;
713 
714         m_previewBuf[i] = nullBuf;
715         m_videoBuf[i]   = nullBuf;
716         m_pictureBuf[i] = nullBuf;
717     }
718 
719     if (m_cameraId == CAMERA_ID_BACK)
720         m_internalISP = true;
721         // m_internalISP = false; // external ISP.
722     else
723         m_internalISP = true;
724 
725     if (m_internalISP == true) {
726         //////////////////////////////
727         //  internal ISP
728         //////////////////////////////
729         // media device open
730         m_media = exynos_media_open(MEDIA_DEV_INTERNAL_ISP);
731         if (m_media == NULL) {
732             ALOGE("ERR(%s):Cannot open media device (error : %s)", __func__, strerror(errno));
733             goto err;
734         }
735 
736         //////////////////
737         // GET ENTITIES
738         //////////////////
739         // ISP sensor subdev
740         memset(&node, 0x00, sizeof(node));
741         strcpy(node, ISP_SENSOR_ENTITY_NAME);
742         m_ispSensorEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
743 
744         // ISP front subdev
745         memset(&node, 0x00, sizeof(node));
746         strcpy(node, ISP_FRONT_ENTITY_NAME);
747         m_ispFrontEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
748 
749         // ISP back subdev
750         memset(&node, 0x00, sizeof(node));
751         strcpy(node, ISP_BACK_ENTITY_NAME);
752         m_ispBackEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
753 
754         // ISP ScalerC video node
755         memset(&node, 0x00, sizeof(node));
756         strcpy(node, ISP_VIDEO_SCALERC_NAME);
757         m_ispScalercEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
758 
759         // ISP ScalerP video node
760         memset(&node, 0x00, sizeof(node));
761         strcpy(node, ISP_VIDEO_SCALERP_NAME);
762         m_ispScalerpEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
763 
764         // ISP 3DNR video node
765         memset(&node, 0x00, sizeof(node));
766         strcpy(node, ISP_VIDEO_3DNR_NAME);
767         m_isp3dnrEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
768 
769         ALOGV("DEBUG(%s):m_ispSensorEntity  : numlink : %d", __func__, m_ispSensorEntity->num_links);
770         ALOGV("DEBUG(%s):m_ispFrontEntity   : numlink : %d", __func__, m_ispFrontEntity->num_links);
771         ALOGV("DEBUG(%s):m_ispBackEntity    : numlink : %d", __func__, m_ispBackEntity->num_links);
772         ALOGV("DEBUG(%s):m_ispScalercEntity : numlink : %d", __func__, m_ispScalercEntity->num_links);
773         ALOGV("DEBUG(%s):m_ispScalerpEntity : numlink : %d", __func__, m_ispScalerpEntity->num_links);
774         ALOGV("DEBUG(%s):m_isp3dnrEntity    : numlink : %d", __func__, m_isp3dnrEntity->num_links);
775 
776         //////////////////
777         // SETUP LINKS
778         //////////////////
779         // SENSOR TO FRONT
780         links = m_ispSensorEntity->links;
781         if (links == NULL ||
782             links->source->entity != m_ispSensorEntity ||
783             links->sink->entity != m_ispFrontEntity) {
784             ALOGE("ERR(%s):Can not make link isp_sensor to isp_front", __func__);
785             goto err;
786         } else if (exynos_media_setup_link(m_media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
787             ALOGE("ERR(%s):Can not make setup isp_sensor to isp_front", __func__);
788             goto err;
789         }
790         ALOGV("DEBUG(%s):[LINK SUCCESS] Sensor to front", __func__);
791 
792         // FRONT TO BACK
793         for (i = 0; i < m_ispFrontEntity->num_links; i++) {
794             links = &m_ispFrontEntity->links[i];
795             if (links == NULL ||
796                 links->source->entity != m_ispFrontEntity ||
797                 links->sink->entity != m_ispBackEntity) {
798                 ALOGV("DEBUG(%s):i=%d: links->source->entity : %p, m_ispFrontEntity : %p", __func__, i,
799                     links->source->entity, m_ispFrontEntity);
800                 ALOGV("DEBUG(%s):i=%d: links->sink->entity : %p, m_ispBackEntity : %p", __func__, i,
801                     links->sink->entity, m_ispBackEntity);
802                 continue;
803             } else if (exynos_media_setup_link(m_media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
804                 ALOGE("ERR(%s):Can not make setup isp_front to isp_back", __func__);
805                 goto err;
806             }
807         }
808         ALOGV("DEBUG(%s):[LINK SUCCESS] front to back", __func__);
809 
810         // BACK TO ScalerP Video
811         for (i = 0; i < m_ispBackEntity->num_links; i++) {
812             links = &m_ispBackEntity->links[i];
813             if (links == NULL ||
814                 links->source->entity != m_ispBackEntity ||
815                 links->sink->entity != m_ispScalerpEntity) {
816                 ALOGV("DEBUG(%s):i=%d: links->source->entity : %p, m_ispBackEntity : %p", __func__, i,
817                     links->source->entity, m_ispBackEntity);
818                 ALOGV("DEBUG(%s):i=%d: links->sink->entity : %p, m_ispScalerpEntity : %p", __func__, i,
819                     links->sink->entity, m_ispScalerpEntity);
820                 continue;
821             } else if (exynos_media_setup_link(m_media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
822                 ALOGE("ERR(%s):Can not make setup isp_back to scalerP", __func__);
823                 goto err;
824             }
825         }
826         ALOGV("DEBUG(%s):[LINK SUCCESS] back to scalerP", __func__);
827 
828         sprintf(node, "%s%d", PFX_NODE, (ISP_VD_NODE_OFFSET + VIDEO_NODE_PREVIEW_ID));
829         m_gscPreviewDev.fd = exynos_v4l2_open(node, O_RDWR, 0);
830         if (m_gscPreviewDev.fd <= 0) {
831             ALOGE("ERR(%s):exynos_v4l2_open(%s) fail (error : %s)", __func__, node, strerror(errno));
832             goto err;
833         }
834         m_previewDev = &m_gscPreviewDev;
835 
836         sprintf(node, "%s%d", PFX_NODE, (ISP_VD_NODE_OFFSET + VIDEO_NODE_RECODING_ID));
837         m_gscVideoDev.fd = exynos_v4l2_open(node, O_RDWR, 0);
838         if (m_gscVideoDev.fd <= 0) {
839             ALOGE("ERR(%s):exynos_v4l2_open(%s) fail (error : %s)", __func__, node, strerror(errno));
840             goto err;
841         }
842         m_videoDev = &m_gscVideoDev;
843 
844         sprintf(node, "%s%d", PFX_NODE, (ISP_VD_NODE_OFFSET + VIDEO_NODE_SNAPSHOT_ID));
845         m_gscPictureDev.fd = exynos_v4l2_open(node, O_RDWR, 0);
846         if (m_gscPictureDev.fd <= 0) {
847             ALOGE("ERR(%s):exynos_v4l2_open(%s) fail (error : %s)", __func__, node, strerror(errno));
848             goto err;
849         }
850         m_pictureDev = &m_gscPictureDev;
851 
852     } else {
853         //////////////////////////////
854         //  external ISP
855         //////////////////////////////
856         // media device open
857         m_media = exynos_media_open(MEDIA_DEV_EXTERNAL_ISP);
858         if (m_media == NULL) {
859             ALOGE("ERR(%s):Cannot open media device (error : %s)", __func__, strerror(errno));
860             goto err;
861         }
862 
863         //////////////////
864         // GET ENTITIES
865         //////////////////
866         // camera subdev
867         strcpy(node, M5MOLS_ENTITY_NAME);
868         ALOGV("DEBUG(%s):node : %s", __func__, node);
869         m_sensorEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
870         ALOGV("DEBUG(%s):m_sensorEntity : 0x%p", __func__, m_sensorEntity);
871 
872         // mipi subdev
873         sprintf(node, "%s.%d", PFX_SUBDEV_ENTITY_MIPI_CSIS, MIPI_NUM);
874         ALOGV("DEBUG(%s):node : %s", __func__, node);
875         m_mipiEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
876         ALOGV("DEBUG(%s):m_mipiEntity : 0x%p", __func__, m_mipiEntity);
877 
878         // fimc-lite subdev
879         sprintf(node, "%s.%d", PFX_SUBDEV_ENTITY_FLITE, FLITE_NUM);
880         ALOGV("DEBUG(%s):node : %s", __func__, node);
881         m_fliteSdEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
882         ALOGV("DEBUG(%s):m_fliteSdEntity : 0x%p", __func__, m_fliteSdEntity);
883 
884         // fimc-lite videodev
885         sprintf(node, "%s.%d", PFX_VIDEODEV_ENTITY_FLITE, FLITE_NUM);
886         ALOGV("DEBUG(%s):node : %s", __func__, node);
887         m_fliteVdEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
888         ALOGV("DEBUG(%s):m_fliteVdEntity : 0x%p", __func__, m_fliteVdEntity);
889 
890         // gscaler subdev
891         sprintf(node, "%s.%d", PFX_SUBDEV_ENTITY_GSC_CAP, GSC_NUM);
892         ALOGV("DEBUG(%s):node : %s", __func__, node);
893         m_gscSdEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
894         ALOGV("DEBUG(%s):m_gscSdEntity : 0x%p", __func__, m_gscSdEntity);
895 
896         // gscaler videodev
897         sprintf(node, "%s.%d", PFX_VIDEODEV_ENTITY_GSC_CAP, GSC_NUM);
898         ALOGV("DEBUG(%s):node : %s", __func__, node);
899         m_gscVdEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
900         ALOGV("DEBUG(%s):m_gscVdEntity : 0x%p", __func__, m_gscVdEntity);
901 
902         ALOGV("DEBUG(%s):sensor_sd : numlink : %d", __func__, m_sensorEntity->num_links);
903         ALOGV("DEBUG(%s):mipi_sd   : numlink : %d", __func__, m_mipiEntity->num_links);
904         ALOGV("DEBUG(%s):flite_sd  : numlink : %d", __func__, m_fliteSdEntity->num_links);
905         ALOGV("DEBUG(%s):flite_vd  : numlink : %d", __func__, m_fliteVdEntity->num_links);
906         ALOGV("DEBUG(%s):gsc_sd    : numlink : %d", __func__, m_gscSdEntity->num_links);
907         ALOGV("DEBUG(%s):gsc_vd    : numlink : %d", __func__, m_gscVdEntity->num_links);
908 
909         //////////////////
910         // SETUP LINKS
911         //////////////////
912         // sensor subdev to mipi subdev
913         links = m_sensorEntity->links;
914         if (links == NULL ||
915             links->source->entity != m_sensorEntity ||
916             links->sink->entity != m_mipiEntity) {
917             ALOGE("ERR(%s):Cannot make link camera sensor to mipi", __func__);
918             goto err;
919         }
920 
921         if (exynos_media_setup_link(m_media,  links->source,  links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
922             ALOGE("ERR(%s):Cannot make setup camera sensor to mipi", __func__);
923             goto err;
924         }
925         ALOGV("DEBUG(%s):[LINK SUCCESS] sensor subdev to mipi subdev", __func__);
926 
927         // mipi subdev to fimc-lite subdev
928         for (i = 0; i < m_mipiEntity->num_links; i++) {
929             links = &m_mipiEntity->links[i];
930             ALOGV("DEBUG(%s):i=%d: links->source->entity : %p, m_mipiEntity : %p", __func__, i,
931                     links->source->entity, m_mipiEntity);
932             ALOGV("DEBUG(%s):i=%d: links->sink->entity : %p, m_fliteSdEntity : %p", __func__, i,
933                     links->sink->entity, m_fliteSdEntity);
934             if (links == NULL ||
935                 links->source->entity != m_mipiEntity ||
936                 links->sink->entity != m_fliteSdEntity) {
937                 continue;
938             } else if (exynos_media_setup_link(m_media,  links->source,  links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
939                 ALOGE("ERR(%s):Cannot make setup mipi subdev to fimc-lite subdev", __func__);
940                 goto err;
941             }
942         }
943         ALOGV("DEBUG(%s):[LINK SUCCESS] mipi subdev to fimc-lite subdev", __func__);
944 
945         // fimc-lite subdev TO fimc-lite video dev
946         for (i = 0; i < m_fliteSdEntity->num_links; i++) {
947             links = &m_fliteSdEntity->links[i];
948             ALOGV("DEBUG(%s):i=%d: links->source->entity : %p, m_fliteSdEntity : %p", __func__, i,
949                 links->source->entity, m_fliteSdEntity);
950             ALOGV("DEBUG(%s):i=%d: links->sink->entity : %p, m_fliteVdEntity : %p", __func__, i,
951                 links->sink->entity, m_fliteVdEntity);
952             if (links == NULL ||
953                 links->source->entity != m_fliteSdEntity ||
954                 links->sink->entity != m_fliteVdEntity) {
955                 continue;
956             } else if (exynos_media_setup_link(m_media,  links->source,  links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
957                 ALOGE("ERR(%s):Cannot make setup fimc-lite subdev to fimc-lite video dev", __func__);
958                 goto err;
959             }
960         }
961         ALOGV("DEBUG(%s):[LINK SUCCESS] fimc-lite subdev to fimc-lite video dev", __func__);
962 
963         // fimc-lite subdev to gscaler subdev
964         for (i = 0; i < m_gscSdEntity->num_links; i++) {
965             links = &m_gscSdEntity->links[i];
966             ALOGV("DEBUG(%s):i=%d: links->source->entity : %p, m_fliteSdEntity : %p", __func__, i,
967                     links->source->entity, m_fliteSdEntity);
968             ALOGV("DEBUG(%s):i=%d: links->sink->entity : %p, m_gscSdEntity : %p", __func__, i,
969                     links->sink->entity, m_gscSdEntity);
970             if (links == NULL ||
971                 links->source->entity != m_fliteSdEntity ||
972                 links->sink->entity != m_gscSdEntity) {
973                 continue;
974             } else if (exynos_media_setup_link(m_media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
975                 ALOGE("ERR(%s):Cannot make setup fimc-lite subdev to gscaler subdev", __func__);
976                 goto err;
977             }
978         }
979         ALOGV("DEBUG(%s):[LINK SUCCESS] fimc-lite subdev to gscaler subdev", __func__);
980 
981         // gscaler subdev to gscaler video dev
982         for (i = 0; i < m_gscVdEntity->num_links; i++) {
983             links = &m_gscVdEntity->links[i];
984             ALOGV("DEBUG(%s):i=%d: links->source->entity : %p, m_gscSdEntity : %p", __func__, i,
985                     links->source->entity, m_gscSdEntity);
986             ALOGV("DEBUG(%s):i=%d: links->sink->entity : %p, m_gscVdEntity : %p", __func__, i,
987                     links->sink->entity, m_gscVdEntity);
988             if (links == NULL ||
989                 links->source->entity != m_gscSdEntity ||
990                 links->sink->entity != m_gscVdEntity) {
991                 continue;
992             } else if (exynos_media_setup_link(m_media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
993                 ALOGE("ERR(%s):Cannot make setup gscaler subdev to gscaler video dev", __func__);
994                 goto err;
995             }
996         }
997         ALOGV("DEBUG(%s):[LINK SUCCESS] gscaler subdev to gscaler video dev", __func__);
998 
999         sprintf(node, "%s%d", PFX_NODE, (FLITE_VD_NODE_OFFSET + VIDEO_NODE_PREVIEW_ID));
1000         m_fliteDev.fd = exynos_v4l2_open(node, O_RDWR, 0);
1001         if (m_fliteDev.fd <= 0) {
1002             ALOGE("ERR(%s):exynos_v4l2_open(%s) fail (error : %s)", __func__, node, strerror(errno));
1003             goto err;
1004         }
1005         m_previewDev = &m_fliteDev;
1006         m_videoDev   = &m_fliteDev;
1007         m_pictureDev = &m_fliteDev;
1008     }
1009 
1010     m_previewDev->flagStart = false;
1011     m_videoDev->flagStart   = false;
1012     m_pictureDev->flagStart = false;
1013 
1014     m_tryPreviewStop = true;
1015     m_tryVideoStop   = true;
1016     m_tryPictureStop = true;
1017 
1018     m_flagStartFaceDetection = false;
1019     m_flagAutoFocusRunning = false;
1020 
1021     if (exynos_v4l2_enuminput(m_previewDev->fd, m_cameraId, m_cameraName) == false) {
1022         ALOGE("ERR(%s):exynos_v4l2_enuminput(%d, %s) fail", __func__, m_cameraId, m_cameraName);
1023         goto err;
1024     }
1025 
1026     // HACK
1027     if (m_cameraId == CAMERA_ID_BACK)
1028         strcpy(m_cameraName, "S5K4E5");
1029     else
1030         strcpy(m_cameraName, "S5K6A3");
1031 
1032     if (exynos_v4l2_s_input(m_previewDev->fd, m_cameraId) < 0) {
1033         ALOGE("ERR(%s):exynos_v4l2_s_input() fail", __func__);
1034         goto err;
1035     }
1036 
1037     if (strcmp((const char*)m_cameraName, "S5K4E5") == 0) {
1038         m_defaultCameraInfo  = new ExynosCameraInfoS5K4E5;
1039         m_curCameraInfo      = new ExynosCameraInfoS5K4E5;
1040     } else if (strcmp((const char*)m_cameraName, "S5K6A3") == 0) {
1041         m_defaultCameraInfo  = new ExynosCameraInfoS5K6A3;
1042         m_curCameraInfo      = new ExynosCameraInfoS5K6A3;
1043     } else if (strcmp((const char*)m_cameraName, "M5M0") == 0) {
1044         m_defaultCameraInfo  = new ExynosCameraInfoM5M0;
1045         m_curCameraInfo      = new ExynosCameraInfoM5M0;
1046     } else {
1047         ALOGE("ERR(%s):invalid camera Name (%s) fail", __func__, m_cameraName);
1048         goto err;
1049     }
1050 
1051     m_setExifFixedAttribute();
1052 
1053     m_flagCreate = true;
1054     return true;
1055 
1056 err:
1057     if (m_defaultCameraInfo)
1058         delete m_defaultCameraInfo;
1059     m_defaultCameraInfo = NULL;
1060 
1061     if (m_curCameraInfo)
1062         delete m_curCameraInfo;
1063     m_curCameraInfo = NULL;
1064 
1065     if (0 < m_videoDev->fd)
1066         exynos_v4l2_close(m_videoDev->fd);
1067     m_videoDev->fd = 0;
1068 
1069     if (0 < m_pictureDev->fd)
1070         exynos_v4l2_close(m_pictureDev->fd);
1071     m_pictureDev->fd = 0;
1072 
1073     if (0 < m_previewDev->fd)
1074         exynos_v4l2_close(m_previewDev->fd);
1075     m_previewDev->fd = 0;
1076 
1077     if (m_media)
1078         exynos_media_close(m_media);
1079     m_media = NULL;
1080 
1081     return false;
1082 }
1083 
destroy(void)1084 bool ExynosCamera::destroy(void)
1085 {
1086     if (m_flagCreate == false) {
1087         ALOGE("ERR(%s):Not yet created", __func__);
1088         return false;
1089     }
1090 
1091     if (m_pictureDev->flagStart == true)
1092         stopPicture();
1093 
1094     if (m_videoDev->flagStart == true)
1095         stopVideo();
1096 
1097     if (m_previewDev->flagStart == true)
1098         stopPreview();
1099 
1100     if (m_defaultCameraInfo)
1101         delete m_defaultCameraInfo;
1102     m_defaultCameraInfo = NULL;
1103 
1104     if (m_curCameraInfo)
1105         delete m_curCameraInfo;
1106     m_curCameraInfo = NULL;
1107 
1108     // close m_previewDev->fd after stopVideo() because stopVideo()
1109     // uses m_previewDev->fd to change frame rate
1110     if (0 < m_videoDev->fd)
1111         exynos_v4l2_close(m_videoDev->fd);
1112     m_videoDev->fd = 0;
1113 
1114     if (0 < m_pictureDev->fd)
1115         exynos_v4l2_close(m_pictureDev->fd);
1116     m_pictureDev->fd = 0;
1117 
1118     if (0 < m_previewDev->fd)
1119         exynos_v4l2_close(m_previewDev->fd);
1120     m_previewDev->fd = 0;
1121 
1122     if (m_media)
1123         exynos_media_close(m_media);
1124     m_media = NULL;
1125 
1126     m_flagCreate = false;
1127 
1128     return true;
1129 }
1130 
flagCreate(void)1131 bool ExynosCamera::flagCreate(void)
1132 {
1133     return m_flagCreate;
1134 }
1135 
getCameraId(void)1136 int ExynosCamera::getCameraId(void)
1137 {
1138     return m_cameraId;
1139 }
1140 
getCameraName(void)1141 char *ExynosCamera::getCameraName(void)
1142 {
1143     return m_cameraName;
1144 }
1145 
getPreviewFd(void)1146 int ExynosCamera::getPreviewFd(void)
1147 {
1148     return m_previewDev->fd;
1149 }
1150 
getPictureFd(void)1151 int ExynosCamera::getPictureFd(void)
1152 {
1153     return m_pictureDev->fd;
1154 }
1155 
getVideoFd(void)1156 int ExynosCamera::getVideoFd(void)
1157 {
1158     return m_videoDev->fd;
1159 }
1160 
startPreview(void)1161 bool ExynosCamera::startPreview(void)
1162 {
1163     if (m_flagCreate == false) {
1164         ALOGE("ERR(%s):Not yet Created", __func__);
1165         return false;
1166     }
1167 
1168     if (m_previewDev->flagStart == false) {
1169         if (m_setWidthHeight(PREVIEW_MODE,
1170                              m_previewDev->fd,
1171                              &m_previewDev->events,
1172                              m_curCameraInfo->previewW,
1173                              m_curCameraInfo->previewH,
1174                              m_curCameraInfo->previewColorFormat,
1175                              m_previewBuf,
1176                              m_validPreviewBuf) == false) {
1177             ALOGE("ERR(%s):m_setWidthHeight() fail", __func__);
1178             return false;
1179         }
1180 
1181         if (setPreviewFrameRate(m_curCameraInfo->fps) == false)
1182             ALOGE("ERR(%s):Fail toggle setPreviewFrameRate(%d)",
1183                 __func__, m_curCameraInfo->fps);
1184 
1185         if (exynos_v4l2_streamon(m_previewDev->fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) < 0) {
1186             ALOGE("ERR(%s):exynos_v4l2_streamon() fail", __func__);
1187             return false;
1188         }
1189 
1190         if (m_curCameraInfo->focusMode == FOCUS_MODE_CONTINUOUS_VIDEO
1191             || m_curCameraInfo->focusMode == FOCUS_MODE_CONTINUOUS_PICTURE) {
1192             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_CAF_START_STOP, CAF_START) < 0) {
1193                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
1194                 return false;
1195             }
1196         }
1197 
1198 		m_tryPreviewStop = false;
1199         m_previewDev->flagStart = true;
1200 
1201 /* TODO */
1202 /* DIS is only supported BACK camera(4E5) currently. */
1203 #ifdef USE_DIS
1204         bool toggle = getVideoStabilization();
1205 
1206         if (setVideoStabilization(toggle) == false)
1207             ALOGE("ERR(%s):setVideoStabilization() fail", __func__);
1208 #endif
1209 
1210 #ifdef USE_3DNR
1211         if (m_recordingHint == true && getCameraId() == CAMERA_ID_BACK) {
1212             if (set3DNR(true) == false)
1213                 ALOGE("ERR(%s):set3DNR() fail", __func__);
1214         }
1215 #endif
1216 
1217 #ifdef USE_ODC
1218         if (setODC(true) == false)
1219             ALOGE("ERR(%s):setODC() fail", __func__);
1220 #endif
1221     }
1222 
1223     return true;
1224 }
1225 
stopPreview(void)1226 bool ExynosCamera::stopPreview(void)
1227 {
1228     if (m_flagCreate == false) {
1229         ALOGE("ERR(%s):Not yet Created", __func__);
1230         return false;
1231     }
1232 
1233     if (m_previewDev->flagStart == true) {
1234 
1235         if (m_curCameraInfo->flashMode == FLASH_MODE_TORCH)
1236             setFlashMode(FLASH_MODE_OFF);
1237 
1238         m_tryPreviewStop = true;
1239 
1240         // skip stopPreview
1241         if (   (m_previewDev == m_videoDev   && m_tryVideoStop == false)
1242             || (m_previewDev == m_pictureDev && m_tryPictureStop == false))
1243             return true;
1244 
1245 /* TODO */
1246 /* Can not use 3DNR, ODC and DIS function because HW problem at exynos5250 EVT0 */
1247 #ifdef USE_3DNR
1248         if (set3DNR(false) == false)
1249             ALOGE("ERR(%s):set3DNR() fail", __func__);
1250 #endif
1251 
1252 #ifdef USE_ODC
1253         if (setODC(false) == false)
1254             ALOGE("ERR(%s):setODC() fail", __func__);
1255 #endif
1256 
1257         if (exynos_v4l2_streamoff(m_previewDev->fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) < 0) {
1258             ALOGE("ERR(%s):exynos_v4l2_streamoff() fail", __func__);
1259             return false;
1260         }
1261 
1262         struct v4l2_requestbuffers req;
1263         req.count  = 0;
1264         req.type   = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1265         req.memory = V4L2_MEMORY_DMABUF;
1266 
1267         if (exynos_v4l2_reqbufs(m_previewDev->fd, &req) < 0) {
1268             ALOGE("ERR(%s):exynos_v4l2_reqbufs() fail", __func__);
1269             return false;
1270         }
1271 
1272         m_previewDev->flagStart = false;
1273 
1274         m_flagStartFaceDetection = false;
1275     }
1276 
1277     return true;
1278 }
1279 
flagStartPreview(void)1280 bool ExynosCamera::flagStartPreview(void)
1281 {
1282     return m_previewDev->flagStart;
1283 }
1284 
getPreviewMaxBuf(void)1285 int ExynosCamera::getPreviewMaxBuf(void)
1286 {
1287     return VIDEO_MAX_FRAME;
1288 }
1289 
setPreviewBuf(ExynosBuffer * buf)1290 bool ExynosCamera::setPreviewBuf(ExynosBuffer *buf)
1291 {
1292     if (m_flagCreate == false) {
1293         ALOGE("ERR(%s):Not yet created fail", __func__);
1294         return false;
1295     }
1296 
1297     if (VIDEO_MAX_FRAME <= buf->reserved.p) {
1298         ALOGE("ERR(%s):index(%d) must smaller than %d", __func__, buf->reserved.p, VIDEO_MAX_FRAME);
1299         return false;
1300     }
1301 
1302     m_previewBuf[buf->reserved.p] = *buf;
1303 
1304     // HACK : Driver not yet support cb,cr of YV12
1305     m_previewBuf[buf->reserved.p].virt.extP[1] = buf->virt.extP[2];
1306     m_previewBuf[buf->reserved.p].virt.extP[2] = buf->virt.extP[1];
1307 
1308     return true;
1309 }
1310 
getPreviewBuf(ExynosBuffer * buf)1311 bool ExynosCamera::getPreviewBuf(ExynosBuffer *buf)
1312 {
1313     if (m_flagCreate == false) {
1314         ALOGE("ERR(%s):Not yet created fail", __func__);
1315         return false;
1316     }
1317 
1318     if (m_previewDev->flagStart == false) {
1319         ALOGE("ERR(%s):Not yet preview started fail", __func__);
1320         return false;
1321     }
1322 
1323     struct v4l2_buffer v4l2_buf;
1324     struct v4l2_plane  planes[VIDEO_MAX_PLANES];
1325 
1326     v4l2_buf.m.planes = planes;
1327     v4l2_buf.type     = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1328     v4l2_buf.memory   = V4L2_MEMORY_DMABUF;
1329     v4l2_buf.length   = 0;
1330 
1331     for (int i = 0; i < 3; i++) {
1332         if (m_previewBuf[0].size.extS[i] != 0)
1333             v4l2_buf.length++;
1334     }
1335 
1336     if (exynos_v4l2_dqbuf(m_previewDev->fd, &v4l2_buf) < 0) {
1337         ALOGE("ERR(%s):exynos_v4l2_dqbuf() fail", __func__);
1338         return false;
1339     }
1340 
1341     if (VIDEO_MAX_FRAME <= v4l2_buf.index) {
1342         ALOGE("ERR(%s):wrong index = %d", __func__, v4l2_buf.index);
1343         return false;
1344     }
1345 
1346     *buf = m_previewBuf[v4l2_buf.index];
1347 
1348     return true;
1349 }
1350 
putPreviewBuf(ExynosBuffer * buf)1351 bool ExynosCamera::putPreviewBuf(ExynosBuffer *buf)
1352 {
1353     if (m_flagCreate == false) {
1354         ALOGE("ERR(%s):Not yet created fail", __func__);
1355         return false;
1356     }
1357 
1358     if (m_validPreviewBuf[buf->reserved.p] == false) {
1359         ALOGE("ERR(%s):Invalid index(%d)", __func__, buf->reserved.p);
1360         return false;
1361     }
1362 
1363     struct v4l2_buffer v4l2_buf;
1364     struct v4l2_plane  planes[VIDEO_MAX_PLANES];
1365 
1366     v4l2_buf.m.planes = planes;
1367     v4l2_buf.type     = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1368     v4l2_buf.memory   = V4L2_MEMORY_DMABUF;
1369     v4l2_buf.index    = buf->reserved.p;
1370     v4l2_buf.length   = 0;
1371 
1372     for (int i = 0; i < 3; i++) {
1373         v4l2_buf.m.planes[i].m.fd= m_previewBuf[buf->reserved.p].fd.extFd[i];
1374         v4l2_buf.m.planes[i].length   = m_previewBuf[buf->reserved.p].size.extS[i];
1375 
1376         if (m_previewBuf[buf->reserved.p].size.extS[i] != 0)
1377             v4l2_buf.length++;
1378     }
1379 
1380     if (exynos_v4l2_qbuf(m_previewDev->fd, &v4l2_buf) < 0) {
1381         ALOGE("ERR(%s):exynos_v4l2_qbuf() fail", __func__);
1382         return false;
1383     }
1384 
1385     return true;
1386 }
1387 
setVideoSize(int w,int h)1388 bool ExynosCamera::setVideoSize(int w, int h)
1389 {
1390     m_curCameraInfo->videoW = w;
1391     m_curCameraInfo->videoH = h;
1392 
1393 #ifdef USE_3DNR_DMAOUT
1394     // HACK : Video 3dnr port support resize. So, we must make max size video w, h
1395     m_curCameraInfo->videoW = m_defaultCameraInfo->videoW;
1396     m_curCameraInfo->videoH = m_defaultCameraInfo->videoH;
1397 #endif
1398     return true;
1399 }
1400 
getVideoSize(int * w,int * h)1401 bool ExynosCamera::getVideoSize(int *w, int *h)
1402 {
1403     *w = m_curCameraInfo->videoW;
1404     *h = m_curCameraInfo->videoH;
1405     return true;
1406 }
1407 
setVideoFormat(int colorFormat)1408 bool ExynosCamera::setVideoFormat(int colorFormat)
1409 {
1410     m_curCameraInfo->videoColorFormat = colorFormat;
1411     return true;
1412 }
1413 
getVideoFormat(void)1414 int ExynosCamera::getVideoFormat(void)
1415 {
1416     return m_curCameraInfo->videoColorFormat;
1417 }
1418 
startVideo(void)1419 bool ExynosCamera::startVideo(void)
1420 {
1421     if (m_flagCreate == false) {
1422         ALOGE("ERR(%s):Not yet Created", __func__);
1423         return false;
1424     }
1425 
1426 #ifdef USE_3DNR_DMAOUT
1427     if (m_videoDev->flagStart == false) {
1428         if (m_setWidthHeight(VIDEO_MODE,
1429                              m_videoDev->fd,
1430                              &m_videoDev->events,
1431                              m_curCameraInfo->videoW,
1432                              m_curCameraInfo->videoH,
1433                              m_curCameraInfo->videoColorFormat,
1434                              m_videoBuf,
1435                              m_validVideoBuf) == false) {
1436             ALOGE("ERR(%s):m_setWidthHeight() fail", __func__);
1437             return false;
1438         }
1439 
1440         if (exynos_v4l2_streamon(m_videoDev->fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) < 0) {
1441             ALOGE("ERR(%s):exynos_v4l2_streamon() fail", __func__);
1442             return false;
1443         }
1444 
1445         m_tryVideoStop = false;
1446         m_videoDev->flagStart = true;
1447     }
1448 #endif
1449 
1450     return true;
1451 }
1452 
stopVideo(void)1453 bool ExynosCamera::stopVideo(void)
1454 {
1455     if (m_flagCreate == false) {
1456         ALOGE("ERR(%s):Not yet Created", __func__);
1457         return false;
1458     }
1459 
1460     if (m_videoDev->flagStart == true) {
1461 
1462         m_tryVideoStop = true;
1463 
1464         // skip stopVideo
1465         if (   (m_videoDev == m_previewDev && m_tryPreviewStop == false)
1466             || (m_videoDev == m_pictureDev && m_tryPictureStop == false))
1467             return true;
1468 
1469         if (exynos_v4l2_streamoff(m_videoDev->fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) < 0) {
1470             ALOGE("ERR(%s):exynos_v4l2_streamoff() fail", __func__);
1471             return false;
1472         }
1473         struct v4l2_requestbuffers req;
1474         req.count  = 0;
1475         req.type   = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1476         req.memory = V4L2_MEMORY_DMABUF;
1477 
1478         if (exynos_v4l2_reqbufs(m_videoDev->fd, &req) < 0) {
1479             ALOGE("ERR(%s):exynos_v4l2_reqbufs() fail", __func__);
1480             return false;
1481         }
1482 
1483         m_videoDev->flagStart = false;
1484     }
1485 
1486     return true;
1487 }
1488 
flagStartVideo(void)1489 bool ExynosCamera::flagStartVideo(void)
1490 {
1491     return m_videoDev->flagStart;
1492 }
1493 
getVideoMaxBuf(void)1494 int ExynosCamera::getVideoMaxBuf(void)
1495 {
1496     return VIDEO_MAX_FRAME;
1497 }
1498 
setVideoBuf(ExynosBuffer * buf)1499 bool ExynosCamera::setVideoBuf(ExynosBuffer *buf)
1500 {
1501     if (m_flagCreate == false) {
1502         ALOGE("ERR(%s):Not yet created fail", __func__);
1503         return false;
1504     }
1505 
1506     if (VIDEO_MAX_FRAME <= buf->reserved.p) {
1507         ALOGE("ERR(%s):index(%d) must smaller than %d", __func__, buf->reserved.p, VIDEO_MAX_FRAME);
1508         return false;
1509     }
1510 
1511     m_videoBuf[buf->reserved.p] = *buf;
1512     return true;
1513 }
1514 
getVideoBuf(ExynosBuffer * buf)1515 bool ExynosCamera::getVideoBuf(ExynosBuffer *buf)
1516 {
1517     if (m_flagCreate == false) {
1518         ALOGE("ERR(%s):Not yet created fail", __func__);
1519         return false;
1520     }
1521 
1522     if (m_videoDev->flagStart == false) {
1523         ALOGE("ERR(%s):Not yet video started fail", __func__);
1524         return false;
1525     }
1526 
1527     struct v4l2_buffer v4l2_buf;
1528     struct v4l2_plane  planes[VIDEO_MAX_PLANES];
1529 
1530     v4l2_buf.m.planes = planes;
1531     v4l2_buf.type     = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1532     v4l2_buf.memory   = V4L2_MEMORY_DMABUF;
1533     v4l2_buf.length   = 0;
1534 
1535     for (int i = 0; i < 3; i++) {
1536         if (m_videoBuf[0].size.extS[i] != 0)
1537             v4l2_buf.length++;
1538     }
1539 
1540     if (exynos_v4l2_dqbuf(m_videoDev->fd, &v4l2_buf) < 0) {
1541         ALOGE("ERR(%s):exynos_v4l2_dqbuf() fail", __func__);
1542         return false;
1543     }
1544 
1545     if (VIDEO_MAX_FRAME <= v4l2_buf.index) {
1546         ALOGE("ERR(%s):wrong index = %d", __func__, v4l2_buf.index);
1547         return false;
1548     }
1549 
1550     *buf = m_videoBuf[v4l2_buf.index];
1551 
1552     return true;
1553 }
1554 
putVideoBuf(ExynosBuffer * buf)1555 bool ExynosCamera::putVideoBuf(ExynosBuffer *buf)
1556 {
1557     if (m_flagCreate == false) {
1558         ALOGE("ERR(%s):Not yet created fail", __func__);
1559         return false;
1560     }
1561 
1562     if (m_videoDev->flagStart == false) {
1563         /* this can happen when recording frames are returned after
1564          * the recording is stopped at the driver level.  we don't
1565          * need to return the buffers in this case and we've seen
1566          * cases where fimc could crash if we called qbuf and it
1567          * wasn't expecting it.
1568          */
1569         ALOGV("DEBUG(%s):recording not in progress, ignoring", __func__);
1570         return true;
1571     }
1572 
1573     if (m_validVideoBuf[buf->reserved.p] == false) {
1574         ALOGE("ERR(%s):Invalid index(%d)", __func__, buf->reserved.p);
1575         return false;
1576     }
1577 
1578     struct v4l2_buffer v4l2_buf;
1579     struct v4l2_plane  planes[VIDEO_MAX_PLANES];
1580 
1581     v4l2_buf.m.planes = planes;
1582     v4l2_buf.type     = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1583     v4l2_buf.memory   = V4L2_MEMORY_DMABUF;
1584     v4l2_buf.index    = buf->reserved.p;
1585     v4l2_buf.length   = 0;
1586 
1587     for (int i = 0; i < 3; i++) {
1588         v4l2_buf.m.planes[i].m.fd = (unsigned long)m_videoBuf[buf->reserved.p].fd.extFd[i];
1589         v4l2_buf.m.planes[i].length   = m_videoBuf[buf->reserved.p].size.extS[i];
1590 
1591         if (m_videoBuf[buf->reserved.p].size.extS[i] != 0)
1592             v4l2_buf.length++;
1593     }
1594 
1595     if (exynos_v4l2_qbuf(m_videoDev->fd, &v4l2_buf) < 0) {
1596         ALOGE("ERR(%s):exynos_v4l2_qbuf() fail", __func__);
1597         return false;
1598     }
1599 
1600     return true;
1601 }
1602 
startPicture(void)1603 bool ExynosCamera::startPicture(void)
1604 {
1605     if (m_flagCreate == false) {
1606         ALOGE("ERR(%s):Not yet Created", __func__);
1607         return false;
1608     }
1609 
1610     if (m_pictureDev->flagStart == false) {
1611         if (m_setWidthHeight(PICTURE_MODE,
1612                              m_pictureDev->fd,
1613                              &m_pictureDev->events,
1614                              m_curCameraInfo->pictureW,
1615                              m_curCameraInfo->pictureH,
1616                              m_curCameraInfo->pictureColorFormat,
1617                              m_pictureBuf,
1618                              m_validPictureBuf) == false) {
1619             ALOGE("ERR(%s):m_setWidthHeight() fail", __func__);
1620             return false;
1621         }
1622 
1623         if (exynos_v4l2_streamon(m_pictureDev->fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) < 0) {
1624             ALOGE("ERR(%s):exynos_v4l2_streamon() fail", __func__);
1625             return false;
1626         }
1627 
1628         m_tryPictureStop = false;
1629         m_pictureDev->flagStart = true;
1630     }
1631 
1632     return true;
1633 }
1634 
stopPicture(void)1635 bool ExynosCamera::stopPicture(void)
1636 {
1637     if (m_flagCreate == false) {
1638         ALOGE("ERR(%s):Not yet Created", __func__);
1639         return false;
1640     }
1641 
1642     if (m_pictureDev->flagStart == true) {
1643 
1644         m_tryPictureStop = true;
1645 
1646         // skip stopPicture
1647         if (   (m_pictureDev == m_previewDev && m_tryPreviewStop == false)
1648             || (m_pictureDev == m_videoDev   && m_tryVideoStop == false))
1649             return true;
1650 
1651         if (exynos_v4l2_streamoff(m_pictureDev->fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) < 0) {
1652             ALOGE("ERR(%s):exynos_v4l2_streamoff() fail", __func__);
1653             return false;
1654         }
1655 
1656         struct v4l2_requestbuffers req;
1657         req.count  = 0;
1658         req.type   = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1659         req.memory = V4L2_MEMORY_DMABUF;
1660 
1661         if (exynos_v4l2_reqbufs(m_pictureDev->fd, &req) < 0) {
1662             ALOGE("ERR(%s):exynos_v4l2_reqbufs() fail", __func__);
1663             return false;
1664         }
1665 
1666         m_pictureDev->flagStart = false;
1667     }
1668 
1669     return true;
1670 }
1671 
flagStartPicture(void)1672 bool ExynosCamera::flagStartPicture(void)
1673 {
1674     return m_pictureDev->flagStart;
1675 }
1676 
getPictureMaxBuf(void)1677 int ExynosCamera::getPictureMaxBuf(void)
1678 {
1679     return VIDEO_MAX_FRAME;
1680 }
1681 
setPictureBuf(ExynosBuffer * buf)1682 bool ExynosCamera::setPictureBuf(ExynosBuffer *buf)
1683 {
1684     if (m_flagCreate == false) {
1685         ALOGE("ERR(%s):Not yet created fail", __func__);
1686         return false;
1687     }
1688 
1689     if (VIDEO_MAX_FRAME <= buf->reserved.p) {
1690         ALOGE("ERR(%s):index(%d) must smaller than %d", __func__, buf->reserved.p, VIDEO_MAX_FRAME);
1691         return false;
1692     }
1693 
1694     m_pictureBuf[buf->reserved.p] = *buf;
1695     return true;
1696 }
1697 
getPictureBuf(ExynosBuffer * buf)1698 bool ExynosCamera::getPictureBuf(ExynosBuffer *buf)
1699 {
1700     if (m_flagCreate == false) {
1701         ALOGE("ERR(%s):Not yet created fail", __func__);
1702         return false;
1703     }
1704 
1705     if (m_pictureDev->flagStart == false) {
1706         ALOGE("ERR(%s):Not yet picture started fail", __func__);
1707         return false;
1708     }
1709 
1710     struct v4l2_buffer v4l2_buf;
1711     struct v4l2_plane  planes[VIDEO_MAX_PLANES];
1712 
1713     v4l2_buf.m.planes = planes;
1714     v4l2_buf.type     = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1715     v4l2_buf.memory   = V4L2_MEMORY_DMABUF;
1716     v4l2_buf.length   = 0;
1717 
1718     for (int i = 0; i < 3; i++) {
1719         if (m_pictureBuf[0].size.extS[i] != 0)
1720             v4l2_buf.length++;
1721     }
1722 
1723     if (exynos_v4l2_dqbuf(m_pictureDev->fd, &v4l2_buf) < 0) {
1724         ALOGE("ERR(%s):exynos_v4l2_dqbuf() fail", __func__);
1725         return false;
1726     }
1727 
1728     if (VIDEO_MAX_FRAME <= v4l2_buf.index) {
1729         ALOGE("ERR(%s):wrong index = %d", __func__, v4l2_buf.index);
1730         return false;
1731     }
1732 
1733     *buf = m_pictureBuf[v4l2_buf.index];
1734 
1735     return true;
1736 }
1737 
putPictureBuf(ExynosBuffer * buf)1738 bool ExynosCamera::putPictureBuf(ExynosBuffer *buf)
1739 {
1740     if (m_flagCreate == false) {
1741         ALOGE("ERR(%s):Not yet created fail", __func__);
1742         return false;
1743     }
1744 
1745     if (m_pictureDev->flagStart == false) {
1746         ALOGE("ERR(%s):Not yet picture started fail", __func__);
1747         return false;
1748     }
1749 
1750     if (m_validPictureBuf[buf->reserved.p] == false) {
1751         ALOGE("ERR(%s):Invalid index(%d)", __func__, buf->reserved.p);
1752         return false;
1753     }
1754 
1755     struct v4l2_buffer v4l2_buf;
1756     struct v4l2_plane  planes[VIDEO_MAX_PLANES];
1757 
1758     v4l2_buf.m.planes = planes;
1759     v4l2_buf.type     = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1760     v4l2_buf.memory   = V4L2_MEMORY_DMABUF;
1761     v4l2_buf.index    = buf->reserved.p;
1762     v4l2_buf.length   = 0;
1763 
1764     for (int i = 0; i < 3; i++) {
1765         v4l2_buf.m.planes[i].m.fd = (unsigned long)m_pictureBuf[buf->reserved.p].fd.extFd[i];
1766         v4l2_buf.m.planes[i].length   = m_pictureBuf[buf->reserved.p].size.extS[i];
1767 
1768         if (m_pictureBuf[buf->reserved.p].size.extS[i] != 0)
1769             v4l2_buf.length++;
1770     }
1771 
1772     if (exynos_v4l2_qbuf(m_pictureDev->fd, &v4l2_buf) < 0) {
1773         ALOGE("ERR(%s):exynos_v4l2_qbuf() fail", __func__);
1774         return false;
1775     }
1776 
1777     return true;
1778 }
1779 
yuv2Jpeg(ExynosBuffer * yuvBuf,ExynosBuffer * jpegBuf,ExynosRect * rect)1780 bool ExynosCamera::yuv2Jpeg(ExynosBuffer *yuvBuf,
1781                             ExynosBuffer *jpegBuf,
1782                             ExynosRect *rect)
1783 {
1784     unsigned char *addr;
1785 
1786     ExynosJpegEncoderForCamera jpegEnc;
1787     bool ret = false;
1788 
1789     unsigned int *yuvSize = yuvBuf->size.extS;
1790 
1791     if (jpegEnc.create()) {
1792         ALOGE("ERR(%s):jpegEnc.create() fail", __func__);
1793         goto jpeg_encode_done;
1794     }
1795 
1796     if (jpegEnc.setQuality(m_jpegQuality)) {
1797         ALOGE("ERR(%s):jpegEnc.setQuality() fail", __func__);
1798         goto jpeg_encode_done;
1799     }
1800 
1801     if (jpegEnc.setSize(rect->w, rect->h)) {
1802         ALOGE("ERR(%s):jpegEnc.setSize() fail", __func__);
1803         goto jpeg_encode_done;
1804     }
1805 
1806     if (jpegEnc.setColorFormat(rect->colorFormat)) {
1807         ALOGE("ERR(%s):jpegEnc.setColorFormat() fail", __func__);
1808         goto jpeg_encode_done;
1809     }
1810 
1811     if (jpegEnc.setJpegFormat(V4L2_PIX_FMT_JPEG_422)) {
1812         ALOGE("ERR(%s):jpegEnc.setJpegFormat() fail", __func__);
1813         goto jpeg_encode_done;
1814     }
1815 
1816     if (m_curCameraInfo->thumbnailW != 0 && m_curCameraInfo->thumbnailH != 0) {
1817         mExifInfo.enableThumb = true;
1818         if (jpegEnc.setThumbnailSize(m_curCameraInfo->thumbnailW, m_curCameraInfo->thumbnailH)) {
1819             ALOGE("ERR(%s):jpegEnc.setThumbnailSize(%d, %d) fail", __func__, m_curCameraInfo->thumbnailW, m_curCameraInfo->thumbnailH);
1820             goto jpeg_encode_done;
1821         }
1822 
1823         if (0 < m_jpegThumbnailQuality && m_jpegThumbnailQuality <= 100) {
1824             if (jpegEnc.setThumbnailQuality(m_jpegThumbnailQuality)) {
1825                 ALOGE("ERR(%s):jpegEnc.setThumbnailSize(%d, %d) fail", __func__, m_curCameraInfo->thumbnailW, m_curCameraInfo->thumbnailH);
1826                 goto jpeg_encode_done;
1827             }
1828         }
1829 
1830         m_setExifChangedAttribute(&mExifInfo, rect);
1831     } else {
1832         mExifInfo.enableThumb = false;
1833     }
1834 
1835     if (jpegEnc.setInBuf((char **)&(yuvBuf->virt.p), (int *)yuvSize)) {
1836         ALOGE("ERR(%s):jpegEnc.setInBuf() fail", __func__);
1837         goto jpeg_encode_done;
1838     }
1839 
1840     if (jpegEnc.setOutBuf(jpegBuf->virt.p, jpegBuf->size.extS[0] + jpegBuf->size.extS[1] + jpegBuf->size.extS[2])) {
1841         ALOGE("ERR(%s):jpegEnc.setOutBuf() fail", __func__);
1842         goto jpeg_encode_done;
1843     }
1844 
1845     if (jpegEnc.updateConfig()) {
1846         ALOGE("ERR(%s):jpegEnc.updateConfig() fail", __func__);
1847         goto jpeg_encode_done;
1848     }
1849 
1850     if (jpegEnc.encode((int *)&jpegBuf->size.s, &mExifInfo)) {
1851         ALOGE("ERR(%s):jpegEnc.encode() fail", __func__);
1852         goto jpeg_encode_done;
1853     }
1854 
1855     ret = true;
1856 
1857 jpeg_encode_done:
1858 
1859     if (jpegEnc.flagCreate() == true)
1860         jpegEnc.destroy();
1861 
1862     return ret;
1863 }
1864 
autoFocus(void)1865 bool ExynosCamera::autoFocus(void)
1866 {
1867     if (m_previewDev->fd <= 0) {
1868         ALOGE("ERR(%s):Camera was closed", __func__);
1869         return false;
1870     }
1871 
1872     if (m_flagAutoFocusRunning == true) {
1873         ALOGD("DEBUG(%s):m_flagAutoFocusRunning == true", __func__);
1874         return true;
1875     }
1876 
1877     switch (m_curCameraInfo->focusMode) {
1878     case FOCUS_MODE_AUTO:
1879     case FOCUS_MODE_INFINITY:
1880     case FOCUS_MODE_MACRO:
1881         if (m_touchAFMode == true) {
1882             if (setFocusMode(FOCUS_MODE_TOUCH) == false) {
1883                 ALOGE("ERR(%s): %d: setFocusMode(FOCUS_MODE_TOUCH) fail", __func__, __LINE__);
1884                 return false;
1885             }
1886         } else {
1887             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_SET_AUTO_FOCUS, AUTO_FOCUS_ON) < 0) {
1888                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
1889                 return false;
1890             }
1891         }
1892         break;
1893     case FOCUS_MODE_CONTINUOUS_VIDEO:
1894     case FOCUS_MODE_CONTINUOUS_PICTURE:
1895         /* Doing nothing. Because we assume that continuous focus mode is
1896            always focused on. */
1897         break;
1898     case FOCUS_MODE_TOUCH:
1899         if (setFocusMode(FOCUS_MODE_TOUCH) == false) {
1900             ALOGE("ERR(%s): %d: setFocusMode(FOCUS_MODE_TOUCH) fail", __func__, __LINE__);
1901             return false;
1902         }
1903         break;
1904     case FOCUS_MODE_FIXED:
1905         break;
1906     case FOCUS_MODE_EDOF:
1907     default:
1908         ALOGE("ERR(%s):Unsupported value(%d)", __func__, m_curCameraInfo->focusMode);
1909         return false;
1910         break;
1911     }
1912 
1913     m_flagAutoFocusRunning = true;
1914 
1915     return true;
1916 }
1917 
cancelAutoFocus(void)1918 bool ExynosCamera::cancelAutoFocus(void)
1919 {
1920     if (m_previewDev->fd <= 0) {
1921         ALOGE("ERR(%s):Camera was closed", __func__);
1922         return false;
1923     }
1924 
1925     if (m_flagAutoFocusRunning == false) {
1926         ALOGV("DEBUG(%s):m_flagAutoFocusRunning == false", __func__);
1927         return true;
1928     }
1929 
1930     switch (m_curCameraInfo->focusMode) {
1931     case FOCUS_MODE_AUTO:
1932     case FOCUS_MODE_INFINITY:
1933     case FOCUS_MODE_MACRO:
1934         if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_SET_AUTO_FOCUS, AUTO_FOCUS_OFF) < 0) {
1935             ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
1936             return false;
1937         }
1938         break;
1939     case FOCUS_MODE_CONTINUOUS_VIDEO:
1940     case FOCUS_MODE_CONTINUOUS_PICTURE:
1941         /* Doing nothing. Because we assume that continuous focus mode is
1942            always focused on. */
1943         break;
1944     case FOCUS_MODE_TOUCH:
1945         if (setFocusMode(FOCUS_MODE_TOUCH) == false) {
1946             ALOGE("ERR(%s): %d: setFocusMode(FOCUS_MODE_TOUCH) fail", __func__, __LINE__);
1947             return false;
1948         }
1949         m_touchAFMode = false;
1950         break;
1951     case FOCUS_MODE_FIXED:
1952         break;
1953     case FOCUS_MODE_EDOF:
1954     default:
1955         ALOGE("ERR(%s):Unsupported value(%d)", __func__, m_curCameraInfo->focusMode);
1956         return false;
1957         break;
1958     }
1959 
1960     m_flagAutoFocusRunning = false;
1961 
1962     return true;
1963 }
1964 
getFucusModeResult(void)1965 int ExynosCamera::getFucusModeResult(void)
1966 {
1967     int ret = 0;
1968 
1969 #define AF_WATING_TIME       (100000)  //  100msec
1970 #define TOTAL_AF_WATING_TIME (2000000) // 2000msec
1971 
1972     for (unsigned int i = 0; i < TOTAL_AF_WATING_TIME; i += AF_WATING_TIME) {
1973 
1974         if (m_flagAutoFocusRunning == false)
1975             return -1;
1976 
1977         if (exynos_v4l2_g_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_AUTO_FOCUS_RESULT, &ret) < 0) {
1978             ALOGE("ERR(%s):exynos_v4l2_g_ctrl() fail", __func__);
1979             return -1;
1980         }
1981 
1982         if (strcmp((const char*)m_cameraName, "S5K4E5") == 0) {
1983             switch(ret) {
1984             case 0x00: // AF Running
1985                 ret = 0;
1986                 break;
1987             case 0x02: // AF succeed
1988                 ret = 1;
1989                 break;
1990             case 0x01:
1991             default :  // AF fail
1992                 ret = -1;
1993                 break;
1994             }
1995 
1996             if (ret != 0)
1997                 break;
1998 
1999         } else if (strcmp((const char*)m_cameraName, "M5M0") == 0) {
2000             switch(ret) {
2001             case 0x00: // AF Running
2002                 ret = 0;
2003                 break;
2004             case 0x01: // AF succeed
2005                 ret = 1;
2006                 break;
2007             case 0x02: // AF cancel
2008                 ret = 0;
2009                 break;
2010             default:  // AF fail
2011                 ret = -1;
2012                 break;
2013             }
2014 
2015             if (ret != 0)
2016                 break;
2017         } else {
2018             ret = -1;
2019             break;
2020         }
2021 
2022         usleep(AF_WATING_TIME);
2023     }
2024 
2025     return ret;
2026 }
2027 
startFaceDetection(void)2028 bool ExynosCamera::startFaceDetection(void)
2029 {
2030     if (m_flagStartFaceDetection == true) {
2031         ALOGD("DEBUG(%s):Face detection already started..", __func__);
2032         return true;
2033     }
2034 
2035     if (m_previewDev->flagStart == true) {
2036         //if (this->setFocusMode(FOCUS_MODE_AUTO) == false)
2037         //    ALOGE("ERR(%s):Fail setFocusMode", __func__);
2038 
2039         if (m_internalISP == true) {
2040             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_FD_SET_MAX_FACE_NUMBER, m_defaultCameraInfo->maxNumDetectedFaces) < 0) {
2041                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
2042                 return false;
2043             }
2044 
2045             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CMD_FD, IS_FD_COMMAND_START) < 0) {
2046                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
2047                 return false;
2048             }
2049         } else {
2050             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_FACE_DETECTION, FACE_DETECTION_ON) < 0) {
2051                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
2052                 return false;
2053             }
2054         }
2055         m_flagStartFaceDetection = true;
2056     }
2057     return true;
2058 }
2059 
stopFaceDetection(void)2060 bool ExynosCamera::stopFaceDetection(void)
2061 {
2062     if (m_flagStartFaceDetection == false) {
2063         ALOGD("DEBUG(%s):Face detection already stopped..", __func__);
2064         return true;
2065     }
2066 
2067     if (m_previewDev->flagStart == true) {
2068         if (m_internalISP == true) {
2069             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CMD_FD, IS_FD_COMMAND_STOP) < 0) {
2070                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
2071                 return false;
2072             }
2073         } else {
2074             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_FACE_DETECTION, FACE_DETECTION_OFF) < 0) {
2075                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
2076                 return false;
2077             }
2078         }
2079         m_flagStartFaceDetection = false;
2080     }
2081     return true;
2082 }
2083 
flagStartFaceDetection(void)2084 bool ExynosCamera::flagStartFaceDetection(void)
2085 {
2086     return m_flagStartFaceDetection;
2087 }
2088 
setFaceDetectLock(bool toggle)2089 bool ExynosCamera::setFaceDetectLock(bool toggle)
2090 {
2091     int lock = (toggle == true) ? 1 : 0;
2092 
2093     if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_FACEDETECT_LOCKUNLOCK, lock) < 0) {
2094         ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
2095         return false;
2096     }
2097     return true;
2098 }
2099 
startSmoothZoom(int value)2100 bool ExynosCamera::startSmoothZoom(int value)
2101 {
2102     if (m_defaultCameraInfo->hwZoomSupported == false) {
2103         ALOGE("ERR(%s):m_defaultCameraInfo->hwZoomSupported == false", __func__);
2104         return false;
2105     }
2106 
2107     return this->setZoom(value);
2108 }
2109 
stopSmoothZoom(void)2110 bool ExynosCamera::stopSmoothZoom(void)
2111 {
2112     // TODO
2113     return true;
2114 }
2115 
getAntibanding(void)2116 int ExynosCamera::getAntibanding(void)
2117 {
2118     return m_curCameraInfo->antiBanding;
2119 }
2120 
getAutoExposureLock(void)2121 bool ExynosCamera::getAutoExposureLock(void)
2122 {
2123     return m_curCameraInfo->autoExposureLock;
2124 }
2125 
getAutoWhiteBalanceLock(void)2126 bool ExynosCamera::getAutoWhiteBalanceLock(void)
2127 {
2128     return m_curCameraInfo->autoWhiteBalanceLock;
2129 }
2130 
getColorEffect(void)2131 int ExynosCamera::getColorEffect(void)
2132 {
2133     return m_curCameraInfo->effect;
2134 }
2135 
getDetectedFacesAreas(int num,int * id,int * score,ExynosRect * face,ExynosRect * leftEye,ExynosRect * rightEye,ExynosRect * mouth)2136 int ExynosCamera::getDetectedFacesAreas(int num,
2137                                         int *id,
2138                                         int *score,
2139                                         ExynosRect *face,
2140                                         ExynosRect *leftEye,
2141                                         ExynosRect *rightEye,
2142                                         ExynosRect *mouth)
2143 {
2144     if (m_defaultCameraInfo->maxNumDetectedFaces == 0) {
2145         ALOGE("ERR(%s):maxNumDetectedFaces == 0 fail", __func__);
2146         return -1;
2147     }
2148 
2149     if (m_flagStartFaceDetection == false) {
2150         ALOGD("DEBUG(%s):m_flagStartFaceDetection == false", __func__);
2151         return 0;
2152     }
2153 
2154     if (m_defaultCameraInfo->maxNumDetectedFaces < num)
2155         num = m_defaultCameraInfo->maxNumDetectedFaces;
2156 
2157     // width   : 0 ~ previewW
2158     // height  : 0 ~ previewH
2159     // if eye, mouth is not detectable : -1, -1
2160     ExynosRect2 *face2     = new ExynosRect2[num];
2161     ExynosRect2 *leftEye2  = new ExynosRect2[num];
2162     ExynosRect2 *rightEye2 = new ExynosRect2[num];
2163     ExynosRect2 *mouth2    = new ExynosRect2[num];
2164 
2165     num = getDetectedFacesAreas(num, id, score, face2, leftEye2, rightEye2, mouth2);
2166 
2167     for (int i = 0; i < num; i++) {
2168 
2169         m_secRect22SecRect(&face2[i], &face[i]);
2170         face[i].fullW = m_curCameraInfo->previewW;
2171         face[i].fullH = m_curCameraInfo->previewH;
2172 
2173         m_secRect22SecRect(&leftEye2[i], &leftEye[i]);
2174         leftEye[i].fullW = m_curCameraInfo->previewW;
2175         leftEye[i].fullH = m_curCameraInfo->previewH;
2176 
2177         m_secRect22SecRect(&rightEye2[i], &rightEye[i]);
2178         rightEye[i].fullW = m_curCameraInfo->previewW;
2179         rightEye[i].fullH = m_curCameraInfo->previewH;
2180 
2181         m_secRect22SecRect(&mouth2[i], &mouth[i]);
2182         mouth[i].fullW = m_curCameraInfo->previewW;
2183         mouth[i].fullH = m_curCameraInfo->previewH;
2184     }
2185 
2186     delete [] face2;
2187     delete [] leftEye2;
2188     delete [] rightEye2;
2189     delete [] mouth2;
2190 
2191     return num;
2192 }
2193 
getDetectedFacesAreas(int num,int * id,int * score,ExynosRect2 * face,ExynosRect2 * leftEye,ExynosRect2 * rightEye,ExynosRect2 * mouth)2194 int ExynosCamera::getDetectedFacesAreas(int num,
2195                                      int *id,
2196                                      int *score,
2197                                      ExynosRect2 *face,
2198                                      ExynosRect2 *leftEye,
2199                                      ExynosRect2 *rightEye,
2200                                      ExynosRect2 *mouth)
2201 {
2202     if (m_defaultCameraInfo->maxNumDetectedFaces == 0) {
2203         ALOGE("ERR(%s):maxNumDetectedFaces == 0 fail", __func__);
2204         return -1;
2205     }
2206 
2207     if (m_flagStartFaceDetection == false) {
2208         ALOGD("DEBUG(%s):m_flagStartFaceDetection == false", __func__);
2209         return 0;
2210     }
2211 
2212     int i = 0;
2213 
2214     if (m_defaultCameraInfo->maxNumDetectedFaces < num)
2215         num = m_defaultCameraInfo->maxNumDetectedFaces;
2216 
2217     const unsigned int numOfFDEntity = 1 + ((V4L2_CID_IS_FD_GET_NEXT - V4L2_CID_IS_FD_GET_FACE_FRAME_NUMBER) * num);
2218 
2219     // width   : 0 ~ previewW
2220     // height  : 0 ~ previewH
2221     // if eye, mouth is not detectable : -1, -1
2222     struct v4l2_ext_controls fd_ctrls;
2223     struct v4l2_ext_control *fd_ctrl = new struct v4l2_ext_control[numOfFDEntity];
2224     struct v4l2_ext_control *cur_ctrl;
2225 
2226     cur_ctrl = &fd_ctrl[0];
2227     cur_ctrl->id = V4L2_CID_IS_FD_GET_FACE_COUNT;
2228     cur_ctrl++;
2229 
2230     for (i = 0; i < num; i++) {
2231         cur_ctrl->id = V4L2_CID_IS_FD_GET_FACE_FRAME_NUMBER;
2232         cur_ctrl++;
2233         cur_ctrl->id = V4L2_CID_IS_FD_GET_FACE_CONFIDENCE;
2234         cur_ctrl++;
2235         cur_ctrl->id = V4L2_CID_IS_FD_GET_FACE_TOPLEFT_X;
2236         cur_ctrl++;
2237         cur_ctrl->id = V4L2_CID_IS_FD_GET_FACE_TOPLEFT_Y;
2238         cur_ctrl++;
2239         cur_ctrl->id = V4L2_CID_IS_FD_GET_FACE_BOTTOMRIGHT_X;
2240         cur_ctrl++;
2241         cur_ctrl->id = V4L2_CID_IS_FD_GET_FACE_BOTTOMRIGHT_Y;
2242         cur_ctrl++;
2243         cur_ctrl->id = V4L2_CID_IS_FD_GET_LEFT_EYE_TOPLEFT_X;
2244         cur_ctrl++;
2245         cur_ctrl->id = V4L2_CID_IS_FD_GET_LEFT_EYE_TOPLEFT_Y;
2246         cur_ctrl++;
2247         cur_ctrl->id = V4L2_CID_IS_FD_GET_LEFT_EYE_BOTTOMRIGHT_X;
2248         cur_ctrl++;
2249         cur_ctrl->id = V4L2_CID_IS_FD_GET_LEFT_EYE_BOTTOMRIGHT_Y;
2250         cur_ctrl++;
2251         cur_ctrl->id = V4L2_CID_IS_FD_GET_RIGHT_EYE_TOPLEFT_X;
2252         cur_ctrl++;
2253         cur_ctrl->id = V4L2_CID_IS_FD_GET_RIGHT_EYE_TOPLEFT_Y;
2254         cur_ctrl++;
2255         cur_ctrl->id = V4L2_CID_IS_FD_GET_RIGHT_EYE_BOTTOMRIGHT_X;
2256         cur_ctrl++;
2257         cur_ctrl->id = V4L2_CID_IS_FD_GET_RIGHT_EYE_BOTTOMRIGHT_Y;
2258         cur_ctrl++;
2259         cur_ctrl->id = V4L2_CID_IS_FD_GET_MOUTH_TOPLEFT_X;
2260         cur_ctrl++;
2261         cur_ctrl->id = V4L2_CID_IS_FD_GET_MOUTH_TOPLEFT_Y;
2262         cur_ctrl++;
2263         cur_ctrl->id = V4L2_CID_IS_FD_GET_MOUTH_BOTTOMRIGHT_X;
2264         cur_ctrl++;
2265         cur_ctrl->id = V4L2_CID_IS_FD_GET_MOUTH_BOTTOMRIGHT_Y;
2266         cur_ctrl++;
2267         cur_ctrl->id = V4L2_CID_IS_FD_GET_NEXT;
2268         cur_ctrl++;
2269     }
2270 
2271     fd_ctrls.ctrl_class = V4L2_CTRL_CLASS_CAMERA;
2272     fd_ctrls.count = i + 1;
2273     fd_ctrls.controls = fd_ctrl;
2274 
2275     if (exynos_v4l2_g_ext_ctrl(m_previewDev->fd, &fd_ctrls) < 0) {
2276         ALOGE("ERR(%s):exynos_v4l2_g_ext_ctrl() fail", __func__);
2277         num = -1;
2278         goto done;
2279     }
2280 
2281     cur_ctrl = &fd_ctrl[0];
2282     num = cur_ctrl->value;
2283     cur_ctrl++;
2284 
2285     for (i = 0; i < num; i++) {
2286         id[i] = cur_ctrl->value;
2287         cur_ctrl++;
2288         score[i] = cur_ctrl->value;
2289         cur_ctrl++;
2290 
2291         face[i].x1 = cur_ctrl->value;
2292         cur_ctrl++;
2293         face[i].y1 = cur_ctrl->value;
2294         cur_ctrl++;
2295         face[i].x2 = cur_ctrl->value;
2296         cur_ctrl++;
2297         face[i].y2 = cur_ctrl->value;
2298         cur_ctrl++;
2299 
2300         leftEye[i].x1 = cur_ctrl->value;
2301         cur_ctrl++;
2302         leftEye[i].y1 = cur_ctrl->value;
2303         cur_ctrl++;
2304         leftEye[i].x2 = cur_ctrl->value;
2305         cur_ctrl++;
2306         leftEye[i].y2 = cur_ctrl->value;
2307         cur_ctrl++;
2308 
2309         rightEye[i].x1 = cur_ctrl->value;
2310         cur_ctrl++;
2311         rightEye[i].y1 = cur_ctrl->value;
2312         cur_ctrl++;
2313         rightEye[i].x2 = cur_ctrl->value;
2314         cur_ctrl++;
2315         rightEye[i].y2 = cur_ctrl->value;
2316         cur_ctrl++;
2317 
2318         mouth[i].x1 = cur_ctrl->value;
2319         cur_ctrl++;
2320         mouth[i].y1 = cur_ctrl->value;
2321         cur_ctrl++;
2322         mouth[i].x2 = cur_ctrl->value;
2323         cur_ctrl++;
2324         mouth[i].y2 = cur_ctrl->value;
2325         cur_ctrl++;
2326     }
2327 
2328 done:
2329     delete [] fd_ctrl;
2330 
2331     return num;
2332 }
2333 
getExposureCompensation(void)2334 int ExynosCamera::getExposureCompensation(void)
2335 {
2336     return m_curCameraInfo->exposure;
2337 }
2338 
getExposureCompensationStep(void)2339 float ExynosCamera::getExposureCompensationStep(void)
2340 {
2341     // CameraParameters.h
2342     // The exposure compensation step. Exposure compensation index multiply by
2343     // step eqals to EV. Ex: if exposure compensation index is 6 and step is
2344     // 0.3333, EV is -2.
2345     // Example value: "0.333333333" or "0.5". Read only.
2346     // -> But, this formula doesn't works in apps.
2347     return 1.0f;
2348 }
2349 
getFlashMode(void)2350 int ExynosCamera::getFlashMode(void)
2351 {
2352     return m_curCameraInfo->flashMode;
2353 }
2354 
getFocalLength(int * num,int * den)2355 bool ExynosCamera::getFocalLength(int *num, int *den)
2356 {
2357     *num = m_defaultCameraInfo->focalLengthNum;
2358     *num = m_defaultCameraInfo->focalLengthDen;
2359     return true;
2360 }
2361 
getFocusAreas(ExynosRect * rects)2362 int ExynosCamera::getFocusAreas(ExynosRect *rects)
2363 {
2364     // TODO
2365     return 0;
2366 }
2367 
getFocusDistances(float * output)2368 int ExynosCamera::getFocusDistances(float *output)
2369 {
2370     // TODO
2371     return 0;
2372 }
2373 
getFocusMode(void)2374 int ExynosCamera::getFocusMode(void)
2375 {
2376     return m_curCameraInfo->focusMode;
2377 }
2378 
getHorizontalViewAngle(void)2379 float ExynosCamera::getHorizontalViewAngle(void)
2380 {
2381     //TODO
2382     return 51.2f;
2383 }
2384 
getJpegQuality(void)2385 int ExynosCamera::getJpegQuality(void)
2386 {
2387     return m_jpegQuality;
2388 }
2389 
getJpegThumbnailQuality(void)2390 int ExynosCamera::getJpegThumbnailQuality(void)
2391 {
2392     return m_jpegThumbnailQuality;
2393 }
2394 
getJpegThumbnailSize(int * w,int * h)2395 bool ExynosCamera::getJpegThumbnailSize(int *w, int  *h)
2396 {
2397     *w  = m_curCameraInfo->thumbnailW;
2398     *h  = m_curCameraInfo->thumbnailH;
2399     return true;
2400 }
2401 
getMaxExposureCompensation(void)2402 int ExynosCamera::getMaxExposureCompensation(void)
2403 {
2404     return m_defaultCameraInfo->maxExposure;
2405 }
2406 
getMaxNumDetectedFaces(void)2407 int ExynosCamera::getMaxNumDetectedFaces(void)
2408 {
2409     return m_defaultCameraInfo->maxNumDetectedFaces;
2410 }
2411 
getMaxNumFocusAreas(void)2412 int ExynosCamera::getMaxNumFocusAreas(void)
2413 {
2414     return m_defaultCameraInfo->maxNumFocusAreas;
2415 }
2416 
getMaxNumMeteringAreas(void)2417 int ExynosCamera::getMaxNumMeteringAreas(void)
2418 {
2419     return m_defaultCameraInfo->maxNumMeteringAreas;
2420 }
2421 
getMaxZoom(void)2422 int ExynosCamera::getMaxZoom(void)
2423 {
2424     return m_defaultCameraInfo->maxZoom;
2425 }
2426 
getMeteringAreas(ExynosRect * rects)2427 int ExynosCamera::getMeteringAreas(ExynosRect *rects)
2428 {
2429     // TODO
2430     return 0;
2431 }
2432 
getMinExposureCompensation(void)2433 int ExynosCamera::getMinExposureCompensation(void)
2434 {
2435     return m_defaultCameraInfo->minExposure;
2436 }
2437 
getPictureFormat(void)2438 int ExynosCamera::getPictureFormat(void)
2439 {
2440     return m_curCameraInfo->pictureColorFormat;
2441 }
2442 
getPictureSize(int * w,int * h)2443 bool ExynosCamera::getPictureSize(int *w, int *h)
2444 {
2445     *w = m_curCameraInfo->pictureW;
2446     *h = m_curCameraInfo->pictureH;
2447     return true;
2448 }
2449 
getPreviewFormat(void)2450 int ExynosCamera::getPreviewFormat(void)
2451 {
2452     return m_curCameraInfo->previewColorFormat;
2453 }
2454 
getPreviewFpsRange(int * min,int * max)2455 bool ExynosCamera::getPreviewFpsRange(int *min, int *max)
2456 {
2457     *min = 1;
2458     *max = m_defaultCameraInfo->fps;
2459     return true;
2460 }
2461 
getPreviewFrameRate(void)2462 int ExynosCamera::getPreviewFrameRate(void)
2463 {
2464     return m_curCameraInfo->fps;
2465 }
2466 
getPreviewSize(int * w,int * h)2467 bool ExynosCamera::getPreviewSize(int *w, int *h)
2468 {
2469     *w = m_curCameraInfo->previewW;
2470     *h = m_curCameraInfo->previewH;
2471     return true;
2472 }
2473 
getSceneMode(void)2474 int ExynosCamera::getSceneMode(void)
2475 {
2476     return m_curCameraInfo->sceneMode;
2477 }
2478 
getSupportedAntibanding(void)2479 int ExynosCamera::getSupportedAntibanding(void)
2480 {
2481     return m_defaultCameraInfo->antiBandingList;
2482 }
2483 
getSupportedColorEffects(void)2484 int ExynosCamera::getSupportedColorEffects(void)
2485 {
2486     return m_defaultCameraInfo->effectList;
2487 }
2488 
getSupportedFlashModes(void)2489 int ExynosCamera::getSupportedFlashModes(void)
2490 {
2491     return m_defaultCameraInfo->flashModeList;
2492 }
2493 
getSupportedFocusModes(void)2494 int ExynosCamera::getSupportedFocusModes(void)
2495 {
2496     return m_defaultCameraInfo->focusModeList;
2497 }
2498 
getSupportedJpegThumbnailSizes(int * w,int * h)2499 bool ExynosCamera::getSupportedJpegThumbnailSizes(int *w, int *h)
2500 {
2501     *w  = m_defaultCameraInfo->thumbnailW;
2502     *h  = m_defaultCameraInfo->thumbnailH;
2503     return true;
2504 }
2505 
getSupportedPictureSizes(int * w,int * h)2506 bool ExynosCamera::getSupportedPictureSizes(int *w, int *h)
2507 {
2508     *w = m_defaultCameraInfo->pictureW;
2509     *h = m_defaultCameraInfo->pictureH;
2510     return true;
2511 }
2512 
getSupportedPreviewSizes(int * w,int * h)2513 bool ExynosCamera::getSupportedPreviewSizes(int *w, int *h)
2514 {
2515     *w = m_defaultCameraInfo->previewW;
2516     *h = m_defaultCameraInfo->previewH;
2517     return true;
2518 }
2519 
getSupportedSceneModes(void)2520 int ExynosCamera::getSupportedSceneModes(void)
2521 {
2522     return m_defaultCameraInfo->sceneModeList;
2523 }
2524 
getSupportedVideoSizes(int * w,int * h)2525 bool ExynosCamera::getSupportedVideoSizes(int *w, int *h)
2526 {
2527     *w = m_defaultCameraInfo->videoW;
2528     *h = m_defaultCameraInfo->videoH;
2529     return true;
2530 }
2531 
getPreferredPreivewSizeForVideo(int * w,int * h)2532 bool ExynosCamera::getPreferredPreivewSizeForVideo(int *w, int *h)
2533 {
2534     *w = m_defaultCameraInfo->prefVideoPreviewW;
2535     *h = m_defaultCameraInfo->prefVideoPreviewH;
2536     return true;
2537 }
2538 
getSupportedWhiteBalance(void)2539 int ExynosCamera::getSupportedWhiteBalance(void)
2540 {
2541     return m_defaultCameraInfo->whiteBalanceList;
2542 }
2543 
getVerticalViewAngle(void)2544 float ExynosCamera::getVerticalViewAngle(void)
2545 {
2546     // TODO
2547     return 39.4f;
2548 }
2549 
getVideoStabilization(void)2550 bool ExynosCamera::getVideoStabilization(void)
2551 {
2552     return m_curCameraInfo->videoStabilization;
2553 }
2554 
getWhiteBalance(void)2555 int ExynosCamera::getWhiteBalance(void)
2556 {
2557     return m_curCameraInfo->whiteBalance;
2558 }
2559 
getZoom(void)2560 int ExynosCamera::getZoom(void)
2561 {
2562     return m_curCameraInfo->zoom;
2563 }
2564 
getMaxZoomRatio(void)2565 int ExynosCamera::getMaxZoomRatio(void)
2566 {
2567     return 400;
2568 }
2569 
isAutoExposureLockSupported(void)2570 bool ExynosCamera::isAutoExposureLockSupported(void)
2571 {
2572     return m_defaultCameraInfo->autoExposureLockSupported;
2573 }
2574 
isAutoWhiteBalanceLockSupported(void)2575 bool ExynosCamera::isAutoWhiteBalanceLockSupported(void)
2576 {
2577     return m_defaultCameraInfo->autoWhiteBalanceLockSupported;
2578 }
2579 
isSmoothZoomSupported(void)2580 bool ExynosCamera::isSmoothZoomSupported(void)
2581 {
2582     if (m_defaultCameraInfo->hwZoomSupported == true)
2583         return true;
2584     else
2585         return false;
2586 }
2587 
isVideoSnapshotSupported(void)2588 bool ExynosCamera::isVideoSnapshotSupported(void)
2589 {
2590     return true;
2591 }
2592 
isVideoStabilizationSupported(void)2593 bool ExynosCamera::isVideoStabilizationSupported(void)
2594 {
2595     return m_defaultCameraInfo->supportVideoStabilization;
2596 }
2597 
isZoomSupported(void)2598 bool ExynosCamera::isZoomSupported(void)
2599 {
2600     return true;
2601 }
2602 
setAntibanding(int value)2603 bool ExynosCamera::setAntibanding(int value)
2604 {
2605     int internalValue = -1;
2606 
2607     switch (value) {
2608     case ANTIBANDING_AUTO:
2609         internalValue = ::ANTI_BANDING_AUTO;
2610         break;
2611     case ANTIBANDING_50HZ:
2612         internalValue = ::ANTI_BANDING_50HZ;
2613         break;
2614     case ANTIBANDING_60HZ:
2615         internalValue = ::ANTI_BANDING_60HZ;
2616         break;
2617     case ANTIBANDING_OFF:
2618         internalValue = ::ANTI_BANDING_OFF;
2619         break;
2620     default:
2621         ALOGE("ERR(%s):Unsupported value(%d)", __func__, value);
2622         return false;
2623         break;
2624     }
2625 
2626     if (m_internalISP == true) {
2627         if (internalValue < ::IS_AFC_DISABLE || ::IS_AFC_MAX <= internalValue) {
2628             ALOGE("ERR(%s):Invalid value (%d)", __func__, value);
2629             return false;
2630         }
2631     } else {
2632         if (internalValue < ::ANTI_BANDING_AUTO || ::ANTI_BANDING_OFF < internalValue) {
2633             ALOGE("ERR(%s):Invalid internalValue (%d)", __func__, internalValue);
2634             return false;
2635         }
2636     }
2637 
2638     if (m_curCameraInfo->antiBanding != value) {
2639         m_curCameraInfo->antiBanding = value;
2640         if (m_flagCreate == true) {
2641             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_AFC_MODE, internalValue) < 0) {
2642                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
2643                 return false;
2644             }
2645         }
2646     }
2647 
2648     return true;
2649 }
2650 
setAutoExposureLock(bool toggle)2651 bool ExynosCamera::setAutoExposureLock(bool toggle)
2652 {
2653     int internalValue = -1;
2654 
2655     if (m_curCameraInfo->autoExposureLock == toggle)
2656         return true;
2657 
2658     m_curCameraInfo->autoExposureLock = toggle;
2659 
2660     if (m_curCameraInfo->autoExposureLock == true && m_curCameraInfo->autoWhiteBalanceLock == true)
2661         internalValue = AE_LOCK_AWB_LOCK;
2662     else if (m_curCameraInfo->autoExposureLock == true && m_curCameraInfo->autoWhiteBalanceLock == false)
2663         internalValue = AE_LOCK_AWB_UNLOCK;
2664     else if (m_curCameraInfo->autoExposureLock == false && m_curCameraInfo->autoWhiteBalanceLock == true)
2665         internalValue = AE_UNLOCK_AWB_LOCK;
2666     else // if (m_curCameraInfo->autoExposureLock == false && m_curCameraInfo->autoWhiteBalanceLock == false)
2667         internalValue = AE_UNLOCK_AWB_UNLOCK;
2668 
2669     if (m_flagCreate == true) {
2670         if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_AEAWB_LOCK_UNLOCK, internalValue) < 0) {
2671             ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
2672             return false;
2673         }
2674     }
2675     return true;
2676 }
2677 
setAutoWhiteBalanceLock(bool toggle)2678 bool ExynosCamera::setAutoWhiteBalanceLock(bool toggle)
2679 {
2680     int internalValue = -1;
2681 
2682     if (m_curCameraInfo->autoWhiteBalanceLock == toggle)
2683         return true;
2684 
2685     m_curCameraInfo->autoWhiteBalanceLock = toggle;
2686 
2687     if (m_curCameraInfo->autoExposureLock == true && m_curCameraInfo->autoWhiteBalanceLock == true)
2688         internalValue = AE_LOCK_AWB_LOCK;
2689     else if (m_curCameraInfo->autoExposureLock == true && m_curCameraInfo->autoWhiteBalanceLock == false)
2690         internalValue = AE_LOCK_AWB_UNLOCK;
2691     else if (m_curCameraInfo->autoExposureLock == false && m_curCameraInfo->autoWhiteBalanceLock == true)
2692         internalValue = AE_UNLOCK_AWB_LOCK;
2693     else // if (m_curCameraInfo->autoExposureLock == false && m_curCameraInfo->autoWhiteBalanceLock == false)
2694         internalValue = AE_UNLOCK_AWB_UNLOCK;
2695 
2696     if (m_flagCreate == true) {
2697         if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_AEAWB_LOCK_UNLOCK, internalValue) < 0) {
2698             ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
2699             return false;
2700         }
2701     }
2702     return true;
2703 }
2704 
setColorEffect(int value)2705 bool ExynosCamera::setColorEffect(int value)
2706 {
2707     int internalValue = -1;
2708 
2709     switch (value) {
2710     case EFFECT_NONE:
2711         if (m_internalISP == true)
2712             internalValue = ::IS_IMAGE_EFFECT_DISABLE;
2713         else
2714             internalValue = ::IMAGE_EFFECT_NONE;
2715         break;
2716     case EFFECT_MONO:
2717         if (m_internalISP == true)
2718             internalValue = ::IS_IMAGE_EFFECT_MONOCHROME;
2719         else
2720             internalValue = ::IMAGE_EFFECT_BNW;
2721         break;
2722     case EFFECT_NEGATIVE:
2723         internalValue = IS_IMAGE_EFFECT_NEGATIVE_MONO;
2724         break;
2725     case EFFECT_SEPIA:
2726         if (m_internalISP == true)
2727             internalValue = ::IS_IMAGE_EFFECT_SEPIA;
2728         else
2729             internalValue = ::IMAGE_EFFECT_SEPIA;
2730         break;
2731     case EFFECT_AQUA:
2732     case EFFECT_SOLARIZE:
2733     case EFFECT_POSTERIZE:
2734     case EFFECT_WHITEBOARD:
2735     case EFFECT_BLACKBOARD:
2736     default:
2737         ALOGE("ERR(%s):Unsupported value(%d)", __func__, value);
2738         return false;
2739         break;
2740     }
2741 
2742     if (m_internalISP == true) {
2743         if (internalValue < ::IS_IMAGE_EFFECT_DISABLE || ::IS_IMAGE_EFFECT_MAX <= internalValue) {
2744             ALOGE("ERR(%s):Invalid internalValue(%d)", __func__, internalValue);
2745             return false;
2746         }
2747     } else {
2748         if (internalValue <= ::IMAGE_EFFECT_BASE || ::IMAGE_EFFECT_MAX <= internalValue) {
2749             ALOGE("ERR(%s):Invalid internalValue(%d)", __func__, internalValue);
2750             return false;
2751         }
2752     }
2753 
2754     if (m_curCameraInfo->effect != value) {
2755         m_curCameraInfo->effect = value;
2756         if (m_flagCreate == true) {
2757             if (m_internalISP == true) {
2758                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_IMAGE_EFFECT, internalValue) < 0) {
2759                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
2760                     return false;
2761                 }
2762             } else {
2763                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_EFFECT, internalValue) < 0) {
2764                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
2765                     return false;
2766                 }
2767             }
2768         }
2769     }
2770 
2771     return true;
2772 }
2773 
setExposureCompensation(int value)2774 bool ExynosCamera::setExposureCompensation(int value)
2775 {
2776     int internalValue = value;
2777 
2778     if (m_internalISP == true) {
2779         internalValue += IS_EXPOSURE_DEFAULT;
2780         if (internalValue < IS_EXPOSURE_MINUS_2 || IS_EXPOSURE_PLUS_2 < internalValue) {
2781             ALOGE("ERR(%s):Invalid internalValue(%d)", __func__, internalValue);
2782             return false;
2783         }
2784     } else {
2785         internalValue += EV_DEFAULT;
2786         if (internalValue < EV_MINUS_4 || EV_PLUS_4 < internalValue) {
2787             ALOGE("ERR(%s):Invalid internalValue(%d)", __func__, internalValue);
2788             return false;
2789         }
2790     }
2791 
2792     if (m_curCameraInfo->exposure != value) {
2793         m_curCameraInfo->exposure = value;
2794         if (m_flagCreate == true) {
2795             if (m_internalISP == true) {
2796                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_EXPOSURE, internalValue) < 0) {
2797                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
2798                     return false;
2799                 }
2800             } else {
2801                 if (this->setBrightness(value) == false) {
2802                     ALOGE("ERR(%s):setBrightness() fail", __func__);
2803                     return false;
2804                 }
2805             }
2806         }
2807     }
2808 
2809     return true;
2810 }
2811 
setFlashMode(int value)2812 bool ExynosCamera::setFlashMode(int value)
2813 {
2814     int internalValue = -1;
2815 
2816     switch (value) {
2817     case FLASH_MODE_OFF:
2818         internalValue = ::FLASH_MODE_OFF;
2819         break;
2820     case FLASH_MODE_AUTO:
2821         internalValue = ::FLASH_MODE_AUTO;
2822         break;
2823     case FLASH_MODE_ON:
2824         internalValue = ::FLASH_MODE_ON;
2825         break;
2826     case FLASH_MODE_TORCH:
2827         internalValue = ::FLASH_MODE_TORCH;
2828         break;
2829     case FLASH_MODE_RED_EYE:
2830     default:
2831         ALOGE("ERR(%s):Unsupported value(%d)", __func__, value);
2832         return false;
2833         break;
2834     }
2835 
2836     if (internalValue <= ::FLASH_MODE_BASE || ::FLASH_MODE_MAX <= internalValue) {
2837         ALOGE("ERR(%s):Invalid value (%d)", __func__, value);
2838         return false;
2839     }
2840 
2841     if (m_curCameraInfo->flashMode != value) {
2842         m_curCameraInfo->flashMode = value;
2843         if (m_flagCreate == true) {
2844             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_FLASH_MODE, internalValue) < 0) {
2845                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
2846                 return false;
2847             }
2848         }
2849     }
2850 
2851     return true;
2852 }
2853 
setFocusAreas(int num,ExynosRect * rects,int * weights)2854 bool ExynosCamera::setFocusAreas(int num, ExynosRect* rects, int *weights)
2855 {
2856     if (m_defaultCameraInfo->maxNumFocusAreas == 0) {
2857         ALOGV("DEBUG(%s):maxNumFocusAreas is 0. so, ignored", __func__);
2858         return true;
2859     }
2860 
2861     bool ret = true;
2862 
2863     ExynosRect2 *rect2s = new ExynosRect2[num];
2864     for (int i = 0; i < num; i++)
2865         m_secRect2SecRect2(&rects[i], &rect2s[i]);
2866 
2867     ret = setFocusAreas(num, rect2s, weights);
2868 
2869     delete [] rect2s;
2870 
2871     return ret;
2872 }
2873 
setFocusAreas(int num,ExynosRect2 * rect2s,int * weights)2874 bool ExynosCamera::setFocusAreas(int num, ExynosRect2* rect2s, int *weights)
2875 {
2876     if (m_defaultCameraInfo->maxNumFocusAreas == 0) {
2877         ALOGV("DEBUG(%s):maxNumFocusAreas is 0. so, ignored", __func__);
2878         return true;
2879     }
2880 
2881     int new_x = 0;
2882     int new_y = 0;
2883 
2884     if (m_defaultCameraInfo->maxNumFocusAreas < num)
2885         num = m_defaultCameraInfo->maxNumFocusAreas;
2886 
2887     if (m_flagCreate == true) {
2888         for (int i = 0; i < num; i++) {
2889             if (   num == 1
2890                 && rect2s[0].x1 == 0
2891                 && rect2s[0].y1 == 0
2892                 && rect2s[0].x2 == m_curCameraInfo->previewW
2893                 && rect2s[0].y2 == m_curCameraInfo->previewH)  {
2894                 // TODO : driver decide focus areas -> focus center.
2895                 new_x = (m_curCameraInfo->previewW) / 2;
2896                 new_y = (m_curCameraInfo->previewH) / 2;
2897             } else {
2898                 new_x = (rect2s[i].x1 + rect2s[i].x2) / 2;
2899                 new_y = (rect2s[i].y1 + rect2s[i].y2) / 2;
2900             }
2901 
2902             m_touchAFMode = true;
2903             if (   exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_OBJECT_POSITION_X, new_x) < 0
2904                 && exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_OBJECT_POSITION_Y, new_y) < 0) {
2905                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
2906                 return false;
2907             }
2908         }
2909     }
2910 
2911     return true;
2912 }
2913 
setFocusMode(int value)2914 bool ExynosCamera::setFocusMode(int value)
2915 {
2916     int internalValue = -1;
2917 
2918     switch (value) {
2919     case FOCUS_MODE_AUTO:
2920         internalValue = ::FOCUS_MODE_AUTO;
2921         m_touchAFMode = false;
2922         break;
2923     case FOCUS_MODE_INFINITY:
2924         internalValue = ::FOCUS_MODE_INFINITY;
2925         m_touchAFMode = false;
2926         break;
2927     case FOCUS_MODE_MACRO:
2928         internalValue = ::FOCUS_MODE_MACRO;
2929         m_touchAFMode = false;
2930         break;
2931     case FOCUS_MODE_CONTINUOUS_VIDEO:
2932     case FOCUS_MODE_CONTINUOUS_PICTURE:
2933         internalValue = ::FOCUS_MODE_CONTINOUS;
2934         m_touchAFMode = false;
2935         break;
2936     case FOCUS_MODE_TOUCH:
2937         internalValue = ::FOCUS_MODE_TOUCH;
2938         m_touchAFMode = true;
2939         break;
2940     case FOCUS_MODE_FIXED:
2941         internalValue = ::FOCUS_MODE_FIXED;
2942         m_touchAFMode = false;
2943         break;
2944     case FOCUS_MODE_EDOF:
2945     default:
2946         m_touchAFMode = false;
2947         ALOGE("ERR(%s):Unsupported value(%d)", __func__, value);
2948         return false;
2949         break;
2950     }
2951 
2952     if (::FOCUS_MODE_MAX <= internalValue) {
2953         ALOGE("ERR(%s):Invalid internalValue (%d)", __func__, internalValue);
2954         return false;
2955     }
2956 
2957     if (m_curCameraInfo->focusMode != value) {
2958         m_curCameraInfo->focusMode = value;
2959         if (m_flagCreate == true) {
2960             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_FOCUS_MODE, internalValue) < 0) {
2961                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
2962                 return false;
2963             }
2964         }
2965     }
2966 
2967     return true;
2968 }
2969 
setGpsAltitude(const char * gpsAltitude)2970 bool ExynosCamera::setGpsAltitude(const char *gpsAltitude)
2971 {
2972     double conveted_altitude = 0;
2973 
2974     if (gpsAltitude == NULL)
2975         m_curCameraInfo->gpsAltitude = 0;
2976     else {
2977         conveted_altitude = atof(gpsAltitude);
2978         m_curCameraInfo->gpsAltitude = (long)(conveted_altitude * 100 / 1);
2979     }
2980 
2981     return true;
2982 }
2983 
setGpsLatitude(const char * gpsLatitude)2984 bool ExynosCamera::setGpsLatitude(const char *gpsLatitude)
2985 {
2986     double conveted_latitude = 0;
2987 
2988     if (gpsLatitude == NULL)
2989         m_curCameraInfo->gpsLatitude = 0;
2990     else {
2991         conveted_latitude = atof(gpsLatitude);
2992         m_curCameraInfo->gpsLatitude = (long)(conveted_latitude * 10000 / 1);
2993     }
2994 
2995     return true;
2996 }
2997 
setGpsLongitude(const char * gpsLongitude)2998 bool ExynosCamera::setGpsLongitude(const char *gpsLongitude)
2999 {
3000     double conveted_longitude = 0;
3001 
3002     if (gpsLongitude == NULL)
3003         m_curCameraInfo->gpsLongitude = 0;
3004     else {
3005         conveted_longitude = atof(gpsLongitude);
3006         m_curCameraInfo->gpsLongitude = (long)(conveted_longitude * 10000 / 1);
3007     }
3008 
3009     return true;
3010 }
3011 
setGpsProcessingMethod(const char * gpsProcessingMethod)3012 bool ExynosCamera::setGpsProcessingMethod(const char *gpsProcessingMethod)
3013 {
3014     memset(mExifInfo.gps_processing_method, 0, sizeof(mExifInfo.gps_processing_method));
3015 
3016     if (gpsProcessingMethod != NULL) {
3017         size_t len = strlen(gpsProcessingMethod);
3018         if (len > sizeof(mExifInfo.gps_processing_method)) {
3019             len = sizeof(mExifInfo.gps_processing_method);
3020         }
3021         memcpy(mExifInfo.gps_processing_method, gpsProcessingMethod, len);
3022     }
3023 
3024     return true;
3025 }
3026 
setGpsTimeStamp(const char * gpsTimestamp)3027 bool ExynosCamera::setGpsTimeStamp(const char *gpsTimestamp)
3028 {
3029     if (gpsTimestamp == NULL)
3030         m_curCameraInfo->gpsTimestamp = 0;
3031     else
3032         m_curCameraInfo->gpsTimestamp = atol(gpsTimestamp);
3033 
3034     return true;
3035 }
3036 
setJpegQuality(int quality)3037 bool ExynosCamera::setJpegQuality(int quality)
3038 {
3039     if (quality < JPEG_QUALITY_MIN || JPEG_QUALITY_MAX < quality) {
3040         ALOGE("ERR(%s):Invalid quality (%d)", __func__, quality);
3041         return false;
3042     }
3043 
3044     m_jpegQuality = quality;
3045 
3046     return true;
3047 }
3048 
setJpegThumbnailQuality(int quality)3049 bool ExynosCamera::setJpegThumbnailQuality(int quality)
3050 {
3051     if (quality < JPEG_QUALITY_MIN || JPEG_QUALITY_MAX < quality) {
3052         ALOGE("ERR(%s):Invalid quality (%d)", __func__, quality);
3053         return false;
3054     }
3055 
3056     m_jpegThumbnailQuality = quality;
3057 
3058     return true;
3059 }
3060 
setJpegThumbnailSize(int w,int h)3061 bool ExynosCamera::setJpegThumbnailSize(int w, int h)
3062 {
3063     m_curCameraInfo->thumbnailW = w;
3064     m_curCameraInfo->thumbnailH = h;
3065     return true;
3066 }
3067 
setMeteringAreas(int num,ExynosRect * rects,int * weights)3068 bool ExynosCamera::setMeteringAreas(int num, ExynosRect *rects, int *weights)
3069 {
3070     if (m_defaultCameraInfo->maxNumMeteringAreas == 0) {
3071         ALOGV("DEBUG(%s):maxNumMeteringAreas is 0. so, ignored", __func__);
3072         return true;
3073     }
3074 
3075     if (m_defaultCameraInfo->maxNumMeteringAreas < num)
3076         num = m_defaultCameraInfo->maxNumMeteringAreas;
3077 
3078     if (m_flagCreate == true) {
3079         for (int i = 0; i < num; i++) {
3080             if (   exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_METERING_POSITION_X, rects[i].x) < 0
3081                 && exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_METERING_POSITION_Y, rects[i].y) < 0
3082                 && exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_METERING_WINDOW_X,   rects[i].w) < 0
3083                 && exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_METERING_WINDOW_Y,   rects[i].h) < 0) {
3084                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
3085                 return false;
3086             }
3087         }
3088     }
3089 
3090     return true;
3091 }
3092 
setMeteringAreas(int num,ExynosRect2 * rect2s,int * weights)3093 bool ExynosCamera::setMeteringAreas(int num, ExynosRect2 *rect2s, int *weights)
3094 {
3095     if (m_defaultCameraInfo->maxNumMeteringAreas == 0) {
3096         ALOGV("DEBUG(%s):maxNumMeteringAreas is 0. so, ignored", __func__);
3097         return true;
3098     }
3099 
3100     bool ret = true;
3101 
3102     ExynosRect *rects = new ExynosRect[num];
3103     for (int i = 0; i < num; i++)
3104         m_secRect22SecRect(&rect2s[i], &rects[i]);
3105 
3106     /* FIXME: Currnetly HW dose not support metering area */
3107     //ret = setMeteringAreas(num, rects, weights);
3108 
3109     delete [] rects;
3110 
3111     return ret;
3112 }
3113 
setPictureFormat(int colorFormat)3114 bool ExynosCamera::setPictureFormat(int colorFormat)
3115 {
3116     m_curCameraInfo->pictureColorFormat = colorFormat;
3117 
3118 #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
3119     m_printFormat(m_curCameraInfo->pictureColorFormat, "PictureFormat");
3120 #endif
3121     return true;
3122 }
3123 
setPictureSize(int w,int h)3124 bool ExynosCamera::setPictureSize(int w, int h)
3125 {
3126     m_curCameraInfo->pictureW = w;
3127     m_curCameraInfo->pictureH = h;
3128 
3129     // HACK : Camera cannot support zoom. So, we must make max size picture w, h
3130     m_curCameraInfo->pictureW = m_defaultCameraInfo->pictureW;
3131     m_curCameraInfo->pictureH = m_defaultCameraInfo->pictureH;
3132 
3133     return true;
3134 }
3135 
setPreviewFormat(int colorFormat)3136 bool ExynosCamera::setPreviewFormat(int colorFormat)
3137 {
3138     m_curCameraInfo->previewColorFormat = colorFormat;
3139 
3140 #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
3141     m_printFormat(m_curCameraInfo->previewColorFormat, "PreviewtFormat");
3142 #endif
3143 
3144     return true;
3145 }
3146 
setPreviewFrameRate(int fps)3147 bool ExynosCamera::setPreviewFrameRate(int fps)
3148 {
3149     if (fps < FRAME_RATE_AUTO || FRAME_RATE_MAX < fps)
3150         ALOGE("ERR(%s):Invalid fps(%d)", __func__, fps);
3151 
3152     if (m_flagCreate == true) {
3153         m_curCameraInfo->fps = fps;
3154         if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_FRAME_RATE, fps) < 0) {
3155             ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
3156             return false;
3157         }
3158     }
3159 
3160     return true;
3161 }
3162 
setPreviewSize(int w,int h)3163 bool ExynosCamera::setPreviewSize(int w, int h)
3164 {
3165     m_curCameraInfo->previewW = w;
3166     m_curCameraInfo->previewH = h;
3167     return true;
3168 }
3169 
setRecordingHint(bool hint)3170 bool ExynosCamera::setRecordingHint(bool hint)
3171 {
3172     // TODO : fixed fps?
3173     /* DIS is only possible recording hint is true. */
3174     m_recordingHint = hint;
3175     return true;
3176 }
3177 
setRotation(int rotation)3178 bool ExynosCamera::setRotation(int rotation)
3179 {
3180      if (rotation < 0) {
3181          ALOGE("ERR(%s):Invalid rotation (%d)", __func__, rotation);
3182          return false;
3183      }
3184      m_curCameraInfo->rotation = rotation;
3185 
3186      return true;
3187 }
3188 
getRotation(void)3189 int ExynosCamera::getRotation(void)
3190 {
3191     return m_curCameraInfo->rotation;
3192 }
3193 
setSceneMode(int value)3194 bool ExynosCamera::setSceneMode(int value)
3195 {
3196     int internalValue = -1;
3197 
3198     switch (value) {
3199     case SCENE_MODE_AUTO:
3200         internalValue = ::SCENE_MODE_NONE;
3201         break;
3202     case SCENE_MODE_PORTRAIT:
3203         internalValue = ::SCENE_MODE_PORTRAIT;
3204         break;
3205     case SCENE_MODE_LANDSCAPE:
3206         internalValue = ::SCENE_MODE_LANDSCAPE;
3207         break;
3208     case SCENE_MODE_NIGHT:
3209         internalValue = ::SCENE_MODE_NIGHTSHOT;
3210         break;
3211     case SCENE_MODE_BEACH:
3212         internalValue = ::SCENE_MODE_BEACH_SNOW;
3213         break;
3214     case SCENE_MODE_SNOW:
3215         internalValue = ::SCENE_MODE_BEACH_SNOW;
3216         break;
3217     case SCENE_MODE_SUNSET:
3218         internalValue = ::SCENE_MODE_SUNSET;
3219         break;
3220     case SCENE_MODE_FIREWORKS:
3221         internalValue = ::SCENE_MODE_FIREWORKS;
3222         break;
3223     case SCENE_MODE_SPORTS:
3224         internalValue = ::SCENE_MODE_SPORTS;
3225         break;
3226     case SCENE_MODE_PARTY:
3227         internalValue = ::SCENE_MODE_PARTY_INDOOR;
3228         break;
3229     case SCENE_MODE_CANDLELIGHT:
3230         internalValue = ::SCENE_MODE_CANDLE_LIGHT;
3231         break;
3232     case SCENE_MODE_STEADYPHOTO:
3233         internalValue = ::SCENE_MODE_TEXT;
3234         break;
3235     case SCENE_MODE_ACTION:
3236     case SCENE_MODE_NIGHT_PORTRAIT:
3237     case SCENE_MODE_THEATRE:
3238     default:
3239         ALOGE("ERR(%s):Unsupported value(%d)", __func__, value);
3240         return false;
3241         break;
3242     }
3243 
3244     if (internalValue <= ::SCENE_MODE_BASE || ::SCENE_MODE_MAX <= internalValue) {
3245         ALOGE("ERR(%s):Invalid value (%d)", __func__, internalValue);
3246         return false;
3247     }
3248 
3249     if (m_curCameraInfo->sceneMode != value) {
3250         m_curCameraInfo->sceneMode = value;
3251         if (m_flagCreate == true) {
3252             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_SCENE_MODE, internalValue) < 0) {
3253                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
3254                 return false;
3255             }
3256         }
3257     }
3258 
3259     return true;
3260 }
3261 
setVideoStabilization(bool toggle)3262 bool ExynosCamera::setVideoStabilization(bool toggle)
3263 {
3264     m_curCameraInfo->videoStabilization = toggle;
3265 
3266     if (m_previewDev->flagStart == true) {
3267         if (m_curCameraInfo->applyVideoStabilization != toggle) {
3268 
3269             int dis = (toggle == true) ? CAMERA_DIS_ON : CAMERA_DIS_OFF;
3270 
3271             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_SET_DIS, dis) < 0) {
3272                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
3273                 return false;
3274             } else {
3275                 m_curCameraInfo->applyVideoStabilization = toggle;
3276 	    }
3277         }
3278     }
3279     return true;
3280 }
3281 
setWhiteBalance(int value)3282 bool ExynosCamera::setWhiteBalance(int value)
3283 {
3284     int internalValue = -1;
3285 
3286     switch (value) {
3287     case WHITE_BALANCE_AUTO:
3288         if (m_internalISP == true)
3289             internalValue = ::IS_AWB_AUTO;
3290         else
3291             internalValue = ::WHITE_BALANCE_AUTO;
3292         break;
3293     case WHITE_BALANCE_INCANDESCENT:
3294         if (m_internalISP == true)
3295             internalValue = ::IS_AWB_TUNGSTEN;
3296         else
3297             internalValue = ::WHITE_BALANCE_TUNGSTEN;
3298         break;
3299     case WHITE_BALANCE_FLUORESCENT:
3300         if (m_internalISP == true)
3301             internalValue = ::IS_AWB_FLUORESCENT;
3302         else
3303             internalValue = ::WHITE_BALANCE_FLUORESCENT;
3304         break;
3305     case WHITE_BALANCE_DAYLIGHT:
3306         if (m_internalISP == true)
3307             internalValue = ::IS_AWB_DAYLIGHT;
3308         else
3309             internalValue = ::WHITE_BALANCE_SUNNY;
3310         break;
3311     case WHITE_BALANCE_CLOUDY_DAYLIGHT:
3312         if (m_internalISP == true)
3313             internalValue = ::IS_AWB_CLOUDY;
3314         else
3315             internalValue = ::WHITE_BALANCE_CLOUDY;
3316         break;
3317     case WHITE_BALANCE_WARM_FLUORESCENT:
3318     case WHITE_BALANCE_TWILIGHT:
3319     case WHITE_BALANCE_SHADE:
3320     default:
3321         ALOGE("ERR(%s):Unsupported value(%d)", __func__, value);
3322         return false;
3323         break;
3324     }
3325 
3326     if (m_internalISP == true) {
3327         if (internalValue < ::IS_AWB_AUTO || ::IS_AWB_MAX <= internalValue) {
3328             ALOGE("ERR(%s):Invalid internalValue(%d)", __func__, internalValue);
3329             return false;
3330         }
3331     } else {
3332         if (internalValue <= ::WHITE_BALANCE_BASE || ::WHITE_BALANCE_MAX <= internalValue) {
3333             ALOGE("ERR(%s):Invalid internalValue(%d)", __func__, internalValue);
3334             return false;
3335         }
3336     }
3337 
3338     if (m_curCameraInfo->whiteBalance != value) {
3339         m_curCameraInfo->whiteBalance = value;
3340         if (m_flagCreate == true) {
3341             if (m_internalISP == true) {
3342                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_AWB_MODE, internalValue) < 0) {
3343                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
3344                     return false;
3345                 }
3346             } else {
3347                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_WHITE_BALANCE, internalValue) < 0) {
3348                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
3349                     return false;
3350                 }
3351             }
3352         }
3353     }
3354 
3355     return true;
3356 }
3357 
setZoom(int value)3358 bool ExynosCamera::setZoom(int value)
3359 {
3360     if (value < ZOOM_LEVEL_0 || ZOOM_LEVEL_MAX <= value) {
3361         ALOGE("ERR(%s):Invalid value (%d)", __func__, value);
3362         return false;
3363     }
3364 
3365     if (m_curCameraInfo->zoom != value) {
3366         m_curCameraInfo->zoom = value;
3367         if (m_defaultCameraInfo->hwZoomSupported == true) {
3368             if (m_flagCreate == true) {
3369                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_ZOOM, value) < 0) {
3370                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
3371                     return false;
3372                 }
3373             }
3374         } else {
3375             if (m_setZoom(m_previewDev->fd, m_curCameraInfo->zoom, m_curCameraInfo->previewW, m_curCameraInfo->previewH) == false) {
3376                 ALOGE("ERR(%s):m_setZoom(%d) fail", __func__, m_curCameraInfo->zoom);
3377                 return false;
3378             }
3379         }
3380     }
3381 
3382     return true;
3383 }
3384 
m_setWidthHeight(int mode,int fd,struct pollfd * event,int w,int h,int colorFormat,struct ExynosBuffer * buf,bool * validBuf)3385 bool ExynosCamera::m_setWidthHeight(int mode,
3386                                  int fd,
3387                                  struct pollfd *event,
3388                                  int w,
3389                                  int h,
3390                                  int colorFormat,
3391                                  struct ExynosBuffer *buf,
3392                                  bool *validBuf)
3393 {
3394     // Get and throw away the first frame since it is often garbled.
3395     memset(event, 0, sizeof(struct pollfd));
3396     event->fd = fd;
3397     event->events = POLLIN | POLLERR;
3398 
3399     int numOfBuf = 0;
3400 
3401     for (int i = 0; i < VIDEO_MAX_FRAME; i++) {
3402         if (buf[i].virt.p != NULL || buf[i].phys.p != 0 ||
3403 	    buf[i].fd.fd >= 0) {
3404             validBuf[i] = true;
3405             numOfBuf++;
3406         } else {
3407             validBuf[i] = false;
3408         }
3409     }
3410 
3411     struct v4l2_format v4l2_fmt;
3412     struct v4l2_pix_format pixfmt;
3413     unsigned int bpp;
3414     unsigned int planes;
3415 
3416     memset(&v4l2_fmt, 0, sizeof(struct v4l2_format));
3417     memset(&pixfmt, 0, sizeof(pixfmt));
3418 
3419     switch(mode) {
3420     case PREVIEW_MODE:
3421     case VIDEO_MODE:
3422         v4l2_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
3423 
3424         V4L2_PIX_2_YUV_INFO(colorFormat, &bpp, &planes);
3425 
3426         v4l2_fmt.fmt.pix_mp.width = w;
3427         v4l2_fmt.fmt.pix_mp.height = h;
3428         v4l2_fmt.fmt.pix_mp.pixelformat = colorFormat;
3429         v4l2_fmt.fmt.pix_mp.num_planes = planes;
3430 
3431         if (exynos_v4l2_s_fmt(fd, &v4l2_fmt) < 0) {
3432             ALOGE("ERR(%s):exynos_v4l2_s_fmt() fail", __func__);
3433             return false;
3434         }
3435         break;
3436     case PICTURE_MODE:
3437         v4l2_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
3438 
3439         pixfmt.width = w;
3440         pixfmt.height = h;
3441         pixfmt.pixelformat = colorFormat;
3442         if (pixfmt.pixelformat == V4L2_PIX_FMT_JPEG)
3443             pixfmt.colorspace = V4L2_COLORSPACE_JPEG;
3444 
3445         v4l2_fmt.fmt.pix = pixfmt;
3446 
3447         if (exynos_v4l2_s_fmt(fd, &v4l2_fmt) < 0) {
3448             ALOGE("ERR(%s):exynos_v4l2_s_fmt() fail", __func__);
3449             return false;
3450         }
3451         break;
3452     default:
3453         break;
3454     }
3455 
3456     struct v4l2_requestbuffers req;
3457     req.count  = numOfBuf;
3458     req.type   = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
3459     req.memory = V4L2_MEMORY_DMABUF;
3460 
3461     if (exynos_v4l2_reqbufs(fd, &req) < 0) {
3462         ALOGE("ERR(%s):exynos_v4l2_reqbufs(%d) fail", __func__, numOfBuf);
3463         return false;
3464     }
3465 
3466     for (int i = 0; i < VIDEO_MAX_FRAME; i++) {
3467         if (validBuf[i] == true) {
3468 
3469             struct v4l2_buffer v4l2_buf;
3470             struct v4l2_plane planes[VIDEO_MAX_PLANES];
3471 
3472             v4l2_buf.m.planes = planes;
3473             v4l2_buf.type     = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
3474             v4l2_buf.memory   = V4L2_MEMORY_DMABUF;
3475             v4l2_buf.index    = buf[i].reserved.p;
3476             v4l2_buf.length   = 0;
3477 
3478             for (int j = 0; j < 3; j++) {
3479                 v4l2_buf.m.planes[j].m.fd = buf[i].fd.extFd[j];
3480                 v4l2_buf.m.planes[j].length   = buf[i].size.extS[j];
3481 
3482                 if (buf[i].size.extS[j] != 0)
3483                     v4l2_buf.length++;
3484             }
3485 
3486             if (exynos_v4l2_qbuf(fd, &v4l2_buf) < 0) {
3487                 ALOGE("ERR(%s):exynos_v4l2_qbuf(%d) fail", __func__, i);
3488                 return false;
3489             }
3490         }
3491     }
3492 
3493     /*
3494     m_currentZoom = -1;
3495 
3496     if (m_setZoom(fd, m_curCameraInfo->zoom, w, h) == false)
3497         ALOGE("ERR(%s):m_setZoom(%d, %d) fail", __func__, mode, m_curCameraInfo->zoom);
3498     */
3499     return true;
3500 }
3501 
m_setZoom(int fd,int zoom,int w,int h)3502 bool ExynosCamera::m_setZoom(int fd, int zoom, int w, int h)
3503 {
3504     int ret = true;
3505 
3506     if (m_currentZoom != zoom) {
3507         m_currentZoom = zoom;
3508 
3509         int real_zoom = 0;
3510 
3511         if (m_defaultCameraInfo->hwZoomSupported == true)
3512             real_zoom = 0; // just adjust ratio, not digital zoom.
3513         else
3514             real_zoom = zoom; // adjust ratio, digital zoom
3515 
3516         ret = m_setCrop(fd, w, h, real_zoom);
3517         if (ret == false)
3518             ALOGE("ERR(%s):m_setCrop(%d, %d) fail", __func__, w, h);
3519     }
3520 
3521     return ret;
3522 }
3523 
m_setCrop(int fd,int w,int h,int zoom)3524 bool ExynosCamera::m_setCrop(int fd, int w, int h, int zoom)
3525 {
3526     v4l2_cropcap cropcap;
3527     v4l2_crop crop;
3528     unsigned int crop_x = 0;
3529     unsigned int crop_y = 0;
3530     unsigned int crop_w = 0;
3531     unsigned int crop_h = 0;
3532 
3533     cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
3534 
3535     if (exynos_v4l2_cropcap(fd, &cropcap) < 0)  {
3536         ALOGE("ERR(%s):exynos_v4l2_cropcap() fail)", __func__);
3537         return false;
3538     }
3539 
3540     m_getCropRect(cropcap.bounds.width, cropcap.bounds.height,
3541                   w,                    h,
3542                   &crop_x,              &crop_y,
3543                   &crop_w,              &crop_h,
3544                   zoom);
3545 
3546     cropcap.defrect.left   = crop_x;
3547     cropcap.defrect.top    = crop_y;
3548     cropcap.defrect.width  = crop_w;
3549     cropcap.defrect.height = crop_h;
3550     crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
3551     crop.c    = cropcap.defrect;
3552 
3553     if (exynos_v4l2_s_crop(fd, &crop) < 0) {
3554         ALOGE("ERR(%s):exynos_v4l2_s_crop() fail(%d))", __func__, zoom);
3555         return false;
3556     }
3557 
3558     /*
3559     ALOGD("## 1 w                     : %d", w);
3560     ALOGD("## 1 h                     : %d", h);
3561     ALOGD("## 1 zoom                  : %d", zoom);
3562     ALOGD("## 1 cropcap.bounds.w      : %d", cropcap.bounds.width);
3563     ALOGD("## 1 cropcap.bounds.h      : %d", cropcap.bounds.height);
3564     ALOGD("## 2 crop_x                : %d", crop_x);
3565     ALOGD("## 2 crop_y                : %d", crop_y);
3566     ALOGD("## 2 crop_w                : %d", crop_w);
3567     ALOGD("## 2 crop_h                : %d", crop_h);
3568     ALOGD("## 2 cropcap.defrect.left  : %d", cropcap.defrect.left);
3569     ALOGD("## 2 cropcap.defrect.top   : %d", cropcap.defrect.top);
3570     ALOGD("## 2 cropcap.defrect.width : %d", cropcap.defrect.width);
3571     ALOGD("## 2 cropcap.defrect.height: %d", cropcap.defrect.height);
3572     */
3573 
3574     return true;
3575 }
3576 
m_getCropRect(unsigned int src_w,unsigned int src_h,unsigned int dst_w,unsigned int dst_h,unsigned int * crop_x,unsigned int * crop_y,unsigned int * crop_w,unsigned int * crop_h,int zoom)3577 bool ExynosCamera::m_getCropRect(unsigned int  src_w,  unsigned int   src_h,
3578                               unsigned int  dst_w,  unsigned int   dst_h,
3579                               unsigned int *crop_x, unsigned int *crop_y,
3580                               unsigned int *crop_w, unsigned int *crop_h,
3581                               int           zoom)
3582 {
3583     #define DEFAULT_ZOOM_RATIO        (4) // 4x zoom
3584     #define DEFAULT_ZOOM_RATIO_SHIFT  (2)
3585     int max_zoom = m_defaultCameraInfo->maxZoom;
3586 
3587     *crop_w = src_w;
3588     *crop_h = src_h;
3589 
3590     if (   src_w != dst_w
3591         || src_h != dst_h) {
3592         float src_ratio = 1.0f;
3593         float dst_ratio = 1.0f;
3594 
3595         // ex : 1024 / 768
3596         src_ratio = (float)src_w / (float)src_h;
3597 
3598         // ex : 352  / 288
3599         dst_ratio = (float)dst_w / (float)dst_h;
3600 
3601         if (src_ratio != dst_ratio) {
3602             if (src_ratio <= dst_ratio) {
3603                 // shrink h
3604                 *crop_w = src_w;
3605                 *crop_h = src_w / dst_ratio;
3606             } else  { //(src_ratio > dst_ratio)
3607                 // shrink w
3608                 *crop_w = src_h * dst_ratio;
3609                 *crop_h = src_h;
3610             }
3611         }
3612 
3613         if (zoom != 0) {
3614             unsigned int zoom_w_step =
3615                         (*crop_w - (*crop_w  >> DEFAULT_ZOOM_RATIO_SHIFT)) / max_zoom;
3616 
3617             *crop_w  = *crop_w - (zoom_w_step * zoom);
3618 
3619             unsigned int zoom_h_step =
3620                         (*crop_h - (*crop_h >> DEFAULT_ZOOM_RATIO_SHIFT)) / max_zoom;
3621 
3622             *crop_h = *crop_h - (zoom_h_step * zoom);
3623         }
3624     }
3625 
3626     #define CAMERA_CROP_WIDTH_RESTRAIN_NUM  (0x10) // 16
3627     unsigned int w_align = (*crop_w & (CAMERA_CROP_WIDTH_RESTRAIN_NUM - 1));
3628     if (w_align != 0) {
3629         if (  (CAMERA_CROP_WIDTH_RESTRAIN_NUM >> 1) <= w_align
3630             && *crop_w + (CAMERA_CROP_WIDTH_RESTRAIN_NUM - w_align) <= dst_w) {
3631             *crop_w += (CAMERA_CROP_WIDTH_RESTRAIN_NUM - w_align);
3632         }
3633         else
3634             *crop_w -= w_align;
3635     }
3636 
3637     #define CAMERA_CROP_HEIGHT_RESTRAIN_NUM  (0x2) // 2
3638     unsigned int h_align = (*crop_h & (CAMERA_CROP_HEIGHT_RESTRAIN_NUM - 1));
3639     if (h_align != 0) {
3640         if (  (CAMERA_CROP_HEIGHT_RESTRAIN_NUM >> 1) <= h_align
3641             && *crop_h + (CAMERA_CROP_HEIGHT_RESTRAIN_NUM - h_align) <= dst_h) {
3642             *crop_h += (CAMERA_CROP_HEIGHT_RESTRAIN_NUM - h_align);
3643         }
3644         else
3645             *crop_h -= h_align;
3646     }
3647 
3648     *crop_x = (src_w - *crop_w) >> 1;
3649     *crop_y = (src_h - *crop_h) >> 1;
3650 
3651     return true;
3652 }
3653 
m_setExifFixedAttribute(void)3654 void ExynosCamera::m_setExifFixedAttribute(void)
3655 {
3656     char property[PROPERTY_VALUE_MAX];
3657 
3658     //2 0th IFD TIFF Tags
3659     //3 Maker
3660     property_get("ro.product.brand", property, EXIF_DEF_MAKER);
3661     strncpy((char *)mExifInfo.maker, property,
3662                 sizeof(mExifInfo.maker) - 1);
3663     mExifInfo.maker[sizeof(mExifInfo.maker) - 1] = '\0';
3664     //3 Model
3665     property_get("ro.product.model", property, EXIF_DEF_MODEL);
3666     strncpy((char *)mExifInfo.model, property,
3667                 sizeof(mExifInfo.model) - 1);
3668     mExifInfo.model[sizeof(mExifInfo.model) - 1] = '\0';
3669     //3 Software
3670     property_get("ro.build.id", property, EXIF_DEF_SOFTWARE);
3671     strncpy((char *)mExifInfo.software, property,
3672                 sizeof(mExifInfo.software) - 1);
3673     mExifInfo.software[sizeof(mExifInfo.software) - 1] = '\0';
3674 
3675     //3 YCbCr Positioning
3676     mExifInfo.ycbcr_positioning = EXIF_DEF_YCBCR_POSITIONING;
3677 
3678     //2 0th IFD Exif Private Tags
3679     //3 F Number
3680     mExifInfo.fnumber.num = EXIF_DEF_FNUMBER_NUM;
3681     mExifInfo.fnumber.den = EXIF_DEF_FNUMBER_DEN;
3682     //3 Exposure Program
3683     mExifInfo.exposure_program = EXIF_DEF_EXPOSURE_PROGRAM;
3684     //3 Exif Version
3685     memcpy(mExifInfo.exif_version, EXIF_DEF_EXIF_VERSION, sizeof(mExifInfo.exif_version));
3686     //3 Aperture
3687     uint32_t av = APEX_FNUM_TO_APERTURE((double)mExifInfo.fnumber.num/mExifInfo.fnumber.den);
3688     mExifInfo.aperture.num = av*EXIF_DEF_APEX_DEN;
3689     mExifInfo.aperture.den = EXIF_DEF_APEX_DEN;
3690     //3 Maximum lens aperture
3691     mExifInfo.max_aperture.num = mExifInfo.aperture.num;
3692     mExifInfo.max_aperture.den = mExifInfo.aperture.den;
3693     //3 Lens Focal Length
3694     mExifInfo.focal_length.num = m_defaultCameraInfo->focalLengthNum;
3695     mExifInfo.focal_length.den = m_defaultCameraInfo->focalLengthDen;
3696     //3 User Comments
3697     strcpy((char *)mExifInfo.user_comment, EXIF_DEF_USERCOMMENTS);
3698     //3 Color Space information
3699     mExifInfo.color_space = EXIF_DEF_COLOR_SPACE;
3700     //3 Exposure Mode
3701     mExifInfo.exposure_mode = EXIF_DEF_EXPOSURE_MODE;
3702 
3703     //2 0th IFD GPS Info Tags
3704     unsigned char gps_version[4] = { 0x02, 0x02, 0x00, 0x00 };
3705     memcpy(mExifInfo.gps_version_id, gps_version, sizeof(gps_version));
3706 
3707     //2 1th IFD TIFF Tags
3708     mExifInfo.compression_scheme = EXIF_DEF_COMPRESSION;
3709     mExifInfo.x_resolution.num = EXIF_DEF_RESOLUTION_NUM;
3710     mExifInfo.x_resolution.den = EXIF_DEF_RESOLUTION_DEN;
3711     mExifInfo.y_resolution.num = EXIF_DEF_RESOLUTION_NUM;
3712     mExifInfo.y_resolution.den = EXIF_DEF_RESOLUTION_DEN;
3713     mExifInfo.resolution_unit = EXIF_DEF_RESOLUTION_UNIT;
3714 }
3715 
m_setExifChangedAttribute(exif_attribute_t * exifInfo,ExynosRect * rect)3716 void ExynosCamera::m_setExifChangedAttribute(exif_attribute_t *exifInfo, ExynosRect *rect)
3717 {
3718     //2 0th IFD TIFF Tags
3719     //3 Width
3720     exifInfo->width = rect->w;
3721     //3 Height
3722     exifInfo->height = rect->h;
3723     //3 Orientation
3724     switch (m_curCameraInfo->rotation) {
3725     case 90:
3726         exifInfo->orientation = EXIF_ORIENTATION_90;
3727         break;
3728     case 180:
3729         exifInfo->orientation = EXIF_ORIENTATION_180;
3730         break;
3731     case 270:
3732         exifInfo->orientation = EXIF_ORIENTATION_270;
3733         break;
3734     case 0:
3735     default:
3736         exifInfo->orientation = EXIF_ORIENTATION_UP;
3737         break;
3738     }
3739     //3 Date time
3740     time_t rawtime;
3741     struct tm *timeinfo;
3742     time(&rawtime);
3743     timeinfo = localtime(&rawtime);
3744     strftime((char *)exifInfo->date_time, 20, "%Y:%m:%d %H:%M:%S", timeinfo);
3745 
3746     //2 0th IFD Exif Private Tags
3747     //3 Exposure Time
3748     int shutterSpeed = 100;
3749     /* TBD - front camera needs to be fixed to support this g_ctrl,
3750        it current returns a negative err value, so avoid putting
3751        odd value into exif for now */
3752     if (   exynos_v4l2_g_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_EXIF_SHUTTERSPEED, &shutterSpeed) < 0
3753         || shutterSpeed < 0) {
3754         ALOGE("ERR(%s):exynos_v4l2_g_ctrl() fail, using 100", __func__);
3755         shutterSpeed = 100;
3756     }
3757 
3758     exifInfo->exposure_time.num = 1;
3759     // x us -> 1/x s */
3760     exifInfo->exposure_time.den = (uint32_t)(1000000 / shutterSpeed);
3761 
3762     //3 ISO Speed Rating
3763     int iso = m_curCameraInfo->iso;
3764 
3765     /* TBD - front camera needs to be fixed to support this g_ctrl,
3766        it current returns a negative err value, so avoid putting
3767        odd value into exif for now */
3768     if (   exynos_v4l2_g_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_EXIF_ISO, &iso) < 0
3769         || iso < 0) {
3770         ALOGE("ERR(%s):exynos_v4l2_g_ctrl() fail, using ISO_100", __func__);
3771         iso = ISO_100;
3772     }
3773 
3774     switch (iso) {
3775     case ISO_50:
3776         exifInfo->iso_speed_rating = 50;
3777         break;
3778     case ISO_100:
3779         exifInfo->iso_speed_rating = 100;
3780         break;
3781     case ISO_200:
3782         exifInfo->iso_speed_rating = 200;
3783         break;
3784     case ISO_400:
3785         exifInfo->iso_speed_rating = 400;
3786         break;
3787     case ISO_800:
3788         exifInfo->iso_speed_rating = 800;
3789         break;
3790     case ISO_1600:
3791         exifInfo->iso_speed_rating = 1600;
3792         break;
3793     default:
3794         exifInfo->iso_speed_rating = 100;
3795         break;
3796     }
3797 
3798     uint32_t av, tv, bv, sv, ev;
3799     av = APEX_FNUM_TO_APERTURE((double)exifInfo->fnumber.num / exifInfo->fnumber.den);
3800     tv = APEX_EXPOSURE_TO_SHUTTER((double)exifInfo->exposure_time.num / exifInfo->exposure_time.den);
3801     sv = APEX_ISO_TO_FILMSENSITIVITY(exifInfo->iso_speed_rating);
3802     bv = av + tv - sv;
3803     ev = av + tv;
3804     ALOGD("Shutter speed=%d us, iso=%d", shutterSpeed, exifInfo->iso_speed_rating);
3805     ALOGD("AV=%d, TV=%d, SV=%d", av, tv, sv);
3806 
3807     //3 Shutter Speed
3808     exifInfo->shutter_speed.num = tv * EXIF_DEF_APEX_DEN;
3809     exifInfo->shutter_speed.den = EXIF_DEF_APEX_DEN;
3810     //3 Brightness
3811     exifInfo->brightness.num = bv*EXIF_DEF_APEX_DEN;
3812     exifInfo->brightness.den = EXIF_DEF_APEX_DEN;
3813     //3 Exposure Bias
3814     if (m_curCameraInfo->sceneMode == SCENE_MODE_BEACH ||
3815         m_curCameraInfo->sceneMode == SCENE_MODE_SNOW) {
3816         exifInfo->exposure_bias.num = EXIF_DEF_APEX_DEN;
3817         exifInfo->exposure_bias.den = EXIF_DEF_APEX_DEN;
3818     } else {
3819         exifInfo->exposure_bias.num = 0;
3820         exifInfo->exposure_bias.den = 0;
3821     }
3822     //3 Metering Mode
3823     switch (m_curCameraInfo->metering) {
3824     case METERING_MODE_CENTER:
3825         exifInfo->metering_mode = EXIF_METERING_CENTER;
3826         break;
3827     case METERING_MODE_MATRIX:
3828         exifInfo->metering_mode = EXIF_METERING_MULTISPOT;
3829         break;
3830     case METERING_MODE_SPOT:
3831         exifInfo->metering_mode = EXIF_METERING_SPOT;
3832         break;
3833     case METERING_MODE_AVERAGE:
3834     default:
3835         exifInfo->metering_mode = EXIF_METERING_AVERAGE;
3836         break;
3837     }
3838 
3839     //3 Flash
3840     int flash = EXIF_DEF_FLASH;
3841     if (   m_curCameraInfo->flashMode == FLASH_MODE_OFF
3842         || exynos_v4l2_g_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_EXIF_FLASH, &flash) < 0
3843         || flash < 0)
3844         exifInfo->flash = EXIF_DEF_FLASH;
3845     else
3846         exifInfo->flash = flash;
3847 
3848     //3 White Balance
3849     if (m_curCameraInfo->whiteBalance == WHITE_BALANCE_AUTO)
3850         exifInfo->white_balance = EXIF_WB_AUTO;
3851     else
3852         exifInfo->white_balance = EXIF_WB_MANUAL;
3853 
3854     //3 Scene Capture Type
3855     switch (m_curCameraInfo->sceneMode) {
3856     case SCENE_MODE_PORTRAIT:
3857         exifInfo->scene_capture_type = EXIF_SCENE_PORTRAIT;
3858         break;
3859     case SCENE_MODE_LANDSCAPE:
3860         exifInfo->scene_capture_type = EXIF_SCENE_LANDSCAPE;
3861         break;
3862     case SCENE_MODE_NIGHT:
3863         exifInfo->scene_capture_type = EXIF_SCENE_NIGHT;
3864         break;
3865     default:
3866         exifInfo->scene_capture_type = EXIF_SCENE_STANDARD;
3867         break;
3868     }
3869 
3870     //2 0th IFD GPS Info Tags
3871     if (m_curCameraInfo->gpsLatitude != 0 && m_curCameraInfo->gpsLongitude != 0) {
3872         if (m_curCameraInfo->gpsLatitude > 0)
3873             strcpy((char *)exifInfo->gps_latitude_ref, "N");
3874         else
3875             strcpy((char *)exifInfo->gps_latitude_ref, "S");
3876 
3877         if (m_curCameraInfo->gpsLongitude > 0)
3878             strcpy((char *)exifInfo->gps_longitude_ref, "E");
3879         else
3880             strcpy((char *)exifInfo->gps_longitude_ref, "W");
3881 
3882         if (m_curCameraInfo->gpsAltitude > 0)
3883             exifInfo->gps_altitude_ref = 0;
3884         else
3885             exifInfo->gps_altitude_ref = 1;
3886 
3887         double latitude = fabs(m_curCameraInfo->gpsLatitude / 10000.0);
3888         double longitude = fabs(m_curCameraInfo->gpsLongitude / 10000.0);
3889         double altitude = fabs(m_curCameraInfo->gpsAltitude / 100.0);
3890 
3891         exifInfo->gps_latitude[0].num = (uint32_t)latitude;
3892         exifInfo->gps_latitude[0].den = 1;
3893         exifInfo->gps_latitude[1].num = (uint32_t)((latitude - exifInfo->gps_latitude[0].num) * 60);
3894         exifInfo->gps_latitude[1].den = 1;
3895         exifInfo->gps_latitude[2].num = (uint32_t)((((latitude - exifInfo->gps_latitude[0].num) * 60)
3896                                         - exifInfo->gps_latitude[1].num) * 60);
3897         exifInfo->gps_latitude[2].den = 1;
3898 
3899         exifInfo->gps_longitude[0].num = (uint32_t)longitude;
3900         exifInfo->gps_longitude[0].den = 1;
3901         exifInfo->gps_longitude[1].num = (uint32_t)((longitude - exifInfo->gps_longitude[0].num) * 60);
3902         exifInfo->gps_longitude[1].den = 1;
3903         exifInfo->gps_longitude[2].num = (uint32_t)((((longitude - exifInfo->gps_longitude[0].num) * 60)
3904                                         - exifInfo->gps_longitude[1].num) * 60);
3905         exifInfo->gps_longitude[2].den = 1;
3906 
3907         exifInfo->gps_altitude.num = (uint32_t)altitude;
3908         exifInfo->gps_altitude.den = 1;
3909 
3910         struct tm tm_data;
3911         gmtime_r(&m_curCameraInfo->gpsTimestamp, &tm_data);
3912         exifInfo->gps_timestamp[0].num = tm_data.tm_hour;
3913         exifInfo->gps_timestamp[0].den = 1;
3914         exifInfo->gps_timestamp[1].num = tm_data.tm_min;
3915         exifInfo->gps_timestamp[1].den = 1;
3916         exifInfo->gps_timestamp[2].num = tm_data.tm_sec;
3917         exifInfo->gps_timestamp[2].den = 1;
3918         snprintf((char*)exifInfo->gps_datestamp, sizeof(exifInfo->gps_datestamp),
3919                 "%04d:%02d:%02d", tm_data.tm_year + 1900, tm_data.tm_mon + 1, tm_data.tm_mday);
3920 
3921         exifInfo->enableGps = true;
3922     } else {
3923         exifInfo->enableGps = false;
3924     }
3925 
3926     //2 1th IFD TIFF Tags
3927     exifInfo->widthThumb = m_curCameraInfo->thumbnailW;
3928     exifInfo->heightThumb = m_curCameraInfo->thumbnailH;
3929 }
3930 
m_secRect2SecRect2(ExynosRect * rect,ExynosRect2 * rect2)3931 void ExynosCamera::m_secRect2SecRect2(ExynosRect *rect, ExynosRect2 *rect2)
3932 {
3933     rect2->x1 = rect->x;
3934     rect2->y1 = rect->y;
3935     rect2->x2 = rect->x + rect->w;
3936     rect2->y2 = rect->y + rect->h;
3937 }
3938 
m_secRect22SecRect(ExynosRect2 * rect2,ExynosRect * rect)3939 void ExynosCamera::m_secRect22SecRect(ExynosRect2 *rect2, ExynosRect *rect)
3940 {
3941     rect->x = rect2->x1;
3942     rect->y = rect2->y1;
3943     rect->w = rect2->x2 - rect2->x1;
3944     rect->h = rect2->y2 - rect2->y1;
3945 }
3946 
m_printFormat(int colorFormat,const char * arg)3947 void ExynosCamera::m_printFormat(int colorFormat, const char *arg)
3948 {
3949     switch (colorFormat) {
3950     case V4L2_PIX_FMT_YUV420:
3951         ALOGV("DEBUG(%s):V4L2_PIX_FMT_YUV420", arg);
3952         break;
3953     case V4L2_PIX_FMT_YVU420:
3954         ALOGV("DEBUG(%s):V4L2_PIX_FMT_YVU420", arg);
3955         break;
3956     case V4L2_PIX_FMT_YVU420M:
3957         ALOGV("DEBUG(%s):V4L2_PIX_FMT_YVU420M", arg);
3958         break;
3959     case V4L2_PIX_FMT_NV12M:
3960         ALOGV("DEBUG(%s):V4L2_PIX_FMT_NV12M", arg);
3961         break;
3962     case V4L2_PIX_FMT_NV12:
3963         ALOGV("DEBUG(%s):V4L2_PIX_FMT_NV12", arg);
3964         break;
3965     case V4L2_PIX_FMT_NV12T:
3966         ALOGV("DEBUG(%s):V4L2_PIX_FMT_NV12T", arg);
3967         break;
3968     case V4L2_PIX_FMT_NV21:
3969         ALOGV("DEBUG(%s):V4L2_PIX_FMT_NV21", arg);
3970         break;
3971     case V4L2_PIX_FMT_YUV422P:
3972         ALOGV("DEBUG(%s):V4L2_PIX_FMT_YUV422PP", arg);
3973         break;
3974     case V4L2_PIX_FMT_YUYV:
3975         ALOGV("DEBUG(%s):V4L2_PIX_FMT_YUYV", arg);
3976         break;
3977     case V4L2_PIX_FMT_UYVY:
3978         ALOGV("DEBUG(%s):V4L2_PIX_FMT_UYVYI", arg);
3979         break;
3980     case V4L2_PIX_FMT_RGB565:
3981         ALOGV("DEBUG(%s):V4L2_PIX_FMT_RGB565", arg);
3982         break;
3983     default:
3984         ALOGV("DEBUG(%s):Unknown Format", arg);
3985         break;
3986     }
3987 }
3988 
3989 ///////////////////////////////////////////////////
3990 // Additional API.
3991 ///////////////////////////////////////////////////
3992 
setAngle(int angle)3993 bool ExynosCamera::setAngle(int angle)
3994 {
3995     if (m_curCameraInfo->angle != angle) {
3996         switch (angle) {
3997         case -360:
3998         case    0:
3999         case  360:
4000             m_curCameraInfo->angle = 0;
4001             break;
4002 
4003         case -270:
4004         case   90:
4005             m_curCameraInfo->angle = 90;
4006             break;
4007 
4008         case -180:
4009         case  180:
4010             m_curCameraInfo->angle = 180;
4011             break;
4012 
4013         case  -90:
4014         case  270:
4015             m_curCameraInfo->angle = 270;
4016             break;
4017 
4018         default:
4019             ALOGE("ERR(%s):Invalid angle(%d)", __func__, angle);
4020             return false;
4021         }
4022 
4023         if (m_flagCreate == true) {
4024             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_ROTATION, angle) < 0) {
4025                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4026                 return false;
4027             }
4028         }
4029     }
4030 
4031     return true;
4032 }
4033 
getAngle(void)4034 int ExynosCamera::getAngle(void)
4035 {
4036     return m_curCameraInfo->angle;
4037 }
4038 
setISO(int iso)4039 bool ExynosCamera::setISO(int iso)
4040 {
4041     int internalValue = -1;
4042 
4043     switch (iso) {
4044     case 50:
4045         internalValue = ISO_50;
4046         break;
4047     case 100:
4048         internalValue = ISO_100;
4049         break;
4050     case 200:
4051         internalValue = ISO_200;
4052         break;
4053     case 400:
4054         internalValue = ISO_400;
4055         break;
4056     case 800:
4057         internalValue = ISO_800;
4058         break;
4059     case 1600:
4060         internalValue = ISO_1600;
4061         break;
4062     case 0:
4063     default:
4064         internalValue = ISO_AUTO;
4065         break;
4066     }
4067 
4068     if (internalValue < ISO_AUTO || ISO_MAX <= internalValue) {
4069         ALOGE("ERR(%s):Invalid internalValue (%d)", __func__, internalValue);
4070         return false;
4071     }
4072 
4073     if (m_curCameraInfo->iso != iso) {
4074         m_curCameraInfo->iso = iso;
4075         if (m_flagCreate == true) {
4076             if (m_internalISP == true) {
4077                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_ISO, internalValue) < 0) {
4078                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4079                     return false;
4080                 }
4081             } else {
4082                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_ISO, internalValue) < 0) {
4083                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4084                     return false;
4085                 }
4086             }
4087         }
4088     }
4089 
4090     return true;
4091 }
4092 
getISO(void)4093 int ExynosCamera::getISO(void)
4094 {
4095     return m_curCameraInfo->iso;
4096 }
4097 
setContrast(int value)4098 bool ExynosCamera::setContrast(int value)
4099 {
4100     int internalValue = -1;
4101 
4102     switch (value) {
4103     case CONTRAST_AUTO:
4104         if (m_internalISP == true)
4105             internalValue = ::IS_CONTRAST_AUTO;
4106         else
4107             ALOGW("WARN(%s):Invalid contrast value (%d)", __func__, value);
4108             return true;
4109         break;
4110     case CONTRAST_MINUS_2:
4111         if (m_internalISP == true)
4112             internalValue = ::IS_CONTRAST_MINUS_2;
4113         else
4114             internalValue = ::CONTRAST_MINUS_2;
4115         break;
4116     case CONTRAST_MINUS_1:
4117         if (m_internalISP == true)
4118             internalValue = ::IS_CONTRAST_MINUS_1;
4119         else
4120             internalValue = ::CONTRAST_MINUS_1;
4121         break;
4122     case CONTRAST_DEFAULT:
4123         if (m_internalISP == true)
4124             internalValue = ::IS_CONTRAST_DEFAULT;
4125         else
4126             internalValue = ::CONTRAST_DEFAULT;
4127         break;
4128     case CONTRAST_PLUS_1:
4129         if (m_internalISP == true)
4130             internalValue = ::IS_CONTRAST_PLUS_1;
4131         else
4132             internalValue = ::CONTRAST_PLUS_1;
4133         break;
4134     case CONTRAST_PLUS_2:
4135         if (m_internalISP == true)
4136             internalValue = ::IS_CONTRAST_PLUS_2;
4137         else
4138             internalValue = ::CONTRAST_PLUS_2;
4139         break;
4140     default:
4141         ALOGE("ERR(%s):Unsupported value(%d)", __func__, value);
4142         return false;
4143         break;
4144     }
4145 
4146     if (m_internalISP == true) {
4147         if (internalValue < ::IS_CONTRAST_AUTO || ::IS_CONTRAST_MAX <= internalValue) {
4148             ALOGE("ERR(%s):Invalid internalValue (%d)", __func__, internalValue);
4149             return false;
4150         }
4151     } else {
4152         if (internalValue < ::CONTRAST_MINUS_2 || ::CONTRAST_MAX <= internalValue) {
4153             ALOGE("ERR(%s):Invalid internalValue (%d)", __func__, internalValue);
4154             return false;
4155         }
4156     }
4157 
4158     if (m_curCameraInfo->contrast != value) {
4159         m_curCameraInfo->contrast = value;
4160         if (m_flagCreate == true) {
4161             if (m_internalISP == true) {
4162                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_CONTRAST, internalValue) < 0) {
4163                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4164                     return false;
4165                 }
4166             } else {
4167                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_CONTRAST, internalValue) < 0) {
4168                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4169                     return false;
4170                 }
4171             }
4172         }
4173     }
4174 
4175     return true;
4176 }
4177 
getContrast(void)4178 int ExynosCamera::getContrast(void)
4179 {
4180     return m_curCameraInfo->contrast;
4181 }
4182 
setSaturation(int saturation)4183 bool ExynosCamera::setSaturation(int saturation)
4184 {
4185     int internalValue = saturation + SATURATION_DEFAULT;
4186     if (internalValue < SATURATION_MINUS_2 || SATURATION_MAX <= internalValue) {
4187         ALOGE("ERR(%s):Invalid internalValue (%d)", __func__, internalValue);
4188         return false;
4189     }
4190 
4191     if (m_curCameraInfo->saturation != saturation) {
4192         m_curCameraInfo->saturation = saturation;
4193         if (m_flagCreate == true) {
4194             if (m_internalISP == true) {
4195                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_SATURATION, internalValue) < 0) {
4196                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4197                     return false;
4198                 }
4199             } else {
4200                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_SATURATION, internalValue) < 0) {
4201                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4202                     return false;
4203                 }
4204             }
4205         }
4206     }
4207 
4208     return true;
4209 }
4210 
getSaturation(void)4211 int ExynosCamera::getSaturation(void)
4212 {
4213     return m_curCameraInfo->saturation;
4214 }
4215 
setSharpness(int sharpness)4216 bool ExynosCamera::setSharpness(int sharpness)
4217 {
4218     int internalValue = sharpness + SHARPNESS_DEFAULT;
4219     if (internalValue < SHARPNESS_MINUS_2 || SHARPNESS_MAX <= internalValue) {
4220         ALOGE("ERR(%s):Invalid internalValue (%d)", __func__, internalValue);
4221         return false;
4222     }
4223 
4224     if (m_curCameraInfo->sharpness != sharpness) {
4225         m_curCameraInfo->sharpness = sharpness;
4226         if (m_flagCreate == true) {
4227             if (m_internalISP == true) {
4228                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_SHARPNESS, internalValue) < 0) {
4229                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4230                     return false;
4231                 }
4232             } else {
4233                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_SHARPNESS, internalValue) < 0) {
4234                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4235                     return false;
4236                 }
4237             }
4238         }
4239     }
4240 
4241     return true;
4242 }
4243 
getSharpness(void)4244 int ExynosCamera::getSharpness(void)
4245 {
4246     return m_curCameraInfo->sharpness;
4247 }
4248 
setHue(int hue)4249 bool ExynosCamera::setHue(int hue)
4250 {
4251     int internalValue = hue;
4252 
4253     if (m_internalISP == true) {
4254         internalValue += IS_HUE_DEFAULT;
4255         if (internalValue < IS_HUE_MINUS_2 || IS_HUE_MAX <= internalValue) {
4256             ALOGE("ERR(%s):Invalid hue (%d)", __func__, hue);
4257             return false;
4258         }
4259     } else {
4260             ALOGV("WARN(%s):Not supported hue setting", __func__);
4261             return true;
4262     }
4263 
4264     if (m_curCameraInfo->hue != hue) {
4265         m_curCameraInfo->hue = hue;
4266         if (m_flagCreate == true) {
4267             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_HUE, internalValue) < 0) {
4268                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4269                 return false;
4270             }
4271         }
4272     }
4273 
4274     return true;
4275 }
4276 
getHue(void)4277 int ExynosCamera::getHue(void)
4278 {
4279     return m_curCameraInfo->hue;
4280 }
4281 
setWDR(bool toggle)4282 bool ExynosCamera::setWDR(bool toggle)
4283 {
4284     int internalWdr;
4285 
4286     if (toggle == true) {
4287         if (m_internalISP == true)
4288             internalWdr = IS_DRC_BYPASS_ENABLE;
4289         else
4290             internalWdr = IS_DRC_BYPASS_DISABLE;
4291     } else {
4292         if (m_internalISP == true)
4293             internalWdr = WDR_ON;
4294         else
4295             internalWdr = WDR_OFF;
4296     }
4297 
4298     if (m_curCameraInfo->wdr != toggle) {
4299         m_curCameraInfo->wdr = toggle;
4300         if (m_flagCreate == true) {
4301             if (m_internalISP == true) {
4302                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_SET_DRC, internalWdr) < 0) {
4303                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4304                     return false;
4305                 }
4306             } else {
4307                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_WDR, internalWdr) < 0) {
4308                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4309                     return false;
4310                 }
4311             }
4312         }
4313     }
4314 
4315     return true;
4316 }
4317 
getWDR(void)4318 bool ExynosCamera::getWDR(void)
4319 {
4320     return m_curCameraInfo->wdr;
4321 }
4322 
setAntiShake(bool toggle)4323 bool ExynosCamera::setAntiShake(bool toggle)
4324 {
4325     int internalValue = ANTI_SHAKE_OFF;
4326 
4327     if (toggle == true)
4328         internalValue = ANTI_SHAKE_STILL_ON;
4329 
4330     if (m_curCameraInfo->antiShake != toggle) {
4331         m_curCameraInfo->antiShake = toggle;
4332         if (m_flagCreate == true) {
4333             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_ANTI_SHAKE, internalValue) < 0) {
4334                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4335                 return false;
4336             }
4337         }
4338     }
4339 
4340     return true;
4341 }
4342 
getAntiShake(void)4343 bool ExynosCamera::getAntiShake(void)
4344 {
4345     return m_curCameraInfo->antiShake;
4346 }
4347 
setMeteringMode(int value)4348 bool ExynosCamera::setMeteringMode(int value)
4349 {
4350     int internalValue = -1;
4351 
4352     switch (value) {
4353     case METERING_MODE_AVERAGE:
4354         if (m_internalISP == true)
4355             internalValue = IS_METERING_AVERAGE;
4356         else
4357             internalValue = METERING_MATRIX;
4358         break;
4359     case METERING_MODE_MATRIX:
4360         if (m_internalISP == true)
4361             internalValue = IS_METERING_MATRIX;
4362         else
4363             internalValue = METERING_MATRIX;
4364         break;
4365     case METERING_MODE_CENTER:
4366         if (m_internalISP == true)
4367             internalValue = IS_METERING_CENTER;
4368         else
4369             internalValue = METERING_CENTER;
4370         break;
4371     case METERING_MODE_SPOT:
4372         if (m_internalISP == true)
4373             internalValue = IS_METERING_SPOT;
4374         else
4375             internalValue = METERING_SPOT;
4376         break;
4377     default:
4378         ALOGE("ERR(%s):Unsupported value(%d)", __func__, value);
4379         return false;
4380         break;
4381     }
4382 
4383     if (m_internalISP == true) {
4384         if (internalValue < IS_METERING_AVERAGE || IS_METERING_MAX <= internalValue) {
4385             ALOGE("ERR(%s):Invalid internalValue (%d)", __func__, internalValue);
4386             return false;
4387         }
4388     } else {
4389         if (internalValue <= METERING_BASE || METERING_MAX <= internalValue) {
4390             ALOGE("ERR(%s):Invalid internalValue (%d)", __func__, internalValue);
4391             return false;
4392         }
4393     }
4394 
4395     if (m_curCameraInfo->metering != value) {
4396         m_curCameraInfo->metering = value;
4397         if (m_flagCreate == true) {
4398             if (m_internalISP == true) {
4399                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_METERING, internalValue) < 0) {
4400                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4401                     return false;
4402                 }
4403             } else {
4404                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_METERING, internalValue) < 0) {
4405                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4406                     return false;
4407                 }
4408             }
4409         }
4410     }
4411 
4412     return true;
4413 }
4414 
getMeteringMode(void)4415 int ExynosCamera::getMeteringMode(void)
4416 {
4417     return m_curCameraInfo->metering;
4418 }
4419 
setObjectTracking(bool toggle)4420 bool ExynosCamera::setObjectTracking(bool toggle)
4421 {
4422     m_curCameraInfo->objectTracking = toggle;
4423     return true;
4424 }
4425 
getObjectTracking(void)4426 bool ExynosCamera::getObjectTracking(void)
4427 {
4428     return m_curCameraInfo->objectTracking;
4429 }
4430 
setObjectTrackingStart(bool toggle)4431 bool ExynosCamera::setObjectTrackingStart(bool toggle)
4432 {
4433     if (m_curCameraInfo->objectTrackingStart != toggle) {
4434         m_curCameraInfo->objectTrackingStart = toggle;
4435 
4436         int startStop = (toggle == true) ? 1 : 0;
4437         if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_OBJ_TRACKING_START_STOP, startStop) < 0) {
4438             ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4439             return false;
4440         }
4441     }
4442 
4443     return true;
4444 }
4445 
getObjectTrackingStatus(void)4446 int ExynosCamera::getObjectTrackingStatus(void)
4447 {
4448     int ret = 0;
4449 
4450     if (exynos_v4l2_g_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_OBJ_TRACKING_STATUS, &ret) < 0) {
4451         ALOGE("ERR(%s):exynos_v4l2_g_ctrl() fail", __func__);
4452         return -1;
4453     }
4454     return ret;
4455 }
4456 
setObjectPosition(int x,int y)4457 bool ExynosCamera::setObjectPosition(int x, int y)
4458 {
4459     if (m_curCameraInfo->previewW == 640)
4460         x = x - 80;
4461 
4462     if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_OBJECT_POSITION_X, x) < 0) {
4463         ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4464         return false;
4465     }
4466 
4467     if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_OBJECT_POSITION_Y, y) < 0) {
4468         ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4469         return false;
4470     }
4471 
4472     return true;
4473 }
4474 
setTouchAFStart(bool toggle)4475 bool ExynosCamera::setTouchAFStart(bool toggle)
4476 {
4477     if (m_curCameraInfo->touchAfStart != toggle) {
4478         m_curCameraInfo->touchAfStart = toggle;
4479         int startStop = (toggle == true) ? 1 : 0;
4480 
4481         if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_TOUCH_AF_START_STOP, startStop) < 0) {
4482             ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4483             return false;
4484         }
4485     }
4486 
4487     return true;
4488 }
4489 
setSmartAuto(bool toggle)4490 bool ExynosCamera::setSmartAuto(bool toggle)
4491 {
4492     if (m_curCameraInfo->smartAuto != toggle) {
4493         m_curCameraInfo->smartAuto = toggle;
4494 
4495         int smartAuto = (toggle == true) ? SMART_AUTO_ON : SMART_AUTO_OFF;
4496 
4497         if (m_flagCreate == true) {
4498             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_SMART_AUTO, smartAuto) < 0) {
4499                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4500                 return false;
4501             }
4502         }
4503     }
4504 
4505     return true;
4506 }
4507 
getSmartAuto(void)4508 bool ExynosCamera::getSmartAuto(void)
4509 {
4510     return m_curCameraInfo->smartAuto;
4511 }
4512 
getSmartAutoStatus(void)4513 int ExynosCamera::getSmartAutoStatus(void)
4514 {
4515     int autoscene_status = -1;
4516 
4517     if (m_curCameraInfo->smartAuto == true) {
4518         if (exynos_v4l2_g_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_SMART_AUTO_STATUS, &autoscene_status) < 0) {
4519             ALOGE("ERR(%s):exynos_v4l2_g_ctrl() fail", __func__);
4520             return -1;
4521         }
4522 
4523         if ((autoscene_status < SMART_AUTO_STATUS_AUTO) || (autoscene_status > SMART_AUTO_STATUS_MAX)) {
4524             ALOGE("ERR(%s):Invalid getSmartAutoStatus (%d)", __func__, autoscene_status);
4525             return -1;
4526         }
4527     }
4528     return autoscene_status;
4529 }
4530 
setBeautyShot(bool toggle)4531 bool ExynosCamera::setBeautyShot(bool toggle)
4532 {
4533     if (m_curCameraInfo->beautyShot != toggle) {
4534         m_curCameraInfo->beautyShot = toggle;
4535         int beautyShot = (toggle == true) ? BEAUTY_SHOT_ON : BEAUTY_SHOT_OFF;
4536 
4537         if (m_flagCreate == true) {
4538             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_BEAUTY_SHOT, beautyShot) < 0) {
4539                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4540                 return false;
4541             }
4542         }
4543     }
4544 
4545     return true;
4546 }
4547 
getBeautyShot(void)4548 bool ExynosCamera::getBeautyShot(void)
4549 {
4550     return m_curCameraInfo->beautyShot;
4551 }
4552 
setTopDownMirror(void)4553 bool ExynosCamera::setTopDownMirror(void)
4554 {
4555     if (m_previewDev->fd <= 0) {
4556         ALOGE("ERR(%s):Camera was closed", __func__);
4557         return false;
4558     }
4559 
4560     if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_VFLIP, 1) < 0) {
4561         ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4562         return false;
4563     }
4564 
4565     return true;
4566 }
4567 
setLRMirror(void)4568 bool ExynosCamera::setLRMirror(void)
4569 {
4570     if (m_previewDev->fd <= 0) {
4571         ALOGE("ERR(%s):Camera was closed", __func__);
4572         return false;
4573     }
4574 
4575     if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_HFLIP, 1) < 0) {
4576         ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4577         return false;
4578     }
4579 
4580     return true;
4581 }
4582 
setBrightness(int brightness)4583 bool ExynosCamera::setBrightness(int brightness)
4584 {
4585     int internalValue = brightness;
4586 
4587     if (m_internalISP == true) {
4588         internalValue += IS_BRIGHTNESS_DEFAULT;
4589         if (internalValue < IS_BRIGHTNESS_MINUS_2 || IS_BRIGHTNESS_PLUS_2 < internalValue) {
4590             ALOGE("ERR(%s):Invalid internalValue(%d)", __func__, internalValue);
4591             return false;
4592         }
4593     } else {
4594         internalValue += EV_DEFAULT;
4595         if (internalValue < EV_MINUS_4 || EV_PLUS_4 < internalValue) {
4596             ALOGE("ERR(%s):Invalid internalValue(%d)", __func__, internalValue);
4597             return false;
4598         }
4599     }
4600 
4601     if (m_curCameraInfo->brightness != brightness) {
4602         m_curCameraInfo->brightness = brightness;
4603         if (m_flagCreate == true) {
4604             if (m_internalISP == true) {
4605                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_BRIGHTNESS, internalValue) < 0) {
4606                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4607                     return false;
4608                 }
4609             } else {
4610                 if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_BRIGHTNESS, internalValue) < 0) {
4611                     ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4612                     return false;
4613                 }
4614             }
4615         }
4616     }
4617 
4618     return true;
4619 }
4620 
getBrightness(void)4621 int ExynosCamera::getBrightness(void)
4622 {
4623     return m_curCameraInfo->brightness;
4624 }
4625 
setGamma(bool toggle)4626 bool ExynosCamera::setGamma(bool toggle)
4627 {
4628      if (m_curCameraInfo->gamma != toggle) {
4629          m_curCameraInfo->gamma = toggle;
4630 
4631          int gamma = (toggle == true) ? GAMMA_ON : GAMMA_OFF;
4632 
4633         if (m_flagCreate == true) {
4634              if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_SET_GAMMA, gamma) < 0) {
4635                  ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4636                  return false;
4637              }
4638          }
4639      }
4640 
4641      return true;
4642 }
4643 
getGamma(void)4644 bool ExynosCamera::getGamma(void)
4645 {
4646     return m_curCameraInfo->gamma;
4647 }
4648 
setODC(bool toggle)4649 bool ExynosCamera::setODC(bool toggle)
4650 {
4651     if (m_previewDev->flagStart == true) {
4652         if (m_curCameraInfo->odc != toggle) {
4653             m_curCameraInfo->odc = toggle;
4654 
4655             int odc = (toggle == true) ? CAMERA_ODC_ON : CAMERA_ODC_OFF;
4656 
4657             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_SET_ODC, odc) < 0) {
4658                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4659                 return false;
4660             }
4661         }
4662     }
4663 
4664      return true;
4665 }
4666 
getODC(void)4667 bool ExynosCamera::getODC(void)
4668 {
4669     return m_curCameraInfo->odc;
4670 }
4671 
setSlowAE(bool toggle)4672 bool ExynosCamera::setSlowAE(bool toggle)
4673 {
4674      if (m_curCameraInfo->slowAE != toggle) {
4675          m_curCameraInfo->slowAE = toggle;
4676 
4677          int slow_ae = (toggle == true) ? SLOW_AE_ON : SLOW_AE_OFF;
4678 
4679         if (m_flagCreate == true) {
4680             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_SET_SLOW_AE, slow_ae) < 0) {
4681                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4682                 return false;
4683             }
4684          }
4685      }
4686 
4687      return true;
4688 }
4689 
getSlowAE(void)4690 bool ExynosCamera::getSlowAE(void)
4691 {
4692     return m_curCameraInfo->slowAE;
4693 }
4694 
setShotMode(int shotMode)4695 bool ExynosCamera::setShotMode(int shotMode)
4696 {
4697     if (shotMode < SHOT_MODE_SINGLE || SHOT_MODE_SELF < shotMode) {
4698         ALOGE("ERR(%s):Invalid shotMode (%d)", __func__, shotMode);
4699         return false;
4700     }
4701 
4702     if (m_curCameraInfo->shotMode != shotMode) {
4703         m_curCameraInfo->shotMode = shotMode;
4704 
4705         if (m_flagCreate == true) {
4706             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_IS_CAMERA_SHOT_MODE_NORMAL, shotMode) < 0) {
4707                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4708                 return false;
4709             }
4710         }
4711     }
4712 
4713     return true;
4714 }
4715 
getShotMode(void)4716 int ExynosCamera::getShotMode(void)
4717 {
4718     return m_curCameraInfo->shotMode;
4719 }
4720 
set3DNR(bool toggle)4721 bool ExynosCamera::set3DNR(bool toggle)
4722 {
4723     if (m_previewDev->flagStart == true) {
4724         if (m_curCameraInfo->tdnr != toggle) {
4725             m_curCameraInfo->tdnr = toggle;
4726 
4727             int tdnr = (toggle == true) ? CAMERA_3DNR_ON : CAMERA_3DNR_OFF;
4728 
4729             if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_SET_3DNR, tdnr) < 0) {
4730                 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
4731                 return false;
4732             }
4733         }
4734     }
4735 
4736      return true;
4737 }
4738 
get3DNR(void)4739 bool ExynosCamera::get3DNR(void)
4740 {
4741     return m_curCameraInfo->tdnr;
4742 }
4743 
4744 }; // namespace android
4745