PageRenderTime 59ms CodeModel.GetById 11ms RepoModel.GetById 1ms app.codeStats 1ms

/libcamera/SecCamera.cpp

https://github.com/tehtrk/android_device_samsung_infuse4g
C++ | 3189 lines | 2398 code | 602 blank | 189 comment | 455 complexity | 1c9c844430ebcba7e49e064e13643781 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. * Copyright 2011, The CyanogenMod Project
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the "License");
  7. * you may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. /*
  19. ************************************
  20. * Filename: SecCamera.cpp
  21. * Author: Sachin P. Kamat
  22. * Purpose: This file interacts with the Camera and JPEG drivers.
  23. *************************************
  24. */
  25. //#define LOG_NDEBUG 0
  26. #define LOG_TAG "SecCamera"
  27. #include <utils/Log.h>
  28. #include <math.h>
  29. #include <string.h>
  30. #include <stdlib.h>
  31. #include <sys/poll.h>
  32. #include "SecCamera.h"
  33. #include "cutils/properties.h"
  34. using namespace android;
  35. #define CHECK(return_value) \
  36. if (return_value < 0) { \
  37. ALOGE("%s::%d fail. errno: %s, m_camera_id = %d\n", \
  38. __func__, __LINE__, strerror(errno), m_camera_id); \
  39. return -1; \
  40. }
  41. #define CHECK_PTR(return_value) \
  42. if (return_value < 0) { \
  43. ALOGE("%s::%d fail, errno: %s, m_camera_id = %d\n", \
  44. __func__,__LINE__, strerror(errno), m_camera_id); \
  45. return NULL; \
  46. }
  47. #define ALIGN_TO_32B(x) ((((x) + (1 << 5) - 1) >> 5) << 5)
  48. #define ALIGN_TO_128B(x) ((((x) + (1 << 7) - 1) >> 7) << 7)
  49. #define ALIGN_TO_8KB(x) ((((x) + (1 << 13) - 1) >> 13) << 13)
  50. namespace android {
  51. // ======================================================================
  52. // Camera controls
  53. static struct timeval time_start;
  54. static struct timeval time_stop;
  55. unsigned long measure_time(struct timeval *start, struct timeval *stop)
  56. {
  57. unsigned long sec, usec, time;
  58. sec = stop->tv_sec - start->tv_sec;
  59. if (stop->tv_usec >= start->tv_usec) {
  60. usec = stop->tv_usec - start->tv_usec;
  61. } else {
  62. usec = stop->tv_usec + 1000000 - start->tv_usec;
  63. sec--;
  64. }
  65. time = (sec * 1000000) + usec;
  66. return time;
  67. }
  68. static int get_pixel_depth(unsigned int fmt)
  69. {
  70. int depth = 0;
  71. switch (fmt) {
  72. case V4L2_PIX_FMT_NV12:
  73. depth = 12;
  74. break;
  75. case V4L2_PIX_FMT_NV12T:
  76. depth = 12;
  77. break;
  78. case V4L2_PIX_FMT_NV21:
  79. depth = 12;
  80. break;
  81. case V4L2_PIX_FMT_YUV420:
  82. depth = 12;
  83. break;
  84. case V4L2_PIX_FMT_RGB565:
  85. case V4L2_PIX_FMT_YUYV:
  86. case V4L2_PIX_FMT_YVYU:
  87. case V4L2_PIX_FMT_UYVY:
  88. case V4L2_PIX_FMT_VYUY:
  89. case V4L2_PIX_FMT_NV16:
  90. case V4L2_PIX_FMT_NV61:
  91. case V4L2_PIX_FMT_YUV422P:
  92. depth = 16;
  93. break;
  94. case V4L2_PIX_FMT_RGB32:
  95. depth = 32;
  96. break;
  97. }
  98. return depth;
  99. }
  100. #define ALIGN_W(x) (((x) + 0x7F) & (~0x7F)) // Set as multiple of 128
  101. #define ALIGN_H(x) (((x) + 0x1F) & (~0x1F)) // Set as multiple of 32
  102. #define ALIGN_BUF(x) (((x) + 0x1FFF)& (~0x1FFF)) // Set as multiple of 8K
  103. static int fimc_poll(struct pollfd *events)
  104. {
  105. int ret;
  106. /* 10 second delay is because sensor can take a long time
  107. * to do auto focus and capture in dark settings
  108. */
  109. ret = poll(events, 1, 10000);
  110. if (ret < 0) {
  111. ALOGE("ERR(%s):poll error\n", __func__);
  112. return ret;
  113. }
  114. if (ret == 0) {
  115. ALOGE("ERR(%s):No data in 10 secs..\n", __func__);
  116. return ret;
  117. }
  118. return ret;
  119. }
  120. int SecCamera::previewPoll(bool preview)
  121. {
  122. int ret;
  123. if (preview) {
  124. #ifdef ENABLE_ESD_PREVIEW_CHECK
  125. int status = 0;
  126. if (!(++m_esd_check_count % 60)) {
  127. status = getCameraSensorESDStatus();
  128. m_esd_check_count = 0;
  129. if (status) {
  130. ALOGE("ERR(%s) ESD status(%d)", __func__, status);
  131. return status;
  132. }
  133. }
  134. #endif
  135. ret = poll(&m_events_c, 1, 1000);
  136. } else {
  137. ret = poll(&m_events_c2, 1, 1000);
  138. }
  139. if (ret < 0) {
  140. ALOGE("ERR(%s):poll error\n", __func__);
  141. return ret;
  142. }
  143. if (ret == 0) {
  144. ALOGE("ERR(%s):No data in 1 secs.. Camera Device Reset \n", __func__);
  145. return ret;
  146. }
  147. return ret;
  148. }
  149. static int fimc_v4l2_querycap(int fp)
  150. {
  151. struct v4l2_capability cap;
  152. int ret = 0;
  153. ret = ioctl(fp, VIDIOC_QUERYCAP, &cap);
  154. if (ret < 0) {
  155. ALOGE("ERR(%s):VIDIOC_QUERYCAP failed\n", __func__);
  156. return -1;
  157. }
  158. if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
  159. ALOGE("ERR(%s):no capture devices\n", __func__);
  160. return -1;
  161. }
  162. return ret;
  163. }
  164. static const __u8* fimc_v4l2_enuminput(int fp, int index)
  165. {
  166. static struct v4l2_input input;
  167. input.index = index;
  168. if (ioctl(fp, VIDIOC_ENUMINPUT, &input) != 0) {
  169. ALOGE("ERR(%s):No matching index found\n", __func__);
  170. return NULL;
  171. }
  172. ALOGI("Name of input channel[%d] is %s\n", input.index, input.name);
  173. return input.name;
  174. }
  175. static int fimc_v4l2_s_input(int fp, int index)
  176. {
  177. struct v4l2_input input;
  178. int ret;
  179. input.index = index;
  180. ret = ioctl(fp, VIDIOC_S_INPUT, &input);
  181. if (ret < 0) {
  182. ALOGE("ERR(%s):VIDIOC_S_INPUT failed\n", __func__);
  183. return ret;
  184. }
  185. return ret;
  186. }
  187. static int fimc_v4l2_s_fmt(int fp, int width, int height, unsigned int fmt, int flag_capture)
  188. {
  189. struct v4l2_format v4l2_fmt;
  190. struct v4l2_pix_format pixfmt;
  191. int ret;
  192. v4l2_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  193. memset(&pixfmt, 0, sizeof(pixfmt));
  194. pixfmt.width = width;
  195. pixfmt.height = height;
  196. pixfmt.pixelformat = fmt;
  197. pixfmt.sizeimage = (width * height * get_pixel_depth(fmt)) / 8;
  198. pixfmt.field = V4L2_FIELD_NONE;
  199. v4l2_fmt.fmt.pix = pixfmt;
  200. /* Set up for capture */
  201. ret = ioctl(fp, VIDIOC_S_FMT, &v4l2_fmt);
  202. if (ret < 0) {
  203. ALOGE("ERR(%s):VIDIOC_S_FMT failed\n", __func__);
  204. return -1;
  205. }
  206. return 0;
  207. }
  208. static int fimc_v4l2_s_fmt_cap(int fp, int width, int height, unsigned int fmt)
  209. {
  210. struct v4l2_format v4l2_fmt;
  211. struct v4l2_pix_format pixfmt;
  212. int ret;
  213. memset(&pixfmt, 0, sizeof(pixfmt));
  214. v4l2_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  215. pixfmt.width = width;
  216. pixfmt.height = height;
  217. pixfmt.pixelformat = fmt;
  218. if (fmt == V4L2_PIX_FMT_JPEG) {
  219. pixfmt.colorspace = V4L2_COLORSPACE_JPEG;
  220. }
  221. pixfmt.sizeimage = (width * height * get_pixel_depth(fmt)) / 8;
  222. v4l2_fmt.fmt.pix = pixfmt;
  223. //ALOGE("ori_w %d, ori_h %d, w %d, h %d\n", width, height, v4l2_fmt.fmt.pix.width, v4l2_fmt.fmt.pix.height);
  224. /* Set up for capture */
  225. ret = ioctl(fp, VIDIOC_S_FMT, &v4l2_fmt);
  226. if (ret < 0) {
  227. ALOGE("ERR(%s):VIDIOC_S_FMT failed\n", __func__);
  228. return ret;
  229. }
  230. return ret;
  231. }
  232. static int fimc_v4l2_enum_fmt(int fp, unsigned int fmt)
  233. {
  234. struct v4l2_fmtdesc fmtdesc;
  235. int found = 0;
  236. fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  237. fmtdesc.index = 0;
  238. while (ioctl(fp, VIDIOC_ENUM_FMT, &fmtdesc) == 0) {
  239. if (fmtdesc.pixelformat == fmt) {
  240. ALOGV("passed fmt = %#x found pixel format[%d]: %s\n", fmt, fmtdesc.index, fmtdesc.description);
  241. found = 1;
  242. break;
  243. }
  244. fmtdesc.index++;
  245. }
  246. if (!found) {
  247. ALOGE("unsupported pixel format\n");
  248. return -1;
  249. }
  250. return 0;
  251. }
  252. static int fimc_v4l2_reqbufs(int fp, enum v4l2_buf_type type, int nr_bufs)
  253. {
  254. struct v4l2_requestbuffers req;
  255. int ret;
  256. req.count = nr_bufs;
  257. req.type = type;
  258. req.memory = V4L2_MEMORY_MMAP;
  259. ret = ioctl(fp, VIDIOC_REQBUFS, &req);
  260. if (ret < 0) {
  261. ALOGE("ERR(%s):VIDIOC_REQBUFS failed\n", __func__);
  262. return -1;
  263. }
  264. return req.count;
  265. }
  266. static int fimc_v4l2_querybuf(int fp, struct fimc_buffer *buffer, enum v4l2_buf_type type)
  267. {
  268. struct v4l2_buffer v4l2_buf;
  269. int ret;
  270. ALOGI("%s :", __func__);
  271. v4l2_buf.type = type;
  272. v4l2_buf.memory = V4L2_MEMORY_MMAP;
  273. v4l2_buf.index = 0;
  274. ret = ioctl(fp , VIDIOC_QUERYBUF, &v4l2_buf);
  275. if (ret < 0) {
  276. ALOGE("ERR(%s):VIDIOC_QUERYBUF failed\n", __func__);
  277. return -1;
  278. }
  279. buffer->length = v4l2_buf.length;
  280. if ((buffer->start = (char *)mmap(0, v4l2_buf.length,
  281. PROT_READ | PROT_WRITE, MAP_SHARED,
  282. fp, v4l2_buf.m.offset)) < 0) {
  283. ALOGE("%s %d] mmap() failed\n",__func__, __LINE__);
  284. return -1;
  285. }
  286. ALOGI("%s: buffer->start = %p v4l2_buf.length = %d",
  287. __func__, buffer->start, v4l2_buf.length);
  288. return 0;
  289. }
  290. static int fimc_v4l2_streamon(int fp)
  291. {
  292. enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  293. int ret;
  294. ret = ioctl(fp, VIDIOC_STREAMON, &type);
  295. if (ret < 0) {
  296. ALOGE("ERR(%s):VIDIOC_STREAMON failed\n", __func__);
  297. return ret;
  298. }
  299. return ret;
  300. }
  301. static int fimc_v4l2_streamoff(int fp)
  302. {
  303. enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  304. int ret;
  305. ALOGV("%s :", __func__);
  306. ret = ioctl(fp, VIDIOC_STREAMOFF, &type);
  307. if (ret < 0) {
  308. ALOGE("ERR(%s):VIDIOC_STREAMOFF failed\n", __func__);
  309. return ret;
  310. }
  311. return ret;
  312. }
  313. static int fimc_v4l2_qbuf(int fp, int index)
  314. {
  315. struct v4l2_buffer v4l2_buf;
  316. int ret;
  317. v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  318. v4l2_buf.memory = V4L2_MEMORY_MMAP;
  319. v4l2_buf.index = index;
  320. ret = ioctl(fp, VIDIOC_QBUF, &v4l2_buf);
  321. if (ret < 0) {
  322. ALOGE("ERR(%s):VIDIOC_QBUF failed\n", __func__);
  323. return ret;
  324. }
  325. return 0;
  326. }
  327. static int fimc_v4l2_dqbuf(int fp)
  328. {
  329. struct v4l2_buffer v4l2_buf;
  330. int ret;
  331. v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  332. v4l2_buf.memory = V4L2_MEMORY_MMAP;
  333. ret = ioctl(fp, VIDIOC_DQBUF, &v4l2_buf);
  334. if (ret < 0) {
  335. ALOGE("ERR(%s):VIDIOC_DQBUF failed, dropped frame\n", __func__);
  336. return ret;
  337. }
  338. return v4l2_buf.index;
  339. }
  340. static int fimc_v4l2_g_ctrl(int fp, unsigned int id)
  341. {
  342. struct v4l2_control ctrl;
  343. int ret;
  344. ctrl.id = id;
  345. ret = ioctl(fp, VIDIOC_G_CTRL, &ctrl);
  346. if (ret < 0) {
  347. ALOGE("ERR(%s): VIDIOC_G_CTRL(id = 0x%x (%d)) failed, ret = %d\n",
  348. __func__, id, id-V4L2_CID_PRIVATE_BASE, ret);
  349. return ret;
  350. }
  351. return ctrl.value;
  352. }
  353. static int fimc_v4l2_s_ctrl(int fp, unsigned int id, unsigned int value)
  354. {
  355. struct v4l2_control ctrl;
  356. int ret;
  357. ctrl.id = id;
  358. ctrl.value = value;
  359. ret = ioctl(fp, VIDIOC_S_CTRL, &ctrl);
  360. if (ret < 0) {
  361. ALOGE("ERR(%s):VIDIOC_S_CTRL(id = %#x (%d), value = %d) failed ret = %d\n",
  362. __func__, id, id-V4L2_CID_PRIVATE_BASE, value, ret);
  363. return ret;
  364. }
  365. return ctrl.value;
  366. }
  367. static int fimc_v4l2_s_ext_ctrl(int fp, unsigned int id, void *value)
  368. {
  369. struct v4l2_ext_controls ctrls;
  370. struct v4l2_ext_control ctrl;
  371. int ret;
  372. ctrl.id = id;
  373. ctrl.string = (char *) value;
  374. ctrls.ctrl_class = V4L2_CTRL_CLASS_CAMERA;
  375. ctrls.count = 1;
  376. ctrls.controls = &ctrl;
  377. ret = ioctl(fp, VIDIOC_S_EXT_CTRLS, &ctrls);
  378. if (ret < 0)
  379. ALOGE("ERR(%s):VIDIOC_S_EXT_CTRLS failed\n", __func__);
  380. return ret;
  381. }
  382. static int fimc_v4l2_g_parm(int fp, struct v4l2_streamparm *streamparm)
  383. {
  384. int ret;
  385. streamparm->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  386. ret = ioctl(fp, VIDIOC_G_PARM, streamparm);
  387. if (ret < 0) {
  388. ALOGE("ERR(%s):VIDIOC_G_PARM failed\n", __func__);
  389. return -1;
  390. }
  391. ALOGV("%s : timeperframe: numerator %d, denominator %d\n", __func__,
  392. streamparm->parm.capture.timeperframe.numerator,
  393. streamparm->parm.capture.timeperframe.denominator);
  394. return 0;
  395. }
  396. static int fimc_v4l2_s_parm(int fp, struct v4l2_streamparm *streamparm)
  397. {
  398. int ret;
  399. streamparm->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  400. ret = ioctl(fp, VIDIOC_S_PARM, streamparm);
  401. if (ret < 0) {
  402. ALOGE("ERR(%s):VIDIOC_S_PARM failed\n", __func__);
  403. return ret;
  404. }
  405. return 0;
  406. }
  407. // ======================================================================
  408. // Constructor & Destructor
  409. SecCamera::SecCamera() :
  410. m_flag_init(0),
  411. m_camera_id(CAMERA_ID_BACK),
  412. m_cam_fd(-1),
  413. m_cam_fd2(-1),
  414. m_preview_v4lformat(V4L2_PIX_FMT_NV21),
  415. m_preview_width (0),
  416. m_preview_height (0),
  417. m_preview_max_width (MAX_BACK_CAMERA_PREVIEW_WIDTH),
  418. m_preview_max_height (MAX_BACK_CAMERA_PREVIEW_HEIGHT),
  419. m_snapshot_v4lformat(-1),
  420. m_snapshot_width (0),
  421. m_snapshot_height (0),
  422. m_snapshot_max_width (MAX_BACK_CAMERA_SNAPSHOT_WIDTH),
  423. m_snapshot_max_height (MAX_BACK_CAMERA_SNAPSHOT_HEIGHT),
  424. m_angle(-1),
  425. m_anti_banding(-1),
  426. m_wdr(-1),
  427. m_anti_shake(-1),
  428. m_zoom_level(-1),
  429. m_object_tracking(-1),
  430. m_smart_auto(-1),
  431. m_beauty_shot(-1),
  432. m_vintage_mode(-1),
  433. m_face_detect(-1),
  434. m_gps_enabled(false),
  435. m_gps_latitude(-1),
  436. m_gps_longitude(-1),
  437. m_gps_altitude(-1),
  438. m_gps_timestamp(-1),
  439. m_vtmode(0),
  440. m_sensor_mode(-1),
  441. m_shot_mode(-1),
  442. m_exif_orientation(-1),
  443. m_blur_level(-1),
  444. m_chk_dataline(-1),
  445. m_video_gamma(-1),
  446. m_slow_ae(-1),
  447. m_camera_af_flag(-1),
  448. m_flag_camera_start(0),
  449. m_flag_camera_restart(0),
  450. m_jpeg_thumbnail_width (0),
  451. m_jpeg_thumbnail_height(0),
  452. m_jpeg_quality(100)
  453. #ifdef ENABLE_ESD_PREVIEW_CHECK
  454. ,
  455. m_esd_check_count(0)
  456. #endif // ENABLE_ESD_PREVIEW_CHECK
  457. {
  458. m_params = (struct sec_cam_parm*)&m_streamparm.parm.raw_data;
  459. struct v4l2_captureparm capture;
  460. m_params->capture.timeperframe.numerator = 1;
  461. m_params->capture.timeperframe.denominator = 0;
  462. m_params->contrast = -1;
  463. m_params->effects = -1;
  464. m_params->brightness = -1;
  465. m_params->flash_mode = -1;
  466. m_params->focus_mode = -1;
  467. m_params->iso = -1;
  468. m_params->metering = -1;
  469. m_params->saturation = -1;
  470. m_params->scene_mode = -1;
  471. m_params->sharpness = -1;
  472. m_params->white_balance = -1;
  473. memset(&m_capture_buf, 0, sizeof(m_capture_buf));
  474. ALOGV("%s :", __func__);
  475. }
  476. SecCamera::~SecCamera()
  477. {
  478. ALOGV("%s :", __func__);
  479. }
  480. int SecCamera::initCamera(int index)
  481. {
  482. ALOGV("%s :", __func__);
  483. int ret = 0;
  484. if (!m_flag_init) {
  485. /* Arun C
  486. * Reset the lense position only during camera starts; don't do
  487. * reset between shot to shot
  488. */
  489. m_camera_af_flag = -1;
  490. m_cam_fd = open(CAMERA_DEV_NAME, O_RDWR);
  491. if (m_cam_fd < 0) {
  492. ALOGE("ERR(%s):Cannot open %s (error : %s)\n", __func__, CAMERA_DEV_NAME, strerror(errno));
  493. return -1;
  494. }
  495. ALOGV("%s: open(%s) --> m_cam_fd %d", __FUNCTION__, CAMERA_DEV_NAME, m_cam_fd);
  496. ALOGE("initCamera: m_cam_fd(%d), m_jpeg_fd(%d)", m_cam_fd, m_jpeg_fd);
  497. ret = fimc_v4l2_querycap(m_cam_fd);
  498. CHECK(ret);
  499. if (!fimc_v4l2_enuminput(m_cam_fd, index))
  500. return -1;
  501. ret = fimc_v4l2_s_input(m_cam_fd, index);
  502. CHECK(ret);
  503. m_cam_fd2 = open(CAMERA_DEV_NAME2, O_RDWR);
  504. ALOGV("%s: open(%s) --> m_cam_fd2 = %d", __FUNCTION__, CAMERA_DEV_NAME2, m_cam_fd2);
  505. if (m_cam_fd2 < 0) {
  506. ALOGE("ERR(%s):Cannot open %s (error : %s)\n", __func__, CAMERA_DEV_NAME2, strerror(errno));
  507. return -1;
  508. }
  509. ALOGE("initCamera: m_cam_fd2(%d)", m_cam_fd2);
  510. ret = fimc_v4l2_querycap(m_cam_fd2);
  511. CHECK(ret);
  512. if (!fimc_v4l2_enuminput(m_cam_fd2, index))
  513. return -1;
  514. ret = fimc_v4l2_s_input(m_cam_fd2, index);
  515. CHECK(ret);
  516. m_camera_id = index;
  517. switch (m_camera_id) {
  518. case CAMERA_ID_FRONT:
  519. m_preview_max_width = MAX_FRONT_CAMERA_PREVIEW_WIDTH;
  520. m_preview_max_height = MAX_FRONT_CAMERA_PREVIEW_HEIGHT;
  521. m_snapshot_max_width = MAX_FRONT_CAMERA_SNAPSHOT_WIDTH;
  522. m_snapshot_max_height = MAX_FRONT_CAMERA_SNAPSHOT_HEIGHT;
  523. break;
  524. case CAMERA_ID_BACK:
  525. m_preview_max_width = MAX_BACK_CAMERA_PREVIEW_WIDTH;
  526. m_preview_max_height = MAX_BACK_CAMERA_PREVIEW_HEIGHT;
  527. m_snapshot_max_width = MAX_BACK_CAMERA_SNAPSHOT_WIDTH;
  528. m_snapshot_max_height = MAX_BACK_CAMERA_SNAPSHOT_HEIGHT;
  529. break;
  530. }
  531. setExifFixedAttribute();
  532. m_flag_init = 1;
  533. ALOGI("%s : initialized", __FUNCTION__);
  534. }
  535. return 0;
  536. }
  537. void SecCamera::resetCamera()
  538. {
  539. ALOGV("%s :", __func__);
  540. DeinitCamera();
  541. initCamera(m_camera_id);
  542. }
  543. void SecCamera::DeinitCamera()
  544. {
  545. ALOGV("%s :", __func__);
  546. if (m_flag_init) {
  547. stopRecord();
  548. /* close m_cam_fd after stopRecord() because stopRecord()
  549. * uses m_cam_fd to change frame rate
  550. */
  551. ALOGI("DeinitCamera: m_cam_fd(%d)", m_cam_fd);
  552. if (m_cam_fd > -1) {
  553. close(m_cam_fd);
  554. m_cam_fd = -1;
  555. }
  556. ALOGI("DeinitCamera: m_cam_fd2(%d)", m_cam_fd2);
  557. if (m_cam_fd2 > -1) {
  558. close(m_cam_fd2);
  559. m_cam_fd2 = -1;
  560. }
  561. m_flag_init = 0;
  562. }
  563. else ALOGI("%s : already deinitialized", __FUNCTION__);
  564. }
  565. int SecCamera::getCameraFd(void)
  566. {
  567. return m_cam_fd;
  568. }
  569. // ======================================================================
  570. // Preview
  571. int SecCamera::startPreview(void)
  572. {
  573. v4l2_streamparm streamparm;
  574. struct sec_cam_parm *parms;
  575. parms = (struct sec_cam_parm*)&streamparm.parm.raw_data;
  576. ALOGV("%s :", __func__);
  577. // aleady started
  578. if (m_flag_camera_start > 0) {
  579. ALOGE("ERR(%s):Preview was already started\n", __func__);
  580. return 0;
  581. }
  582. if (m_cam_fd <= 0) {
  583. ALOGE("ERR(%s):Camera was closed\n", __func__);
  584. return -1;
  585. }
  586. memset(&m_events_c, 0, sizeof(m_events_c));
  587. m_events_c.fd = m_cam_fd;
  588. m_events_c.events = POLLIN | POLLERR;
  589. /* enum_fmt, s_fmt sample */
  590. int ret = fimc_v4l2_enum_fmt(m_cam_fd,m_preview_v4lformat);
  591. CHECK(ret);
  592. ret = fimc_v4l2_s_fmt(m_cam_fd, m_preview_width,m_preview_height,m_preview_v4lformat, 0);
  593. CHECK(ret);
  594. ret = fimc_v4l2_reqbufs(m_cam_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, MAX_BUFFERS);
  595. CHECK(ret);
  596. ALOGV("%s : m_preview_width: %d m_preview_height: %d m_angle: %d\n",
  597. __func__, m_preview_width, m_preview_height, m_angle);
  598. ret = fimc_v4l2_s_ctrl(m_cam_fd,
  599. V4L2_CID_CAMERA_CHECK_DATALINE, m_chk_dataline);
  600. CHECK(ret);
  601. /* start with all buffers in queue */
  602. for (int i = 0; i < MAX_BUFFERS; i++) {
  603. ret = fimc_v4l2_qbuf(m_cam_fd, i);
  604. CHECK(ret);
  605. }
  606. if (m_camera_id == CAMERA_ID_BACK) {
  607. // Init some parameters required for CE147
  608. // Force antibanding for back camera - only value supported
  609. m_anti_banding = ANTI_BANDING_50HZ;
  610. // It doesn't hurt to keep these on as the kernel camera driver only
  611. // enables it when recording HD video. Turning it on before recording
  612. // doesn't work because it needs to be set before the preview is started.
  613. m_video_gamma = GAMMA_ON;
  614. m_slow_ae = SLOW_AE_ON;
  615. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ANTI_BANDING, m_anti_banding);
  616. CHECK(ret);
  617. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ISO, m_params->iso);
  618. CHECK(ret);
  619. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_BRIGHTNESS, m_params->brightness);
  620. CHECK(ret);
  621. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE, m_params->capture.timeperframe.denominator);
  622. CHECK(ret);
  623. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_METERING, m_params->metering);
  624. CHECK(ret);
  625. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_GAMMA, m_video_gamma);
  626. CHECK(ret);
  627. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_SLOW_AE, m_slow_ae);
  628. CHECK(ret);
  629. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_EFFECT, m_params->effects);
  630. CHECK(ret);
  631. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_WHITE_BALANCE, m_params->white_balance);
  632. CHECK(ret);
  633. }
  634. ret = fimc_v4l2_streamon(m_cam_fd);
  635. CHECK(ret);
  636. if (m_camera_id == CAMERA_ID_BACK) {
  637. // More parameters for CE147
  638. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FOCUS_MODE, m_params->focus_mode);
  639. CHECK(ret);
  640. m_face_detect = 0;
  641. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FACE_DETECTION, m_face_detect);
  642. CHECK(ret);
  643. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SHARPNESS, m_params->sharpness);
  644. CHECK(ret);
  645. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SATURATION, m_params->saturation);
  646. CHECK(ret);
  647. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_CONTRAST, m_params->contrast);
  648. CHECK(ret);
  649. // TODO
  650. m_beauty_shot = 0;
  651. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_BEAUTY_SHOT, m_beauty_shot);
  652. CHECK(ret);
  653. m_zoom_level = 0;
  654. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_ZOOM, m_zoom_level);
  655. CHECK(ret);
  656. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_BATCH_REFLECTION, 1);
  657. CHECK(ret);
  658. }
  659. m_flag_camera_start = 1;
  660. m_flag_camera_restart = 1;
  661. if (m_camera_id == CAMERA_ID_FRONT) {
  662. /* Activate preview mode */
  663. ALOGV("activate preview mode for front camera");
  664. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAM_PREVIEW_ONOFF,
  665. 1);
  666. CHECK(ret);
  667. }
  668. ret = fimc_v4l2_s_parm(m_cam_fd, &m_streamparm);
  669. CHECK(ret);
  670. // It is a delay for a new frame, not to show the previous bigger ugly picture frame.
  671. ret = fimc_poll(&m_events_c);
  672. CHECK(ret);
  673. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_RETURN_FOCUS, 0);
  674. CHECK(ret);
  675. ALOGV("%s: got the first frame of the preview\n", __func__);
  676. return 0;
  677. }
  678. int SecCamera::stopPreview(void)
  679. {
  680. int ret;
  681. ALOGV("%s :", __func__);
  682. if (m_flag_camera_start == 0) {
  683. ALOGW("%s: doing nothing because m_flag_camera_start is zero", __func__);
  684. return 0;
  685. }
  686. if (m_params->flash_mode == FLASH_MODE_TORCH)
  687. setFlashMode(FLASH_MODE_OFF);
  688. if (m_cam_fd <= 0) {
  689. ALOGE("ERR(%s):Camera was closed\n", __func__);
  690. return -1;
  691. }
  692. ret = fimc_v4l2_streamoff(m_cam_fd);
  693. CHECK(ret);
  694. m_flag_camera_start = 0;
  695. return ret;
  696. }
  697. //Recording
  698. int SecCamera::startRecord(void)
  699. {
  700. int ret, i;
  701. ALOGV("%s :", __func__);
  702. // aleady started
  703. if (m_flag_record_start > 0) {
  704. ALOGE("ERR(%s):Preview was already started\n", __func__);
  705. return 0;
  706. }
  707. if (m_cam_fd2 <= 0) {
  708. ALOGE("ERR(%s):Camera was closed\n", __func__);
  709. return -1;
  710. }
  711. /* enum_fmt, s_fmt sample */
  712. ret = fimc_v4l2_enum_fmt(m_cam_fd2, V4L2_PIX_FMT_NV12T);
  713. CHECK(ret);
  714. ALOGI("%s: m_recording_width = %d, m_recording_height = %d\n",
  715. __func__, m_recording_width, m_recording_height);
  716. if (m_camera_id == CAMERA_ID_BACK) {
  717. // Some properties for back camera video recording
  718. setISO(ISO_MOVIE);
  719. setMetering(METERING_MATRIX);
  720. setBatchReflection();
  721. }
  722. ret = fimc_v4l2_s_fmt(m_cam_fd2, m_recording_width,
  723. m_recording_height, V4L2_PIX_FMT_NV12T, 0);
  724. CHECK(ret);
  725. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE,
  726. m_params->capture.timeperframe.denominator);
  727. CHECK(ret);
  728. ret = fimc_v4l2_reqbufs(m_cam_fd2, V4L2_BUF_TYPE_VIDEO_CAPTURE, MAX_BUFFERS);
  729. CHECK(ret);
  730. /* start with all buffers in queue */
  731. for (i = 0; i < MAX_BUFFERS; i++) {
  732. ret = fimc_v4l2_qbuf(m_cam_fd2, i);
  733. CHECK(ret);
  734. }
  735. ret = fimc_v4l2_streamon(m_cam_fd2);
  736. CHECK(ret);
  737. // Get and throw away the first frame since it is often garbled.
  738. memset(&m_events_c2, 0, sizeof(m_events_c2));
  739. m_events_c2.fd = m_cam_fd2;
  740. m_events_c2.events = POLLIN | POLLERR;
  741. ret = fimc_poll(&m_events_c2);
  742. CHECK(ret);
  743. // Continuous autofocus for main camera
  744. if (m_camera_id == CAMERA_ID_BACK) {
  745. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_CAF_START_STOP, 1);
  746. CHECK(ret);
  747. }
  748. m_flag_record_start = 1;
  749. return 0;
  750. }
  751. int SecCamera::stopRecord(void)
  752. {
  753. int ret;
  754. ALOGV("%s :", __func__);
  755. if (m_flag_record_start == 0) {
  756. ALOGW("%s: doing nothing because m_flag_record_start is zero", __func__);
  757. return 0;
  758. }
  759. if (m_cam_fd2 <= 0) {
  760. ALOGE("ERR(%s):Camera was closed\n", __func__);
  761. return -1;
  762. }
  763. // Continuous autofocus for main camera
  764. if (m_camera_id == CAMERA_ID_BACK) {
  765. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_CAF_START_STOP, 0);
  766. CHECK(ret);
  767. // Need to switch focus mode so that the camera can focus properly
  768. // after using caf.
  769. // Note: This bug is not affected when the original mode is macro
  770. // so we can safely use that as a mode to switch to.
  771. int orig_mode = m_params->focus_mode;
  772. setFocusMode(FOCUS_MODE_MACRO);
  773. setFocusMode(orig_mode);
  774. }
  775. m_flag_record_start = 0;
  776. ret = fimc_v4l2_streamoff(m_cam_fd2);
  777. CHECK(ret);
  778. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE,
  779. FRAME_RATE_AUTO);
  780. CHECK(ret);
  781. // Properties for back camera non-video recording
  782. if (m_camera_id == CAMERA_ID_BACK) {
  783. setISO(ISO_AUTO);
  784. setMetering(METERING_CENTER);
  785. setBatchReflection();
  786. }
  787. return 0;
  788. }
  789. unsigned int SecCamera::getRecPhyAddrY(int index)
  790. {
  791. unsigned int addr_y;
  792. addr_y = fimc_v4l2_s_ctrl(m_cam_fd2, V4L2_CID_PADDR_Y, index);
  793. CHECK((int)addr_y);
  794. return addr_y;
  795. }
  796. unsigned int SecCamera::getRecPhyAddrC(int index)
  797. {
  798. unsigned int addr_c;
  799. addr_c = fimc_v4l2_s_ctrl(m_cam_fd2, V4L2_CID_PADDR_CBCR, index);
  800. CHECK((int)addr_c);
  801. return addr_c;
  802. }
  803. unsigned int SecCamera::getPhyAddrY(int index)
  804. {
  805. unsigned int addr_y;
  806. addr_y = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_PADDR_Y, index);
  807. CHECK((int)addr_y);
  808. return addr_y;
  809. }
  810. unsigned int SecCamera::getPhyAddrC(int index)
  811. {
  812. unsigned int addr_c;
  813. addr_c = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_PADDR_CBCR, index);
  814. CHECK((int)addr_c);
  815. return addr_c;
  816. }
  817. void SecCamera::pausePreview()
  818. {
  819. fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_STREAM_PAUSE, 0);
  820. }
  821. int SecCamera::getPreview()
  822. {
  823. int index;
  824. int ret;
  825. if (m_flag_camera_start == 0 || previewPoll(true) == 0) {
  826. ALOGE("ERR(%s):Start Camera Device Reset \n", __func__);
  827. /* GAUDI Project([arun.c@samsung.com]) 2010.05.20. [Implemented ESD code] */
  828. /*
  829. * When there is no data for more than 1 second from the camera we inform
  830. * the FIMC driver by calling fimc_v4l2_s_input() with a special value = 1000
  831. * FIMC driver identify that there is something wrong with the camera
  832. * and it restarts the sensor.
  833. */
  834. stopPreview();
  835. /* Reset Only Camera Device */
  836. ret = fimc_v4l2_querycap(m_cam_fd);
  837. CHECK(ret);
  838. if (fimc_v4l2_enuminput(m_cam_fd, m_camera_id))
  839. return -1;
  840. ret = fimc_v4l2_s_input(m_cam_fd, 1000);
  841. CHECK(ret);
  842. ret = startPreview();
  843. if (ret < 0) {
  844. ALOGE("ERR(%s): startPreview() return %d\n", __func__, ret);
  845. return 0;
  846. }
  847. }
  848. index = fimc_v4l2_dqbuf(m_cam_fd);
  849. if (!(0 <= index && index < MAX_BUFFERS)) {
  850. ALOGE("ERR(%s):wrong index = %d\n", __func__, index);
  851. return -1;
  852. }
  853. ret = fimc_v4l2_qbuf(m_cam_fd, index);
  854. CHECK(ret);
  855. return index;
  856. }
  857. int SecCamera::getRecordFrame()
  858. {
  859. if (m_flag_record_start == 0) {
  860. ALOGE("%s: m_flag_record_start is 0", __func__);
  861. return -1;
  862. }
  863. previewPoll(false);
  864. return fimc_v4l2_dqbuf(m_cam_fd2);
  865. }
  866. int SecCamera::releaseRecordFrame(int index)
  867. {
  868. if (!m_flag_record_start) {
  869. /* this can happen when recording frames are returned after
  870. * the recording is stopped at the driver level. we don't
  871. * need to return the buffers in this case and we've seen
  872. * cases where fimc could crash if we called qbuf and it
  873. * wasn't expecting it.
  874. */
  875. ALOGI("%s: recording not in progress, ignoring", __func__);
  876. return 0;
  877. }
  878. return fimc_v4l2_qbuf(m_cam_fd2, index);
  879. }
  880. int SecCamera::setPreviewSize(int width, int height, int pixel_format)
  881. {
  882. ALOGV("%s(width(%d), height(%d), format(%d))", __func__, width, height, pixel_format);
  883. int v4lpixelformat = pixel_format;
  884. #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
  885. if (v4lpixelformat == V4L2_PIX_FMT_YUV420)
  886. ALOGV("PreviewFormat:V4L2_PIX_FMT_YUV420");
  887. else if (v4lpixelformat == V4L2_PIX_FMT_NV12)
  888. ALOGV("PreviewFormat:V4L2_PIX_FMT_NV12");
  889. else if (v4lpixelformat == V4L2_PIX_FMT_NV12T)
  890. ALOGV("PreviewFormat:V4L2_PIX_FMT_NV12T");
  891. else if (v4lpixelformat == V4L2_PIX_FMT_NV21)
  892. ALOGV("PreviewFormat:V4L2_PIX_FMT_NV21");
  893. else if (v4lpixelformat == V4L2_PIX_FMT_YUV422P)
  894. ALOGV("PreviewFormat:V4L2_PIX_FMT_YUV422P");
  895. else if (v4lpixelformat == V4L2_PIX_FMT_YUYV)
  896. ALOGV("PreviewFormat:V4L2_PIX_FMT_YUYV");
  897. else if (v4lpixelformat == V4L2_PIX_FMT_RGB565)
  898. ALOGV("PreviewFormat:V4L2_PIX_FMT_RGB565");
  899. else
  900. ALOGV("PreviewFormat:UnknownFormat");
  901. #endif
  902. m_preview_width = width;
  903. m_preview_height = height;
  904. m_preview_v4lformat = v4lpixelformat;
  905. return 0;
  906. }
  907. int SecCamera::getPreviewSize(int *width, int *height, int *frame_size)
  908. {
  909. *width = m_preview_width;
  910. *height = m_preview_height;
  911. *frame_size = m_frameSize(m_preview_v4lformat, m_preview_width, m_preview_height);
  912. return 0;
  913. }
  914. int SecCamera::getPreviewMaxSize(int *width, int *height)
  915. {
  916. *width = m_preview_max_width;
  917. *height = m_preview_max_height;
  918. return 0;
  919. }
  920. int SecCamera::getPreviewPixelFormat(void)
  921. {
  922. return m_preview_v4lformat;
  923. }
  924. // ======================================================================
  925. // Snapshot
  926. /*
  927. * Devide getJpeg() as two funcs, setSnapshotCmd() & getJpeg() because of the shutter sound timing.
  928. * Here, just send the capture cmd to camera ISP to start JPEG capture.
  929. */
  930. int SecCamera::setSnapshotCmd(void)
  931. {
  932. ALOGV("%s :", __func__);
  933. int ret = 0;
  934. LOG_TIME_DEFINE(0)
  935. LOG_TIME_DEFINE(1)
  936. if (m_cam_fd <= 0) {
  937. ALOGE("ERR(%s):Camera was closed\n", __func__);
  938. return 0;
  939. }
  940. if (m_flag_camera_start > 0) {
  941. LOG_TIME_START(0)
  942. ALOGW("WARN(%s):Camera was in preview, should have been stopped\n", __func__);
  943. stopPreview();
  944. LOG_TIME_END(0)
  945. }
  946. memset(&m_events_c, 0, sizeof(m_events_c));
  947. m_events_c.fd = m_cam_fd;
  948. m_events_c.events = POLLIN | POLLERR;
  949. LOG_TIME_START(1) // prepare
  950. int nframe = 1;
  951. ret = fimc_v4l2_enum_fmt(m_cam_fd,m_snapshot_v4lformat);
  952. CHECK(ret);
  953. ret = fimc_v4l2_s_fmt_cap(m_cam_fd, m_snapshot_width, m_snapshot_height, V4L2_PIX_FMT_JPEG);
  954. CHECK(ret);
  955. ret = fimc_v4l2_reqbufs(m_cam_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, nframe);
  956. CHECK(ret);
  957. ret = fimc_v4l2_querybuf(m_cam_fd, &m_capture_buf, V4L2_BUF_TYPE_VIDEO_CAPTURE);
  958. CHECK(ret);
  959. ret = fimc_v4l2_qbuf(m_cam_fd, 0);
  960. CHECK(ret);
  961. ret = fimc_v4l2_streamon(m_cam_fd);
  962. CHECK(ret);
  963. // Orientation
  964. int orientation;
  965. switch (m_exif_orientation) {
  966. case 0:
  967. orientation = EXIF_ORIENTATION_UP;
  968. break;
  969. case 90:
  970. orientation = EXIF_ORIENTATION_90;
  971. break;
  972. case 180:
  973. orientation = EXIF_ORIENTATION_180;
  974. break;
  975. case 270:
  976. orientation = EXIF_ORIENTATION_270;
  977. break;
  978. default:
  979. orientation = EXIF_ORIENTATION_UP;
  980. break;
  981. }
  982. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_EXIF_ORIENTATION, orientation);
  983. CHECK(ret);
  984. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_CAPTURE, 0);
  985. CHECK(ret);
  986. LOG_TIME_END(1)
  987. return 0;
  988. }
  989. int SecCamera::endSnapshot(void)
  990. {
  991. int ret;
  992. ALOGI("%s :", __func__);
  993. if (m_capture_buf.start) {
  994. munmap(m_capture_buf.start, m_capture_buf.length);
  995. ALOGI("munmap():virt. addr %p size = %d\n",
  996. m_capture_buf.start, m_capture_buf.length);
  997. m_capture_buf.start = NULL;
  998. m_capture_buf.length = 0;
  999. }
  1000. return 0;
  1001. }
  1002. /*
  1003. * Set Jpeg quality & exif info and get JPEG data from camera ISP
  1004. */
  1005. unsigned char* SecCamera::getJpeg(int *jpeg_size, unsigned int *phyaddr)
  1006. {
  1007. ALOGV("%s :", __func__);
  1008. int index, ret = 0;
  1009. unsigned char *addr;
  1010. LOG_TIME_DEFINE(2)
  1011. // capture
  1012. ret = fimc_poll(&m_events_c);
  1013. CHECK_PTR(ret);
  1014. index = fimc_v4l2_dqbuf(m_cam_fd);
  1015. if (index != 0) {
  1016. ALOGE("ERR(%s):wrong index = %d\n", __func__, index);
  1017. return NULL;
  1018. }
  1019. *jpeg_size = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAM_JPEG_MAIN_SIZE);
  1020. CHECK_PTR(*jpeg_size);
  1021. int main_offset = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAM_JPEG_MAIN_OFFSET);
  1022. CHECK_PTR(main_offset);
  1023. m_postview_offset = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAM_JPEG_POSTVIEW_OFFSET);
  1024. CHECK_PTR(m_postview_offset);
  1025. ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_STREAM_PAUSE, 0);
  1026. CHECK_PTR(ret);
  1027. ALOGV("\nsnapshot dqueued buffer = %d snapshot_width = %d snapshot_height = %d, size = %d\n\n",
  1028. index, m_snapshot_width, m_snapshot_height, *jpeg_size);
  1029. addr = (unsigned char*)(m_capture_buf.start) + main_offset;
  1030. *phyaddr = getPhyAddrY(index) + m_postview_offset;
  1031. LOG_TIME_START(2) // post
  1032. ret = fimc_v4l2_streamoff(m_cam_fd);
  1033. CHECK_PTR(ret);
  1034. LOG_TIME_END(2)
  1035. return addr;
  1036. }
  1037. int SecCamera::getExif(unsigned char *pExifDst, unsigned char *pThumbSrc)
  1038. {
  1039. JpegEncoder jpgEnc;
  1040. //FIXME: Disabled thumbnails for now as they're always green
  1041. #if 0
  1042. ALOGV("%s : m_jpeg_thumbnail_width = %d, height = %d",
  1043. __func__, m_jpeg_thumbnail_width, m_jpeg_thumbnail_height);
  1044. if ((m_jpeg_thumbnail_width > 0) && (m_jpeg_thumbnail_height > 0)) {
  1045. int inFormat = JPG_MODESEL_YCBCR;
  1046. int outFormat = JPG_422;
  1047. switch (m_snapshot_v4lformat) {
  1048. case V4L2_PIX_FMT_NV12:
  1049. case V4L2_PIX_FMT_NV21:
  1050. case V4L2_PIX_FMT_NV12T:
  1051. case V4L2_PIX_FMT_YUV420:
  1052. outFormat = JPG_420;
  1053. break;
  1054. case V4L2_PIX_FMT_YUYV:
  1055. case V4L2_PIX_FMT_UYVY:
  1056. case V4L2_PIX_FMT_YUV422P:
  1057. outFormat = JPG_422;
  1058. break;
  1059. }
  1060. if (jpgEnc.setConfig(JPEG_SET_ENCODE_IN_FORMAT, inFormat) != JPG_SUCCESS)
  1061. return -1;
  1062. if (jpgEnc.setConfig(JPEG_SET_SAMPING_MODE, outFormat) != JPG_SUCCESS)
  1063. return -1;
  1064. if (jpgEnc.setConfig(JPEG_SET_ENCODE_QUALITY, JPG_QUALITY_LEVEL_2) != JPG_SUCCESS)
  1065. return -1;
  1066. int thumbWidth, thumbHeight, thumbSrcSize;
  1067. getThumbnailConfig(&thumbWidth, &thumbHeight, &thumbSrcSize);
  1068. if (jpgEnc.setConfig(JPEG_SET_ENCODE_WIDTH, thumbWidth) != JPG_SUCCESS)
  1069. return -1;
  1070. if (jpgEnc.setConfig(JPEG_SET_ENCODE_HEIGHT, thumbHeight) != JPG_SUCCESS)
  1071. return -1;
  1072. char *pInBuf = (char *)jpgEnc.getInBuf(thumbSrcSize);
  1073. if (pInBuf == NULL)
  1074. return -1;
  1075. memcpy(pInBuf, pThumbSrc, thumbSrcSize);
  1076. unsigned int thumbSize;
  1077. jpgEnc.encode(&thumbSize, NULL);
  1078. ALOGV("%s : enableThumb set to true", __func__);
  1079. mExifInfo.enableThumb = true;
  1080. } else {
  1081. #endif
  1082. ALOGV("%s : enableThumb set to false", __func__);
  1083. mExifInfo.enableThumb = false;
  1084. #if 0
  1085. }
  1086. #endif
  1087. unsigned int exifSize;
  1088. setExifChangedAttribute();
  1089. ALOGV("%s: calling jpgEnc.makeExif, mExifInfo.width set to %d, height to %d\n",
  1090. __func__, mExifInfo.width, mExifInfo.height);
  1091. jpgEnc.makeExif(pExifDst, &mExifInfo, &exifSize, true);
  1092. return exifSize;
  1093. }
  1094. void SecCamera::getPostViewConfig(int *width, int *height, int *size)
  1095. {
  1096. if (m_preview_width == 1024) {
  1097. *width = BACK_CAMERA_POSTVIEW_WIDE_WIDTH;
  1098. *height = BACK_CAMERA_POSTVIEW_HEIGHT;
  1099. *size = BACK_CAMERA_POSTVIEW_WIDE_WIDTH * BACK_CAMERA_POSTVIEW_HEIGHT * BACK_CAMERA_POSTVIEW_BPP / 8;
  1100. } else {
  1101. *width = BACK_CAMERA_POSTVIEW_WIDTH;
  1102. *height = BACK_CAMERA_POSTVIEW_HEIGHT;
  1103. *size = BACK_CAMERA_POSTVIEW_WIDTH * BACK_CAMERA_POSTVIEW_HEIGHT * BACK_CAMERA_POSTVIEW_BPP / 8;
  1104. }
  1105. ALOGV("[5B] m_preview_width : %d, mPostViewWidth = %d mPostViewHeight = %d mPostViewSize = %d",
  1106. m_preview_width, *width, *height, *size);
  1107. }
  1108. void SecCamera::getThumbnailConfig(int *width, int *height, int *size)
  1109. {
  1110. if (m_camera_id == CAMERA_ID_BACK) {
  1111. *width = BACK_CAMERA_THUMBNAIL_WIDTH;
  1112. *height = BACK_CAMERA_THUMBNAIL_HEIGHT;
  1113. *size = BACK_CAMERA_THUMBNAIL_WIDTH * BACK_CAMERA_THUMBNAIL_HEIGHT
  1114. * BACK_CAMERA_THUMBNAIL_BPP / 8;
  1115. } else {
  1116. *width = FRONT_CAMERA_THUMBNAIL_WIDTH;
  1117. *height = FRONT_CAMERA_THUMBNAIL_HEIGHT;
  1118. *size = FRONT_CAMERA_THUMBNAIL_WIDTH * FRONT_CAMERA_THUMBNAIL_HEIGHT
  1119. * FRONT_CAMERA_THUMBNAIL_BPP / 8;
  1120. }
  1121. }
  1122. int SecCamera::getPostViewOffset(void)
  1123. {
  1124. return m_postview_offset;
  1125. }
  1126. int SecCamera::getSnapshotAndJpeg(unsigned char *yuv_buf, unsigned char *jpeg_buf,
  1127. unsigned int *output_size)
  1128. {
  1129. ALOGV("%s :", __func__);
  1130. int index;
  1131. //unsigned int addr;
  1132. unsigned char *addr;
  1133. int ret = 0;
  1134. LOG_TIME_DEFINE(0)
  1135. LOG_TIME_DEFINE(1)
  1136. LOG_TIME_DEFINE(2)
  1137. LOG_TIME_DEFINE(3)
  1138. LOG_TIME_DEFINE(4)
  1139. LOG_TIME_DEFINE(5)
  1140. //fimc_v4l2_streamoff(m_cam_fd); [zzangdol] remove - it is separate in HWInterface with camera_id
  1141. if (m_cam_fd <= 0) {
  1142. ALOGE("ERR(%s):Camera was closed\n", __func__);
  1143. return -1;
  1144. }
  1145. if (m_flag_camera_start > 0) {
  1146. LOG_TIME_START(0)
  1147. ALOGW("WARN(%s):Camera was in preview, should have been stopped\n", __func__);
  1148. stopPreview();
  1149. LOG_TIME_END(0)
  1150. }
  1151. memset(&m_events_c, 0, sizeof(m_events_c));
  1152. m_events_c.fd = m_cam_fd;
  1153. m_events_c.events = POLLIN | POLLERR;
  1154. #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
  1155. if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV420)
  1156. ALOGV("SnapshotFormat:V4L2_PIX_FMT_YUV420");
  1157. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12)
  1158. ALOGV("SnapshotFormat:V4L2_PIX_FMT_NV12");
  1159. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12T)
  1160. ALOGV("SnapshotFormat:V4L2_PIX_FMT_NV12T");
  1161. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV21)
  1162. ALOGV("SnapshotFormat:V4L2_PIX_FMT_NV21");
  1163. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV422P)
  1164. ALOGV("SnapshotFormat:V4L2_PIX_FMT_YUV422P");
  1165. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUYV)
  1166. ALOGV("SnapshotFormat:V4L2_PIX_FMT_YUYV");
  1167. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_UYVY)
  1168. ALOGV("SnapshotFormat:V4L2_PIX_FMT_UYVY");
  1169. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_RGB565)
  1170. ALOGV("SnapshotFormat:V4L2_PIX_FMT_RGB565");
  1171. else
  1172. ALOGV("SnapshotFormat:UnknownFormat");
  1173. #endif
  1174. LOG_TIME_START(1) // prepare
  1175. int nframe = 1;
  1176. ret = fimc_v4l2_enum_fmt(m_cam_fd,m_snapshot_v4lformat);
  1177. CHECK(ret);
  1178. ret = fimc_v4l2_s_fmt_cap(m_cam_fd, m_snapshot_width, m_snapshot_height, m_snapshot_v4lformat);
  1179. CHECK(ret);
  1180. ret = fimc_v4l2_reqbufs(m_cam_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, nframe);
  1181. CHECK(ret);
  1182. ret = fimc_v4l2_querybuf(m_cam_fd, &m_capture_buf, V4L2_BUF_TYPE_VIDEO_CAPTURE);
  1183. CHECK(ret);
  1184. ret = fimc_v4l2_qbuf(m_cam_fd, 0);
  1185. CHECK(ret);
  1186. ret = fimc_v4l2_streamon(m_cam_fd);
  1187. CHECK(ret);
  1188. LOG_TIME_END(1)
  1189. LOG_TIME_START(2) // capture
  1190. fimc_poll(&m_events_c);
  1191. index = fimc_v4l2_dqbuf(m_cam_fd);
  1192. fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_STREAM_PAUSE, 0);
  1193. ALOGV("\nsnapshot dequeued buffer = %d snapshot_width = %d snapshot_height = %d\n\n",
  1194. index, m_snapshot_width, m_snapshot_height);
  1195. LOG_TIME_END(2)
  1196. ALOGI("%s : calling memcpy from m_capture_buf", __func__);
  1197. memcpy(yuv_buf, (unsigned char*)m_capture_buf.start, m_snapshot_width * m_snapshot_height * 2);
  1198. LOG_TIME_START(5) // post
  1199. fimc_v4l2_streamoff(m_cam_fd);
  1200. LOG_TIME_END(5)
  1201. LOG_CAMERA("getSnapshotAndJpeg intervals : stopPreview(%lu), prepare(%lu),"
  1202. " capture(%lu), memcpy(%lu), yuv2Jpeg(%lu), post(%lu) us",
  1203. LOG_TIME(0), LOG_TIME(1), LOG_TIME(2), LOG_TIME(3), LOG_TIME(4), LOG_TIME(5));
  1204. /* JPEG encoding */
  1205. JpegEncoder jpgEnc;
  1206. int inFormat = JPG_MODESEL_YCBCR;
  1207. int outFormat = JPG_422;
  1208. switch (m_snapshot_v4lformat) {
  1209. case V4L2_PIX_FMT_NV12:
  1210. case V4L2_PIX_FMT_NV21:
  1211. case V4L2_PIX_FMT_NV12T:
  1212. case V4L2_PIX_FMT_YUV420:
  1213. outFormat = JPG_420;
  1214. break;
  1215. case V4L2_PIX_FMT_YUYV:
  1216. case V4L2_PIX_FMT_UYVY:
  1217. case V4L2_PIX_FMT_YUV422P:
  1218. default:
  1219. outFormat = JPG_422;
  1220. break;
  1221. }
  1222. if (jpgEnc.setConfig(JPEG_SET_ENCODE_IN_FORMAT, inFormat) != JPG_SUCCESS)
  1223. ALOGE("[JPEG_SET_ENCODE_IN_FORMAT] Error\n");
  1224. if (jpgEnc.setConfig(JPEG_SET_SAMPING_MODE, outFormat) != JPG_SUCCESS)
  1225. ALOGE("[JPEG_SET_SAMPING_MODE] Error\n");
  1226. image_quality_type_t jpegQuality;
  1227. if (m_jpeg_quality >= 90)
  1228. jpegQuality = JPG_QUALITY_LEVEL_1;
  1229. else if (m_jpeg_quality >= 80)
  1230. jpegQuality = JPG_QUALITY_LEVEL_2;
  1231. else if (m_jpeg_quality >= 70)
  1232. jpegQuality = JPG_QUALITY_LEVEL_3;
  1233. else
  1234. jpegQuality = JPG_QUALITY_LEVEL_4;
  1235. if (jpgEnc.setConfig(JPEG_SET_ENCODE_QUALITY, jpegQuality) != JPG_SUCCESS)
  1236. ALOGE("[JPEG_SET_ENCODE_QUALITY] Error\n");
  1237. if (jpgEnc.setConfig(JPEG_SET_ENCODE_WIDTH, m_snapshot_width) != JPG_SUCCESS)
  1238. ALOGE("[JPEG_SET_ENCODE_WIDTH] Error\n");
  1239. if (jpgEnc.setConfig(JPEG_SET_ENCODE_HEIGHT, m_snapshot_height) != JPG_SUCCESS)
  1240. ALOGE("[JPEG_SET_ENCODE_HEIGHT] Error\n");
  1241. unsigned int snapshot_size = m_snapshot_width * m_snapshot_height * 2;
  1242. unsigned char *pInBuf = (unsigned char *)jpgEnc.getInBuf(snapshot_size);
  1243. if (pInBuf == NULL) {
  1244. ALOGE("JPEG input buffer is NULL!!\n");
  1245. return -1;
  1246. }
  1247. memcpy(pInBuf, yuv_buf, snapshot_size);
  1248. setExifChangedAttribute();
  1249. jpgEnc.encode(output_size, NULL);
  1250. uint64_t outbuf_size;
  1251. unsigned char *pOutBuf = (unsigned char *)jpgEnc.getOutBuf(&outbuf_size);
  1252. if (pOutBuf == NULL) {
  1253. ALOGE("JPEG output buffer is NULL!!\n");
  1254. return -1;
  1255. }
  1256. memcpy(jpeg_buf, pOutBuf, outbuf_size);
  1257. return 0;
  1258. }
  1259. int SecCamera::setSnapshotSize(int width, int height)
  1260. {
  1261. ALOGV("%s(width(%d), height(%d))", __func__, width, height);
  1262. m_snapshot_width = width;
  1263. m_snapshot_height = height;
  1264. return 0;
  1265. }
  1266. int SecCamera::getSnapshotSize(int *width, int *height, int *frame_size)
  1267. {
  1268. *width = m_snapshot_width;
  1269. *height = m_snapshot_height;
  1270. int frame = 0;
  1271. frame = m_frameSize(m_snapshot_v4lformat, m_snapshot_width, m_snapshot_height);
  1272. // set it big.
  1273. if (frame == 0)
  1274. frame = m_snapshot_width * m_snapshot_height * BPP;
  1275. *frame_size = frame;
  1276. return 0;
  1277. }
  1278. int SecCamera::getSnapshotMaxSize(int *width, int *height)
  1279. {
  1280. switch (m_camera_id) {
  1281. case CAMERA_ID_FRONT:
  1282. m_snapshot_max_width = MAX_FRONT_CAMERA_SNAPSHOT_WIDTH;
  1283. m_snapshot_max_height = MAX_FRONT_CAMERA_SNAPSHOT_HEIGHT;
  1284. break;
  1285. default:
  1286. case CAMERA_ID_BACK:
  1287. m_snapshot_max_width = MAX_BACK_CAMERA_SNAPSHOT_WIDTH;
  1288. m_snapshot_max_height = MAX_BACK_CAMERA_SNAPSHOT_HEIGHT;
  1289. break;
  1290. }
  1291. *width = m_snapshot_max_width;
  1292. *height = m_snapshot_max_height;
  1293. return 0;
  1294. }
  1295. int SecCamera::setSnapshotPixelFormat(int pixel_format)
  1296. {
  1297. int v4lpixelformat= pixel_format;
  1298. if (m_snapshot_v4lformat != v4lpixelformat) {
  1299. m_snapshot_v4lformat = v4lpixelformat;
  1300. }
  1301. #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
  1302. if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV420)
  1303. ALOGE("%s : SnapshotFormat:V4L2_PIX_FMT_YUV420", __func__);
  1304. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12)
  1305. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV12", __func__);
  1306. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12T)
  1307. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV12T", __func__);
  1308. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV21)
  1309. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV21", __func__);
  1310. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV422P)
  1311. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_YUV422P", __func__);
  1312. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUYV)
  1313. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_YUYV", __func__);
  1314. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_UYVY)
  1315. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_UYVY", __func__);
  1316. else if (m_snapshot_v4lformat == V4L2_PIX_FMT_RGB565)
  1317. ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_RGB565", __func__);
  1318. else
  1319. ALOGD("SnapshotFormat:UnknownFormat");
  1320. #endif
  1321. return 0;
  1322. }
  1323. int SecCamera::getSnapshotPixelFormat(void)
  1324. {
  1325. return m_snapshot_v4lformat;
  1326. }
  1327. // ======================================================================
  1328. // Settings
  1329. int SecCamera::getCameraId(void)
  1330. {
  1331. return m_camera_id;
  1332. }
  1333. // -----------------------------------
  1334. int SecCamera::setAutofocus(void)
  1335. {
  1336. ALOGV("%s :", __func__);
  1337. if (m_cam_fd <= 0) {
  1338. ALOGE("ERR(%s):Camera was closed\n", __func__);
  1339. return -1;
  1340. }
  1341. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_AUTO_FOCUS, AUTO_FOCUS_ON) < 0) {
  1342. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_AUTO_FOCUS", __func__);
  1343. return -1;
  1344. }
  1345. return 0;
  1346. }
  1347. int SecCamera::getAutoFocusResult(void)
  1348. {
  1349. int af_result = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAMERA_AUTO_FOCUS_RESULT_FIRST);
  1350. ALOGV("%s : AF was successful, returning %d", __func__, af_result);
  1351. return af_result;
  1352. }
  1353. int SecCamera::cancelAutofocus(void)
  1354. {
  1355. ALOGV("%s :", __func__);
  1356. if (m_cam_fd <= 0) {
  1357. ALOGE("ERR(%s):Camera was closed\n", __func__);
  1358. return -1;
  1359. }
  1360. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_SET_AUTO_FOCUS, AUTO_FOCUS_OFF) < 0) {
  1361. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_AUTO_FOCUS", __func__);
  1362. return -1;
  1363. }
  1364. return 0;
  1365. }
  1366. // -----------------------------------
  1367. int SecCamera::zoomIn(void)
  1368. {
  1369. ALOGV("%s :", __func__);
  1370. return 0;
  1371. }
  1372. int SecCamera::zoomOut(void)
  1373. {
  1374. ALOGV("%s :", __func__);
  1375. return 0;
  1376. }
  1377. // -----------------------------------
  1378. int SecCamera::SetRotate(int angle)
  1379. {
  1380. ALOGE("%s(angle(%d))", __func__, angle);
  1381. if (m_angle != angle) {
  1382. switch (angle) {
  1383. case -360:
  1384. case 0:
  1385. case 360:
  1386. m_angle = 0;
  1387. break;
  1388. case -270:
  1389. case 90:
  1390. m_angle = 90;
  1391. break;
  1392. case -180:
  1393. case 180:
  1394. m_angle = 180;
  1395. break;
  1396. case -90:
  1397. case 270:
  1398. m_angle = 270;
  1399. break;
  1400. default:
  1401. ALOGE("ERR(%s):Invalid angle(%d)", __func__, angle);
  1402. return -1;
  1403. }
  1404. if (m_flag_camera_start) {
  1405. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_ROTATION, angle) < 0) {
  1406. ALOGE("ERR(%s):Fail on V4L2_CID_ROTATION", __func__);
  1407. return -1;
  1408. }
  1409. }
  1410. }
  1411. return 0;
  1412. }
  1413. int SecCamera::getRotate(void)
  1414. {
  1415. ALOGV("%s : angle(%d)", __func__, m_angle);
  1416. return m_angle;
  1417. }
  1418. int SecCamera::setFrameRate(int frame_rate)
  1419. {
  1420. ALOGV("%s(FrameRate(%d))", __func__, frame_rate);
  1421. if (frame_rate < FRAME_RATE_AUTO || FRAME_RATE_MAX < frame_rate )
  1422. ALOGE("ERR(%s):Invalid frame_rate(%d)", __func__, frame_rate);
  1423. if (m_params->capture.timeperframe.denominator != (unsigned)frame_rate) {
  1424. m_params->capture.timeperframe.denominator = frame_rate;
  1425. if (m_flag_camera_start) {
  1426. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE, frame_rate) < 0) {
  1427. ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FRAME_RATE", __func__);
  1428. return -1;
  1429. }
  1430. }
  1431. }
  1432. return 0;
  1433. }
  1434. // -----------------------------------
  1435. int SecCamera::setVerticalMirror(void)
  1436. {
  1437. ALOGV("%s :", __func__);
  1438. if (m_cam_fd <= 0) {
  1439. ALOGE("ERR(%s):Camera was closed\n", __func__);
  1440. return -1;
  1441. }
  1442. if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_VFLIP, 0) < 0) {
  1443. ALOGE("ERR(%s):Fail on V4L2_CID_VFLIP", __func__);
  1444. return -1;
  1445. }
  1446. return 0;
  1447. }
  1448. int SecCamera::setHorizontalMirror(void)
  1449. {
  1450. ALOGV("%s :", __func__);
  1451. if (m_cam_fd <= 0) {
  1452. ALOGE("ERR(%s):Camera was closed\n", __func__);
  1453. return -1;
  1454. }
  1455. if (fimc_v4l2_s_ctrl(

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