*/
/**
- * @addtogroup CAPI_MEDIA_TOOL_MODULE
+ * @addtogroup CAPI_MEDIA_TOOL_INTERNAL_MODULE
* @{
*/
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
* 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
* 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);
+
/**
* @}
*/
}
#endif
-#endif /* __TIZEN_MEDIA_PACKET_INTERNAL_H__ */
+#endif /* __TIZEN_MEDIA_PACKET_INTERNAL_H__ */
*/
#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,
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;
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;
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
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
}
g_mutex_init(&new_handle->ref_lock);
+ g_mutex_init(&new_handle->dispose_cbs.lock);
new_handle->ref_count = 1;
new_handle->type = type;
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));
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;
}
}
+ 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
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;
+}
}
-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");
}