2 * Copyright 2008, The Android Open Source Project
3 * Copyright 2010, Samsung Electronics Co. LTD
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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 * \file ExynosCamera.cpp
20 * \brief source file for CAMERA HAL MODULE
21 * \author thun.hwang(thun.hwang@samsung.com)
24 * <b>Revision History: </b>
25 * - 2011/12/31 : thun.hwang(thun.hwang@samsung.com) \n
28 * - 2012/01/18 : Sangwoo, Park(sw5771.park@samsung.com) \n
29 * Adjust Doxygen Document
31 * - 2012/02/01 : Sangwoo, Park(sw5771.park@samsung.com) \n
33 * Adjust struct ExynosCameraInfo
34 * External ISP feature
36 * - 2012/03/14 : sangwoo.park(sw5771.park@samsung.com) \n
37 * Change file, class name to ExynosXXX.
43 * @section Introduction
44 * ExynosCamera is for camera preview,takePicture and recording.
45 * (Currently libseccamera is included in Android Camera HAL(libcamera.so).
48 * Copyright (c) 2008-2011 Samsung Electronics Co., Ltd.All rights reserved. \n
49 * Proprietary and Confidential
51 * @image html samsung.png
54 //#define LOG_NDEBUG 0
55 #define LOG_TAG "ExynosCamera"
57 /* FIXME: This define will be removed when functions are stable */
62 #include <utils/Log.h>
64 #include "ExynosCamera.h"
65 #include "exynos_format.h"
67 using namespace android
;
71 ExynosCameraInfo::ExynosCameraInfo()
75 previewColorFormat
= V4L2_PIX_FMT_NV21
;
78 prefVideoPreviewW
= 640;
79 prefVideoPreviewH
= 360;
80 videoColorFormat
= V4L2_PIX_FMT_NV12M
;
83 pictureColorFormat
= V4L2_PIX_FMT_YUYV
;
88 ExynosCamera::ANTIBANDING_OFF
89 | ExynosCamera::ANTIBANDING_50HZ
90 | ExynosCamera::ANTIBANDING_60HZ
91 | ExynosCamera::ANTIBANDING_OFF
;
92 antiBanding
= ExynosCamera::ANTIBANDING_OFF
;
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
;
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
;
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
;
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
;
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
;
154 autoWhiteBalanceLockSupported
= false;
155 autoWhiteBalanceLock
= false;
162 autoExposureLockSupported
= false;
163 autoExposureLock
= false;
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;
182 // Additional API default Value.
187 contrast
= ExynosCamera::CONTRAST_DEFAULT
;
189 hue
= 2; // 2 is default;
191 metering
= ExynosCamera::METERING_MODE_CENTER
;
192 objectTracking
= false;
193 objectTrackingStart
= false;
196 shotMode
= ExynosCamera::SHOT_MODE_SINGLE
;
199 touchAfStart
= false;
205 ExynosCameraInfoM5M0::ExynosCameraInfoM5M0()
209 previewColorFormat
= V4L2_PIX_FMT_YVU420M
;
212 prefVideoPreviewW
= 640;
213 prefVideoPreviewH
= 360;
214 videoColorFormat
= V4L2_PIX_FMT_NV12M
;
217 pictureColorFormat
= V4L2_PIX_FMT_YUYV
;
221 antiBandingList
= ExynosCamera::ANTIBANDING_OFF
;
222 antiBanding
= ExynosCamera::ANTIBANDING_OFF
;
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
;
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
;
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
254 focusMode
= ExynosCamera::FOCUS_MODE_AUTO
;
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
;
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
284 whiteBalance
= ExynosCamera::WHITE_BALANCE_AUTO
;
286 autoWhiteBalanceLockSupported
= false;
287 autoWhiteBalanceLock
= false;
294 autoExposureLockSupported
= false;
295 autoExposureLock
= false;
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;
315 ExynosCameraInfoS5K6A3::ExynosCameraInfoS5K6A3()
319 previewColorFormat
= V4L2_PIX_FMT_YVU420M
;
322 prefVideoPreviewW
= 640;
323 prefVideoPreviewH
= 360;
324 videoColorFormat
= V4L2_PIX_FMT_NV12M
;
327 pictureColorFormat
= V4L2_PIX_FMT_YUYV
;
332 ExynosCamera::ANTIBANDING_OFF
333 | ExynosCamera::ANTIBANDING_50HZ
334 | ExynosCamera::ANTIBANDING_60HZ
335 | ExynosCamera::ANTIBANDING_OFF
;
336 antiBanding
= ExynosCamera::ANTIBANDING_OFF
;
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
349 effect
= ExynosCamera::EFFECT_NONE
;
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
358 flashMode
= ExynosCamera::FLASH_MODE_OFF
;
361 // ExynosCamera::FOCUS_MODE_AUTO
362 //| ExynosCamera::FOCUS_MODE_INFINITY
363 //| ExynosCamera::FOCUS_MODE_MACRO
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
371 focusMode
= ExynosCamera::FOCUS_MODE_FIXED
;
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
;
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
401 whiteBalance
= ExynosCamera::WHITE_BALANCE_AUTO
;
403 autoWhiteBalanceLockSupported
= true;
404 autoWhiteBalanceLock
= false;
411 autoExposureLockSupported
= true;
412 autoExposureLock
= false;
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;
432 ExynosCameraInfoS5K4E5::ExynosCameraInfoS5K4E5()
436 previewColorFormat
= V4L2_PIX_FMT_YVU420M
;
439 prefVideoPreviewW
= 640;
440 prefVideoPreviewH
= 360;
441 videoColorFormat
= V4L2_PIX_FMT_NV12M
;
444 pictureColorFormat
= V4L2_PIX_FMT_YUYV
;
449 ExynosCamera::ANTIBANDING_OFF
450 | ExynosCamera::ANTIBANDING_50HZ
451 | ExynosCamera::ANTIBANDING_60HZ
452 | ExynosCamera::ANTIBANDING_OFF
;
453 antiBanding
= ExynosCamera::ANTIBANDING_OFF
;
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
466 effect
= ExynosCamera::EFFECT_NONE
;
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
;
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
486 focusMode
= ExynosCamera::FOCUS_MODE_AUTO
;
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
;
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
516 whiteBalance
= ExynosCamera::WHITE_BALANCE_AUTO
;
518 autoWhiteBalanceLockSupported
= true;
519 autoWhiteBalanceLock
= false;
526 autoExposureLockSupported
= true;
527 autoExposureLock
= false;
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;
547 //////////////////////////////////////////////////
549 #define PFX_NODE "/dev/video"
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"
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
563 #define VIDEO_NODE_PREVIEW_ID (3)
564 #define VIDEO_NODE_RECODING_ID (2)
565 #define VIDEO_NODE_SNAPSHOT_ID (1)
567 #define ISP_SENSOR_MAX_ENTITIES 1
568 #define ISP_SENSOR_PAD_SOURCE_FRONT 0
569 #define ISP_SENSOR_PADS_NUM 1
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
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
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"
597 #define PFX_SUBDEV_NODE "/dev/v4l-subdev"
600 * V 4 L 2 F I M C E X T E N S I O N S
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)
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)
617 #define V4L2_PIX_FMT_YVYU v4l2_fourcc('Y', 'V', 'Y', 'U')
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')
625 ///////////////////////////////////////////////////
626 // Google Official API : Camera.Parameters
627 // http://developer.android.com/reference/android/hardware/Camera.Parameters.html
628 ///////////////////////////////////////////////////
630 ExynosCamera::ExynosCamera() :
632 m_cameraId(CAMERA_ID_BACK
),
633 m_defaultCameraInfo(NULL
),
634 m_curCameraInfo(NULL
),
636 m_jpegThumbnailQuality(100),
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
));
650 m_tryPreviewStop
= true;
651 m_tryVideoStop
= true;
652 m_tryPictureStop
= true;
654 m_flagStartFaceDetection
= false;
655 m_flagAutoFocusRunning
= false;
657 m_sensorEntity
= 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
;
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;
677 memset((void *)m_cameraName
, 0, 32);
679 m_internalISP
= true;
682 memset(&mExifInfo
, 0, sizeof(mExifInfo
));
685 ExynosCamera::~ExynosCamera()
687 if (m_flagCreate
== true)
691 bool ExynosCamera::create(int cameraId
)
698 struct media_link
*links
= NULL
;
700 if (m_flagCreate
== true) {
701 ALOGE("ERR(%s):Already created", __func__
);
705 m_cameraId
= cameraId
;
707 ExynosBuffer nullBuf
;
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;
714 m_previewBuf
[i
] = nullBuf
;
715 m_videoBuf
[i
] = nullBuf
;
716 m_pictureBuf
[i
] = nullBuf
;
719 if (m_cameraId
== CAMERA_ID_BACK
)
720 m_internalISP
= true;
721 // m_internalISP = false; // external ISP.
723 m_internalISP
= true;
725 if (m_internalISP
== true) {
726 //////////////////////////////
728 //////////////////////////////
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
));
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
));
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
));
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
));
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
));
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
));
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
));
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
);
780 links
= m_ispSensorEntity
->links
;
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__
);
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__
);
790 ALOGV("DEBUG(%s):[LINK SUCCESS] Sensor to front", __func__
);
793 for (i
= 0; i
< m_ispFrontEntity
->num_links
; i
++) {
794 links
= &m_ispFrontEntity
->links
[i
];
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
);
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__
);
808 ALOGV("DEBUG(%s):[LINK SUCCESS] front to back", __func__
);
810 // BACK TO ScalerP Video
811 for (i
= 0; i
< m_ispBackEntity
->num_links
; i
++) {
812 links
= &m_ispBackEntity
->links
[i
];
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
);
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__
);
826 ALOGV("DEBUG(%s):[LINK SUCCESS] back to scalerP", __func__
);
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
));
834 m_previewDev
= &m_gscPreviewDev
;
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
));
842 m_videoDev
= &m_gscVideoDev
;
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
));
850 m_pictureDev
= &m_gscPictureDev
;
853 //////////////////////////////
855 //////////////////////////////
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
));
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
);
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
);
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
);
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
);
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
);
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
);
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
);
912 // sensor subdev to mipi subdev
913 links
= m_sensorEntity
->links
;
915 links
->source
->entity
!= m_sensorEntity
||
916 links
->sink
->entity
!= m_mipiEntity
) {
917 ALOGE("ERR(%s):Cannot make link camera sensor to mipi", __func__
);
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__
);
925 ALOGV("DEBUG(%s):[LINK SUCCESS] sensor subdev to mipi subdev", __func__
);
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
);
935 links
->source
->entity
!= m_mipiEntity
||
936 links
->sink
->entity
!= m_fliteSdEntity
) {
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__
);
943 ALOGV("DEBUG(%s):[LINK SUCCESS] mipi subdev to fimc-lite subdev", __func__
);
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
);
953 links
->source
->entity
!= m_fliteSdEntity
||
954 links
->sink
->entity
!= m_fliteVdEntity
) {
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__
);
961 ALOGV("DEBUG(%s):[LINK SUCCESS] fimc-lite subdev to fimc-lite video dev", __func__
);
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
);
971 links
->source
->entity
!= m_fliteSdEntity
||
972 links
->sink
->entity
!= m_gscSdEntity
) {
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__
);
979 ALOGV("DEBUG(%s):[LINK SUCCESS] fimc-lite subdev to gscaler subdev", __func__
);
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
);
989 links
->source
->entity
!= m_gscSdEntity
||
990 links
->sink
->entity
!= m_gscVdEntity
) {
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__
);
997 ALOGV("DEBUG(%s):[LINK SUCCESS] gscaler subdev to gscaler video dev", __func__
);
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
));
1005 m_previewDev
= &m_fliteDev
;
1006 m_videoDev
= &m_fliteDev
;
1007 m_pictureDev
= &m_fliteDev
;
1010 m_previewDev
->flagStart
= false;
1011 m_videoDev
->flagStart
= false;
1012 m_pictureDev
->flagStart
= false;
1014 m_tryPreviewStop
= true;
1015 m_tryVideoStop
= true;
1016 m_tryPictureStop
= true;
1018 m_flagStartFaceDetection
= false;
1019 m_flagAutoFocusRunning
= false;
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
);
1027 if (m_cameraId
== CAMERA_ID_BACK
)
1028 strcpy(m_cameraName
, "S5K4E5");
1030 strcpy(m_cameraName
, "S5K6A3");
1032 if (exynos_v4l2_s_input(m_previewDev
->fd
, m_cameraId
) < 0) {
1033 ALOGE("ERR(%s):exynos_v4l2_s_input() fail", __func__
);
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
;
1047 ALOGE("ERR(%s):invalid camera Name (%s) fail", __func__
, m_cameraName
);
1051 m_setExifFixedAttribute();
1053 m_flagCreate
= true;
1057 if (m_defaultCameraInfo
)
1058 delete m_defaultCameraInfo
;
1059 m_defaultCameraInfo
= NULL
;
1061 if (m_curCameraInfo
)
1062 delete m_curCameraInfo
;
1063 m_curCameraInfo
= NULL
;
1065 if (0 < m_videoDev
->fd
)
1066 exynos_v4l2_close(m_videoDev
->fd
);
1069 if (0 < m_pictureDev
->fd
)
1070 exynos_v4l2_close(m_pictureDev
->fd
);
1071 m_pictureDev
->fd
= 0;
1073 if (0 < m_previewDev
->fd
)
1074 exynos_v4l2_close(m_previewDev
->fd
);
1075 m_previewDev
->fd
= 0;
1078 exynos_media_close(m_media
);
1084 bool ExynosCamera::destroy(void)
1086 if (m_flagCreate
== false) {
1087 ALOGE("ERR(%s):Not yet created", __func__
);
1091 if (m_pictureDev
->flagStart
== true)
1094 if (m_videoDev
->flagStart
== true)
1097 if (m_previewDev
->flagStart
== true)
1100 if (m_defaultCameraInfo
)
1101 delete m_defaultCameraInfo
;
1102 m_defaultCameraInfo
= NULL
;
1104 if (m_curCameraInfo
)
1105 delete m_curCameraInfo
;
1106 m_curCameraInfo
= NULL
;
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
);
1114 if (0 < m_pictureDev
->fd
)
1115 exynos_v4l2_close(m_pictureDev
->fd
);
1116 m_pictureDev
->fd
= 0;
1118 if (0 < m_previewDev
->fd
)
1119 exynos_v4l2_close(m_previewDev
->fd
);
1120 m_previewDev
->fd
= 0;
1123 exynos_media_close(m_media
);
1126 m_flagCreate
= false;
1131 bool ExynosCamera::flagCreate(void)
1133 return m_flagCreate
;
1136 int ExynosCamera::getCameraId(void)
1141 char *ExynosCamera::getCameraName(void)
1143 return m_cameraName
;
1146 int ExynosCamera::getPreviewFd(void)
1148 return m_previewDev
->fd
;
1151 int ExynosCamera::getPictureFd(void)
1153 return m_pictureDev
->fd
;
1156 int ExynosCamera::getVideoFd(void)
1158 return m_videoDev
->fd
;
1161 bool ExynosCamera::startPreview(void)
1163 if (m_flagCreate
== false) {
1164 ALOGE("ERR(%s):Not yet Created", __func__
);
1168 if (m_previewDev
->flagStart
== false) {
1169 if (m_setWidthHeight(PREVIEW_MODE
,
1171 &m_previewDev
->events
,
1172 m_curCameraInfo
->previewW
,
1173 m_curCameraInfo
->previewH
,
1174 m_curCameraInfo
->previewColorFormat
,
1176 m_validPreviewBuf
) == false) {
1177 ALOGE("ERR(%s):m_setWidthHeight() fail", __func__
);
1181 if (setPreviewFrameRate(m_curCameraInfo
->fps
) == false)
1182 ALOGE("ERR(%s):Fail toggle setPreviewFrameRate(%d)",
1183 __func__
, m_curCameraInfo
->fps
);
1185 if (exynos_v4l2_streamon(m_previewDev
->fd
, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
) < 0) {
1186 ALOGE("ERR(%s):exynos_v4l2_streamon() fail", __func__
);
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__
);
1198 m_tryPreviewStop
= false;
1199 m_previewDev
->flagStart
= true;
1202 /* DIS is only supported BACK camera(4E5) currently. */
1204 bool toggle
= getVideoStabilization();
1206 if (setVideoStabilization(toggle
) == false)
1207 ALOGE("ERR(%s):setVideoStabilization() fail", __func__
);
1211 if (m_recordingHint
== true && getCameraId() == CAMERA_ID_BACK
) {
1212 if (set3DNR(true) == false)
1213 ALOGE("ERR(%s):set3DNR() fail", __func__
);
1218 if (setODC(true) == false)
1219 ALOGE("ERR(%s):setODC() fail", __func__
);
1226 bool ExynosCamera::stopPreview(void)
1228 if (m_flagCreate
== false) {
1229 ALOGE("ERR(%s):Not yet Created", __func__
);
1233 if (m_previewDev
->flagStart
== true) {
1235 if (m_curCameraInfo
->flashMode
== FLASH_MODE_TORCH
)
1236 setFlashMode(FLASH_MODE_OFF
);
1238 m_tryPreviewStop
= true;
1241 if ( (m_previewDev
== m_videoDev
&& m_tryVideoStop
== false)
1242 || (m_previewDev
== m_pictureDev
&& m_tryPictureStop
== false))
1246 /* Can not use 3DNR, ODC and DIS function because HW problem at exynos5250 EVT0 */
1248 if (set3DNR(false) == false)
1249 ALOGE("ERR(%s):set3DNR() fail", __func__
);
1253 if (setODC(false) == false)
1254 ALOGE("ERR(%s):setODC() fail", __func__
);
1257 if (exynos_v4l2_streamoff(m_previewDev
->fd
, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
) < 0) {
1258 ALOGE("ERR(%s):exynos_v4l2_streamoff() fail", __func__
);
1262 struct v4l2_requestbuffers req
;
1264 req
.type
= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
;
1265 req
.memory
= V4L2_MEMORY_DMABUF
;
1267 if (exynos_v4l2_reqbufs(m_previewDev
->fd
, &req
) < 0) {
1268 ALOGE("ERR(%s):exynos_v4l2_reqbufs() fail", __func__
);
1272 m_previewDev
->flagStart
= false;
1274 m_flagStartFaceDetection
= false;
1280 bool ExynosCamera::flagStartPreview(void)
1282 return m_previewDev
->flagStart
;
1285 int ExynosCamera::getPreviewMaxBuf(void)
1287 return VIDEO_MAX_FRAME
;
1290 bool ExynosCamera::setPreviewBuf(ExynosBuffer
*buf
)
1292 if (m_flagCreate
== false) {
1293 ALOGE("ERR(%s):Not yet created fail", __func__
);
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
);
1302 m_previewBuf
[buf
->reserved
.p
] = *buf
;
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];
1311 bool ExynosCamera::getPreviewBuf(ExynosBuffer
*buf
)
1313 if (m_flagCreate
== false) {
1314 ALOGE("ERR(%s):Not yet created fail", __func__
);
1318 if (m_previewDev
->flagStart
== false) {
1319 ALOGE("ERR(%s):Not yet preview started fail", __func__
);
1323 struct v4l2_buffer v4l2_buf
;
1324 struct v4l2_plane planes
[VIDEO_MAX_PLANES
];
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;
1331 for (int i
= 0; i
< 3; i
++) {
1332 if (m_previewBuf
[0].size
.extS
[i
] != 0)
1336 if (exynos_v4l2_dqbuf(m_previewDev
->fd
, &v4l2_buf
) < 0) {
1337 ALOGE("ERR(%s):exynos_v4l2_dqbuf() fail", __func__
);
1341 if (VIDEO_MAX_FRAME
<= v4l2_buf
.index
) {
1342 ALOGE("ERR(%s):wrong index = %d", __func__
, v4l2_buf
.index
);
1346 *buf
= m_previewBuf
[v4l2_buf
.index
];
1351 bool ExynosCamera::putPreviewBuf(ExynosBuffer
*buf
)
1353 if (m_flagCreate
== false) {
1354 ALOGE("ERR(%s):Not yet created fail", __func__
);
1358 if (m_validPreviewBuf
[buf
->reserved
.p
] == false) {
1359 ALOGE("ERR(%s):Invalid index(%d)", __func__
, buf
->reserved
.p
);
1363 struct v4l2_buffer v4l2_buf
;
1364 struct v4l2_plane planes
[VIDEO_MAX_PLANES
];
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;
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
];
1376 if (m_previewBuf
[buf
->reserved
.p
].size
.extS
[i
] != 0)
1380 if (exynos_v4l2_qbuf(m_previewDev
->fd
, &v4l2_buf
) < 0) {
1381 ALOGE("ERR(%s):exynos_v4l2_qbuf() fail", __func__
);
1388 bool ExynosCamera::setVideoSize(int w
, int h
)
1390 m_curCameraInfo
->videoW
= w
;
1391 m_curCameraInfo
->videoH
= h
;
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
;
1401 bool ExynosCamera::getVideoSize(int *w
, int *h
)
1403 *w
= m_curCameraInfo
->videoW
;
1404 *h
= m_curCameraInfo
->videoH
;
1408 bool ExynosCamera::setVideoFormat(int colorFormat
)
1410 m_curCameraInfo
->videoColorFormat
= colorFormat
;
1414 int ExynosCamera::getVideoFormat(void)
1416 return m_curCameraInfo
->videoColorFormat
;
1419 bool ExynosCamera::startVideo(void)
1421 if (m_flagCreate
== false) {
1422 ALOGE("ERR(%s):Not yet Created", __func__
);
1426 #ifdef USE_3DNR_DMAOUT
1427 if (m_videoDev
->flagStart
== false) {
1428 if (m_setWidthHeight(VIDEO_MODE
,
1430 &m_videoDev
->events
,
1431 m_curCameraInfo
->videoW
,
1432 m_curCameraInfo
->videoH
,
1433 m_curCameraInfo
->videoColorFormat
,
1435 m_validVideoBuf
) == false) {
1436 ALOGE("ERR(%s):m_setWidthHeight() fail", __func__
);
1440 if (exynos_v4l2_streamon(m_videoDev
->fd
, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
) < 0) {
1441 ALOGE("ERR(%s):exynos_v4l2_streamon() fail", __func__
);
1445 m_tryVideoStop
= false;
1446 m_videoDev
->flagStart
= true;
1453 bool ExynosCamera::stopVideo(void)
1455 if (m_flagCreate
== false) {
1456 ALOGE("ERR(%s):Not yet Created", __func__
);
1460 if (m_videoDev
->flagStart
== true) {
1462 m_tryVideoStop
= true;
1465 if ( (m_videoDev
== m_previewDev
&& m_tryPreviewStop
== false)
1466 || (m_videoDev
== m_pictureDev
&& m_tryPictureStop
== false))
1469 if (exynos_v4l2_streamoff(m_videoDev
->fd
, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
) < 0) {
1470 ALOGE("ERR(%s):exynos_v4l2_streamoff() fail", __func__
);
1473 struct v4l2_requestbuffers req
;
1475 req
.type
= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
;
1476 req
.memory
= V4L2_MEMORY_DMABUF
;
1478 if (exynos_v4l2_reqbufs(m_videoDev
->fd
, &req
) < 0) {
1479 ALOGE("ERR(%s):exynos_v4l2_reqbufs() fail", __func__
);
1483 m_videoDev
->flagStart
= false;
1489 bool ExynosCamera::flagStartVideo(void)
1491 return m_videoDev
->flagStart
;
1494 int ExynosCamera::getVideoMaxBuf(void)
1496 return VIDEO_MAX_FRAME
;
1499 bool ExynosCamera::setVideoBuf(ExynosBuffer
*buf
)
1501 if (m_flagCreate
== false) {
1502 ALOGE("ERR(%s):Not yet created fail", __func__
);
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
);
1511 m_videoBuf
[buf
->reserved
.p
] = *buf
;
1515 bool ExynosCamera::getVideoBuf(ExynosBuffer
*buf
)
1517 if (m_flagCreate
== false) {
1518 ALOGE("ERR(%s):Not yet created fail", __func__
);
1522 if (m_videoDev
->flagStart
== false) {
1523 ALOGE("ERR(%s):Not yet video started fail", __func__
);
1527 struct v4l2_buffer v4l2_buf
;
1528 struct v4l2_plane planes
[VIDEO_MAX_PLANES
];
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;
1535 for (int i
= 0; i
< 3; i
++) {
1536 if (m_videoBuf
[0].size
.extS
[i
] != 0)
1540 if (exynos_v4l2_dqbuf(m_videoDev
->fd
, &v4l2_buf
) < 0) {
1541 ALOGE("ERR(%s):exynos_v4l2_dqbuf() fail", __func__
);
1545 if (VIDEO_MAX_FRAME
<= v4l2_buf
.index
) {
1546 ALOGE("ERR(%s):wrong index = %d", __func__
, v4l2_buf
.index
);
1550 *buf
= m_videoBuf
[v4l2_buf
.index
];
1555 bool ExynosCamera::putVideoBuf(ExynosBuffer
*buf
)
1557 if (m_flagCreate
== false) {
1558 ALOGE("ERR(%s):Not yet created fail", __func__
);
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.
1569 ALOGV("DEBUG(%s):recording not in progress, ignoring", __func__
);
1573 if (m_validVideoBuf
[buf
->reserved
.p
] == false) {
1574 ALOGE("ERR(%s):Invalid index(%d)", __func__
, buf
->reserved
.p
);
1578 struct v4l2_buffer v4l2_buf
;
1579 struct v4l2_plane planes
[VIDEO_MAX_PLANES
];
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;
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
];
1591 if (m_videoBuf
[buf
->reserved
.p
].size
.extS
[i
] != 0)
1595 if (exynos_v4l2_qbuf(m_videoDev
->fd
, &v4l2_buf
) < 0) {
1596 ALOGE("ERR(%s):exynos_v4l2_qbuf() fail", __func__
);
1603 bool ExynosCamera::startPicture(void)
1605 if (m_flagCreate
== false) {
1606 ALOGE("ERR(%s):Not yet Created", __func__
);
1610 if (m_pictureDev
->flagStart
== false) {
1611 if (m_setWidthHeight(PICTURE_MODE
,
1613 &m_pictureDev
->events
,
1614 m_curCameraInfo
->pictureW
,
1615 m_curCameraInfo
->pictureH
,
1616 m_curCameraInfo
->pictureColorFormat
,
1618 m_validPictureBuf
) == false) {
1619 ALOGE("ERR(%s):m_setWidthHeight() fail", __func__
);
1623 if (exynos_v4l2_streamon(m_pictureDev
->fd
, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
) < 0) {
1624 ALOGE("ERR(%s):exynos_v4l2_streamon() fail", __func__
);
1628 m_tryPictureStop
= false;
1629 m_pictureDev
->flagStart
= true;
1635 bool ExynosCamera::stopPicture(void)
1637 if (m_flagCreate
== false) {
1638 ALOGE("ERR(%s):Not yet Created", __func__
);
1642 if (m_pictureDev
->flagStart
== true) {
1644 m_tryPictureStop
= true;
1647 if ( (m_pictureDev
== m_previewDev
&& m_tryPreviewStop
== false)
1648 || (m_pictureDev
== m_videoDev
&& m_tryVideoStop
== false))
1651 if (exynos_v4l2_streamoff(m_pictureDev
->fd
, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
) < 0) {
1652 ALOGE("ERR(%s):exynos_v4l2_streamoff() fail", __func__
);
1656 struct v4l2_requestbuffers req
;
1658 req
.type
= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
;
1659 req
.memory
= V4L2_MEMORY_DMABUF
;
1661 if (exynos_v4l2_reqbufs(m_pictureDev
->fd
, &req
) < 0) {
1662 ALOGE("ERR(%s):exynos_v4l2_reqbufs() fail", __func__
);
1666 m_pictureDev
->flagStart
= false;
1672 bool ExynosCamera::flagStartPicture(void)
1674 return m_pictureDev
->flagStart
;
1677 int ExynosCamera::getPictureMaxBuf(void)
1679 return VIDEO_MAX_FRAME
;
1682 bool ExynosCamera::setPictureBuf(ExynosBuffer
*buf
)
1684 if (m_flagCreate
== false) {
1685 ALOGE("ERR(%s):Not yet created fail", __func__
);
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
);
1694 m_pictureBuf
[buf
->reserved
.p
] = *buf
;
1698 bool ExynosCamera::getPictureBuf(ExynosBuffer
*buf
)
1700 if (m_flagCreate
== false) {
1701 ALOGE("ERR(%s):Not yet created fail", __func__
);
1705 if (m_pictureDev
->flagStart
== false) {
1706 ALOGE("ERR(%s):Not yet picture started fail", __func__
);
1710 struct v4l2_buffer v4l2_buf
;
1711 struct v4l2_plane planes
[VIDEO_MAX_PLANES
];
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;
1718 for (int i
= 0; i
< 3; i
++) {
1719 if (m_pictureBuf
[0].size
.extS
[i
] != 0)
1723 if (exynos_v4l2_dqbuf(m_pictureDev
->fd
, &v4l2_buf
) < 0) {
1724 ALOGE("ERR(%s):exynos_v4l2_dqbuf() fail", __func__
);
1728 if (VIDEO_MAX_FRAME
<= v4l2_buf
.index
) {
1729 ALOGE("ERR(%s):wrong index = %d", __func__
, v4l2_buf
.index
);
1733 *buf
= m_pictureBuf
[v4l2_buf
.index
];
1738 bool ExynosCamera::putPictureBuf(ExynosBuffer
*buf
)
1740 if (m_flagCreate
== false) {
1741 ALOGE("ERR(%s):Not yet created fail", __func__
);
1745 if (m_pictureDev
->flagStart
== false) {
1746 ALOGE("ERR(%s):Not yet picture started fail", __func__
);
1750 if (m_validPictureBuf
[buf
->reserved
.p
] == false) {
1751 ALOGE("ERR(%s):Invalid index(%d)", __func__
, buf
->reserved
.p
);
1755 struct v4l2_buffer v4l2_buf
;
1756 struct v4l2_plane planes
[VIDEO_MAX_PLANES
];
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;
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
];
1768 if (m_pictureBuf
[buf
->reserved
.p
].size
.extS
[i
] != 0)
1772 if (exynos_v4l2_qbuf(m_pictureDev
->fd
, &v4l2_buf
) < 0) {
1773 ALOGE("ERR(%s):exynos_v4l2_qbuf() fail", __func__
);
1780 bool ExynosCamera::yuv2Jpeg(ExynosBuffer
*yuvBuf
,
1781 ExynosBuffer
*jpegBuf
,
1784 unsigned char *addr
;
1786 ExynosJpegEncoderForCamera jpegEnc
;
1789 unsigned int *yuvSize
= yuvBuf
->size
.extS
;
1791 if (jpegEnc
.create()) {
1792 ALOGE("ERR(%s):jpegEnc.create() fail", __func__
);
1793 goto jpeg_encode_done
;
1796 if (jpegEnc
.setQuality(m_jpegQuality
)) {
1797 ALOGE("ERR(%s):jpegEnc.setQuality() fail", __func__
);
1798 goto jpeg_encode_done
;
1801 if (jpegEnc
.setSize(rect
->w
, rect
->h
)) {
1802 ALOGE("ERR(%s):jpegEnc.setSize() fail", __func__
);
1803 goto jpeg_encode_done
;
1806 if (jpegEnc
.setColorFormat(rect
->colorFormat
)) {
1807 ALOGE("ERR(%s):jpegEnc.setColorFormat() fail", __func__
);
1808 goto jpeg_encode_done
;
1811 if (jpegEnc
.setJpegFormat(V4L2_PIX_FMT_JPEG_422
)) {
1812 ALOGE("ERR(%s):jpegEnc.setJpegFormat() fail", __func__
);
1813 goto jpeg_encode_done
;
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
;
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
;
1830 m_setExifChangedAttribute(&mExifInfo
, rect
);
1832 mExifInfo
.enableThumb
= false;
1835 if (jpegEnc
.setInBuf((char **)&(yuvBuf
->virt
.p
), (int *)yuvSize
)) {
1836 ALOGE("ERR(%s):jpegEnc.setInBuf() fail", __func__
);
1837 goto jpeg_encode_done
;
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
;
1845 if (jpegEnc
.updateConfig()) {
1846 ALOGE("ERR(%s):jpegEnc.updateConfig() fail", __func__
);
1847 goto jpeg_encode_done
;
1850 if (jpegEnc
.encode((int *)&jpegBuf
->size
.s
, &mExifInfo
)) {
1851 ALOGE("ERR(%s):jpegEnc.encode() fail", __func__
);
1852 goto jpeg_encode_done
;
1859 if (jpegEnc
.flagCreate() == true)
1865 bool ExynosCamera::autoFocus(void)
1867 if (m_previewDev
->fd
<= 0) {
1868 ALOGE("ERR(%s):Camera was closed", __func__
);
1872 if (m_flagAutoFocusRunning
== true) {
1873 ALOGD("DEBUG(%s):m_flagAutoFocusRunning == true", __func__
);
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__
);
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__
);
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. */
1898 case FOCUS_MODE_TOUCH
:
1899 if (setFocusMode(FOCUS_MODE_TOUCH
) == false) {
1900 ALOGE("ERR(%s): %d: setFocusMode(FOCUS_MODE_TOUCH) fail", __func__
, __LINE__
);
1904 case FOCUS_MODE_FIXED
:
1906 case FOCUS_MODE_EDOF
:
1908 ALOGE("ERR(%s):Unsupported value(%d)", __func__
, m_curCameraInfo
->focusMode
);
1913 m_flagAutoFocusRunning
= true;
1918 bool ExynosCamera::cancelAutoFocus(void)
1920 if (m_previewDev
->fd
<= 0) {
1921 ALOGE("ERR(%s):Camera was closed", __func__
);
1925 if (m_flagAutoFocusRunning
== false) {
1926 ALOGV("DEBUG(%s):m_flagAutoFocusRunning == false", __func__
);
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__
);
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. */
1944 case FOCUS_MODE_TOUCH
:
1945 if (setFocusMode(FOCUS_MODE_TOUCH
) == false) {
1946 ALOGE("ERR(%s): %d: setFocusMode(FOCUS_MODE_TOUCH) fail", __func__
, __LINE__
);
1949 m_touchAFMode
= false;
1951 case FOCUS_MODE_FIXED
:
1953 case FOCUS_MODE_EDOF
:
1955 ALOGE("ERR(%s):Unsupported value(%d)", __func__
, m_curCameraInfo
->focusMode
);
1960 m_flagAutoFocusRunning
= false;
1965 int ExynosCamera::getFucusModeResult(void)
1969 #define AF_WATING_TIME (100000) // 100msec
1970 #define TOTAL_AF_WATING_TIME (2000000) // 2000msec
1972 for (unsigned int i
= 0; i
< TOTAL_AF_WATING_TIME
; i
+= AF_WATING_TIME
) {
1974 if (m_flagAutoFocusRunning
== false)
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__
);
1982 if (strcmp((const char*)m_cameraName
, "S5K4E5") == 0) {
1984 case 0x00: // AF Running
1987 case 0x02: // AF succeed
1991 default : // AF fail
1999 } else if (strcmp((const char*)m_cameraName
, "M5M0") == 0) {
2001 case 0x00: // AF Running
2004 case 0x01: // AF succeed
2007 case 0x02: // AF cancel
2022 usleep(AF_WATING_TIME
);
2028 bool ExynosCamera::startFaceDetection(void)
2030 if (m_flagStartFaceDetection
== true) {
2031 ALOGD("DEBUG(%s):Face detection already started..", __func__
);
2035 if (m_previewDev
->flagStart
== true) {
2036 //if (this->setFocusMode(FOCUS_MODE_AUTO) == false)
2037 // ALOGE("ERR(%s):Fail setFocusMode", __func__);
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__
);
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__
);
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__
);
2055 m_flagStartFaceDetection
= true;
2060 bool ExynosCamera::stopFaceDetection(void)
2062 if (m_flagStartFaceDetection
== false) {
2063 ALOGD("DEBUG(%s):Face detection already stopped..", __func__
);
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__
);
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__
);
2079 m_flagStartFaceDetection
= false;
2084 bool ExynosCamera::flagStartFaceDetection(void)
2086 return m_flagStartFaceDetection
;
2089 bool ExynosCamera::setFaceDetectLock(bool toggle
)
2091 int lock
= (toggle
== true) ? 1 : 0;
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__
);
2100 bool ExynosCamera::startSmoothZoom(int value
)
2102 if (m_defaultCameraInfo
->hwZoomSupported
== false) {
2103 ALOGE("ERR(%s):m_defaultCameraInfo->hwZoomSupported == false", __func__
);
2107 return this->setZoom(value
);
2110 bool ExynosCamera::stopSmoothZoom(void)
2116 int ExynosCamera::getAntibanding(void)
2118 return m_curCameraInfo
->antiBanding
;
2121 bool ExynosCamera::getAutoExposureLock(void)
2123 return m_curCameraInfo
->autoExposureLock
;
2126 bool ExynosCamera::getAutoWhiteBalanceLock(void)
2128 return m_curCameraInfo
->autoWhiteBalanceLock
;
2131 int ExynosCamera::getColorEffect(void)
2133 return m_curCameraInfo
->effect
;
2136 int ExynosCamera::getDetectedFacesAreas(int num
,
2140 ExynosRect
*leftEye
,
2141 ExynosRect
*rightEye
,
2144 if (m_defaultCameraInfo
->maxNumDetectedFaces
== 0) {
2145 ALOGE("ERR(%s):maxNumDetectedFaces == 0 fail", __func__
);
2149 if (m_flagStartFaceDetection
== false) {
2150 ALOGD("DEBUG(%s):m_flagStartFaceDetection == false", __func__
);
2154 if (m_defaultCameraInfo
->maxNumDetectedFaces
< num
)
2155 num
= m_defaultCameraInfo
->maxNumDetectedFaces
;
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
];
2165 num
= getDetectedFacesAreas(num
, id
, score
, face2
, leftEye2
, rightEye2
, mouth2
);
2167 for (int i
= 0; i
< num
; i
++) {
2169 m_secRect22SecRect(&face2
[i
], &face
[i
]);
2170 face
[i
].fullW
= m_curCameraInfo
->previewW
;
2171 face
[i
].fullH
= m_curCameraInfo
->previewH
;
2173 m_secRect22SecRect(&leftEye2
[i
], &leftEye
[i
]);
2174 leftEye
[i
].fullW
= m_curCameraInfo
->previewW
;
2175 leftEye
[i
].fullH
= m_curCameraInfo
->previewH
;
2177 m_secRect22SecRect(&rightEye2
[i
], &rightEye
[i
]);
2178 rightEye
[i
].fullW
= m_curCameraInfo
->previewW
;
2179 rightEye
[i
].fullH
= m_curCameraInfo
->previewH
;
2181 m_secRect22SecRect(&mouth2
[i
], &mouth
[i
]);
2182 mouth
[i
].fullW
= m_curCameraInfo
->previewW
;
2183 mouth
[i
].fullH
= m_curCameraInfo
->previewH
;
2188 delete [] rightEye2
;
2194 int ExynosCamera::getDetectedFacesAreas(int num
,
2198 ExynosRect2
*leftEye
,
2199 ExynosRect2
*rightEye
,
2202 if (m_defaultCameraInfo
->maxNumDetectedFaces
== 0) {
2203 ALOGE("ERR(%s):maxNumDetectedFaces == 0 fail", __func__
);
2207 if (m_flagStartFaceDetection
== false) {
2208 ALOGD("DEBUG(%s):m_flagStartFaceDetection == false", __func__
);
2214 if (m_defaultCameraInfo
->maxNumDetectedFaces
< num
)
2215 num
= m_defaultCameraInfo
->maxNumDetectedFaces
;
2217 const unsigned int numOfFDEntity
= 1 + ((V4L2_CID_IS_FD_GET_NEXT
- V4L2_CID_IS_FD_GET_FACE_FRAME_NUMBER
) * num
);
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
;
2226 cur_ctrl
= &fd_ctrl
[0];
2227 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_FACE_COUNT
;
2230 for (i
= 0; i
< num
; i
++) {
2231 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_FACE_FRAME_NUMBER
;
2233 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_FACE_CONFIDENCE
;
2235 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_FACE_TOPLEFT_X
;
2237 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_FACE_TOPLEFT_Y
;
2239 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_FACE_BOTTOMRIGHT_X
;
2241 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_FACE_BOTTOMRIGHT_Y
;
2243 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_LEFT_EYE_TOPLEFT_X
;
2245 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_LEFT_EYE_TOPLEFT_Y
;
2247 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_LEFT_EYE_BOTTOMRIGHT_X
;
2249 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_LEFT_EYE_BOTTOMRIGHT_Y
;
2251 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_RIGHT_EYE_TOPLEFT_X
;
2253 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_RIGHT_EYE_TOPLEFT_Y
;
2255 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_RIGHT_EYE_BOTTOMRIGHT_X
;
2257 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_RIGHT_EYE_BOTTOMRIGHT_Y
;
2259 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_MOUTH_TOPLEFT_X
;
2261 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_MOUTH_TOPLEFT_Y
;
2263 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_MOUTH_BOTTOMRIGHT_X
;
2265 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_MOUTH_BOTTOMRIGHT_Y
;
2267 cur_ctrl
->id
= V4L2_CID_IS_FD_GET_NEXT
;
2271 fd_ctrls
.ctrl_class
= V4L2_CTRL_CLASS_CAMERA
;
2272 fd_ctrls
.count
= i
+ 1;
2273 fd_ctrls
.controls
= fd_ctrl
;
2275 if (exynos_v4l2_g_ext_ctrl(m_previewDev
->fd
, &fd_ctrls
) < 0) {
2276 ALOGE("ERR(%s):exynos_v4l2_g_ext_ctrl() fail", __func__
);
2281 cur_ctrl
= &fd_ctrl
[0];
2282 num
= cur_ctrl
->value
;
2285 for (i
= 0; i
< num
; i
++) {
2286 id
[i
] = cur_ctrl
->value
;
2288 score
[i
] = cur_ctrl
->value
;
2291 face
[i
].x1
= cur_ctrl
->value
;
2293 face
[i
].y1
= cur_ctrl
->value
;
2295 face
[i
].x2
= cur_ctrl
->value
;
2297 face
[i
].y2
= cur_ctrl
->value
;
2300 leftEye
[i
].x1
= cur_ctrl
->value
;
2302 leftEye
[i
].y1
= cur_ctrl
->value
;
2304 leftEye
[i
].x2
= cur_ctrl
->value
;
2306 leftEye
[i
].y2
= cur_ctrl
->value
;
2309 rightEye
[i
].x1
= cur_ctrl
->value
;
2311 rightEye
[i
].y1
= cur_ctrl
->value
;
2313 rightEye
[i
].x2
= cur_ctrl
->value
;
2315 rightEye
[i
].y2
= cur_ctrl
->value
;
2318 mouth
[i
].x1
= cur_ctrl
->value
;
2320 mouth
[i
].y1
= cur_ctrl
->value
;
2322 mouth
[i
].x2
= cur_ctrl
->value
;
2324 mouth
[i
].y2
= cur_ctrl
->value
;
2334 int ExynosCamera::getExposureCompensation(void)
2336 return m_curCameraInfo
->exposure
;
2339 float ExynosCamera::getExposureCompensationStep(void)
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.
2350 int ExynosCamera::getFlashMode(void)
2352 return m_curCameraInfo
->flashMode
;
2355 bool ExynosCamera::getFocalLength(int *num
, int *den
)
2357 *num
= m_defaultCameraInfo
->focalLengthNum
;
2358 *num
= m_defaultCameraInfo
->focalLengthDen
;
2362 int ExynosCamera::getFocusAreas(ExynosRect
*rects
)
2368 int ExynosCamera::getFocusDistances(float *output
)
2374 int ExynosCamera::getFocusMode(void)
2376 return m_curCameraInfo
->focusMode
;
2379 float ExynosCamera::getHorizontalViewAngle(void)
2385 int ExynosCamera::getJpegQuality(void)
2387 return m_jpegQuality
;
2390 int ExynosCamera::getJpegThumbnailQuality(void)
2392 return m_jpegThumbnailQuality
;
2395 bool ExynosCamera::getJpegThumbnailSize(int *w
, int *h
)
2397 *w
= m_curCameraInfo
->thumbnailW
;
2398 *h
= m_curCameraInfo
->thumbnailH
;
2402 int ExynosCamera::getMaxExposureCompensation(void)
2404 return m_defaultCameraInfo
->maxExposure
;
2407 int ExynosCamera::getMaxNumDetectedFaces(void)
2409 return m_defaultCameraInfo
->maxNumDetectedFaces
;
2412 int ExynosCamera::getMaxNumFocusAreas(void)
2414 return m_defaultCameraInfo
->maxNumFocusAreas
;
2417 int ExynosCamera::getMaxNumMeteringAreas(void)
2419 return m_defaultCameraInfo
->maxNumMeteringAreas
;
2422 int ExynosCamera::getMaxZoom(void)
2424 return m_defaultCameraInfo
->maxZoom
;
2427 int ExynosCamera::getMeteringAreas(ExynosRect
*rects
)
2433 int ExynosCamera::getMinExposureCompensation(void)
2435 return m_defaultCameraInfo
->minExposure
;
2438 int ExynosCamera::getPictureFormat(void)
2440 return m_curCameraInfo
->pictureColorFormat
;
2443 bool ExynosCamera::getPictureSize(int *w
, int *h
)
2445 *w
= m_curCameraInfo
->pictureW
;
2446 *h
= m_curCameraInfo
->pictureH
;
2450 int ExynosCamera::getPreviewFormat(void)
2452 return m_curCameraInfo
->previewColorFormat
;
2455 bool ExynosCamera::getPreviewFpsRange(int *min
, int *max
)
2458 *max
= m_defaultCameraInfo
->fps
;
2462 int ExynosCamera::getPreviewFrameRate(void)
2464 return m_curCameraInfo
->fps
;
2467 bool ExynosCamera::getPreviewSize(int *w
, int *h
)
2469 *w
= m_curCameraInfo
->previewW
;
2470 *h
= m_curCameraInfo
->previewH
;
2474 int ExynosCamera::getSceneMode(void)
2476 return m_curCameraInfo
->sceneMode
;
2479 int ExynosCamera::getSupportedAntibanding(void)
2481 return m_defaultCameraInfo
->antiBandingList
;
2484 int ExynosCamera::getSupportedColorEffects(void)
2486 return m_defaultCameraInfo
->effectList
;
2489 int ExynosCamera::getSupportedFlashModes(void)
2491 return m_defaultCameraInfo
->flashModeList
;
2494 int ExynosCamera::getSupportedFocusModes(void)
2496 return m_defaultCameraInfo
->focusModeList
;
2499 bool ExynosCamera::getSupportedJpegThumbnailSizes(int *w
, int *h
)
2501 *w
= m_defaultCameraInfo
->thumbnailW
;
2502 *h
= m_defaultCameraInfo
->thumbnailH
;
2506 bool ExynosCamera::getSupportedPictureSizes(int *w
, int *h
)
2508 *w
= m_defaultCameraInfo
->pictureW
;
2509 *h
= m_defaultCameraInfo
->pictureH
;
2513 bool ExynosCamera::getSupportedPreviewSizes(int *w
, int *h
)
2515 *w
= m_defaultCameraInfo
->previewW
;
2516 *h
= m_defaultCameraInfo
->previewH
;
2520 int ExynosCamera::getSupportedSceneModes(void)
2522 return m_defaultCameraInfo
->sceneModeList
;
2525 bool ExynosCamera::getSupportedVideoSizes(int *w
, int *h
)
2527 *w
= m_defaultCameraInfo
->videoW
;
2528 *h
= m_defaultCameraInfo
->videoH
;
2532 bool ExynosCamera::getPreferredPreivewSizeForVideo(int *w
, int *h
)
2534 *w
= m_defaultCameraInfo
->prefVideoPreviewW
;
2535 *h
= m_defaultCameraInfo
->prefVideoPreviewH
;
2539 int ExynosCamera::getSupportedWhiteBalance(void)
2541 return m_defaultCameraInfo
->whiteBalanceList
;
2544 float ExynosCamera::getVerticalViewAngle(void)
2550 bool ExynosCamera::getVideoStabilization(void)
2552 return m_curCameraInfo
->videoStabilization
;
2555 int ExynosCamera::getWhiteBalance(void)
2557 return m_curCameraInfo
->whiteBalance
;
2560 int ExynosCamera::getZoom(void)
2562 return m_curCameraInfo
->zoom
;
2565 int ExynosCamera::getMaxZoomRatio(void)
2570 bool ExynosCamera::isAutoExposureLockSupported(void)
2572 return m_defaultCameraInfo
->autoExposureLockSupported
;
2575 bool ExynosCamera::isAutoWhiteBalanceLockSupported(void)
2577 return m_defaultCameraInfo
->autoWhiteBalanceLockSupported
;
2580 bool ExynosCamera::isSmoothZoomSupported(void)
2582 if (m_defaultCameraInfo
->hwZoomSupported
== true)
2588 bool ExynosCamera::isVideoSnapshotSupported(void)
2593 bool ExynosCamera::isVideoStabilizationSupported(void)
2595 return m_defaultCameraInfo
->supportVideoStabilization
;
2598 bool ExynosCamera::isZoomSupported(void)
2603 bool ExynosCamera::setAntibanding(int value
)
2605 int internalValue
= -1;
2608 case ANTIBANDING_AUTO
:
2609 internalValue
= ::ANTI_BANDING_AUTO
;
2611 case ANTIBANDING_50HZ
:
2612 internalValue
= ::ANTI_BANDING_50HZ
;
2614 case ANTIBANDING_60HZ
:
2615 internalValue
= ::ANTI_BANDING_60HZ
;
2617 case ANTIBANDING_OFF
:
2618 internalValue
= ::ANTI_BANDING_OFF
;
2621 ALOGE("ERR(%s):Unsupported value(%d)", __func__
, value
);
2626 if (m_internalISP
== true) {
2627 if (internalValue
< ::IS_AFC_DISABLE
|| ::IS_AFC_MAX
<= internalValue
) {
2628 ALOGE("ERR(%s):Invalid value (%d)", __func__
, value
);
2632 if (internalValue
< ::ANTI_BANDING_AUTO
|| ::ANTI_BANDING_OFF
< internalValue
) {
2633 ALOGE("ERR(%s):Invalid internalValue (%d)", __func__
, internalValue
);
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__
);
2651 bool ExynosCamera::setAutoExposureLock(bool toggle
)
2653 int internalValue
= -1;
2655 if (m_curCameraInfo
->autoExposureLock
== toggle
)
2658 m_curCameraInfo
->autoExposureLock
= toggle
;
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
;
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__
);
2678 bool ExynosCamera::setAutoWhiteBalanceLock(bool toggle
)
2680 int internalValue
= -1;
2682 if (m_curCameraInfo
->autoWhiteBalanceLock
== toggle
)
2685 m_curCameraInfo
->autoWhiteBalanceLock
= toggle
;
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
;
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__
);
2705 bool ExynosCamera::setColorEffect(int value
)
2707 int internalValue
= -1;
2711 if (m_internalISP
== true)
2712 internalValue
= ::IS_IMAGE_EFFECT_DISABLE
;
2714 internalValue
= ::IMAGE_EFFECT_NONE
;
2717 if (m_internalISP
== true)
2718 internalValue
= ::IS_IMAGE_EFFECT_MONOCHROME
;
2720 internalValue
= ::IMAGE_EFFECT_BNW
;
2722 case EFFECT_NEGATIVE
:
2723 internalValue
= IS_IMAGE_EFFECT_NEGATIVE_MONO
;
2726 if (m_internalISP
== true)
2727 internalValue
= ::IS_IMAGE_EFFECT_SEPIA
;
2729 internalValue
= ::IMAGE_EFFECT_SEPIA
;
2732 case EFFECT_SOLARIZE
:
2733 case EFFECT_POSTERIZE
:
2734 case EFFECT_WHITEBOARD
:
2735 case EFFECT_BLACKBOARD
:
2737 ALOGE("ERR(%s):Unsupported value(%d)", __func__
, value
);
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
);
2748 if (internalValue
<= ::IMAGE_EFFECT_BASE
|| ::IMAGE_EFFECT_MAX
<= internalValue
) {
2749 ALOGE("ERR(%s):Invalid internalValue(%d)", __func__
, internalValue
);
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__
);
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__
);
2774 bool ExynosCamera::setExposureCompensation(int value
)
2776 int internalValue
= value
;
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
);
2785 internalValue
+= EV_DEFAULT
;
2786 if (internalValue
< EV_MINUS_4
|| EV_PLUS_4
< internalValue
) {
2787 ALOGE("ERR(%s):Invalid internalValue(%d)", __func__
, internalValue
);
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__
);
2801 if (this->setBrightness(value
) == false) {
2802 ALOGE("ERR(%s):setBrightness() fail", __func__
);
2812 bool ExynosCamera::setFlashMode(int value
)
2814 int internalValue
= -1;
2817 case FLASH_MODE_OFF
:
2818 internalValue
= ::FLASH_MODE_OFF
;
2820 case FLASH_MODE_AUTO
:
2821 internalValue
= ::FLASH_MODE_AUTO
;
2824 internalValue
= ::FLASH_MODE_ON
;
2826 case FLASH_MODE_TORCH
:
2827 internalValue
= ::FLASH_MODE_TORCH
;
2829 case FLASH_MODE_RED_EYE
:
2831 ALOGE("ERR(%s):Unsupported value(%d)", __func__
, value
);
2836 if (internalValue
<= ::FLASH_MODE_BASE
|| ::FLASH_MODE_MAX
<= internalValue
) {
2837 ALOGE("ERR(%s):Invalid value (%d)", __func__
, value
);
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__
);
2854 bool ExynosCamera::setFocusAreas(int num
, ExynosRect
* rects
, int *weights
)
2856 if (m_defaultCameraInfo
->maxNumFocusAreas
== 0) {
2857 ALOGV("DEBUG(%s):maxNumFocusAreas is 0. so, ignored", __func__
);
2863 ExynosRect2
*rect2s
= new ExynosRect2
[num
];
2864 for (int i
= 0; i
< num
; i
++)
2865 m_secRect2SecRect2(&rects
[i
], &rect2s
[i
]);
2867 ret
= setFocusAreas(num
, rect2s
, weights
);
2874 bool ExynosCamera::setFocusAreas(int num
, ExynosRect2
* rect2s
, int *weights
)
2876 if (m_defaultCameraInfo
->maxNumFocusAreas
== 0) {
2877 ALOGV("DEBUG(%s):maxNumFocusAreas is 0. so, ignored", __func__
);
2884 if (m_defaultCameraInfo
->maxNumFocusAreas
< num
)
2885 num
= m_defaultCameraInfo
->maxNumFocusAreas
;
2887 if (m_flagCreate
== true) {
2888 for (int i
= 0; i
< num
; i
++) {
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;
2898 new_x
= (rect2s
[i
].x1
+ rect2s
[i
].x2
) / 2;
2899 new_y
= (rect2s
[i
].y1
+ rect2s
[i
].y2
) / 2;
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__
);
2914 bool ExynosCamera::setFocusMode(int value
)
2916 int internalValue
= -1;
2919 case FOCUS_MODE_AUTO
:
2920 internalValue
= ::FOCUS_MODE_AUTO
;
2921 m_touchAFMode
= false;
2923 case FOCUS_MODE_INFINITY
:
2924 internalValue
= ::FOCUS_MODE_INFINITY
;
2925 m_touchAFMode
= false;
2927 case FOCUS_MODE_MACRO
:
2928 internalValue
= ::FOCUS_MODE_MACRO
;
2929 m_touchAFMode
= false;
2931 case FOCUS_MODE_CONTINUOUS_VIDEO
:
2932 case FOCUS_MODE_CONTINUOUS_PICTURE
:
2933 internalValue
= ::FOCUS_MODE_CONTINOUS
;
2934 m_touchAFMode
= false;
2936 case FOCUS_MODE_TOUCH
:
2937 internalValue
= ::FOCUS_MODE_TOUCH
;
2938 m_touchAFMode
= true;
2940 case FOCUS_MODE_FIXED
:
2941 internalValue
= ::FOCUS_MODE_FIXED
;
2942 m_touchAFMode
= false;
2944 case FOCUS_MODE_EDOF
:
2946 m_touchAFMode
= false;
2947 ALOGE("ERR(%s):Unsupported value(%d)", __func__
, value
);
2952 if (::FOCUS_MODE_MAX
<= internalValue
) {
2953 ALOGE("ERR(%s):Invalid internalValue (%d)", __func__
, internalValue
);
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__
);
2970 bool ExynosCamera::setGpsAltitude(const char *gpsAltitude
)
2972 double conveted_altitude
= 0;
2974 if (gpsAltitude
== NULL
)
2975 m_curCameraInfo
->gpsAltitude
= 0;
2977 conveted_altitude
= atof(gpsAltitude
);
2978 m_curCameraInfo
->gpsAltitude
= (long)(conveted_altitude
* 100 / 1);
2984 bool ExynosCamera::setGpsLatitude(const char *gpsLatitude
)
2986 double conveted_latitude
= 0;
2988 if (gpsLatitude
== NULL
)
2989 m_curCameraInfo
->gpsLatitude
= 0;
2991 conveted_latitude
= atof(gpsLatitude
);
2992 m_curCameraInfo
->gpsLatitude
= (long)(conveted_latitude
* 10000 / 1);
2998 bool ExynosCamera::setGpsLongitude(const char *gpsLongitude
)
3000 double conveted_longitude
= 0;
3002 if (gpsLongitude
== NULL
)
3003 m_curCameraInfo
->gpsLongitude
= 0;
3005 conveted_longitude
= atof(gpsLongitude
);
3006 m_curCameraInfo
->gpsLongitude
= (long)(conveted_longitude
* 10000 / 1);
3012 bool ExynosCamera::setGpsProcessingMethod(const char *gpsProcessingMethod
)
3014 memset(mExifInfo
.gps_processing_method
, 0, sizeof(mExifInfo
.gps_processing_method
));
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
);
3021 memcpy(mExifInfo
.gps_processing_method
, gpsProcessingMethod
, len
);
3027 bool ExynosCamera::setGpsTimeStamp(const char *gpsTimestamp
)
3029 if (gpsTimestamp
== NULL
)
3030 m_curCameraInfo
->gpsTimestamp
= 0;
3032 m_curCameraInfo
->gpsTimestamp
= atol(gpsTimestamp
);
3037 bool ExynosCamera::setJpegQuality(int quality
)
3039 if (quality
< JPEG_QUALITY_MIN
|| JPEG_QUALITY_MAX
< quality
) {
3040 ALOGE("ERR(%s):Invalid quality (%d)", __func__
, quality
);
3044 m_jpegQuality
= quality
;
3049 bool ExynosCamera::setJpegThumbnailQuality(int quality
)
3051 if (quality
< JPEG_QUALITY_MIN
|| JPEG_QUALITY_MAX
< quality
) {
3052 ALOGE("ERR(%s):Invalid quality (%d)", __func__
, quality
);
3056 m_jpegThumbnailQuality
= quality
;
3061 bool ExynosCamera::setJpegThumbnailSize(int w
, int h
)
3063 m_curCameraInfo
->thumbnailW
= w
;
3064 m_curCameraInfo
->thumbnailH
= h
;
3068 bool ExynosCamera::setMeteringAreas(int num
, ExynosRect
*rects
, int *weights
)
3070 if (m_defaultCameraInfo
->maxNumMeteringAreas
== 0) {
3071 ALOGV("DEBUG(%s):maxNumMeteringAreas is 0. so, ignored", __func__
);
3075 if (m_defaultCameraInfo
->maxNumMeteringAreas
< num
)
3076 num
= m_defaultCameraInfo
->maxNumMeteringAreas
;
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__
);
3093 bool ExynosCamera::setMeteringAreas(int num
, ExynosRect2
*rect2s
, int *weights
)
3095 if (m_defaultCameraInfo
->maxNumMeteringAreas
== 0) {
3096 ALOGV("DEBUG(%s):maxNumMeteringAreas is 0. so, ignored", __func__
);
3102 ExynosRect
*rects
= new ExynosRect
[num
];
3103 for (int i
= 0; i
< num
; i
++)
3104 m_secRect22SecRect(&rect2s
[i
], &rects
[i
]);
3106 /* FIXME: Currnetly HW dose not support metering area */
3107 //ret = setMeteringAreas(num, rects, weights);
3114 bool ExynosCamera::setPictureFormat(int colorFormat
)
3116 m_curCameraInfo
->pictureColorFormat
= colorFormat
;
3118 #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
3119 m_printFormat(m_curCameraInfo
->pictureColorFormat
, "PictureFormat");
3124 bool ExynosCamera::setPictureSize(int w
, int h
)
3126 m_curCameraInfo
->pictureW
= w
;
3127 m_curCameraInfo
->pictureH
= h
;
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
;
3136 bool ExynosCamera::setPreviewFormat(int colorFormat
)
3138 m_curCameraInfo
->previewColorFormat
= colorFormat
;
3140 #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
3141 m_printFormat(m_curCameraInfo
->previewColorFormat
, "PreviewtFormat");
3147 bool ExynosCamera::setPreviewFrameRate(int fps
)
3149 if (fps
< FRAME_RATE_AUTO
|| FRAME_RATE_MAX
< fps
)
3150 ALOGE("ERR(%s):Invalid fps(%d)", __func__
, fps
);
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__
);
3163 bool ExynosCamera::setPreviewSize(int w
, int h
)
3165 m_curCameraInfo
->previewW
= w
;
3166 m_curCameraInfo
->previewH
= h
;
3170 bool ExynosCamera::setRecordingHint(bool hint
)
3172 // TODO : fixed fps?
3173 /* DIS is only possible recording hint is true. */
3174 m_recordingHint
= hint
;
3178 bool ExynosCamera::setRotation(int rotation
)
3181 ALOGE("ERR(%s):Invalid rotation (%d)", __func__
, rotation
);
3184 m_curCameraInfo
->rotation
= rotation
;
3189 int ExynosCamera::getRotation(void)
3191 return m_curCameraInfo
->rotation
;
3194 bool ExynosCamera::setSceneMode(int value
)
3196 int internalValue
= -1;
3199 case SCENE_MODE_AUTO
:
3200 internalValue
= ::SCENE_MODE_NONE
;
3202 case SCENE_MODE_PORTRAIT
:
3203 internalValue
= ::SCENE_MODE_PORTRAIT
;
3205 case SCENE_MODE_LANDSCAPE
:
3206 internalValue
= ::SCENE_MODE_LANDSCAPE
;
3208 case SCENE_MODE_NIGHT
:
3209 internalValue
= ::SCENE_MODE_NIGHTSHOT
;
3211 case SCENE_MODE_BEACH
:
3212 internalValue
= ::SCENE_MODE_BEACH_SNOW
;
3214 case SCENE_MODE_SNOW
:
3215 internalValue
= ::SCENE_MODE_BEACH_SNOW
;
3217 case SCENE_MODE_SUNSET
:
3218 internalValue
= ::SCENE_MODE_SUNSET
;
3220 case SCENE_MODE_FIREWORKS
:
3221 internalValue
= ::SCENE_MODE_FIREWORKS
;
3223 case SCENE_MODE_SPORTS
:
3224 internalValue
= ::SCENE_MODE_SPORTS
;
3226 case SCENE_MODE_PARTY
:
3227 internalValue
= ::SCENE_MODE_PARTY_INDOOR
;
3229 case SCENE_MODE_CANDLELIGHT
:
3230 internalValue
= ::SCENE_MODE_CANDLE_LIGHT
;
3232 case SCENE_MODE_STEADYPHOTO
:
3233 internalValue
= ::SCENE_MODE_TEXT
;
3235 case SCENE_MODE_ACTION
:
3236 case SCENE_MODE_NIGHT_PORTRAIT
:
3237 case SCENE_MODE_THEATRE
:
3239 ALOGE("ERR(%s):Unsupported value(%d)", __func__
, value
);
3244 if (internalValue
<= ::SCENE_MODE_BASE
|| ::SCENE_MODE_MAX
<= internalValue
) {
3245 ALOGE("ERR(%s):Invalid value (%d)", __func__
, internalValue
);
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__
);
3262 bool ExynosCamera::setVideoStabilization(bool toggle
)
3264 m_curCameraInfo
->videoStabilization
= toggle
;
3266 if (m_previewDev
->flagStart
== true) {
3267 if (m_curCameraInfo
->applyVideoStabilization
!= toggle
) {
3269 int dis
= (toggle
== true) ? CAMERA_DIS_ON
: CAMERA_DIS_OFF
;
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__
);
3275 m_curCameraInfo
->applyVideoStabilization
= toggle
;
3282 bool ExynosCamera::setWhiteBalance(int value
)
3284 int internalValue
= -1;
3287 case WHITE_BALANCE_AUTO
:
3288 if (m_internalISP
== true)
3289 internalValue
= ::IS_AWB_AUTO
;
3291 internalValue
= ::WHITE_BALANCE_AUTO
;
3293 case WHITE_BALANCE_INCANDESCENT
:
3294 if (m_internalISP
== true)
3295 internalValue
= ::IS_AWB_TUNGSTEN
;
3297 internalValue
= ::WHITE_BALANCE_TUNGSTEN
;
3299 case WHITE_BALANCE_FLUORESCENT
:
3300 if (m_internalISP
== true)
3301 internalValue
= ::IS_AWB_FLUORESCENT
;
3303 internalValue
= ::WHITE_BALANCE_FLUORESCENT
;
3305 case WHITE_BALANCE_DAYLIGHT
:
3306 if (m_internalISP
== true)
3307 internalValue
= ::IS_AWB_DAYLIGHT
;
3309 internalValue
= ::WHITE_BALANCE_SUNNY
;
3311 case WHITE_BALANCE_CLOUDY_DAYLIGHT
:
3312 if (m_internalISP
== true)
3313 internalValue
= ::IS_AWB_CLOUDY
;
3315 internalValue
= ::WHITE_BALANCE_CLOUDY
;
3317 case WHITE_BALANCE_WARM_FLUORESCENT
:
3318 case WHITE_BALANCE_TWILIGHT
:
3319 case WHITE_BALANCE_SHADE
:
3321 ALOGE("ERR(%s):Unsupported value(%d)", __func__
, value
);
3326 if (m_internalISP
== true) {
3327 if (internalValue
< ::IS_AWB_AUTO
|| ::IS_AWB_MAX
<= internalValue
) {
3328 ALOGE("ERR(%s):Invalid internalValue(%d)", __func__
, internalValue
);
3332 if (internalValue
<= ::WHITE_BALANCE_BASE
|| ::WHITE_BALANCE_MAX
<= internalValue
) {
3333 ALOGE("ERR(%s):Invalid internalValue(%d)", __func__
, internalValue
);
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__
);
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__
);
3358 bool ExynosCamera::setZoom(int value
)
3360 if (value
< ZOOM_LEVEL_0
|| ZOOM_LEVEL_MAX
<= value
) {
3361 ALOGE("ERR(%s):Invalid value (%d)", __func__
, value
);
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__
);
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
);
3385 bool ExynosCamera::m_setWidthHeight(int mode
,
3387 struct pollfd
*event
,
3391 struct ExynosBuffer
*buf
,
3394 // Get and throw away the first frame since it is often garbled.
3395 memset(event
, 0, sizeof(struct pollfd
));
3397 event
->events
= POLLIN
| POLLERR
;
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) {
3407 validBuf
[i
] = false;
3411 struct v4l2_format v4l2_fmt
;
3412 struct v4l2_pix_format pixfmt
;
3414 unsigned int planes
;
3416 memset(&v4l2_fmt
, 0, sizeof(struct v4l2_format
));
3417 memset(&pixfmt
, 0, sizeof(pixfmt
));
3422 v4l2_fmt
.type
= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
;
3424 V4L2_PIX_2_YUV_INFO(colorFormat
, &bpp
, &planes
);
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
;
3431 if (exynos_v4l2_s_fmt(fd
, &v4l2_fmt
) < 0) {
3432 ALOGE("ERR(%s):exynos_v4l2_s_fmt() fail", __func__
);
3437 v4l2_fmt
.type
= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
;
3441 pixfmt
.pixelformat
= colorFormat
;
3442 if (pixfmt
.pixelformat
== V4L2_PIX_FMT_JPEG
)
3443 pixfmt
.colorspace
= V4L2_COLORSPACE_JPEG
;
3445 v4l2_fmt
.fmt
.pix
= pixfmt
;
3447 if (exynos_v4l2_s_fmt(fd
, &v4l2_fmt
) < 0) {
3448 ALOGE("ERR(%s):exynos_v4l2_s_fmt() fail", __func__
);
3456 struct v4l2_requestbuffers req
;
3457 req
.count
= numOfBuf
;
3458 req
.type
= V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
;
3459 req
.memory
= V4L2_MEMORY_DMABUF
;
3461 if (exynos_v4l2_reqbufs(fd
, &req
) < 0) {
3462 ALOGE("ERR(%s):exynos_v4l2_reqbufs(%d) fail", __func__
, numOfBuf
);
3466 for (int i
= 0; i
< VIDEO_MAX_FRAME
; i
++) {
3467 if (validBuf
[i
] == true) {
3469 struct v4l2_buffer v4l2_buf
;
3470 struct v4l2_plane planes
[VIDEO_MAX_PLANES
];
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;
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
];
3482 if (buf
[i
].size
.extS
[j
] != 0)
3486 if (exynos_v4l2_qbuf(fd
, &v4l2_buf
) < 0) {
3487 ALOGE("ERR(%s):exynos_v4l2_qbuf(%d) fail", __func__
, i
);
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);
3502 bool ExynosCamera::m_setZoom(int fd
, int zoom
, int w
, int h
)
3506 if (m_currentZoom
!= zoom
) {
3507 m_currentZoom
= zoom
;
3511 if (m_defaultCameraInfo
->hwZoomSupported
== true)
3512 real_zoom
= 0; // just adjust ratio, not digital zoom.
3514 real_zoom
= zoom
; // adjust ratio, digital zoom
3516 ret
= m_setCrop(fd
, w
, h
, real_zoom
);
3518 ALOGE("ERR(%s):m_setCrop(%d, %d) fail", __func__
, w
, h
);
3524 bool ExynosCamera::m_setCrop(int fd
, int w
, int h
, int zoom
)
3526 v4l2_cropcap cropcap
;
3528 unsigned int crop_x
= 0;
3529 unsigned int crop_y
= 0;
3530 unsigned int crop_w
= 0;
3531 unsigned int crop_h
= 0;
3533 cropcap
.type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
3535 if (exynos_v4l2_cropcap(fd
, &cropcap
) < 0) {
3536 ALOGE("ERR(%s):exynos_v4l2_cropcap() fail)", __func__
);
3540 m_getCropRect(cropcap
.bounds
.width
, cropcap
.bounds
.height
,
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
;
3553 if (exynos_v4l2_s_crop(fd
, &crop
) < 0) {
3554 ALOGE("ERR(%s):exynos_v4l2_s_crop() fail(%d))", __func__
, zoom
);
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);
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
,
3583 #define DEFAULT_ZOOM_RATIO (4) // 4x zoom
3584 #define DEFAULT_ZOOM_RATIO_SHIFT (2)
3585 int max_zoom
= m_defaultCameraInfo
->maxZoom
;
3591 || src_h
!= dst_h
) {
3592 float src_ratio
= 1.0f
;
3593 float dst_ratio
= 1.0f
;
3596 src_ratio
= (float)src_w
/ (float)src_h
;
3599 dst_ratio
= (float)dst_w
/ (float)dst_h
;
3601 if (src_ratio
!= dst_ratio
) {
3602 if (src_ratio
<= dst_ratio
) {
3605 *crop_h
= src_w
/ dst_ratio
;
3606 } else { //(src_ratio > dst_ratio)
3608 *crop_w
= src_h
* dst_ratio
;
3614 unsigned int zoom_w_step
=
3615 (*crop_w
- (*crop_w
>> DEFAULT_ZOOM_RATIO_SHIFT
)) / max_zoom
;
3617 *crop_w
= *crop_w
- (zoom_w_step
* zoom
);
3619 unsigned int zoom_h_step
=
3620 (*crop_h
- (*crop_h
>> DEFAULT_ZOOM_RATIO_SHIFT
)) / max_zoom
;
3622 *crop_h
= *crop_h
- (zoom_h_step
* zoom
);
3626 #define CAMERA_CROP_WIDTH_RESTRAIN_NUM (0x10) // 16
3627 unsigned int w_align
= (*crop_w
& (CAMERA_CROP_WIDTH_RESTRAIN_NUM
- 1));
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
);
3637 #define CAMERA_CROP_HEIGHT_RESTRAIN_NUM (0x2) // 2
3638 unsigned int h_align
= (*crop_h
& (CAMERA_CROP_HEIGHT_RESTRAIN_NUM
- 1));
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
);
3648 *crop_x
= (src_w
- *crop_w
) >> 1;
3649 *crop_y
= (src_h
- *crop_h
) >> 1;
3654 void ExynosCamera::m_setExifFixedAttribute(void)
3656 char property
[PROPERTY_VALUE_MAX
];
3658 //2 0th IFD TIFF Tags
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';
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';
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';
3675 //3 YCbCr Positioning
3676 mExifInfo
.ycbcr_positioning
= EXIF_DEF_YCBCR_POSITIONING
;
3678 //2 0th IFD Exif Private Tags
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
;
3685 memcpy(mExifInfo
.exif_version
, EXIF_DEF_EXIF_VERSION
, sizeof(mExifInfo
.exif_version
));
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
;
3697 strcpy((char *)mExifInfo
.user_comment
, EXIF_DEF_USERCOMMENTS
);
3698 //3 Color Space information
3699 mExifInfo
.color_space
= EXIF_DEF_COLOR_SPACE
;
3701 mExifInfo
.exposure_mode
= EXIF_DEF_EXPOSURE_MODE
;
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
));
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
;
3716 void ExynosCamera::m_setExifChangedAttribute(exif_attribute_t
*exifInfo
, ExynosRect
*rect
)
3718 //2 0th IFD TIFF Tags
3720 exifInfo
->width
= rect
->w
;
3722 exifInfo
->height
= rect
->h
;
3724 switch (m_curCameraInfo
->rotation
) {
3726 exifInfo
->orientation
= EXIF_ORIENTATION_90
;
3729 exifInfo
->orientation
= EXIF_ORIENTATION_180
;
3732 exifInfo
->orientation
= EXIF_ORIENTATION_270
;
3736 exifInfo
->orientation
= EXIF_ORIENTATION_UP
;
3741 struct tm
*timeinfo
;
3743 timeinfo
= localtime(&rawtime
);
3744 strftime((char *)exifInfo
->date_time
, 20, "%Y:%m:%d %H:%M:%S", timeinfo
);
3746 //2 0th IFD Exif Private Tags
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__
);
3758 exifInfo
->exposure_time
.num
= 1;
3760 exifInfo
->exposure_time
.den
= (uint32_t)(1000000 / shutterSpeed
);
3762 //3 ISO Speed Rating
3763 int iso
= m_curCameraInfo
->iso
;
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
3770 ALOGE("ERR(%s):exynos_v4l2_g_ctrl() fail, using ISO_100", __func__
);
3776 exifInfo
->iso_speed_rating
= 50;
3779 exifInfo
->iso_speed_rating
= 100;
3782 exifInfo
->iso_speed_rating
= 200;
3785 exifInfo
->iso_speed_rating
= 400;
3788 exifInfo
->iso_speed_rating
= 800;
3791 exifInfo
->iso_speed_rating
= 1600;
3794 exifInfo
->iso_speed_rating
= 100;
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
);
3804 ALOGD("Shutter speed=%d us, iso=%d", shutterSpeed
, exifInfo
->iso_speed_rating
);
3805 ALOGD("AV=%d, TV=%d, SV=%d", av
, tv
, sv
);
3808 exifInfo
->shutter_speed
.num
= tv
* EXIF_DEF_APEX_DEN
;
3809 exifInfo
->shutter_speed
.den
= EXIF_DEF_APEX_DEN
;
3811 exifInfo
->brightness
.num
= bv
*EXIF_DEF_APEX_DEN
;
3812 exifInfo
->brightness
.den
= EXIF_DEF_APEX_DEN
;
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
;
3819 exifInfo
->exposure_bias
.num
= 0;
3820 exifInfo
->exposure_bias
.den
= 0;
3823 switch (m_curCameraInfo
->metering
) {
3824 case METERING_MODE_CENTER
:
3825 exifInfo
->metering_mode
= EXIF_METERING_CENTER
;
3827 case METERING_MODE_MATRIX
:
3828 exifInfo
->metering_mode
= EXIF_METERING_MULTISPOT
;
3830 case METERING_MODE_SPOT
:
3831 exifInfo
->metering_mode
= EXIF_METERING_SPOT
;
3833 case METERING_MODE_AVERAGE
:
3835 exifInfo
->metering_mode
= EXIF_METERING_AVERAGE
;
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
3844 exifInfo
->flash
= EXIF_DEF_FLASH
;
3846 exifInfo
->flash
= flash
;
3849 if (m_curCameraInfo
->whiteBalance
== WHITE_BALANCE_AUTO
)
3850 exifInfo
->white_balance
= EXIF_WB_AUTO
;
3852 exifInfo
->white_balance
= EXIF_WB_MANUAL
;
3854 //3 Scene Capture Type
3855 switch (m_curCameraInfo
->sceneMode
) {
3856 case SCENE_MODE_PORTRAIT
:
3857 exifInfo
->scene_capture_type
= EXIF_SCENE_PORTRAIT
;
3859 case SCENE_MODE_LANDSCAPE
:
3860 exifInfo
->scene_capture_type
= EXIF_SCENE_LANDSCAPE
;
3862 case SCENE_MODE_NIGHT
:
3863 exifInfo
->scene_capture_type
= EXIF_SCENE_NIGHT
;
3866 exifInfo
->scene_capture_type
= EXIF_SCENE_STANDARD
;
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");
3875 strcpy((char *)exifInfo
->gps_latitude_ref
, "S");
3877 if (m_curCameraInfo
->gpsLongitude
> 0)
3878 strcpy((char *)exifInfo
->gps_longitude_ref
, "E");
3880 strcpy((char *)exifInfo
->gps_longitude_ref
, "W");
3882 if (m_curCameraInfo
->gpsAltitude
> 0)
3883 exifInfo
->gps_altitude_ref
= 0;
3885 exifInfo
->gps_altitude_ref
= 1;
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);
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;
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;
3907 exifInfo
->gps_altitude
.num
= (uint32_t)altitude
;
3908 exifInfo
->gps_altitude
.den
= 1;
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
);
3921 exifInfo
->enableGps
= true;
3923 exifInfo
->enableGps
= false;
3926 //2 1th IFD TIFF Tags
3927 exifInfo
->widthThumb
= m_curCameraInfo
->thumbnailW
;
3928 exifInfo
->heightThumb
= m_curCameraInfo
->thumbnailH
;
3931 void ExynosCamera::m_secRect2SecRect2(ExynosRect
*rect
, ExynosRect2
*rect2
)
3933 rect2
->x1
= rect
->x
;
3934 rect2
->y1
= rect
->y
;
3935 rect2
->x2
= rect
->x
+ rect
->w
;
3936 rect2
->y2
= rect
->y
+ rect
->h
;
3939 void ExynosCamera::m_secRect22SecRect(ExynosRect2
*rect2
, ExynosRect
*rect
)
3941 rect
->x
= rect2
->x1
;
3942 rect
->y
= rect2
->y1
;
3943 rect
->w
= rect2
->x2
- rect2
->x1
;
3944 rect
->h
= rect2
->y2
- rect2
->y1
;
3947 void ExynosCamera::m_printFormat(int colorFormat
, const char *arg
)
3949 switch (colorFormat
) {
3950 case V4L2_PIX_FMT_YUV420
:
3951 ALOGV("DEBUG(%s):V4L2_PIX_FMT_YUV420", arg
);
3953 case V4L2_PIX_FMT_YVU420
:
3954 ALOGV("DEBUG(%s):V4L2_PIX_FMT_YVU420", arg
);
3956 case V4L2_PIX_FMT_YVU420M
:
3957 ALOGV("DEBUG(%s):V4L2_PIX_FMT_YVU420M", arg
);
3959 case V4L2_PIX_FMT_NV12M
:
3960 ALOGV("DEBUG(%s):V4L2_PIX_FMT_NV12M", arg
);
3962 case V4L2_PIX_FMT_NV12
:
3963 ALOGV("DEBUG(%s):V4L2_PIX_FMT_NV12", arg
);
3965 case V4L2_PIX_FMT_NV12T
:
3966 ALOGV("DEBUG(%s):V4L2_PIX_FMT_NV12T", arg
);
3968 case V4L2_PIX_FMT_NV21
:
3969 ALOGV("DEBUG(%s):V4L2_PIX_FMT_NV21", arg
);
3971 case V4L2_PIX_FMT_YUV422P
:
3972 ALOGV("DEBUG(%s):V4L2_PIX_FMT_YUV422PP", arg
);
3974 case V4L2_PIX_FMT_YUYV
:
3975 ALOGV("DEBUG(%s):V4L2_PIX_FMT_YUYV", arg
);
3977 case V4L2_PIX_FMT_UYVY
:
3978 ALOGV("DEBUG(%s):V4L2_PIX_FMT_UYVYI", arg
);
3980 case V4L2_PIX_FMT_RGB565
:
3981 ALOGV("DEBUG(%s):V4L2_PIX_FMT_RGB565", arg
);
3984 ALOGV("DEBUG(%s):Unknown Format", arg
);
3989 ///////////////////////////////////////////////////
3991 ///////////////////////////////////////////////////
3993 bool ExynosCamera::setAngle(int angle
)
3995 if (m_curCameraInfo
->angle
!= angle
) {
4000 m_curCameraInfo
->angle
= 0;
4005 m_curCameraInfo
->angle
= 90;
4010 m_curCameraInfo
->angle
= 180;
4015 m_curCameraInfo
->angle
= 270;
4019 ALOGE("ERR(%s):Invalid angle(%d)", __func__
, angle
);
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__
);
4034 int ExynosCamera::getAngle(void)
4036 return m_curCameraInfo
->angle
;
4039 bool ExynosCamera::setISO(int iso
)
4041 int internalValue
= -1;
4045 internalValue
= ISO_50
;
4048 internalValue
= ISO_100
;
4051 internalValue
= ISO_200
;
4054 internalValue
= ISO_400
;
4057 internalValue
= ISO_800
;
4060 internalValue
= ISO_1600
;
4064 internalValue
= ISO_AUTO
;
4068 if (internalValue
< ISO_AUTO
|| ISO_MAX
<= internalValue
) {
4069 ALOGE("ERR(%s):Invalid internalValue (%d)", __func__
, internalValue
);
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__
);
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__
);
4093 int ExynosCamera::getISO(void)
4095 return m_curCameraInfo
->iso
;
4098 bool ExynosCamera::setContrast(int value
)
4100 int internalValue
= -1;
4104 if (m_internalISP
== true)
4105 internalValue
= ::IS_CONTRAST_AUTO
;
4107 ALOGW("WARN(%s):Invalid contrast value (%d)", __func__
, value
);
4110 case CONTRAST_MINUS_2
:
4111 if (m_internalISP
== true)
4112 internalValue
= ::IS_CONTRAST_MINUS_2
;
4114 internalValue
= ::CONTRAST_MINUS_2
;
4116 case CONTRAST_MINUS_1
:
4117 if (m_internalISP
== true)
4118 internalValue
= ::IS_CONTRAST_MINUS_1
;
4120 internalValue
= ::CONTRAST_MINUS_1
;
4122 case CONTRAST_DEFAULT
:
4123 if (m_internalISP
== true)
4124 internalValue
= ::IS_CONTRAST_DEFAULT
;
4126 internalValue
= ::CONTRAST_DEFAULT
;
4128 case CONTRAST_PLUS_1
:
4129 if (m_internalISP
== true)
4130 internalValue
= ::IS_CONTRAST_PLUS_1
;
4132 internalValue
= ::CONTRAST_PLUS_1
;
4134 case CONTRAST_PLUS_2
:
4135 if (m_internalISP
== true)
4136 internalValue
= ::IS_CONTRAST_PLUS_2
;
4138 internalValue
= ::CONTRAST_PLUS_2
;
4141 ALOGE("ERR(%s):Unsupported value(%d)", __func__
, value
);
4146 if (m_internalISP
== true) {
4147 if (internalValue
< ::IS_CONTRAST_AUTO
|| ::IS_CONTRAST_MAX
<= internalValue
) {
4148 ALOGE("ERR(%s):Invalid internalValue (%d)", __func__
, internalValue
);
4152 if (internalValue
< ::CONTRAST_MINUS_2
|| ::CONTRAST_MAX
<= internalValue
) {
4153 ALOGE("ERR(%s):Invalid internalValue (%d)", __func__
, internalValue
);
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__
);
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__
);
4178 int ExynosCamera::getContrast(void)
4180 return m_curCameraInfo
->contrast
;
4183 bool ExynosCamera::setSaturation(int saturation
)
4185 int internalValue
= saturation
+ SATURATION_DEFAULT
;
4186 if (internalValue
< SATURATION_MINUS_2
|| SATURATION_MAX
<= internalValue
) {
4187 ALOGE("ERR(%s):Invalid internalValue (%d)", __func__
, internalValue
);
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__
);
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__
);
4211 int ExynosCamera::getSaturation(void)
4213 return m_curCameraInfo
->saturation
;
4216 bool ExynosCamera::setSharpness(int sharpness
)
4218 int internalValue
= sharpness
+ SHARPNESS_DEFAULT
;
4219 if (internalValue
< SHARPNESS_MINUS_2
|| SHARPNESS_MAX
<= internalValue
) {
4220 ALOGE("ERR(%s):Invalid internalValue (%d)", __func__
, internalValue
);
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__
);
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__
);
4244 int ExynosCamera::getSharpness(void)
4246 return m_curCameraInfo
->sharpness
;
4249 bool ExynosCamera::setHue(int hue
)
4251 int internalValue
= hue
;
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
);
4260 ALOGV("WARN(%s):Not supported hue setting", __func__
);
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__
);
4277 int ExynosCamera::getHue(void)
4279 return m_curCameraInfo
->hue
;
4282 bool ExynosCamera::setWDR(bool toggle
)
4286 if (toggle
== true) {
4287 if (m_internalISP
== true)
4288 internalWdr
= IS_DRC_BYPASS_ENABLE
;
4290 internalWdr
= IS_DRC_BYPASS_DISABLE
;
4292 if (m_internalISP
== true)
4293 internalWdr
= WDR_ON
;
4295 internalWdr
= WDR_OFF
;
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__
);
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__
);
4318 bool ExynosCamera::getWDR(void)
4320 return m_curCameraInfo
->wdr
;
4323 bool ExynosCamera::setAntiShake(bool toggle
)
4325 int internalValue
= ANTI_SHAKE_OFF
;
4328 internalValue
= ANTI_SHAKE_STILL_ON
;
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__
);
4343 bool ExynosCamera::getAntiShake(void)
4345 return m_curCameraInfo
->antiShake
;
4348 bool ExynosCamera::setMeteringMode(int value
)
4350 int internalValue
= -1;
4353 case METERING_MODE_AVERAGE
:
4354 if (m_internalISP
== true)
4355 internalValue
= IS_METERING_AVERAGE
;
4357 internalValue
= METERING_MATRIX
;
4359 case METERING_MODE_MATRIX
:
4360 if (m_internalISP
== true)
4361 internalValue
= IS_METERING_MATRIX
;
4363 internalValue
= METERING_MATRIX
;
4365 case METERING_MODE_CENTER
:
4366 if (m_internalISP
== true)
4367 internalValue
= IS_METERING_CENTER
;
4369 internalValue
= METERING_CENTER
;
4371 case METERING_MODE_SPOT
:
4372 if (m_internalISP
== true)
4373 internalValue
= IS_METERING_SPOT
;
4375 internalValue
= METERING_SPOT
;
4378 ALOGE("ERR(%s):Unsupported value(%d)", __func__
, value
);
4383 if (m_internalISP
== true) {
4384 if (internalValue
< IS_METERING_AVERAGE
|| IS_METERING_MAX
<= internalValue
) {
4385 ALOGE("ERR(%s):Invalid internalValue (%d)", __func__
, internalValue
);
4389 if (internalValue
<= METERING_BASE
|| METERING_MAX
<= internalValue
) {
4390 ALOGE("ERR(%s):Invalid internalValue (%d)", __func__
, internalValue
);
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__
);
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__
);
4415 int ExynosCamera::getMeteringMode(void)
4417 return m_curCameraInfo
->metering
;
4420 bool ExynosCamera::setObjectTracking(bool toggle
)
4422 m_curCameraInfo
->objectTracking
= toggle
;
4426 bool ExynosCamera::getObjectTracking(void)
4428 return m_curCameraInfo
->objectTracking
;
4431 bool ExynosCamera::setObjectTrackingStart(bool toggle
)
4433 if (m_curCameraInfo
->objectTrackingStart
!= toggle
) {
4434 m_curCameraInfo
->objectTrackingStart
= toggle
;
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__
);
4446 int ExynosCamera::getObjectTrackingStatus(void)
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__
);
4457 bool ExynosCamera::setObjectPosition(int x
, int y
)
4459 if (m_curCameraInfo
->previewW
== 640)
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__
);
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__
);
4475 bool ExynosCamera::setTouchAFStart(bool toggle
)
4477 if (m_curCameraInfo
->touchAfStart
!= toggle
) {
4478 m_curCameraInfo
->touchAfStart
= toggle
;
4479 int startStop
= (toggle
== true) ? 1 : 0;
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__
);
4490 bool ExynosCamera::setSmartAuto(bool toggle
)
4492 if (m_curCameraInfo
->smartAuto
!= toggle
) {
4493 m_curCameraInfo
->smartAuto
= toggle
;
4495 int smartAuto
= (toggle
== true) ? SMART_AUTO_ON
: SMART_AUTO_OFF
;
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__
);
4508 bool ExynosCamera::getSmartAuto(void)
4510 return m_curCameraInfo
->smartAuto
;
4513 int ExynosCamera::getSmartAutoStatus(void)
4515 int autoscene_status
= -1;
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__
);
4523 if ((autoscene_status
< SMART_AUTO_STATUS_AUTO
) || (autoscene_status
> SMART_AUTO_STATUS_MAX
)) {
4524 ALOGE("ERR(%s):Invalid getSmartAutoStatus (%d)", __func__
, autoscene_status
);
4528 return autoscene_status
;
4531 bool ExynosCamera::setBeautyShot(bool toggle
)
4533 if (m_curCameraInfo
->beautyShot
!= toggle
) {
4534 m_curCameraInfo
->beautyShot
= toggle
;
4535 int beautyShot
= (toggle
== true) ? BEAUTY_SHOT_ON
: BEAUTY_SHOT_OFF
;
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__
);
4548 bool ExynosCamera::getBeautyShot(void)
4550 return m_curCameraInfo
->beautyShot
;
4553 bool ExynosCamera::setTopDownMirror(void)
4555 if (m_previewDev
->fd
<= 0) {
4556 ALOGE("ERR(%s):Camera was closed", __func__
);
4560 if (exynos_v4l2_s_ctrl(m_previewDev
->fd
, V4L2_CID_VFLIP
, 1) < 0) {
4561 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__
);
4568 bool ExynosCamera::setLRMirror(void)
4570 if (m_previewDev
->fd
<= 0) {
4571 ALOGE("ERR(%s):Camera was closed", __func__
);
4575 if (exynos_v4l2_s_ctrl(m_previewDev
->fd
, V4L2_CID_HFLIP
, 1) < 0) {
4576 ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__
);
4583 bool ExynosCamera::setBrightness(int brightness
)
4585 int internalValue
= brightness
;
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
);
4594 internalValue
+= EV_DEFAULT
;
4595 if (internalValue
< EV_MINUS_4
|| EV_PLUS_4
< internalValue
) {
4596 ALOGE("ERR(%s):Invalid internalValue(%d)", __func__
, internalValue
);
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__
);
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__
);
4621 int ExynosCamera::getBrightness(void)
4623 return m_curCameraInfo
->brightness
;
4626 bool ExynosCamera::setGamma(bool toggle
)
4628 if (m_curCameraInfo
->gamma
!= toggle
) {
4629 m_curCameraInfo
->gamma
= toggle
;
4631 int gamma
= (toggle
== true) ? GAMMA_ON
: GAMMA_OFF
;
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__
);
4644 bool ExynosCamera::getGamma(void)
4646 return m_curCameraInfo
->gamma
;
4649 bool ExynosCamera::setODC(bool toggle
)
4651 if (m_previewDev
->flagStart
== true) {
4652 if (m_curCameraInfo
->odc
!= toggle
) {
4653 m_curCameraInfo
->odc
= toggle
;
4655 int odc
= (toggle
== true) ? CAMERA_ODC_ON
: CAMERA_ODC_OFF
;
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__
);
4667 bool ExynosCamera::getODC(void)
4669 return m_curCameraInfo
->odc
;
4672 bool ExynosCamera::setSlowAE(bool toggle
)
4674 if (m_curCameraInfo
->slowAE
!= toggle
) {
4675 m_curCameraInfo
->slowAE
= toggle
;
4677 int slow_ae
= (toggle
== true) ? SLOW_AE_ON
: SLOW_AE_OFF
;
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__
);
4690 bool ExynosCamera::getSlowAE(void)
4692 return m_curCameraInfo
->slowAE
;
4695 bool ExynosCamera::setShotMode(int shotMode
)
4697 if (shotMode
< SHOT_MODE_SINGLE
|| SHOT_MODE_SELF
< shotMode
) {
4698 ALOGE("ERR(%s):Invalid shotMode (%d)", __func__
, shotMode
);
4702 if (m_curCameraInfo
->shotMode
!= shotMode
) {
4703 m_curCameraInfo
->shotMode
= shotMode
;
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__
);
4716 int ExynosCamera::getShotMode(void)
4718 return m_curCameraInfo
->shotMode
;
4721 bool ExynosCamera::set3DNR(bool toggle
)
4723 if (m_previewDev
->flagStart
== true) {
4724 if (m_curCameraInfo
->tdnr
!= toggle
) {
4725 m_curCameraInfo
->tdnr
= toggle
;
4727 int tdnr
= (toggle
== true) ? CAMERA_3DNR_ON
: CAMERA_3DNR_OFF
;
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__
);
4739 bool ExynosCamera::get3DNR(void)
4741 return m_curCameraInfo
->tdnr
;
4744 }; // namespace android