From d11af6b2a2629191a49da6df91614cba91ed91e6 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Thu, 28 Apr 2022 16:34:28 +0900 Subject: [PATCH] Add new internal APIs for dispose callback - Added APIs : int media_packet_add_dispose_cb(media_packet_h packet, media_packet_dispose_cb dcb, void *dcb_data, int *id); : int media_packet_remove_dispose_cb(media_packet_h packet, int id); [Version] 0.1.51 [Issue Type] New feature Change-Id: I68f9f1de837a98ea8fea7af25151f7dc69c26f9f Signed-off-by: Jeongmo Yang --- include/media_packet_internal.h | 38 ++++++++++++++++++--- include/media_packet_private.h | 17 ++++++++-- packaging/capi-media-tool.spec | 4 +-- src/media_packet.c | 14 ++++++++ src/media_packet_internal.c | 59 +++++++++++++++++++++++++++++++++ test/media_packet_test.c | 2 +- 6 files changed, 125 insertions(+), 9 deletions(-) diff --git a/include/media_packet_internal.h b/include/media_packet_internal.h index c8adab4..0aa995d 100644 --- a/include/media_packet_internal.h +++ b/include/media_packet_internal.h @@ -29,7 +29,7 @@ extern "C" { */ /** - * @addtogroup CAPI_MEDIA_TOOL_MODULE + * @addtogroup CAPI_MEDIA_TOOL_INTERNAL_MODULE * @{ */ @@ -51,6 +51,7 @@ extern "C" { int media_packet_set_codec_data(media_packet_h packet, void *codec_data, unsigned int codec_data_size); /** + * @internal * @brief Reset media_buffer_flags_e of media packet * @details It will clear all flags of media packet * @since_tizen 3.0 @@ -59,11 +60,11 @@ int media_packet_set_codec_data(media_packet_h packet, void *codec_data, unsigne * otherwise a negative error value * @retval #MEDIA_PACKET_ERROR_NONE Successful * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter - * */ int media_packet_reset_flags(media_packet_h packet); /** + * @internal * @brief Gets allocated buffer size of media packet. * @since_tizen 3.0 * @param[in] packet The media packet handle @@ -72,9 +73,38 @@ int media_packet_reset_flags(media_packet_h packet); * otherwise a negative error value * @retval #MEDIA_PACKET_ERROR_NONE Successful * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter - * */ int media_packet_get_allocated_buffer_size(media_packet_h packet, int *size); + +/** + * @internal + * @brief Adds a callback function to be invoked when the media packet is disposed. + * @since_tizen 7.0 + * @param[in] packet The media packet handle + * @param[in] dcb The media_packet_dispose_cb() to add + * @param[in] dcb_data The user data to be passed to the media_packet_dispose_cb() function + * @param[out] id The callback id + * @return @c 0 on success, + * otherwise a negative error value + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + */ +int media_packet_add_dispose_cb(media_packet_h packet, media_packet_dispose_cb dcb, void *dcb_data, int *id); + +/** + * @internal + * @brief Removes ths media packet dispose callback. + * @since_tizen 7.0 + * @param[in] packet The media packet handle + * @param[in] id The id of the callback to remove + * @return @c 0 on success, + * otherwise a negative error value + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + */ +int media_packet_remove_dispose_cb(media_packet_h packet, int id); + /** * @} */ @@ -83,4 +113,4 @@ int media_packet_get_allocated_buffer_size(media_packet_h packet, int *size); } #endif -#endif /* __TIZEN_MEDIA_PACKET_INTERNAL_H__ */ +#endif /* __TIZEN_MEDIA_PACKET_INTERNAL_H__ */ diff --git a/include/media_packet_private.h b/include/media_packet_private.h index 8d59a46..489b7c5 100644 --- a/include/media_packet_private.h +++ b/include/media_packet_private.h @@ -116,6 +116,10 @@ do { \ */ #define MEDIA_PACKET_CAST(obj) ((media_packet_s*)(obj)) + +#define DISPOSE_CALLBACK_MAX 5 + + typedef enum { MEDIA_BUFFER_TYPE_TBM_SURFACE, MEDIA_BUFFER_TYPE_EXTERNAL_TBM_SURFACE, @@ -123,6 +127,12 @@ typedef enum { MEDIA_BUFFER_TYPE_EXTERNAL_MEMORY, } media_buffer_type_e; +typedef struct _media_packet_dispose_cbs { + media_packet_dispose_cb cb[DISPOSE_CALLBACK_MAX]; /* dispose callback from media_packet_add_dispose_cb() */ + void *userdata[DISPOSE_CALLBACK_MAX]; + GMutex lock; +} media_packet_dispose_cbs_s; + typedef struct _media_packet_s { uint64_t pts; uint64_t dts; @@ -130,8 +140,8 @@ typedef struct _media_packet_s { size_t size; void *data; void *surface_data; - media_packet_finalize_cb finalize_cb; - media_packet_dispose_cb dispose_cb; + media_packet_finalize_cb finalize_cb; /* finalize callback from media_packet_create() */ + media_packet_dispose_cb dispose_cb; /* dispose callback from media_packet_new() */ void *userdata; bool is_allocated; bool using_pool; @@ -148,6 +158,9 @@ typedef struct _media_packet_s { int ref_count; GMutex ref_lock; bool is_from_new; + + /* internal dispose callback */ + media_packet_dispose_cbs_s dispose_cbs; } media_packet_s; #ifdef __cplusplus diff --git a/packaging/capi-media-tool.spec b/packaging/capi-media-tool.spec index 6cf44be..95f8026 100644 --- a/packaging/capi-media-tool.spec +++ b/packaging/capi-media-tool.spec @@ -1,7 +1,7 @@ Name: capi-media-tool Summary: A Core API media tool library in Tizen Native API -Version: 0.1.50 -Release: 1 +Version: 0.1.51 +Release: 0 Group: Multimedia/API License: Apache-2.0 Source0: %{name}-%{version}.tar.gz diff --git a/src/media_packet.c b/src/media_packet.c index bee5e0e..40c91a2 100644 --- a/src/media_packet.c +++ b/src/media_packet.c @@ -64,6 +64,7 @@ static int __pkt_init(media_buffer_type_e type, media_format_h fmt, } g_mutex_init(&new_handle->ref_lock); + g_mutex_init(&new_handle->dispose_cbs.lock); new_handle->ref_count = 1; new_handle->type = type; @@ -96,6 +97,7 @@ static void __pkt_deinit(media_packet_s *handle) media_format_unref(handle->format); handle->format = NULL; g_mutex_clear(&handle->ref_lock); + g_mutex_clear(&handle->dispose_cbs.lock); memset(handle, 0x0, sizeof(media_packet_s)); @@ -199,6 +201,7 @@ static int __pkt_create_from_external_memory(media_format_h fmt, void *mem_ptr, static int __pkt_destroy(media_packet_s *handle) { + int i = 0; int ret = MEDIA_PACKET_ERROR_NONE; media_packet_finalize_cb_ret_t finalize_ret = MEDIA_PACKET_FINALIZE; bool release_handle = false; @@ -237,6 +240,17 @@ static int __pkt_destroy(media_packet_s *handle) } } + g_mutex_lock(&handle->dispose_cbs.lock); + + for (i = 0 ; i < DISPOSE_CALLBACK_MAX ; i++) { + if (handle->dispose_cbs.cb[i]) { + LOGD("call dispose cb[%p,i:%d]", handle->dispose_cbs.cb[i], i); + handle->dispose_cbs.cb[i]((media_packet_h)handle, handle->dispose_cbs.userdata[i]); + } + } + + g_mutex_unlock(&handle->dispose_cbs.lock); + ret = __pkt_dealloc_buffer(handle); if (ret != MEDIA_PACKET_ERROR_NONE) LOGW("failed __pkt_dealloc_buffer()[0x%x]", ret); //LCOV_EXCL_LINE diff --git a/src/media_packet_internal.c b/src/media_packet_internal.c index ece7e4e..364a783 100644 --- a/src/media_packet_internal.c +++ b/src/media_packet_internal.c @@ -71,3 +71,62 @@ int media_packet_get_allocated_buffer_size(media_packet_h packet, int *size) return MEDIA_PACKET_ERROR_NONE; } + +int media_packet_add_dispose_cb(media_packet_h packet, media_packet_dispose_cb dcb, void *dcb_data, int *id) +{ + int i = 0; + media_packet_s *handle = (media_packet_s *)packet; + g_autoptr(GMutexLocker) locker = NULL; + + MEDIA_PACKET_INSTANCE_CHECK(handle); + MEDIA_PACKET_NULL_ARG_CHECK(dcb); + MEDIA_PACKET_NULL_ARG_CHECK(id); + + locker = g_mutex_locker_new(&handle->dispose_cbs.lock); + + for (i = 0 ; i < DISPOSE_CALLBACK_MAX ; i++) { + if (handle->dispose_cbs.cb[i] == NULL) { + LOGI("add dispose cb[%p,%p,id:%d]", dcb, dcb_data, i); + + handle->dispose_cbs.cb[i] = dcb; + handle->dispose_cbs.userdata[i] = dcb_data; + *id = i; + + return MEDIA_PACKET_ERROR_NONE; + } + } + + LOGE("no empty slot for new callback"); + + return MEDIA_PACKET_ERROR_INVALID_OPERATION; +} + +int media_packet_remove_dispose_cb(media_packet_h packet, int id) +{ + media_packet_s *handle = (media_packet_s *)packet; + g_autoptr(GMutexLocker) locker = NULL; + + MEDIA_PACKET_INSTANCE_CHECK(handle); + + if (id < 0 || id >= DISPOSE_CALLBACK_MAX) { + LOGE("invalid id[%d]", id); + return MEDIA_PACKET_ERROR_INVALID_PARAMETER; + } + + locker = g_mutex_locker_new(&handle->dispose_cbs.lock); + + if (!handle->dispose_cbs.cb[id]) { + LOGE("no callback for id[%d]", id); + return MEDIA_PACKET_ERROR_INVALID_PARAMETER; + } + + LOGI("remove dispose cb[%p,%p,id:%d]", + handle->dispose_cbs.cb[id], + handle->dispose_cbs.userdata[id], + id); + + handle->dispose_cbs.cb[id] = NULL; + handle->dispose_cbs.userdata[id] = NULL; + + return MEDIA_PACKET_ERROR_NONE; +} diff --git a/test/media_packet_test.c b/test/media_packet_test.c index 4b2b51f..f3b8031 100644 --- a/test/media_packet_test.c +++ b/test/media_packet_test.c @@ -347,7 +347,7 @@ static void _create_format_raw(void) } -static int _dispose_callback(media_packet_h packet, void *userdata) +static void _dispose_callback(media_packet_h packet, void *userdata) { g_print("==> dispose callback func is called\n"); } -- 2.34.1