/**
* @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.
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
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;
/**
*/
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
### main package #########
Name: %{name}
Summary: %{name} interface
-Version: 0.0.4
+Version: 0.0.5
Release: 0
Group: Development/Libraries
License: Apache-2.0
}
+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;
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;
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;
}
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)
{