Add extra preview for test 52/257552/5
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 27 Apr 2021 12:50:36 +0000 (21:50 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Thu, 29 Apr 2021 06:17:22 +0000 (15:17 +0900)
- It could be enabled with mmfw_camcorder.ini
 : SupportExtraPreview in [VideoInput]

[Version] 0.1.1
[Issue Type] New feature

Change-Id: Id0ee278c043b8fb7b099a789554945bbac0b7d51
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
packaging/camera-hal-v4l2.spec
src/hal_camera_v4l2.c
src/hal_camera_v4l2_private.h

index aa01d0f..f52c565 100644 (file)
@@ -1,7 +1,7 @@
 Name:       camera-hal-v4l2
 Summary:    Tizen Camera Hal for V4L2
-Version:    0.1.0
-Release:    1
+Version:    0.1.1
+Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
 Source0:    %{name}-%{version}.tar.gz
index e82d995..6738f85 100644 (file)
@@ -952,6 +952,17 @@ static void *__camera_buffer_handler_func(gpointer data)
                        camera_v4l2_release_preview_buffer((void *)handle, index);
                }
 
+               g_mutex_lock(&handle->extra_preview_lock);
+
+               if (handle->extra_preview_cb) {
+                       handle->extra_preview_cb(&handle->camera_buffers[index], NULL, 0, handle->extra_preview_cb_data);
+                       handle->extra_preview_cb(&handle->camera_buffers[index], NULL, 1, handle->extra_preview_cb_data);
+                       handle->extra_preview_cb(&handle->camera_buffers[index], NULL, 2, handle->extra_preview_cb_data);
+                       handle->extra_preview_cb(&handle->camera_buffers[index], NULL, 3, handle->extra_preview_cb_data);
+               }
+
+               g_mutex_unlock(&handle->extra_preview_lock);
+
                /* check capture request flag */
                if (handle->capture_request) {
                        __camera_do_capture(handle);
@@ -1064,6 +1075,7 @@ static void __camera_release_handle(hal_camera_handle *handle)
        g_mutex_clear(&handle->lock);
        g_mutex_clear(&handle->buffer_lock);
        g_mutex_clear(&handle->msg_cb_lock);
+       g_mutex_clear(&handle->extra_preview_lock);
        g_cond_clear(&handle->buffer_cond);
        g_cond_clear(&handle->msg_cb_cond);
 
@@ -1111,6 +1123,7 @@ int camera_v4l2_init(void **camera_handle)
        g_mutex_init(&new_handle->lock);
        g_mutex_init(&new_handle->buffer_lock);
        g_mutex_init(&new_handle->msg_cb_lock);
+       g_mutex_init(&new_handle->extra_preview_lock);
        g_cond_init(&new_handle->buffer_cond);
        g_cond_init(&new_handle->msg_cb_cond);
 
@@ -1876,6 +1889,65 @@ int camera_v4l2_stop_record(void *camera_handle)
 }
 
 
+int camera_v4l2_set_extra_preview_frame_cb(void *camera_handle, hal_camera_extra_preview_frame_cb callback, void *user_data)
+{
+       hal_camera_handle *handle = (hal_camera_handle *)camera_handle;
+
+       if (!handle) {
+               LOGE("NULL handle");
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       g_mutex_lock(&handle->extra_preview_lock);
+
+       handle->extra_preview_cb = callback;
+       handle->extra_preview_cb_data = user_data;
+
+       g_mutex_unlock(&handle->extra_preview_lock);
+
+       LOGI("done");
+
+       return CAMERA_ERROR_NONE;
+}
+
+
+int camera_v4l2_unset_extra_preview_frame_cb(void *camera_handle)
+{
+       hal_camera_handle *handle = (hal_camera_handle *)camera_handle;
+
+       if (!handle) {
+               LOGE("NULL handle");
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       g_mutex_lock(&handle->extra_preview_lock);
+
+       handle->extra_preview_cb = NULL;
+       handle->extra_preview_cb_data = NULL;
+
+       g_mutex_unlock(&handle->extra_preview_lock);
+
+       LOGI("done");
+
+       return CAMERA_ERROR_NONE;
+}
+
+
+int camera_v4l2_release_extra_preview_buffer(void *camera_handle, int stream_id, int buffer_index)
+{
+       hal_camera_handle *handle = (hal_camera_handle *)camera_handle;
+
+       if (!handle) {
+               LOGE("NULL handle");
+               return CAMERA_ERROR_INVALID_PARAMETER;
+       }
+
+       LOGI("done - stream_id[%d], index[%d]", stream_id, buffer_index);
+
+       return CAMERA_ERROR_NONE;
+}
+
+
 int camera_v4l2_set_command(void *camera_handle, int64_t command, void *value)
 {
        int ret = CAMERA_ERROR_NONE;
@@ -2104,6 +2176,9 @@ static int camera_v4l2_backend_init(void **data)
        funcs->set_command = camera_v4l2_set_command;
        funcs->get_command = camera_v4l2_get_command;
        funcs->set_batch_command = camera_v4l2_set_batch_command;
+       funcs->set_extra_preview_frame_cb = camera_v4l2_set_extra_preview_frame_cb;
+       funcs->unset_extra_preview_frame_cb = camera_v4l2_unset_extra_preview_frame_cb;
+       funcs->release_extra_preview_buffer = camera_v4l2_release_extra_preview_buffer;
 
        *data = (void *)funcs;
 
index b6eb18a..d4e6397 100644 (file)
@@ -54,6 +54,9 @@ typedef struct _camera_hal_handle {
        camera_format_s preview_format;
        hal_camera_preview_frame_cb preview_cb;
        gpointer preview_cb_data;
+       hal_camera_extra_preview_frame_cb extra_preview_cb;
+       gpointer extra_preview_cb_data;
+       GMutex extra_preview_lock;
 
        /* capture */
        hal_camera_capture_cb capture_cb;