diff options
author | Kolja Dummann <k.dummann@gmail.com> | 2011-03-05 01:07:58 +0100 |
---|---|---|
committer | Kolja Dummann <k.dummann@gmail.com> | 2011-03-05 01:07:58 +0100 |
commit | e8f88a17d64a94980422c8e19fc9d190a2a92c70 (patch) | |
tree | 80d6d948140c19d890e9e93476ffae92fcc13583 | |
parent | 99794ea4d1298ca384baa7f3a07b1834ea60678b (diff) | |
download | device_samsung_aries-common-e8f88a17d64a94980422c8e19fc9d190a2a92c70.zip device_samsung_aries-common-e8f88a17d64a94980422c8e19fc9d190a2a92c70.tar.gz device_samsung_aries-common-e8f88a17d64a94980422c8e19fc9d190a2a92c70.tar.bz2 |
camera: merges from upstream and reenable Exif for NEC CE147
-rw-r--r-- | aries/libcamera/Android.mk | 11 | ||||
-rw-r--r-- | aries/libcamera/SecCamera.cpp | 766 | ||||
-rw-r--r-- | aries/libcamera/SecCamera.h | 70 | ||||
-rw-r--r-- | aries/libcamera/SecCameraHWInterface.cpp | 436 | ||||
-rw-r--r-- | aries/libcamera/SecCameraHWInterface.h | 43 |
5 files changed, 360 insertions, 966 deletions
diff --git a/aries/libcamera/Android.mk b/aries/libcamera/Android.mk index 66990a0..c069daf 100644 --- a/aries/libcamera/Android.mk +++ b/aries/libcamera/Android.mk @@ -8,7 +8,6 @@ include $(CLEAR_VARS) LOCAL_CFLAGS:=-fno-short-enums LOCAL_CFLAGS+=-DDLOPEN_LIBSECCAMERA=$(DLOPEN_LIBSECCAMERA) -LOCAL_CFLAGS += -DSWP1_CAMERA_ADD_ADVANCED_FUNCTION ifdef BOARD_CAMERA_DEVICE LOCAL_CFLAGS += -DCAMERA_DEV_NAME=\"$(BOARD_CAMERA_DEVICE)\" @@ -19,7 +18,6 @@ ifdef BOARD_SECOND_CAMERA_DEVICE LOCAL_CFLAGS += -DFFC_PRESENT endif - LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include LOCAL_C_INCLUDES += $(LOCAL_PATH)/../libs3cjpeg @@ -33,15 +31,6 @@ LOCAL_SHARED_LIBRARIES:= libutils libui liblog libbinder libcutils LOCAL_SHARED_LIBRARIES+= libs3cjpeg.aries LOCAL_SHARED_LIBRARIES+= libcamera_client -#Enable the below code to show the video output (without GUI) on TV -#ifeq ($(BOARD_USES_HDMI), true) -#LOCAL_CFLAGS+=-DENABLE_HDMI_DISPLAY \ -# -DBOARD_HDMI_STD=$(BOARD_HDMI_STD) -# -#LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include -#LOCAL_SHARED_LIBRARIES+= libhdmi -#endif - ifeq ($(BOARD_USES_OVERLAY),true) LOCAL_CFLAGS += -DBOARD_USES_OVERLAY endif diff --git a/aries/libcamera/SecCamera.cpp b/aries/libcamera/SecCamera.cpp index 4d24a59..6322485 100644 --- a/aries/libcamera/SecCamera.cpp +++ b/aries/libcamera/SecCamera.cpp @@ -25,7 +25,6 @@ //#define LOG_NDEBUG 0 #define LOG_TAG "SecCamera" -#define ADD_THUMB_IMG 1 #include <utils/Log.h> @@ -37,9 +36,6 @@ using namespace android; -//#define PERFORMANCE //Uncomment to measure performance -//#define DUMP_YUV //Uncomment to take a dump of YUV frame during capture - #define CHECK(return_value) \ if (return_value < 0) { \ LOGE("%s::%d fail. errno: %s, m_camera_id = %d\n", \ @@ -85,42 +81,6 @@ unsigned long measure_time(struct timeval *start, struct timeval *stop) return time; } -static inline unsigned long check_performance() -{ - unsigned long time = 0; - static unsigned long max = 0; - static unsigned long min = 0xffffffff; - - if (time_start.tv_sec == 0 && time_start.tv_usec == 0) { - gettimeofday(&time_start, NULL); - } else { - gettimeofday(&time_stop, NULL); - time = measure_time(&time_start, &time_stop); - if (max < time) max = time; - if (min > time) min = time; - LOGV("Interval: %lu us (%2.2lf fps), min:%2.2lf fps, max:%2.2lf fps\n", - time, 1000000.0 / time, 1000000.0 / max, 1000000.0 / min); - gettimeofday(&time_start, NULL); - } - - return time; -} - -static int close_buffers(struct fimc_buffer *buffers) -{ - int i; - - for (i = 0; i < MAX_BUFFERS; i++) { - if (buffers[i].start) { - munmap(buffers[i].start, buffers[i].length); - //LOGV("munmap():virt. addr[%d]: 0x%x size = %d\n", i, (unsigned int) buffers[i].start, buffers[i].length); - buffers[i].start = NULL; - } - } - - return 0; -} - static int get_pixel_depth(unsigned int fmt) { int depth = 0; @@ -162,21 +122,19 @@ static int get_pixel_depth(unsigned int fmt) #define ALIGN_H(x) (((x) + 0x1F) & (~0x1F)) // Set as multiple of 32 #define ALIGN_BUF(x) (((x) + 0x1FFF)& (~0x1FFF)) // Set as multiple of 8K -static int init_yuv_buffers(struct fimc_buffer *buffers, int width, int height, unsigned int fmt) +static int init_preview_buffers(struct fimc_buffer *buffers, int width, int height, unsigned int fmt) { int i, len; - len = (width * height * get_pixel_depth(fmt)) / 8; + if (fmt==V4L2_PIX_FMT_NV12T) { + len = ALIGN_BUF(ALIGN_W(width) * ALIGN_H(height)) + + ALIGN_BUF(ALIGN_W(width) * ALIGN_H(height / 2)); + } else { + len = (width * height * get_pixel_depth(fmt)) / 8; + } for (i = 0; i < MAX_BUFFERS; i++) { - if (fmt==V4L2_PIX_FMT_NV12T) { - buffers[i].start = NULL; - buffers[i].length = ALIGN_BUF(ALIGN_W(width) * ALIGN_H(height)) + - ALIGN_BUF(ALIGN_W(width) * ALIGN_H(height / 2)); - } else { - buffers[i].start = NULL; - buffers[i].length = len; - } + buffers[i].length = len; } return 0; @@ -203,12 +161,28 @@ static int fimc_poll(struct pollfd *events) return ret; } -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION -static int fimc_esd_poll(struct pollfd *events) +int SecCamera::previewPoll(bool preview) { int ret; - ret = poll(events, 1, 1000); + if (preview) { +#ifdef ENABLE_ESD_PREVIEW_CHECK + int status = 0; + + if (!(++m_esd_check_count % 60)) { + status = getCameraSensorESDStatus(); + m_esd_check_count = 0; + if (status) { + LOGE("ERR(%s) ESD status(%d)", __func__, status); + return status; + } + } +#endif + + ret = poll(&m_events_c, 1, 1000); + } else { + ret = poll(&m_events_c2, 1, 1000); + } if (ret < 0) { LOGE("ERR(%s):poll error\n", __func__); @@ -222,44 +196,6 @@ static int fimc_esd_poll(struct pollfd *events) return ret; } -#endif /* SWP1_CAMERA_ADD_ADVANCED_FUNCTION */ - -#ifdef DUMP_YUV -static int save_yuv(struct fimc_buffer *m_buffers_c, int width, int height, int depth, int index, int frame_count) -{ - FILE *yuv_fp = NULL; - char filename[100], *buffer = NULL; - - /* file create/open, note to "wb" */ - yuv_fp = fopen("/data/main.yuv", "wb"); - if (yuv_fp == NULL) { - LOGE("Save YUV] file open error"); - return -1; - } - - buffer = (char *) malloc(m_buffers_c[index].length); - if (buffer == NULL) { - LOGE("Save YUV] buffer alloc failed"); - if (yuv_fp) fclose(yuv_fp); - return -1; - } - - memcpy(buffer, m_buffers_c[index].start, m_buffers_c[index].length); - - fflush(stdout); - - fwrite(buffer, 1, m_buffers_c[index].length, yuv_fp); - - fflush(yuv_fp); - - if (yuv_fp) - fclose(yuv_fp); - if (buffer) - free(buffer); - - return 0; -} -#endif //DUMP_YUV static int fimc_v4l2_querycap(int fp) { @@ -363,7 +299,7 @@ static int fimc_v4l2_s_fmt_cap(int fp, int width, int height, unsigned int fmt) v4l2_fmt.fmt.pix = pixfmt; - //LOGE("ori_w %d, ori_h %d, w %d, h %d\n", width, height, v4l2_fmt.fmt.pix.width, v4l2_fmt.fmt.pix.height); + LOGV("ori_w %d, ori_h %d, w %d, h %d\n", width, height, v4l2_fmt.fmt.pix.width, v4l2_fmt.fmt.pix.height); /* Set up for capture */ ret = ioctl(fp, VIDIOC_S_FMT, &v4l2_fmt); @@ -384,11 +320,8 @@ static int fimc_v4l2_enum_fmt(int fp, unsigned int fmt) fmtdesc.index = 0; while (ioctl(fp, VIDIOC_ENUM_FMT, &fmtdesc) == 0) { - - LOGD("found fmt = %#x found pixel format[%d]: %s\n", fmt, fmtdesc.index, fmtdesc.description); - if (fmtdesc.pixelformat == fmt) { - LOGD("passed fmt = %#x found pixel format[%d]: %s\n", fmt, fmtdesc.index, fmtdesc.description); + LOGV("passed fmt = %#x found pixel format[%d]: %s\n", fmt, fmtdesc.index, fmtdesc.description); found = 1; break; } @@ -422,46 +355,34 @@ static int fimc_v4l2_reqbufs(int fp, enum v4l2_buf_type type, int nr_bufs) return req.count; } -static int fimc_v4l2_querybuf(int fp, struct fimc_buffer *buffers, enum v4l2_buf_type type, int nr_frames) +static int fimc_v4l2_querybuf(int fp, struct fimc_buffer *buffer, enum v4l2_buf_type type) { struct v4l2_buffer v4l2_buf; - int i, ret; - - for (i = 0; i < nr_frames; i++) { - v4l2_buf.type = type; - v4l2_buf.memory = V4L2_MEMORY_MMAP; - v4l2_buf.index = i; - - ret = ioctl(fp , VIDIOC_QUERYBUF, &v4l2_buf); - if (ret < 0) { - LOGE("ERR(%s):VIDIOC_QUERYBUF failed\n", __func__); - return -1; - } + int ret; - if (nr_frames == 1) { - buffers[i].length = v4l2_buf.length; - if ((buffers[i].start = (char *)mmap(0, v4l2_buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, - fp, v4l2_buf.m.offset)) < 0) { - LOGE("%s %d] mmap() failed\n",__func__, __LINE__); - return -1; - } + LOGI("%s :", __func__); - //LOGV("buffers[%d].start = %p v4l2_buf.length = %d", i, buffers[i].start, v4l2_buf.length); - } else { + v4l2_buf.type = type; + v4l2_buf.memory = V4L2_MEMORY_MMAP; + v4l2_buf.index = 0; -#if defined DUMP_YUV || defined (SEND_YUV_RECORD_DATA) - buffers[i].length = v4l2_buf.length; - if ((buffers[i].start = (char *)mmap(0, v4l2_buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, - fp, v4l2_buf.m.offset)) < 0) { - LOGE("%s %d] mmap() failed\n",__func__, __LINE__); - return -1; - } + ret = ioctl(fp , VIDIOC_QUERYBUF, &v4l2_buf); + if (ret < 0) { + LOGE("ERR(%s):VIDIOC_QUERYBUF failed\n", __func__); + return -1; + } - //LOGV("buffers[%d].start = %p v4l2_buf.length = %d", i, buffers[i].start, v4l2_buf.length); -#endif - } + buffer->length = v4l2_buf.length; + if ((buffer->start = (char *)mmap(0, v4l2_buf.length, + PROT_READ | PROT_WRITE, MAP_SHARED, + fp, v4l2_buf.m.offset)) < 0) { + LOGE("%s %d] mmap() failed\n",__func__, __LINE__); + return -1; } + LOGI("%s: buffer->start = %p v4l2_buf.length = %d", + __func__, buffer->start, v4l2_buf.length); + return 0; } @@ -484,9 +405,7 @@ static int fimc_v4l2_streamoff(int fp) enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE; int ret; -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION LOGV("%s :", __func__); -#endif ret = ioctl(fp, VIDIOC_STREAMOFF, &type); if (ret < 0) { LOGE("ERR(%s):VIDIOC_STREAMOFF failed\n", __func__); @@ -524,7 +443,7 @@ static int fimc_v4l2_dqbuf(int fp) ret = ioctl(fp, VIDIOC_DQBUF, &v4l2_buf); if (ret < 0) { - LOGE("ERR(%s):VIDIOC_DQBUF failed\n", __func__); + LOGE("ERR(%s):VIDIOC_DQBUF failed, dropped frame\n", __func__); return ret; } @@ -567,7 +486,6 @@ static int fimc_v4l2_s_ctrl(int fp, unsigned int id, unsigned int value) return ctrl.value; } -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION static int fimc_v4l2_s_ext_ctrl(int fp, unsigned int id, void *value) { struct v4l2_ext_controls ctrls; @@ -587,7 +505,6 @@ static int fimc_v4l2_s_ext_ctrl(int fp, unsigned int id, void *value) return ret; } -#endif static int fimc_v4l2_g_parm(int fp, struct v4l2_streamparm *streamparm) { @@ -640,7 +557,6 @@ SecCamera::SecCamera() : m_snapshot_max_width (MAX_BACK_CAMERA_SNAPSHOT_WIDTH), m_snapshot_max_height (MAX_BACK_CAMERA_SNAPSHOT_HEIGHT), m_angle(-1), - #ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION m_anti_banding(-1), m_wdr(-1), m_anti_shake(-1), @@ -663,9 +579,6 @@ SecCamera::SecCamera() : m_video_gamma(-1), m_slow_ae(-1), m_camera_af_flag(-1), - #else - m_autofocus(-1), - #endif m_flag_camera_start(0), m_jpeg_thumbnail_width (0), m_jpeg_thumbnail_height(0), @@ -691,6 +604,8 @@ SecCamera::SecCamera() : m_params->sharpness = -1; m_params->white_balance = -1; + memset(&m_capture_buf, 0, sizeof(m_capture_buf)); + LOGV("%s :", __func__); } @@ -717,25 +632,12 @@ int SecCamera::initCamera(int index) */ m_camera_af_flag = -1; -#ifndef JPEG_FROM_SENSOR - m_jpeg_fd = SsbSipJPEGEncodeInit(); - LOGD("(%s):JPEG device open ID = %d\n", __func__, m_jpeg_fd); - if (m_jpeg_fd < 0) { - m_jpeg_fd = 0; - LOGE("ERR(%s):Cannot open a jpeg device file\n", __func__); - return -1; - } -#endif - m_cam_fd_temp = -1; m_cam_fd2_temp = -1; m_cam_fd = open(CAMERA_DEV_NAME, O_RDWR); if (m_cam_fd < 0) { LOGE("ERR(%s):Cannot open %s (error : %s)\n", __func__, CAMERA_DEV_NAME, strerror(errno)); -#ifndef JPEG_FROM_SENSOR - SsbSipJPEGEncodeDeInit(m_jpeg_fd); -#endif return -1; } @@ -777,7 +679,6 @@ int SecCamera::initCamera(int index) ret = fimc_v4l2_s_input(m_cam_fd, index); CHECK(ret); -#ifdef DUAL_PORT_RECORDING m_cam_fd2 = open(CAMERA_DEV_NAME2, O_RDWR); if (m_cam_fd2 < 0) { LOGE("ERR(%s):Cannot open %s (error : %s)\n", __func__, CAMERA_DEV_NAME2, strerror(errno)); @@ -832,7 +733,7 @@ int SecCamera::initCamera(int index) return -1; ret = fimc_v4l2_s_input(m_cam_fd2, index); CHECK(ret); -#endif + m_camera_id = index; setExifFixedAttribute(); @@ -854,35 +755,23 @@ void SecCamera::DeinitCamera() LOGV("%s :", __func__); if (m_flag_init) { -#ifndef JPEG_FROM_SENSOR - if (m_jpeg_fd > 0) { - if (SsbSipJPEGEncodeDeInit(m_jpeg_fd) != JPEG_OK) { - LOGE("ERR(%s):Fail on SsbSipJPEGEncodeDeInit\n", __func__); - } - m_jpeg_fd = 0; - } -#endif -#ifdef DUAL_PORT_RECORDING stopRecord(); -#endif - /* close m_cam_fd after stopRecord() because stopRecord() - * uses m_cam_fd to change frame rate - */ - LOGE("DeinitCamera: m_cam_fd(%d)", m_cam_fd); + /* close m_cam_fd after stopRecord() because stopRecord() + * uses m_cam_fd to change frame rate + */ + LOGI("DeinitCamera: m_cam_fd(%d)", m_cam_fd); if (m_cam_fd > -1) { close(m_cam_fd); m_cam_fd = -1; } -#ifdef DUAL_PORT_RECORDING - LOGE("DeinitCamera: m_cam_fd2(%d)", m_cam_fd2); + LOGI("DeinitCamera: m_cam_fd2(%d)", m_cam_fd2); if (m_cam_fd2 > -1) { close(m_cam_fd2); m_cam_fd2 = -1; } -#endif if (m_cam_fd_temp != -1) { close(m_cam_fd_temp); @@ -907,23 +796,12 @@ int SecCamera::getCameraFd(void) // ====================================================================== // Preview -int SecCamera::flagPreviewStart(void) -{ - LOGV("%s:started(%d)", __func__, m_flag_camera_start); - - return m_flag_camera_start > 0; -} - int SecCamera::startPreview(void) { v4l2_streamparm streamparm; struct sec_cam_parm *parms; parms = (struct sec_cam_parm*)&streamparm.parm.raw_data; -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION LOGV("%s :", __func__); -#else /* SWP1_CAMERA_ADD_ADVANCED_FUNCTION */ - LOGE("%s :", __func__); -#endif /* SWP1_CAMERA_ADD_ADVANCED_FUNCTION */ // aleady started if (m_flag_camera_start > 0) { @@ -946,13 +824,9 @@ int SecCamera::startPreview(void) ret = fimc_v4l2_s_fmt(m_cam_fd, m_preview_width,m_preview_height,m_preview_v4lformat, 0); CHECK(ret); - init_yuv_buffers(m_buffers_c, m_preview_width, m_preview_height, m_preview_v4lformat); ret = fimc_v4l2_reqbufs(m_cam_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, MAX_BUFFERS); CHECK(ret); - ret = fimc_v4l2_querybuf(m_cam_fd, m_buffers_c, V4L2_BUF_TYPE_VIDEO_CAPTURE, MAX_BUFFERS); - CHECK(ret); -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION LOGV("%s : m_preview_width: %d m_preview_height: %d m_angle: %d\n", __func__, m_preview_width, m_preview_height, m_angle); @@ -966,7 +840,6 @@ int SecCamera::startPreview(void) CHECK(ret); } -#endif /* start with all buffers in queue */ for (int i = 0; i < MAX_BUFFERS; i++) { ret = fimc_v4l2_qbuf(m_cam_fd, i); @@ -976,7 +849,6 @@ int SecCamera::startPreview(void) ret = fimc_v4l2_streamon(m_cam_fd); CHECK(ret); -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION m_flag_camera_start = 1; ret = fimc_v4l2_s_parm(m_cam_fd, &m_streamparm); @@ -989,7 +861,6 @@ int SecCamera::startPreview(void) m_blur_level); CHECK(ret); } -#endif // It is a delay for a new frame, not to show the previous bigger ugly picture frame. ret = fimc_poll(&m_events_c); @@ -997,58 +868,43 @@ int SecCamera::startPreview(void) ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_RETURN_FOCUS, 0); CHECK(ret); -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION LOGV("%s: got the first frame of the preview\n", __func__); -#endif /* SWP1_CAMERA_ADD_ADVANCED_FUNCTION */ - -#ifndef SWP1_CAMERA_ADD_ADVANCED_FUNCTION - m_flag_camera_start = 1; -#endif /* SWP1_CAMERA_ADD_ADVANCED_FUNCTION */ -#ifdef ENABLE_HDMI_DISPLAY - hdmi_initialize(m_preview_width,m_preview_height); - hdmi_gl_initialize(0); - hdmi_gl_streamoff(0); -#endif return 0; } int SecCamera::stopPreview(void) { - LOGV("%s :", __func__); + int ret; - close_buffers(m_buffers_c); + LOGV("%s :", __func__); if (m_flag_camera_start == 0) { - LOGV("%s: doing nothing because m_flag_camera_start is zero", __func__); + LOGW("%s: doing nothing because m_flag_camera_start is zero", __func__); return 0; } if (m_params->flash_mode == FLASH_MODE_TORCH) setFlashMode(FLASH_MODE_OFF); -#ifdef ENABLE_HDMI_DISPLAY - hdmi_deinitialize(); - hdmi_gl_streamon(0); -#endif - if (m_cam_fd <= 0) { LOGE("ERR(%s):Camera was closed\n", __func__); return -1; } - int ret = fimc_v4l2_streamoff(m_cam_fd); + ret = fimc_v4l2_streamoff(m_cam_fd); + CHECK(ret); m_flag_camera_start = 0; - CHECK(ret); return ret; } //Recording -#ifdef DUAL_PORT_RECORDING int SecCamera::startRecord(void) { + int ret, i; + LOGV("%s :", __func__); // aleady started @@ -1062,37 +918,26 @@ int SecCamera::startRecord(void) return -1; } - memset(&m_events_c2, 0, sizeof(m_events_c2)); - m_events_c2.fd = m_cam_fd2; - m_events_c2.events = POLLIN | POLLERR; - - int m_record_v4lformat = V4L2_PIX_FMT_NV12T; /* enum_fmt, s_fmt sample */ - int ret = fimc_v4l2_enum_fmt(m_cam_fd2,m_record_v4lformat); + ret = fimc_v4l2_enum_fmt(m_cam_fd2, V4L2_PIX_FMT_NV12T); CHECK(ret); -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION - LOGE("%s: m_recording_width = %d, m_recording_height = %d\n", __func__, m_recording_width, m_recording_height); - - ret = fimc_v4l2_s_fmt(m_cam_fd2, m_recording_width, m_recording_height, m_record_v4lformat, 0); + LOGI("%s: m_recording_width = %d, m_recording_height = %d\n", + __func__, m_recording_width, m_recording_height); + ret = fimc_v4l2_s_fmt(m_cam_fd2, m_recording_width, + m_recording_height, V4L2_PIX_FMT_NV12T, 0); CHECK(ret); - init_yuv_buffers(m_buffers_c2, m_recording_width, m_recording_height, m_record_v4lformat); -#else /* SWP1_CAMERA_ADD_ADVANCED_FUNCTION */ - ret = fimc_v4l2_s_fmt(m_cam_fd2, m_preview_width, m_preview_height, m_record_v4lformat, 0); + ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE, + m_params->capture.timeperframe.denominator); CHECK(ret); - init_yuv_buffers(m_buffers_c2, m_preview_width, m_preview_height, m_record_v4lformat); -#endif /* SWP1_CAMERA_ADD_ADVANCED_FUNCTION */ - ret = fimc_v4l2_reqbufs(m_cam_fd2, V4L2_BUF_TYPE_VIDEO_CAPTURE, MAX_BUFFERS); CHECK(ret); - ret = fimc_v4l2_querybuf(m_cam_fd2, m_buffers_c2, V4L2_BUF_TYPE_VIDEO_CAPTURE, MAX_BUFFERS); - CHECK(ret); /* start with all buffers in queue */ - for (int i = 0; i < MAX_BUFFERS; i++) { + for (i = 0; i < MAX_BUFFERS; i++) { ret = fimc_v4l2_qbuf(m_cam_fd2, i); CHECK(ret); } @@ -1100,7 +945,10 @@ int SecCamera::startRecord(void) ret = fimc_v4l2_streamon(m_cam_fd2); CHECK(ret); - // It is a delay for a new frame, not to show the previous bigger ugly picture frame. + // Get and throw away the first frame since it is often garbled. + memset(&m_events_c2, 0, sizeof(m_events_c2)); + m_events_c2.fd = m_cam_fd2; + m_events_c2.events = POLLIN | POLLERR; ret = fimc_poll(&m_events_c2); CHECK(ret); @@ -1111,21 +959,27 @@ int SecCamera::startRecord(void) int SecCamera::stopRecord(void) { - if (m_flag_record_start == 0) - return 0; + int ret; LOGV("%s :", __func__); - close_buffers(m_buffers_c2); + if (m_flag_record_start == 0) { + LOGW("%s: doing nothing because m_flag_record_start is zero", __func__); + return 0; + } if (m_cam_fd2 <= 0) { LOGE("ERR(%s):Camera was closed\n", __func__); return -1; } - int ret = fimc_v4l2_streamoff(m_cam_fd2); - m_flag_record_start = 0; + + ret = fimc_v4l2_streamoff(m_cam_fd2); + CHECK(ret); + + ret = fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_FRAME_RATE, + FRAME_RATE_AUTO); CHECK(ret); return 0; @@ -1148,7 +1002,6 @@ unsigned int SecCamera::getRecPhyAddrC(int index) CHECK((int)addr_c); return addr_c; } -#endif //DUAL_PORT_RECORDING unsigned int SecCamera::getPhyAddrY(int index) { @@ -1168,17 +1021,6 @@ unsigned int SecCamera::getPhyAddrC(int index) return addr_c; } -#ifdef SEND_YUV_RECORD_DATA -#define PAGE_ALIGN(x) (((x) + 0xFFF) & (~0xFFF)) // Set as multiple of 4K -void SecCamera::getYUVBuffers(unsigned char **virYAddr, unsigned char **virCAddr, int index) -{ - *virYAddr = (unsigned char*)m_buffers_c[index].start; - //*virCAddr = (unsigned char*)m_buffers_c[index].start + PAGE_ALIGN(m_preview_width * m_preview_height); - *virCAddr = (unsigned char*)m_buffers_c[index].start + - ALIGN_TO_8KB(ALIGN_TO_128B(m_preview_width) * ALIGN_TO_32B(m_preview_height)); -} -#endif - void SecCamera::pausePreview() { fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_STREAM_PAUSE, 0); @@ -1187,42 +1029,9 @@ void SecCamera::pausePreview() int SecCamera::getPreview() { int index; -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION int ret; -#endif - -#ifdef ENABLE_ESD_PREVIEW_CHECK - int status = 0; - if (!(++m_esd_check_count % 60)) { - status = getCameraSensorESDStatus(); - m_esd_check_count = 0; - } -#endif // ENABLE_ESD_PREVIEW_CHECK - -#ifdef PERFORMANCE - - LOG_TIME_DEFINE(0) - LOG_TIME_DEFINE(1) - - LOG_TIME_START(0) - fimc_poll(&m_events_c); - LOG_TIME_END(0) - LOG_CAMERA("fimc_poll interval: %lu us", LOG_TIME(0)); - - LOG_TIME_START(1) - index = fimc_v4l2_dqbuf(m_cam_fd); - LOG_TIME_END(1) - LOG_CAMERA("fimc_dqbuf interval: %lu us", LOG_TIME(1)); - -#else -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION - -#ifdef ENABLE_ESD_PREVIEW_CHECK - if (m_flag_camera_start == 0 || fimc_esd_poll(&m_events_c) == 0 || status) { -#else - if (m_flag_camera_start == 0 || fimc_esd_poll(&m_events_c) == 0) { -#endif + if (m_flag_camera_start == 0 || previewPoll(true) == 0) { LOGE("ERR(%s):Start Camera Device Reset \n", __func__); /* GAUDI Project([arun.c@samsung.com]) 2010.05.20. [Implemented ESD code] */ /* @@ -1239,110 +1048,76 @@ int SecCamera::getPreview() return -1; ret = fimc_v4l2_s_input(m_cam_fd, 1000); CHECK(ret); - //setCameraSensorReset(); ret = startPreview(); - -#ifdef ENABLE_ESD_PREVIEW_CHECK - m_esd_check_count = 0; -#endif // ENABLE_ESD_PREVIEW_CHECK - if (ret < 0) { LOGE("ERR(%s): startPreview() return %d\n", __func__, ret); return 0; } } -#else /* SWP1_CAMERA_ADD_ADVANCED_FUNCTION */ - fimc_poll(&m_events_c); -#endif /* SWP1_CAMERA_ADD_ADVANCED_FUNCTION */ + index = fimc_v4l2_dqbuf(m_cam_fd); -#endif if (!(0 <= index && index < MAX_BUFFERS)) { LOGE("ERR(%s):wrong index = %d\n", __func__, index); return -1; } -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION ret = fimc_v4l2_qbuf(m_cam_fd, index); -#else /* SWP1_CAMERA_ADD_ADVANCED_FUNCTION */ - int ret = fimc_v4l2_qbuf(m_cam_fd, index); -#endif /* SWP1_CAMERA_ADD_ADVANCED_FUNCTION */ - CHECK(ret); -#ifdef ENABLE_HDMI_DISPLAY - hdmi_set_v_param(getPhyAddrY(index), getPhyAddrC (index), m_preview_width, m_preview_height); -#endif return index; - } -#ifdef DUAL_PORT_RECORDING -int SecCamera::getRecord() +int SecCamera::getRecordFrame() { - int index; - -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION if (m_flag_record_start == 0) { LOGE("%s: m_flag_record_start is 0", __func__); - startRecord(); + return -1; } -#endif - -#ifdef PERFORMANCE - LOG_TIME_DEFINE(0) - LOG_TIME_DEFINE(1) - - LOG_TIME_START(0) - fimc_poll(&m_events_c2); - LOG_TIME_END(0) - LOG_CAMERA("fimc_poll interval: %lu us", LOG_TIME(0)); - - LOG_TIME_START(1) - index = fimc_v4l2_dqbuf(m_cam_fd2); - LOG_TIME_END(1) - LOG_CAMERA("fimc_dqbuf interval: %lu us", LOG_TIME(1)); + previewPoll(false); + return fimc_v4l2_dqbuf(m_cam_fd2); +} -#else - fimc_poll(&m_events_c2); - index = fimc_v4l2_dqbuf(m_cam_fd2); -#endif - if (!(0 <= index && index < MAX_BUFFERS)) { - LOGE("ERR(%s):wrong index = %d\n", __func__, index); - return -1; +int SecCamera::releaseRecordFrame(int index) +{ + if (!m_flag_record_start) { + /* this can happen when recording frames are returned after + * the recording is stopped at the driver level. we don't + * need to return the buffers in this case and we've seen + * cases where fimc could crash if we called qbuf and it + * wasn't expecting it. + */ + LOGI("%s: recording not in progress, ignoring", __func__); + return 0; } - int ret = fimc_v4l2_qbuf(m_cam_fd2, index); - CHECK(ret); - - return index; + return fimc_v4l2_qbuf(m_cam_fd2, index); } -#endif //DUAL_PORT_RECORDING int SecCamera::setPreviewSize(int width, int height, int pixel_format) { - LOGD("%s(width(%d), height(%d), format(%d))", __func__, width, height, pixel_format); + LOGV("%s(width(%d), height(%d), format(%d))", __func__, width, height, pixel_format); int v4lpixelformat = pixel_format; - +#if defined(LOG_NDEBUG) && LOG_NDEBUG == 0 if (v4lpixelformat == V4L2_PIX_FMT_YUV420) - LOGD("PreviewFormat:V4L2_PIX_FMT_YUV420"); + LOGV("PreviewFormat:V4L2_PIX_FMT_YUV420"); else if (v4lpixelformat == V4L2_PIX_FMT_NV12) - LOGD("PreviewFormat:V4L2_PIX_FMT_NV12"); + LOGV("PreviewFormat:V4L2_PIX_FMT_NV12"); else if (v4lpixelformat == V4L2_PIX_FMT_NV12T) - LOGD("PreviewFormat:V4L2_PIX_FMT_NV12T"); + LOGV("PreviewFormat:V4L2_PIX_FMT_NV12T"); else if (v4lpixelformat == V4L2_PIX_FMT_NV21) - LOGD("PreviewFormat:V4L2_PIX_FMT_NV21"); + LOGV("PreviewFormat:V4L2_PIX_FMT_NV21"); else if (v4lpixelformat == V4L2_PIX_FMT_YUV422P) - LOGD("PreviewFormat:V4L2_PIX_FMT_YUV422P"); + LOGV("PreviewFormat:V4L2_PIX_FMT_YUV422P"); else if (v4lpixelformat == V4L2_PIX_FMT_YUYV) - LOGD("PreviewFormat:V4L2_PIX_FMT_YUYV"); + LOGV("PreviewFormat:V4L2_PIX_FMT_YUYV"); else if (v4lpixelformat == V4L2_PIX_FMT_RGB565) - LOGD("PreviewFormat:V4L2_PIX_FMT_RGB565"); + LOGV("PreviewFormat:V4L2_PIX_FMT_RGB565"); else - LOGE("PreviewFormat:UnknownFormat"); - + LOGV("PreviewFormat:UnknownFormat"); +#endif m_preview_width = width; m_preview_height = height; m_preview_v4lformat = v4lpixelformat; @@ -1375,7 +1150,6 @@ int SecCamera::getPreviewPixelFormat(void) // ====================================================================== // Snapshot -#ifdef JPEG_FROM_SENSOR /* * Devide getJpeg() as two funcs, setSnapshotCmd() & getJpeg() because of the shutter sound timing. * Here, just send the capture cmd to camera ISP to start JPEG capture. @@ -1396,6 +1170,7 @@ int SecCamera::setSnapshotCmd(void) if (m_flag_camera_start > 0) { LOG_TIME_START(0) + LOGW("WARN(%s):Camera was in preview, should have been stopped\n", __func__); stopPreview(); LOG_TIME_END(0) } @@ -1411,11 +1186,9 @@ int SecCamera::setSnapshotCmd(void) CHECK(ret); ret = fimc_v4l2_s_fmt_cap(m_cam_fd, m_snapshot_width, m_snapshot_height, V4L2_PIX_FMT_JPEG); CHECK(ret); - init_yuv_buffers(m_buffers_c, m_snapshot_width, m_snapshot_height, m_snapshot_v4lformat); - ret = fimc_v4l2_reqbufs(m_cam_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, nframe); CHECK(ret); - ret = fimc_v4l2_querybuf(m_cam_fd, m_buffers_c, V4L2_BUF_TYPE_VIDEO_CAPTURE, nframe); + ret = fimc_v4l2_querybuf(m_cam_fd, &m_capture_buf, V4L2_BUF_TYPE_VIDEO_CAPTURE); CHECK(ret); ret = fimc_v4l2_qbuf(m_cam_fd, 0); @@ -1428,6 +1201,21 @@ int SecCamera::setSnapshotCmd(void) return 0; } +int SecCamera::endSnapshot(void) +{ + int ret; + + LOGI("%s :", __func__); + if (m_capture_buf.start) { + munmap(m_capture_buf.start, m_capture_buf.length); + LOGI("munmap():virt. addr %p size = %d\n", + m_capture_buf.start, m_capture_buf.length); + m_capture_buf.start = NULL; + m_capture_buf.length = 0; + } + return 0; +} + /* * Set Jpeg quality & exif info and get JPEG data from camera ISP */ @@ -1440,16 +1228,14 @@ unsigned char* SecCamera::getJpeg(int *jpeg_size, unsigned int *phyaddr) LOG_TIME_DEFINE(2) -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION // capture ret = fimc_poll(&m_events_c); CHECK_PTR(ret); index = fimc_v4l2_dqbuf(m_cam_fd); - if (!(0 <= index && index < MAX_BUFFERS)) { + if (index != 0) { LOGE("ERR(%s):wrong index = %d\n", __func__, index); return NULL; } -#endif *jpeg_size = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAM_JPEG_MAIN_SIZE); CHECK_PTR(*jpeg_size); @@ -1464,7 +1250,7 @@ unsigned char* SecCamera::getJpeg(int *jpeg_size, unsigned int *phyaddr) LOGV("\nsnapshot dqueued buffer = %d snapshot_width = %d snapshot_height = %d, size = %d\n\n", index, m_snapshot_width, m_snapshot_height, *jpeg_size); - addr = (unsigned char*)(m_buffers_c[index].start) + main_offset; + addr = (unsigned char*)(m_capture_buf.start) + main_offset; *phyaddr = getPhyAddrY(index) + m_postview_offset; LOG_TIME_START(2) // post @@ -1478,7 +1264,7 @@ unsigned char* SecCamera::getJpeg(int *jpeg_size, unsigned int *phyaddr) int SecCamera::getExif(unsigned char *pExifDst, unsigned char *pThumbSrc) { JpegEncoder jpgEnc; -#if ADD_THUMB_IMG + LOGV("%s : m_jpeg_thumbnail_width = %d, height = %d", __func__, m_jpeg_thumbnail_width, m_jpeg_thumbnail_height); if ((m_jpeg_thumbnail_width > 0) && (m_jpeg_thumbnail_height > 0)) { @@ -1530,9 +1316,6 @@ int SecCamera::getExif(unsigned char *pExifDst, unsigned char *pThumbSrc) LOGV("%s : enableThumb set to false", __func__); mExifInfo.enableThumb = false; } -#else - mExifInfo.enableThumb = false; -#endif unsigned int exifSize; @@ -1576,25 +1359,10 @@ void SecCamera::getThumbnailConfig(int *width, int *height, int *size) } } -#ifdef DIRECT_DELIVERY_OF_POSTVIEW_DATA int SecCamera::getPostViewOffset(void) { return m_postview_offset; } -#endif - -#else //#ifdef JPEG_FROM_SENSOR -int SecCamera::getJpegFd(void) -{ - return m_jpeg_fd; -} - -void SecCamera::SetJpgAddr(unsigned char *addr) -{ - SetMapAddr(addr); -} - -#endif int SecCamera::getSnapshotAndJpeg(unsigned char *yuv_buf, unsigned char *jpeg_buf, unsigned int *output_size) @@ -1622,6 +1390,7 @@ int SecCamera::getSnapshotAndJpeg(unsigned char *yuv_buf, unsigned char *jpeg_bu if (m_flag_camera_start > 0) { LOG_TIME_START(0) + LOGW("WARN(%s):Camera was in preview, should have been stopped\n", __func__); stopPreview(); LOG_TIME_END(0) } @@ -1658,11 +1427,9 @@ int SecCamera::getSnapshotAndJpeg(unsigned char *yuv_buf, unsigned char *jpeg_bu CHECK(ret); ret = fimc_v4l2_s_fmt_cap(m_cam_fd, m_snapshot_width, m_snapshot_height, m_snapshot_v4lformat); CHECK(ret); - init_yuv_buffers(m_buffers_c, m_snapshot_width, m_snapshot_height, m_snapshot_v4lformat); - ret = fimc_v4l2_reqbufs(m_cam_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, nframe); CHECK(ret); - ret = fimc_v4l2_querybuf(m_cam_fd, m_buffers_c, V4L2_BUF_TYPE_VIDEO_CAPTURE, nframe); + ret = fimc_v4l2_querybuf(m_cam_fd, &m_capture_buf, V4L2_BUF_TYPE_VIDEO_CAPTURE); CHECK(ret); ret = fimc_v4l2_qbuf(m_cam_fd, 0); @@ -1679,17 +1446,12 @@ int SecCamera::getSnapshotAndJpeg(unsigned char *yuv_buf, unsigned char *jpeg_bu LOGV("\nsnapshot dequeued buffer = %d snapshot_width = %d snapshot_height = %d\n\n", index, m_snapshot_width, m_snapshot_height); -#ifdef DUMP_YUV - save_yuv(m_buffers_c, m_snapshot_width, m_snapshot_height, 16, index, 0); -#endif LOG_TIME_END(2) - memcpy(yuv_buf, (unsigned char*)m_buffers_c[index].start, m_snapshot_width * m_snapshot_height * 2); + LOGI("%s : calling memcpy from m_capture_buf", __func__); + memcpy(yuv_buf, (unsigned char*)m_capture_buf.start, m_snapshot_width * m_snapshot_height * 2); LOG_TIME_START(5) // post fimc_v4l2_streamoff(m_cam_fd); -#ifdef DUMP_YUV - close_buffers(m_buffers_c); -#endif LOG_TIME_END(5) LOG_CAMERA("getSnapshotAndJpeg intervals : stopPreview(%lu), prepare(%lu)," @@ -1826,21 +1588,21 @@ int SecCamera::setSnapshotPixelFormat(int pixel_format) if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV420) LOGE("%s : SnapshotFormat:V4L2_PIX_FMT_YUV420", __func__); else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12) - LOGE("%s : SnapshotFormat:V4L2_PIX_FMT_NV12", __func__); + LOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV12", __func__); else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12T) - LOGE("%s : SnapshotFormat:V4L2_PIX_FMT_NV12T", __func__); + LOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV12T", __func__); else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV21) - LOGE("%s : SnapshotFormat:V4L2_PIX_FMT_NV21", __func__); + LOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV21", __func__); else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV422P) - LOGE("%s : SnapshotFormat:V4L2_PIX_FMT_YUV422P", __func__); + LOGD("%s : SnapshotFormat:V4L2_PIX_FMT_YUV422P", __func__); else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUYV) - LOGE("%s : SnapshotFormat:V4L2_PIX_FMT_YUYV", __func__); + LOGD("%s : SnapshotFormat:V4L2_PIX_FMT_YUYV", __func__); else if (m_snapshot_v4lformat == V4L2_PIX_FMT_UYVY) - LOGE("%s : SnapshotFormat:V4L2_PIX_FMT_UYVY", __func__); + LOGD("%s : SnapshotFormat:V4L2_PIX_FMT_UYVY", __func__); else if (m_snapshot_v4lformat == V4L2_PIX_FMT_RGB565) - LOGE("%s : SnapshotFormat:V4L2_PIX_FMT_RGB565", __func__); + LOGD("%s : SnapshotFormat:V4L2_PIX_FMT_RGB565", __func__); else - LOGE("SnapshotFormat:UnknownFormat"); + LOGD("SnapshotFormat:UnknownFormat"); #endif return 0; } @@ -1850,11 +1612,6 @@ int SecCamera::getSnapshotPixelFormat(void) return m_snapshot_v4lformat; } -int SecCamera::cancelPicture(void) -{ - return close_buffers(m_buffers_c); -} - // ====================================================================== // Settings @@ -1903,7 +1660,6 @@ int SecCamera::setAutofocus(void) { LOGV("%s :", __func__); -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION if (m_cam_fd <= 0) { LOGE("ERR(%s):Camera was closed\n", __func__); return -1; @@ -1914,17 +1670,9 @@ int SecCamera::setAutofocus(void) return -1; } -#else - // kcoolsw : turn on setAutofocus initially.. - if (m_autofocus != AUTO_FOCUS_ON) { - m_autofocus = AUTO_FOCUS_ON; - } -#endif - return 0; } -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION int SecCamera::getAutoFocusResult(void) { int af_result; @@ -1935,6 +1683,7 @@ int SecCamera::getAutoFocusResult(void) return af_result; } + int SecCamera::cancelAutofocus(void) { LOGV("%s :", __func__); @@ -1951,7 +1700,7 @@ int SecCamera::cancelAutofocus(void) return 0; } -#endif + // ----------------------------------- int SecCamera::zoomIn(void) @@ -1971,7 +1720,6 @@ int SecCamera::zoomOut(void) int SecCamera::SetRotate(int angle) { LOGE("%s(angle(%d))", __func__, angle); -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION if (m_angle != angle) { switch (angle) { @@ -2008,7 +1756,7 @@ int SecCamera::SetRotate(int angle) } } } -#endif + return 0; } @@ -2020,7 +1768,6 @@ int SecCamera::getRotate(void) int SecCamera::setFrameRate(int frame_rate) { -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION LOGV("%s(FrameRate(%d))", __func__, frame_rate); if (frame_rate < FRAME_RATE_AUTO || FRAME_RATE_MAX < frame_rate ) @@ -2035,9 +1782,7 @@ int SecCamera::setFrameRate(int frame_rate) } } } -#else - m_params->capture.timeperframe.denominator = frame_rate; -#endif + return 0; } @@ -2083,25 +1828,19 @@ int SecCamera::setWhiteBalance(int white_balance) { LOGV("%s(white_balance(%d))", __func__, white_balance); -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION if (white_balance <= WHITE_BALANCE_BASE || WHITE_BALANCE_MAX <= white_balance) { -#else - if (white_balance < WHITE_BALANCE_AUTO || WHITE_BALANCE_SUNNY < white_balance) { -#endif LOGE("ERR(%s):Invalid white_balance(%d)", __func__, white_balance); return -1; } if (m_params->white_balance != white_balance) { m_params->white_balance = white_balance; -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION if (m_flag_camera_start) { if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_WHITE_BALANCE, white_balance) < 0) { LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_WHITE_BALANCE", __func__); return -1; } } -#endif } return 0; @@ -2128,14 +1867,12 @@ int SecCamera::setBrightness(int brightness) if (m_params->brightness != brightness) { m_params->brightness = brightness; -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION if (m_flag_camera_start) { if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_BRIGHTNESS, brightness) < 0) { LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_BRIGHTNESS", __func__); return -1; } } -#endif } return 0; @@ -2153,25 +1890,19 @@ int SecCamera::setImageEffect(int image_effect) { LOGV("%s(image_effect(%d))", __func__, image_effect); -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION if (image_effect <= IMAGE_EFFECT_BASE || IMAGE_EFFECT_MAX <= image_effect) { -#else - if (image_effect < IMAGE_EFFECT_ORIGINAL || IMAGE_EFFECT_SILHOUETTE < image_effect) { -#endif LOGE("ERR(%s):Invalid image_effect(%d)", __func__, image_effect); return -1; } if (m_params->effects != image_effect) { m_params->effects = image_effect; -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION if (m_flag_camera_start) { if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_EFFECT, image_effect) < 0) { LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_EFFECT", __func__); return -1; } } -#endif } return 0; @@ -2184,7 +1915,6 @@ int SecCamera::getImageEffect(void) } // ====================================================================== -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION int SecCamera::setAntiBanding(int anti_banding) { LOGV("%s(anti_banding(%d))", __func__, anti_banding); @@ -3059,8 +2789,6 @@ int SecCamera::setDataLineCheckStop(void) return 0; } -#endif - const __u8* SecCamera::getCameraSensorName(void) { LOGV("%s", __func__); @@ -3083,187 +2811,6 @@ int SecCamera::getCameraSensorESDStatus(void) // ====================================================================== // Jpeg -#ifndef JPEG_FROM_SENSOR -unsigned char* SecCamera::getJpeg(unsigned char *snapshot_data, int snapshot_size, int *size) -{ - LOGV("%s :", __func__); - - if (m_cam_fd <= 0) { - LOGE("ERR(%s):Camera was closed\n", __func__); - return NULL; - } - - unsigned char *jpeg_data = NULL; - int jpeg_size = 0; - - jpeg_data = yuv2Jpeg(snapshot_data, snapshot_size, &jpeg_size, - m_snapshot_width, m_snapshot_height, m_snapshot_v4lformat); - - *size = jpeg_size; - return jpeg_data; -} -#endif - -#ifndef JPEG_FROM_SENSOR -unsigned char* SecCamera::yuv2Jpeg(unsigned char *raw_data, int raw_size, int *jpeg_size, - int width, int height, int pixel_format) -{ - LOGV("%s:raw_data(%p), raw_size(%d), jpeg_size(%d), width(%d), height(%d), format(%d)", - __func__, raw_data, raw_size, *jpeg_size, width, height, pixel_format); - - if (m_jpeg_fd <= 0) { - LOGE("ERR(%s):JPEG device was closed\n", __func__); - return NULL; - } - if (pixel_format == V4L2_PIX_FMT_RGB565) { - LOGE("ERR(%s):It doesn't support V4L2_PIX_FMT_RGB565\n", __func__); - return NULL; - } - - unsigned char *InBuf = NULL; - unsigned char *OutBuf = NULL; - unsigned char *jpeg_data = NULL; - long frameSize; - exif_file_info_t ExifInfo; - - int input_file_format = JPG_MODESEL_YCBCR; - - int out_file_format = JPG_422; - - switch (pixel_format) { - case V4L2_PIX_FMT_NV12: - case V4L2_PIX_FMT_NV21: - case V4L2_PIX_FMT_NV12T: - case V4L2_PIX_FMT_YUV420: - out_file_format = JPG_420; - break; - case V4L2_PIX_FMT_YUYV: - case V4L2_PIX_FMT_UYVY: - case V4L2_PIX_FMT_YUV422P: - out_file_format = JPG_422; - break; - } - - ////////////////////////////////////////////////////////////// - // 2. set encode config. // - ////////////////////////////////////////////////////////////// - LOGV("Step 1 : JPEG_SET_ENCODE_IN_FORMAT(JPG_MODESEL_YCBCR)"); - if (SsbSipJPEGSetEncConfig(JPEG_SET_ENCODE_IN_FORMAT, input_file_format) != JPEG_OK) { - LOGE("ERR(%s):Fail on JPEG_SET_ENCODE_IN_FORMAT\n", __func__); - goto YUV2JPEG_END; - } - - LOGV("Step 2 : JPEG_SET_SAMPING_MODE(JPG_422)"); - if (SsbSipJPEGSetEncConfig(JPEG_SET_SAMPING_MODE, out_file_format) != JPEG_OK) { - LOGE("ERR(%s):Fail on JPEG_SET_SAMPING_MODE\n", __func__); - goto YUV2JPEG_END; - } - - LOGV("Step 3 : JPEG_SET_ENCODE_WIDTH(%d)", width); - if (SsbSipJPEGSetEncConfig(JPEG_SET_ENCODE_WIDTH, width) != JPEG_OK) { - LOGE("ERR(%s):Fail on JPEG_SET_ENCODE_WIDTH \n", __func__); - goto YUV2JPEG_END; - } - - LOGV("Step 4 : JPEG_SET_ENCODE_HEIGHT(%d)", height); - if (SsbSipJPEGSetEncConfig(JPEG_SET_ENCODE_HEIGHT, height) != JPEG_OK) { - LOGE("ERR(%s):Fail on JPEG_SET_ENCODE_HEIGHT \n", __func__); - goto YUV2JPEG_END; - } - - LOGV("Step 5 : JPEG_SET_ENCODE_QUALITY(JPG_QUALITY_LEVEL_2)"); - if (SsbSipJPEGSetEncConfig(JPEG_SET_ENCODE_QUALITY, JPG_QUALITY_LEVEL_2) != JPEG_OK) { - LOGE("ERR(%s):Fail on JPEG_SET_ENCODE_QUALITY \n", __func__); - goto YUV2JPEG_END; - } - -#if (INCLUDE_JPEG_THUMBNAIL == 1) - - LOGV("Step 6a : JPEG_SET_ENCODE_THUMBNAIL(TRUE)"); - if (SsbSipJPEGSetEncConfig(JPEG_SET_ENCODE_THUMBNAIL, TRUE) != JPEG_OK) { - LOGE("ERR(%s):Fail on JPEG_SET_ENCODE_THUMBNAIL \n", __func__); - goto YUV2JPEG_END; - } - - LOGV("Step 6b : JPEG_SET_THUMBNAIL_WIDTH(%d)", m_jpeg_thumbnail_width); - if (SsbSipJPEGSetEncConfig(JPEG_SET_THUMBNAIL_WIDTH, m_jpeg_thumbnail_width) != JPEG_OK) { - LOGE("ERR(%s):Fail on JPEG_SET_THUMBNAIL_WIDTH(%d) \n", __func__, m_jpeg_thumbnail_height); - goto YUV2JPEG_END; - } - - LOGV("Step 6c : JPEG_SET_THUMBNAIL_HEIGHT(%d)", m_jpeg_thumbnail_height); - if (SsbSipJPEGSetEncConfig(JPEG_SET_THUMBNAIL_HEIGHT, m_jpeg_thumbnail_height) != JPEG_OK) { - LOGE("ERR(%s):Fail on JPEG_SET_THUMBNAIL_HEIGHT(%d) \n", __func__, m_jpeg_thumbnail_height); - goto YUV2JPEG_END; - } - -#endif - - if (raw_size == 0) { - unsigned int addr_y; - int width, height,frame_size; - getSnapshotSize(&width, &height, &frame_size); - if (raw_data == NULL) { - LOGE("%s %d] Raw data is NULL \n", __func__, __LINE__); - goto YUV2JPEG_END; - } else { - addr_y = (unsigned int)raw_data; - } - - SsbSipJPEGSetEncodeInBuf(m_jpeg_fd, addr_y, frame_size); - } else { - ////////////////////////////////////////////////////////////// - // 4. get Input buffer address // - ////////////////////////////////////////////////////////////// - LOGV("Step 7 : Input buffer size(0x%X", raw_size); - InBuf = (unsigned char *)SsbSipJPEGGetEncodeInBuf(m_jpeg_fd, raw_size); - if (InBuf == NULL) { - LOGE("ERR(%s):Fail on SsbSipJPEGGetEncodeInBuf \n", __func__); - goto YUV2JPEG_END; - } - ////////////////////////////////////////////////////////////// - // 5. put YUV stream to Input buffer - ////////////////////////////////////////////////////////////// - LOGV("Step 8: memcpy(InBuf(%p), raw_data(%p), raw_size(%d)", InBuf, raw_data, raw_size); - memcpy(InBuf, raw_data, raw_size); - } - - ////////////////////////////////////////////////////////////// - // 6. Make Exif info parameters - ////////////////////////////////////////////////////////////// - LOGV("Step 9: m_makeExifParam()"); - memset(&ExifInfo, 0x00, sizeof(exif_file_info_t)); - m_makeExifParam(&ExifInfo); - - ////////////////////////////////////////////////////////////// - // 7. Encode YUV stream - ////////////////////////////////////////////////////////////// - LOGV("Step a: SsbSipJPEGEncodeExe()"); - if (SsbSipJPEGEncodeExe(m_jpeg_fd, &ExifInfo, JPEG_USE_SW_SCALER) != JPEG_OK) { //with Exif - LOGE("ERR(%s):Fail on SsbSipJPEGEncodeExe \n", __func__); - goto YUV2JPEG_END; - } - ////////////////////////////////////////////////////////////// - // 8. get output buffer address - ////////////////////////////////////////////////////////////// - LOGV("Step b: SsbSipJPEGGetEncodeOutBuf()"); - OutBuf = (unsigned char *)SsbSipJPEGGetEncodeOutBuf(m_jpeg_fd, &frameSize); - if (OutBuf == NULL) { - LOGE("ERR(%s):Fail on SsbSipJPEGGetEncodeOutBuf \n", __func__); - goto YUV2JPEG_END; - } - ////////////////////////////////////////////////////////////// - // 9. write JPEG result file - ////////////////////////////////////////////////////////////// - LOGV("Done"); - jpeg_data = OutBuf; - *jpeg_size = (int)frameSize; - -YUV2JPEG_END: - return jpeg_data; -} -#endif - int SecCamera::setJpegThumbnailSize(int width, int height) { LOGV("%s(width(%d), height(%d))", __func__, width, height); @@ -3395,7 +2942,8 @@ void SecCamera::setExifChangedAttribute() shutterSpeed = 100; } mExifInfo.exposure_time.num = 1; - mExifInfo.exposure_time.den = 1000.0 / shutterSpeed; /* ms -> sec */ + // x us -> 1/x s */ + mExifInfo.exposure_time.den = (uint32_t)(1000000 / shutterSpeed); //3 ISO Speed Rating int iso = fimc_v4l2_g_ctrl(m_cam_fd, V4L2_CID_CAMERA_GET_ISO); @@ -3547,7 +3095,7 @@ void SecCamera::setExifChangedAttribute() mExifInfo.gps_timestamp[2].num = tm_data.tm_sec; mExifInfo.gps_timestamp[2].den = 1; snprintf((char*)mExifInfo.gps_datestamp, sizeof(mExifInfo.gps_datestamp), - "%04d:%02d:%02d", tm_data.tm_year, tm_data.tm_mon, tm_data.tm_mday); + "%04d:%02d:%02d", tm_data.tm_year + 1900, tm_data.tm_mon, tm_data.tm_mday); mExifInfo.enableGps = true; } else { diff --git a/aries/libcamera/SecCamera.h b/aries/libcamera/SecCamera.h index e1e3a1b..2983be6 100644 --- a/aries/libcamera/SecCamera.h +++ b/aries/libcamera/SecCamera.h @@ -34,39 +34,15 @@ #include <sys/stat.h> #include <linux/videodev2.h> -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION #include <videodev2_samsung.h> -#endif #include "JpegEncoder.h" -#ifdef ENABLE_HDMI_DISPLAY -#include "hdmi_lib.h" -#endif - #include <camera/CameraHardwareInterface.h> namespace android { -//Define this if the preview data is to be shared using memory mapped technique instead of passing physical address. -#define PREVIEW_USING_MMAP -//Define this if the JPEG images are obtained directly from camera sensor. Else on chip JPEG encoder will be used. -#define JPEG_FROM_SENSOR - -//#define DUAL_PORT_RECORDING //Define this if 2 fimc ports are needed for recording. -//#define SEND_YUV_RECORD_DATA //Define this to copy YUV data to encoder instead of sharing the physical address. - -//#define ENABLE_ESD_PREVIEW_CHECK - -#define INCLUDE_JPEG_THUMBNAIL 1 //Valid only for on chip JPEG encoder - -#if defined PREVIEW_USING_MMAP -#define DUAL_PORT_RECORDING -#endif - -#if defined JPEG_FROM_SENSOR -#define DIRECT_DELIVERY_OF_POSTVIEW_DATA //Define this if postview data is needed in buffer instead of zero copy. -#endif +#define ENABLE_ESD_PREVIEW_CHECK #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0 #define LOG_CAMERA LOGD @@ -162,19 +138,17 @@ namespace android { #ifndef CAMERA_DEV_NAME #define CAMERA_DEV_NAME "/dev/video0" #endif - -#ifdef DUAL_PORT_RECORDING #ifndef CAMERA_DEV_NAME2 #define CAMERA_DEV_NAME2 "/dev/video2" #endif -#endif + #define CAMERA_DEV_NAME_TEMP "/data/videotmp_000" #define CAMERA_DEV_NAME2_TEMP "/data/videotemp_002" #define BPP 2 #define MIN(x, y) (((x) < (y)) ? (x) : (y)) -#define MAX_BUFFERS 8 +#define MAX_BUFFERS 11 /* * V 4 L 2 F I M C E X T E N S I O N S @@ -239,7 +213,6 @@ public: CAMERA_ID_FRONT = 1, }; -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION enum JPEG_QUALITY { JPEG_QUALITY_ECONOMY = 0, JPEG_QUALITY_NORMAL = 50, @@ -283,7 +256,6 @@ public: int m_touch_af_start_stop; -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION struct gps_info_latiude { unsigned int north_south; unsigned int dgree; @@ -302,10 +274,6 @@ public: unsigned int minute; unsigned int second; } gpsInfoAltitude; -#endif - - -#endif SecCamera(); ~SecCamera(); @@ -325,15 +293,14 @@ public: int startPreview(void); int stopPreview(void); -#ifdef DUAL_PORT_RECORDING + int startRecord(void); int stopRecord(void); - int getRecord(void); + int getRecordFrame(void); + int releaseRecordFrame(int index); unsigned int getRecPhyAddrY(int); unsigned int getRecPhyAddrC(int); -#endif - int cancelPicture(void); - int flagPreviewStart(void); + int getPreview(void); int setPreviewSize(int width, int height, int pixel_format); int getPreviewSize(int *width, int *height, int *frame_size); @@ -373,7 +340,7 @@ public: int setImageEffect(int image_effect); int getImageEffect(void); -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION + int setSceneMode(int scene_mode); int getSceneMode(void); @@ -447,6 +414,7 @@ public: int setExifOrientationInfo(int orientationInfo); int setBatchReflection(void); int setSnapshotCmd(void); + int endSnapshot(void); int setCameraSensorReset(void); int setSensorMode(int sensor_mode); /* Camcorder fix fps */ int setShotMode(int shot_mode); /* Shot mode */ @@ -461,10 +429,10 @@ public: int setDefultIMEI(int imei); int getDefultIMEI(void); const __u8* getCameraSensorName(void); + int previewPoll(bool preview); #ifdef ENABLE_ESD_PREVIEW_CHECK int getCameraSensorESDStatus(void); #endif // ENABLE_ESD_PREVIEW_CHECK -#endif int setFrameRate(int frame_rate); unsigned char* getJpeg(int*, unsigned int*); @@ -472,22 +440,15 @@ public: unsigned int *output_size); int getExif(unsigned char *pExifDst, unsigned char *pThumbSrc); -#ifdef JPEG_FROM_SENSOR void getPostViewConfig(int*, int*, int*); -#endif void getThumbnailConfig(int *width, int *height, int *size); -#ifdef DIRECT_DELIVERY_OF_POSTVIEW_DATA int getPostViewOffset(void); -#endif int getCameraFd(void); int getJpegFd(void); void SetJpgAddr(unsigned char *addr); unsigned int getPhyAddrY(int); unsigned int getPhyAddrC(int); -#ifdef SEND_YUV_RECORD_DATA - void getYUVBuffers(unsigned char **virYAddr, unsigned char **virCaddr, int index); -#endif void pausePreview(); int initCamera(int index); void DeinitCamera(); @@ -536,12 +497,10 @@ private: int m_cam_fd_temp; int m_cam_fd2_temp; -#ifdef DUAL_PORT_RECORDING + int m_cam_fd2; struct pollfd m_events_c2; int m_flag_record_start; - struct fimc_buffer m_buffers_c2[MAX_BUFFERS]; -#endif int m_preview_v4lformat; int m_preview_width; @@ -556,10 +515,6 @@ private: int m_snapshot_max_height; int m_angle; -#ifndef SWP1_CAMERA_ADD_ADVANCED_FUNCTION - int m_autofocus; -#endif -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION int m_anti_banding; int m_wdr; int m_anti_shake; @@ -587,7 +542,6 @@ private: int m_caf_on_off; int m_default_imei; int m_camera_af_flag; -#endif int m_flag_camera_start; @@ -604,7 +558,7 @@ private: exif_attribute_t mExifInfo; - struct fimc_buffer m_buffers_c[MAX_BUFFERS]; + struct fimc_buffer m_capture_buf; struct pollfd m_events_c; inline int m_frameSize(int format, int width, int height); diff --git a/aries/libcamera/SecCameraHWInterface.cpp b/aries/libcamera/SecCameraHWInterface.cpp index 9044eda..fab4a7e 100644 --- a/aries/libcamera/SecCameraHWInterface.cpp +++ b/aries/libcamera/SecCameraHWInterface.cpp @@ -32,15 +32,6 @@ #define ALL_BUFFERS_FLUSHED -66 #endif -#ifdef SEND_YUV_RECORD_DATA -#define ALIGN_TO_32B(x) ((((x) + (1 << 5) - 1) >> 5) << 5) -#define ALIGN_TO_128B(x) ((((x) + (1 << 7) - 1) >> 7) << 7) -#define ALIGN_TO_8KB(x) ((((x) + (1 << 13) - 1) >> 13) << 13) -#define RECORD_HEAP_SIZE (ALIGN_TO_8KB(ALIGN_TO_128B(1280) * \ - ALIGN_TO_32B(720)) + ALIGN_TO_8KB(ALIGN_TO_128B(1280) * \ - ALIGN_TO_32B(720 / 2))) -#endif - #define VIDEO_COMMENT_MARKER_H 0xFFBE #define VIDEO_COMMENT_MARKER_L 0xFFBF #define VIDEO_COMMENT_MARKER_LENGTH 4 @@ -73,7 +64,6 @@ static const int EFFECT_SKIP_FRAME = 1; CameraHardwareSec::CameraHardwareSec(int cameraId) : - mPreviewRunning(false), mCaptureInProgress(false), mParameters(), mPreviewHeap(0), @@ -81,9 +71,6 @@ CameraHardwareSec::CameraHardwareSec(int cameraId) mRecordHeap(0), mJpegHeap(0), mSecCamera(NULL), - mPreviewFrameSize(0), - mRawFrameSize(0), - mPreviewFrameRateMicrosec(33000), mCameraSensorName(NULL), mSkipFrame(0), #if defined(BOARD_USES_OVERLAY) @@ -95,14 +82,10 @@ CameraHardwareSec::CameraHardwareSec(int cameraId) mDataCbTimestamp(0), mCallbackCookie(0), mMsgEnabled(0), - mCurrentPreviewFrame(0), - mRecordRunning(false) -#ifdef JPEG_FROM_SENSOR - , + mRecordRunning(false), mPostViewWidth(0), mPostViewHeight(0), mPostViewSize(0) -#endif { LOGV("%s :", __func__); int ret = 0; @@ -122,22 +105,7 @@ CameraHardwareSec::CameraHardwareSec(int cameraId) LOGE("ERR(%s):Fail on mSecCamera->flagCreate()", __func__); } -#ifndef PREVIEW_USING_MMAP - int previewHeapSize = sizeof(struct addrs) * kBufferCount; - - LOGV("mPreviewHeap : MemoryHeapBase(previewHeapSize(%d))", previewHeapSize); - mPreviewHeap = new MemoryHeapBase(previewHeapSize); - if (mPreviewHeap->getHeapID() < 0) { - LOGE("ERR(%s): Preview heap creation fail", __func__); - mPreviewHeap.clear(); - } -#endif - -#ifdef SEND_YUV_RECORD_DATA - int recordHeapSize = RECORD_HEAP_SIZE; -#else int recordHeapSize = sizeof(struct addrs) * kBufferCount; -#endif LOGV("mRecordHeap : MemoryHeapBase(recordHeapSize(%d))", recordHeapSize); mRecordHeap = new MemoryHeapBase(recordHeapSize); if (mRecordHeap->getHeapID() < 0) { @@ -145,17 +113,11 @@ CameraHardwareSec::CameraHardwareSec(int cameraId) mRecordHeap.clear(); } -#ifdef JPEG_FROM_SENSOR mSecCamera->getPostViewConfig(&mPostViewWidth, &mPostViewHeight, &mPostViewSize); LOGV("mPostViewWidth = %d mPostViewHeight = %d mPostViewSize = %d", mPostViewWidth,mPostViewHeight,mPostViewSize); -#endif -#ifdef DIRECT_DELIVERY_OF_POSTVIEW_DATA int rawHeapSize = mPostViewSize; -#else - int rawHeapSize = sizeof(struct addrs_cap); -#endif LOGV("mRawHeap : MemoryHeapBase(previewHeapSize(%d))", rawHeapSize); mRawHeap = new MemoryHeapBase(rawHeapSize); if (mRawHeap->getHeapID() < 0) { @@ -166,6 +128,11 @@ CameraHardwareSec::CameraHardwareSec(int cameraId) initDefaultParameters(cameraId); mExitAutoFocusThread = false; + mExitPreviewThread = false; + /* whether the PreviewThread is active in preview or stopped. we + * create the thread but it is initially in stopped state. + */ + mPreviewRunning = false; mPreviewThread = new PreviewThread(this); mAutoFocusThread = new AutoFocusThread(this); mPictureThread = new PictureThread(this); @@ -214,17 +181,13 @@ void CameraHardwareSec::initDefaultParameters(int cameraId) LOGE("getSnapshotMaxSize fail (%d / %d) \n", snapshot_max_width, snapshot_max_height); -#ifdef PREVIEW_USING_MMAP p.setPreviewFormat(CameraParameters::PIXEL_FORMAT_YUV420SP); -#else - p.setPreviewFormat("yuv420sp_custom"); -#endif p.setPreviewSize(preview_max_width, preview_max_height); p.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); p.setPictureSize(snapshot_max_width, snapshot_max_height); p.set(CameraParameters::KEY_JPEG_QUALITY, "100"); // maximum quality -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION + p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, CameraParameters::PIXEL_FORMAT_YUV420SP); p.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, @@ -348,13 +311,12 @@ void CameraHardwareSec::initDefaultParameters(int cameraId) ip.set("saturation-max", 4); ip.set("contrast-min", 0); ip.set("contrast-max", 4); -#endif p.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, "100"); p.set(CameraParameters::KEY_ROTATION, 0); p.set(CameraParameters::KEY_WHITE_BALANCE, CameraParameters::WHITE_BALANCE_AUTO); -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION + p.set(CameraParameters::KEY_EFFECT, CameraParameters::EFFECT_NONE); ip.set("sharpness", SHARPNESS_DEFAULT); @@ -369,10 +331,6 @@ void CameraHardwareSec::initDefaultParameters(int cameraId) ip.set("vtmode", 0); ip.set("blur", 0); } -#else - ip.set("image-effects", "original"); -#endif - p.set(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, "51.2"); p.set(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, "39.4"); @@ -460,9 +418,37 @@ void CameraHardwareSec::setSkipFrame(int frame) mSkipFrame = frame; } +int CameraHardwareSec::previewThreadWrapper() +{ + LOGI("%s: starting", __func__); + while (1) { + mPreviewLock.lock(); + while (!mPreviewRunning) { + LOGI("%s: calling mSecCamera->stopPreview() and waiting", __func__); + mSecCamera->stopPreview(); + /* signal that we're stopping */ + mPreviewStoppedCondition.signal(); + mPreviewCondition.wait(mPreviewLock); + LOGI("%s: return from wait", __func__); + } + mPreviewLock.unlock(); + + if (mExitPreviewThread) { + LOGI("%s: exiting", __func__); + mSecCamera->stopPreview(); + return 0; + } + previewThread(); + } +} + int CameraHardwareSec::previewThread() { int index; + nsecs_t timestamp; + unsigned int phyYAddr; + unsigned int phyCAddr; + struct addrs *addrs; index = mSecCamera->getPreview(); if (index < 0) { @@ -477,9 +463,16 @@ int CameraHardwareSec::previewThread() } mSkipFrameLock.unlock(); - nsecs_t timestamp = systemTime(SYSTEM_TIME_MONOTONIC); + timestamp = systemTime(SYSTEM_TIME_MONOTONIC); + + phyYAddr = mSecCamera->getPhyAddrY(index); + phyCAddr = mSecCamera->getPhyAddrC(index); + + if (phyYAddr == 0xffffffff || phyCAddr == 0xffffffff) { + LOGE("ERR(%s):Fail on SecCamera getPhyAddr Y addr = %0x C addr = %0x", __func__, phyYAddr, phyCAddr); + return UNKNOWN_ERROR; + } -#ifdef PREVIEW_USING_MMAP int width, height, frame_size, offset; mSecCamera->getPreviewSize(&width, &height, &frame_size); @@ -487,129 +480,65 @@ int CameraHardwareSec::previewThread() offset = (frame_size + 16) * index; sp<MemoryBase> buffer = new MemoryBase(mPreviewHeap, offset, frame_size); - unsigned int phyYAddr = mSecCamera->getPhyAddrY(index); - unsigned int phyCAddr = mSecCamera->getPhyAddrC(index); - - if (phyYAddr == 0xffffffff || phyCAddr == 0xffffffff) { - LOGE("ERR(%s):Fail on SecCamera. Invalid PhyAddr, Y addr = %0x C addr = %0x", - __func__, phyYAddr, phyCAddr); - return UNKNOWN_ERROR; - } memcpy(static_cast<unsigned char *>(mPreviewHeap->base()) + (offset + frame_size ), &phyYAddr, 4); memcpy(static_cast<unsigned char *>(mPreviewHeap->base()) + (offset + frame_size + 4), &phyCAddr, 4); #if defined(BOARD_USES_OVERLAY) if (mUseOverlay) { int ret; + overlay_buffer_t overlay_buffer; + mOverlayBufferIdx ^= 1; memcpy(static_cast<unsigned char*>(mPreviewHeap->base()) + offset + frame_size + sizeof(phyYAddr) + sizeof(phyCAddr), - &mOverlayBufferIdx, sizeof(mOverlayBufferIdx)); + &mOverlayBufferIdx, sizeof(mOverlayBufferIdx)); ret = mOverlay->queueBuffer((void*)(static_cast<unsigned char *>(mPreviewHeap->base()) + (offset + frame_size))); - if (ret == ALL_BUFFERS_FLUSHED) { - goto OverlayEnd; - } else if (ret == -1) { + if (ret == -1 ) { LOGE("ERR(%s):overlay queueBuffer fail", __func__); - goto OverlayEnd; - } - - overlay_buffer_t overlay_buffer; - ret = mOverlay->dequeueBuffer(&overlay_buffer); - - if (ret == ALL_BUFFERS_FLUSHED) { - goto OverlayEnd; - } else if (ret == -1) { - LOGE("ERR(%s):overlay dequeueBuffer fail", __func__); - goto OverlayEnd; - } - } - -OverlayEnd: + } else if (ret != ALL_BUFFERS_FLUSHED) { + ret = mOverlay->dequeueBuffer(&overlay_buffer); + if (ret == -1) { + LOGE("ERR(%s):overlay dequeueBuffer fail", __func__); + } + } + } #endif -#else - unsigned int phyYAddr = mSecCamera->getPhyAddrY(index); - unsigned int phyCAddr = mSecCamera->getPhyAddrC(index); - - if (phyYAddr == 0xffffffff || phyCAddr == 0xffffffff) { - LOGE("ERR(%s):Fail on SecCamera getPhyAddr Y addr = %0x C addr = %0x", __func__, phyYAddr, phyCAddr); - return UNKNOWN_ERROR; - } - struct addrs *addrs = (struct addrs *)mPreviewHeap->base(); - - sp<MemoryBase> buffer = new MemoryBase(mPreviewHeap, index * sizeof(struct addrs), sizeof(struct addrs)); - addrs[index].addr_y = phyYAddr; - addrs[index].addr_cbcr = phyCAddr; -#endif //PREVIEW_USING_MMAP - // Notify the client of a new frame. if (mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) { mDataCb(CAMERA_MSG_PREVIEW_FRAME, buffer, mCallbackCookie); } + Mutex::Autolock lock(mRecordLock); if (mRecordRunning == true) { -#ifdef SEND_YUV_RECORD_DATA - int width, height, frame_size; - unsigned char *virYAddr; - unsigned char *virCAddr; - - mSecCamera->getPreviewSize(&width, &height, &frame_size); - mSecCamera->getYUVBuffers(&virYAddr, &virCAddr, index); - sp<MemoryBase> buffer = new MemoryBase(mRecordHeap, 0, frame_size); - //memcpy(mRecordHeap->base(), (void*)virYAddr, width * height); - //memcpy(mRecordHeap->base() + (width*height),(void*)virCAddr, width * height * 0.5); - memcpy(mRecordHeap->base(), (void*)virYAddr, ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height))); - memcpy(mRecordHeap->base() + ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height)), - (void*)virCAddr, ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height / 2))); -#else -#ifdef DUAL_PORT_RECORDING - int index = mSecCamera->getRecord(); - + index = mSecCamera->getRecordFrame(); if (index < 0) { LOGE("ERR(%s):Fail on SecCamera->getRecord()", __func__); return UNKNOWN_ERROR; } - unsigned int phyYAddr = mSecCamera->getRecPhyAddrY(index); - unsigned int phyCAddr = mSecCamera->getRecPhyAddrC(index); + phyYAddr = mSecCamera->getRecPhyAddrY(index); + phyCAddr = mSecCamera->getRecPhyAddrC(index); if (phyYAddr == 0xffffffff || phyCAddr == 0xffffffff) { LOGE("ERR(%s):Fail on SecCamera getRectPhyAddr Y addr = %0x C addr = %0x", __func__, phyYAddr, phyCAddr); return UNKNOWN_ERROR; } -#endif//DUAL_PORT_RECORDING - struct addrs *addrs = (struct addrs *)mRecordHeap->base(); + + addrs = (struct addrs *)mRecordHeap->base(); sp<MemoryBase> buffer = new MemoryBase(mRecordHeap, index * sizeof(struct addrs), sizeof(struct addrs)); addrs[index].addr_y = phyYAddr; addrs[index].addr_cbcr = phyCAddr; -#endif + addrs[index].buf_index = index; + // Notify the client of a new frame. if (mMsgEnabled & CAMERA_MSG_VIDEO_FRAME) { - //nsecs_t timestamp = systemTime(SYSTEM_TIME_MONOTONIC); mDataCbTimestamp(timestamp, CAMERA_MSG_VIDEO_FRAME, buffer, mCallbackCookie); + } else { + mSecCamera->releaseRecordFrame(index); } -#ifdef DUAL_PORT_RECORDING - } else if (mRecordRunning == false) { - if (mSecCamera->stopRecord() < 0) { - LOGE("ERR(%s):Fail on mSecCamera->stopRecord()", __func__); - return UNKNOWN_ERROR; - } -#endif - } - - // Wait for it... - if (mTimeStart.tv_sec == 0 && mTimeStart.tv_usec == 0) { - gettimeofday(&mTimeStart, NULL); - } else { - gettimeofday(&mTimeStop, NULL); - long time = measure_time(&mTimeStart, &mTimeStop); - int delay = (mPreviewFrameRateMicrosec > time) ? mPreviewFrameRateMicrosec - time : 0; - - usleep(delay); - //LOG_CAMERA_PREVIEW("delay = %d time = %ld us\n ", delay, time); - gettimeofday(&mTimeStart, NULL); } return NO_ERROR; @@ -622,21 +551,18 @@ status_t CameraHardwareSec::startPreview() LOGV("%s :", __func__); Mutex::Autolock lock(mStateLock); - if (mPreviewRunning) { - // already running - LOGE("%s : preview thread already running", __func__); - return INVALID_OPERATION; - } - if (mCaptureInProgress) { LOGE("%s : capture in progress, not allowed", __func__); return INVALID_OPERATION; } - memset(&mTimeStart, 0, sizeof(mTimeStart)); - memset(&mTimeStop, 0, sizeof(mTimeStop)); - - mSecCamera->stopPreview(); + mPreviewLock.lock(); + if (mPreviewRunning) { + // already running + LOGE("%s : preview thread already running", __func__); + mPreviewLock.unlock(); + return INVALID_OPERATION; + } setSkipFrame(INITIAL_SKIP_FRAME); @@ -648,7 +574,6 @@ status_t CameraHardwareSec::startPreview() return -1; //UNKNOWN_ERROR; } -#ifdef PREVIEW_USING_MMAP if (mPreviewHeap != NULL) mPreviewHeap.clear(); @@ -660,27 +585,13 @@ status_t CameraHardwareSec::startPreview() LOGD("MemoryHeapBase(fd(%d), size(%d), width(%d), height(%d))", (int)mSecCamera->getCameraFd(), (size_t)(previewHeapSize), width, height); mPreviewHeap = new MemoryHeapBase((int)mSecCamera->getCameraFd(), (size_t)(previewHeapSize), (uint32_t)0); -#endif -#ifdef JPEG_FROM_SENSOR mSecCamera->getPostViewConfig(&mPostViewWidth, &mPostViewHeight, &mPostViewSize); LOGV("CameraHardwareSec: mPostViewWidth = %d mPostViewHeight = %d mPostViewSize = %d",mPostViewWidth,mPostViewHeight,mPostViewSize); -#endif - -#ifdef DIRECT_DELIVERY_OF_POSTVIEW_DATA - int rawHeapSize = mPostViewSize; -#else - int rawHeapSize = sizeof(struct addrs_cap); -#endif - LOGV("CameraHardwareSec: mRawHeap : MemoryHeapBase(previewHeapSize(%d))", rawHeapSize); - mRawHeap = new MemoryHeapBase(rawHeapSize); - if (mRawHeap->getHeapID() < 0) { - LOGE("ERR(%s): Raw heap creation fail", __func__); - mRawHeap.clear(); - } mPreviewRunning = true; - mPreviewThread->run("CameraPreviewThread", PRIORITY_URGENT_DISPLAY); + mPreviewCondition.signal(); + mPreviewLock.unlock(); return NO_ERROR; } @@ -748,24 +659,22 @@ void CameraHardwareSec::stopPreview() { LOGV("%s :", __func__); - if (!previewEnabled()) - return; - - /* request that the preview thread exit. we can wait because we're - * called by CameraServices with a lock but it has disabled all preview - * related callbacks so previewThread should not invoke any callbacks. - */ - mPreviewThread->requestExitAndWait(); - - if (mSecCamera->stopPreview() < 0) - LOGE("ERR(%s):Fail on mSecCamera->stopPreview()", __func__); - - mPreviewRunning = false; + /* request that the preview thread stop. */ + mPreviewLock.lock(); + if (mPreviewRunning) { + mPreviewRunning = false; + mPreviewCondition.signal(); + /* wait until preview thread is stopped */ + mPreviewStoppedCondition.wait(mPreviewLock); + } else { + LOGI("%s : preview not running, doing nothing", __func__); + } + mPreviewLock.unlock(); } bool CameraHardwareSec::previewEnabled() { - Mutex::Autolock lock(mStateLock); + Mutex::Autolock lock(mPreviewLock); LOGV("%s : %d", __func__, mPreviewRunning); return mPreviewRunning; } @@ -776,14 +685,15 @@ status_t CameraHardwareSec::startRecording() { LOGV("%s :", __func__); -#ifdef DUAL_PORT_RECORDING + Mutex::Autolock lock(mRecordLock); + + if (mRecordRunning == false) { if (mSecCamera->startRecord() < 0) { LOGE("ERR(%s):Fail on mSecCamera->startRecord()", __func__); return UNKNOWN_ERROR; } -#endif - - mRecordRunning = true; + mRecordRunning = true; + } return NO_ERROR; } @@ -791,7 +701,15 @@ void CameraHardwareSec::stopRecording() { LOGV("%s :", __func__); - mRecordRunning = false; + Mutex::Autolock lock(mRecordLock); + + if (mRecordRunning == true) { + if (mSecCamera->stopRecord() < 0) { + LOGE("ERR(%s):Fail on mSecCamera->stopRecord()", __func__); + return; + } + mRecordRunning = false; + } } bool CameraHardwareSec::recordingEnabled() @@ -803,25 +721,19 @@ bool CameraHardwareSec::recordingEnabled() void CameraHardwareSec::releaseRecordingFrame(const sp<IMemory>& mem) { - LOG_CAMERA_PREVIEW("%s :", __func__); - -// ssize_t offset; size_t size; -// sp<MemoryBase> mem1 = mem; -// sp<MemoryHeapBase> heap = mem->getMemory(&offset, &size); -// sp<IMemoryHeap> heap = mem->getMemory(&offset, &size); + ssize_t offset; + sp<IMemoryHeap> heap = mem->getMemory(&offset, NULL); + struct addrs *addrs = (struct addrs *)((uint8_t *)heap->base() + offset); -// mem1.clear(); -// heap.clear(); + mSecCamera->releaseRecordFrame(addrs->buf_index); } // --------------------------------------------------------------------------- int CameraHardwareSec::autoFocusThread() { -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION int count =0; int af_status =0 ; -#endif LOGV("%s : starting", __func__); @@ -832,12 +744,20 @@ int CameraHardwareSec::autoFocusThread() * in CameraServices layer. */ mFocusLock.lock(); - mCondition.wait(mFocusLock); - mFocusLock.unlock(); - /* check early exit request */ - if (mExitAutoFocusThread) + if (mExitAutoFocusThread) { + mFocusLock.unlock(); + LOGV("%s : exiting on request0", __func__); + return NO_ERROR; + } + mFocusCondition.wait(mFocusLock); + /* check early exit request */ + if (mExitAutoFocusThread) { + mFocusLock.unlock(); + LOGV("%s : exiting on request1", __func__); return NO_ERROR; + } + mFocusLock.unlock(); LOGV("%s : calling setAutoFocus", __func__); if (mSecCamera->setAutofocus() < 0) { @@ -845,8 +765,8 @@ int CameraHardwareSec::autoFocusThread() return UNKNOWN_ERROR; } -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION - + af_status = mSecCamera->getAutoFocusResult(); + int i; i = 0; @@ -868,7 +788,6 @@ int CameraHardwareSec::autoFocusThread() if (mMsgEnabled & CAMERA_MSG_FOCUS) mNotifyCb(CAMERA_MSG_FOCUS, true, 0, mCallbackCookie); } - //FIXME: determine that the user cancled the AF #if 0 else if (af_status == 0x02) { @@ -888,11 +807,8 @@ int CameraHardwareSec::autoFocusThread() if (mMsgEnabled & CAMERA_MSG_FOCUS) mNotifyCb(CAMERA_MSG_FOCUS, false, 0, mCallbackCookie); } -#else - if (mMsgEnabled & CAMERA_MSG_FOCUS) - mNotifyCb(CAMERA_MSG_FOCUS, true, 0, mCallbackCookie); -#endif + LOGV("%s : exiting with no error", __func__); return NO_ERROR; } @@ -900,21 +816,19 @@ status_t CameraHardwareSec::autoFocus() { LOGV("%s :", __func__); /* signal autoFocusThread to run once */ - mCondition.signal(); + mFocusCondition.signal(); return NO_ERROR; } /* 2009.10.14 by icarus for added interface */ status_t CameraHardwareSec::cancelAutoFocus() { -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION LOGV("%s :", __func__); if (mSecCamera->cancelAutofocus() < 0) { LOGE("ERR(%s):Fail on mSecCamera->cancelAutofocus()", __func__); return UNKNOWN_ERROR; } -#endif return NO_ERROR; } @@ -1049,7 +963,7 @@ bool CameraHardwareSec::YUY2toNV21(void *srcBuf, void *dstBuf, uint32_t srcWidth int CameraHardwareSec::pictureThread() { - LOGV("%s :", __func__); + LOGV("%s :", __func__); int jpeg_size = 0; int ret = NO_ERROR; @@ -1076,11 +990,8 @@ int CameraHardwareSec::pictureThread() LOG_TIME_DEFINE(0) LOG_TIME_START(0) -#ifdef DIRECT_DELIVERY_OF_POSTVIEW_DATA + sp<MemoryBase> buffer = new MemoryBase(mRawHeap, 0, mPostViewSize + 8); -#else - sp<MemoryBase> buffer = new MemoryBase(mRawHeap, 0, sizeof(struct addrs_cap)); -#endif struct addrs_cap *addrs = (struct addrs_cap *)mRawHeap->base(); @@ -1105,11 +1016,9 @@ int CameraHardwareSec::pictureThread() // Modified the shutter sound timing for Jpeg capture if (mSecCamera->getCameraId() == SecCamera::CAMERA_ID_BACK) mSecCamera->setSnapshotCmd(); -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION if (mMsgEnabled & CAMERA_MSG_SHUTTER) { mNotifyCb(CAMERA_MSG_SHUTTER, 0, 0, mCallbackCookie); } -#endif if (mSecCamera->getCameraId() == SecCamera::CAMERA_ID_BACK){ jpeg_data = mSecCamera->getJpeg(&jpeg_size, &phyAddr); @@ -1128,11 +1037,7 @@ int CameraHardwareSec::pictureThread() LOGI("snapshotandjpeg done\n"); } - -#ifndef DIRECT_DELIVERY_OF_POSTVIEW_DATA - addrs[0].addr_y = phyAddr; -#endif LOG_TIME_END(1) LOG_CAMERA("getSnapshotAndJpeg interval: %lu us", LOG_TIME(1)); @@ -1151,15 +1056,34 @@ int CameraHardwareSec::pictureThread() } if (mMsgEnabled & CAMERA_MSG_COMPRESSED_IMAGE) { + memcpy(JpegHeap->base (), jpeg_data, jpeg_size + 2); - sp<MemoryBase> mem = new MemoryBase(JpegHeap, 0, jpeg_size); + + int JpegExifSize; + sp<MemoryHeapBase> ExifHeap = new MemoryHeapBase(EXIF_FILE_SIZE + JPG_STREAM_BUF_SIZE); + JpegExifSize = mSecCamera->getExif((unsigned char *)ExifHeap->base(), + (unsigned char *)ThumbnailHeap->base()); + + LOGV("JpegExifSize=%d", JpegExifSize); + + if (JpegExifSize < 0) { + ret = UNKNOWN_ERROR; + goto out; + } + + unsigned char *ExifStart = (unsigned char *)JpegHeap->base() + 2; + unsigned char *ImageStart = ExifStart + JpegExifSize; + memmove(ImageStart, ExifStart, jpeg_size - 2); + memcpy(ExifStart, ExifHeap->base(), JpegExifSize); + + sp<MemoryBase> mem = new MemoryBase(JpegHeap, 0, jpeg_size + JpegExifSize); mDataCb(CAMERA_MSG_COMPRESSED_IMAGE, mem, mCallbackCookie); } LOG_TIME_END(0) LOG_CAMERA("pictureThread interval: %lu us", LOG_TIME(0)); - +out: LOGV("%s : pictureThread end", __func__); return ret; } @@ -1189,9 +1113,6 @@ status_t CameraHardwareSec::cancelPicture() { mPictureThread->requestExitAndWait(); - mSecCamera->cancelPicture(); - - LOGW("%s : not supported, just returning NO_ERROR", __func__); return NO_ERROR; } @@ -1356,22 +1277,19 @@ int CameraHardwareSec::decodeInterleaveData(unsigned char *pInterleaveData, int yuv_size = 0; int i = 0; - - LOGV("CameraHardwareSec::decodeInterleaveData( %d,%d, %d, %d)", interleaveDataSize, - yuvWidth, yuvHeight, pJpegSize); LOGV("decodeInterleaveData Start~~~"); while (i < interleaveDataSize) { if ((*interleave_ptr == 0xFFFFFFFF) || (*interleave_ptr == 0x02FFFFFF) || (*interleave_ptr == 0xFF02FFFF)) { // Padding Data - LOGV("%d(%x) padding data\n", i, *interleave_ptr); +// LOGE("%d(%x) padding data\n", i, *interleave_ptr); interleave_ptr++; i += 4; } else if ((*interleave_ptr & 0xFFFF) == 0x05FF) { // Start-code of YUV Data - LOGV("%d(%x) yuv data\n", i, *interleave_ptr); +// LOGE("%d(%x) yuv data\n", i, *interleave_ptr); p = (unsigned char *)interleave_ptr; p += 2; i += 2; @@ -1395,7 +1313,7 @@ int CameraHardwareSec::decodeInterleaveData(unsigned char *pInterleaveData, } } else { // Extract JPEG Data - //LOGV("%d(%x) jpg data, jpeg_size = %d bytes\n", i, *interleave_ptr, jpeg_size); +// LOGE("%d(%x) jpg data, jpeg_size = %d bytes\n", i, *interleave_ptr, jpeg_size); if (pJpegData != NULL) { memcpy(jpeg_ptr, interleave_ptr, 4); jpeg_ptr += 4; @@ -1438,7 +1356,7 @@ status_t CameraHardwareSec::dump(int fd, const Vector<String16>& args) const mSecCamera->dump(fd, args); mParameters.dump(fd, args); mInternalParameters.dump(fd, args); - snprintf(buffer, 255, " preview frame(%d), size (%d), running(%s)\n", mCurrentPreviewFrame, mPreviewFrameSize, mPreviewRunning?"true": "false"); + snprintf(buffer, 255, " preview running(%s)\n", mPreviewRunning?"true": "false"); result.append(buffer); } else { result.append("No camera client yet.\n"); @@ -1547,9 +1465,7 @@ status_t CameraHardwareSec::setParameters(const CameraParameters& params) else if (!strcmp(new_str_picture_format, "uyv422i")) //Non-zero copy UYVY format new_picture_format = V4L2_PIX_FMT_UYVY; else if (!strcmp(new_str_picture_format, CameraParameters::PIXEL_FORMAT_JPEG)) -#ifdef JPEG_FROM_SENSOR new_picture_format = V4L2_PIX_FMT_YUYV; -#endif else if (!strcmp(new_str_picture_format, "yuv422p")) new_picture_format = V4L2_PIX_FMT_YUV422P; else @@ -1563,7 +1479,6 @@ status_t CameraHardwareSec::setParameters(const CameraParameters& params) } } -#ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION //JPEG image quality int new_jpeg_quality = params.getInt(CameraParameters::KEY_JPEG_QUALITY); LOGV("%s : new_jpeg_quality %d", __func__, new_jpeg_quality); @@ -1576,17 +1491,6 @@ status_t CameraHardwareSec::setParameters(const CameraParameters& params) mParameters.set(CameraParameters::KEY_JPEG_QUALITY, new_jpeg_quality); } } -#else - //JPEG image quality - int new_jpeg_quality = params.getInt(CameraParameters::KEY_JPEG_QUALITY); - LOGV("%s : new_jpeg_quality %d", __func__, new_jpeg_quality); - if (new_jpeg_quality < 0) { - LOGW("JPEG-image quality is not specified or is negative, defaulting to 100"); - new_jpeg_quality = 100; - mParameters.set(CameraParameters::KEY_JPEG_QUALITY, "100"); - } - mSecCamera->setJpegQuality(new_jpeg_quality); -#endif // JPEG thumbnail size int new_jpeg_thumbnail_width = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); @@ -1866,17 +1770,10 @@ status_t CameraHardwareSec::setParameters(const CameraParameters& params) } if (new_image_effect >= 0) { - if (mSecCamera->setImageEffect(new_image_effect) < 0) { LOGE("ERR(%s):Fail on mSecCamera->setImageEffect(effect(%d))", __func__, new_image_effect); ret = UNKNOWN_ERROR; } else { - - if (mSecCamera->stopPreview() < 0) { - LOGE("ERR(%s):Fail on mSecCamera->stopPreview", __func__); - ret = UNKNOWN_ERROR; - } - const char *old_image_effect_str = mParameters.get(CameraParameters::KEY_EFFECT); if (old_image_effect_str) { @@ -1886,15 +1783,7 @@ status_t CameraHardwareSec::setParameters(const CameraParameters& params) } mParameters.set(CameraParameters::KEY_EFFECT, new_image_effect_str); - - //sleep a bit to give the cam a chance to get ready - usleep(100000); - if (mSecCamera->startPreview() < 0) { - LOGE("ERR(%s):Fail on mSecCamera->startPreview", __func__); - ret = UNKNOWN_ERROR; - } } - } } @@ -2112,6 +2001,18 @@ status_t CameraHardwareSec::setParameters(const CameraParameters& params) } } LOGV("%s return ret = %d", __func__, ret); + + if (mSecCamera->stopPreview() < 0) { + LOGE("ERR(%s):Fail on mSecCamera->stopPreview", __func__); + ret = UNKNOWN_ERROR; + } + + //sleep a bit to give the cam a chance to get ready + usleep(100000); + if (mSecCamera->startPreview() < 0) { + LOGE("ERR(%s):Fail on mSecCamera->startPreview", __func__); + ret = UNKNOWN_ERROR; + } return ret; } @@ -2138,6 +2039,14 @@ void CameraHardwareSec::release() * for ourself to exit, which is a deadlock. */ if (mPreviewThread != NULL) { + /* this thread is normally already in it's threadLoop but blocked + * on the condition variable or running. signal it so it wakes + * up and can exit. + */ + mPreviewThread->requestExit(); + mExitPreviewThread = true; + mPreviewRunning = true; /* let it run so it can exit */ + mPreviewCondition.signal(); mPreviewThread->requestExitAndWait(); mPreviewThread.clear(); } @@ -2145,9 +2054,11 @@ void CameraHardwareSec::release() /* this thread is normally already in it's threadLoop but blocked * on the condition variable. signal it so it wakes up and can exit. */ + mFocusLock.lock(); mAutoFocusThread->requestExit(); mExitAutoFocusThread = true; - mCondition.signal(); + mFocusCondition.signal(); + mFocusLock.unlock(); mAutoFocusThread->requestExitAndWait(); mAutoFocusThread.clear(); } @@ -2161,8 +2072,11 @@ void CameraHardwareSec::release() if (mJpegHeap != NULL) mJpegHeap.clear(); - if (mPreviewHeap != NULL) + if (mPreviewHeap != NULL) { + LOGI("%s: calling mPreviewHeap.dispose()", __func__); + mPreviewHeap->dispose(); mPreviewHeap.clear(); + } if (mRecordHeap != NULL) mRecordHeap.clear(); diff --git a/aries/libcamera/SecCameraHWInterface.h b/aries/libcamera/SecCameraHWInterface.h index 6f52ece..75526c6 100644 --- a/aries/libcamera/SecCameraHWInterface.h +++ b/aries/libcamera/SecCameraHWInterface.h @@ -80,21 +80,14 @@ private: CameraHardwareSec *mHardware; public: PreviewThread(CameraHardwareSec *hw): -#ifdef SINGLE_PROCESS - // In single process mode this thread needs to be a java thread, - // since we won't be calling through the binder. - Thread(true), -#else Thread(false), -#endif mHardware(hw) { } + virtual void onFirstRef() { + run("CameraPreviewThread", PRIORITY_URGENT_DISPLAY); + } virtual bool threadLoop() { - int ret = mHardware->previewThread(); - // loop until we need to quit - if(ret == NO_ERROR) - return true; - else - return false; + mHardware->previewThreadWrapper(); + return false; } }; @@ -106,6 +99,7 @@ private: mHardware(hw) { } virtual bool threadLoop() { mHardware->pictureThread(); + mHardware->mSecCamera->endSnapshot(); return false; } }; @@ -128,7 +122,7 @@ private: sp<PreviewThread> mPreviewThread; int previewThread(); - bool mPreviewRunning; + int previewThreadWrapper(); sp<AutoFocusThread> mAutoFocusThread; int autoFocusThread(); @@ -164,9 +158,16 @@ private: void setSkipFrame(int frame); /* used by auto focus thread to block until it's told to run */ mutable Mutex mFocusLock; - mutable Condition mCondition; + mutable Condition mFocusCondition; bool mExitAutoFocusThread; + /* used by preview thread to block until it's told to run */ + mutable Mutex mPreviewLock; + mutable Condition mPreviewCondition; + mutable Condition mPreviewStoppedCondition; + bool mPreviewRunning; + bool mExitPreviewThread; + /* used to guard threading state */ mutable Mutex mStateLock; @@ -181,9 +182,6 @@ private: sp<MemoryBase> mRecordBuffers[kBufferCountForRecord]; SecCamera *mSecCamera; - int mPreviewFrameSize; - int mRawFrameSize; - int mPreviewFrameRateMicrosec; const __u8 *mCameraSensorName; mutable Mutex mSkipFrameLock; @@ -202,20 +200,11 @@ private: int32_t mMsgEnabled; - // only used from PreviewThread - int mCurrentPreviewFrame; - int mCurrentRecordFrame; - bool mRecordRunning; -#ifdef JPEG_FROM_SENSOR + mutable Mutex mRecordLock; int mPostViewWidth; int mPostViewHeight; int mPostViewSize; -#endif - - struct timeval mTimeStart; - struct timeval mTimeStop; - }; }; // namespace android |