PageRenderTime 72ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 0ms

/libcamera/SecCamera.cpp

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