PageRenderTime 35ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 1ms

/libcamera/SecCamera.cpp

https://github.com/oxygen545/android_device_samsung_infuse4g
C++ | 3191 lines | 2399 code | 603 blank | 189 comment | 454 complexity | 0c8e951b9605131b7260588ccd81c035 MD5 | raw file
  1. /*
  2. * Copyright 2008, The Android Open Source Project
  3. * Copyright 2010, Samsung Electronics Co. LTD
  4. * Copyright 2011, The CyanogenMod Project
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the "License");
  7. * you may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. /*
  19. ************************************
  20. * Filename: SecCamera.cpp
  21. * Author: Sachin P. Kamat
  22. * Purpose: This file interacts with the Camera and JPEG drivers.
  23. *************************************
  24. */
  25. //#define LOG_NDEBUG 0
  26. #define LOG_TAG "SecCamera"
  27. #include <utils/Log.h>
  28. #include <math.h>
  29. #include <string.h>
  30. #include <stdlib.h>
  31. #include <sys/poll.h>
  32. #include "SecCamera.h"
  33. #include "cutils/properties.h"
  34. using namespace android;
  35. #define CHECK(return_value) \
  36. if (return_value < 0) { \
  37. ALOGE("%s::%d fail. errno: %s, m_camera_id = %d\n", \
  38. __func__, __LINE__, strerror(errno), m_camera_id); \
  39. return -1; \
  40. }
  41. #define CHECK_PTR(return_value) \
  42. if (return_value < 0) { \
  43. ALOGE("%s::%d fail, errno: %s, m_camera_id = %d\n", \
  44. __func__,__LINE__, strerror(errno), m_camera_id); \
  45. return NULL; \
  46. }
  47. #define ALIGN_TO_32B(x) ((((x) + (1 << 5) - 1) >> 5) << 5)
  48. #define ALIGN_TO_128B(x) ((((x) + (1 << 7) - 1) >> 7) << 7)
  49. #define ALIGN_TO_8KB(x) ((((x) + (1 << 13) - 1) >> 13) << 13)
  50. namespace android {
  51. // ======================================================================
  52. // Camera controls
  53. static struct timeval time_start;
  54. static struct timeval time_stop;
  55. unsigned long measure_time(struct timeval *start, struct timeval *stop)
  56. {
  57. unsigned long sec, usec, time;
  58. sec = stop->tv_sec - start->tv_sec;
  59. if (stop->tv_usec >= start->tv_usec) {
  60. usec = stop->tv_usec - start->tv_usec;
  61. } else {
  62. usec = stop->tv_usec + 1000000 - start->tv_usec;
  63. sec--;
  64. }
  65. time = (sec * 1000000) + usec;
  66. return time;
  67. }
  68. static int get_pixel_depth(unsigned int fmt)
  69. {
  70. int depth = 0;
  71. switch (fmt) {
  72. case V4L2_PIX_FMT_NV12:
  73. depth = 12;
  74. break;
  75. case V4L2_PIX_FMT_NV12T:
  76. depth = 12;
  77. break;
  78. case V4L2_PIX_FMT_NV21:
  79. depth = 12;
  80. break;
  81. case V4L2_PIX_FMT_YUV420:
  82. depth = 12;
  83. break;
  84. case V4L2_PIX_FMT_RGB565:
  85. case V4L2_PIX_FMT_YUYV:
  86. case V4L2_PIX_FMT_YVYU:
  87. case V4L2_PIX_FMT_UYVY:
  88. case V4L2_PIX_FMT_VYUY:
  89. case V4L2_PIX_FMT_NV16:
  90. case V4L2_PIX_FMT_NV61:
  91. case V4L2_PIX_FMT_YUV422P:
  92. depth = 16;
  93. break;
  94. case V4L2_PIX_FMT_RGB32:
  95. depth = 32;
  96. break;
  97. }
  98. return depth;
  99. }
  100. #define ALIGN_W(x) (((x) + 0x7F) & (~0x7F)) // Set as multiple of 128
  101. #define ALIGN_H(x) (((x) + 0x1F) & (~0x1F)) // Set as multiple of 32
  102. #define ALIGN_BUF(x) (((x) + 0x1FFF)& (~0x1FFF)) // Set as multiple of 8K
  103. static int fimc_poll(struct pollfd *events)
  104. {
  105. int ret;
  106. /* 10 second delay is because sensor can take a long time
  107. * to do auto focus and capture in dark settings
  108. */
  109. ret = poll(events, 1, 10000);
  110. if (ret < 0) {
  111. ALOGE("ERR(%s):poll error\n", __func__);
  112. return ret;
  113. }
  114. if (ret == 0) {
  115. ALOGE("ERR(%s):No data in 10 secs..\n", __func__);
  116. return ret;
  117. }
  118. return ret;
  119. }
  120. int SecCamera::previewPoll(bool preview)
  121. {
  122. int ret;
  123. if (preview) {
  124. #ifdef ENABLE_ESD_PREVIEW_CHECK
  125. int status = 0;
  126. if (!(++m_esd_check_count % 60)) {
  127. status = getCameraSensorESDStatus();
  128. m_esd_check_count = 0;
  129. if (status) {
  130. ALOGE("ERR(%s) ESD status(%d)", __func__, status);
  131. return status;
  132. }
  133. }
  134. #endif
  135. ret = poll(&m_events_c, 1, 1000);
  136. } else {
  137. ret = poll(&m_events_c2, 1, 1000);
  138. }
  139. if (ret < 0) {
  140. ALOGE("ERR(%s):poll error\n", __func__);
  141. return ret;
  142. }
  143. if (ret == 0) {
  144. ALOGE("ERR(%s):No data in 1 secs.. Camera Device Reset \n", __func__);
  145. return ret;
  146. }
  147. return ret;
  148. }
  149. static int fimc_v4l2_querycap(int fp)
  150. {
  151. struct v4l2_capability cap;
  152. int ret = 0;
  153. ret = ioctl(fp, VIDIOC_QUERYCAP, &cap);
  154. if (ret < 0) {
  155. ALOGE("ERR(%s):VIDIOC_QUERYCAP failed\n", __func__);
  156. return -1;
  157. }
  158. if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
  159. ALOGE("ERR(%s):no capture devices\n", __func__);
  160. return -1;
  161. }
  162. return ret;
  163. }
  164. static const __u8* fimc_v4l2_enuminput(int fp, int index)
  165. {
  166. static struct v4l2_input input;
  167. input.index = index;
  168. if (ioctl(fp, VIDIOC_ENUMINPUT, &input) != 0) {
  169. ALOGE("ERR(%s):No matching index found\n", __func__);
  170. return NULL;
  171. }
  172. ALOGI("Name of input channel[%d] is %s\n", input.index, input.name);
  173. return input.name;
  174. }
  175. static int fimc_v4l2_s_input(int fp, int index)
  176. {
  177. struct v4l2_input input;
  178. int ret;
  179. input.index = index;
  180. ret = ioctl(fp, VIDIOC_S_INPUT, &input);
  181. if (ret < 0) {
  182. ALOGE("ERR(%s):VIDIOC_S_INPUT failed\n", __func__);
  183. return ret;
  184. }
  185. return ret;
  186. }
  187. static int fimc_v4l2_s_fmt(int fp, int width, int height, unsigned int fmt, int flag_capture)
  188. {
  189. struct v4l2_format v4l2_fmt;
  190. struct v4l2_pix_format pixfmt;
  191. int ret;
  192. v4l2_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  193. memset(&pixfmt, 0, sizeof(pixfmt));
  194. pixfmt.width = width;
  195. pixfmt.height = height;
  196. pixfmt.pixelformat = fmt;
  197. pixfmt.sizeimage = (width * height * get_pixel_depth(fmt)) / 8;
  198. pixfmt.field = V4L2_FIELD_NONE;
  199. v4l2_fmt.fmt.pix = pixfmt;
  200. /* Set up for capture */
  201. ret = ioctl(fp, VIDIOC_S_FMT, &v4l2_fmt);
  202. if (ret < 0) {
  203. ALOGE("ERR(%s):VIDIOC_S_FMT failed\n", __func__);
  204. return -1;
  205. }
  206. return 0;
  207. }
  208. static int fimc_v4l2_s_fmt_cap(int fp, int width, int height, unsigned int fmt)
  209. {
  210. struct v4l2_format v4l2_fmt;
  211. struct v4l2_pix_format pixfmt;
  212. int ret;
  213. memset(&pixfmt, 0, sizeof(pixfmt));
  214. v4l2_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  215. pixfmt.width = width;
  216. pixfmt.height = height;
  217. pixfmt.pixelformat = fmt;
  218. if (fmt == V4L2_PIX_FMT_JPEG) {
  219. pixfmt.colorspace = V4L2_COLORSPACE_JPEG;
  220. }
  221. pixfmt.sizeimage = (width * height * get_pixel_depth(fmt)) / 8;
  222. v4l2_fmt.fmt.pix = pixfmt;
  223. //ALOGE("ori_w %d, ori_h %d, w %d, h %d\n", width, height, v4l2_fmt.fmt.pix.width, v4l2_fmt.fmt.pix.height);
  224. /* Set up for capture */
  225. ret = ioctl(fp, VIDIOC_S_FMT, &v4l2_fmt);
  226. if (ret < 0) {
  227. ALOGE("ERR(%s):VIDIOC_S_FMT failed\n", __func__);
  228. return ret;
  229. }
  230. return ret;
  231. }
  232. static int fimc_v4l2_enum_fmt(int fp, unsigned int fmt)
  233. {
  234. struct v4l2_fmtdesc fmtdesc;
  235. int found = 0;
  236. fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  237. fmtdesc.index = 0;
  238. while (ioctl(fp, VIDIOC_ENUM_FMT, &fmtdesc) == 0) {
  239. if (fmtdesc.pixelformat == fmt) {
  240. ALOGV("passed fmt = %#x found pixel format[%d]: %s\n", fmt, fmtdesc.index, fmtdesc.description);
  241. found = 1;
  242. break;
  243. }
  244. fmtdesc.index++;
  245. }
  246. if (!found) {
  247. ALOGE("unsupported pixel format\n");
  248. return -1;
  249. }
  250. return 0;
  251. }
  252. static int fimc_v4l2_reqbufs(int fp, enum v4l2_buf_type type, int nr_bufs)
  253. {
  254. struct v4l2_requestbuffers req;
  255. int ret;
  256. req.count = nr_bufs;
  257. req.type = type;
  258. req.memory = V4L2_MEMORY_MMAP;
  259. ret = ioctl(fp, VIDIOC_REQBUFS, &req);
  260. if (ret < 0) {
  261. ALOGE("ERR(%s):VIDIOC_REQBUFS failed\n", __func__);
  262. return -1;
  263. }
  264. return req.count;
  265. }
  266. static int fimc_v4l2_querybuf(int fp, struct fimc_buffer *buffer, enum v4l2_buf_type type)
  267. {
  268. struct v4l2_buffer v4l2_buf;
  269. int ret;
  270. ALOGI("%s :", __func__);
  271. v4l2_buf.type = type;
  272. v4l2_buf.memory = V4L2_MEMORY_MMAP;
  273. v4l2_buf.index = 0;
  274. ret = ioctl(fp , VIDIOC_QUERYBUF, &v4l2_buf);
  275. if (ret < 0) {
  276. ALOGE("ERR(%s):VIDIOC_QUERYBUF failed\n", __func__);
  277. return -1;
  278. }
  279. buffer->length = v4l2_buf.length;
  280. if ((buffer->start = (char *)mmap(0, v4l2_buf.length,
  281. PROT_READ | PROT_WRITE, MAP_SHARED,
  282. fp, v4l2_buf.m.offset)) < 0) {
  283. ALOGE("%s %d] mmap() failed\n",__func__, __LINE__);
  284. return -1;
  285. }
  286. ALOGI("%s: buffer->start = %p v4l2_buf.length = %d",
  287. __func__, buffer->start, v4l2_buf.length);
  288. return 0;
  289. }
  290. static int fimc_v4l2_streamon(int fp)
  291. {
  292. enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  293. int ret;
  294. ret = ioctl(fp, VIDIOC_STREAMON, &type);
  295. if (ret < 0) {
  296. ALOGE("ERR(%s):VIDIOC_STREAMON failed\n", __func__);
  297. return ret;
  298. }
  299. return ret;
  300. }
  301. static int fimc_v4l2_streamoff(int fp)
  302. {
  303. enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  304. int ret;
  305. ALOGV("%s :", __func__);
  306. ret = ioctl(fp, VIDIOC_STREAMOFF, &type);
  307. if (ret < 0) {
  308. ALOGE("ERR(%s):VIDIOC_STREAMOFF failed\n", __func__);
  309. return ret;
  310. }
  311. return ret;
  312. }
  313. static int fimc_v4l2_qbuf(int fp, int index)
  314. {
  315. struct v4l2_buffer v4l2_buf;
  316. int ret;
  317. v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  318. v4l2_buf.memory = V4L2_MEMORY_MMAP;
  319. v4l2_buf.index = index;
  320. ret = ioctl(fp, VIDIOC_QBUF, &v4l2_buf);
  321. if (ret < 0) {
  322. ALOGE("ERR(%s):VIDIOC_QBUF failed\n", __func__);
  323. return ret;
  324. }
  325. return 0;
  326. }
  327. static int fimc_v4l2_dqbuf(int fp)
  328. {
  329. struct v4l2_buffer v4l2_buf;
  330. int ret;
  331. v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  332. v4l2_buf.memory = V4L2_MEMORY_MMAP;
  333. ret = ioctl(fp, VIDIOC_DQBUF, &v4l2_buf);
  334. if (ret < 0) {
  335. ALOGE("ERR(%s):VIDIOC_DQBUF failed, dropped frame\n", __func__);
  336. return ret;
  337. }
  338. return v4l2_buf.index;
  339. }
  340. static int fimc_v4l2_g_ctrl(int fp, unsigned int id)
  341. {
  342. struct v4l2_control ctrl;
  343. int ret;
  344. ctrl.id = id;
  345. ret = ioctl(fp, VIDIOC_G_CTRL, &ctrl);
  346. if (ret < 0) {
  347. ALOGE("ERR(%s): VIDIOC_G_CTRL(id = 0x%x (%d)) failed, ret = %d\n",
  348. __func__, id, id-V4L2_CID_PRIVATE_BASE, ret);
  349. return ret;
  350. }
  351. return ctrl.value;
  352. }
  353. static int fimc_v4l2_s_ctrl(int fp, unsigned int id, unsigned int value)
  354. {
  355. struct v4l2_control ctrl;
  356. int ret;
  357. ctrl.id = id;
  358. ctrl.value = value;
  359. ret = ioctl(fp, VIDIOC_S_CTRL, &ctrl);
  360. if (ret < 0) {
  361. ALOGE("ERR(%s):VIDIOC_S_CTRL(id = %#x (%d), value = %d) failed ret = %d\n",
  362. __func__, id, id-V4L2_CID_PRIVATE_BASE, value, ret);
  363. return ret;
  364. }
  365. return ctrl.value;
  366. }
  367. static int fimc_v4l2_s_ext_ctrl(int fp, unsigned int id, void *value)
  368. {
  369. struct v4l2_ext_controls ctrls;
  370. struct v4l2_ext_control ctrl;
  371. int ret;
  372. ctrl.id = id;
  373. ctrl.string = (char *) value;
  374. ctrls.ctrl_class = V4L2_CTRL_CLASS_CAMERA;
  375. ctrls.count = 1;
  376. ctrls.controls = &ctrl;
  377. ret = ioctl(fp, VIDIOC_S_EXT_CTRLS, &ctrls);
  378. if (ret < 0)
  379. ALOGE("ERR(%s):VIDIOC_S_EXT_CTRLS failed\n", __func__);
  380. return ret;
  381. }
  382. static int fimc_v4l2_g_parm(int fp, struct v4l2_streamparm *streamparm)
  383. {
  384. int ret;
  385. streamparm->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  386. ret = ioctl(fp, VIDIOC_G_PARM, streamparm);
  387. if (ret < 0) {
  388. ALOGE("ERR(%s):VIDIOC_G_PARM failed\n", __func__);
  389. return -1;
  390. }
  391. ALOGV("%s : timeperframe: numerator %d, denominator %d\n", __func__,
  392. streamparm->parm.capture.timeperframe.numerator,
  393. streamparm->parm.capture.timeperframe.denominator);
  394. return 0;
  395. }
  396. static int fimc_v4l2_s_parm(int fp, struct v4l2_streamparm *streamparm)
  397. {
  398. int ret;
  399. streamparm->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  400. ret = ioctl(fp, VIDIOC_S_PARM, streamparm);
  401. if (ret < 0) {
  402. ALOGE("ERR(%s):VIDIOC_S_PARM failed\n", __func__);
  403. return ret;
  404. }
  405. return 0;
  406. }
  407. // ======================================================================
  408. // Constructor & Destructor
  409. SecCamera::SecCamera() :
  410. m_flag_init(0),
  411. m_camera_id(CAMERA_ID_BACK),
  412. m_cam_fd(-1),
  413. m_cam_fd2(-1),
  414. m_preview_v4lformat(V4L2_PIX_FMT_NV21),
  415. m_preview_width (0),
  416. m_preview_height (0),
  417. m_preview_max_width (MAX_BACK_CAMERA_PREVIEW_WIDTH),
  418. m_preview_max_height (MAX_BACK_CAMERA_PREVIEW_HEIGHT),
  419. m_snapshot_v4lformat(-1),
  420. m_snapshot_width (0),
  421. m_snapshot_height (0),
  422. m_snapshot_max_width (MAX_BACK_CAMERA_SNAPSHOT_WIDTH),
  423. m_snapshot_max_height (MAX_BACK_CAMERA_SNAPSHOT_HEIGHT),
  424. m_angle(-1),
  425. m_anti_banding(-1),
  426. m_wdr(-1),
  427. m_anti_shake(-1),
  428. m_zoom_level(-1),
  429. m_object_tracking(-1),
  430. m_smart_auto(-1),
  431. m_beauty_shot(-1),
  432. m_vintage_mode(-1),
  433. m_face_detect(-1),
  434. m_gps_enabled(false),
  435. m_gps_latitude(-1),
  436. m_gps_longitude(-1),
  437. m_gps_altitude(-1),
  438. m_gps_timestamp(-1),
  439. m_vtmode(0),
  440. m_sensor_mode(-1),
  441. m_shot_mode(-1),
  442. m_exif_orientation(-1),
  443. m_blur_level(-1),
  444. m_chk_dataline(-1),
  445. m_video_gamma(-1),
  446. m_slow_ae(-1),
  447. m_camera_af_flag(-1),
  448. m_flag_camera_start(0),
  449. m_jpeg_thumbnail_width (0),
  450. m_jpeg_thumbnail_height(0),
  451. m_jpeg_quality(100)
  452. #ifdef ENABLE_ESD_PREVIEW_CHECK
  453. ,
  454. m_esd_check_count(0)
  455. #endif // ENABLE_ESD_PREVIEW_CHECK
  456. {
  457. m_params = (struct sec_cam_parm*)&m_streamparm.parm.raw_data;
  458. struct v4l2_captureparm capture;
  459. m_params->capture.timeperframe.numerator = 1;
  460. m_params->capture.timeperframe.denominator = 0;
  461. m_params->contrast = -1;
  462. m_params->effects = -1;
  463. m_params->brightness = -1;
  464. m_params->flash_mode = -1;
  465. m_params->focus_mode = -1;
  466. m_params->iso = -1;
  467. m_params->metering = -1;
  468. m_params->saturation = -1;
  469. m_params->scene_mode = -1;
  470. m_params->sharpness = -1;
  471. m_params->white_balance = -1;
  472. memset(&m_capture_buf, 0, sizeof(m_capture_buf));
  473. ALOGV("%s :", __func__);
  474. }
  475. SecCamera::~SecCamera()
  476. {
  477. ALOGV("%s :", __func__);
  478. }
  479. int SecCamera::initCamera(int index)
  480. {
  481. ALOGV("%s :", __func__);
  482. int ret = 0;
  483. if (!m_flag_init) {
  484. /* Arun C
  485. * Reset the lense position only during camera starts; don't do
  486. * reset between shot to shot
  487. */
  488. m_camera_af_flag = -1;
  489. m_cam_fd = open(CAMERA_DEV_NAME, O_RDWR);
  490. if (m_cam_fd < 0) {
  491. ALOGE("ERR(%s):Cannot open %s (error : %s)\n", __func__, CAMERA_DEV_NAME, strerror(errno));
  492. return -1;
  493. }
  494. ALOGV("%s: open(%s) --> m_cam_fd %d", __FUNCTION__, CAMERA_DEV_NAME, m_cam_fd);
  495. ALOGE("initCamera: m_cam_fd(%d), m_jpeg_fd(%d)", m_cam_fd, m_jpeg_fd);
  496. ret = fimc_v4l2_querycap(m_cam_fd);
  497. CHECK(ret);
  498. if (!fimc_v4l2_enuminput(m_cam_fd, index))
  499. return -1;
  500. ret = fimc_v4l2_s_input(m_cam_fd, index);
  501. CHECK(ret);
  502. m_cam_fd2 = open(CAMERA_DEV_NAME2, O_RDWR);
  503. ALOGV("%s: open(%s) --> m_cam_fd2 = %d", __FUNCTION__, CAMERA_DEV_NAME2, m_cam_fd2);
  504. if (m_cam_fd2 < 0) {
  505. ALOGE("ERR(%s):Cannot open %s (error : %s)\n", __func__, CAMERA_DEV_NAME2, strerror(errno));
  506. return -1;
  507. }
  508. ALOGE("initCamera: m_cam_fd2(%d)", m_cam_fd2);
  509. ret = fimc_v4l2_querycap(m_cam_fd2);
  510. CHECK(ret);
  511. if (!fimc_v4l2_enuminput(m_cam_fd2, index))
  512. return -1;
  513. ret = fimc_v4l2_s_input(m_cam_fd2, index);
  514. CHECK(ret);
  515. m_camera_id = index;
  516. switch (m_camera_id) {
  517. case CAMERA_ID_FRONT:
  518. m_preview_max_width = MAX_FRONT_CAMERA_PREVIEW_WIDTH;
  519. m_preview_max_height = MAX_FRONT_CAMERA_PREVIEW_HEIGHT;
  520. m_snapshot_max_width = MAX_FRONT_CAMERA_SNAPSHOT_WIDTH;
  521. m_snapshot_max_height = MAX_FRONT_CAMERA_SNAPSHOT_HEIGHT;
  522. break;
  523. case CAMERA_ID_BACK:
  524. m_preview_max_width = MAX_BACK_CAMERA_PREVIEW_WIDTH;
  525. m_preview_max_height = MAX_BACK_CAMERA_PREVIEW_HEIGHT;
  526. m_snapshot_max_width = MAX_BACK_CAMERA_SNAPSHOT_WIDTH;
  527. m_snapshot_max_height = MAX_BACK_CAMERA_SNAPSHOT_HEIGHT;
  528. break;
  529. }
  530. setExifFixedAttribute();
  531. m_flag_init = 1;
  532. ALOGI("%s : initialized", __FUNCTION__);
  533. }
  534. return 0;
  535. }
  536. void SecCamera::resetCamera()
  537. {
  538. ALOGV("%s :", __func__);
  539. DeinitCamera();
  540. initCamera(m_camera_id);
  541. }
  542. void SecCamera::DeinitCamera()
  543. {
  544. ALOGV("%s :", __func__);
  545. if (m_flag_init) {
  546. stopRecord();
  547. /* close m_cam_fd after stopRecord() because stopRecord()
  548. * uses m_cam_fd to change frame rate
  549. */
  550. ALOGI("DeinitCamera: m_cam_fd(%d)", m_cam_fd);
  551. if (m_cam_fd > -1) {
  552. close(m_cam_fd);
  553. m_cam_fd = -1;
  554. }
  555. ALOGI("DeinitCamera: m_cam_fd2(%d)", m_cam_fd2);
  556. if (m_cam_fd2 > -1) {
  557. close(m_cam_fd2);
  558. m_cam_fd2 = -1;
  559. }
  560. m_flag_init = 0;
  561. }
  562. else ALOGI("%s : already deinitialized", __FUNCTION__);
  563. }
  564. int SecCamera::getCameraFd(void)
  565. {
  566. return m_cam_fd;
  567. }
  568. // ======================================================================
  569. // Preview
  570. int SecCamera::startPreview(void)
  571. {
  572. v4l2_streamparm streamparm;
  573. struct sec_cam_parm *parms;
  574. parms = (struct sec_cam_parm*)&streamparm.parm.raw_data;
  575. ALOGV("%s :", __func__);
  576. // aleady started
  577. if (m_flag_camera_start > 0) {
  578. ALOGE("ERR(%s):Preview was already started\n", __func__);
  579. return 0;
  580. }
  581. if (m_cam_fd <= 0) {
  582. ALOGE("ERR(%s):Camera was closed\n", __func__);
  583. return -1;
  584. }
  585. memset(&m_events_c, 0, sizeof(m_events_c));
  586. m_events_c.fd = m_cam_fd;
  587. m_events_c.events = POLLIN | POLLERR;
  588. /* enum_fmt, s_fmt sample */
  589. int ret = fimc_v4l2_enum_fmt(m_cam_fd,m_preview_v4lformat);
  590. CHECK(ret);
  591. ret = fimc_v4l2_s_fmt(m_cam_fd, m_preview_width,m_preview_height,m_preview_v4lformat, 0);
  592. CHECK(ret);
  593. ret = fimc_v4l2_reqbufs(m_cam_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, MAX_BUFFERS);
  594. CHECK(ret);
  595. ALOGV("%s : m_preview_width: %d m_preview_height: %d m_angle: %d\n",
  596. __func__, m_preview_width, m_preview_height, m_angle);
  597. ret = fimc_v4l2_s_ctrl(m_cam_fd,
  598. V4L2_CID_CAMERA_CHECK_DATALINE, m_chk_dataline);
  599. CHECK(ret);
  600. /* start with all buffers in queue */
  601. for (int i = 0; i < MAX_BUFFERS; i++) {
  602. ret = fimc_v4l2_qbuf(m_cam_fd, i);
  603. CHECK(ret);
  604. }
  605. if (m_camera_id == CAMERA_ID_BACK) {
  606. // Init some parameters required for CE147
  607. // Force antibanding for back camera - only value supported
  608. m_anti_banding = ANTI_BANDING_50HZ;
  609. // It doesn't hurt to keep these on as the kernel camera driver only
  610. // enables it when recording HD video. Turning it on before recording
  611. // doesn't work because it needs to be set before the preview is started.
  612. m_video_gamma = GAMMA_ON;
  613. m_slow_ae = SLOW_AE_ON;
  614. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ANTI_BANDING, m_anti_banding);
  615. CHECK(ret);
  616. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ISO, m_params->iso);
  617. CHECK(ret);
  618. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_BRIGHTNESS, m_params->brightness);
  619. CHECK(ret);
  620. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE, m_params->capture.timeperframe.denominator);
  621. CHECK(ret);
  622. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_METERING, m_params->metering);
  623. CHECK(ret);
  624. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_GAMMA, m_video_gamma);
  625. CHECK(ret);
  626. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_SLOW_AE, m_slow_ae);
  627. CHECK(ret);
  628. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_EFFECT, m_params->effects);
  629. CHECK(ret);
  630. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_WHITE_BALANCE, m_params->white_balance);
  631. CHECK(ret);
  632. }
  633. ret = fimc_v4l2_streamon(m_cam_fd);
  634. CHECK(ret);
  635. if (m_camera_id == CAMERA_ID_BACK) {
  636. // More parameters for CE147
  637. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FOCUS_MODE, m_params->focus_mode);
  638. CHECK(ret);
  639. m_face_detect = 0;
  640. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FACE_DETECTION, m_face_detect);
  641. CHECK(ret);
  642. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SHARPNESS, m_params->sharpness);
  643. CHECK(ret);
  644. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SATURATION, m_params->saturation);
  645. CHECK(ret);
  646. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_CONTRAST, m_params->contrast);
  647. CHECK(ret);
  648. // TODO
  649. m_beauty_shot = 0;
  650. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_BEAUTY_SHOT, m_beauty_shot);
  651. CHECK(ret);
  652. m_zoom_level = 0;
  653. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ZOOM, m_zoom_level);
  654. CHECK(ret);
  655. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_BATCH_REFLECTION, 1);
  656. CHECK(ret);
  657. }
  658. m_flag_camera_start = 1;
  659. if (m_camera_id == CAMERA_ID_FRONT) {
  660. /* Activate preview mode */
  661. ALOGV("activate preview mode for front camera");
  662. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAM_PREVIEW_ONOFF,
  663. 1);
  664. CHECK(ret);
  665. }
  666. ret = fimc_v4l2_s_parm(m_cam_fd, &m_streamparm);
  667. CHECK(ret);
  668. #ifdef HAVE_FLASH
  669. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FLASH_MODE, m_params->flash_mode);
  670. CHECK(ret);
  671. #endif
  672. // It is a delay for a new frame, not to show the previous bigger ugly picture frame.
  673. ret = fimc_poll(&m_events_c);
  674. CHECK(ret);
  675. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_RETURN_FOCUS, 0);
  676. CHECK(ret);
  677. ALOGV("%s: got the first frame of the preview\n", __func__);
  678. return 0;
  679. }
  680. int SecCamera::stopPreview(void)
  681. {
  682. int ret;
  683. ALOGV("%s :", __func__);
  684. if (m_flag_camera_start == 0) {
  685. ALOGW("%s: doing nothing because m_flag_camera_start is zero", __func__);
  686. return 0;
  687. }
  688. if (m_params->flash_mode == FLASH_MODE_TORCH)
  689. setFlashMode(FLASH_MODE_OFF);
  690. if (m_cam_fd <= 0) {
  691. ALOGE("ERR(%s):Camera was closed\n", __func__);
  692. return -1;
  693. }
  694. ret = fimc_v4l2_streamoff(m_cam_fd);
  695. CHECK(ret);
  696. m_flag_camera_start = 0;
  697. return ret;
  698. }
  699. //Recording
  700. int SecCamera::startRecord(void)
  701. {
  702. int ret, i;
  703. ALOGV("%s :", __func__);
  704. // aleady started
  705. if (m_flag_record_start > 0) {
  706. ALOGE("ERR(%s):Preview was already started\n", __func__);
  707. return 0;
  708. }
  709. if (m_cam_fd2 <= 0) {
  710. ALOGE("ERR(%s):Camera was closed\n", __func__);
  711. return -1;
  712. }
  713. /* enum_fmt, s_fmt sample */
  714. ret = fimc_v4l2_enum_fmt(m_cam_fd2, V4L2_PIX_FMT_NV12T);
  715. CHECK(ret);
  716. ALOGI("%s: m_recording_width = %d, m_recording_height = %d\n",
  717. __func__, m_recording_width, m_recording_height);
  718. if (m_camera_id == CAMERA_ID_BACK) {
  719. // Some properties for back camera video recording
  720. setISO(ISO_MOVIE);
  721. setMetering(METERING_MATRIX);
  722. setBatchReflection();
  723. }
  724. ret = fimc_v4l2_s_fmt(m_cam_fd2, m_recording_width,
  725. m_recording_height, V4L2_PIX_FMT_NV12T, 0);
  726. CHECK(ret);
  727. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE,
  728. m_params->capture.timeperframe.denominator);
  729. CHECK(ret);
  730. ret = fimc_v4l2_reqbufs(m_cam_fd2, V4L2_BUF_TYPE_VIDEO_CAPTURE, MAX_BUFFERS);
  731. CHECK(ret);
  732. /* start with all buffers in queue */
  733. for (i = 0; i < MAX_BUFFERS; i++) {
  734. ret = fimc_v4l2_qbuf(m_cam_fd2, i);
  735. CHECK(ret);
  736. }
  737. ret = fimc_v4l2_streamon(m_cam_fd2);
  738. CHECK(ret);
  739. // Get and throw away the first frame since it is often garbled.
  740. memset(&m_events_c2, 0, sizeof(m_events_c2));
  741. m_events_c2.fd = m_cam_fd2;
  742. m_events_c2.events = POLLIN | POLLERR;
  743. ret = fimc_poll(&m_events_c2);
  744. CHECK(ret);
  745. // Continuous autofocus for main camera
  746. if (m_camera_id == CAMERA_ID_BACK) {
  747. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_CAF_START_STOP, 1);
  748. CHECK(ret);
  749. }
  750. m_flag_record_start = 1;
  751. return 0;
  752. }
  753. int SecCamera::stopRecord(void)
  754. {
  755. int ret;
  756. ALOGV("%s :", __func__);
  757. if (m_flag_record_start == 0) {
  758. ALOGW("%s: doing nothing because m_flag_record_start is zero", __func__);
  759. return 0;
  760. }
  761. if (m_cam_fd2 <= 0) {
  762. ALOGE("ERR(%s):Camera was closed\n", __func__);
  763. return -1;
  764. }
  765. // Continuous autofocus for main camera
  766. if (m_camera_id == CAMERA_ID_BACK) {
  767. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_CAF_START_STOP, 0);
  768. CHECK(ret);
  769. // Need to switch focus mode so that the camera can focus properly
  770. // after using caf.
  771. // Note: This bug is not affected when the original mode is macro
  772. // so we can safely use that as a mode to switch to.
  773. int orig_mode = m_params->focus_mode;
  774. setFocusMode(FOCUS_MODE_MACRO);
  775. setFocusMode(orig_mode);
  776. }
  777. m_flag_record_start = 0;
  778. ret = fimc_v4l2_streamoff(m_cam_fd2);
  779. CHECK(ret);
  780. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE,
  781. FRAME_RATE_AUTO);
  782. CHECK(ret);
  783. // Properties for back camera non-video recording
  784. if (m_camera_id == CAMERA_ID_BACK) {
  785. setISO(ISO_AUTO);
  786. setMetering(METERING_CENTER);
  787. setBatchReflection();
  788. }
  789. return 0;
  790. }
  791. unsigned int SecCamera::getRecPhyAddrY(int index)
  792. {
  793. unsigned int addr_y;
  794. addr_y = fimc_v4l2_s_ctrl(m_cam_fd2, V4L2_CID_PADDR_Y, index);
  795. CHECK((int)addr_y);
  796. return addr_y;
  797. }
  798. unsigned int SecCamera::getRecPhyAddrC(int index)
  799. {
  800. unsigned int addr_c;
  801. addr_c = fimc_v4l2_s_ctrl(m_cam_fd2, V4L2_CID_PADDR_CBCR, index);
  802. CHECK((int)addr_c);
  803. return addr_c;
  804. }
  805. unsigned int SecCamera::getPhyAddrY(int index)
  806. {
  807. unsigned int addr_y;
  808. addr_y = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_PADDR_Y, index);
  809. CHECK((int)addr_y);
  810. return addr_y;
  811. }
  812. unsigned int SecCamera::getPhyAddrC(int index)
  813. {
  814. unsigned int addr_c;
  815. addr_c = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_PADDR_CBCR, index);
  816. CHECK((int)addr_c);
  817. return addr_c;
  818. }
  819. void SecCamera::pausePreview()
  820. {
  821. fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_STREAM_PAUSE, 0);
  822. }
  823. int SecCamera::getPreview()
  824. {
  825. int index;
  826. int ret;
  827. if (m_flag_camera_start == 0 || previewPoll(true) == 0) {
  828. ALOGE("ERR(%s):Start Camera Device Reset \n", __func__);
  829. /* GAUDI Project([arun.c@samsung.com]) 2010.05.20. [Implemented ESD code] */
  830. /*
  831. * When there is no data for more than 1 second from the camera we inform
  832. * the FIMC driver by calling fimc_v4l2_s_input() with a special value = 1000
  833. * FIMC driver identify that there is something wrong with the camera
  834. * and it restarts the sensor.
  835. */
  836. stopPreview();
  837. /* Reset Only Camera Device */
  838. ret = fimc_v4l2_querycap(m_cam_fd);
  839. CHECK(ret);
  840. if (fimc_v4l2_enuminput(m_cam_fd, m_camera_id))
  841. return -1;
  842. ret = fimc_v4l2_s_input(m_cam_fd, 1000);
  843. CHECK(ret);
  844. ret = startPreview();
  845. if (ret < 0) {
  846. ALOGE("ERR(%s): startPreview() return %d\n", __func__, ret);
  847. return 0;
  848. }
  849. }
  850. index = fimc_v4l2_dqbuf(m_cam_fd);
  851. if (!(0 <= index && index < MAX_BUFFERS)) {
  852. ALOGE("ERR(%s):wrong index = %d\n", __func__, index);
  853. return -1;
  854. }
  855. ret = fimc_v4l2_qbuf(m_cam_fd, index);
  856. CHECK(ret);
  857. return index;
  858. }
  859. int SecCamera::getRecordFrame()
  860. {
  861. if (m_flag_record_start == 0) {
  862. ALOGE("%s: m_flag_record_start is 0", __func__);
  863. return -1;
  864. }
  865. previewPoll(false);
  866. return fimc_v4l2_dqbuf(m_cam_fd2);
  867. }
  868. int SecCamera::releaseRecordFrame(int index)
  869. {
  870. if (!m_flag_record_start) {
  871. /* this can happen when recording frames are returned after
  872. * the recording is stopped at the driver level. we don't
  873. * need to return the buffers in this case and we've seen
  874. * cases where fimc could crash if we called qbuf and it
  875. * wasn't expecting it.
  876. */
  877. ALOGI("%s: recording not in progress, ignoring", __func__);
  878. return 0;
  879. }
  880. return fimc_v4l2_qbuf(m_cam_fd2, index);
  881. }
  882. int SecCamera::setPreviewSize(int width, int height, int pixel_format)
  883. {
  884. ALOGV("%s(width(%d), height(%d), format(%d))", __func__, width, height, pixel_format);
  885. int v4lpixelformat = pixel_format;
  886. #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
  887. if (v4lpixelformat == V4L2_PIX_FMT_YUV420)
  888. ALOGV("PreviewFormat:V4L2_PIX_FMT_YUV420");
  889. else if (v4lpixelformat == V4L2_PIX_FMT_NV12)
  890. ALOGV("PreviewFormat:V4L2_PIX_FMT_NV12");
  891. else if (v4lpixelformat == V4L2_PIX_FMT_NV12T)
  892. ALOGV("PreviewFormat:V4L2_PIX_FMT_NV12T");
  893. else if (v4lpixelformat == V4L2_PIX_FMT_NV21)
  894. ALOGV("PreviewFormat:V4L2_PIX_FMT_NV21");
  895. else if (v4lpixelformat == V4L2_PIX_FMT_YUV422P)
  896. ALOGV("PreviewFormat:V4L2_PIX_FMT_YUV422P");
  897. else if (v4lpixelformat == V4L2_PIX_FMT_YUYV)
  898. ALOGV("PreviewFormat:V4L2_PIX_FMT_YUYV");
  899. else if (v4lpixelformat == V4L2_PIX_FMT_RGB565)
  900. ALOGV("PreviewFormat:V4L2_PIX_FMT_RGB565");
  901. else
  902. ALOGV("PreviewFormat:UnknownFormat");
  903. #endif
  904. m_preview_width = width;
  905. m_preview_height = height;
  906. m_preview_v4lformat = v4lpixelformat;
  907. return 0;
  908. }
  909. int SecCamera::getPreviewSize(int *width, int *height, int *frame_size)
  910. {
  911. *width = m_preview_width;
  912. *height = m_preview_height;
  913. *frame_size = m_frameSize(m_preview_v4lformat, m_preview_width, m_preview_height);
  914. return 0;
  915. }
  916. int SecCamera::getPreviewMaxSize(int *width, int *height)
  917. {
  918. *width = m_preview_max_width;
  919. *height = m_preview_max_height;
  920. return 0;
  921. }
  922. int SecCamera::getPreviewPixelFormat(void)
  923. {
  924. return m_preview_v4lformat;
  925. }
  926. // ======================================================================
  927. // Snapshot
  928. /*
  929. * Devide getJpeg() as two funcs, setSnapshotCmd() & getJpeg() because of the shutter sound timing.
  930. * Here, just send the capture cmd to camera ISP to start JPEG capture.
  931. */
  932. int SecCamera::setSnapshotCmd(void)
  933. {
  934. ALOGV("%s :", __func__);
  935. int ret = 0;
  936. LOG_TIME_DEFINE(0)
  937. LOG_TIME_DEFINE(1)
  938. if (m_cam_fd <= 0) {
  939. ALOGE("ERR(%s):Camera was closed\n", __func__);
  940. return 0;
  941. }
  942. if (m_flag_camera_start > 0) {
  943. LOG_TIME_START(0)
  944. ALOGW("WARN(%s):Camera was in preview, should have been stopped\n", __func__);
  945. stopPreview();
  946. LOG_TIME_END(0)
  947. }
  948. memset(&m_events_c, 0, sizeof(m_events_c));
  949. m_events_c.fd = m_cam_fd;
  950. m_events_c.events = POLLIN | POLLERR;
  951. LOG_TIME_START(1) // prepare
  952. int nframe = 1;
  953. ret = fimc_v4l2_enum_fmt(m_cam_fd,m_snapshot_v4lformat);
  954. CHECK(ret);
  955. ret = fimc_v4l2_s_fmt_cap(m_cam_fd, m_snapshot_width, m_snapshot_height, V4L2_PIX_FMT_JPEG);
  956. CHECK(ret);
  957. ret = fimc_v4l2_reqbufs(m_cam_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, nframe);
  958. CHECK(ret);
  959. ret = fimc_v4l2_querybuf(m_cam_fd, &m_capture_buf, V4L2_BUF_TYPE_VIDEO_CAPTURE);
  960. CHECK(ret);
  961. ret = fimc_v4l2_qbuf(m_cam_fd, 0);
  962. CHECK(ret);
  963. ret = fimc_v4l2_streamon(m_cam_fd);
  964. CHECK(ret);
  965. // Orientation
  966. int orientation;
  967. switch (m_exif_orientation) {
  968. case 0:
  969. orientation = EXIF_ORIENTATION_UP;
  970. break;
  971. case 90:
  972. orientation = EXIF_ORIENTATION_90;
  973. break;
  974. case 180:
  975. orientation = EXIF_ORIENTATION_180;
  976. break;
  977. case 270:
  978. orientation = EXIF_ORIENTATION_270;
  979. break;
  980. default:
  981. orientation = EXIF_ORIENTATION_UP;
  982. break;
  983. }
  984. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_EXIF_ORIENTATION, orientation);
  985. CHECK(ret);
  986. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_CAPTURE, 0);
  987. CHECK(ret);
  988. LOG_TIME_END(1)
  989. return 0;
  990. }
  991. int SecCamera::endSnapshot(void)
  992. {
  993. int ret;
  994. ALOGI("%s :", __func__);
  995. if (m_capture_buf.start) {
  996. munmap(m_capture_buf.start, m_capture_buf.length);
  997. ALOGI("munmap():virt. addr %p size = %d\n",
  998. m_capture_buf.start, m_capture_buf.length);
  999. m_capture_buf.start = NULL;
  1000. m_capture_buf.length = 0;
  1001. }
  1002. return 0;
  1003. }
  1004. /*
  1005. * Set Jpeg quality & exif info and get JPEG data from camera ISP
  1006. */
  1007. unsigned char* SecCamera::getJpeg(int *jpeg_size, unsigned int *phyaddr)
  1008. {
  1009. ALOGV("%s :", __func__);
  1010. int index, ret = 0;
  1011. unsigned char *addr;
  1012. LOG_TIME_DEFINE(2)
  1013. // capture
  1014. ret = fimc_poll(&m_events_c);
  1015. CHECK_PTR(ret);
  1016. index = fimc_v4l2_dqbuf(m_cam_fd);
  1017. if (index != 0) {
  1018. ALOGE("ERR(%s):wrong index = %d\n", __func__, index);
  1019. return NULL;
  1020. }
  1021. *jpeg_size = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAM_JPEG_MAIN_SIZE);
  1022. CHECK_PTR(*jpeg_size);
  1023. int main_offset = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAM_JPEG_MAIN_OFFSET);
  1024. CHECK_PTR(main_offset);
  1025. m_postview_offset = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAM_JPEG_POSTVIEW_OFFSET);
  1026. CHECK_PTR(m_postview_offset);
  1027. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_STREAM_PAUSE, 0);
  1028. CHECK_PTR(ret);
  1029. ALOGV("\nsnapshot dqueued buffer = %d snapshot_width = %d snapshot_height = %d, size = %d\n\n",
  1030. index, m_snapshot_width, m_snapshot_height, *jpeg_size);
  1031. addr = (unsigned char*)(m_capture_buf.start) + main_offset;
  1032. *phyaddr = getPhyAddrY(index) + m_postview_offset;
  1033. LOG_TIME_START(2) // post
  1034. ret = fimc_v4l2_streamoff(m_cam_fd);
  1035. CHECK_PTR(ret);
  1036. LOG_TIME_END(2)
  1037. return addr;
  1038. }
  1039. int SecCamera::getExif(unsigned char *pExifDst, unsigned char *pThumbSrc)
  1040. {
  1041. JpegEncoder jpgEnc;
  1042. //FIXME: Disabled thumbnails for now as they're always green
  1043. #if 0
  1044. ALOGV("%s : m_jpeg_thumbnail_width = %d, height = %d",
  1045. __func__, m_jpeg_thumbnail_width, m_jpeg_thumbnail_height);
  1046. if ((m_jpeg_thumbnail_width > 0) && (m_jpeg_thumbnail_height > 0)) {
  1047. int inFormat = JPG_MODESEL_YCBCR;
  1048. int outFormat = JPG_422;
  1049. switch (m_snapshot_v4lformat) {
  1050. case V4L2_PIX_FMT_NV12:
  1051. case V4L2_PIX_FMT_NV21:
  1052. case V4L2_PIX_FMT_NV12T:
  1053. case V4L2_PIX_FMT_YUV420:
  1054. outFormat = JPG_420;
  1055. break;
  1056. case V4L2_PIX_FMT_YUYV:
  1057. case V4L2_PIX_FMT_UYVY:
  1058. case V4L2_PIX_FMT_YUV422P:
  1059. outFormat = JPG_422;
  1060. break;
  1061. }
  1062. if (jpgEnc.setConfig(JPEG_SET_ENCODE_IN_FORMAT, inFormat) != JPG_SUCCESS)
  1063. return -1;
  1064. if (jpgEnc.setConfig(JPEG_SET_SAMPING_MODE, outFormat) != JPG_SUCCESS)
  1065. return -1;
  1066. if (jpgEnc.setConfig(JPEG_SET_ENCODE_QUALITY, JPG_QUALITY_LEVEL_2) != JPG_SUCCESS)
  1067. return -1;
  1068. int thumbWidth, thumbHeight, thumbSrcSize;
  1069. getThumbnailConfig(&thumbWidth, &thumbHeight, &thumbSrcSize);
  1070. if (jpgEnc.setConfig(JPEG_SET_ENCODE_WIDTH, thumbWidth) != JPG_SUCCESS)
  1071. return -1;
  1072. if (jpgEnc.setConfig(JPEG_SET_ENCODE_HEIGHT, thumbHeight) != JPG_SUCCESS)
  1073. return -1;
  1074. char *pInBuf = (char *)jpgEnc.getInBuf(thumbSrcSize);
  1075. if (pInBuf == NULL)
  1076. return -1;
  1077. memcpy(pInBuf, pThumbSrc, thumbSrcSize);
  1078. unsigned int thumbSize;
  1079. jpgEnc.encode(&thumbSize, NULL);
  1080. ALOGV("%s : enableThumb set to true", __func__);
  1081. mExifInfo.enableThumb = true;
  1082. } else {
  1083. #endif
  1084. ALOGV("%s : enableThumb set to false", __func__);
  1085. mExifInfo.enableThumb = false;
  1086. #if 0
  1087. }
  1088. #endif
  1089. unsigned int exifSize;
  1090. setExifChangedAttribute();
  1091. ALOGV("%s: calling jpgEnc.makeExif, mExifInfo.width set to %d, height to %d\n",
  1092. __func__, mExifInfo.width, mExifInfo.height);
  1093. jpgEnc.makeExif(pExifDst, &mExifInfo, &exifSize, true);
  1094. return exifSize;
  1095. }
  1096. void SecCamera::getPostViewConfig(int *width, int *height, int *size)
  1097. {
  1098. if (m_preview_width == 1024) {
  1099. *width = BACK_CAMERA_POSTVIEW_WIDE_WIDTH;
  1100. *height = BACK_CAMERA_POSTVIEW_HEIGHT;
  1101. *size = BACK_CAMERA_POSTVIEW_WIDE_WIDTH * BACK_CAMERA_POSTVIEW_HEIGHT * BACK_CAMERA_POSTVIEW_BPP / 8;
  1102. } else {
  1103. *width = BACK_CAMERA_POSTVIEW_WIDTH;
  1104. *height = BACK_CAMERA_POSTVIEW_HEIGHT;
  1105. *size = BACK_CAMERA_POSTVIEW_WIDTH * BACK_CAMERA_POSTVIEW_HEIGHT * BACK_CAMERA_POSTVIEW_BPP / 8;
  1106. }
  1107. ALOGV("[5B] m_preview_width : %d, mPostViewWidth = %d mPostViewHeight = %d mPostViewSize = %d",
  1108. m_preview_width, *width, *height, *size);
  1109. }
  1110. void SecCamera::getThumbnailConfig(int *width, int *height, int *size)
  1111. {
  1112. if (m_camera_id == CAMERA_ID_BACK) {
  1113. *width = BACK_CAMERA_THUMBNAIL_WIDTH;
  1114. *height = BACK_CAMERA_THUMBNAIL_HEIGHT;
  1115. *size = BACK_CAMERA_THUMBNAIL_WIDTH * BACK_CAMERA_THUMBNAIL_HEIGHT
  1116. * BACK_CAMERA_THUMBNAIL_BPP / 8;
  1117. } else {
  1118. *width = FRONT_CAMERA_THUMBNAIL_WIDTH;
  1119. *height = FRONT_CAMERA_THUMBNAIL_HEIGHT;
  1120. *size = FRONT_CAMERA_THUMBNAIL_WIDTH * FRONT_CAMERA_THUMBNAIL_HEIGHT
  1121. * FRONT_CAMERA_THUMBNAIL_BPP / 8;
  1122. }
  1123. }
  1124. int SecCamera::getPostViewOffset(void)
  1125. {
  1126. return m_postview_offset;
  1127. }
  1128. int SecCamera::getSnapshotAndJpeg(unsigned char *yuv_buf, unsigned char *jpeg_buf,
  1129. unsigned int *output_size)
  1130. {
  1131. ALOGV("%s :", __func__);
  1132. int index;
  1133. //unsigned int addr;
  1134. unsigned char *addr;
  1135. int ret = 0;
  1136. LOG_TIME_DEFINE(0)
  1137. LOG_TIME_DEFINE(1)
  1138. LOG_TIME_DEFINE(2)
  1139. LOG_TIME_DEFINE(3)
  1140. LOG_TIME_DEFINE(4)
  1141. LOG_TIME_DEFINE(5)
  1142. //fimc_v4l2_streamoff(m_cam_fd); [zzangdol] remove - it is separate in HWInterface with camera_id
  1143. if (m_cam_fd <= 0) {
  1144. ALOGE("ERR(%s):Camera was closed\n", __func__);
  1145. return -1;
  1146. }
  1147. if (m_flag_camera_start > 0) {
  1148. LOG_TIME_START(0)
  1149. ALOGW("WARN(%s):Camera was in preview, should have been stopped\n", __func__);
  1150. stopPreview();
  1151. LOG_TIME_END(0)
  1152. }
  1153. memset(&m_events_c, 0, sizeof(m_events_c));
  1154. m_events_c.fd = m_cam_fd;
  1155. m_events_c.events = POLLIN | POLLERR;
  1156. #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
  1157. if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV420)
  1158. ALOGV("SnapshotFormat:V4L2_PIX_FMT_YUV420");
  1159. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12)
  1160. ALOGV("SnapshotFormat:V4L2_PIX_FMT_NV12");
  1161. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12T)
  1162. ALOGV("SnapshotFormat:V4L2_PIX_FMT_NV12T");
  1163. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV21)
  1164. ALOGV("SnapshotFormat:V4L2_PIX_FMT_NV21");
  1165. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV422P)
  1166. ALOGV("SnapshotFormat:V4L2_PIX_FMT_YUV422P");
  1167. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUYV)
  1168. ALOGV("SnapshotFormat:V4L2_PIX_FMT_YUYV");
  1169. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_UYVY)
  1170. ALOGV("SnapshotFormat:V4L2_PIX_FMT_UYVY");
  1171. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_RGB565)
  1172. ALOGV("SnapshotFormat:V4L2_PIX_FMT_RGB565");
  1173. else
  1174. ALOGV("SnapshotFormat:UnknownFormat");
  1175. #endif
  1176. LOG_TIME_START(1) // prepare
  1177. int nframe = 1;
  1178. ret = fimc_v4l2_enum_fmt(m_cam_fd,m_snapshot_v4lformat);
  1179. CHECK(ret);
  1180. ret = fimc_v4l2_s_fmt_cap(m_cam_fd, m_snapshot_width, m_snapshot_height, m_snapshot_v4lformat);
  1181. CHECK(ret);
  1182. ret = fimc_v4l2_reqbufs(m_cam_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, nframe);
  1183. CHECK(ret);
  1184. ret = fimc_v4l2_querybuf(m_cam_fd, &m_capture_buf, V4L2_BUF_TYPE_VIDEO_CAPTURE);
  1185. CHECK(ret);
  1186. ret = fimc_v4l2_qbuf(m_cam_fd, 0);
  1187. CHECK(ret);
  1188. ret = fimc_v4l2_streamon(m_cam_fd);
  1189. CHECK(ret);
  1190. LOG_TIME_END(1)
  1191. LOG_TIME_START(2) // capture
  1192. fimc_poll(&m_events_c);
  1193. index = fimc_v4l2_dqbuf(m_cam_fd);
  1194. fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_STREAM_PAUSE, 0);
  1195. ALOGV("\nsnapshot dequeued buffer = %d snapshot_width = %d snapshot_height = %d\n\n",
  1196. index, m_snapshot_width, m_snapshot_height);
  1197. LOG_TIME_END(2)
  1198. ALOGI("%s : calling memcpy from m_capture_buf", __func__);
  1199. memcpy(yuv_buf, (unsigned char*)m_capture_buf.start, m_snapshot_width * m_snapshot_height * 2);
  1200. LOG_TIME_START(5) // post
  1201. fimc_v4l2_streamoff(m_cam_fd);
  1202. LOG_TIME_END(5)
  1203. LOG_CAMERA("getSnapshotAndJpeg intervals : stopPreview(%lu), prepare(%lu),"
  1204. " capture(%lu), memcpy(%lu), yuv2Jpeg(%lu), post(%lu) us",
  1205. LOG_TIME(0), LOG_TIME(1), LOG_TIME(2), LOG_TIME(3), LOG_TIME(4), LOG_TIME(5));
  1206. /* JPEG encoding */
  1207. JpegEncoder jpgEnc;
  1208. int inFormat = JPG_MODESEL_YCBCR;
  1209. int outFormat = JPG_422;
  1210. switch (m_snapshot_v4lformat) {
  1211. case V4L2_PIX_FMT_NV12:
  1212. case V4L2_PIX_FMT_NV21:
  1213. case V4L2_PIX_FMT_NV12T:
  1214. case V4L2_PIX_FMT_YUV420:
  1215. outFormat = JPG_420;
  1216. break;
  1217. case V4L2_PIX_FMT_YUYV:
  1218. case V4L2_PIX_FMT_UYVY:
  1219. case V4L2_PIX_FMT_YUV422P:
  1220. default:
  1221. outFormat = JPG_422;
  1222. break;
  1223. }
  1224. if (jpgEnc.setConfig(JPEG_SET_ENCODE_IN_FORMAT, inFormat) != JPG_SUCCESS)
  1225. ALOGE("[JPEG_SET_ENCODE_IN_FORMAT] Error\n");
  1226. if (jpgEnc.setConfig(JPEG_SET_SAMPING_MODE, outFormat) != JPG_SUCCESS)
  1227. ALOGE("[JPEG_SET_SAMPING_MODE] Error\n");
  1228. image_quality_type_t jpegQuality;
  1229. if (m_jpeg_quality >= 90)
  1230. jpegQuality = JPG_QUALITY_LEVEL_1;
  1231. else if (m_jpeg_quality >= 80)
  1232. jpegQuality = JPG_QUALITY_LEVEL_2;
  1233. else if (m_jpeg_quality >= 70)
  1234. jpegQuality = JPG_QUALITY_LEVEL_3;
  1235. else
  1236. jpegQuality = JPG_QUALITY_LEVEL_4;
  1237. if (jpgEnc.setConfig(JPEG_SET_ENCODE_QUALITY, jpegQuality) != JPG_SUCCESS)
  1238. ALOGE("[JPEG_SET_ENCODE_QUALITY] Error\n");
  1239. if (jpgEnc.setConfig(JPEG_SET_ENCODE_WIDTH, m_snapshot_width) != JPG_SUCCESS)
  1240. ALOGE("[JPEG_SET_ENCODE_WIDTH] Error\n");
  1241. if (jpgEnc.setConfig(JPEG_SET_ENCODE_HEIGHT, m_snapshot_height) != JPG_SUCCESS)
  1242. ALOGE("[JPEG_SET_ENCODE_HEIGHT] Error\n");
  1243. unsigned int snapshot_size = m_snapshot_width * m_snapshot_height * 2;
  1244. unsigned char *pInBuf = (unsigned char *)jpgEnc.getInBuf(snapshot_size);
  1245. if (pInBuf == NULL) {
  1246. ALOGE("JPEG input buffer is NULL!!\n");
  1247. return -1;
  1248. }
  1249. memcpy(pInBuf, yuv_buf, snapshot_size);
  1250. setExifChangedAttribute();
  1251. jpgEnc.encode(output_size, NULL);
  1252. uint64_t outbuf_size;
  1253. unsigned char *pOutBuf = (unsigned char *)jpgEnc.getOutBuf(&outbuf_size);
  1254. if (pOutBuf == NULL) {
  1255. ALOGE("JPEG output buffer is NULL!!\n");
  1256. return -1;
  1257. }
  1258. memcpy(jpeg_buf, pOutBuf, outbuf_size);
  1259. return 0;
  1260. }
  1261. int SecCamera::setSnapshotSize(int width, int height)
  1262. {
  1263. ALOGV("%s(width(%d), height(%d))", __func__, width, height);
  1264. m_snapshot_width = width;
  1265. m_snapshot_height = height;
  1266. return 0;
  1267. }
  1268. int SecCamera::getSnapshotSize(int *width, int *height, int *frame_size)
  1269. {
  1270. *width = m_snapshot_width;
  1271. *height = m_snapshot_height;
  1272. int frame = 0;
  1273. frame = m_frameSize(m_snapshot_v4lformat, m_snapshot_width, m_snapshot_height);
  1274. // set it big.
  1275. if (frame == 0)
  1276. frame = m_snapshot_width * m_snapshot_height * BPP;
  1277. *frame_size = frame;
  1278. return 0;
  1279. }
  1280. int SecCamera::getSnapshotMaxSize(int *width, int *height)
  1281. {
  1282. switch (m_camera_id) {
  1283. case CAMERA_ID_FRONT:
  1284. m_snapshot_max_width = MAX_FRONT_CAMERA_SNAPSHOT_WIDTH;
  1285. m_snapshot_max_height = MAX_FRONT_CAMERA_SNAPSHOT_HEIGHT;
  1286. break;
  1287. default:
  1288. case CAMERA_ID_BACK:
  1289. m_snapshot_max_width = MAX_BACK_CAMERA_SNAPSHOT_WIDTH;
  1290. m_snapshot_max_height = MAX_BACK_CAMERA_SNAPSHOT_HEIGHT;
  1291. break;
  1292. }
  1293. *width = m_snapshot_max_width;
  1294. *height = m_snapshot_max_height;
  1295. return 0;
  1296. }
  1297. int SecCamera::setSnapshotPixelFormat(int pixel_format)
  1298. {
  1299. int v4lpixelformat= pixel_format;
  1300. if (m_snapshot_v4lformat != v4lpixelformat) {
  1301. m_snapshot_v4lformat = v4lpixelformat;
  1302. }
  1303. #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
  1304. if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV420)
  1305. ALOGE("%s : SnapshotFormat:V4L2_PIX_FMT_YUV420", __func__);
  1306. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12)
  1307. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV12", __func__);
  1308. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12T)
  1309. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV12T", __func__);
  1310. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV21)
  1311. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV21", __func__);
  1312. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV422P)
  1313. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_YUV422P", __func__);
  1314. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUYV)
  1315. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_YUYV", __func__);
  1316. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_UYVY)
  1317. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_UYVY", __func__);
  1318. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_RGB565)
  1319. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_RGB565", __func__);
  1320. else
  1321. ALOGD("SnapshotFormat:UnknownFormat");
  1322. #endif
  1323. return 0;
  1324. }
  1325. int SecCamera::getSnapshotPixelFormat(void)
  1326. {
  1327. return m_snapshot_v4lformat;
  1328. }
  1329. // ======================================================================
  1330. // Settings
  1331. int SecCamera::getCameraId(void)
  1332. {
  1333. return m_camera_id;
  1334. }
  1335. // -----------------------------------
  1336. int SecCamera::setAutofocus(void)
  1337. {
  1338. ALOGV("%s :", __func__);
  1339. if (m_cam_fd <= 0) {
  1340. ALOGE("ERR(%s):Camera was closed\n", __func__);
  1341. return -1;
  1342. }
  1343. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_AUTO_FOCUS, AUTO_FOCUS_ON) < 0) {
  1344. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_AUTO_FOCUS", __func__);
  1345. return -1;
  1346. }
  1347. return 0;
  1348. }
  1349. int SecCamera::getAutoFocusResult(void)
  1350. {
  1351. int af_result = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAMERA_AUTO_FOCUS_RESULT_FIRST);
  1352. ALOGV("%s : AF was successful, returning %d", __func__, af_result);
  1353. return af_result;
  1354. }
  1355. int SecCamera::cancelAutofocus(void)
  1356. {
  1357. ALOGV("%s :", __func__);
  1358. if (m_cam_fd <= 0) {
  1359. ALOGE("ERR(%s):Camera was closed\n", __func__);
  1360. return -1;
  1361. }
  1362. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_AUTO_FOCUS, AUTO_FOCUS_OFF) < 0) {
  1363. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_AUTO_FOCUS", __func__);
  1364. return -1;
  1365. }
  1366. return 0;
  1367. }
  1368. // -----------------------------------
  1369. int SecCamera::zoomIn(void)
  1370. {
  1371. ALOGV("%s :", __func__);
  1372. return 0;
  1373. }
  1374. int SecCamera::zoomOut(void)
  1375. {
  1376. ALOGV("%s :", __func__);
  1377. return 0;
  1378. }
  1379. // -----------------------------------
  1380. int SecCamera::SetRotate(int angle)
  1381. {
  1382. ALOGE("%s(angle(%d))", __func__, angle);
  1383. if (m_angle != angle) {
  1384. switch (angle) {
  1385. case -360:
  1386. case 0:
  1387. case 360:
  1388. m_angle = 0;
  1389. break;
  1390. case -270:
  1391. case 90:
  1392. m_angle = 90;
  1393. break;
  1394. case -180:
  1395. case 180:
  1396. m_angle = 180;
  1397. break;
  1398. case -90:
  1399. case 270:
  1400. m_angle = 270;
  1401. break;
  1402. default:
  1403. ALOGE("ERR(%s):Invalid angle(%d)", __func__, angle);
  1404. return -1;
  1405. }
  1406. if (m_flag_camera_start) {
  1407. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_ROTATION, angle) < 0) {
  1408. ALOGE("ERR(%s):Fail on V4L2_CID_ROTATION", __func__);
  1409. return -1;
  1410. }
  1411. }
  1412. }
  1413. return 0;
  1414. }
  1415. int SecCamera::getRotate(void)
  1416. {
  1417. ALOGV("%s : angle(%d)", __func__, m_angle);
  1418. return m_angle;
  1419. }
  1420. int SecCamera::setFrameRate(int frame_rate)
  1421. {
  1422. ALOGV("%s(FrameRate(%d))", __func__, frame_rate);
  1423. if (frame_rate < FRAME_RATE_AUTO || FRAME_RATE_MAX < frame_rate )
  1424. ALOGE("ERR(%s):Invalid frame_rate(%d)", __func__, frame_rate);
  1425. if (m_params->capture.timeperframe.denominator != (unsigned)frame_rate) {
  1426. m_params->capture.timeperframe.denominator = frame_rate;
  1427. if (m_flag_camera_start) {
  1428. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE, frame_rate) < 0) {
  1429. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FRAME_RATE", __func__);
  1430. return -1;
  1431. }
  1432. }
  1433. }
  1434. return 0;
  1435. }
  1436. // -----------------------------------
  1437. int SecCamera::setVerticalMirror(void)
  1438. {
  1439. ALOGV("%s :", __func__);
  1440. if (m_cam_fd <= 0) {
  1441. ALOGE("ERR(%s):Camera was closed\n", __func__);
  1442. return -1;
  1443. }
  1444. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_VFLIP, 0) < 0) {
  1445. ALOGE("ERR(%s):Fail on V4L2_CID_VFLIP", __func__);
  1446. return -1;
  1447. }
  1448. return 0;
  1449. }
  1450. int SecCamera::setHorizontalMirror(void)
  1451. {
  1452. ALOGV("%s :", __func__);
  1453. if (m_cam_fd <= 0) {
  1454. ALOGE("ERR(%s):Camera was closed\n", __func__);
  1455. return -1;
  1456. }
  1457. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_HFLIP, 0) < 0) {
  1458. ALOGE("ERR(%s):Fail on V4L2_CID_HFLIP", __func__);
  1459. return -1;
  1460. }
  1461. return 0;
  1462. }
  1463. // -----------------------------------
  1464. int SecCamera::setWhiteBalance(int white_balance)
  1465. {
  1466. ALOGV("%s(white_balance(%d))", __func__, white_balance);
  1467. if (white_balance <= WHITE_BALANCE_BASE || WHITE_BALANCE_MAX <= white_balance) {
  1468. ALOGE("ERR(%s):Invalid white_balance(%d)", __func__, white_balance);
  1469. return -1;
  1470. }
  1471. if (m_params->white_balance != white_balance) {
  1472. m_params->white_balance = white_balance;
  1473. if (m_flag_camera_start) {
  1474. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_WHITE_BALANCE, white_balance) < 0) {
  1475. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_WHITE_BALANCE", __func__);
  1476. return -1;
  1477. }
  1478. }
  1479. }
  1480. return 0;
  1481. }
  1482. int SecCamera::getWhiteBalance(void)
  1483. {
  1484. ALOGV("%s : white_balance(%d)", __func__, m_params->white_balance);
  1485. return m_params->white_balance;
  1486. }
  1487. // -----------------------------------
  1488. int SecCamera::setBrightness(int brightness)
  1489. {
  1490. ALOGV("%s(brightness(%d))", __func__, brightness);
  1491. brightness += EV_DEFAULT;
  1492. if (brightness < EV_MINUS_4 || EV_PLUS_4 < brightness) {
  1493. ALOGE("ERR(%s):Invalid brightness(%d)", __func__, brightness);
  1494. return -1;
  1495. }
  1496. if (m_params->brightness != brightness) {
  1497. m_params->brightness = brightness;
  1498. if (m_flag_camera_start) {
  1499. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_BRIGHTNESS, brightness) < 0) {
  1500. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_BRIGHTNESS", __func__);
  1501. return -1;
  1502. }
  1503. }
  1504. }
  1505. return 0;
  1506. }
  1507. int SecCamera::getBrightness(void)
  1508. {
  1509. ALOGV("%s : brightness(%d)", __func__, m_params->brightness);
  1510. return m_params->brightness;
  1511. }
  1512. // -----------------------------------
  1513. int SecCamera::setImageEffect(int image_effect)
  1514. {
  1515. ALOGV("%s(image_effect(%d))", __func__, image_effect);
  1516. if (image_effect <= IMAGE_EFFECT_BASE || IMAGE_EFFECT_MAX <= image_effect) {
  1517. ALOGE("ERR(%s):Invalid image_effect(%d)", __func__, image_effect);
  1518. return -1;
  1519. }
  1520. if (m_params->effects != image_effect) {
  1521. m_params->effects = image_effect;
  1522. if (m_flag_camera_start) {
  1523. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_EFFECT, image_effect) < 0) {
  1524. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_EFFECT", __func__);
  1525. return -1;
  1526. }
  1527. }
  1528. }
  1529. return 0;
  1530. }
  1531. int SecCamera::getImageEffect(void)
  1532. {
  1533. ALOGV("%s : image_effect(%d)", __func__, m_params->effects);
  1534. return m_params->effects;
  1535. }
  1536. // ======================================================================
  1537. int SecCamera::setAntiBanding(int anti_banding)
  1538. {
  1539. ALOGV("%s(anti_banding(%d))", __func__, anti_banding);
  1540. if (anti_banding < ANTI_BANDING_AUTO || ANTI_BANDING_OFF < anti_banding) {
  1541. ALOGE("ERR(%s):Invalid anti_banding (%d)", __func__, anti_banding);
  1542. return -1;
  1543. }
  1544. if (m_anti_banding != anti_banding) {
  1545. m_anti_banding = anti_banding;
  1546. if (m_flag_camera_start) {
  1547. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ANTI_BANDING, anti_banding) < 0) {
  1548. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_ANTI_BANDING", __func__);
  1549. return -1;
  1550. }
  1551. }
  1552. }
  1553. return 0;
  1554. }
  1555. //======================================================================
  1556. int SecCamera::setSceneMode(int scene_mode)
  1557. {
  1558. ALOGV("%s(scene_mode(%d))", __func__, scene_mode);
  1559. if (scene_mode <= SCENE_MODE_BASE || SCENE_MODE_MAX <= scene_mode) {
  1560. ALOGE("ERR(%s):Invalid scene_mode (%d)", __func__, scene_mode);
  1561. return -1;
  1562. }
  1563. if (m_params->scene_mode != scene_mode) {
  1564. m_params->scene_mode = scene_mode;
  1565. if (m_flag_camera_start) {
  1566. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SCENE_MODE, scene_mode) < 0) {
  1567. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SCENE_MODE", __func__);
  1568. return -1;
  1569. }
  1570. }
  1571. }
  1572. return 0;
  1573. }
  1574. int SecCamera::getSceneMode(void)
  1575. {
  1576. return m_params->scene_mode;
  1577. }
  1578. //======================================================================
  1579. int SecCamera::setFlashMode(int flash_mode)
  1580. {
  1581. ALOGV("%s(flash_mode(%d))", __func__, flash_mode);
  1582. if (flash_mode <= FLASH_MODE_BASE || FLASH_MODE_MAX <= flash_mode) {
  1583. ALOGE("ERR(%s):Invalid flash_mode (%d)", __func__, flash_mode);
  1584. return -1;
  1585. }
  1586. if (m_params->flash_mode != flash_mode) {
  1587. if (m_flag_camera_start) {
  1588. m_params->flash_mode = flash_mode;
  1589. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FLASH_MODE, flash_mode) < 0) {
  1590. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FLASH_MODE", __func__);
  1591. return -1;
  1592. }
  1593. }
  1594. }
  1595. return 0;
  1596. }
  1597. int SecCamera::getFlashMode(void)
  1598. {
  1599. return m_params->flash_mode;
  1600. }
  1601. //======================================================================
  1602. int SecCamera::setISO(int iso_value)
  1603. {
  1604. ALOGV("%s(iso_value(%d))", __func__, iso_value);
  1605. if (iso_value < ISO_AUTO || ISO_MAX <= iso_value) {
  1606. ALOGE("ERR(%s):Invalid iso_value (%d)", __func__, iso_value);
  1607. return -1;
  1608. }
  1609. if (m_params->iso != iso_value) {
  1610. m_params->iso = iso_value;
  1611. if (m_flag_camera_start) {
  1612. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ISO, iso_value) < 0) {
  1613. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_ISO", __func__);
  1614. return -1;
  1615. }
  1616. }
  1617. }
  1618. return 0;
  1619. }
  1620. int SecCamera::getISO(void)
  1621. {
  1622. return m_params->iso;
  1623. }
  1624. //======================================================================
  1625. int SecCamera::setContrast(int contrast_value)
  1626. {
  1627. ALOGV("%s(contrast_value(%d))", __func__, contrast_value);
  1628. if (contrast_value < CONTRAST_MINUS_2 || CONTRAST_MAX <= contrast_value) {
  1629. ALOGE("ERR(%s):Invalid contrast_value (%d)", __func__, contrast_value);
  1630. return -1;
  1631. }
  1632. if (m_params->contrast != contrast_value) {
  1633. m_params->contrast = contrast_value;
  1634. if (m_flag_camera_start) {
  1635. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_CONTRAST, contrast_value) < 0) {
  1636. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_CONTRAST", __func__);
  1637. return -1;
  1638. }
  1639. }
  1640. }
  1641. return 0;
  1642. }
  1643. int SecCamera::getContrast(void)
  1644. {
  1645. return m_params->contrast;
  1646. }
  1647. //======================================================================
  1648. int SecCamera::setSaturation(int saturation_value)
  1649. {
  1650. ALOGV("%s(saturation_value(%d))", __func__, saturation_value);
  1651. if (saturation_value <SATURATION_MINUS_2 || SATURATION_MAX<= saturation_value) {
  1652. ALOGE("ERR(%s):Invalid saturation_value (%d)", __func__, saturation_value);
  1653. return -1;
  1654. }
  1655. if (m_params->saturation != saturation_value) {
  1656. m_params->saturation = saturation_value;
  1657. if (m_flag_camera_start) {
  1658. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SATURATION, saturation_value) < 0) {
  1659. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SATURATION", __func__);
  1660. return -1;
  1661. }
  1662. }
  1663. }
  1664. return 0;
  1665. }
  1666. int SecCamera::getSaturation(void)
  1667. {
  1668. return m_params->saturation;
  1669. }
  1670. //======================================================================
  1671. int SecCamera::setSharpness(int sharpness_value)
  1672. {
  1673. ALOGV("%s(sharpness_value(%d))", __func__, sharpness_value);
  1674. if (sharpness_value < SHARPNESS_MINUS_2 || SHARPNESS_MAX <= sharpness_value) {
  1675. ALOGE("ERR(%s):Invalid sharpness_value (%d)", __func__, sharpness_value);
  1676. return -1;
  1677. }
  1678. if (m_params->sharpness != sharpness_value) {
  1679. m_params->sharpness = sharpness_value;
  1680. if (m_flag_camera_start) {
  1681. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SHARPNESS, sharpness_value) < 0) {
  1682. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SHARPNESS", __func__);
  1683. return -1;
  1684. }
  1685. }
  1686. }
  1687. return 0;
  1688. }
  1689. int SecCamera::getSharpness(void)
  1690. {
  1691. return m_params->sharpness;
  1692. }
  1693. //======================================================================
  1694. int SecCamera::setWDR(int wdr_value)
  1695. {
  1696. ALOGV("%s(wdr_value(%d))", __func__, wdr_value);
  1697. if (wdr_value < WDR_OFF || WDR_MAX <= wdr_value) {
  1698. ALOGE("ERR(%s):Invalid wdr_value (%d)", __func__, wdr_value);
  1699. return -1;
  1700. }
  1701. if (m_wdr != wdr_value) {
  1702. m_wdr = wdr_value;
  1703. if (m_flag_camera_start) {
  1704. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_WDR, wdr_value) < 0) {
  1705. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_WDR", __func__);
  1706. return -1;
  1707. }
  1708. }
  1709. }
  1710. return 0;
  1711. }
  1712. int SecCamera::getWDR(void)
  1713. {
  1714. return m_wdr;
  1715. }
  1716. //======================================================================
  1717. int SecCamera::setAntiShake(int anti_shake)
  1718. {
  1719. ALOGV("%s(anti_shake(%d))", __func__, anti_shake);
  1720. if (anti_shake < ANTI_SHAKE_OFF || ANTI_SHAKE_MAX <= anti_shake) {
  1721. ALOGE("ERR(%s):Invalid anti_shake (%d)", __func__, anti_shake);
  1722. return -1;
  1723. }
  1724. if (m_anti_shake != anti_shake) {
  1725. m_anti_shake = anti_shake;
  1726. if (m_flag_camera_start) {
  1727. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ANTI_SHAKE, anti_shake) < 0) {
  1728. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_ANTI_SHAKE", __func__);
  1729. return -1;
  1730. }
  1731. }
  1732. }
  1733. return 0;
  1734. }
  1735. int SecCamera::getAntiShake(void)
  1736. {
  1737. return m_anti_shake;
  1738. }
  1739. //======================================================================
  1740. int SecCamera::setMetering(int metering_value)
  1741. {
  1742. ALOGV("%s(metering (%d))", __func__, metering_value);
  1743. if (metering_value <= METERING_BASE || METERING_MAX <= metering_value) {
  1744. ALOGE("ERR(%s):Invalid metering_value (%d)", __func__, metering_value);
  1745. return -1;
  1746. }
  1747. if (m_params->metering != metering_value) {
  1748. m_params->metering = metering_value;
  1749. if (m_flag_camera_start) {
  1750. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_METERING, metering_value) < 0) {
  1751. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_METERING", __func__);
  1752. return -1;
  1753. }
  1754. }
  1755. }
  1756. return 0;
  1757. }
  1758. int SecCamera::getMetering(void)
  1759. {
  1760. return m_params->metering;
  1761. }
  1762. //======================================================================
  1763. int SecCamera::setJpegQuality(int jpeg_quality)
  1764. {
  1765. ALOGV("%s(jpeg_quality (%d))", __func__, jpeg_quality);
  1766. if (jpeg_quality < JPEG_QUALITY_ECONOMY || JPEG_QUALITY_MAX <= jpeg_quality) {
  1767. ALOGE("ERR(%s):Invalid jpeg_quality (%d)", __func__, jpeg_quality);
  1768. return -1;
  1769. }
  1770. if (m_jpeg_quality != jpeg_quality) {
  1771. m_jpeg_quality = jpeg_quality;
  1772. if (m_flag_camera_start && (m_camera_id == CAMERA_ID_BACK)) {
  1773. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAM_JPEG_QUALITY, jpeg_quality) < 0) {
  1774. ALOGE("ERR(%s):Fail on V4L2_CID_CAM_JPEG_QUALITY", __func__);
  1775. return -1;
  1776. }
  1777. }
  1778. }
  1779. return 0;
  1780. }
  1781. int SecCamera::getJpegQuality(void)
  1782. {
  1783. return m_jpeg_quality;
  1784. }
  1785. //======================================================================
  1786. int SecCamera::setZoom(int zoom_level)
  1787. {
  1788. ALOGV("%s(zoom_level (%d))", __func__, zoom_level);
  1789. if (zoom_level < ZOOM_LEVEL_0 || ZOOM_LEVEL_MAX <= zoom_level) {
  1790. ALOGE("ERR(%s):Invalid zoom_level (%d)", __func__, zoom_level);
  1791. return -1;
  1792. }
  1793. if (m_zoom_level != zoom_level) {
  1794. m_zoom_level = zoom_level;
  1795. if (m_flag_camera_start) {
  1796. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ZOOM, zoom_level) < 0) {
  1797. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_ZOOM", __func__);
  1798. return -1;
  1799. }
  1800. }
  1801. }
  1802. return 0;
  1803. }
  1804. int SecCamera::getZoom(void)
  1805. {
  1806. return m_zoom_level;
  1807. }
  1808. //======================================================================
  1809. int SecCamera::setObjectTracking(int object_tracking)
  1810. {
  1811. ALOGV("%s(object_tracking (%d))", __func__, object_tracking);
  1812. if (object_tracking < OBJECT_TRACKING_OFF || OBJECT_TRACKING_MAX <= object_tracking) {
  1813. ALOGE("ERR(%s):Invalid object_tracking (%d)", __func__, object_tracking);
  1814. return -1;
  1815. }
  1816. if (m_object_tracking != object_tracking) {
  1817. m_object_tracking = object_tracking;
  1818. }
  1819. return 0;
  1820. }
  1821. int SecCamera::getObjectTracking(void)
  1822. {
  1823. return m_object_tracking;
  1824. }
  1825. int SecCamera::getObjectTrackingStatus(void)
  1826. {
  1827. int obj_status = 0;
  1828. obj_status = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAMERA_OBJ_TRACKING_STATUS);
  1829. return obj_status;
  1830. }
  1831. int SecCamera::setObjectTrackingStartStop(int start_stop)
  1832. {
  1833. ALOGV("%s(object_tracking_start_stop (%d))", __func__, start_stop);
  1834. if (m_object_tracking_start_stop != start_stop) {
  1835. m_object_tracking_start_stop = start_stop;
  1836. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_OBJ_TRACKING_START_STOP, start_stop) < 0) {
  1837. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_OBJ_TRACKING_START_STOP", __func__);
  1838. return -1;
  1839. }
  1840. }
  1841. return 0;
  1842. }
  1843. int SecCamera::setTouchAFStartStop(int start_stop)
  1844. {
  1845. ALOGV("%s(touch_af_start_stop (%d))", __func__, start_stop);
  1846. if (m_touch_af_start_stop != start_stop) {
  1847. m_touch_af_start_stop = start_stop;
  1848. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_TOUCH_AF_START_STOP, start_stop) < 0) {
  1849. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_TOUCH_AF_START_STOP", __func__);
  1850. return -1;
  1851. }
  1852. }
  1853. return 0;
  1854. }
  1855. //======================================================================
  1856. int SecCamera::setSmartAuto(int smart_auto)
  1857. {
  1858. ALOGV("%s(smart_auto (%d))", __func__, smart_auto);
  1859. if (smart_auto < SMART_AUTO_OFF || SMART_AUTO_MAX <= smart_auto) {
  1860. ALOGE("ERR(%s):Invalid smart_auto (%d)", __func__, smart_auto);
  1861. return -1;
  1862. }
  1863. if (m_smart_auto != smart_auto) {
  1864. m_smart_auto = smart_auto;
  1865. if (m_flag_camera_start) {
  1866. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SMART_AUTO, smart_auto) < 0) {
  1867. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SMART_AUTO", __func__);
  1868. return -1;
  1869. }
  1870. }
  1871. }
  1872. return 0;
  1873. }
  1874. int SecCamera::getSmartAuto(void)
  1875. {
  1876. return m_smart_auto;
  1877. }
  1878. int SecCamera::getAutosceneStatus(void)
  1879. {
  1880. int autoscene_status = -1;
  1881. if (getSmartAuto() == SMART_AUTO_ON) {
  1882. autoscene_status = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAMERA_SMART_AUTO_STATUS);
  1883. if ((autoscene_status < SMART_AUTO_STATUS_AUTO) || (autoscene_status > SMART_AUTO_STATUS_MAX)) {
  1884. ALOGE("ERR(%s):Invalid getAutosceneStatus (%d)", __func__, autoscene_status);
  1885. return -1;
  1886. }
  1887. }
  1888. //ALOGV("%s : autoscene_status (%d)", __func__, autoscene_status);
  1889. return autoscene_status;
  1890. }
  1891. //======================================================================
  1892. int SecCamera::setBeautyShot(int beauty_shot)
  1893. {
  1894. ALOGV("%s(beauty_shot (%d))", __func__, beauty_shot);
  1895. if (beauty_shot < BEAUTY_SHOT_OFF || BEAUTY_SHOT_MAX <= beauty_shot) {
  1896. ALOGE("ERR(%s):Invalid beauty_shot (%d)", __func__, beauty_shot);
  1897. return -1;
  1898. }
  1899. if (m_beauty_shot != beauty_shot) {
  1900. m_beauty_shot = beauty_shot;
  1901. if (m_flag_camera_start) {
  1902. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_BEAUTY_SHOT, beauty_shot) < 0) {
  1903. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_BEAUTY_SHOT", __func__);
  1904. return -1;
  1905. }
  1906. }
  1907. setFaceDetect(FACE_DETECTION_ON_BEAUTY);
  1908. }
  1909. return 0;
  1910. }
  1911. int SecCamera::getBeautyShot(void)
  1912. {
  1913. return m_beauty_shot;
  1914. }
  1915. //======================================================================
  1916. int SecCamera::setVintageMode(int vintage_mode)
  1917. {
  1918. ALOGV("%s(vintage_mode(%d))", __func__, vintage_mode);
  1919. if (vintage_mode <= VINTAGE_MODE_BASE || VINTAGE_MODE_MAX <= vintage_mode) {
  1920. ALOGE("ERR(%s):Invalid vintage_mode (%d)", __func__, vintage_mode);
  1921. return -1;
  1922. }
  1923. if (m_vintage_mode != vintage_mode) {
  1924. m_vintage_mode = vintage_mode;
  1925. if (m_flag_camera_start) {
  1926. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_VINTAGE_MODE, vintage_mode) < 0) {
  1927. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_VINTAGE_MODE", __func__);
  1928. return -1;
  1929. }
  1930. }
  1931. }
  1932. return 0;
  1933. }
  1934. int SecCamera::getVintageMode(void)
  1935. {
  1936. return m_vintage_mode;
  1937. }
  1938. //======================================================================
  1939. int SecCamera::setFocusMode(int focus_mode)
  1940. {
  1941. ALOGV("%s(focus_mode(%d))", __func__, focus_mode);
  1942. if (FOCUS_MODE_MAX <= focus_mode) {
  1943. ALOGE("ERR(%s):Invalid focus_mode (%d)", __func__, focus_mode);
  1944. return -1;
  1945. }
  1946. if (m_params->focus_mode != focus_mode) {
  1947. m_params->focus_mode = focus_mode;
  1948. if (m_flag_camera_start) {
  1949. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FOCUS_MODE, focus_mode) < 0) {
  1950. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FOCUS_MODE", __func__);
  1951. return -1;
  1952. }
  1953. }
  1954. }
  1955. return 0;
  1956. }
  1957. int SecCamera::getFocusMode(void)
  1958. {
  1959. return m_params->focus_mode;
  1960. }
  1961. //======================================================================
  1962. int SecCamera::setFaceDetect(int face_detect)
  1963. {
  1964. ALOGV("%s(face_detect(%d))", __func__, face_detect);
  1965. if (m_face_detect != face_detect) {
  1966. m_face_detect = face_detect;
  1967. if (m_flag_camera_start) {
  1968. if (m_face_detect != FACE_DETECTION_OFF) {
  1969. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FOCUS_MODE, FOCUS_MODE_AUTO) < 0) {
  1970. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FOCUS_MODin face detecion", __func__);
  1971. return -1;
  1972. }
  1973. }
  1974. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FACE_DETECTION, face_detect) < 0) {
  1975. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FACE_DETECTION", __func__);
  1976. return -1;
  1977. }
  1978. }
  1979. }
  1980. return 0;
  1981. }
  1982. int SecCamera::getFaceDetect(void)
  1983. {
  1984. return m_face_detect;
  1985. }
  1986. //======================================================================
  1987. int SecCamera::setGPSLatitude(const char *gps_latitude)
  1988. {
  1989. ALOGV("%s(gps_latitude(%s))", __func__, gps_latitude);
  1990. if (gps_latitude == NULL)
  1991. m_gps_enabled = false;
  1992. else {
  1993. m_gps_enabled = true;
  1994. m_gps_latitude = lround(strtod(gps_latitude, NULL) * 10000000);
  1995. }
  1996. if (m_camera_id == CAMERA_ID_BACK) {
  1997. if (m_gps_enabled) {
  1998. long tmp = (m_gps_latitude >= 0) ? m_gps_latitude : -m_gps_latitude;
  1999. gpsInfoLatitude.north_south = m_gps_latitude < 0;
  2000. gpsInfoLatitude.dgree = tmp / 10000000;
  2001. tmp = (tmp % 10000000) * 60;
  2002. gpsInfoLatitude.minute = tmp / 10000000;
  2003. gpsInfoLatitude.second = (tmp % 10000000) * 60 / 10000000;
  2004. }
  2005. else {
  2006. gpsInfoLatitude.north_south = 0;
  2007. gpsInfoLatitude.dgree = 0;
  2008. gpsInfoLatitude.minute = 0;
  2009. gpsInfoLatitude.second = 0;
  2010. }
  2011. }
  2012. ALOGV("%s(m_gps_latitude(%ld))", __func__, m_gps_latitude);
  2013. return 0;
  2014. }
  2015. int SecCamera::setGPSLongitude(const char *gps_longitude)
  2016. {
  2017. ALOGV("%s(gps_longitude(%s))", __func__, gps_longitude);
  2018. if (gps_longitude == NULL)
  2019. m_gps_enabled = false;
  2020. else {
  2021. m_gps_enabled = true;
  2022. m_gps_longitude = lround(strtod(gps_longitude, NULL) * 10000000);
  2023. }
  2024. if (m_camera_id == CAMERA_ID_BACK) {
  2025. if (m_gps_enabled) {
  2026. long tmp = (m_gps_longitude >= 0) ? m_gps_longitude : -m_gps_longitude;
  2027. gpsInfoLongitude.east_west = m_gps_longitude < 0;
  2028. gpsInfoLongitude.dgree = tmp / 10000000;
  2029. tmp = (tmp % 10000000) * 60;
  2030. gpsInfoLongitude.minute = tmp / 10000000;
  2031. gpsInfoLongitude.second = (tmp % 10000000) * 60 / 10000000;
  2032. }
  2033. else {
  2034. gpsInfoLongitude.east_west = 0;
  2035. gpsInfoLongitude.dgree = 0;
  2036. gpsInfoLongitude.minute = 0;
  2037. gpsInfoLongitude.second = 0;
  2038. }
  2039. }
  2040. ALOGV("%s(m_gps_longitude(%ld))", __func__, m_gps_longitude);
  2041. return 0;
  2042. }
  2043. int SecCamera::setGPSAltitude(const char *gps_altitude)
  2044. {
  2045. ALOGV("%s(gps_altitude(%s))", __func__, gps_altitude);
  2046. if (gps_altitude == NULL)
  2047. m_gps_altitude = 0;
  2048. else {
  2049. m_gps_altitude = lround(strtod(gps_altitude, NULL) * 100);
  2050. }
  2051. if (m_camera_id == CAMERA_ID_BACK) {
  2052. gpsInfoAltitude.plus_minus = (m_gps_altitude >= 0);
  2053. long tmp = gpsInfoAltitude.plus_minus ? m_gps_altitude : -m_gps_altitude;
  2054. gpsInfoAltitude.dgree = tmp / 100;
  2055. gpsInfoAltitude.minute = tmp % 100;
  2056. gpsInfoAltitude.second = 0;
  2057. }
  2058. ALOGV("%s(m_gps_altitude(%ld))", __func__, m_gps_altitude);
  2059. return 0;
  2060. }
  2061. int SecCamera::setGPSTimeStamp(const char *gps_timestamp)
  2062. {
  2063. ALOGV("%s(gps_timestamp(%s))", __func__, gps_timestamp);
  2064. if (gps_timestamp == NULL)
  2065. m_gps_timestamp = 0;
  2066. else
  2067. m_gps_timestamp = atol(gps_timestamp);
  2068. ALOGV("%s(m_gps_timestamp(%ld))", __func__, m_gps_timestamp);
  2069. return 0;
  2070. }
  2071. int SecCamera::setGPSProcessingMethod(const char *gps_processing_method)
  2072. {
  2073. ALOGV("%s(gps_processing_method(%s))", __func__, gps_processing_method);
  2074. memset(mExifInfo.gps_processing_method, 0, sizeof(mExifInfo.gps_processing_method));
  2075. if (gps_processing_method != NULL) {
  2076. size_t len = strlen(gps_processing_method);
  2077. if (len > sizeof(mExifInfo.gps_processing_method)) {
  2078. len = sizeof(mExifInfo.gps_processing_method);
  2079. }
  2080. memcpy(mExifInfo.gps_processing_method, gps_processing_method, len);
  2081. }
  2082. return 0;
  2083. }
  2084. int SecCamera::setFaceDetectLockUnlock(int facedetect_lockunlock)
  2085. {
  2086. ALOGV("%s(facedetect_lockunlock(%d))", __func__, facedetect_lockunlock);
  2087. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FACEDETECT_LOCKUNLOCK, facedetect_lockunlock) < 0) {
  2088. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FACEDETECT_LOCKUNLOCK", __func__);
  2089. return -1;
  2090. }
  2091. return 0;
  2092. }
  2093. int SecCamera::setObjectPosition(int x, int y)
  2094. {
  2095. ALOGV("%s(setObjectPosition(x=%d, y=%d))", __func__, x, y);
  2096. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_OBJECT_POSITION_X, x) < 0) {
  2097. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_OBJECT_POSITION_X", __func__);
  2098. return -1;
  2099. }
  2100. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_OBJECT_POSITION_Y, y) < 0) {
  2101. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_OBJECT_POSITION_Y", __func__);
  2102. return -1;
  2103. }
  2104. return 0;
  2105. }
  2106. //======================================================================
  2107. int SecCamera::setGamma(int gamma)
  2108. {
  2109. ALOGV("%s(gamma(%d))", __func__, gamma);
  2110. if (gamma < GAMMA_OFF || GAMMA_MAX <= gamma) {
  2111. ALOGE("ERR(%s):Invalid gamma (%d)", __func__, gamma);
  2112. return -1;
  2113. }
  2114. if (m_video_gamma != gamma) {
  2115. m_video_gamma = gamma;
  2116. if (m_flag_camera_start) {
  2117. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_GAMMA, gamma) < 0) {
  2118. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_GAMMA", __func__);
  2119. return -1;
  2120. }
  2121. }
  2122. }
  2123. return 0;
  2124. }
  2125. //======================================================================
  2126. int SecCamera::setSlowAE(int slow_ae)
  2127. {
  2128. ALOGV("%s(slow_ae(%d))", __func__, slow_ae);
  2129. if (slow_ae < GAMMA_OFF || GAMMA_MAX <= slow_ae) {
  2130. ALOGE("ERR(%s):Invalid slow_ae (%d)", __func__, slow_ae);
  2131. return -1;
  2132. }
  2133. if (m_slow_ae!= slow_ae) {
  2134. m_slow_ae = slow_ae;
  2135. if (m_flag_camera_start) {
  2136. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_SLOW_AE, slow_ae) < 0) {
  2137. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_SLOW_AE", __func__);
  2138. return -1;
  2139. }
  2140. }
  2141. }
  2142. return 0;
  2143. }
  2144. //======================================================================
  2145. int SecCamera::setRecordingSize(int width, int height)
  2146. {
  2147. ALOGV("%s(width(%d), height(%d))", __func__, width, height);
  2148. m_recording_width = width;
  2149. m_recording_height = height;
  2150. return 0;
  2151. }
  2152. //======================================================================
  2153. int SecCamera::setExifOrientationInfo(int orientationInfo)
  2154. {
  2155. ALOGV("%s(orientationInfo(%d))", __func__, orientationInfo);
  2156. if (orientationInfo < 0) {
  2157. ALOGE("ERR(%s):Invalid orientationInfo (%d)", __func__, orientationInfo);
  2158. return -1;
  2159. }
  2160. m_exif_orientation = orientationInfo;
  2161. return 0;
  2162. }
  2163. //======================================================================
  2164. // Must call after parameter update on CE147 (so the changes are reflected in batch)
  2165. int SecCamera::setBatchReflection()
  2166. {
  2167. if (m_flag_camera_start) {
  2168. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_BATCH_REFLECTION, 1) < 0) {
  2169. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_BATCH_REFLECTION", __func__);
  2170. return -1;
  2171. }
  2172. }
  2173. return 0;
  2174. }
  2175. /*Video call*/
  2176. int SecCamera::setVTmode(int vtmode)
  2177. {
  2178. ALOGV("%s(vtmode (%d))", __func__, vtmode);
  2179. if (vtmode < VT_MODE_OFF || VT_MODE_MAX <= vtmode) {
  2180. ALOGE("ERR(%s):Invalid vtmode (%d)", __func__, vtmode);
  2181. return -1;
  2182. }
  2183. if (m_vtmode != vtmode) {
  2184. m_vtmode = vtmode;
  2185. }
  2186. return 0;
  2187. }
  2188. /* Camcorder fix fps */
  2189. int SecCamera::setSensorMode(int sensor_mode)
  2190. {
  2191. ALOGV("%s(sensor_mode (%d))", __func__, sensor_mode);
  2192. if (sensor_mode < SENSOR_MODE_CAMERA || SENSOR_MODE_MOVIE < sensor_mode) {
  2193. ALOGE("ERR(%s):Invalid sensor mode (%d)", __func__, sensor_mode);
  2194. return -1;
  2195. }
  2196. if (m_sensor_mode != sensor_mode) {
  2197. m_sensor_mode = sensor_mode;
  2198. }
  2199. return 0;
  2200. }
  2201. /* Shot mode */
  2202. /* SINGLE = 0
  2203. * CONTINUOUS = 1
  2204. * PANORAMA = 2
  2205. * SMILE = 3
  2206. * SELF = 6
  2207. */
  2208. int SecCamera::setShotMode(int shot_mode)
  2209. {
  2210. ALOGV("%s(shot_mode (%d))", __func__, shot_mode);
  2211. if (shot_mode < SHOT_MODE_SINGLE || SHOT_MODE_SELF < shot_mode) {
  2212. ALOGE("ERR(%s):Invalid shot_mode (%d)", __func__, shot_mode);
  2213. return -1;
  2214. }
  2215. m_shot_mode = shot_mode;
  2216. return 0;
  2217. }
  2218. int SecCamera::getVTmode(void)
  2219. {
  2220. return m_vtmode;
  2221. }
  2222. int SecCamera::setBlur(int blur_level)
  2223. {
  2224. ALOGV("%s(level (%d))", __func__, blur_level);
  2225. if (blur_level < BLUR_LEVEL_0 || BLUR_LEVEL_MAX <= blur_level) {
  2226. ALOGE("ERR(%s):Invalid level (%d)", __func__, blur_level);
  2227. return -1;
  2228. }
  2229. if (m_blur_level != blur_level) {
  2230. m_blur_level = blur_level;
  2231. if (m_flag_camera_start) {
  2232. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_VGA_BLUR, blur_level) < 0) {
  2233. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_VGA_BLUR", __func__);
  2234. return -1;
  2235. }
  2236. }
  2237. }
  2238. return 0;
  2239. }
  2240. int SecCamera::getBlur(void)
  2241. {
  2242. return m_blur_level;
  2243. }
  2244. int SecCamera::setDataLineCheck(int chk_dataline)
  2245. {
  2246. ALOGV("%s(chk_dataline (%d))", __func__, chk_dataline);
  2247. if (chk_dataline < CHK_DATALINE_OFF || CHK_DATALINE_MAX <= chk_dataline) {
  2248. ALOGE("ERR(%s):Invalid chk_dataline (%d)", __func__, chk_dataline);
  2249. return -1;
  2250. }
  2251. m_chk_dataline = chk_dataline;
  2252. return 0;
  2253. }
  2254. int SecCamera::getDataLineCheck(void)
  2255. {
  2256. return m_chk_dataline;
  2257. }
  2258. int SecCamera::setDataLineCheckStop(void)
  2259. {
  2260. ALOGV("%s", __func__);
  2261. if (m_flag_camera_start) {
  2262. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_CHECK_DATALINE_STOP, 1) < 0) {
  2263. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_CHECK_DATALINE_STOP", __func__);
  2264. return -1;
  2265. }
  2266. }
  2267. return 0;
  2268. }
  2269. const __u8* SecCamera::getCameraSensorName(void)
  2270. {
  2271. ALOGV("%s", __func__);
  2272. return fimc_v4l2_enuminput(m_cam_fd, getCameraId());
  2273. }
  2274. #ifdef ENABLE_ESD_PREVIEW_CHECK
  2275. int SecCamera::getCameraSensorESDStatus(void)
  2276. {
  2277. ALOGV("%s", __func__);
  2278. // 0 : normal operation, 1 : abnormal operation
  2279. int status = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_ESD_INT);
  2280. return status;
  2281. }
  2282. #endif // ENABLE_ESD_PREVIEW_CHECK
  2283. // ======================================================================
  2284. // Jpeg
  2285. int SecCamera::setJpegThumbnailSize(int width, int height)
  2286. {
  2287. ALOGV("%s(width(%d), height(%d))", __func__, width, height);
  2288. m_jpeg_thumbnail_width = width;
  2289. m_jpeg_thumbnail_height = height;
  2290. return 0;
  2291. }
  2292. int SecCamera::getJpegThumbnailSize(int *width, int *height)
  2293. {
  2294. if (width)
  2295. *width = m_jpeg_thumbnail_width;
  2296. if (height)
  2297. *height = m_jpeg_thumbnail_height;
  2298. return 0;
  2299. }
  2300. void SecCamera::setExifFixedAttribute()
  2301. {
  2302. char property[PROPERTY_VALUE_MAX];
  2303. //2 0th IFD TIFF Tags
  2304. //3 Maker
  2305. property_get("ro.product.brand", property, EXIF_DEF_MAKER);
  2306. strncpy((char *)mExifInfo.maker, property,
  2307. sizeof(mExifInfo.maker) - 1);
  2308. mExifInfo.maker[sizeof(mExifInfo.maker) - 1] = '\0';
  2309. //3 Model
  2310. property_get("ro.product.model", property, EXIF_DEF_MODEL);
  2311. strncpy((char *)mExifInfo.model, property,
  2312. sizeof(mExifInfo.model) - 1);
  2313. mExifInfo.model[sizeof(mExifInfo.model) - 1] = '\0';
  2314. //3 Software
  2315. property_get("ro.build.id", property, EXIF_DEF_SOFTWARE);
  2316. strncpy((char *)mExifInfo.software, property,
  2317. sizeof(mExifInfo.software) - 1);
  2318. mExifInfo.software[sizeof(mExifInfo.software) - 1] = '\0';
  2319. //3 YCbCr Positioning
  2320. mExifInfo.ycbcr_positioning = EXIF_DEF_YCBCR_POSITIONING;
  2321. //2 0th IFD Exif Private Tags
  2322. //3 F Number
  2323. mExifInfo.fnumber.num = EXIF_DEF_FNUMBER_NUM;
  2324. mExifInfo.fnumber.den = EXIF_DEF_FNUMBER_DEN;
  2325. //3 Exposure Program
  2326. mExifInfo.exposure_program = EXIF_DEF_EXPOSURE_PROGRAM;
  2327. //3 Exif Version
  2328. memcpy(mExifInfo.exif_version, EXIF_DEF_EXIF_VERSION, sizeof(mExifInfo.exif_version));
  2329. //3 Aperture
  2330. uint32_t av = APEX_FNUM_TO_APERTURE((double)mExifInfo.fnumber.num/mExifInfo.fnumber.den);
  2331. mExifInfo.aperture.num = av*EXIF_DEF_APEX_DEN;
  2332. mExifInfo.aperture.den = EXIF_DEF_APEX_DEN;
  2333. //3 Maximum lens aperture
  2334. mExifInfo.max_aperture.num = mExifInfo.aperture.num;
  2335. mExifInfo.max_aperture.den = mExifInfo.aperture.den;
  2336. //3 Lens Focal Length
  2337. if (m_camera_id == CAMERA_ID_BACK)
  2338. mExifInfo.focal_length.num = BACK_CAMERA_FOCAL_LENGTH;
  2339. else
  2340. mExifInfo.focal_length.num = FRONT_CAMERA_FOCAL_LENGTH;
  2341. mExifInfo.focal_length.den = EXIF_DEF_FOCAL_LEN_DEN;
  2342. //3 User Comments
  2343. strcpy((char *)mExifInfo.user_comment, EXIF_DEF_USERCOMMENTS);
  2344. //3 Color Space information
  2345. mExifInfo.color_space = EXIF_DEF_COLOR_SPACE;
  2346. //3 Exposure Mode
  2347. mExifInfo.exposure_mode = EXIF_DEF_EXPOSURE_MODE;
  2348. //2 0th IFD GPS Info Tags
  2349. unsigned char gps_version[4] = { 0x02, 0x02, 0x00, 0x00 };
  2350. memcpy(mExifInfo.gps_version_id, gps_version, sizeof(gps_version));
  2351. //2 1th IFD TIFF Tags
  2352. mExifInfo.compression_scheme = EXIF_DEF_COMPRESSION;
  2353. mExifInfo.x_resolution.num = EXIF_DEF_RESOLUTION_NUM;
  2354. mExifInfo.x_resolution.den = EXIF_DEF_RESOLUTION_DEN;
  2355. mExifInfo.y_resolution.num = EXIF_DEF_RESOLUTION_NUM;
  2356. mExifInfo.y_resolution.den = EXIF_DEF_RESOLUTION_DEN;
  2357. mExifInfo.resolution_unit = EXIF_DEF_RESOLUTION_UNIT;
  2358. }
  2359. void SecCamera::setExifChangedAttribute()
  2360. {
  2361. //2 0th IFD TIFF Tags
  2362. //3 Width
  2363. mExifInfo.width = m_snapshot_width;
  2364. //3 Height
  2365. mExifInfo.height = m_snapshot_height;
  2366. //3 Orientation
  2367. switch (m_exif_orientation) {
  2368. case 0:
  2369. mExifInfo.orientation = EXIF_ORIENTATION_UP;
  2370. break;
  2371. case 90:
  2372. mExifInfo.orientation = EXIF_ORIENTATION_90;
  2373. break;
  2374. case 180:
  2375. mExifInfo.orientation = EXIF_ORIENTATION_180;
  2376. break;
  2377. case 270:
  2378. mExifInfo.orientation = EXIF_ORIENTATION_270;
  2379. break;
  2380. default:
  2381. mExifInfo.orientation = EXIF_ORIENTATION_UP;
  2382. break;
  2383. }
  2384. //3 Date time
  2385. time_t rawtime;
  2386. struct tm *timeinfo;
  2387. time(&rawtime);
  2388. timeinfo = localtime(&rawtime);
  2389. strftime((char *)mExifInfo.date_time, 20, "%Y:%m:%d %H:%M:%S", timeinfo);
  2390. //2 0th IFD Exif Private Tags
  2391. //3 Exposure Time
  2392. int shutterSpeed = fimc_v4l2_g_ctrl(m_cam_fd,
  2393. V4L2_CID_CAMERA_EXIF_EXPTIME);
  2394. /* TBD - front camera needs to be fixed to support this g_ctrl,
  2395. it current returns a negative err value, so avoid putting
  2396. odd value into exif for now */
  2397. if (shutterSpeed < 0) {
  2398. ALOGE("%s: error %d getting shutterSpeed, camera_id = %d, using 100",
  2399. __func__, shutterSpeed, m_camera_id);
  2400. shutterSpeed = 100;
  2401. }
  2402. mExifInfo.exposure_time.num = 1;
  2403. // x us -> 1/x s */
  2404. mExifInfo.exposure_time.den = (uint32_t)(1000000 / shutterSpeed);
  2405. //3 ISO Speed Rating
  2406. int iso = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAMERA_EXIF_ISO);
  2407. /* TBD - front camera needs to be fixed to support this g_ctrl,
  2408. it current returns a negative err value, so avoid putting
  2409. odd value into exif for now */
  2410. if (iso < 0) {
  2411. ALOGE("%s: error %d getting iso, camera_id = %d, using 100",
  2412. __func__, iso, m_camera_id);
  2413. iso = ISO_100;
  2414. }
  2415. switch(iso) {
  2416. case ISO_50:
  2417. mExifInfo.iso_speed_rating = 50;
  2418. break;
  2419. case ISO_100:
  2420. mExifInfo.iso_speed_rating = 100;
  2421. break;
  2422. case ISO_200:
  2423. mExifInfo.iso_speed_rating = 200;
  2424. break;
  2425. case ISO_400:
  2426. mExifInfo.iso_speed_rating = 400;
  2427. break;
  2428. case ISO_800:
  2429. mExifInfo.iso_speed_rating = 800;
  2430. break;
  2431. case ISO_1600:
  2432. mExifInfo.iso_speed_rating = 1600;
  2433. break;
  2434. default:
  2435. mExifInfo.iso_speed_rating = 100;
  2436. break;
  2437. }
  2438. uint32_t av, tv, bv, sv, ev;
  2439. av = APEX_FNUM_TO_APERTURE((double)mExifInfo.fnumber.num / mExifInfo.fnumber.den);
  2440. tv = APEX_EXPOSURE_TO_SHUTTER((double)mExifInfo.exposure_time.num / mExifInfo.exposure_time.den);
  2441. sv = APEX_ISO_TO_FILMSENSITIVITY(mExifInfo.iso_speed_rating);
  2442. bv = av + tv - sv;
  2443. ev = av + tv;
  2444. ALOGD("Shutter speed=%d us, iso=%d\n", shutterSpeed, mExifInfo.iso_speed_rating);
  2445. ALOGD("AV=%d, TV=%d, SV=%d\n", av, tv, sv);
  2446. //3 Shutter Speed
  2447. mExifInfo.shutter_speed.num = tv*EXIF_DEF_APEX_DEN;
  2448. mExifInfo.shutter_speed.den = EXIF_DEF_APEX_DEN;
  2449. //3 Brightness
  2450. mExifInfo.brightness.num = bv*EXIF_DEF_APEX_DEN;
  2451. mExifInfo.brightness.den = EXIF_DEF_APEX_DEN;
  2452. //3 Exposure Bias
  2453. if (m_params->scene_mode == SCENE_MODE_BEACH_SNOW) {
  2454. mExifInfo.exposure_bias.num = EXIF_DEF_APEX_DEN;
  2455. mExifInfo.exposure_bias.den = EXIF_DEF_APEX_DEN;
  2456. } else {
  2457. mExifInfo.exposure_bias.num = 0;
  2458. mExifInfo.exposure_bias.den = 0;
  2459. }
  2460. //3 Metering Mode
  2461. switch (m_params->metering) {
  2462. case METERING_SPOT:
  2463. mExifInfo.metering_mode = EXIF_METERING_SPOT;
  2464. break;
  2465. case METERING_MATRIX:
  2466. mExifInfo.metering_mode = EXIF_METERING_AVERAGE;
  2467. break;
  2468. case METERING_CENTER:
  2469. mExifInfo.metering_mode = EXIF_METERING_CENTER;
  2470. break;
  2471. default :
  2472. mExifInfo.metering_mode = EXIF_METERING_AVERAGE;
  2473. break;
  2474. }
  2475. //3 Flash
  2476. int flash = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAMERA_GET_FLASH_ONOFF);
  2477. if (flash < 0)
  2478. mExifInfo.flash = EXIF_DEF_FLASH;
  2479. else
  2480. mExifInfo.flash = flash;
  2481. //3 White Balance
  2482. if (m_params->white_balance == WHITE_BALANCE_AUTO)
  2483. mExifInfo.white_balance = EXIF_WB_AUTO;
  2484. else
  2485. mExifInfo.white_balance = EXIF_WB_MANUAL;
  2486. //3 Scene Capture Type
  2487. switch (m_params->scene_mode) {
  2488. case SCENE_MODE_PORTRAIT:
  2489. mExifInfo.scene_capture_type = EXIF_SCENE_PORTRAIT;
  2490. break;
  2491. case SCENE_MODE_LANDSCAPE:
  2492. mExifInfo.scene_capture_type = EXIF_SCENE_LANDSCAPE;
  2493. break;
  2494. case SCENE_MODE_NIGHTSHOT:
  2495. mExifInfo.scene_capture_type = EXIF_SCENE_NIGHT;
  2496. break;
  2497. default:
  2498. mExifInfo.scene_capture_type = EXIF_SCENE_STANDARD;
  2499. break;
  2500. }
  2501. //2 0th IFD GPS Info Tags
  2502. if (m_gps_enabled) {
  2503. if (m_gps_latitude >= 0)
  2504. strcpy((char *)mExifInfo.gps_latitude_ref, "N");
  2505. else
  2506. strcpy((char *)mExifInfo.gps_latitude_ref, "S");
  2507. if (m_gps_longitude >= 0)
  2508. strcpy((char *)mExifInfo.gps_longitude_ref, "E");
  2509. else
  2510. strcpy((char *)mExifInfo.gps_longitude_ref, "W");
  2511. if (m_gps_altitude >= 0)
  2512. mExifInfo.gps_altitude_ref = 0;
  2513. else
  2514. mExifInfo.gps_altitude_ref = 1;
  2515. mExifInfo.gps_latitude[0].num = (uint32_t)labs(m_gps_latitude);
  2516. mExifInfo.gps_latitude[0].den = 10000000;
  2517. mExifInfo.gps_latitude[1].num = 0;
  2518. mExifInfo.gps_latitude[1].den = 1;
  2519. mExifInfo.gps_latitude[2].num = 0;
  2520. mExifInfo.gps_latitude[2].den = 1;
  2521. mExifInfo.gps_longitude[0].num = (uint32_t)labs(m_gps_longitude);
  2522. mExifInfo.gps_longitude[0].den = 10000000;
  2523. mExifInfo.gps_longitude[1].num = 0;
  2524. mExifInfo.gps_longitude[1].den = 1;
  2525. mExifInfo.gps_longitude[2].num = 0;
  2526. mExifInfo.gps_longitude[2].den = 1;
  2527. mExifInfo.gps_altitude.num = (uint32_t)labs(m_gps_altitude);
  2528. mExifInfo.gps_altitude.den = 100;
  2529. struct tm tm_data;
  2530. gmtime_r(&m_gps_timestamp, &tm_data);
  2531. mExifInfo.gps_timestamp[0].num = tm_data.tm_hour;
  2532. mExifInfo.gps_timestamp[0].den = 1;
  2533. mExifInfo.gps_timestamp[1].num = tm_data.tm_min;
  2534. mExifInfo.gps_timestamp[1].den = 1;
  2535. mExifInfo.gps_timestamp[2].num = tm_data.tm_sec;
  2536. mExifInfo.gps_timestamp[2].den = 1;
  2537. snprintf((char*)mExifInfo.gps_datestamp, sizeof(mExifInfo.gps_datestamp),
  2538. "%04d:%02d:%02d", tm_data.tm_year + 1900, tm_data.tm_mon + 1, tm_data.tm_mday);
  2539. mExifInfo.enableGps = true;
  2540. } else {
  2541. mExifInfo.enableGps = false;
  2542. }
  2543. //2 1th IFD TIFF Tags
  2544. mExifInfo.widthThumb = m_jpeg_thumbnail_width;
  2545. mExifInfo.heightThumb = m_jpeg_thumbnail_height;
  2546. }
  2547. // ======================================================================
  2548. // Conversions
  2549. inline int SecCamera::m_frameSize(int format, int width, int height)
  2550. {
  2551. int size = 0;
  2552. switch (format) {
  2553. case V4L2_PIX_FMT_YUV420:
  2554. case V4L2_PIX_FMT_NV12:
  2555. case V4L2_PIX_FMT_NV21:
  2556. size = (width * height * 3 / 2);
  2557. break;
  2558. case V4L2_PIX_FMT_NV12T:
  2559. size = ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height)) +
  2560. ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height / 2));
  2561. break;
  2562. case V4L2_PIX_FMT_YUV422P:
  2563. case V4L2_PIX_FMT_YUYV:
  2564. case V4L2_PIX_FMT_UYVY:
  2565. size = (width * height * 2);
  2566. break;
  2567. default :
  2568. ALOGE("ERR(%s):Invalid V4L2 pixel format(%d)\n", __func__, format);
  2569. case V4L2_PIX_FMT_RGB565:
  2570. size = (width * height * BPP);
  2571. break;
  2572. }
  2573. return size;
  2574. }
  2575. status_t SecCamera::dump(int fd)
  2576. {
  2577. const size_t SIZE = 256;
  2578. char buffer[SIZE];
  2579. String8 result;
  2580. snprintf(buffer, 255, "dump(%d)\n", fd);
  2581. result.append(buffer);
  2582. ::write(fd, result.string(), result.size());
  2583. return NO_ERROR;
  2584. }
  2585. double SecCamera::jpeg_ratio = 0.7;
  2586. int SecCamera::interleaveDataSize = 5242880;
  2587. int SecCamera::jpegLineLength = 636;
  2588. }; // namespace android