Add new interface for extra preview frame 26/255126/7
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 27 Apr 2021 07:32:14 +0000 (16:32 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Tue, 11 May 2021 05:59:54 +0000 (14:59 +0900)
[Version] 0.0.5
[Issue Type] New feature

Change-Id: Ifabbadf9bae9d9d9351adcd57b1698a9deb06781
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
include/hal-camera-interface.h
include/hal-camera.h
packaging/hal-api-camera.spec
src/hal-api-camera.c
tests/camera_hal_test.cpp

index 4015cf612a8c7bd23f4af957a23c53eff3c78f81..32201baf2203d981cab2e672aec7e15ed02b23ac 100644 (file)
@@ -533,7 +533,7 @@ typedef int (*hal_camera_message_cb)(camera_message_s *message, void *user_data)
 /**
  * @brief Callback function for captured preview frame from camera device.
  * @since_tizen 6.5
- * @param[in] buffer The preview buffer
+ * @param[in] buffer The preview frame
  * @param[in] meta The meta data for the preview frame
  * @param[in] user_data The user data for callback
  * @pre hal_camera_start_preview() will invoke this callback.
@@ -543,7 +543,20 @@ typedef int (*hal_camera_message_cb)(camera_message_s *message, void *user_data)
 typedef int (*hal_camera_preview_frame_cb)(camera_buffer_s *buffer, camera_metadata_s *meta, void *user_data);
 
 /**
- * @brief Callback function for captured video frame from camera device.
+ * @brief Callback function for extra preview frame from camera device.
+ * @since_tizen 6.5
+ * @param[in] buffer The extra preview frame
+ * @param[in] meta The meta data for the extra preview frame
+ * @param[in] stream_id The id of extra preview stream
+ * @param[in] user_data The user data for callback
+ * @pre hal_camera_start_preview() will invoke this callback.
+ * @see hal_camera_start_preview()
+ * @see hal_camera_stop_preview()
+ */
+typedef int (*hal_camera_extra_preview_frame_cb)(camera_buffer_s *buffer, camera_metadata_s *meta, int stream_id, void *user_data);
+
+/**
+ * @brief Callback function for captured video buffer from camera device.
  * @since_tizen 6.5
  * @param[in] buffer The video buffer
  * @param[in] meta The meta data for the video frame
@@ -599,6 +612,9 @@ typedef struct _hal_backend_media_camera_funcs {
        int (*set_command)(void *camera_handle, int64_t command, void *value);
        int (*get_command)(void *camera_handle, int64_t command, void **value);
        int (*set_batch_command)(void *camera_handle, camera_batch_command_control_s *batch_command, int64_t *error_command);
+       int (*set_extra_preview_frame_cb)(void *camera_handle, hal_camera_extra_preview_frame_cb callback, void *user_data);
+       int (*unset_extra_preview_frame_cb)(void *camera_handle);
+       int (*release_extra_preview_buffer)(void *camera_handle, int stream_id, int buffer_index);
 } hal_backend_camera_funcs;
 
 /**
index b7c26ae727184d63e627efde9974d4b0d5f271a3..c822a8174d9b0806dee3213d582e6c6d256db04f 100644 (file)
@@ -256,6 +256,49 @@ int hal_camera_release_preview_buffer(void *camera_handle, int buffer_index);
  */
 int hal_camera_stop_preview(void *camera_handle);
 
+/**
+ * @brief Sets a callback function to be called for extra preview frames.
+ * @since_tizen 6.5
+ * @param[in] camera_handle The handle to the camera HAL
+ * @param[in] callback The callback for extra preview frame
+ * @param[in] user_data The user data for callback
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #CAMERA_ERROR_NONE Successful
+ * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CAMERA_ERROR_INVALID_STATE Invalid state
+ * @retval #CAMERA_ERROR_INVALID_OPERATION Invalid operation
+ * @retval #CAMERA_ERROR_DEVICE_NOT_SUPPORTED Not supported
+ * @pre The camera state must be set to #CAMERA_STATE_OPENED.
+ */
+int hal_camera_set_extra_preview_frame_cb(void *camera_handle, hal_camera_extra_preview_frame_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback function.
+ * @since_tizen 6.5
+ * @param[in] camera_handle The handle to the camera HAL
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #CAMERA_ERROR_NONE Successful
+ * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @see camera_set_extra_preview_cb()
+ */
+int hal_camera_unset_extra_preview_frame_cb(void *camera_handle);
+
+/**
+ * @brief Release the extra preview buffer.
+ * @since_tizen 6.5
+ * @remarks The extra preview buffer should be released with this function after use it.
+ * @param[in] camera_handle The handle to the camera HAL
+ * @param[in] stream_id The id of extra preview stream
+ * @param[in] buffer_index The index of extra preview buffer
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #CAMERA_ERROR_NONE Successful
+ * @retval #CAMERA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #CAMERA_ERROR_INVALID_STATE Invalid state
+ * @retval #CAMERA_ERROR_INVALID_OPERATION Invalid operation
+ * @see hal_camera_set_extra_preview_frame_cb()
+ */
+int hal_camera_release_extra_preview_buffer(void *camera_handle, int stream_id, int buffer_index);
+
 /**
  * @brief Starts camera auto focusing operation.
  * @since_tizen 6.5
index eee5d063ac8c222ee9b0da0c1cf0202b0d3a013c..03c9734052bc94632ea78de75163cc37c84bb840 100644 (file)
@@ -4,7 +4,7 @@
 ### main package #########
 Name:       %{name}
 Summary:    %{name} interface
-Version:    0.0.4
+Version:    0.0.5
 Release:    0
 Group:      Development/Libraries
 License:    Apache-2.0
index 2ae417e762564a2c32b5d842f94fef13642ddc73..55c40610422cf89042bc0ad3c75c5c767bf52f81 100644 (file)
@@ -264,6 +264,42 @@ int hal_camera_stop_preview(void *camera_handle)
 }
 
 
+int hal_camera_set_extra_preview_frame_cb(void *camera_handle, hal_camera_extra_preview_frame_cb callback, void *user_data)
+{
+       hal_camera_s *handle = (hal_camera_s *)camera_handle;
+
+       HAL_CAMERA_RETURN_IF_FAILED(handle, CAMERA_ERROR_INVALID_PARAMETER);
+       HAL_CAMERA_RETURN_IF_FAILED(handle->funcs, CAMERA_ERROR_INVALID_PARAMETER);
+       HAL_CAMERA_RETURN_IF_FAILED(handle->funcs->set_extra_preview_frame_cb, CAMERA_ERROR_NOT_IMPLEMENTED);
+
+       return handle->funcs->set_extra_preview_frame_cb(handle->backend, callback, user_data);
+}
+
+
+int hal_camera_unset_extra_preview_frame_cb(void *camera_handle)
+{
+       hal_camera_s *handle = (hal_camera_s *)camera_handle;
+
+       HAL_CAMERA_RETURN_IF_FAILED(handle, CAMERA_ERROR_INVALID_PARAMETER);
+       HAL_CAMERA_RETURN_IF_FAILED(handle->funcs, CAMERA_ERROR_INVALID_PARAMETER);
+       HAL_CAMERA_RETURN_IF_FAILED(handle->funcs->unset_extra_preview_frame_cb, CAMERA_ERROR_NOT_IMPLEMENTED);
+
+       return handle->funcs->unset_extra_preview_frame_cb(handle->backend);
+}
+
+
+int hal_camera_release_extra_preview_buffer(void *camera_handle, int stream_id, int buffer_index)
+{
+       hal_camera_s *handle = (hal_camera_s *)camera_handle;
+
+       HAL_CAMERA_RETURN_IF_FAILED(handle, CAMERA_ERROR_INVALID_PARAMETER);
+       HAL_CAMERA_RETURN_IF_FAILED(handle->funcs, CAMERA_ERROR_INVALID_PARAMETER);
+       HAL_CAMERA_RETURN_IF_FAILED(handle->funcs->release_extra_preview_buffer, CAMERA_ERROR_NOT_IMPLEMENTED);
+
+       return handle->funcs->release_extra_preview_buffer(handle->backend, stream_id, buffer_index);
+}
+
+
 int hal_camera_start_auto_focus(void *camera_handle)
 {
        hal_camera_s *handle = (hal_camera_s *)camera_handle;
index b07c22603f046c34f137fdc56056c7ece2538a0a..12e386d3f6909cbdeb56789b00fea4fc35c6c1a0 100644 (file)
@@ -28,6 +28,7 @@ using namespace std;
 
 static int ret;
 static int g_ret_release_preview_buffer;
+static int g_ret_release_extra_preview_buffer;
 static int g_ret_release_video_buffer;
 static void *g_hal_handle;
 static camera_device_info_list_s g_device_info_list;
@@ -70,7 +71,30 @@ static int _PreviewCb(camera_buffer_s *buffer, camera_metadata_s *meta, void *us
 
        g_ret_release_preview_buffer = hal_camera_release_preview_buffer(hal_handle, buffer->index);
 
-       cout << "preview buffer index [" << buffer->index << "], ret " << g_ret_release_preview_buffer << endl;
+       cout << "preview [i:" << buffer->index << "], ret " << g_ret_release_preview_buffer << endl;
+
+       return 0;
+}
+
+static int _ExtraPreviewCb(camera_buffer_s *buffer, camera_metadata_s *meta, int stream_id, void *user_data)
+{
+       void *hal_handle = user_data;
+
+       if (!hal_handle) {
+               cout << "NULL handle" << endl;
+               return -1;
+       }
+
+       if (!buffer) {
+               cout << "NULL buffer" << endl;
+               return -1;
+       }
+
+       g_preview_check = true;
+
+       g_ret_release_extra_preview_buffer = hal_camera_release_extra_preview_buffer(hal_handle, stream_id, buffer->index);
+
+       cout << "extra preview[id:" << stream_id << ",i:" << buffer->index << "], ret " << g_ret_release_extra_preview_buffer << endl;
 
        return 0;
 }
@@ -1390,6 +1414,59 @@ TEST_F(CameraHalTest, ReleaseVideoBufferP)
        hal_camera_close_device(g_hal_handle);
 }
 
+/**
+ * @testcase           SetUnsetExtraPreviewCallbackP
+ * @since_tizen                6.5
+ * @author                     SR(jm80.yang)
+ * @reviewer           SR(haesu.gwon)
+ * @type                       auto
+ * @description                Positive, Set and unset extra preview callback to get extra preview frame
+ * @apicovered         hal_camera_open_device, hal_camera_set_preview_stream_format, hal_camera_start_preview, hal_camera_set_extra_preview_frame_cb, hal_camera_release_extra_preview_buffer, hal_camera_unset_extra_preview_frame_cb
+ * @passcase           when hal_camera_set_extra_preview_frame_cb, hal_camera_unset_extra_preview_frame_cb and hal_camera_release_extra_preview_buffer returns CAMERA_ERROR_NONE
+ * @failcase           when they do not return CAMERA_ERROR_NONE
+ * @precondition       None
+ * @postcondition      None
+ */
+TEST_F(CameraHalTest, SetUnsetExtraPreviewCallbackP)
+{
+       CAMERA_SUPPORT_CHECK;
+
+       ASSERT_NE(g_hal_handle, nullptr);
+       ASSERT_EQ(ret, CAMERA_ERROR_NONE);
+
+       ret = hal_camera_open_device(g_hal_handle, g_device_info_list.device_info[0].index);
+       ASSERT_EQ(ret, CAMERA_ERROR_NONE);
+
+       ret = hal_camera_set_preview_stream_format(g_hal_handle, &g_preview_format);
+       EXPECT_EQ(ret, CAMERA_ERROR_NONE);
+
+       ret = hal_camera_set_extra_preview_frame_cb(g_hal_handle, _ExtraPreviewCb, (void *)g_hal_handle);
+       if (ret == CAMERA_ERROR_DEVICE_NOT_SUPPORTED) {
+               cout << "hal_camera_set_extra_preview_frame_cb() is not supported" << endl;
+               hal_camera_close_device(g_hal_handle);
+               return;
+       }
+
+       ASSERT_EQ(ret, CAMERA_ERROR_NONE);
+
+       g_ret_release_extra_preview_buffer = CAMERA_ERROR_INTERNAL;
+
+       ret = hal_camera_start_preview(g_hal_handle, _PreviewCb, (void *)g_hal_handle);
+       EXPECT_EQ(ret, CAMERA_ERROR_NONE);
+
+       /* wait for extra preview frame */
+       sleep(1);
+
+       EXPECT_EQ(g_ret_release_extra_preview_buffer, CAMERA_ERROR_NONE);
+
+       hal_camera_stop_preview(g_hal_handle);
+
+       ret = hal_camera_unset_extra_preview_frame_cb(g_hal_handle);
+       EXPECT_EQ(ret, CAMERA_ERROR_NONE);
+
+       hal_camera_close_device(g_hal_handle);
+}
+
 
 int main(int argc, char **argv)
 {