Add new internal APIs for dispose callback 28/274428/4
authorJeongmo Yang <jm80.yang@samsung.com>
Thu, 28 Apr 2022 07:34:28 +0000 (16:34 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Fri, 29 Apr 2022 06:15:19 +0000 (15:15 +0900)
- 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 <jm80.yang@samsung.com>
include/media_packet_internal.h
include/media_packet_private.h
packaging/capi-media-tool.spec
src/media_packet.c
src/media_packet_internal.c
test/media_packet_test.c

index c8adab47b54eb678d35a581e28589db3428b7fd6..0aa995d9e5571caa72150def9e8101c55a44446e 100644 (file)
@@ -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__ */
index 8d59a46bc1a04910d22f8b8308fc61214b4047a1..489b7c5fd7b8dec825b5879dc373d0e9266c2d47 100644 (file)
@@ -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
index 6cf44bee3525955278c6801deaaba81a75d83c35..95f802662f5c7bb8a1e172df3fce21978d358cca 100644 (file)
@@ -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
index bee5e0eba598b42078bc4f4efd17e3312bc3645e..40c91a2c47b166bb64cfc7f34da0e3c1f93ba5ed 100644 (file)
@@ -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
index ece7e4e6f5f07162e820e5cbe6089fb2d81c94f7..364a7830ecfff570af3019b2f6ed5dc8609e0fb6 100644 (file)
@@ -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;
+}
index 4b2b51f3cb7e23942816e7a683a9edfae200ab77..f3b8031462c015b4ea01973e5f834736cde101ac 100644 (file)
@@ -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");
 }