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;
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;
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;
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;
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;
}
/* 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;
/* 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);
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);
}
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;
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;
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;
+}