From 6ae9fdf827e93f1843c846f7daa5e23831d6fc19 Mon Sep 17 00:00:00 2001 From: Paul Kocialkowski Date: Tue, 1 Jul 2014 18:40:54 +0200 Subject: camera: Handle preview size or format change Signed-off-by: Paul Kocialkowski --- camera/smdk4x12_camera.c | 53 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 17 deletions(-) (limited to 'camera/smdk4x12_camera.c') diff --git a/camera/smdk4x12_camera.c b/camera/smdk4x12_camera.c index 19aacdf..8cb5cea 100644 --- a/camera/smdk4x12_camera.c +++ b/camera/smdk4x12_camera.c @@ -2278,6 +2278,12 @@ int smdk4x12_camera_preview_callback(struct smdk4x12_camera *smdk4x12_camera, return 0; } + if (smdk4x12_camera->preview_listener->width != smdk4x12_camera->preview_width || smdk4x12_camera->preview_listener->height != smdk4x12_camera->preview_height || smdk4x12_camera->preview_listener->format != smdk4x12_camera->preview_format) { + ALOGD("%s: Waiting for preview listener update", __func__); + pthread_mutex_unlock(&smdk4x12_camera->preview_lock_mutex); + return 0; + } + smdk4x12_camera->preview_listener->busy = 1; width = smdk4x12_camera->preview_width; @@ -2450,6 +2456,8 @@ complete: void *smdk4x12_camera_preview_thread(void *data) { struct smdk4x12_camera *smdk4x12_camera; + struct smdk4x12_camera_capture_listener *listener; + int gralloc_format; int rc; if (data == NULL) @@ -2479,6 +2487,33 @@ void *smdk4x12_camera_preview_thread(void *data) } } + if (smdk4x12_camera->preview_listener->width != smdk4x12_camera->preview_width || smdk4x12_camera->preview_listener->height != smdk4x12_camera->preview_height || smdk4x12_camera->preview_listener->format != smdk4x12_camera->preview_format) { + if (smdk4x12_camera->preview_output_enabled) + smdk4x12_camera_preview_output_stop(smdk4x12_camera); + + smdk4x12_camera_capture_listener_unregister(smdk4x12_camera, smdk4x12_camera->preview_listener); + + smdk4x12_camera->preview_listener = NULL; + + listener = smdk4x12_camera_capture_listener_register(smdk4x12_camera, smdk4x12_camera->preview_width, smdk4x12_camera->preview_height, smdk4x12_camera->preview_format, smdk4x12_camera_preview_callback); + if (listener == NULL) { + ALOGE("%s: Unable to register preview capture listener", __func__); + pthread_mutex_unlock(&smdk4x12_camera->preview_mutex); + break; + } + + smdk4x12_camera->preview_listener = listener; + + gralloc_format = smdk4x12_gralloc_format(smdk4x12_camera->preview_format); + + rc = smdk4x12_camera->preview_window->set_buffers_geometry(smdk4x12_camera->preview_window, smdk4x12_camera->preview_width, smdk4x12_camera->preview_height, gralloc_format); + if (rc) { + ALOGE("%s: Unable to set buffers geometry", __func__); + pthread_mutex_unlock(&smdk4x12_camera->preview_mutex); + break; + } + } + pthread_mutex_unlock(&smdk4x12_camera->preview_mutex); } @@ -3933,23 +3968,7 @@ int smdk4x12_camera_set_preview_window(struct camera_device *device, height = smdk4x12_camera->preview_height; format = smdk4x12_camera->preview_format; - switch (format) { - case V4L2_PIX_FMT_NV21: - gralloc_format = HAL_PIXEL_FORMAT_YCrCb_420_SP; - break; - case V4L2_PIX_FMT_YUV420: - gralloc_format = HAL_PIXEL_FORMAT_YV12; - break; - case V4L2_PIX_FMT_RGB565: - gralloc_format = HAL_PIXEL_FORMAT_RGB_565; - break; - case V4L2_PIX_FMT_RGB32: - gralloc_format = HAL_PIXEL_FORMAT_RGBX_8888; - break; - default: - gralloc_format = HAL_PIXEL_FORMAT_YCrCb_420_SP; - break; - } + gralloc_format = smdk4x12_gralloc_format(format); rc = w->set_buffers_geometry(w, width, height, gralloc_format); if (rc) { -- cgit v1.1