fix svace issue
[platform/core/multimedia/libmm-evas-renderer.git] / src / mm_evas_renderer.c
index 827404c..a62fa61 100644 (file)
@@ -375,12 +375,16 @@ 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 +504,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 +552,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 +724,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;
@@ -915,9 +931,8 @@ static int _mm_evas_renderer_make_flush_buffer(mm_evas_info *evas_info)
        tbm_bo src_bo = NULL;
        tbm_surface_h src_tbm_surf = NULL;
        int src_size = 0;
-       int size = 0;
        tbm_bo bo = NULL;
-       tbm_format tbm_fmt;
+       tbm_surface_info_s info = {0};
        tbm_bo_handle vaddr_src = {0};
        tbm_bo_handle vaddr_dst = {0};
        int ret = MM_ERROR_NONE;
@@ -940,16 +955,17 @@ static int _mm_evas_renderer_make_flush_buffer(mm_evas_info *evas_info)
        }
 
        /* get src buffer info */
-       tbm_fmt = tbm_surface_get_format(src_tbm_surf);
        src_bo = tbm_surface_internal_get_bo(src_tbm_surf, 0);
-       src_size = tbm_bo_size(src_bo);
+       src_size = tbm_surface_internal_get_size(src_tbm_surf);
        if (!src_bo || !src_size) {
-               LOGE("bo(%p), size(%d)", src_bo, src_size);
+               LOGE("src bo(%p), size(%d)", src_bo, src_size);
                goto ERROR;
        }
+       LOGD("src bo(%p), size(%d)", src_bo, src_size);
 
        /* create tbm surface */
-       flush_buffer->tbm_surf = tbm_surface_create(evas_info->w, evas_info->h, tbm_fmt);
+       info.format = tbm_surface_get_format(src_tbm_surf);
+       flush_buffer->tbm_surf = tbm_surface_create(evas_info->w, evas_info->h, info.format);
        if (!flush_buffer->tbm_surf) {
                LOGE("tbm_surf is NULL!!");
                goto ERROR;
@@ -957,11 +973,16 @@ static int _mm_evas_renderer_make_flush_buffer(mm_evas_info *evas_info)
 
        /* get bo and size */
        bo = tbm_surface_internal_get_bo(flush_buffer->tbm_surf, 0);
-       size = tbm_bo_size(bo);
-       if (!bo || !size) {
-               LOGE("bo(%p), size(%d)", bo, size);
+       info.size = tbm_surface_internal_get_size(flush_buffer->tbm_surf);
+       if (!bo || !info.size) {
+               LOGE("dst bo(%p), size(%d)", bo, info.size);
                goto ERROR;
        }
+       LOGD("dst bo(%p), size(%d)", bo, info.size);
+
+       /* FIXME: each plane should be copied */
+       info.num_planes = tbm_surface_internal_get_num_planes(info.format);
+
        flush_buffer->bo = bo;
 
        vaddr_src = tbm_bo_map(src_bo, TBM_DEVICE_CPU, TBM_OPTION_READ|TBM_OPTION_WRITE);
@@ -974,7 +995,7 @@ static int _mm_evas_renderer_make_flush_buffer(mm_evas_info *evas_info)
                        tbm_bo_unmap(bo);
                goto ERROR;
        } else {
-               memset(vaddr_dst.ptr, 0x0, size);
+               memset(vaddr_dst.ptr, 0x0, info.size);
                LOGW("tbm_bo_map(vaddr) is finished, bo(%p), vaddr(%p)", bo, vaddr_dst.ptr);
        }
 
@@ -983,7 +1004,7 @@ static int _mm_evas_renderer_make_flush_buffer(mm_evas_info *evas_info)
 
        tbm_bo_unmap(src_bo);
        tbm_bo_unmap(bo);
-       LOGW("copy is done. tbm surface : %p src_size : %d", flush_buffer->tbm_surf, src_size);
+       LOGW("copy is done. tbm surface : %p", flush_buffer->tbm_surf);
 
        evas_info->flush_buffer = flush_buffer;
 
@@ -1126,9 +1147,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 && 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 +1617,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;
+}