diff options
Diffstat (limited to 'camera/exynos_camera.c')
-rw-r--r-- | camera/exynos_camera.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/camera/exynos_camera.c b/camera/exynos_camera.c index 5e20ab3..781271c 100644 --- a/camera/exynos_camera.c +++ b/camera/exynos_camera.c @@ -2575,6 +2575,7 @@ int exynos_camera_picture_callback(struct exynos_camera *exynos_camera, struct exynos_camera_buffer *yuv_thumbnail_buffer = NULL; int width, height; int thumbnail_width, thumbnail_height; + time_t timestamp; int rc; int i; @@ -2602,12 +2603,32 @@ int exynos_camera_picture_callback(struct exynos_camera *exynos_camera, pthread_mutex_lock(&exynos_camera->picture_mutex); if (!exynos_camera->picture_enabled && !exynos_camera->camera_fimc_is) { - if (exynos_camera->camera_capture_format == V4L2_PIX_FMT_INTERLEAVED && exynos_camera->zoom == 0 && exynos_camera->focus_mode == FOCUS_MODE_CONTINOUS_PICTURE && exynos_camera->capture_auto_focus_result == CAMERA_AF_STATUS_IN_PROGRESS) { - LOGD("%s: Not asking for picture until auto focus is done", __func__); - pthread_mutex_unlock(&exynos_camera->picture_mutex); - return 0; + if (exynos_camera->camera_capture_format == V4L2_PIX_FMT_INTERLEAVED && exynos_camera->zoom == 0 && exynos_camera->focus_mode == FOCUS_MODE_CONTINOUS_PICTURE) { + if (exynos_camera->capture_auto_focus_result == CAMERA_AF_STATUS_FAIL) { + // We don't want to take a picture out of focus, so wait a bit + timestamp = time(NULL); + + if (exynos_camera->picture_focus_timestamp > 0) { + if ((timestamp - exynos_camera->picture_focus_timestamp) > 2) { + LOGE("%s: Picture will be taken out of focus", __func__); + } else { + pthread_mutex_unlock(&exynos_camera->picture_mutex); + return 0; + } + } else { + exynos_camera->picture_focus_timestamp = timestamp; + pthread_mutex_unlock(&exynos_camera->picture_mutex); + return 0; + } + } else if (exynos_camera->capture_auto_focus_result == CAMERA_AF_STATUS_IN_PROGRESS) { + LOGD("%s: Not asking for picture until auto focus is done", __func__); + pthread_mutex_unlock(&exynos_camera->picture_mutex); + return 0; + } } + exynos_camera->picture_focus_timestamp = 0; + rc = exynos_v4l2_s_ctrl(exynos_camera, 0, V4L2_CID_CAMERA_CAPTURE, 0); if (rc < 0) { LOGE("%s: Unable to set capture", __func__); |