PageRenderTime 50ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/libcamera/ExynosCamera.cpp

https://bitbucket.org/sola/jcrom_hardware_samsung_slsi_exynos5
C++ | 4744 lines | 3753 code | 712 blank | 279 comment | 853 complexity | 981665be3b2b041ca226bcbdefd852ad MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. * Copyright 2008, The Android Open Source Project
  3. * Copyright 2010, Samsung Electronics Co. LTD
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed toggle an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. /*!
  18. * \file ExynosCamera.cpp
  19. * \brief source file for CAMERA HAL MODULE
  20. * \author thun.hwang(thun.hwang@samsung.com)
  21. * \date 2010/06/03
  22. *
  23. * <b>Revision History: </b>
  24. * - 2011/12/31 : thun.hwang(thun.hwang@samsung.com) \n
  25. * Initial version
  26. *
  27. * - 2012/01/18 : Sangwoo, Park(sw5771.park@samsung.com) \n
  28. * Adjust Doxygen Document
  29. *
  30. * - 2012/02/01 : Sangwoo, Park(sw5771.park@samsung.com) \n
  31. * Adjust libv4l2
  32. * Adjust struct ExynosCameraInfo
  33. * External ISP feature
  34. *
  35. * - 2012/03/14 : sangwoo.park(sw5771.park@samsung.com) \n
  36. * Change file, class name to ExynosXXX.
  37. */
  38. /**
  39. * @page ExynosCamera
  40. *
  41. * @section Introduction
  42. * ExynosCamera is for camera preview,takePicture and recording.
  43. * (Currently libseccamera is included in Android Camera HAL(libcamera.so).
  44. *
  45. * @section Copyright
  46. * Copyright (c) 2008-2011 Samsung Electronics Co., Ltd.All rights reserved. \n
  47. * Proprietary and Confidential
  48. *
  49. * @image html samsung.png
  50. */
  51. //#define LOG_NDEBUG 0
  52. #define LOG_TAG "ExynosCamera"
  53. /* FIXME: This define will be removed when functions are stable */
  54. //#define USE_DIS
  55. //#define USE_3DNR
  56. //#define USE_ODC
  57. #include <utils/Log.h>
  58. #include "ExynosCamera.h"
  59. #include "exynos_format.h"
  60. using namespace android;
  61. namespace android {
  62. ExynosCameraInfo::ExynosCameraInfo()
  63. {
  64. previewW = 2560;
  65. previewH = 1920;
  66. previewColorFormat = V4L2_PIX_FMT_NV21;
  67. videoW = 1920;
  68. videoH = 1080;
  69. prefVideoPreviewW = 640;
  70. prefVideoPreviewH = 360;
  71. videoColorFormat = V4L2_PIX_FMT_NV12M;
  72. pictureW = 2560;
  73. pictureH = 1920;
  74. pictureColorFormat = V4L2_PIX_FMT_YUYV;
  75. thumbnailW = 320;
  76. thumbnailH = 240;
  77. antiBandingList =
  78. ExynosCamera::ANTIBANDING_OFF
  79. | ExynosCamera::ANTIBANDING_50HZ
  80. | ExynosCamera::ANTIBANDING_60HZ
  81. | ExynosCamera::ANTIBANDING_OFF;
  82. antiBanding = ExynosCamera::ANTIBANDING_OFF;
  83. effectList =
  84. ExynosCamera::EFFECT_NONE
  85. | ExynosCamera::EFFECT_MONO
  86. | ExynosCamera::EFFECT_NEGATIVE
  87. | ExynosCamera::EFFECT_SOLARIZE
  88. | ExynosCamera::EFFECT_SEPIA
  89. | ExynosCamera::EFFECT_POSTERIZE
  90. | ExynosCamera::EFFECT_WHITEBOARD
  91. | ExynosCamera::EFFECT_BLACKBOARD
  92. | ExynosCamera::EFFECT_AQUA;
  93. effect = ExynosCamera::EFFECT_NONE;
  94. flashModeList =
  95. ExynosCamera::FLASH_MODE_OFF
  96. | ExynosCamera::FLASH_MODE_AUTO
  97. | ExynosCamera::FLASH_MODE_ON
  98. | ExynosCamera::FLASH_MODE_RED_EYE
  99. | ExynosCamera::FLASH_MODE_TORCH;
  100. flashMode = ExynosCamera::FLASH_MODE_OFF;
  101. focusModeList =
  102. ExynosCamera::FOCUS_MODE_AUTO
  103. | ExynosCamera::FOCUS_MODE_INFINITY
  104. | ExynosCamera::FOCUS_MODE_MACRO
  105. | ExynosCamera::FOCUS_MODE_FIXED
  106. | ExynosCamera::FOCUS_MODE_EDOF
  107. | ExynosCamera::FOCUS_MODE_CONTINUOUS_VIDEO
  108. | ExynosCamera::FOCUS_MODE_CONTINUOUS_PICTURE
  109. | ExynosCamera::FOCUS_MODE_TOUCH;
  110. focusMode = ExynosCamera::FOCUS_MODE_AUTO;
  111. sceneModeList =
  112. ExynosCamera::SCENE_MODE_AUTO
  113. | ExynosCamera::SCENE_MODE_ACTION
  114. | ExynosCamera::SCENE_MODE_PORTRAIT
  115. | ExynosCamera::SCENE_MODE_LANDSCAPE
  116. | ExynosCamera::SCENE_MODE_NIGHT
  117. | ExynosCamera::SCENE_MODE_NIGHT_PORTRAIT
  118. | ExynosCamera::SCENE_MODE_THEATRE
  119. | ExynosCamera::SCENE_MODE_BEACH
  120. | ExynosCamera::SCENE_MODE_SNOW
  121. | ExynosCamera::SCENE_MODE_SUNSET
  122. | ExynosCamera::SCENE_MODE_STEADYPHOTO
  123. | ExynosCamera::SCENE_MODE_FIREWORKS
  124. | ExynosCamera::SCENE_MODE_SPORTS
  125. | ExynosCamera::SCENE_MODE_PARTY
  126. | ExynosCamera::SCENE_MODE_CANDLELIGHT;
  127. sceneMode = ExynosCamera::SCENE_MODE_AUTO;
  128. whiteBalanceList =
  129. ExynosCamera::WHITE_BALANCE_AUTO
  130. | ExynosCamera::WHITE_BALANCE_INCANDESCENT
  131. | ExynosCamera::WHITE_BALANCE_FLUORESCENT
  132. | ExynosCamera::WHITE_BALANCE_WARM_FLUORESCENT
  133. | ExynosCamera::WHITE_BALANCE_DAYLIGHT
  134. | ExynosCamera::WHITE_BALANCE_CLOUDY_DAYLIGHT
  135. | ExynosCamera::WHITE_BALANCE_TWILIGHT
  136. | ExynosCamera::WHITE_BALANCE_SHADE;
  137. whiteBalance = ExynosCamera::WHITE_BALANCE_AUTO;
  138. autoWhiteBalanceLockSupported = false;
  139. autoWhiteBalanceLock = false;
  140. rotation = 0;
  141. minExposure = -2;
  142. maxExposure = 2;
  143. exposure = 0;
  144. autoExposureLockSupported = false;
  145. autoExposureLock = false;
  146. fps = 30;
  147. focalLengthNum = 9;
  148. focalLengthDen = 10;
  149. supportVideoStabilization = false;
  150. applyVideoStabilization = false;
  151. videoStabilization = false;
  152. maxNumMeteringAreas = 0;
  153. maxNumDetectedFaces = 0;
  154. maxNumFocusAreas = 0;
  155. maxZoom = ZOOM_LEVEL_MAX;
  156. hwZoomSupported = false;
  157. zoom = 0;
  158. gpsAltitude = 0;
  159. gpsLatitude = 0;
  160. gpsLongitude = 0;
  161. gpsTimestamp = 0;
  162. // Additional API default Value.
  163. angle = 0;
  164. antiShake = false;
  165. beautyShot = false;
  166. brightness = 0;
  167. contrast = ExynosCamera::CONTRAST_DEFAULT;
  168. gamma = false;
  169. hue = 2; // 2 is default;
  170. iso = 0;
  171. metering = ExynosCamera::METERING_MODE_CENTER;
  172. objectTracking = false;
  173. objectTrackingStart = false;
  174. saturation = 0;
  175. sharpness = 0;
  176. shotMode = ExynosCamera::SHOT_MODE_SINGLE;
  177. slowAE = false;
  178. smartAuto = false;
  179. touchAfStart = false;
  180. wdr = false;
  181. tdnr = false;
  182. odc = false;
  183. }
  184. ExynosCameraInfoM5M0::ExynosCameraInfoM5M0()
  185. {
  186. previewW = 1280;
  187. previewH = 720;
  188. previewColorFormat = V4L2_PIX_FMT_YVU420M;
  189. videoW = 1280;
  190. videoH = 720;
  191. prefVideoPreviewW = 640;
  192. prefVideoPreviewH = 360;
  193. videoColorFormat = V4L2_PIX_FMT_NV12M;
  194. pictureW = 1280;
  195. pictureH = 720;
  196. pictureColorFormat = V4L2_PIX_FMT_YUYV;
  197. thumbnailW = 320;
  198. thumbnailH = 240;
  199. antiBandingList = ExynosCamera::ANTIBANDING_OFF;
  200. antiBanding = ExynosCamera::ANTIBANDING_OFF;
  201. effectList =
  202. ExynosCamera::EFFECT_NONE
  203. | ExynosCamera::EFFECT_MONO
  204. | ExynosCamera::EFFECT_NEGATIVE
  205. //| ExynosCamera::EFFECT_SOLARIZE
  206. | ExynosCamera::EFFECT_SEPIA
  207. //| ExynosCamera::EFFECT_POSTERIZE
  208. //| ExynosCamera::EFFECT_WHITEBOARD
  209. //| ExynosCamera::EFFECT_BLACKBOARD
  210. | ExynosCamera::EFFECT_AQUA;
  211. effect = ExynosCamera::EFFECT_NONE;
  212. flashModeList =
  213. ExynosCamera::FLASH_MODE_OFF
  214. | ExynosCamera::FLASH_MODE_AUTO
  215. | ExynosCamera::FLASH_MODE_ON
  216. | ExynosCamera::FLASH_MODE_RED_EYE
  217. | ExynosCamera::FLASH_MODE_TORCH;
  218. flashMode = ExynosCamera::FLASH_MODE_OFF;
  219. focusModeList =
  220. ExynosCamera::FOCUS_MODE_AUTO
  221. | ExynosCamera::FOCUS_MODE_INFINITY
  222. | ExynosCamera::FOCUS_MODE_MACRO
  223. //| ExynosCamera::FOCUS_MODE_FIXED
  224. //| ExynosCamera::FOCUS_MODE_EDOF
  225. //| ExynosCamera::FOCUS_MODE_CONTINUOUS_VIDEO
  226. //| ExynosCamera::FOCUS_MODE_CONTINUOUS_PICTURE
  227. //| ExynosCamera::FOCUS_MODE_TOUCH
  228. ;
  229. focusMode = ExynosCamera::FOCUS_MODE_AUTO;
  230. sceneModeList =
  231. ExynosCamera::SCENE_MODE_AUTO
  232. //| ExynosCamera::SCENE_MODE_ACTION
  233. | ExynosCamera::SCENE_MODE_PORTRAIT
  234. | ExynosCamera::SCENE_MODE_LANDSCAPE
  235. | ExynosCamera::SCENE_MODE_NIGHT
  236. //| ExynosCamera::SCENE_MODE_NIGHT_PORTRAIT
  237. //| ExynosCamera::SCENE_MODE_THEATRE
  238. | ExynosCamera::SCENE_MODE_BEACH
  239. | ExynosCamera::SCENE_MODE_SNOW
  240. | ExynosCamera::SCENE_MODE_SUNSET
  241. //| ExynosCamera::SCENE_MODE_STEADYPHOTO
  242. | ExynosCamera::SCENE_MODE_FIREWORKS
  243. | ExynosCamera::SCENE_MODE_SPORTS
  244. | ExynosCamera::SCENE_MODE_PARTY
  245. | ExynosCamera::SCENE_MODE_CANDLELIGHT;
  246. sceneMode = ExynosCamera::SCENE_MODE_AUTO;
  247. whiteBalanceList =
  248. ExynosCamera::WHITE_BALANCE_AUTO
  249. | ExynosCamera::WHITE_BALANCE_INCANDESCENT
  250. | ExynosCamera::WHITE_BALANCE_FLUORESCENT
  251. //| ExynosCamera::WHITE_BALANCE_WARM_FLUORESCENT
  252. | ExynosCamera::WHITE_BALANCE_DAYLIGHT
  253. | ExynosCamera::WHITE_BALANCE_CLOUDY_DAYLIGHT
  254. //| ExynosCamera::WHITE_BALANCE_TWILIGHT
  255. //| ExynosCamera::WHITE_BALANCE_SHADE
  256. ;
  257. whiteBalance = ExynosCamera::WHITE_BALANCE_AUTO;
  258. autoWhiteBalanceLockSupported = false;
  259. autoWhiteBalanceLock = false;
  260. rotation = 0;
  261. minExposure = -2;
  262. maxExposure = 2;
  263. exposure = 0;
  264. autoExposureLockSupported = false;
  265. autoExposureLock = false;
  266. fps = 30;
  267. focalLengthNum = 343;
  268. focalLengthDen = 100;
  269. supportVideoStabilization = false;
  270. applyVideoStabilization = false;
  271. videoStabilization = false;
  272. maxNumMeteringAreas = 64;
  273. maxNumDetectedFaces = 16;
  274. maxNumFocusAreas = 2;
  275. maxZoom = ZOOM_LEVEL_MAX;
  276. hwZoomSupported = false;
  277. zoom = 0;
  278. gpsAltitude = 0;
  279. gpsLatitude = 0;
  280. gpsLongitude = 0;
  281. gpsTimestamp = 0;
  282. }
  283. ExynosCameraInfoS5K6A3::ExynosCameraInfoS5K6A3()
  284. {
  285. previewW = 1280;
  286. previewH = 720;
  287. previewColorFormat = V4L2_PIX_FMT_YVU420M;
  288. videoW = 1280;
  289. videoH = 720;
  290. prefVideoPreviewW = 640;
  291. prefVideoPreviewH = 360;
  292. videoColorFormat = V4L2_PIX_FMT_NV12M;
  293. pictureW = 1280;
  294. pictureH = 720;
  295. pictureColorFormat = V4L2_PIX_FMT_YUYV;
  296. thumbnailW = 320;
  297. thumbnailH = 240;
  298. antiBandingList =
  299. ExynosCamera::ANTIBANDING_OFF
  300. | ExynosCamera::ANTIBANDING_50HZ
  301. | ExynosCamera::ANTIBANDING_60HZ
  302. | ExynosCamera::ANTIBANDING_OFF;
  303. antiBanding = ExynosCamera::ANTIBANDING_OFF;
  304. effectList =
  305. ExynosCamera::EFFECT_NONE
  306. | ExynosCamera::EFFECT_MONO
  307. | ExynosCamera::EFFECT_NEGATIVE
  308. //| ExynosCamera::EFFECT_SOLARIZE
  309. | ExynosCamera::EFFECT_SEPIA
  310. //| ExynosCamera::EFFECT_POSTERIZE
  311. //| ExynosCamera::EFFECT_WHITEBOARD
  312. //| ExynosCamera::EFFECT_BLACKBOARD
  313. //| ExynosCamera::EFFECT_AQUA
  314. ;
  315. effect = ExynosCamera::EFFECT_NONE;
  316. flashModeList =
  317. ExynosCamera::FLASH_MODE_OFF
  318. //| ExynosCamera::FLASH_MODE_AUTO
  319. //| ExynosCamera::FLASH_MODE_ON
  320. //| ExynosCamera::FLASH_MODE_RED_EYE
  321. //| ExynosCamera::FLASH_MODE_TORCH
  322. ;
  323. flashMode = ExynosCamera::FLASH_MODE_OFF;
  324. focusModeList =
  325. // ExynosCamera::FOCUS_MODE_AUTO
  326. //| ExynosCamera::FOCUS_MODE_INFINITY
  327. //| ExynosCamera::FOCUS_MODE_MACRO
  328. //|
  329. ExynosCamera::FOCUS_MODE_FIXED
  330. //| ExynosCamera::FOCUS_MODE_EDOF
  331. //| ExynosCamera::FOCUS_MODE_CONTINUOUS_VIDEO
  332. //| ExynosCamera::FOCUS_MODE_CONTINUOUS_PICTURE
  333. //| ExynosCamera::FOCUS_MODE_TOUCH
  334. ;
  335. focusMode = ExynosCamera::FOCUS_MODE_FIXED;
  336. sceneModeList =
  337. ExynosCamera::SCENE_MODE_AUTO
  338. //| ExynosCamera::SCENE_MODE_ACTION
  339. | ExynosCamera::SCENE_MODE_PORTRAIT
  340. | ExynosCamera::SCENE_MODE_LANDSCAPE
  341. | ExynosCamera::SCENE_MODE_NIGHT
  342. //| ExynosCamera::SCENE_MODE_NIGHT_PORTRAIT
  343. //| ExynosCamera::SCENE_MODE_THEATRE
  344. | ExynosCamera::SCENE_MODE_BEACH
  345. | ExynosCamera::SCENE_MODE_SNOW
  346. | ExynosCamera::SCENE_MODE_SUNSET
  347. | ExynosCamera::SCENE_MODE_STEADYPHOTO
  348. | ExynosCamera::SCENE_MODE_FIREWORKS
  349. | ExynosCamera::SCENE_MODE_SPORTS
  350. | ExynosCamera::SCENE_MODE_PARTY
  351. | ExynosCamera::SCENE_MODE_CANDLELIGHT;
  352. sceneMode = ExynosCamera::SCENE_MODE_AUTO;
  353. whiteBalanceList =
  354. ExynosCamera::WHITE_BALANCE_AUTO
  355. | ExynosCamera::WHITE_BALANCE_INCANDESCENT
  356. | ExynosCamera::WHITE_BALANCE_FLUORESCENT
  357. //| ExynosCamera::WHITE_BALANCE_WARM_FLUORESCENT
  358. | ExynosCamera::WHITE_BALANCE_DAYLIGHT
  359. | ExynosCamera::WHITE_BALANCE_CLOUDY_DAYLIGHT
  360. //| ExynosCamera::WHITE_BALANCE_TWILIGHT
  361. //| ExynosCamera::WHITE_BALANCE_SHADE
  362. ;
  363. whiteBalance = ExynosCamera::WHITE_BALANCE_AUTO;
  364. autoWhiteBalanceLockSupported = true;
  365. autoWhiteBalanceLock = false;
  366. rotation = 0;
  367. minExposure = -2;
  368. maxExposure = 2;
  369. exposure = 0;
  370. autoExposureLockSupported = true;
  371. autoExposureLock = false;
  372. fps = 30;
  373. focalLengthNum = 9;
  374. focalLengthDen = 10;
  375. supportVideoStabilization = false;
  376. applyVideoStabilization = false;
  377. videoStabilization = false;
  378. maxNumMeteringAreas = 64;
  379. maxNumDetectedFaces = 16;
  380. maxNumFocusAreas = 0;
  381. maxZoom = ZOOM_LEVEL_MAX;
  382. hwZoomSupported = false;
  383. zoom = 0;
  384. gpsAltitude = 0;
  385. gpsLatitude = 0;
  386. gpsLongitude = 0;
  387. gpsTimestamp = 0;
  388. }
  389. ExynosCameraInfoS5K4E5::ExynosCameraInfoS5K4E5()
  390. {
  391. previewW = 1920;
  392. previewH = 1080;
  393. previewColorFormat = V4L2_PIX_FMT_YVU420M;
  394. videoW = 1920;
  395. videoH = 1080;
  396. prefVideoPreviewW = 640;
  397. prefVideoPreviewH = 360;
  398. videoColorFormat = V4L2_PIX_FMT_NV12M;
  399. pictureW = 2560;
  400. pictureH = 1920;
  401. pictureColorFormat = V4L2_PIX_FMT_YUYV;
  402. thumbnailW = 320;
  403. thumbnailH = 240;
  404. antiBandingList =
  405. ExynosCamera::ANTIBANDING_OFF
  406. | ExynosCamera::ANTIBANDING_50HZ
  407. | ExynosCamera::ANTIBANDING_60HZ
  408. | ExynosCamera::ANTIBANDING_OFF;
  409. antiBanding = ExynosCamera::ANTIBANDING_OFF;
  410. effectList =
  411. ExynosCamera::EFFECT_NONE
  412. | ExynosCamera::EFFECT_MONO
  413. | ExynosCamera::EFFECT_NEGATIVE
  414. //| ExynosCamera::EFFECT_SOLARIZE
  415. | ExynosCamera::EFFECT_SEPIA
  416. //| ExynosCamera::EFFECT_POSTERIZE
  417. //| ExynosCamera::EFFECT_WHITEBOARD
  418. //| ExynosCamera::EFFECT_BLACKBOARD
  419. //| ExynosCamera::EFFECT_AQUA
  420. ;
  421. effect = ExynosCamera::EFFECT_NONE;
  422. flashModeList =
  423. ExynosCamera::FLASH_MODE_OFF
  424. | ExynosCamera::FLASH_MODE_AUTO
  425. | ExynosCamera::FLASH_MODE_ON
  426. //| ExynosCamera::FLASH_MODE_RED_EYE
  427. | ExynosCamera::FLASH_MODE_TORCH;
  428. flashMode = ExynosCamera::FLASH_MODE_OFF;
  429. focusModeList =
  430. ExynosCamera::FOCUS_MODE_AUTO
  431. | ExynosCamera::FOCUS_MODE_INFINITY
  432. | ExynosCamera::FOCUS_MODE_MACRO
  433. //| ExynosCamera::FOCUS_MODE_FIXED
  434. //| ExynosCamera::FOCUS_MODE_EDOF
  435. | ExynosCamera::FOCUS_MODE_CONTINUOUS_VIDEO
  436. // | ExynosCamera::FOCUS_MODE_CONTINUOUS_PICTURE
  437. | ExynosCamera::FOCUS_MODE_TOUCH
  438. ;
  439. focusMode = ExynosCamera::FOCUS_MODE_AUTO;
  440. sceneModeList =
  441. ExynosCamera::SCENE_MODE_AUTO
  442. //| ExynosCamera::SCENE_MODE_ACTION
  443. | ExynosCamera::SCENE_MODE_PORTRAIT
  444. | ExynosCamera::SCENE_MODE_LANDSCAPE
  445. | ExynosCamera::SCENE_MODE_NIGHT
  446. //| ExynosCamera::SCENE_MODE_NIGHT_PORTRAIT
  447. //| ExynosCamera::SCENE_MODE_THEATRE
  448. | ExynosCamera::SCENE_MODE_BEACH
  449. | ExynosCamera::SCENE_MODE_SNOW
  450. | ExynosCamera::SCENE_MODE_SUNSET
  451. | ExynosCamera::SCENE_MODE_STEADYPHOTO
  452. | ExynosCamera::SCENE_MODE_FIREWORKS
  453. | ExynosCamera::SCENE_MODE_SPORTS
  454. | ExynosCamera::SCENE_MODE_PARTY
  455. | ExynosCamera::SCENE_MODE_CANDLELIGHT;
  456. sceneMode = ExynosCamera::SCENE_MODE_AUTO;
  457. whiteBalanceList =
  458. ExynosCamera::WHITE_BALANCE_AUTO
  459. | ExynosCamera::WHITE_BALANCE_INCANDESCENT
  460. | ExynosCamera::WHITE_BALANCE_FLUORESCENT
  461. //| ExynosCamera::WHITE_BALANCE_WARM_FLUORESCENT
  462. | ExynosCamera::WHITE_BALANCE_DAYLIGHT
  463. | ExynosCamera::WHITE_BALANCE_CLOUDY_DAYLIGHT
  464. //| ExynosCamera::WHITE_BALANCE_TWILIGHT
  465. //| ExynosCamera::WHITE_BALANCE_SHADE
  466. ;
  467. whiteBalance = ExynosCamera::WHITE_BALANCE_AUTO;
  468. autoWhiteBalanceLockSupported = true;
  469. autoWhiteBalanceLock = false;
  470. rotation = 0;
  471. minExposure = -2;
  472. maxExposure = 2;
  473. exposure = 0;
  474. autoExposureLockSupported = true;
  475. autoExposureLock = false;
  476. fps = 30;
  477. focalLengthNum = 9;
  478. focalLengthDen = 10;
  479. supportVideoStabilization = true;
  480. applyVideoStabilization = false;
  481. videoStabilization = false;
  482. maxNumMeteringAreas = 64;
  483. maxNumDetectedFaces = 16;
  484. maxNumFocusAreas = 2;
  485. maxZoom = ZOOM_LEVEL_MAX;
  486. hwZoomSupported = false;
  487. zoom = 0;
  488. gpsAltitude = 0;
  489. gpsLatitude = 0;
  490. gpsLongitude = 0;
  491. gpsTimestamp = 0;
  492. }
  493. //////////////////////////////////////////////////
  494. #define PFX_NODE "/dev/video"
  495. #define M5MOLS_ENTITY_NAME "M5MOLS 5-001f"
  496. #define PFX_SUBDEV_ENTITY_MIPI_CSIS "s5p-mipi-csis"
  497. #define PFX_SUBDEV_ENTITY_FLITE "flite-subdev"
  498. #define PFX_SUBDEV_ENTITY_GSC_CAP "gsc-cap-subdev"
  499. #define PFX_VIDEODEV_ENTITY_FLITE "exynos-fimc-lite"
  500. #define PFX_VIDEODEV_ENTITY_GSC_CAP "exynos-gsc"
  501. #define MEDIA_DEV_INTERNAL_ISP "/dev/media2"
  502. #define MEDIA_DEV_EXTERNAL_ISP "/dev/media1"
  503. #define ISP_VD_NODE_OFFSET (40) //INTERNAL_ISP
  504. #define FLITE_VD_NODE_OFFSET (36) //External ISP
  505. #define VIDEO_NODE_PREVIEW_ID (3)
  506. #define VIDEO_NODE_RECODING_ID (2)
  507. #define VIDEO_NODE_SNAPSHOT_ID (1)
  508. #define ISP_SENSOR_MAX_ENTITIES 1
  509. #define ISP_SENSOR_PAD_SOURCE_FRONT 0
  510. #define ISP_SENSOR_PADS_NUM 1
  511. #define ISP_FRONT_MAX_ENTITIES 1
  512. #define ISP_FRONT_PAD_SINK 0
  513. #define ISP_FRONT_PAD_SOURCE_BACK 1
  514. #define ISP_FRONT_PAD_SOURCE_BAYER 2
  515. #define ISP_FRONT_PAD_SOURCE_SCALERC 3
  516. #define ISP_FRONT_PADS_NUM 4
  517. #define ISP_BACK_MAX_ENTITIES 1
  518. #define ISP_BACK_PAD_SINK 0
  519. #define ISP_BACK_PAD_SOURCE_3DNR 1
  520. #define ISP_BACK_PAD_SOURCE_SCALERP 2
  521. #define ISP_BACK_PADS_NUM 3
  522. #define ISP_MODULE_NAME "exynos5-fimc-is"
  523. #define ISP_SENSOR_ENTITY_NAME "exynos5-fimc-is-sensor"
  524. #define ISP_FRONT_ENTITY_NAME "exynos5-fimc-is-front"
  525. #define ISP_BACK_ENTITY_NAME "exynos5-fimc-is-back"
  526. #define ISP_VIDEO_BAYER_NAME "exynos5-fimc-is-bayer"
  527. #define ISP_VIDEO_SCALERC_NAME "exynos5-fimc-is-scalerc"
  528. #define ISP_VIDEO_3DNR_NAME "exynos5-fimc-is-3dnr"
  529. #define ISP_VIDEO_SCALERP_NAME "exynos5-fimc-is-scalerp"
  530. #define MIPI_NUM 1
  531. #define FLITE_NUM 1
  532. #define GSC_NUM 0
  533. #define PFX_SUBDEV_NODE "/dev/v4l-subdev"
  534. /*
  535. * V 4 L 2 F I M C E X T E N S I O N S
  536. *
  537. */
  538. #define V4L2_CID_ROTATION (V4L2_CID_PRIVATE_BASE + 0)
  539. #define V4L2_CID_PADDR_Y (V4L2_CID_PRIVATE_BASE + 1)
  540. #define V4L2_CID_PADDR_CB (V4L2_CID_PRIVATE_BASE + 2)
  541. #define V4L2_CID_PADDR_CR (V4L2_CID_PRIVATE_BASE + 3)
  542. #define V4L2_CID_PADDR_CBCR (V4L2_CID_PRIVATE_BASE + 4)
  543. #define V4L2_CID_STREAM_PAUSE (V4L2_CID_PRIVATE_BASE + 53)
  544. #define V4L2_CID_CAM_JPEG_MAIN_SIZE (V4L2_CID_PRIVATE_BASE + 32)
  545. #define V4L2_CID_CAM_JPEG_MAIN_OFFSET (V4L2_CID_PRIVATE_BASE + 33)
  546. #define V4L2_CID_CAM_JPEG_THUMB_SIZE (V4L2_CID_PRIVATE_BASE + 34)
  547. #define V4L2_CID_CAM_JPEG_THUMB_OFFSET (V4L2_CID_PRIVATE_BASE + 35)
  548. #define V4L2_CID_CAM_JPEG_POSTVIEW_OFFSET (V4L2_CID_PRIVATE_BASE + 36)
  549. #define V4L2_CID_CAM_JPEG_QUALITY (V4L2_CID_PRIVATE_BASE + 37)
  550. #define V4L2_PIX_FMT_YVYU v4l2_fourcc('Y', 'V', 'Y', 'U')
  551. /* FOURCC for FIMC specific */
  552. #define V4L2_PIX_FMT_VYUY v4l2_fourcc('V', 'Y', 'U', 'Y')
  553. #define V4L2_PIX_FMT_NV16 v4l2_fourcc('N', 'V', '1', '6')
  554. #define V4L2_PIX_FMT_NV61 v4l2_fourcc('N', 'V', '6', '1')
  555. #define V4L2_PIX_FMT_NV12T v4l2_fourcc('T', 'V', '1', '2')
  556. ///////////////////////////////////////////////////
  557. // Google Official API : Camera.Parameters
  558. // http://developer.android.com/reference/android/hardware/Camera.Parameters.html
  559. ///////////////////////////////////////////////////
  560. ExynosCamera::ExynosCamera() :
  561. m_flagCreate(false),
  562. m_cameraId(CAMERA_ID_BACK),
  563. m_defaultCameraInfo(NULL),
  564. m_curCameraInfo(NULL),
  565. m_jpegQuality(100),
  566. m_jpegThumbnailQuality(100),
  567. m_currentZoom(-1)
  568. {
  569. memset(&m_sensorDev, 0, sizeof(struct devInfo));
  570. memset(&m_mipiDev, 0, sizeof(struct devInfo));
  571. memset(&m_fliteDev, 0, sizeof(struct devInfo));
  572. memset(&m_gscPreviewDev, 0, sizeof(struct devInfo));
  573. memset(&m_gscVideoDev, 0, sizeof(struct devInfo));
  574. memset(&m_gscPictureDev, 0, sizeof(struct devInfo));
  575. m_previewDev = NULL;
  576. m_videoDev = NULL;
  577. m_pictureDev = NULL;
  578. m_tryPreviewStop = true;
  579. m_tryVideoStop = true;
  580. m_tryPictureStop = true;
  581. m_flagStartFaceDetection = false;
  582. m_flagAutoFocusRunning = false;
  583. m_sensorEntity = NULL;
  584. m_mipiEntity = NULL;
  585. m_fliteSdEntity = NULL;
  586. m_fliteVdEntity = NULL;
  587. m_gscSdEntity = NULL;
  588. m_gscVdEntity = NULL;
  589. m_ispSensorEntity = NULL;
  590. m_ispFrontEntity = NULL;
  591. m_ispBackEntity = NULL;
  592. m_ispScalercEntity = NULL;
  593. m_ispScalerpEntity = NULL;
  594. m_isp3dnrEntity = NULL;
  595. for (int i = 0; i < VIDEO_MAX_FRAME; i++) {
  596. m_validPreviewBuf[i] = false;
  597. m_validVideoBuf [i] = false;
  598. m_validPictureBuf[i] = false;
  599. }
  600. memset((void *)m_cameraName, 0, 32);
  601. m_internalISP = true;
  602. m_media = NULL;
  603. memset(&mExifInfo, 0, sizeof(mExifInfo));
  604. }
  605. ExynosCamera::~ExynosCamera()
  606. {
  607. if (m_flagCreate == true)
  608. destroy();
  609. }
  610. bool ExynosCamera::create(int cameraId)
  611. {
  612. int ret = 0;
  613. unsigned int i;
  614. int devNum;
  615. char node[30];
  616. struct media_link *links = NULL;
  617. if (m_flagCreate == true) {
  618. ALOGE("ERR(%s):Already created", __func__);
  619. return false;
  620. }
  621. m_cameraId = cameraId;
  622. ExynosBuffer nullBuf;
  623. for (int i = 0; i < VIDEO_MAX_FRAME; i++) {
  624. m_validPreviewBuf[i] = false;
  625. m_validVideoBuf [i] = false;
  626. m_validPictureBuf[i] = false;
  627. m_previewBuf[i] = nullBuf;
  628. m_videoBuf[i] = nullBuf;
  629. m_pictureBuf[i] = nullBuf;
  630. }
  631. if (m_cameraId == CAMERA_ID_BACK)
  632. m_internalISP = true;
  633. // m_internalISP = false; // external ISP.
  634. else
  635. m_internalISP = true;
  636. if (m_internalISP == true) {
  637. //////////////////////////////
  638. // internal ISP
  639. //////////////////////////////
  640. // media device open
  641. m_media = exynos_media_open(MEDIA_DEV_INTERNAL_ISP);
  642. if (m_media == NULL) {
  643. ALOGE("ERR(%s):Cannot open media device (error : %s)", __func__, strerror(errno));
  644. goto err;
  645. }
  646. //////////////////
  647. // GET ENTITIES
  648. //////////////////
  649. // ISP sensor subdev
  650. memset(&node, 0x00, sizeof(node));
  651. strcpy(node, ISP_SENSOR_ENTITY_NAME);
  652. m_ispSensorEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
  653. // ISP front subdev
  654. memset(&node, 0x00, sizeof(node));
  655. strcpy(node, ISP_FRONT_ENTITY_NAME);
  656. m_ispFrontEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
  657. // ISP back subdev
  658. memset(&node, 0x00, sizeof(node));
  659. strcpy(node, ISP_BACK_ENTITY_NAME);
  660. m_ispBackEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
  661. // ISP ScalerC video node
  662. memset(&node, 0x00, sizeof(node));
  663. strcpy(node, ISP_VIDEO_SCALERC_NAME);
  664. m_ispScalercEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
  665. // ISP ScalerP video node
  666. memset(&node, 0x00, sizeof(node));
  667. strcpy(node, ISP_VIDEO_SCALERP_NAME);
  668. m_ispScalerpEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
  669. // ISP 3DNR video node
  670. memset(&node, 0x00, sizeof(node));
  671. strcpy(node, ISP_VIDEO_3DNR_NAME);
  672. m_isp3dnrEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
  673. ALOGV("DEBUG(%s):m_ispSensorEntity : numlink : %d", __func__, m_ispSensorEntity->num_links);
  674. ALOGV("DEBUG(%s):m_ispFrontEntity : numlink : %d", __func__, m_ispFrontEntity->num_links);
  675. ALOGV("DEBUG(%s):m_ispBackEntity : numlink : %d", __func__, m_ispBackEntity->num_links);
  676. ALOGV("DEBUG(%s):m_ispScalercEntity : numlink : %d", __func__, m_ispScalercEntity->num_links);
  677. ALOGV("DEBUG(%s):m_ispScalerpEntity : numlink : %d", __func__, m_ispScalerpEntity->num_links);
  678. ALOGV("DEBUG(%s):m_isp3dnrEntity : numlink : %d", __func__, m_isp3dnrEntity->num_links);
  679. //////////////////
  680. // SETUP LINKS
  681. //////////////////
  682. // SENSOR TO FRONT
  683. links = m_ispSensorEntity->links;
  684. if (links == NULL ||
  685. links->source->entity != m_ispSensorEntity ||
  686. links->sink->entity != m_ispFrontEntity) {
  687. ALOGE("ERR(%s):Can not make link isp_sensor to isp_front", __func__);
  688. goto err;
  689. } else if (exynos_media_setup_link(m_media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
  690. ALOGE("ERR(%s):Can not make setup isp_sensor to isp_front", __func__);
  691. goto err;
  692. }
  693. ALOGV("DEBUG(%s):[LINK SUCCESS] Sensor to front", __func__);
  694. // FRONT TO BACK
  695. for (i = 0; i < m_ispFrontEntity->num_links; i++) {
  696. links = &m_ispFrontEntity->links[i];
  697. if (links == NULL ||
  698. links->source->entity != m_ispFrontEntity ||
  699. links->sink->entity != m_ispBackEntity) {
  700. ALOGV("DEBUG(%s):i=%d: links->source->entity : %p, m_ispFrontEntity : %p", __func__, i,
  701. links->source->entity, m_ispFrontEntity);
  702. ALOGV("DEBUG(%s):i=%d: links->sink->entity : %p, m_ispBackEntity : %p", __func__, i,
  703. links->sink->entity, m_ispBackEntity);
  704. continue;
  705. } else if (exynos_media_setup_link(m_media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
  706. ALOGE("ERR(%s):Can not make setup isp_front to isp_back", __func__);
  707. goto err;
  708. }
  709. }
  710. ALOGV("DEBUG(%s):[LINK SUCCESS] front to back", __func__);
  711. // BACK TO ScalerP Video
  712. for (i = 0; i < m_ispBackEntity->num_links; i++) {
  713. links = &m_ispBackEntity->links[i];
  714. if (links == NULL ||
  715. links->source->entity != m_ispBackEntity ||
  716. links->sink->entity != m_ispScalerpEntity) {
  717. ALOGV("DEBUG(%s):i=%d: links->source->entity : %p, m_ispBackEntity : %p", __func__, i,
  718. links->source->entity, m_ispBackEntity);
  719. ALOGV("DEBUG(%s):i=%d: links->sink->entity : %p, m_ispScalerpEntity : %p", __func__, i,
  720. links->sink->entity, m_ispScalerpEntity);
  721. continue;
  722. } else if (exynos_media_setup_link(m_media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
  723. ALOGE("ERR(%s):Can not make setup isp_back to scalerP", __func__);
  724. goto err;
  725. }
  726. }
  727. ALOGV("DEBUG(%s):[LINK SUCCESS] back to scalerP", __func__);
  728. sprintf(node, "%s%d", PFX_NODE, (ISP_VD_NODE_OFFSET + VIDEO_NODE_PREVIEW_ID));
  729. m_gscPreviewDev.fd = exynos_v4l2_open(node, O_RDWR, 0);
  730. if (m_gscPreviewDev.fd <= 0) {
  731. ALOGE("ERR(%s):exynos_v4l2_open(%s) fail (error : %s)", __func__, node, strerror(errno));
  732. goto err;
  733. }
  734. m_previewDev = &m_gscPreviewDev;
  735. sprintf(node, "%s%d", PFX_NODE, (ISP_VD_NODE_OFFSET + VIDEO_NODE_RECODING_ID));
  736. m_gscVideoDev.fd = exynos_v4l2_open(node, O_RDWR, 0);
  737. if (m_gscVideoDev.fd <= 0) {
  738. ALOGE("ERR(%s):exynos_v4l2_open(%s) fail (error : %s)", __func__, node, strerror(errno));
  739. goto err;
  740. }
  741. m_videoDev = &m_gscVideoDev;
  742. sprintf(node, "%s%d", PFX_NODE, (ISP_VD_NODE_OFFSET + VIDEO_NODE_SNAPSHOT_ID));
  743. m_gscPictureDev.fd = exynos_v4l2_open(node, O_RDWR, 0);
  744. if (m_gscPictureDev.fd <= 0) {
  745. ALOGE("ERR(%s):exynos_v4l2_open(%s) fail (error : %s)", __func__, node, strerror(errno));
  746. goto err;
  747. }
  748. m_pictureDev = &m_gscPictureDev;
  749. } else {
  750. //////////////////////////////
  751. // external ISP
  752. //////////////////////////////
  753. // media device open
  754. m_media = exynos_media_open(MEDIA_DEV_EXTERNAL_ISP);
  755. if (m_media == NULL) {
  756. ALOGE("ERR(%s):Cannot open media device (error : %s)", __func__, strerror(errno));
  757. goto err;
  758. }
  759. //////////////////
  760. // GET ENTITIES
  761. //////////////////
  762. // camera subdev
  763. strcpy(node, M5MOLS_ENTITY_NAME);
  764. ALOGV("DEBUG(%s):node : %s", __func__, node);
  765. m_sensorEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
  766. ALOGV("DEBUG(%s):m_sensorEntity : 0x%p", __func__, m_sensorEntity);
  767. // mipi subdev
  768. sprintf(node, "%s.%d", PFX_SUBDEV_ENTITY_MIPI_CSIS, MIPI_NUM);
  769. ALOGV("DEBUG(%s):node : %s", __func__, node);
  770. m_mipiEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
  771. ALOGV("DEBUG(%s):m_mipiEntity : 0x%p", __func__, m_mipiEntity);
  772. // fimc-lite subdev
  773. sprintf(node, "%s.%d", PFX_SUBDEV_ENTITY_FLITE, FLITE_NUM);
  774. ALOGV("DEBUG(%s):node : %s", __func__, node);
  775. m_fliteSdEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
  776. ALOGV("DEBUG(%s):m_fliteSdEntity : 0x%p", __func__, m_fliteSdEntity);
  777. // fimc-lite videodev
  778. sprintf(node, "%s.%d", PFX_VIDEODEV_ENTITY_FLITE, FLITE_NUM);
  779. ALOGV("DEBUG(%s):node : %s", __func__, node);
  780. m_fliteVdEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
  781. ALOGV("DEBUG(%s):m_fliteVdEntity : 0x%p", __func__, m_fliteVdEntity);
  782. // gscaler subdev
  783. sprintf(node, "%s.%d", PFX_SUBDEV_ENTITY_GSC_CAP, GSC_NUM);
  784. ALOGV("DEBUG(%s):node : %s", __func__, node);
  785. m_gscSdEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
  786. ALOGV("DEBUG(%s):m_gscSdEntity : 0x%p", __func__, m_gscSdEntity);
  787. // gscaler videodev
  788. sprintf(node, "%s.%d", PFX_VIDEODEV_ENTITY_GSC_CAP, GSC_NUM);
  789. ALOGV("DEBUG(%s):node : %s", __func__, node);
  790. m_gscVdEntity = exynos_media_get_entity_by_name(m_media, node, strlen(node));
  791. ALOGV("DEBUG(%s):m_gscVdEntity : 0x%p", __func__, m_gscVdEntity);
  792. ALOGV("DEBUG(%s):sensor_sd : numlink : %d", __func__, m_sensorEntity->num_links);
  793. ALOGV("DEBUG(%s):mipi_sd : numlink : %d", __func__, m_mipiEntity->num_links);
  794. ALOGV("DEBUG(%s):flite_sd : numlink : %d", __func__, m_fliteSdEntity->num_links);
  795. ALOGV("DEBUG(%s):flite_vd : numlink : %d", __func__, m_fliteVdEntity->num_links);
  796. ALOGV("DEBUG(%s):gsc_sd : numlink : %d", __func__, m_gscSdEntity->num_links);
  797. ALOGV("DEBUG(%s):gsc_vd : numlink : %d", __func__, m_gscVdEntity->num_links);
  798. //////////////////
  799. // SETUP LINKS
  800. //////////////////
  801. // sensor subdev to mipi subdev
  802. links = m_sensorEntity->links;
  803. if (links == NULL ||
  804. links->source->entity != m_sensorEntity ||
  805. links->sink->entity != m_mipiEntity) {
  806. ALOGE("ERR(%s):Cannot make link camera sensor to mipi", __func__);
  807. goto err;
  808. }
  809. if (exynos_media_setup_link(m_media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
  810. ALOGE("ERR(%s):Cannot make setup camera sensor to mipi", __func__);
  811. goto err;
  812. }
  813. ALOGV("DEBUG(%s):[LINK SUCCESS] sensor subdev to mipi subdev", __func__);
  814. // mipi subdev to fimc-lite subdev
  815. for (i = 0; i < m_mipiEntity->num_links; i++) {
  816. links = &m_mipiEntity->links[i];
  817. ALOGV("DEBUG(%s):i=%d: links->source->entity : %p, m_mipiEntity : %p", __func__, i,
  818. links->source->entity, m_mipiEntity);
  819. ALOGV("DEBUG(%s):i=%d: links->sink->entity : %p, m_fliteSdEntity : %p", __func__, i,
  820. links->sink->entity, m_fliteSdEntity);
  821. if (links == NULL ||
  822. links->source->entity != m_mipiEntity ||
  823. links->sink->entity != m_fliteSdEntity) {
  824. continue;
  825. } else if (exynos_media_setup_link(m_media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
  826. ALOGE("ERR(%s):Cannot make setup mipi subdev to fimc-lite subdev", __func__);
  827. goto err;
  828. }
  829. }
  830. ALOGV("DEBUG(%s):[LINK SUCCESS] mipi subdev to fimc-lite subdev", __func__);
  831. // fimc-lite subdev TO fimc-lite video dev
  832. for (i = 0; i < m_fliteSdEntity->num_links; i++) {
  833. links = &m_fliteSdEntity->links[i];
  834. ALOGV("DEBUG(%s):i=%d: links->source->entity : %p, m_fliteSdEntity : %p", __func__, i,
  835. links->source->entity, m_fliteSdEntity);
  836. ALOGV("DEBUG(%s):i=%d: links->sink->entity : %p, m_fliteVdEntity : %p", __func__, i,
  837. links->sink->entity, m_fliteVdEntity);
  838. if (links == NULL ||
  839. links->source->entity != m_fliteSdEntity ||
  840. links->sink->entity != m_fliteVdEntity) {
  841. continue;
  842. } else if (exynos_media_setup_link(m_media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
  843. ALOGE("ERR(%s):Cannot make setup fimc-lite subdev to fimc-lite video dev", __func__);
  844. goto err;
  845. }
  846. }
  847. ALOGV("DEBUG(%s):[LINK SUCCESS] fimc-lite subdev to fimc-lite video dev", __func__);
  848. // fimc-lite subdev to gscaler subdev
  849. for (i = 0; i < m_gscSdEntity->num_links; i++) {
  850. links = &m_gscSdEntity->links[i];
  851. ALOGV("DEBUG(%s):i=%d: links->source->entity : %p, m_fliteSdEntity : %p", __func__, i,
  852. links->source->entity, m_fliteSdEntity);
  853. ALOGV("DEBUG(%s):i=%d: links->sink->entity : %p, m_gscSdEntity : %p", __func__, i,
  854. links->sink->entity, m_gscSdEntity);
  855. if (links == NULL ||
  856. links->source->entity != m_fliteSdEntity ||
  857. links->sink->entity != m_gscSdEntity) {
  858. continue;
  859. } else if (exynos_media_setup_link(m_media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
  860. ALOGE("ERR(%s):Cannot make setup fimc-lite subdev to gscaler subdev", __func__);
  861. goto err;
  862. }
  863. }
  864. ALOGV("DEBUG(%s):[LINK SUCCESS] fimc-lite subdev to gscaler subdev", __func__);
  865. // gscaler subdev to gscaler video dev
  866. for (i = 0; i < m_gscVdEntity->num_links; i++) {
  867. links = &m_gscVdEntity->links[i];
  868. ALOGV("DEBUG(%s):i=%d: links->source->entity : %p, m_gscSdEntity : %p", __func__, i,
  869. links->source->entity, m_gscSdEntity);
  870. ALOGV("DEBUG(%s):i=%d: links->sink->entity : %p, m_gscVdEntity : %p", __func__, i,
  871. links->sink->entity, m_gscVdEntity);
  872. if (links == NULL ||
  873. links->source->entity != m_gscSdEntity ||
  874. links->sink->entity != m_gscVdEntity) {
  875. continue;
  876. } else if (exynos_media_setup_link(m_media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
  877. ALOGE("ERR(%s):Cannot make setup gscaler subdev to gscaler video dev", __func__);
  878. goto err;
  879. }
  880. }
  881. ALOGV("DEBUG(%s):[LINK SUCCESS] gscaler subdev to gscaler video dev", __func__);
  882. sprintf(node, "%s%d", PFX_NODE, (FLITE_VD_NODE_OFFSET + VIDEO_NODE_PREVIEW_ID));
  883. m_fliteDev.fd = exynos_v4l2_open(node, O_RDWR, 0);
  884. if (m_fliteDev.fd <= 0) {
  885. ALOGE("ERR(%s):exynos_v4l2_open(%s) fail (error : %s)", __func__, node, strerror(errno));
  886. goto err;
  887. }
  888. m_previewDev = &m_fliteDev;
  889. m_videoDev = &m_fliteDev;
  890. m_pictureDev = &m_fliteDev;
  891. }
  892. m_previewDev->flagStart = false;
  893. m_videoDev->flagStart = false;
  894. m_pictureDev->flagStart = false;
  895. m_tryPreviewStop = true;
  896. m_tryVideoStop = true;
  897. m_tryPictureStop = true;
  898. m_flagStartFaceDetection = false;
  899. m_flagAutoFocusRunning = false;
  900. if (exynos_v4l2_enuminput(m_previewDev->fd, m_cameraId, m_cameraName) == false) {
  901. ALOGE("ERR(%s):exynos_v4l2_enuminput(%d, %s) fail", __func__, m_cameraId, m_cameraName);
  902. goto err;
  903. }
  904. // HACK
  905. if (m_cameraId == CAMERA_ID_BACK)
  906. strcpy(m_cameraName, "S5K4E5");
  907. else
  908. strcpy(m_cameraName, "S5K6A3");
  909. if (exynos_v4l2_s_input(m_previewDev->fd, m_cameraId) < 0) {
  910. ALOGE("ERR(%s):exynos_v4l2_s_input() fail", __func__);
  911. goto err;
  912. }
  913. if (strcmp((const char*)m_cameraName, "S5K4E5") == 0) {
  914. m_defaultCameraInfo = new ExynosCameraInfoS5K4E5;
  915. m_curCameraInfo = new ExynosCameraInfoS5K4E5;
  916. } else if (strcmp((const char*)m_cameraName, "S5K6A3") == 0) {
  917. m_defaultCameraInfo = new ExynosCameraInfoS5K6A3;
  918. m_curCameraInfo = new ExynosCameraInfoS5K6A3;
  919. } else if (strcmp((const char*)m_cameraName, "M5M0") == 0) {
  920. m_defaultCameraInfo = new ExynosCameraInfoM5M0;
  921. m_curCameraInfo = new ExynosCameraInfoM5M0;
  922. } else {
  923. ALOGE("ERR(%s):invalid camera Name (%s) fail", __func__, m_cameraName);
  924. goto err;
  925. }
  926. m_setExifFixedAttribute();
  927. m_flagCreate = true;
  928. return true;
  929. err:
  930. if (m_defaultCameraInfo)
  931. delete m_defaultCameraInfo;
  932. m_defaultCameraInfo = NULL;
  933. if (m_curCameraInfo)
  934. delete m_curCameraInfo;
  935. m_curCameraInfo = NULL;
  936. if (0 < m_videoDev->fd)
  937. exynos_v4l2_close(m_videoDev->fd);
  938. m_videoDev->fd = 0;
  939. if (0 < m_pictureDev->fd)
  940. exynos_v4l2_close(m_pictureDev->fd);
  941. m_pictureDev->fd = 0;
  942. if (0 < m_previewDev->fd)
  943. exynos_v4l2_close(m_previewDev->fd);
  944. m_previewDev->fd = 0;
  945. if (m_media)
  946. exynos_media_close(m_media);
  947. m_media = NULL;
  948. return false;
  949. }
  950. bool ExynosCamera::destroy(void)
  951. {
  952. if (m_flagCreate == false) {
  953. ALOGE("ERR(%s):Not yet created", __func__);
  954. return false;
  955. }
  956. if (m_pictureDev->flagStart == true)
  957. stopPicture();
  958. if (m_videoDev->flagStart == true)
  959. stopVideo();
  960. if (m_previewDev->flagStart == true)
  961. stopPreview();
  962. if (m_defaultCameraInfo)
  963. delete m_defaultCameraInfo;
  964. m_defaultCameraInfo = NULL;
  965. if (m_curCameraInfo)
  966. delete m_curCameraInfo;
  967. m_curCameraInfo = NULL;
  968. // close m_previewDev->fd after stopVideo() because stopVideo()
  969. // uses m_previewDev->fd to change frame rate
  970. if (0 < m_videoDev->fd)
  971. exynos_v4l2_close(m_videoDev->fd);
  972. m_videoDev->fd = 0;
  973. if (0 < m_pictureDev->fd)
  974. exynos_v4l2_close(m_pictureDev->fd);
  975. m_pictureDev->fd = 0;
  976. if (0 < m_previewDev->fd)
  977. exynos_v4l2_close(m_previewDev->fd);
  978. m_previewDev->fd = 0;
  979. if (m_media)
  980. exynos_media_close(m_media);
  981. m_media = NULL;
  982. m_flagCreate = false;
  983. return true;
  984. }
  985. bool ExynosCamera::flagCreate(void)
  986. {
  987. return m_flagCreate;
  988. }
  989. int ExynosCamera::getCameraId(void)
  990. {
  991. return m_cameraId;
  992. }
  993. char *ExynosCamera::getCameraName(void)
  994. {
  995. return m_cameraName;
  996. }
  997. int ExynosCamera::getPreviewFd(void)
  998. {
  999. return m_previewDev->fd;
  1000. }
  1001. int ExynosCamera::getPictureFd(void)
  1002. {
  1003. return m_pictureDev->fd;
  1004. }
  1005. int ExynosCamera::getVideoFd(void)
  1006. {
  1007. return m_videoDev->fd;
  1008. }
  1009. bool ExynosCamera::startPreview(void)
  1010. {
  1011. if (m_flagCreate == false) {
  1012. ALOGE("ERR(%s):Not yet Created", __func__);
  1013. return false;
  1014. }
  1015. if (m_previewDev->flagStart == false) {
  1016. if (m_setWidthHeight(PREVIEW_MODE,
  1017. m_previewDev->fd,
  1018. &m_previewDev->events,
  1019. m_curCameraInfo->previewW,
  1020. m_curCameraInfo->previewH,
  1021. m_curCameraInfo->previewColorFormat,
  1022. m_previewBuf,
  1023. m_validPreviewBuf) == false) {
  1024. ALOGE("ERR(%s):m_setWidthHeight() fail", __func__);
  1025. return false;
  1026. }
  1027. if (setPreviewFrameRate(m_curCameraInfo->fps) == false)
  1028. ALOGE("ERR(%s):Fail toggle setPreviewFrameRate(%d)",
  1029. __func__, m_curCameraInfo->fps);
  1030. if (exynos_v4l2_streamon(m_previewDev->fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) < 0) {
  1031. ALOGE("ERR(%s):exynos_v4l2_streamon() fail", __func__);
  1032. return false;
  1033. }
  1034. if (m_curCameraInfo->focusMode == FOCUS_MODE_CONTINUOUS_VIDEO
  1035. || m_curCameraInfo->focusMode == FOCUS_MODE_CONTINUOUS_PICTURE) {
  1036. if (exynos_v4l2_s_ctrl(m_previewDev->fd, V4L2_CID_CAMERA_CAF_START_STOP, CAF_START) < 0) {
  1037. ALOGE("ERR(%s):exynos_v4l2_s_ctrl() fail", __func__);
  1038. return false;
  1039. }
  1040. }
  1041. m_tryPreviewStop = false;
  1042. m_previewDev->flagStart = true;
  1043. /* TODO */
  1044. /* DIS is only supported BACK camera(4E5) currently. */
  1045. #ifdef USE_DIS
  1046. bool toggle = getVideoStabilization();
  1047. if (setVideoStabilization(toggle) == false)
  1048. ALOGE("ERR(%s):setVideoStabilization() fail", __func__);
  1049. #endif
  1050. #ifdef USE_3DNR
  1051. if (m_recordingHint == true && getCameraId() == CAMERA_ID_BACK) {
  1052. if (set3DNR(true) == false)
  1053. ALOGE("ERR(%s):set3DNR() fail", __func__);
  1054. }
  1055. #endif
  1056. #ifdef USE_ODC
  1057. if (setODC(true) == false)
  1058. ALOGE("ERR(%s):setODC() fail", __func__);
  1059. #endif
  1060. }
  1061. return true;
  1062. }
  1063. bool ExynosCamera::stopPreview(void)
  1064. {
  1065. if (m_flagCreate == false) {
  1066. ALOGE("ERR(%s):Not yet Created", __func__);
  1067. return false;
  1068. }
  1069. if (m_previewDev->flagStart == true) {
  1070. if (m_curCameraInfo->flashMode == FLASH_MODE_TORCH)
  1071. setFlashMode(FLASH_MODE_OFF);
  1072. m_tryPreviewStop = true;
  1073. // skip stopPreview
  1074. if ( (m_previewDev == m_videoDev && m_tryVideoStop == false)
  1075. || (m_previewDev == m_pictureDev && m_tryPictureStop == false))
  1076. return true;
  1077. /* TODO */
  1078. /* Can not use 3DNR, ODC and DIS function because HW problem at exynos5250 EVT0 */
  1079. #ifdef USE_3DNR
  1080. if (set3DNR(false) == false)
  1081. ALOGE("ERR(%s):set3DNR() fail", __func__);
  1082. #endif
  1083. #ifdef USE_ODC
  1084. if (setODC(false) == false)
  1085. ALOGE("ERR(%s):setODC() fail", __func__);
  1086. #endif
  1087. if (exynos_v4l2_streamoff(m_previewDev->fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) < 0) {
  1088. ALOGE("ERR(%s):exynos_v4l2_streamoff() fail", __func__);
  1089. return false;
  1090. }
  1091. struct v4l2_requestbuffers req;
  1092. req.count = 0;
  1093. req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
  1094. req.memory = V4L2_MEMORY_DMABUF;
  1095. if (exynos_v4l2_reqbufs(m_previewDev->fd, &req) < 0) {
  1096. ALOGE("ERR(%s):exynos_v4l2_reqbufs() fail", __func__);
  1097. return false;
  1098. }
  1099. m_previewDev->flagStart = false;
  1100. m_flagStartFaceDetection = false;
  1101. }
  1102. return true;
  1103. }
  1104. bool ExynosCamera::flagStartPreview(void)
  1105. {
  1106. return m_previewDev->flagStart;
  1107. }
  1108. int ExynosCamera::getPreviewMaxBuf(void)
  1109. {
  1110. return VIDEO_MAX_FRAME;
  1111. }
  1112. bool ExynosCamera::setPreviewBuf(ExynosBuffer *buf)
  1113. {
  1114. if (m_flagCreate == false) {
  1115. ALOGE("ERR(%s):Not yet created fail", __func__);
  1116. return false;
  1117. }
  1118. if (VIDEO_MAX_FRAME <= buf->reserved.p) {
  1119. ALOGE("ERR(%s):index(%d) must smaller than %d", __func__, buf->reserved.p, VIDEO_MAX_FRAME);
  1120. return false;
  1121. }
  1122. m_previewBuf[buf->reserved.p] = *buf;
  1123. // HACK : Driver not yet support cb,cr of YV12
  1124. m_previewBuf[buf->reserved.p].virt.extP[1] = buf->virt.extP[2];
  1125. m_previewBuf[buf->reserved.p].virt.extP[2] = buf->virt.extP[1];
  1126. return true;
  1127. }
  1128. bool ExynosCamera::getPreviewBuf(ExynosBuffer *buf)
  1129. {
  1130. if (m_flagCreate == false) {
  1131. ALOGE("ERR(%s):Not yet created fail", __func__);
  1132. return false;
  1133. }
  1134. if (m_previewDev->flagStart == false) {
  1135. ALOGE("ERR(%s):Not yet preview started fail", __func__);
  1136. return false;
  1137. }
  1138. struct v4l2_buffer v4l2_buf;
  1139. struct v4l2_plane planes[VIDEO_MAX_PLANES];
  1140. v4l2_buf.m.planes = planes;
  1141. v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
  1142. v4l2_buf.memory = V4L2_MEMORY_DMABUF;
  1143. v4l2_buf.length = 0;
  1144. for (int i = 0; i < 3; i++) {
  1145. if (m_previewBuf[0].size.extS[i] != 0)
  1146. v4l2_buf.length++;
  1147. }
  1148. if (exynos_v4l2_dqbuf(m_previewDev->fd, &v4l2_buf) < 0) {
  1149. ALOGE("ERR(%s):exynos_v4l2_dqbuf() fail", __func__);
  1150. return false;
  1151. }
  1152. if (VIDEO_MAX_FRAME <= v4l2_buf.index) {
  1153. ALOGE("ERR(%s):wrong index = %d", __func__, v4l2_buf.index);
  1154. return false;
  1155. }
  1156. *buf = m_previewBuf[v4l2_buf.index];
  1157. return true;
  1158. }
  1159. bool ExynosCamera::putPreviewBuf(ExynosBuffer *buf)
  1160. {
  1161. if (m_flagCreate == false) {
  1162. ALOGE("ERR(%s):Not yet created fail", __func__);
  1163. return false;
  1164. }
  1165. if (m_validPreviewBuf[buf->reserved.p] == false) {
  1166. ALOGE("ERR(%s):Invalid index(%d)", __func__, buf->reserved.p);
  1167. return false;
  1168. }
  1169. struct v4l2_buffer v4l2_buf;
  1170. struct v4l2_plane planes[VIDEO_MAX_PLANES];
  1171. v4l2_buf.m.planes = planes;
  1172. v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
  1173. v4l2_buf.memory = V4L2_MEMORY_DMABUF;
  1174. v4l2_buf.index = buf->reserved.p;
  1175. v4l2_buf.length = 0;
  1176. for (int i = 0; i < 3; i++) {
  1177. v4l2_buf.m.planes[i].m.fd= m_previewBuf[buf->reserved.p].fd.extFd[i];
  1178. v4l2_buf.m.planes[i].length = m_previewBuf[buf->reserved.p].size.extS[i];
  1179. if (m_previewBuf[buf->reserved.p].size.extS[i] != 0)
  1180. v4l2_buf.length++;
  1181. }
  1182. if (exynos_v4l2_qbuf(m_previewDev->fd, &v4l2_buf) < 0) {
  1183. ALOGE("ERR(%s):exynos_v4l2_qbuf() fail", __func__);
  1184. return false;
  1185. }
  1186. return true;
  1187. }
  1188. bool ExynosCamera::setVideoSize(int w, int h)
  1189. {
  1190. m_curCameraInfo->videoW = w;
  1191. m_curCameraInfo->videoH = h;
  1192. #ifdef USE_3DNR_DMAOUT
  1193. // HACK : Video 3dnr port support resize. So, we must make max size video w, h
  1194. m_curCameraInfo->videoW = m_defaultCameraInfo->videoW;
  1195. m_curCameraInfo->videoH = m_defaultCameraInfo->videoH;
  1196. #endif
  1197. return true;
  1198. }
  1199. bool ExynosCamera::getVideoSize(int *w, int *h)
  1200. {
  1201. *w = m_curCameraInfo->videoW;
  1202. *h = m_curCameraInfo->videoH;
  1203. return true;
  1204. }
  1205. bool ExynosCamera::setVideoFormat(int colorFormat)
  1206. {
  1207. m_curCameraInfo->videoColorFormat = colorFormat;
  1208. return true;
  1209. }
  1210. int ExynosCamera::getVideoFormat(void)
  1211. {
  1212. return m_curCameraInfo->videoColorFormat;
  1213. }
  1214. bool ExynosCamera::startVideo(void)
  1215. {
  1216. if (m_flagCreate == false) {
  1217. ALOGE("ERR(%s):Not yet Created", __func__);
  1218. return false;
  1219. }
  1220. #ifdef USE_3DNR_DMAOUT
  1221. if (m_videoDev->flagStart == false) {
  1222. if (m_setWidthHeight(VIDEO_MODE,
  1223. m_videoDev->fd,
  1224. &m_videoDev->events,
  1225. m_curCameraInfo->videoW,
  1226. m_curCameraInfo->videoH,
  1227. m_curCameraInfo->videoColorFormat,
  1228. m_videoBuf,
  1229. m_validVideoBuf) == false) {
  1230. ALOGE("ERR(%s):m_setWidthHeight() fail", __func__);
  1231. return false;
  1232. }
  1233. if (exynos_v4l2_streamon(m_videoDev->fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) < 0) {
  1234. ALOGE("ERR(%s):exynos_v4l2_streamon() fail", __func__);
  1235. return false;
  1236. }
  1237. m_tryVideoStop = false;
  1238. m_videoDev->flagStart = true;
  1239. }
  1240. #endif
  1241. return true;
  1242. }
  1243. bool ExynosCamera::stopVideo(void)
  1244. {
  1245. if (m_flagCreate == false) {
  1246. ALOGE("ERR(%s):Not yet Created", __func__);
  1247. return false;
  1248. }
  1249. if (m_videoDev->flagStart == true) {
  1250. m_tryVideoStop = true;
  1251. // skip stopVideo
  1252. if ( (m_videoDev == m_previewDev && m_tryPreviewStop == false)
  1253. || (m_videoDev == m_pictureDev && m_tryPictureStop == false))
  1254. return true;
  1255. if (exynos_v4l2_streamoff(m_videoDev->fd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) < 0) {
  1256. ALOGE("ERR(%s):exynos_v4l2_streamoff() fail", __func__);
  1257. return false;
  1258. }
  1259. struct v4l2_requestbuffers req;
  1260. req.count = 0;
  1261. req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
  1262. req.memory = V4L2_MEMORY_DMABUF;
  1263. if (exynos_v4l2_reqbufs(m_videoDev->fd, &req) < 0) {
  1264. ALOGE("ERR(%s):exynos_v4l2_reqbufs() fail", __func__);
  1265. return false;
  1266. }
  1267. m_videoDev->flagStart = false;
  1268. }
  1269. return true;
  1270. }
  1271. bool ExynosCamera::flagStartVideo(void)
  1272. {
  1273. return m_videoDev->flagStart;
  1274. }
  1275. int ExynosCamera::getVideoMaxBuf(void)
  1276. {
  1277. return VIDEO_MAX_FRAME;
  1278. }
  1279. bool ExynosCamera::setVideoBuf(ExynosBuffer *buf)
  1280. {
  1281. if (m_flagCreate == false)

Large files files are truncated, but you can click here to view the full file