From 85c66d1a5a36d013c31fd658e9913fd9a8ee1f44 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Tue, 27 Apr 2021 16:32:14 +0900 Subject: [PATCH] Add new interface for extra preview frame [Version] 0.0.5 [Issue Type] New feature Change-Id: Ifabbadf9bae9d9d9351adcd57b1698a9deb06781 Signed-off-by: Jeongmo Yang --- include/hal-camera-interface.h | 20 ++++++++- include/hal-camera.h | 43 ++++++++++++++++++ packaging/hal-api-camera.spec | 2 +- src/hal-api-camera.c | 36 ++++++++++++++++ tests/camera_hal_test.cpp | 79 +++++++++++++++++++++++++++++++++- 5 files changed, 176 insertions(+), 4 deletions(-) diff --git a/include/hal-camera-interface.h b/include/hal-camera-interface.h index 4015cf6..32201ba 100644 --- a/include/hal-camera-interface.h +++ b/include/hal-camera-interface.h @@ -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; /** diff --git a/include/hal-camera.h b/include/hal-camera.h index b7c26ae..c822a81 100644 --- a/include/hal-camera.h +++ b/include/hal-camera.h @@ -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 diff --git a/packaging/hal-api-camera.spec b/packaging/hal-api-camera.spec index eee5d06..03c9734 100644 --- a/packaging/hal-api-camera.spec +++ b/packaging/hal-api-camera.spec @@ -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 diff --git a/src/hal-api-camera.c b/src/hal-api-camera.c index 2ae417e..55c4061 100644 --- a/src/hal-api-camera.c +++ b/src/hal-api-camera.c @@ -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; diff --git a/tests/camera_hal_test.cpp b/tests/camera_hal_test.cpp index b07c226..12e386d 100644 --- a/tests/camera_hal_test.cpp +++ b/tests/camera_hal_test.cpp @@ -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) { -- 2.34.1