From: Eunhae Choi Date: Mon, 11 Dec 2017 11:06:37 +0000 (+0900) Subject: [0.6.83] update subtitle info before return api X-Git-Tag: submit/tizen_4.0/20171213.082554~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=55a934d036a546675ff6ed64b3f747908467dc6b;p=platform%2Fcore%2Fmultimedia%2Flibmm-player.git [0.6.83] update subtitle info before return api - try to sync the subtitle info update with set subtitle path API - wait the track msg for 1 sec Change-Id: I402a6c9a907a6dfce9a54c5a5c0bc0fe8a7be7b2 --- diff --git a/packaging/libmm-player.spec b/packaging/libmm-player.spec index b101953..fe23f0a 100644 --- a/packaging/libmm-player.spec +++ b/packaging/libmm-player.spec @@ -1,6 +1,6 @@ Name: libmm-player Summary: Multimedia Framework Player Library -Version: 0.6.82 +Version: 0.6.83 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_player_priv.h b/src/include/mm_player_priv.h index dbec7f9..385445f 100644 --- a/src/include/mm_player_priv.h +++ b/src/include/mm_player_priv.h @@ -714,6 +714,8 @@ typedef struct { /* adjust subtitle position store */ gint64 adjust_subtitle_pos; GList *subtitle_language_list; + GCond subtitle_info_cond; + GMutex subtitle_info_mutex; /* To store the current multiwindow status */ gboolean last_multiwin_status; diff --git a/src/include/mm_player_utils.h b/src/include/mm_player_utils.h index 881ddac..281250d 100644 --- a/src/include/mm_player_utils.h +++ b/src/include/mm_player_utils.h @@ -104,13 +104,20 @@ do { \ #define MMPLAYER_VIDEO_BO_LOCK(x_player) g_mutex_lock(&((mm_player_t *)x_player)->video_bo_mutex) #define MMPLAYER_VIDEO_BO_UNLOCK(x_player) g_mutex_unlock(&((mm_player_t *)x_player)->video_bo_mutex) #define MMPLAYER_VIDEO_BO_WAIT(x_player) g_cond_wait(&((mm_player_t *)x_player)->video_bo_cond, &((mm_player_t *)x_player)->video_bo_mutex) -#define MMPLAYER_VIDEO_BO_WAIT_UNTIL(x_player, end_time) g_cond_wait_until(&((mm_player_t *)x_player)->video_bo_cond, &((mm_player_t *)x_player)->video_bo_mutex, end_time); +#define MMPLAYER_VIDEO_BO_WAIT_UNTIL(x_player, end_time) g_cond_wait_until(&((mm_player_t *)x_player)->video_bo_cond, &((mm_player_t *)x_player)->video_bo_mutex, end_time) #define MMPLAYER_VIDEO_BO_SIGNAL(x_player) g_cond_signal(&((mm_player_t *)x_player)->video_bo_cond); /* media stream lock */ #define MMPLAYER_MEDIA_STREAM_CALLBACK_LOCK(x_player) g_mutex_lock(&((mm_player_t *)x_player)->media_stream_cb_lock) #define MMPLAYER_MEDIA_STREAM_CALLBACK_UNLOCK(x_player) g_mutex_unlock(&((mm_player_t *)x_player)->media_stream_cb_lock) +/* subtitle info */ +#define MMPLAYER_SUBTITLE_INFO_LOCK(x_player) g_mutex_lock(&((mm_player_t *)x_player)->subtitle_info_mutex) +#define MMPLAYER_SUBTITLE_INFO_UNLOCK(x_player) g_mutex_unlock(&((mm_player_t *)x_player)->subtitle_info_mutex) +#define MMPLAYER_SUBTITLE_INFO_WAIT(x_player) g_cond_wait(&((mm_player_t *)x_player)->subtitle_info_cond, &((mm_player_t *)x_player)->subtitle_info_mutex) +#define MMPLAYER_SUBTITLE_INFO_WAIT_UNTIL(x_player, end_time) g_cond_wait_until(&((mm_player_t *)x_player)->subtitle_info_cond, &((mm_player_t *)x_player)->subtitle_info_mutex, end_time) +#define MMPLAYER_SUBTITLE_INFO_SIGNAL(x_player) g_cond_signal(&((mm_player_t *)x_player)->subtitle_info_cond); + #if 0 #define MMPLAYER_FENTER(); LOGD(""); #define MMPLAYER_FLEAVE(); LOGD(""); diff --git a/src/mm_player_priv.c b/src/mm_player_priv.c index 0ed23d6..d31c1ee 100644 --- a/src/mm_player_priv.c +++ b/src/mm_player_priv.c @@ -1677,18 +1677,22 @@ __mmplayer_gst_callback(GstMessage *msg, gpointer data) if (lang_list != NULL) { count = g_list_length((GList *)g_value_get_pointer(lang_list)); if (count) { + MMPLAYER_SUBTITLE_INFO_LOCK(player); player->subtitle_language_list = (GList *)g_value_get_pointer(lang_list); mm_attrs_set_int_by_name(attrs, "content_text_track_num", (gint)count); if (mmf_attrs_commit(attrs)) LOGE("failed to commit.\n"); LOGD("Total subtitle tracks = %d \n", count); - } - while (count) { - temp = g_list_nth_data(player->subtitle_language_list, count - 1); - if (temp) - LOGD("value of lang_key is %s and lang_code is %s", - temp->language_key, temp->language_code); - count--; + + while (count) { + temp = g_list_nth_data(player->subtitle_language_list, count - 1); + if (temp) + LOGD("value of lang_key is %s and lang_code is %s", + temp->language_key, temp->language_code); + count--; + } + MMPLAYER_SUBTITLE_INFO_SIGNAL(player); + MMPLAYER_SUBTITLE_INFO_UNLOCK(player); } } } @@ -5644,6 +5648,10 @@ __mmplayer_gst_create_text_pipeline(mm_player_t* player) LOGD("subtitle file path is [%s].\n", subtitle_uri); + MMPLAYER_SUBTITLE_INFO_LOCK(player); + player->subtitle_language_list = NULL; + MMPLAYER_SUBTITLE_INFO_UNLOCK(player); + /* create the subtitle source */ subsrc = gst_element_factory_make("filesrc", "subtitle_source"); if (!subsrc) { @@ -6854,12 +6862,16 @@ __mmplayer_gst_destroy_pipeline(mm_player_t* player) player->no_more_pad = FALSE; player->num_dynamic_pad = 0; player->demux_pad_index = 0; - player->subtitle_language_list = NULL; player->use_deinterleave = FALSE; player->max_audio_channels = 0; player->video_share_api_delta = 0; player->video_share_clock_delta = 0; player->video_hub_download_mode = 0; + + MMPLAYER_SUBTITLE_INFO_LOCK(player); + player->subtitle_language_list = NULL; + MMPLAYER_SUBTITLE_INFO_UNLOCK(player); + __mmplayer_reset_gapless_state(player); if (player->streamer) { @@ -8456,6 +8468,10 @@ _mmplayer_create_player(MMHandleType handle) /* create media stream callback mutex */ g_mutex_init(&player->media_stream_cb_lock); + /* create subtitle info lock and cond */ + g_mutex_init(&player->subtitle_info_mutex); + g_cond_init(&player->subtitle_info_cond); + player->streaming_type = STREAMING_SERVICE_NONE; /* give default value of audio effect setting */ @@ -8779,10 +8795,9 @@ _mmplayer_destroy(MMHandleType handle) return MM_ERROR_PLAYER_INTERNAL; } - if (player->is_external_subtitle_present && player->subtitle_language_list) { - g_list_free(player->subtitle_language_list); - player->subtitle_language_list = NULL; - } + /* release subtitle info lock and cond */ + g_mutex_clear(&player->subtitle_info_mutex); + g_cond_clear(&player->subtitle_info_cond); __mmplayer_release_dump_list(player->dump_list); @@ -12829,8 +12844,8 @@ int _mmplayer_sync_subtitle_pipeline(mm_player_t* player) base_time = gst_element_get_base_time(GST_ELEMENT_CAST(player->pipeline->mainbin[MMPLAYER_M_PIPE].gst)); start_time = gst_element_get_start_time(GST_ELEMENT_CAST(player->pipeline->mainbin[MMPLAYER_M_PIPE].gst)); - LOGD("base_time=%" GST_TIME_FORMAT " start_time=%" GST_TIME_FORMAT " curr_time=%" GST_TIME_FORMAT, - GST_TIME_ARGS(base_time), GST_TIME_ARGS(start_time), GST_TIME_ARGS(curr_time)); + LOGD("state: %d, base_time=%" GST_TIME_FORMAT " start_time=%" GST_TIME_FORMAT " curr_time=%" GST_TIME_FORMAT, + current_state, GST_TIME_ARGS(base_time), GST_TIME_ARGS(start_time), GST_TIME_ARGS(curr_time)); if (current_state > GST_STATE_READY) { // sync state with current pipeline @@ -12965,6 +12980,9 @@ __mmplayer_change_external_subtitle_language(mm_player_t* player, const char* fi } //gst_pad_set_blocked_async(src-srcpad, TRUE) + MMPLAYER_SUBTITLE_INFO_LOCK(player); + player->subtitle_language_list = NULL; + MMPLAYER_SUBTITLE_INFO_UNLOCK(player); ret = gst_element_set_state(textbin[MMPLAYER_T_BIN].gst, GST_STATE_READY); if (ret != GST_STATE_CHANGE_SUCCESS) { @@ -13062,6 +13080,14 @@ int _mmplayer_set_external_subtitle_path(MMHandleType hplayer, const char* filep MMPLAYER_BUS_MSG_THREAD_SIGNAL(player); player->is_external_subtitle_added_now = TRUE; + + MMPLAYER_SUBTITLE_INFO_LOCK(player); + if (!player->subtitle_language_list) { + gint64 timeout = g_get_monotonic_time() + G_TIME_SPAN_SECOND; /* wait 1 sec */ + if (!MMPLAYER_SUBTITLE_INFO_WAIT_UNTIL(player, timeout)) + LOGW("subtitle language list is not updated yet"); + } + MMPLAYER_SUBTITLE_INFO_UNLOCK(player); } MMPLAYER_FLEAVE(); diff --git a/src/mm_player_tracks.c b/src/mm_player_tracks.c index fe3f8ee..da0269f 100644 --- a/src/mm_player_tracks.c +++ b/src/mm_player_tracks.c @@ -88,6 +88,7 @@ int _mmplayer_select_track(MMHandleType hplayer, MMPlayerTrackType type, int ind MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); MMPLAYER_FENTER(); + MMPLAYER_SUBTITLE_INFO_LOCK(player); if (type == MM_PLAYER_TRACK_TYPE_TEXT && player->subtitle_language_list) { GstElement *subparse = NULL; @@ -120,10 +121,12 @@ int _mmplayer_select_track(MMHandleType hplayer, MMPlayerTrackType type, int ind _mmplayer_sync_subtitle_pipeline(player); - } else + } else { ret = _mmplayer_change_track_language(hplayer, type, index); + } EXIT: + MMPLAYER_SUBTITLE_INFO_UNLOCK(player); MMPLAYER_FLEAVE(); return ret; } @@ -136,6 +139,7 @@ int _mmplayer_track_add_subtitle_language(MMHandleType hplayer, int index) MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); MMPLAYER_FENTER(); + MMPLAYER_SUBTITLE_INFO_LOCK(player); if (!player->pipeline || !player->pipeline->mainbin[MMPLAYER_M_T_SUBMUX_EXTERNAL].gst) { ret = MM_ERROR_PLAYER_NOT_INITIALIZED; goto EXIT; @@ -166,6 +170,7 @@ int _mmplayer_track_add_subtitle_language(MMHandleType hplayer, int index) } EXIT: + MMPLAYER_SUBTITLE_INFO_UNLOCK(player); MMPLAYER_FLEAVE(); return ret; } @@ -177,6 +182,7 @@ int _mmplayer_track_remove_subtitle_language(MMHandleType hplayer, int index) MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); MMPLAYER_FENTER(); + MMPLAYER_SUBTITLE_INFO_LOCK(player); if (!player->pipeline || !player->pipeline->mainbin[MMPLAYER_M_T_SUBMUX_EXTERNAL].gst) { ret = MM_ERROR_PLAYER_NOT_INITIALIZED; goto EXIT; @@ -207,6 +213,7 @@ int _mmplayer_track_remove_subtitle_language(MMHandleType hplayer, int index) } EXIT: + MMPLAYER_SUBTITLE_INFO_UNLOCK(player); MMPLAYER_FLEAVE(); return ret; } @@ -218,6 +225,8 @@ int _mmplayer_get_current_track(MMHandleType hplayer, MMPlayerTrackType type, in MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); MMPLAYER_FENTER(); + MMPLAYER_SUBTITLE_INFO_LOCK(player); + if (type >= MM_PLAYER_TRACK_TYPE_MAX) { ret = MM_ERROR_INVALID_ARGUMENT; LOGD("Not a proper type [type:%d] \n", type); @@ -265,6 +274,7 @@ int _mmplayer_get_current_track(MMHandleType hplayer, MMPlayerTrackType type, in } EXIT: + MMPLAYER_SUBTITLE_INFO_UNLOCK(player); MMPLAYER_FLEAVE(); return ret; } @@ -277,6 +287,8 @@ int _mmplayer_get_track_language_code(MMHandleType hplayer, MMPlayerTrackType ty mm_player_t* player = (mm_player_t*) hplayer; MMPLAYER_FENTER(); + MMPLAYER_SUBTITLE_INFO_LOCK(player); + if (type == MM_PLAYER_TRACK_TYPE_TEXT && player->subtitle_language_list) { int language_code_size = 3;/*Size of ISO-639-1*/ MMPlayerLangStruct *language_list = NULL; @@ -311,6 +323,7 @@ int _mmplayer_get_track_language_code(MMHandleType hplayer, MMPlayerTrackType ty } EXIT: + MMPLAYER_SUBTITLE_INFO_UNLOCK(player); MMPLAYER_FLEAVE(); return ret; } @@ -423,6 +436,7 @@ int _mmplayer_track_foreach_selected_subtitle_language(MMHandleType hplayer, _mm MMPLAYER_FENTER(); int index = -1; + MMPLAYER_SUBTITLE_INFO_LOCK(player); if (player->subtitle_language_list) { int total_track_count = 0; @@ -472,6 +486,7 @@ CALLBACK_ERROR: LOGE("foreach callback returned error"); EXIT: + MMPLAYER_SUBTITLE_INFO_UNLOCK(player); MMPLAYER_FLEAVE(); return ret;