PageRenderTime 62ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/libcamera/SecCamera.cpp

http://github.com/namko/device-samsung-smdkv210
C++ | 2728 lines | 2039 code | 529 blank | 160 comment | 378 complexity | db4597ba683a38e97c07f36bc98eee76 MD5 | raw file

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

  1. /*
  2. * Copyright 2008, The Android Open Source Project
  3. * Copyright 2010, Samsung Electronics Co. LTD
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed 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. ALOGE("%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. ALOGE("%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. ALOGE("ERR(%s):poll error\n", __func__);
  111. return ret;
  112. }
  113. if (ret == 0) {
  114. ALOGE("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. ALOGE("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. ALOGE("ERR(%s):poll error\n", __func__);
  140. return ret;
  141. }
  142. if (ret == 0) {
  143. ALOGE("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. ALOGE("ERR(%s):VIDIOC_QUERYCAP failed\n", __func__);
  155. return -1;
  156. }
  157. if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
  158. ALOGE("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. ALOGE("ERR(%s):No matching index found\n", __func__);
  169. return NULL;
  170. }
  171. ALOGI("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. ALOGE("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. ALOGE("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. //ALOGE("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. ALOGE("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. ALOGV("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. ALOGE("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. ALOGE("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. ALOGI("%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. ALOGE("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. ALOGE("%s %d] mmap() failed\n",__func__, __LINE__);
  283. return -1;
  284. }
  285. ALOGI("%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. ALOGE("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. ALOGV("%s :", __func__);
  305. ret = ioctl(fp, VIDIOC_STREAMOFF, &type);
  306. if (ret < 0) {
  307. ALOGE("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. ALOGE("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. ALOGE("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. ALOGE("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. ALOGE("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_g_parm(int fp, struct v4l2_streamparm *streamparm)
  367. {
  368. int ret;
  369. streamparm->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  370. ret = ioctl(fp, VIDIOC_G_PARM, streamparm);
  371. if (ret < 0) {
  372. ALOGE("ERR(%s):VIDIOC_G_PARM failed\n", __func__);
  373. return -1;
  374. }
  375. ALOGV("%s : timeperframe: numerator %d, denominator %d\n", __func__,
  376. streamparm->parm.capture.timeperframe.numerator,
  377. streamparm->parm.capture.timeperframe.denominator);
  378. return 0;
  379. }
  380. static int fimc_v4l2_s_parm(int fp, struct v4l2_streamparm *streamparm)
  381. {
  382. int ret;
  383. streamparm->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  384. ret = ioctl(fp, VIDIOC_S_PARM, streamparm);
  385. if (ret < 0) {
  386. ALOGE("ERR(%s):VIDIOC_S_PARM failed\n", __func__);
  387. return ret;
  388. }
  389. return 0;
  390. }
  391. // ======================================================================
  392. // Constructor & Destructor
  393. SecCamera::SecCamera() :
  394. m_flag_init(0),
  395. m_camera_id(CAMERA_ID_FRONT),
  396. m_cam_fd(-1),
  397. m_cam_fd2(-1),
  398. m_preview_v4lformat(V4L2_PIX_FMT_NV21),
  399. m_preview_width (0),
  400. m_preview_height (0),
  401. m_preview_max_width (MAX_FRONT_CAMERA_PREVIEW_WIDTH),
  402. m_preview_max_height (MAX_FRONT_CAMERA_PREVIEW_HEIGHT),
  403. m_snapshot_v4lformat(-1),
  404. m_snapshot_width (0),
  405. m_snapshot_height (0),
  406. m_snapshot_max_width (MAX_FRONT_CAMERA_SNAPSHOT_WIDTH),
  407. m_snapshot_max_height (MAX_FRONT_CAMERA_SNAPSHOT_HEIGHT),
  408. m_angle(-1),
  409. m_anti_banding(-1),
  410. m_zoom_level(-1),
  411. m_object_tracking(-1),
  412. m_smart_auto(-1),
  413. m_face_detect(-1),
  414. m_gps_enabled(false),
  415. m_gps_latitude(-1),
  416. m_gps_longitude(-1),
  417. m_gps_altitude(-1),
  418. m_gps_timestamp(-1),
  419. m_sensor_mode(-1),
  420. m_shot_mode(-1),
  421. m_exif_orientation(-1),
  422. m_camera_af_flag(-1),
  423. m_flag_camera_start(0),
  424. m_jpeg_thumbnail_width (0),
  425. m_jpeg_thumbnail_height(0),
  426. m_jpeg_quality(100)
  427. #ifdef ENABLE_ESD_PREVIEW_CHECK
  428. ,
  429. m_esd_check_count(0)
  430. #endif // ENABLE_ESD_PREVIEW_CHECK
  431. {
  432. m_params = (struct sec_cam_parm*)&m_streamparm.parm.raw_data;
  433. struct v4l2_captureparm capture;
  434. m_params->capture.timeperframe.numerator = 1;
  435. m_params->capture.timeperframe.denominator = 0;
  436. m_params->contrast = -1;
  437. m_params->effects = -1;
  438. m_params->brightness = -1;
  439. m_params->flash_mode = -1;
  440. m_params->focus_mode = -1;
  441. m_params->iso = -1;
  442. m_params->metering = -1;
  443. m_params->saturation = -1;
  444. m_params->scene_mode = -1;
  445. m_params->sharpness = -1;
  446. m_params->white_balance = -1;
  447. memset(&m_capture_buf, 0, sizeof(m_capture_buf));
  448. ALOGV("%s :", __func__);
  449. }
  450. SecCamera::~SecCamera()
  451. {
  452. ALOGV("%s :", __func__);
  453. }
  454. int SecCamera::initCamera(int index)
  455. {
  456. ALOGV("%s :", __func__);
  457. int ret = 0;
  458. if (!m_flag_init) {
  459. /* Arun C
  460. * Reset the lense position only during camera starts; don't do
  461. * reset between shot to shot
  462. */
  463. m_camera_af_flag = -1;
  464. m_cam_fd = open(CAMERA_DEV_NAME, O_RDWR);
  465. if (m_cam_fd < 0) {
  466. ALOGE("ERR(%s):Cannot open %s (error : %s)\n", __func__, CAMERA_DEV_NAME, strerror(errno));
  467. return -1;
  468. }
  469. ALOGV("%s: open(%s) --> m_cam_fd %d", __FUNCTION__, CAMERA_DEV_NAME, m_cam_fd);
  470. ALOGE("initCamera: m_cam_fd(%d), m_jpeg_fd(%d)", m_cam_fd, m_jpeg_fd);
  471. ret = fimc_v4l2_querycap(m_cam_fd);
  472. CHECK(ret);
  473. if (!fimc_v4l2_enuminput(m_cam_fd, index))
  474. return -1;
  475. ret = fimc_v4l2_s_input(m_cam_fd, index);
  476. CHECK(ret);
  477. m_cam_fd2 = open(CAMERA_DEV_NAME2, O_RDWR);
  478. ALOGV("%s: open(%s) --> m_cam_fd2 = %d", __FUNCTION__, CAMERA_DEV_NAME2, m_cam_fd2);
  479. if (m_cam_fd2 < 0) {
  480. ALOGE("ERR(%s):Cannot open %s (error : %s)\n", __func__, CAMERA_DEV_NAME2, strerror(errno));
  481. return -1;
  482. }
  483. ALOGE("initCamera: m_cam_fd2(%d)", m_cam_fd2);
  484. ret = fimc_v4l2_querycap(m_cam_fd2);
  485. CHECK(ret);
  486. if (!fimc_v4l2_enuminput(m_cam_fd2, index))
  487. return -1;
  488. ret = fimc_v4l2_s_input(m_cam_fd2, index);
  489. CHECK(ret);
  490. m_camera_id = index;
  491. m_preview_max_width = MAX_FRONT_CAMERA_PREVIEW_WIDTH;
  492. m_preview_max_height = MAX_FRONT_CAMERA_PREVIEW_HEIGHT;
  493. m_snapshot_max_width = MAX_FRONT_CAMERA_SNAPSHOT_WIDTH;
  494. m_snapshot_max_height = MAX_FRONT_CAMERA_SNAPSHOT_HEIGHT;
  495. setExifFixedAttribute();
  496. m_flag_init = 1;
  497. ALOGI("%s : initialized", __FUNCTION__);
  498. }
  499. return 0;
  500. }
  501. void SecCamera::resetCamera()
  502. {
  503. ALOGV("%s :", __func__);
  504. DeinitCamera();
  505. initCamera(m_camera_id);
  506. }
  507. void SecCamera::DeinitCamera()
  508. {
  509. ALOGV("%s :", __func__);
  510. if (m_flag_init) {
  511. stopRecord();
  512. /* close m_cam_fd after stopRecord() because stopRecord()
  513. * uses m_cam_fd to change frame rate
  514. */
  515. ALOGI("DeinitCamera: m_cam_fd(%d)", m_cam_fd);
  516. if (m_cam_fd > -1) {
  517. close(m_cam_fd);
  518. m_cam_fd = -1;
  519. }
  520. ALOGI("DeinitCamera: m_cam_fd2(%d)", m_cam_fd2);
  521. if (m_cam_fd2 > -1) {
  522. close(m_cam_fd2);
  523. m_cam_fd2 = -1;
  524. }
  525. m_flag_init = 0;
  526. }
  527. else ALOGI("%s : already deinitialized", __FUNCTION__);
  528. }
  529. int SecCamera::getCameraFd(void)
  530. {
  531. return m_cam_fd;
  532. }
  533. // ======================================================================
  534. // Preview
  535. int SecCamera::startPreview(void)
  536. {
  537. v4l2_streamparm streamparm;
  538. struct sec_cam_parm *parms;
  539. parms = (struct sec_cam_parm*)&streamparm.parm.raw_data;
  540. ALOGV("%s :", __func__);
  541. // aleady started
  542. if (m_flag_camera_start > 0) {
  543. ALOGE("ERR(%s):Preview was already started\n", __func__);
  544. return 0;
  545. }
  546. if (m_cam_fd <= 0) {
  547. ALOGE("ERR(%s):Camera was closed\n", __func__);
  548. return -1;
  549. }
  550. memset(&m_events_c, 0, sizeof(m_events_c));
  551. m_events_c.fd = m_cam_fd;
  552. m_events_c.events = POLLIN | POLLERR;
  553. /* enum_fmt, s_fmt sample */
  554. int ret = fimc_v4l2_enum_fmt(m_cam_fd,m_preview_v4lformat);
  555. CHECK(ret);
  556. ret = fimc_v4l2_s_fmt(m_cam_fd, m_preview_width,m_preview_height,m_preview_v4lformat, 0);
  557. CHECK(ret);
  558. ret = fimc_v4l2_reqbufs(m_cam_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, MAX_BUFFERS);
  559. CHECK(ret);
  560. ALOGV("%s : m_preview_width: %d m_preview_height: %d m_angle: %d\n",
  561. __func__, m_preview_width, m_preview_height, m_angle);
  562. /* start with all buffers in queue */
  563. for (int i = 0; i < MAX_BUFFERS; i++) {
  564. ret = fimc_v4l2_qbuf(m_cam_fd, i);
  565. CHECK(ret);
  566. }
  567. ret = fimc_v4l2_streamon(m_cam_fd);
  568. CHECK(ret);
  569. m_flag_camera_start = 1;
  570. ret = fimc_v4l2_s_parm(m_cam_fd, &m_streamparm);
  571. CHECK(ret);
  572. // It is a delay for a new frame, not to show the previous bigger ugly picture frame.
  573. ret = fimc_poll(&m_events_c);
  574. CHECK(ret);
  575. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_RETURN_FOCUS, 0);
  576. CHECK(ret);
  577. ALOGV("%s: got the first frame of the preview\n", __func__);
  578. return 0;
  579. }
  580. int SecCamera::stopPreview(void)
  581. {
  582. int ret;
  583. ALOGV("%s :", __func__);
  584. if (m_flag_camera_start == 0) {
  585. ALOGW("%s: doing nothing because m_flag_camera_start is zero", __func__);
  586. return 0;
  587. }
  588. if (m_params->flash_mode == FLASH_MODE_TORCH)
  589. setFlashMode(FLASH_MODE_OFF);
  590. if (m_cam_fd <= 0) {
  591. ALOGE("ERR(%s):Camera was closed\n", __func__);
  592. return -1;
  593. }
  594. ret = fimc_v4l2_streamoff(m_cam_fd);
  595. CHECK(ret);
  596. m_flag_camera_start = 0;
  597. return ret;
  598. }
  599. //Recording
  600. int SecCamera::startRecord(void)
  601. {
  602. int ret, i;
  603. ALOGV("%s :", __func__);
  604. // aleady started
  605. if (m_flag_record_start > 0) {
  606. ALOGE("ERR(%s):Preview was already started\n", __func__);
  607. return 0;
  608. }
  609. if (m_cam_fd2 <= 0) {
  610. ALOGE("ERR(%s):Camera was closed\n", __func__);
  611. return -1;
  612. }
  613. /* enum_fmt, s_fmt sample */
  614. ret = fimc_v4l2_enum_fmt(m_cam_fd2, V4L2_PIX_FMT_NV12T);
  615. CHECK(ret);
  616. ALOGI("%s: m_recording_width = %d, m_recording_height = %d\n",
  617. __func__, m_recording_width, m_recording_height);
  618. ret = fimc_v4l2_s_fmt(m_cam_fd2, m_recording_width,
  619. m_recording_height, V4L2_PIX_FMT_NV12T, 0);
  620. CHECK(ret);
  621. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE,
  622. m_params->capture.timeperframe.denominator);
  623. CHECK(ret);
  624. ret = fimc_v4l2_reqbufs(m_cam_fd2, V4L2_BUF_TYPE_VIDEO_CAPTURE, MAX_BUFFERS);
  625. CHECK(ret);
  626. /* start with all buffers in queue */
  627. for (i = 0; i < MAX_BUFFERS; i++) {
  628. ret = fimc_v4l2_qbuf(m_cam_fd2, i);
  629. CHECK(ret);
  630. }
  631. ret = fimc_v4l2_streamon(m_cam_fd2);
  632. CHECK(ret);
  633. // Get and throw away the first frame since it is often garbled.
  634. memset(&m_events_c2, 0, sizeof(m_events_c2));
  635. m_events_c2.fd = m_cam_fd2;
  636. m_events_c2.events = POLLIN | POLLERR;
  637. ret = fimc_poll(&m_events_c2);
  638. CHECK(ret);
  639. m_flag_record_start = 1;
  640. return 0;
  641. }
  642. int SecCamera::stopRecord(void)
  643. {
  644. int ret;
  645. ALOGV("%s :", __func__);
  646. if (m_flag_record_start == 0) {
  647. ALOGW("%s: doing nothing because m_flag_record_start is zero", __func__);
  648. return 0;
  649. }
  650. if (m_cam_fd2 <= 0) {
  651. ALOGE("ERR(%s):Camera was closed\n", __func__);
  652. return -1;
  653. }
  654. m_flag_record_start = 0;
  655. ret = fimc_v4l2_streamoff(m_cam_fd2);
  656. CHECK(ret);
  657. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE,
  658. FRAME_RATE_AUTO);
  659. CHECK(ret);
  660. return 0;
  661. }
  662. unsigned int SecCamera::getRecPhyAddrY(int index)
  663. {
  664. unsigned int addr_y;
  665. addr_y = fimc_v4l2_s_ctrl(m_cam_fd2, V4L2_CID_PADDR_Y, index);
  666. CHECK((int)addr_y);
  667. return addr_y;
  668. }
  669. unsigned int SecCamera::getRecPhyAddrC(int index)
  670. {
  671. unsigned int addr_c;
  672. addr_c = fimc_v4l2_s_ctrl(m_cam_fd2, V4L2_CID_PADDR_CBCR, index);
  673. CHECK((int)addr_c);
  674. return addr_c;
  675. }
  676. unsigned int SecCamera::getPhyAddrY(int index)
  677. {
  678. unsigned int addr_y;
  679. addr_y = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_PADDR_Y, index);
  680. CHECK((int)addr_y);
  681. return addr_y;
  682. }
  683. unsigned int SecCamera::getPhyAddrC(int index)
  684. {
  685. unsigned int addr_c;
  686. addr_c = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_PADDR_CBCR, index);
  687. CHECK((int)addr_c);
  688. return addr_c;
  689. }
  690. void SecCamera::pausePreview()
  691. {
  692. fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_STREAM_PAUSE, 0);
  693. }
  694. int SecCamera::getPreview()
  695. {
  696. int index;
  697. int ret;
  698. if (m_flag_camera_start == 0 || previewPoll(true) == 0) {
  699. ALOGE("ERR(%s):Start Camera Device Reset \n", __func__);
  700. /* GAUDI Project([arun.c@samsung.com]) 2010.05.20. [Implemented ESD code] */
  701. /*
  702. * When there is no data for more than 1 second from the camera we inform
  703. * the FIMC driver by calling fimc_v4l2_s_input() with a special value = 1000
  704. * FIMC driver identify that there is something wrong with the camera
  705. * and it restarts the sensor.
  706. */
  707. stopPreview();
  708. /* Reset Only Camera Device */
  709. ret = fimc_v4l2_querycap(m_cam_fd);
  710. CHECK(ret);
  711. if (fimc_v4l2_enuminput(m_cam_fd, m_camera_id))
  712. return -1;
  713. ret = fimc_v4l2_s_input(m_cam_fd, 1000);
  714. CHECK(ret);
  715. ret = startPreview();
  716. if (ret < 0) {
  717. ALOGE("ERR(%s): startPreview() return %d\n", __func__, ret);
  718. return 0;
  719. }
  720. }
  721. index = fimc_v4l2_dqbuf(m_cam_fd);
  722. if (!(0 <= index && index < MAX_BUFFERS)) {
  723. ALOGE("ERR(%s):wrong index = %d\n", __func__, index);
  724. return -1;
  725. }
  726. ret = fimc_v4l2_qbuf(m_cam_fd, index);
  727. CHECK(ret);
  728. return index;
  729. }
  730. int SecCamera::getRecordFrame()
  731. {
  732. if (m_flag_record_start == 0) {
  733. ALOGE("%s: m_flag_record_start is 0", __func__);
  734. return -1;
  735. }
  736. previewPoll(false);
  737. return fimc_v4l2_dqbuf(m_cam_fd2);
  738. }
  739. int SecCamera::releaseRecordFrame(int index)
  740. {
  741. if (!m_flag_record_start) {
  742. /* this can happen when recording frames are returned after
  743. * the recording is stopped at the driver level. we don't
  744. * need to return the buffers in this case and we've seen
  745. * cases where fimc could crash if we called qbuf and it
  746. * wasn't expecting it.
  747. */
  748. ALOGI("%s: recording not in progress, ignoring", __func__);
  749. return 0;
  750. }
  751. return fimc_v4l2_qbuf(m_cam_fd2, index);
  752. }
  753. int SecCamera::setPreviewSize(int width, int height, int pixel_format)
  754. {
  755. ALOGV("%s(width(%d), height(%d), format(%d))", __func__, width, height, pixel_format);
  756. int v4lpixelformat = pixel_format;
  757. #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
  758. if (v4lpixelformat == V4L2_PIX_FMT_YUV420)
  759. ALOGV("PreviewFormat:V4L2_PIX_FMT_YUV420");
  760. else if (v4lpixelformat == V4L2_PIX_FMT_NV12)
  761. ALOGV("PreviewFormat:V4L2_PIX_FMT_NV12");
  762. else if (v4lpixelformat == V4L2_PIX_FMT_NV12T)
  763. ALOGV("PreviewFormat:V4L2_PIX_FMT_NV12T");
  764. else if (v4lpixelformat == V4L2_PIX_FMT_NV21)
  765. ALOGV("PreviewFormat:V4L2_PIX_FMT_NV21");
  766. else if (v4lpixelformat == V4L2_PIX_FMT_YUV422P)
  767. ALOGV("PreviewFormat:V4L2_PIX_FMT_YUV422P");
  768. else if (v4lpixelformat == V4L2_PIX_FMT_YUYV)
  769. ALOGV("PreviewFormat:V4L2_PIX_FMT_YUYV");
  770. else if (v4lpixelformat == V4L2_PIX_FMT_RGB565)
  771. ALOGV("PreviewFormat:V4L2_PIX_FMT_RGB565");
  772. else
  773. ALOGV("PreviewFormat:UnknownFormat");
  774. #endif
  775. m_preview_width = width;
  776. m_preview_height = height;
  777. m_preview_v4lformat = v4lpixelformat;
  778. return 0;
  779. }
  780. int SecCamera::getPreviewSize(int *width, int *height, int *frame_size)
  781. {
  782. *width = m_preview_width;
  783. *height = m_preview_height;
  784. *frame_size = m_frameSize(m_preview_v4lformat, m_preview_width, m_preview_height);
  785. return 0;
  786. }
  787. int SecCamera::getPreviewMaxSize(int *width, int *height)
  788. {
  789. *width = m_preview_max_width;
  790. *height = m_preview_max_height;
  791. return 0;
  792. }
  793. int SecCamera::getPreviewPixelFormat(void)
  794. {
  795. return m_preview_v4lformat;
  796. }
  797. // ======================================================================
  798. // Snapshot
  799. /*
  800. * Devide getJpeg() as two funcs, setSnapshotCmd() & getJpeg() because of the shutter sound timing.
  801. * Here, just send the capture cmd to camera ISP to start JPEG capture.
  802. */
  803. int SecCamera::setSnapshotCmd(void)
  804. {
  805. ALOGV("%s :", __func__);
  806. int ret = 0;
  807. LOG_TIME_DEFINE(0)
  808. LOG_TIME_DEFINE(1)
  809. if (m_cam_fd <= 0) {
  810. ALOGE("ERR(%s):Camera was closed\n", __func__);
  811. return 0;
  812. }
  813. if (m_flag_camera_start > 0) {
  814. LOG_TIME_START(0)
  815. ALOGW("WARN(%s):Camera was in preview, should have been stopped\n", __func__);
  816. stopPreview();
  817. LOG_TIME_END(0)
  818. }
  819. memset(&m_events_c, 0, sizeof(m_events_c));
  820. m_events_c.fd = m_cam_fd;
  821. m_events_c.events = POLLIN | POLLERR;
  822. LOG_TIME_START(1) // prepare
  823. int nframe = 1;
  824. ret = fimc_v4l2_enum_fmt(m_cam_fd,m_snapshot_v4lformat);
  825. CHECK(ret);
  826. ret = fimc_v4l2_s_fmt_cap(m_cam_fd, m_snapshot_width, m_snapshot_height, V4L2_PIX_FMT_JPEG);
  827. CHECK(ret);
  828. ret = fimc_v4l2_reqbufs(m_cam_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, nframe);
  829. CHECK(ret);
  830. ret = fimc_v4l2_querybuf(m_cam_fd, &m_capture_buf, V4L2_BUF_TYPE_VIDEO_CAPTURE);
  831. CHECK(ret);
  832. ret = fimc_v4l2_qbuf(m_cam_fd, 0);
  833. CHECK(ret);
  834. ret = fimc_v4l2_streamon(m_cam_fd);
  835. CHECK(ret);
  836. LOG_TIME_END(1)
  837. return 0;
  838. }
  839. int SecCamera::endSnapshot(void)
  840. {
  841. int ret;
  842. ALOGI("%s :", __func__);
  843. if (m_capture_buf.start) {
  844. munmap(m_capture_buf.start, m_capture_buf.length);
  845. ALOGI("munmap():virt. addr %p size = %d\n",
  846. m_capture_buf.start, m_capture_buf.length);
  847. m_capture_buf.start = NULL;
  848. m_capture_buf.length = 0;
  849. }
  850. return 0;
  851. }
  852. /*
  853. * Set Jpeg quality & exif info and get JPEG data from camera ISP
  854. */
  855. unsigned char* SecCamera::getJpeg(int *jpeg_size, unsigned int *phyaddr)
  856. {
  857. ALOGV("%s :", __func__);
  858. int index, ret = 0;
  859. unsigned char *addr;
  860. LOG_TIME_DEFINE(2)
  861. // capture
  862. ret = fimc_poll(&m_events_c);
  863. CHECK_PTR(ret);
  864. index = fimc_v4l2_dqbuf(m_cam_fd);
  865. if (index != 0) {
  866. ALOGE("ERR(%s):wrong index = %d\n", __func__, index);
  867. return NULL;
  868. }
  869. *jpeg_size = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAM_JPEG_MAIN_SIZE);
  870. CHECK_PTR(*jpeg_size);
  871. int main_offset = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAM_JPEG_MAIN_OFFSET);
  872. CHECK_PTR(main_offset);
  873. m_postview_offset = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAM_JPEG_POSTVIEW_OFFSET);
  874. CHECK_PTR(m_postview_offset);
  875. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_STREAM_PAUSE, 0);
  876. CHECK_PTR(ret);
  877. ALOGV("\nsnapshot dqueued buffer = %d snapshot_width = %d snapshot_height = %d, size = %d\n\n",
  878. index, m_snapshot_width, m_snapshot_height, *jpeg_size);
  879. addr = (unsigned char*)(m_capture_buf.start) + main_offset;
  880. *phyaddr = getPhyAddrY(index) + m_postview_offset;
  881. LOG_TIME_START(2) // post
  882. ret = fimc_v4l2_streamoff(m_cam_fd);
  883. CHECK_PTR(ret);
  884. LOG_TIME_END(2)
  885. return addr;
  886. }
  887. int SecCamera::getExif(unsigned char *pExifDst, unsigned char *pThumbSrc)
  888. {
  889. JpegEncoder jpgEnc;
  890. ALOGV("%s : m_jpeg_thumbnail_width = %d, height = %d",
  891. __func__, m_jpeg_thumbnail_width, m_jpeg_thumbnail_height);
  892. if ((m_jpeg_thumbnail_width > 0) && (m_jpeg_thumbnail_height > 0)) {
  893. int inFormat = JPG_MODESEL_YCBCR;
  894. int outFormat = JPG_422;
  895. switch (m_snapshot_v4lformat) {
  896. case V4L2_PIX_FMT_NV12:
  897. case V4L2_PIX_FMT_NV21:
  898. case V4L2_PIX_FMT_NV12T:
  899. case V4L2_PIX_FMT_YUV420:
  900. outFormat = JPG_420;
  901. break;
  902. case V4L2_PIX_FMT_YUYV:
  903. case V4L2_PIX_FMT_UYVY:
  904. case V4L2_PIX_FMT_YUV422P:
  905. outFormat = JPG_422;
  906. break;
  907. }
  908. if (jpgEnc.setConfig(JPEG_SET_ENCODE_IN_FORMAT, inFormat) != JPG_SUCCESS)
  909. return -1;
  910. if (jpgEnc.setConfig(JPEG_SET_SAMPING_MODE, outFormat) != JPG_SUCCESS)
  911. return -1;
  912. if (jpgEnc.setConfig(JPEG_SET_ENCODE_QUALITY, JPG_QUALITY_LEVEL_2) != JPG_SUCCESS)
  913. return -1;
  914. int thumbWidth, thumbHeight, thumbSrcSize;
  915. getThumbnailConfig(&thumbWidth, &thumbHeight, &thumbSrcSize);
  916. if (jpgEnc.setConfig(JPEG_SET_ENCODE_WIDTH, thumbWidth) != JPG_SUCCESS)
  917. return -1;
  918. if (jpgEnc.setConfig(JPEG_SET_ENCODE_HEIGHT, thumbHeight) != JPG_SUCCESS)
  919. return -1;
  920. char *pInBuf = (char *)jpgEnc.getInBuf(thumbSrcSize);
  921. if (pInBuf == NULL)
  922. return -1;
  923. memcpy(pInBuf, pThumbSrc, thumbSrcSize);
  924. unsigned int thumbSize;
  925. jpgEnc.encode(&thumbSize, NULL);
  926. ALOGV("%s : enableThumb set to true", __func__);
  927. mExifInfo.enableThumb = true;
  928. } else {
  929. ALOGV("%s : enableThumb set to false", __func__);
  930. mExifInfo.enableThumb = false;
  931. }
  932. unsigned int exifSize;
  933. setExifChangedAttribute();
  934. ALOGV("%s: calling jpgEnc.makeExif, mExifInfo.width set to %d, height to %d\n",
  935. __func__, mExifInfo.width, mExifInfo.height);
  936. jpgEnc.makeExif(pExifDst, &mExifInfo, &exifSize, true);
  937. return exifSize;
  938. }
  939. void SecCamera::getPostViewConfig(int *width, int *height, int *size)
  940. {
  941. *width = FRONT_CAMERA_POSTVIEW_WIDTH;
  942. *height = FRONT_CAMERA_POSTVIEW_HEIGHT;
  943. *size = FRONT_CAMERA_POSTVIEW_WIDTH * FRONT_CAMERA_POSTVIEW_HEIGHT * FRONT_CAMERA_POSTVIEW_BPP / 8;
  944. ALOGV("[5B] m_preview_width : %d, mPostViewWidth = %d mPostViewHeight = %d mPostViewSize = %d",
  945. m_preview_width, *width, *height, *size);
  946. }
  947. void SecCamera::getThumbnailConfig(int *width, int *height, int *size)
  948. {
  949. *width = FRONT_CAMERA_THUMBNAIL_WIDTH;
  950. *height = FRONT_CAMERA_THUMBNAIL_HEIGHT;
  951. *size = FRONT_CAMERA_THUMBNAIL_WIDTH * FRONT_CAMERA_THUMBNAIL_HEIGHT
  952. * FRONT_CAMERA_THUMBNAIL_BPP / 8;
  953. }
  954. int SecCamera::getPostViewOffset(void)
  955. {
  956. return m_postview_offset;
  957. }
  958. int SecCamera::getSnapshotAndJpeg(unsigned char *yuv_buf, unsigned char *jpeg_buf,
  959. unsigned int *output_size)
  960. {
  961. ALOGV("%s :", __func__);
  962. int index;
  963. //unsigned int addr;
  964. unsigned char *addr;
  965. int ret = 0;
  966. LOG_TIME_DEFINE(0)
  967. LOG_TIME_DEFINE(1)
  968. LOG_TIME_DEFINE(2)
  969. LOG_TIME_DEFINE(3)
  970. LOG_TIME_DEFINE(4)
  971. LOG_TIME_DEFINE(5)
  972. //fimc_v4l2_streamoff(m_cam_fd); [zzangdol] remove - it is separate in HWInterface with camera_id
  973. if (m_cam_fd <= 0) {
  974. ALOGE("ERR(%s):Camera was closed\n", __func__);
  975. return -1;
  976. }
  977. if (m_flag_camera_start > 0) {
  978. LOG_TIME_START(0)
  979. ALOGW("WARN(%s):Camera was in preview, should have been stopped\n", __func__);
  980. stopPreview();
  981. LOG_TIME_END(0)
  982. }
  983. memset(&m_events_c, 0, sizeof(m_events_c));
  984. m_events_c.fd = m_cam_fd;
  985. m_events_c.events = POLLIN | POLLERR;
  986. #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
  987. if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV420)
  988. ALOGV("SnapshotFormat:V4L2_PIX_FMT_YUV420");
  989. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12)
  990. ALOGV("SnapshotFormat:V4L2_PIX_FMT_NV12");
  991. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12T)
  992. ALOGV("SnapshotFormat:V4L2_PIX_FMT_NV12T");
  993. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV21)
  994. ALOGV("SnapshotFormat:V4L2_PIX_FMT_NV21");
  995. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV422P)
  996. ALOGV("SnapshotFormat:V4L2_PIX_FMT_YUV422P");
  997. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUYV)
  998. ALOGV("SnapshotFormat:V4L2_PIX_FMT_YUYV");
  999. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_UYVY)
  1000. ALOGV("SnapshotFormat:V4L2_PIX_FMT_UYVY");
  1001. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_RGB565)
  1002. ALOGV("SnapshotFormat:V4L2_PIX_FMT_RGB565");
  1003. else
  1004. ALOGV("SnapshotFormat:UnknownFormat");
  1005. #endif
  1006. LOG_TIME_START(1) // prepare
  1007. int nframe = 1;
  1008. ret = fimc_v4l2_enum_fmt(m_cam_fd,m_snapshot_v4lformat);
  1009. CHECK(ret);
  1010. ret = fimc_v4l2_s_fmt_cap(m_cam_fd, m_snapshot_width, m_snapshot_height, m_snapshot_v4lformat);
  1011. CHECK(ret);
  1012. ret = fimc_v4l2_reqbufs(m_cam_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, nframe);
  1013. CHECK(ret);
  1014. ret = fimc_v4l2_querybuf(m_cam_fd, &m_capture_buf, V4L2_BUF_TYPE_VIDEO_CAPTURE);
  1015. CHECK(ret);
  1016. ret = fimc_v4l2_qbuf(m_cam_fd, 0);
  1017. CHECK(ret);
  1018. ret = fimc_v4l2_streamon(m_cam_fd);
  1019. CHECK(ret);
  1020. LOG_TIME_END(1)
  1021. LOG_TIME_START(2) // capture
  1022. fimc_poll(&m_events_c);
  1023. index = fimc_v4l2_dqbuf(m_cam_fd);
  1024. fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_STREAM_PAUSE, 0);
  1025. ALOGV("\nsnapshot dequeued buffer = %d snapshot_width = %d snapshot_height = %d\n\n",
  1026. index, m_snapshot_width, m_snapshot_height);
  1027. LOG_TIME_END(2)
  1028. ALOGI("%s : calling memcpy from m_capture_buf", __func__);
  1029. memcpy(yuv_buf, (unsigned char*)m_capture_buf.start, m_snapshot_width * m_snapshot_height * 2);
  1030. LOG_TIME_START(5) // post
  1031. fimc_v4l2_streamoff(m_cam_fd);
  1032. LOG_TIME_END(5)
  1033. LOG_CAMERA("getSnapshotAndJpeg intervals : stopPreview(%lu), prepare(%lu),"
  1034. " capture(%lu), memcpy(%lu), yuv2Jpeg(%lu), post(%lu) us",
  1035. LOG_TIME(0), LOG_TIME(1), LOG_TIME(2), LOG_TIME(3), LOG_TIME(4), LOG_TIME(5));
  1036. /* JPEG encoding */
  1037. JpegEncoder jpgEnc;
  1038. int inFormat = JPG_MODESEL_YCBCR;
  1039. int outFormat = JPG_422;
  1040. switch (m_snapshot_v4lformat) {
  1041. case V4L2_PIX_FMT_NV12:
  1042. case V4L2_PIX_FMT_NV21:
  1043. case V4L2_PIX_FMT_NV12T:
  1044. case V4L2_PIX_FMT_YUV420:
  1045. outFormat = JPG_420;
  1046. break;
  1047. case V4L2_PIX_FMT_YUYV:
  1048. case V4L2_PIX_FMT_UYVY:
  1049. case V4L2_PIX_FMT_YUV422P:
  1050. default:
  1051. outFormat = JPG_422;
  1052. break;
  1053. }
  1054. if (jpgEnc.setConfig(JPEG_SET_ENCODE_IN_FORMAT, inFormat) != JPG_SUCCESS)
  1055. ALOGE("[JPEG_SET_ENCODE_IN_FORMAT] Error\n");
  1056. if (jpgEnc.setConfig(JPEG_SET_SAMPING_MODE, outFormat) != JPG_SUCCESS)
  1057. ALOGE("[JPEG_SET_SAMPING_MODE] Error\n");
  1058. image_quality_type_t jpegQuality;
  1059. if (m_jpeg_quality >= 90)
  1060. jpegQuality = JPG_QUALITY_LEVEL_1;
  1061. else if (m_jpeg_quality >= 80)
  1062. jpegQuality = JPG_QUALITY_LEVEL_2;
  1063. else if (m_jpeg_quality >= 70)
  1064. jpegQuality = JPG_QUALITY_LEVEL_3;
  1065. else
  1066. jpegQuality = JPG_QUALITY_LEVEL_4;
  1067. if (jpgEnc.setConfig(JPEG_SET_ENCODE_QUALITY, jpegQuality) != JPG_SUCCESS)
  1068. ALOGE("[JPEG_SET_ENCODE_QUALITY] Error\n");
  1069. if (jpgEnc.setConfig(JPEG_SET_ENCODE_WIDTH, m_snapshot_width) != JPG_SUCCESS)
  1070. ALOGE("[JPEG_SET_ENCODE_WIDTH] Error\n");
  1071. if (jpgEnc.setConfig(JPEG_SET_ENCODE_HEIGHT, m_snapshot_height) != JPG_SUCCESS)
  1072. ALOGE("[JPEG_SET_ENCODE_HEIGHT] Error\n");
  1073. unsigned int snapshot_size = m_snapshot_width * m_snapshot_height * 2;
  1074. unsigned char *pInBuf = (unsigned char *)jpgEnc.getInBuf(snapshot_size);
  1075. if (pInBuf == NULL) {
  1076. ALOGE("JPEG input buffer is NULL!!\n");
  1077. return -1;
  1078. }
  1079. memcpy(pInBuf, yuv_buf, snapshot_size);
  1080. setExifChangedAttribute();
  1081. jpgEnc.encode(output_size, NULL);
  1082. uint64_t outbuf_size;
  1083. unsigned char *pOutBuf = (unsigned char *)jpgEnc.getOutBuf(&outbuf_size);
  1084. if (pOutBuf == NULL) {
  1085. ALOGE("JPEG output buffer is NULL!!\n");
  1086. return -1;
  1087. }
  1088. memcpy(jpeg_buf, pOutBuf, outbuf_size);
  1089. return 0;
  1090. }
  1091. int SecCamera::setSnapshotSize(int width, int height)
  1092. {
  1093. ALOGV("%s(width(%d), height(%d))", __func__, width, height);
  1094. m_snapshot_width = width;
  1095. m_snapshot_height = height;
  1096. return 0;
  1097. }
  1098. int SecCamera::getSnapshotSize(int *width, int *height, int *frame_size)
  1099. {
  1100. *width = m_snapshot_width;
  1101. *height = m_snapshot_height;
  1102. int frame = 0;
  1103. frame = m_frameSize(m_snapshot_v4lformat, m_snapshot_width, m_snapshot_height);
  1104. // set it big.
  1105. if (frame == 0)
  1106. frame = m_snapshot_width * m_snapshot_height * BPP;
  1107. *frame_size = frame;
  1108. return 0;
  1109. }
  1110. int SecCamera::getSnapshotMaxSize(int *width, int *height)
  1111. {
  1112. m_snapshot_max_width = MAX_FRONT_CAMERA_SNAPSHOT_WIDTH;
  1113. m_snapshot_max_height = MAX_FRONT_CAMERA_SNAPSHOT_HEIGHT;
  1114. *width = m_snapshot_max_width;
  1115. *height = m_snapshot_max_height;
  1116. return 0;
  1117. }
  1118. int SecCamera::setSnapshotPixelFormat(int pixel_format)
  1119. {
  1120. int v4lpixelformat= pixel_format;
  1121. if (m_snapshot_v4lformat != v4lpixelformat) {
  1122. m_snapshot_v4lformat = v4lpixelformat;
  1123. }
  1124. #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
  1125. if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV420)
  1126. ALOGE("%s : SnapshotFormat:V4L2_PIX_FMT_YUV420", __func__);
  1127. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12)
  1128. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV12", __func__);
  1129. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12T)
  1130. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV12T", __func__);
  1131. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV21)
  1132. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV21", __func__);
  1133. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV422P)
  1134. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_YUV422P", __func__);
  1135. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUYV)
  1136. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_YUYV", __func__);
  1137. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_UYVY)
  1138. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_UYVY", __func__);
  1139. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_RGB565)
  1140. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_RGB565", __func__);
  1141. else
  1142. ALOGD("SnapshotFormat:UnknownFormat");
  1143. #endif
  1144. return 0;
  1145. }
  1146. int SecCamera::getSnapshotPixelFormat(void)
  1147. {
  1148. return m_snapshot_v4lformat;
  1149. }
  1150. // ======================================================================
  1151. // Settings
  1152. int SecCamera::getCameraId(void)
  1153. {
  1154. return m_camera_id;
  1155. }
  1156. // -----------------------------------
  1157. int SecCamera::setAutofocus(void)
  1158. {
  1159. ALOGV("%s :", __func__);
  1160. if (m_cam_fd <= 0) {
  1161. ALOGE("ERR(%s):Camera was closed\n", __func__);
  1162. return -1;
  1163. }
  1164. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_AUTO_FOCUS, AUTO_FOCUS_ON) < 0) {
  1165. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_AUTO_FOCUS", __func__);
  1166. return -1;
  1167. }
  1168. return 0;
  1169. }
  1170. int SecCamera::getAutoFocusResult(void)
  1171. {
  1172. int af_result, count, ret;
  1173. for (count = 0; count < FIRST_AF_SEARCH_COUNT; count++) {
  1174. ret = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAMERA_AUTO_FOCUS_RESULT_FIRST);
  1175. if (ret != AF_PROGRESS)
  1176. break;
  1177. usleep(AF_DELAY);
  1178. }
  1179. if ((count >= FIRST_AF_SEARCH_COUNT) || (ret != AF_SUCCESS)) {
  1180. ALOGV("%s : 1st AF timed out, failed, or was canceled", __func__);
  1181. af_result = 0;
  1182. goto finish_auto_focus;
  1183. }
  1184. for (count = 0; count < SECOND_AF_SEARCH_COUNT; count++) {
  1185. ret = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAMERA_AUTO_FOCUS_RESULT_SECOND);
  1186. /* low byte is garbage. done when high byte is 0x0 */
  1187. if (!(ret & 0xff00))
  1188. break;
  1189. usleep(AF_DELAY);
  1190. }
  1191. if (count >= SECOND_AF_SEARCH_COUNT) {
  1192. ALOGV("%s : 2nd AF timed out, failed, or was canceled", __func__);
  1193. af_result = 0;
  1194. goto finish_auto_focus;
  1195. }
  1196. af_result = 1;
  1197. ALOGV("%s : AF was successful, returning %d", __func__, af_result);
  1198. finish_auto_focus:
  1199. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FINISH_AUTO_FOCUS, 0) < 0) {
  1200. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_PRE_FLASH", __func__);
  1201. return -1;
  1202. }
  1203. return af_result;
  1204. }
  1205. int SecCamera::cancelAutofocus(void)
  1206. {
  1207. ALOGV("%s :", __func__);
  1208. if (m_cam_fd <= 0) {
  1209. ALOGE("ERR(%s):Camera was closed\n", __func__);
  1210. return -1;
  1211. }
  1212. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_AUTO_FOCUS, AUTO_FOCUS_OFF) < 0) {
  1213. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_AUTO_FOCUS", __func__);
  1214. return -1;
  1215. }
  1216. return 0;
  1217. }
  1218. // -----------------------------------
  1219. int SecCamera::zoomIn(void)
  1220. {
  1221. ALOGV("%s :", __func__);
  1222. return 0;
  1223. }
  1224. int SecCamera::zoomOut(void)
  1225. {
  1226. ALOGV("%s :", __func__);
  1227. return 0;
  1228. }
  1229. // -----------------------------------
  1230. int SecCamera::SetRotate(int angle)
  1231. {
  1232. ALOGE("%s(angle(%d))", __func__, angle);
  1233. if (m_angle != angle) {
  1234. switch (angle) {
  1235. case -360:
  1236. case 0:
  1237. case 360:
  1238. m_angle = 0;
  1239. break;
  1240. case -270:
  1241. case 90:
  1242. m_angle = 90;
  1243. break;
  1244. case -180:
  1245. case 180:
  1246. m_angle = 180;
  1247. break;
  1248. case -90:
  1249. case 270:
  1250. m_angle = 270;
  1251. break;
  1252. default:
  1253. ALOGE("ERR(%s):Invalid angle(%d)", __func__, angle);
  1254. return -1;
  1255. }
  1256. if (m_flag_camera_start) {
  1257. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_ROTATION, angle) < 0) {
  1258. ALOGE("ERR(%s):Fail on V4L2_CID_ROTATION", __func__);
  1259. return -1;
  1260. }
  1261. }
  1262. }
  1263. return 0;
  1264. }
  1265. int SecCamera::getRotate(void)
  1266. {
  1267. ALOGV("%s : angle(%d)", __func__, m_angle);
  1268. return m_angle;
  1269. }
  1270. int SecCamera::setFrameRate(int frame_rate)
  1271. {
  1272. ALOGV("%s(FrameRate(%d))", __func__, frame_rate);
  1273. if (frame_rate < FRAME_RATE_AUTO || FRAME_RATE_MAX < frame_rate )
  1274. ALOGE("ERR(%s):Invalid frame_rate(%d)", __func__, frame_rate);
  1275. if (m_params->capture.timeperframe.denominator != (unsigned)frame_rate) {
  1276. m_params->capture.timeperframe.denominator = frame_rate;
  1277. if (m_flag_camera_start) {
  1278. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE, frame_rate) < 0) {
  1279. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FRAME_RATE", __func__);
  1280. return -1;
  1281. }
  1282. }
  1283. }
  1284. return 0;
  1285. }
  1286. // -----------------------------------
  1287. int SecCamera::setVerticalMirror(void)
  1288. {
  1289. ALOGV("%s :", __func__);
  1290. if (m_cam_fd <= 0) {
  1291. ALOGE("ERR(%s):Camera was closed\n", __func__);
  1292. return -1;
  1293. }
  1294. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_VFLIP, 0) < 0) {
  1295. ALOGE("ERR(%s):Fail on V4L2_CID_VFLIP", __func__);
  1296. return -1;
  1297. }
  1298. return 0;
  1299. }
  1300. int SecCamera::setHorizontalMirror(void)
  1301. {
  1302. ALOGV("%s :", __func__);
  1303. if (m_cam_fd <= 0) {
  1304. ALOGE("ERR(%s):Camera was closed\n", __func__);
  1305. return -1;
  1306. }
  1307. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_HFLIP, 0) < 0) {
  1308. ALOGE("ERR(%s):Fail on V4L2_CID_HFLIP", __func__);
  1309. return -1;
  1310. }
  1311. return 0;
  1312. }
  1313. // -----------------------------------
  1314. int SecCamera::setWhiteBalance(int white_balance)
  1315. {
  1316. ALOGV("%s(white_balance(%d))", __func__, white_balance);
  1317. if (white_balance <= WHITE_BALANCE_BASE || WHITE_BALANCE_MAX <= white_balance) {
  1318. ALOGE("ERR(%s):Invalid white_balance(%d)", __func__, white_balance);
  1319. return -1;
  1320. }
  1321. if (m_params->white_balance != white_balance) {
  1322. m_params->white_balance = white_balance;
  1323. if (m_flag_camera_start) {
  1324. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_WHITE_BALANCE, white_balance) < 0) {
  1325. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_WHITE_BALANCE", __func__);
  1326. return -1;
  1327. }
  1328. }
  1329. }
  1330. return 0;
  1331. }
  1332. int SecCamera::getWhiteBalance(void)
  1333. {
  1334. ALOGV("%s : white_balance(%d)", __func__, m_params->white_balance);
  1335. return m_params->white_balance;
  1336. }
  1337. // -----------------------------------
  1338. int SecCamera::setBrightness(int brightness)
  1339. {
  1340. ALOGV("%s(brightness(%d))", __func__, brightness);
  1341. brightness += EV_DEFAULT;
  1342. if (brightness < EV_MINUS_4 || EV_PLUS_4 < brightness) {
  1343. ALOGE("ERR(%s):Invalid brightness(%d)", __func__, brightness);
  1344. return -1;
  1345. }
  1346. if (m_params->brightness != brightness) {
  1347. m_params->brightness = brightness;
  1348. if (m_flag_camera_start) {
  1349. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_BRIGHTNESS, brightness) < 0) {
  1350. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_BRIGHTNESS", __func__);
  1351. return -1;
  1352. }
  1353. }
  1354. }
  1355. return 0;
  1356. }
  1357. int SecCamera::getBrightness(void)
  1358. {
  1359. ALOGV("%s : brightness(%d)", __func__, m_params->brightness);
  1360. return m_params->brightness;
  1361. }
  1362. // -----------------------------------
  1363. int SecCamera::setImageEffect(int image_effect)
  1364. {
  1365. ALOGV("%s(image_effect(%d))", __func__, image_effect);
  1366. if (image_effect <= IMAGE_EFFECT_BASE || IMAGE_EFFECT_MAX <= image_effect) {
  1367. ALOGE("ERR(%s):Invalid image_effect(%d)", __func__, image_effect);
  1368. return -1;
  1369. }
  1370. if (m_params->effects != image_effect) {
  1371. m_params->effects = image_effect;
  1372. if (m_flag_camera_start) {
  1373. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_EFFECT, image_effect) < 0) {
  1374. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_EFFECT", __func__);
  1375. return -1;
  1376. }
  1377. }
  1378. }
  1379. return 0;
  1380. }
  1381. int SecCamera::getImageEffect(void)
  1382. {
  1383. ALOGV("%s : image_effect(%d)", __func__, m_params->effects);
  1384. return m_params->effects;
  1385. }
  1386. // ======================================================================
  1387. int SecCamera::setAntiBanding(int anti_banding)
  1388. {
  1389. ALOGV("%s(anti_banding(%d))", __func__, anti_banding);
  1390. if (anti_banding < ANTI_BANDING_AUTO || ANTI_BANDING_OFF < anti_banding) {
  1391. ALOGE("ERR(%s):Invalid anti_banding (%d)", __func__, anti_banding);
  1392. return -1;
  1393. }
  1394. if (m_anti_banding != anti_banding) {
  1395. m_anti_banding = anti_banding;
  1396. if (m_flag_camera_start) {
  1397. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ANTI_BANDING, anti_banding) < 0) {
  1398. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_ANTI_BANDING", __func__);
  1399. return -1;
  1400. }
  1401. }
  1402. }
  1403. return 0;
  1404. }
  1405. //======================================================================
  1406. int SecCamera::setSceneMode(int scene_mode)
  1407. {
  1408. ALOGV("%s(scene_mode(%d))", __func__, scene_mode);
  1409. if (scene_mode <= SCENE_MODE_BASE || SCENE_MODE_MAX <= scene_mode) {
  1410. ALOGE("ERR(%s):Invalid scene_mode (%d)", __func__, scene_mode);
  1411. return -1;
  1412. }
  1413. if (m_params->scene_mode != scene_mode) {
  1414. m_params->scene_mode = scene_mode;
  1415. if (m_flag_camera_start) {
  1416. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SCENE_MODE, scene_mode) < 0) {
  1417. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SCENE_MODE", __func__);
  1418. return -1;
  1419. }
  1420. }
  1421. }
  1422. return 0;
  1423. }
  1424. int SecCamera::getSceneMode(void)
  1425. {
  1426. return m_params->scene_mode;
  1427. }
  1428. //======================================================================
  1429. int SecCamera::setFlashMode(int flash_mode)
  1430. {
  1431. ALOGV("%s(flash_mode(%d))", __func__, flash_mode);
  1432. if (flash_mode <= FLASH_MODE_BASE || FLASH_MODE_MAX <= flash_mode) {
  1433. ALOGE("ERR(%s):Invalid flash_mode (%d)", __func__, flash_mode);
  1434. return -1;
  1435. }
  1436. if (m_params->flash_mode != flash_mode) {
  1437. m_params->flash_mode = flash_mode;
  1438. if (m_flag_camera_start) {
  1439. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FLASH_MODE, flash_mode) < 0) {
  1440. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FLASH_MODE", __func__);
  1441. return -1;
  1442. }
  1443. }
  1444. }
  1445. return 0;
  1446. }
  1447. int SecCamera::getFlashMode(void)
  1448. {
  1449. return m_params->flash_mode;
  1450. }
  1451. //======================================================================
  1452. int SecCamera::setISO(int iso_value)
  1453. {
  1454. ALOGV("%s(iso_value(%d))", __func__, iso_value);
  1455. if (iso_value < ISO_AUTO || ISO_MAX <= iso_value) {
  1456. ALOGE("ERR(%s):Invalid iso_value (%d)", __func__, iso_value);
  1457. return -1;
  1458. }
  1459. if (m_params->iso != iso_value) {
  1460. m_params->iso = iso_value;
  1461. if (m_flag_camera_start) {
  1462. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ISO, iso_value) < 0) {
  1463. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_ISO", __func__);
  1464. return -1;
  1465. }
  1466. }
  1467. }
  1468. return 0;
  1469. }
  1470. int SecCamera::getISO(void)
  1471. {
  1472. return m_params->iso;
  1473. }
  1474. //======================================================================
  1475. int SecCamera::setContrast(int contr

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