From 7242666f027744e4062dc36a61fe0f2d043ede8f Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Thu, 29 Sep 2016 13:34:56 +0900 Subject: [PATCH] [v0.3.25]resolve web TCT failure issue Change-Id: I387ff61ae8b73b9dd748d296aa6c2e614e0224bc --- include/player_private.h | 2 +- packaging/capi-media-player.spec | 2 +- src/player.c | 146 ++++++++++++++++++++++----------------- 3 files changed, 86 insertions(+), 64 deletions(-) diff --git a/include/player_private.h b/include/player_private.h index 24beb65..7aebbe8 100644 --- a/include/player_private.h +++ b/include/player_private.h @@ -106,7 +106,7 @@ typedef struct _callback_cb_info { media_format_h pkt_fmt; void *evas_info; tbm_bufmgr bufmgr; - tbm_fd tfd; + tbm_fd tfd; /* for player_get_album_art*/ GList *tsurf_list; /* player_tsurf_info_t */ int video_frame_pool_size; bool use_tsurf_pool; diff --git a/packaging/capi-media-player.spec b/packaging/capi-media-player.spec index 085457f..b7be8df 100644 --- a/packaging/capi-media-player.spec +++ b/packaging/capi-media-player.spec @@ -1,6 +1,6 @@ Name: capi-media-player Summary: A Media Player API -Version: 0.3.24 +Version: 0.3.25 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/player.c b/src/player.c index dfc8aae..1938623 100644 --- a/src/player.c +++ b/src/player.c @@ -48,9 +48,14 @@ #define INVALID_DEFAULT_VALUE -1 typedef struct { + tbm_fd tfd; + char* buffer; +} _player_recv_data; + +typedef struct { int int_data; - char *buf; callback_cb_info_s *cb_info; + _player_recv_data *recv_data; GMutex event_mutex; } _player_cb_data; @@ -288,13 +293,13 @@ static void _del_mem(player_cli_s * player) } } -static int player_recv_msg(callback_cb_info_s * cb_info) +static int player_recv_msg(callback_cb_info_s * cb_info, tbm_fd *tfd) { int recvLen = 0; msg_buff_s *buff = &cb_info->buff; memset(buff->recvMsg, 0x00, sizeof(char)*buff->bufLen); - recvLen = muse_core_ipc_recv_fd_msg(cb_info->fd, buff->recvMsg, &cb_info->tfd); + recvLen = muse_core_ipc_recv_fd_msg(cb_info->fd, buff->recvMsg, tfd); /* check the first msg */ if (buff->part_of_msg && buff->recvMsg[0] != '{') @@ -407,7 +412,7 @@ static int __unset_callback(muse_player_event_e type, player_h player) return ret; } -static void __prepare_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __prepare_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_PREPARE; @@ -416,7 +421,7 @@ static void __prepare_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) set_null_user_cb(cb_info, ev); } -static void __complete_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __complete_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_COMPLETE; ((player_completed_cb) cb_info->user_cb[ev]) (cb_info->user_data[ev]); @@ -447,12 +452,12 @@ static char* _convert_code_to_str(int code) } } -static void __interrupt_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __interrupt_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { int code; muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_INTERRUPT; - if (player_msg_get(code, recvMsg)) { + if (player_msg_get(code, recv_data->buffer)) { if (code >= PLAYER_INTERRUPTED_COMPLETED && code <= PLAYER_INTERRUPTED_BY_NOTIFICATION && @@ -464,37 +469,37 @@ static void __interrupt_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) } } -static void __error_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __error_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { int code; muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_ERROR; - if (player_msg_get(code, recvMsg)) + if (player_msg_get(code, recv_data->buffer)) ((player_error_cb) cb_info->user_cb[ev]) (code, cb_info->user_data[ev]); } -static void __buffering_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __buffering_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { int percent; muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_BUFFERING; - if (player_msg_get(percent, recvMsg)) + if (player_msg_get(percent, recv_data->buffer)) ((player_buffering_cb) cb_info->user_cb[ev]) (percent, cb_info->user_data[ev]); } -static void __subtitle_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __subtitle_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { int duration = 0; char text[MUSE_URI_MAX_LENGTH] = { 0, }; muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_SUBTITLE; bool ret = TRUE; - player_msg_get1_string(recvMsg, duration, INT, text, ret); + player_msg_get1_string(recv_data->buffer, duration, INT, text, ret); if (ret) ((player_subtitle_updated_cb) cb_info->user_cb[ev]) (duration, text, cb_info->user_data[ev]); } -static void __capture_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __capture_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { unsigned char *data = NULL; int width = 0; @@ -505,14 +510,14 @@ static void __capture_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) int key = INVALID_DEFAULT_VALUE; bool ret_val = TRUE; - player_msg_get4(recvMsg, width, INT, height, INT, size, INT, key, INT, ret_val); + player_msg_get4(recv_data->buffer, width, INT, height, INT, size, INT, key, INT, ret_val); if (ret_val) { - if (cb_info->tfd < 0) { + if (recv_data->tfd < 0) { LOGE("There is no valid tbm_fd"); goto EXIT; } - bo = tbm_bo_import_fd(cb_info->bufmgr, cb_info->tfd); + bo = tbm_bo_import_fd(cb_info->bufmgr, recv_data->tfd); if (bo == NULL) { LOGE("TBM get error : bo is NULL"); goto EXIT; @@ -534,9 +539,9 @@ static void __capture_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) } EXIT: - if (cb_info->tfd > INVALID_DEFAULT_VALUE) - close(cb_info->tfd); - cb_info->tfd = INVALID_DEFAULT_VALUE; + if (recv_data->tfd > INVALID_DEFAULT_VALUE) + close(recv_data->tfd); + recv_data->tfd = INVALID_DEFAULT_VALUE; if (bo) tbm_bo_unref(bo); @@ -550,7 +555,7 @@ EXIT: set_null_user_cb(cb_info, MUSE_PLAYER_EVENT_TYPE_CAPTURE); } -static void __seek_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __seek_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_SEEK; @@ -625,7 +630,7 @@ static player_tsurf_info_t* __player_get_tsurf_from_list(callback_cb_info_s * cb return NULL; } -static void __media_packet_video_frame_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __media_packet_video_frame_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { tbm_bo bo[4] = { NULL, }; tbm_key key[4] = { 0, }; @@ -644,7 +649,7 @@ static void __media_packet_video_frame_cb_handler(callback_cb_info_s * cb_info, int i = 0; muse_core_msg_parse_err_e err = MUSE_MSG_PARSE_ERROR_NONE; - void *jobj = muse_core_msg_json_object_new(recvMsg, NULL, &err); + void *jobj = muse_core_msg_json_object_new(recv_data->buffer, NULL, &err); if (!jobj || !muse_core_msg_json_object_get_value("key[0]", jobj, &key[0], MUSE_TYPE_ANY) || !muse_core_msg_json_object_get_value("key[1]", jobj, &key[1], MUSE_TYPE_ANY) || @@ -795,26 +800,26 @@ ERROR: return; } -static void __audio_frame_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __audio_frame_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { tbm_bo bo = NULL; tbm_bo_handle thandle; int key = INVALID_DEFAULT_VALUE; player_audio_raw_data_s audio; - if (!player_msg_get(key, recvMsg)) { + if (!player_msg_get(key, recv_data->buffer)) { LOGE("failed to get key value from msg."); return; } - if (cb_info->tfd < 0) { + if (recv_data->tfd < 0) { LOGE("failed to get tbm_fd(key:%d)", key); goto EXIT; } - bo = tbm_bo_import_fd(cb_info->bufmgr, cb_info->tfd); + bo = tbm_bo_import_fd(cb_info->bufmgr, recv_data->tfd); if (bo == NULL) { - LOGE("TBM get error : bo is NULL, tbm_fd:%d(key:%d)", cb_info->tfd, key); + LOGE("TBM get error : bo is NULL, tbm_fd:%d(key:%d)", recv_data->tfd, key); goto EXIT; } @@ -832,9 +837,9 @@ static void __audio_frame_cb_handler(callback_cb_info_s * cb_info, char *recvMsg tbm_bo_unmap(bo); EXIT: - if (cb_info->tfd > INVALID_DEFAULT_VALUE) - close(cb_info->tfd); - cb_info->tfd = INVALID_DEFAULT_VALUE; + if (recv_data->tfd > INVALID_DEFAULT_VALUE) + close(recv_data->tfd); + recv_data->tfd = INVALID_DEFAULT_VALUE; if (bo) tbm_bo_unref(bo); @@ -846,48 +851,48 @@ EXIT: } } -static void __video_frame_render_error_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __video_frame_render_error_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { } -static void __pd_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __pd_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { int type; muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_PD; - if (player_msg_get(type, recvMsg)) + if (player_msg_get(type, recv_data->buffer)) ((player_pd_message_cb) cb_info->user_cb[ev]) (type, cb_info->user_data[ev]); } -static void __supported_audio_effect_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __supported_audio_effect_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { } -static void __supported_audio_effect_freset_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __supported_audio_effect_freset_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { } -static void __missed_plugin_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __missed_plugin_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { } -static void __media_stream_video_buffer_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __media_stream_video_buffer_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { /* player_media_stream_buffer_status_e status; */ int status; - if (player_msg_get(status, recvMsg)) { + if (player_msg_get(status, recv_data->buffer)) { ((player_media_stream_buffer_status_cb) cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS]) ((player_media_stream_buffer_status_e) status, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS]); } } -static void __media_stream_audio_buffer_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __media_stream_audio_buffer_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { /* player_media_stream_buffer_status_e status; */ int status; - if (player_msg_get(status, recvMsg)) { + if (player_msg_get(status, recv_data->buffer)) { ((player_media_stream_buffer_status_cb) cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS]) ((player_media_stream_buffer_status_e) status, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS]); @@ -895,14 +900,14 @@ static void __media_stream_audio_buffer_cb_handler(callback_cb_info_s * cb_info, } -static void __media_stream_video_buffer_cb_handler_ex(callback_cb_info_s * cb_info, char *recvMsg) +static void __media_stream_video_buffer_cb_handler_ex(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { /* player_media_stream_buffer_status_e status; */ int status; unsigned long long bytes; bool ret = TRUE; - player_msg_get2(recvMsg, status, INT, bytes, INT64, ret); + player_msg_get2(recv_data->buffer, status, INT, bytes, INT64, ret); if (ret == TRUE) { ((player_media_stream_buffer_status_cb_ex) cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS_WITH_INFO]) @@ -910,14 +915,14 @@ static void __media_stream_video_buffer_cb_handler_ex(callback_cb_info_s * cb_in } } -static void __media_stream_audio_buffer_cb_handler_ex(callback_cb_info_s * cb_info, char *recvMsg) +static void __media_stream_audio_buffer_cb_handler_ex(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { /* player_media_stream_buffer_status_e status; */ int status; unsigned long long bytes; bool ret = TRUE; - player_msg_get2(recvMsg, status, INT, bytes, INT64, ret); + player_msg_get2(recv_data->buffer, status, INT, bytes, INT64, ret); if (ret == TRUE) { ((player_media_stream_buffer_status_cb_ex) cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS_WITH_INFO]) @@ -926,29 +931,29 @@ static void __media_stream_audio_buffer_cb_handler_ex(callback_cb_info_s * cb_in } -static void __media_stream_video_seek_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __media_stream_video_seek_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { unsigned long long offset; - if (player_msg_get_type(offset, recvMsg, INT64)) { + if (player_msg_get_type(offset, recv_data->buffer, INT64)) { ((player_media_stream_seek_cb) cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_SEEK]) (offset, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_SEEK]); } } -static void __media_stream_audio_seek_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __media_stream_audio_seek_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { unsigned long long offset; - if (player_msg_get_type(offset, recvMsg, INT64)) { + if (player_msg_get_type(offset, recv_data->buffer, INT64)) { ((player_media_stream_seek_cb) cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_SEEK]) (offset, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_SEEK]); } } -static void __video_stream_changed_cb_handler(callback_cb_info_s * cb_info, char *recvMsg) +static void __video_stream_changed_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *recv_data) { int width; int height; @@ -956,14 +961,14 @@ static void __video_stream_changed_cb_handler(callback_cb_info_s * cb_info, char int bit_rate; bool ret_val = TRUE; - player_msg_get4(recvMsg, width, INT, height, INT, fps, INT, bit_rate, INT, ret_val); + player_msg_get4(recv_data->buffer, width, INT, height, INT, fps, INT, bit_rate, INT, ret_val); if (ret_val) { ((player_video_stream_changed_cb) cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_VIDEO_STREAM_CHANGED]) (width, height, fps, bit_rate, cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_VIDEO_STREAM_CHANGED]); } } -static void (*_user_callbacks[MUSE_PLAYER_EVENT_TYPE_NUM]) (callback_cb_info_s * cb_info, char *recvMsg) = { +static void (*_user_callbacks[MUSE_PLAYER_EVENT_TYPE_NUM]) (callback_cb_info_s * cb_info, _player_recv_data *recv_data) = { __prepare_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_PREPARE */ __complete_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_COMPLETE */ __interrupt_cb_handler, /* MUSE_PLAYER_EVENT_TYPE_INTERRUPT */ @@ -1016,7 +1021,7 @@ gboolean _player_event_job_function(void *user_data) g_mutex_unlock(&data->cb_info->event_queue.idle_ev_mutex); if (data->cb_info->user_cb[ev]) - _user_callbacks[ev] (data->cb_info, data->buf); + _user_callbacks[ev] (data->cb_info, data->recv_data); else LOGW("user callback is unset. type : %d", ev); @@ -1024,7 +1029,8 @@ gboolean _player_event_job_function(void *user_data) g_mutex_unlock(&data->event_mutex); g_mutex_clear(&data->event_mutex); - g_free(data->buf); + g_free(data->recv_data->buffer); + g_free(data->recv_data); g_free(data); return FALSE; /* remove from the event list */ @@ -1196,7 +1202,8 @@ static void _player_event_queue_destroy(callback_cb_info_s * cb_info) while (!g_queue_is_empty(ev->queue)) { event_data = (_player_cb_data *) g_queue_pop_head(ev->queue); if (event_data) { - g_free(event_data->buf); + g_free(event_data->recv_data->buffer); + g_free(event_data->recv_data); g_free(event_data); } } @@ -1220,7 +1227,8 @@ static void _player_event_queue_remove(player_event_queue * ev_queue, int ev) if (cb_data && cb_data->int_data == ev) { LOGD("removing '%p (ev:%d)' from event queue", cb_data, cb_data->int_data); - g_free(cb_data->buf); + g_free(cb_data->recv_data->buffer); + g_free(cb_data->recv_data); g_free(cb_data); g_queue_delete_link(ev_queue->queue, item); @@ -1240,7 +1248,7 @@ static void _player_event_queue_add(player_event_queue * ev, _player_cb_data * d } } -static void _user_callback_handler(callback_cb_info_s * cb_info, muse_player_event_e event, char *buffer) +static void _user_callback_handler(callback_cb_info_s * cb_info, muse_player_event_e event, _player_recv_data *recv_data) { LOGD("get event %d", event); @@ -1254,7 +1262,7 @@ static void _user_callback_handler(callback_cb_info_s * cb_info, muse_player_eve } data->int_data = (int)event; data->cb_info = cb_info; - data->buf = buffer; + data->recv_data = recv_data; g_mutex_init(&data->event_mutex); _player_event_queue_add(&cb_info->event_queue, data); } @@ -1318,12 +1326,13 @@ static void *client_cb_handler(gpointer data) callback_cb_info_s *cb_info = data; char *recvMsg = NULL; muse_core_msg_parse_err_e err; + tbm_fd tfd = INVALID_DEFAULT_VALUE; while (g_atomic_int_get(&cb_info->running)) { len = 0; err = MUSE_MSG_PARSE_ERROR_NONE; - len = player_recv_msg(cb_info); + len = player_recv_msg(cb_info, &tfd); if (len <= 0) break; @@ -1344,18 +1353,31 @@ static void *client_cb_handler(gpointer data) g_mutex_lock(&cb_info->player_mutex); cb_info->buff.recved++; _add_ret_msg(api, cb_info, offset, parse_len); + if (api == MUSE_PLAYER_API_GET_ALBUM_ART && tfd != INVALID_DEFAULT_VALUE) { + LOGD("get tbm fd for album art."); + cb_info->tfd = tfd; + } g_cond_signal(&cb_info->player_cond[api]); g_mutex_unlock(&cb_info->player_mutex); if (api == MUSE_PLAYER_API_DESTROY) g_atomic_int_set(&cb_info->running, 0); } else if (api == MUSE_PLAYER_CB_EVENT) { int event; - char *buffer; + _player_recv_data *recv_data = NULL; g_mutex_lock(&cb_info->player_mutex); - buffer = strndup(recvMsg + offset, parse_len); + recv_data = g_new0(_player_recv_data, 1); + if (recv_data != NULL) { + recv_data->tfd = tfd; + recv_data->buffer = strndup(recvMsg+offset, parse_len); + } else { + LOGE("failed to alloc recv_data."); + g_mutex_unlock(&cb_info->player_mutex); + muse_core_msg_json_object_free(jobj); + break; + } g_mutex_unlock(&cb_info->player_mutex); if (muse_core_msg_json_object_get_value("event", jobj, &event, MUSE_TYPE_INT)) - _user_callback_handler(cb_info, event, buffer); + _user_callback_handler(cb_info, event, recv_data); } else if (api == MUSE_PLAYER_CB_CREATE_ACK) { g_mutex_lock(&cb_info->player_mutex); cb_info->buff.recved++; -- 2.7.4