From: NAMJEONGYOON Date: Thu, 30 Jun 2016 07:09:23 +0000 (+0900) Subject: add callback so that user who created media_packet can destroy it X-Git-Tag: submit/tizen/20160720.084238~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F45%2F77545%2F5;p=platform%2Fcore%2Fmultimedia%2Flibmm-evas-renderer.git add callback so that user who created media_packet can destroy it Change-Id: I1e59ed33ee4898542afcdd2585c871cd4ed72b70 Signed-off-by: NAMJEONGYOON --- diff --git a/src/include/mm_evas_renderer.h b/src/include/mm_evas_renderer.h index 33bc4fd..179c9f3 100644 --- a/src/include/mm_evas_renderer.h +++ b/src/include/mm_evas_renderer.h @@ -87,6 +87,9 @@ typedef struct { tbm_surface_h tbm_surf; } flush_info; +/* notice to finish using media_packet*/ +typedef void (*mm_evas_renderer_media_packet_rendered_cb)(media_packet_h packet, void *user_data); + /* evas info for evas surface type */ typedef struct { Evas_Object *eo; @@ -123,6 +126,10 @@ typedef struct { flush_info *flush_buffer; gboolean retrieve_packet; /* after flush buffer is made by API, flush will be executed in main thread callback */ gboolean keep_screen; + + /* rendered callback */ + mm_evas_renderer_media_packet_rendered_cb packet_rendered_cb; + void *packet_rendered_cb_user; } mm_evas_info; /* create and initialize evas_info */ @@ -152,6 +159,9 @@ void mm_evas_renderer_write(media_packet_h packet, void *data); /* if user want to retrieve all packets, this API will be called */ /* if keep_screen is set to true, flush buffer will be made */ int mm_evas_renderer_retrieve_all_packets(MMHandleType handle, bool keep_screen); +/* notice to finish using media_packet */ +/* if you want to unset callback, set values to NULL */ +int mm_evas_renderer_set_packet_rendered_callback(MMHandleType handle, mm_evas_renderer_media_packet_rendered_cb callback, void *user_data); #ifdef __cplusplus } diff --git a/src/mm_evas_renderer.c b/src/mm_evas_renderer.c index 827404c..38c28a8 100644 --- a/src/mm_evas_renderer.c +++ b/src/mm_evas_renderer.c @@ -375,12 +375,17 @@ static void _free_previous_packets(mm_evas_info *evas_info) while (prev_idx != -1) { LOGD("destroy previous packet [%p] idx %d", evas_info->pkt_info[prev_idx].packet, prev_idx); - if (media_packet_destroy(evas_info->pkt_info[prev_idx].packet) != MEDIA_PACKET_ERROR_NONE) - LOGE("media_packet_destroy failed %p", evas_info->pkt_info[prev_idx].packet); + if (evas_info->packet_rendered_cb) { + evas_info->packet_rendered_cb(evas_info->pkt_info[prev_idx].packet, evas_info->packet_rendered_cb_user); + } else { + if (media_packet_destroy(evas_info->pkt_info[prev_idx].packet) != MEDIA_PACKET_ERROR_NONE) { + LOGE("media_packet_destroy failed %p", evas_info->pkt_info[prev_idx].packet); + } + } + evas_info->sent_buffer_cnt--; evas_info->pkt_info[prev_idx].packet = NULL; evas_info->pkt_info[prev_idx].tbm_surf = NULL; evas_info->pkt_info[index].prev = -1; - evas_info->sent_buffer_cnt--; /* move index to previous index */ index = prev_idx; @@ -500,12 +505,16 @@ static int _flush_packets(mm_evas_info *evas_info) for (i = 0; i < MAX_PACKET_NUM; i++) { if (evas_info->pkt_info[i].packet) { LOGD("destroy packet [%p]", evas_info->pkt_info[i].packet); - ret_mp = media_packet_destroy(evas_info->pkt_info[i].packet); - if (ret_mp != MEDIA_PACKET_ERROR_NONE) { - LOGW("media_packet_destroy failed %p", evas_info->pkt_info[i].packet); - ret = MM_ERROR_UNKNOWN; - } else - evas_info->sent_buffer_cnt--; + if (evas_info->packet_rendered_cb) { + evas_info->packet_rendered_cb(evas_info->pkt_info[i].packet, evas_info->packet_rendered_cb_user); + } else { + ret_mp = media_packet_destroy(evas_info->pkt_info[i].packet); + if (ret_mp != MEDIA_PACKET_ERROR_NONE) { + LOGW("media_packet_destroy failed %p", evas_info->pkt_info[i].packet); + ret = MM_ERROR_UNKNOWN; + } + } + evas_info->sent_buffer_cnt--; evas_info->pkt_info[i].packet = NULL; evas_info->pkt_info[i].tbm_surf = NULL; evas_info->pkt_info[i].prev = -1; @@ -544,12 +553,16 @@ int _reset_pipe(mm_evas_info *evas_info) if (evas_info->pkt_info[i].packet) { /* destroy all packets */ LOGD("destroy packet [%p]", evas_info->pkt_info[i].packet); - ret_mp = media_packet_destroy(evas_info->pkt_info[i].packet); - if (ret_mp != MEDIA_PACKET_ERROR_NONE) { - LOGW("media_packet_destroy failed %p", evas_info->pkt_info[i].packet); - ret = MM_ERROR_UNKNOWN; - } else - evas_info->sent_buffer_cnt--; + if (evas_info->packet_rendered_cb) { + evas_info->packet_rendered_cb(evas_info->pkt_info[i].packet, evas_info->packet_rendered_cb_user); + } else { + ret_mp = media_packet_destroy(evas_info->pkt_info[i].packet); + if (ret_mp != MEDIA_PACKET_ERROR_NONE) { + LOGW("media_packet_destroy failed %p", evas_info->pkt_info[i].packet); + ret = MM_ERROR_UNKNOWN; + } + } + evas_info->sent_buffer_cnt--; evas_info->pkt_info[i].packet = NULL; evas_info->pkt_info[i].tbm_surf = NULL; evas_info->pkt_info[i].prev = -1; @@ -712,12 +725,16 @@ static int _mm_evas_renderer_reset(mm_evas_info *evas_info) if (evas_info->pkt_info[i].packet) { /* destroy all packets */ LOGD("destroy packet [%p]", evas_info->pkt_info[i].packet); - ret_mp = media_packet_destroy(evas_info->pkt_info[i].packet); - if (ret_mp != MEDIA_PACKET_ERROR_NONE) { - LOGW("media_packet_destroy failed %p", evas_info->pkt_info[i].packet); - ret = MM_ERROR_UNKNOWN; - } else - evas_info->sent_buffer_cnt--; + if (evas_info->packet_rendered_cb) { + evas_info->packet_rendered_cb(evas_info->pkt_info[i].packet, evas_info->packet_rendered_cb_user); + } else { + ret_mp = media_packet_destroy(evas_info->pkt_info[i].packet); + if (ret_mp != MEDIA_PACKET_ERROR_NONE) { + LOGW("media_packet_destroy failed %p", evas_info->pkt_info[i].packet); + ret = MM_ERROR_UNKNOWN; + } + } + evas_info->sent_buffer_cnt--; evas_info->pkt_info[i].packet = NULL; evas_info->pkt_info[i].tbm_surf = NULL; evas_info->pkt_info[i].prev = -1; @@ -1126,9 +1143,13 @@ INVALID_PARAM: if (packet) { g_mutex_lock(&handle->mp_lock); LOGD("cant write. destroy packet [%p]", packet); - if (media_packet_destroy(packet) != MEDIA_PACKET_ERROR_NONE) - LOGE("media_packet_destroy failed %p", packet); - packet = NULL; + if (handle->packet_rendered_cb) { + handle->packet_rendered_cb(packet, handle->packet_rendered_cb_user); + } else { + if (media_packet_destroy(packet) != MEDIA_PACKET_ERROR_NONE) + LOGE("media_packet_destroy failed %p", packet); + packet = NULL; + } g_mutex_unlock(&handle->mp_lock); } return; @@ -1592,3 +1613,23 @@ int mm_evas_renderer_retrieve_all_packets(MMHandleType handle, bool keep_screen) return ret; } + +int mm_evas_renderer_set_packet_rendered_callback(MMHandleType handle, mm_evas_renderer_media_packet_rendered_cb callback, void *user_data) +{ + MMER_FENTER(); + + mm_evas_info *evas_info = (mm_evas_info*) handle; + + if (!evas_info) { + LOGW("skip it. it is not evas surface type or player is not prepared"); + return MM_ERROR_RESOURCE_NOT_INITIALIZED; + } + evas_info->packet_rendered_cb = callback; + evas_info->packet_rendered_cb_user = user_data; + + LOGW("set rendered callback %p, user_data %p", evas_info->packet_rendered_cb, evas_info->packet_rendered_cb_user); + + MMER_FLEAVE(); + + return MM_ERROR_NONE; +}