add callback so that user who created media_packet can destroy it 45/77545/5
authorNAMJEONGYOON <just.nam@samsung.com>
Thu, 30 Jun 2016 07:09:23 +0000 (16:09 +0900)
committerNAMJEONGYOON <just.nam@samsung.com>
Fri, 1 Jul 2016 08:05:23 +0000 (17:05 +0900)
Change-Id: I1e59ed33ee4898542afcdd2585c871cd4ed72b70
Signed-off-by: NAMJEONGYOON <just.nam@samsung.com>
src/include/mm_evas_renderer.h
src/mm_evas_renderer.c

index 33bc4fd..179c9f3 100644 (file)
@@ -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
 }
index 827404c..38c28a8 100644 (file)
@@ -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;
+}