From: Eunhae Choi Date: Thu, 29 Nov 2018 12:08:23 +0000 (+0900) Subject: [0.6.154] use attr for current text track info X-Git-Tag: accepted/tizen/unified/20181207.061516~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ef57773fc145c0710eb1f217ca42d9ab7f8a0ab2;p=platform%2Fcore%2Fmultimedia%2Flibmm-player.git [0.6.154] use attr for current text track info - add attr for current text track info - use attr structure for api return in case of text track regardless of the subtitle type - apply new gstreamer interface 'gst_tag_list_unref'. 'gst_tag_list_free' is deprecated. Change-Id: I19852d40458d7a9e8f31f41423454eb791558c5f --- diff --git a/packaging/libmm-player.spec b/packaging/libmm-player.spec index d00afe0..91ea680 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.153 +Version: 0.6.154 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_player_tracks.h b/src/include/mm_player_tracks.h index bece5a7..d622df8 100644 --- a/src/include/mm_player_tracks.h +++ b/src/include/mm_player_tracks.h @@ -35,7 +35,9 @@ void __mmplayer_track_initialize(mm_player_t *player); void __mmplayer_track_destroy(mm_player_t *player); -void __mmplayer_track_update_info(mm_player_t *player, MMPlayerTrackType type, GstPad *sinkpad); +void __mmplayer_track_update_selector_info(mm_player_t *player, MMPlayerTrackType type, GstPad *sinkpad); + +void __mmplayer_track_update_text_attr_info(mm_player_t* player, GstMessage *msg); int _mmplayer_get_track_count(MMHandleType hplayer, MMPlayerTrackType type, int *count); diff --git a/src/mm_player_attrs.c b/src/mm_player_attrs.c index 8f41561..3d0454f 100644 --- a/src/mm_player_attrs.c +++ b/src/mm_player_attrs.c @@ -417,6 +417,15 @@ _mmplayer_construct_attribute(MMHandleType handle) MMPLAYER_MAX_INT }, { + "current_text_track_index", + MM_ATTRS_TYPE_INT, + MM_ATTRS_FLAG_RW, + (void *) -1, + MM_ATTRS_VALID_TYPE_INT_RANGE, + -1, + MMPLAYER_MAX_INT + }, + { "tag_artist", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, diff --git a/src/mm_player_gst.c b/src/mm_player_gst.c index 0d2120f..11749a6 100644 --- a/src/mm_player_gst.c +++ b/src/mm_player_gst.c @@ -33,6 +33,7 @@ #include "mm_player_priv.h" #include "mm_player_attrs.h" #include "mm_player_utils.h" +#include "mm_player_tracks.h" /*=========================================================================================== | | @@ -957,7 +958,7 @@ if (gst_tag_list_get_double(tag_list, gsttag, &v_double)) {\ if (mm_attrs_commit_all(attrs)) LOGE("failed to commit.\n"); - gst_tag_list_free(tag_list); + gst_tag_list_unref(tag_list); return TRUE; } @@ -1831,44 +1832,8 @@ __mmplayer_gst_handle_element_message(mm_player_t* player, GstMessage *msg) return; } - if (!strcmp(structure_name, "Language_list")) { - const GValue *lang_list = NULL; - lang_list = gst_structure_get_value(gst_message_get_structure(msg), "lang_list"); - if (lang_list != NULL) { - count = g_list_length((GList *)g_value_get_pointer(lang_list)); - if (count > 1) - LOGD("Total audio tracks(from parser) = %d \n", count); - } - } - - if (!strcmp(structure_name, "Ext_Sub_Language_List")) { - const GValue *lang_list = NULL; - MMPlayerLangStruct *temp = NULL; - - lang_list = gst_structure_get_value(gst_message_get_structure(msg), "lang_list"); - 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 (mm_attrs_commit_all(attrs)) - LOGE("failed to commit"); - - LOGD("the num of external subtitle track: %d", count); - - while (count) { /* track lang info */ - 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); - } - } - } + if (!strcmp(structure_name, "Ext_Sub_Language_List")) + __mmplayer_track_update_text_attr_info(player, msg); /* custom message */ if (!strcmp(structure_name, "audio_codec_not_supported")) { @@ -1894,12 +1859,12 @@ __mmplayer_gst_handle_element_message(mm_player_t* player, GstMessage *msg) gst_structure_get(gst_message_get_structure(msg), "rtsp_audio_codec", G_TYPE_STRING, &audio_codec, NULL); LOGD("rtsp_audio_codec : %s", audio_codec); if (audio_codec) - mm_attrs_set_string_by_name(player->attrs, "content_audio_codec", audio_codec); + mm_attrs_set_string_by_name(attrs, "content_audio_codec", audio_codec); gst_structure_get(gst_message_get_structure(msg), "rtsp_video_codec", G_TYPE_STRING, &video_codec, NULL); LOGD("rtsp_video_codec : %s", video_codec); if (video_codec) - mm_attrs_set_string_by_name(player->attrs, "content_video_codec", video_codec); + mm_attrs_set_string_by_name(attrs, "content_video_codec", video_codec); gst_structure_get(gst_message_get_structure(msg), "rtsp_video_frame_size", G_TYPE_STRING, &video_frame_size, NULL); LOGD("rtsp_video_frame_size : %s", video_frame_size); @@ -1921,7 +1886,7 @@ __mmplayer_gst_handle_element_message(mm_player_t* player, GstMessage *msg) } if (mm_attrs_commit_all(attrs)) - LOGE("failed to commit.\n"); + LOGE("failed to commit."); } MMPLAYER_FLEAVE(); @@ -2152,7 +2117,7 @@ __mmplayer_gst_bus_sync_callback(GstBus * bus, GstMessage * message, gpointer da GST_STR_NULL(GST_ELEMENT_NAME(GST_MESSAGE_SRC(message)))); gst_tag_list_foreach(tags, print_tag, NULL); - gst_tag_list_free(tags); + gst_tag_list_unref(tags); tags = NULL; } break; diff --git a/src/mm_player_priv.c b/src/mm_player_priv.c old mode 100755 new mode 100644 index f7d2266..e3503e0 --- a/src/mm_player_priv.c +++ b/src/mm_player_priv.c @@ -1185,7 +1185,7 @@ __mmplayer_gst_decode_pad_added(GstElement *elem, GstPad *pad, gpointer data) g_object_set(selector, "active-pad", sinkpad, NULL); } - __mmplayer_track_update_info(player, stream_type, sinkpad); + __mmplayer_track_update_selector_info(player, stream_type, sinkpad); DONE: ERROR: @@ -1256,12 +1256,15 @@ static void __mmplayer_set_decode_track_info(mm_player_t* player, MMPlayerTrackT (__mmplayer_change_selector_pad(player, type, active_index) != MM_ERROR_NONE)) { LOGW("failed to change %d type track to %d", type, active_index); player->selector[type].active_pad_index = DEFAULT_TRACK; + return; } if (type == MM_PLAYER_TRACK_TYPE_TEXT) { attrs = MMPLAYER_GET_ATTRS(player); if (attrs) { mm_attrs_set_int_by_name(attrs, "content_text_track_num", player->selector[type].total_track_num); + mm_attrs_set_int_by_name(attrs, "current_text_track_index", player->selector[type].active_pad_index); + if (mm_attrs_commit_all(attrs)) LOGW("failed to commit attrs."); } else { @@ -4078,7 +4081,7 @@ __mmplayer_gst_destroy_pipeline(mm_player_t* player) } if (tag_list) - gst_tag_list_free(tag_list); + gst_tag_list_unref(tag_list); MMPLAYER_FREEIF(player->pipeline); } diff --git a/src/mm_player_tracks.c b/src/mm_player_tracks.c index e5237d9..d839282 100644 --- a/src/mm_player_tracks.c +++ b/src/mm_player_tracks.c @@ -24,6 +24,8 @@ #include "mm_player_utils.h" #include "mm_player_tracks.h" +#define INVALID_TRACK_INDEX -1 + /*--------------------------------------------------------------------------------------- | LOCAL FUNCTION PROTOTYPES: | ---------------------------------------------------------------------------------------*/ @@ -79,9 +81,12 @@ int _mmplayer_get_track_count(MMHandleType hplayer, MMPlayerTrackType type, int int _mmplayer_select_track(MMHandleType hplayer, MMPlayerTrackType type, int index) { int ret = MM_ERROR_NONE; - mm_player_t* player = (mm_player_t*) hplayer; - MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); + mm_player_t *player = (mm_player_t*) hplayer; + MMPLAYER_FENTER(); + MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); + + LOGD("track type: %d, index: %d", type, index); MMPLAYER_SUBTITLE_INFO_LOCK(player); @@ -116,8 +121,31 @@ int _mmplayer_select_track(MMHandleType hplayer, MMPlayerTrackType type, int ind } else { ret = _mmplayer_change_track_language(hplayer, type, index); + if (ret != MM_ERROR_NONE) { + LOGE("failed to change track"); + goto EXIT; + } } + if (type == MM_PLAYER_TRACK_TYPE_TEXT) { + MMHandleType attrs = MMPLAYER_GET_ATTRS(player); + if (!attrs) { + LOGE("cannot get content attribute"); + ret = MM_ERROR_PLAYER_INTERNAL; + goto EXIT; + } + + mm_attrs_set_int_by_name(attrs, "current_text_track_index", index); + + if (mm_attrs_commit_all(attrs)) { + LOGE("failed to commit"); + ret = MM_ERROR_PLAYER_INTERNAL; + goto EXIT; + } + } + + LOGD("current index is updated"); + EXIT: MMPLAYER_SUBTITLE_INFO_UNLOCK(player); MMPLAYER_FLEAVE(); @@ -127,65 +155,57 @@ EXIT: int _mmplayer_get_current_track(MMHandleType hplayer, MMPlayerTrackType type, int *index) { int ret = MM_ERROR_NONE; - mm_player_t* player = (mm_player_t*) hplayer; - MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); + mm_player_t *player = (mm_player_t*) hplayer; + MMHandleType attrs = 0; + gint count = 0; + MMPLAYER_FENTER(); + MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); + MMPLAYER_RETURN_VAL_IF_FAIL(index, MM_ERROR_COMMON_INVALID_ARGUMENT); + + attrs = MMPLAYER_GET_ATTRS(player); + MMPLAYER_RETURN_VAL_IF_FAIL(attrs, MM_ERROR_PLAYER_INTERNAL); 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); - goto EXIT; - } + LOGD("track type: %d", type); - if (type == MM_PLAYER_TRACK_TYPE_TEXT && player->subtitle_language_list) { - GstElement *subparse = NULL; - int total_track_count = 0; - gchar* current_language = NULL; - MMPlayerLangStruct *temp = NULL; - MMHandleType attrs = 0; + *index = INVALID_TRACK_INDEX; - attrs = MMPLAYER_GET_ATTRS(player); - if (!attrs) { - LOGE("cannot get content attribute"); - ret = MM_ERROR_PLAYER_INTERNAL; + switch (type) { + case MM_PLAYER_TRACK_TYPE_AUDIO: + if (player->selector[MM_PLAYER_TRACK_TYPE_AUDIO].total_track_num <= 0) { + LOGW("there is no audio track"); + ret = MM_ERROR_PLAYER_NO_OP; goto EXIT; } - mm_attrs_get_int_by_name(attrs, "content_text_track_num", &total_track_count); - - subparse = player->pipeline->mainbin[MMPLAYER_M_SUBPARSE].gst; - g_object_get(G_OBJECT(subparse), "current-language", ¤t_language, NULL); - LOGD("current language is %s ", current_language); - while (total_track_count) { - temp = g_list_nth_data(player->subtitle_language_list, total_track_count - 1); - if (temp && current_language) { - LOGD("find the list"); - if (!strcmp(temp->language_key, current_language)) { - *index = total_track_count - 1; - LOGD("current lang index is %d", *index); - break; - } - } - total_track_count--; - } - - if (total_track_count == 0) { - *index = 0; - LOGE("failed to find current language index"); - ret = MM_ERROR_PLAYER_INTERNAL; - goto EXIT; - } - } else { - if (player->selector[type].total_track_num <= 0) { + *index = player->selector[MM_PLAYER_TRACK_TYPE_AUDIO].active_pad_index; + break; + case MM_PLAYER_TRACK_TYPE_TEXT: /* internal or external */ + mm_attrs_get_int_by_name(attrs, "content_text_track_num", &count); + if (count <= 0) { + LOGD("there is no text track"); ret = MM_ERROR_PLAYER_NO_OP; - LOGD("there is no track information [type:%d] \n", type); goto EXIT; } - *index = player->selector[type].active_pad_index; + + mm_attrs_get_int_by_name(attrs, "current_text_track_index", index); + break; + default: + LOGD("invalid input type"); + ret = MM_ERROR_COMMON_INVALID_ARGUMENT; + goto EXIT; } + if (*index < 0) { + LOGE("invalid track index"); + ret = MM_ERROR_PLAYER_INTERNAL; + goto EXIT; + } + + LOGD("current track index: %d", *index); + EXIT: MMPLAYER_SUBTITLE_INFO_UNLOCK(player); MMPLAYER_FLEAVE(); @@ -265,9 +285,10 @@ void __mmplayer_track_destroy(mm_player_t* player) attrs = MMPLAYER_GET_ATTRS(player); if (attrs) { mm_attrs_set_int_by_name(attrs, "content_text_track_num", 0); + mm_attrs_set_int_by_name(attrs, "current_text_track_index", INVALID_TRACK_INDEX); if (mm_attrs_commit_all(attrs)) - LOGE("failed to commit.\n"); + LOGE("failed to commit"); } for (; type < MM_PLAYER_TRACK_TYPE_MAX ; type++) { @@ -280,7 +301,7 @@ void __mmplayer_track_destroy(mm_player_t* player) } } -void __mmplayer_track_update_info(mm_player_t* player, MMPlayerTrackType type, GstPad *sinkpad) +void __mmplayer_track_update_selector_info(mm_player_t* player, MMPlayerTrackType type, GstPad *sinkpad) { MMPLAYER_FENTER(); @@ -290,6 +311,79 @@ void __mmplayer_track_update_info(mm_player_t* player, MMPlayerTrackType type, G LOGD("type: %d, track cnt: %d", type, player->selector[type].total_track_num); } +void __mmplayer_track_update_text_attr_info(mm_player_t *player, GstMessage *msg) +{ + MMHandleType attrs = 0; + const GValue *lang_list = NULL; + MMPlayerLangStruct *temp = NULL; + gchar *current_lang = NULL; + gint track_index = INVALID_TRACK_INDEX; + guint track_count = 0, index = 0; + + MMPLAYER_FENTER(); + MMPLAYER_RETURN_IF_FAIL(player && msg); + + attrs = MMPLAYER_GET_ATTRS(player); + if (!attrs) { + LOGE("failed to get content attribute"); + return; + } + + if (!gst_message_get_structure(msg)) { + LOGE("failed to get msg structure"); + return; + } + + lang_list = gst_structure_get_value(gst_message_get_structure(msg), "lang_list"); + if (!lang_list) { + LOGW("language list is null"); + return; + } + + track_count = g_list_length((GList *)g_value_get_pointer(lang_list)); + if (track_count == 0) { + LOGW("track count is zero"); + return; + } + + 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)track_count); + g_object_get(G_OBJECT(msg->src), "current-language", ¤t_lang, NULL); + + LOGI("track count: %d, current track lang: %s", track_count, current_lang); + if (!current_lang) + goto EXIT; + + for (index = 0 ; index < track_count ; index++) { + temp = g_list_nth_data(player->subtitle_language_list, index); + if (temp) { + LOGI("[%d] lang_key: %s, lang_code: %s", + index, temp->language_key, temp->language_code); + + if (!g_strcmp0(temp->language_key, current_lang)) { + LOGD("current track index : %d", index); + track_index = index; + break; + } + } + } + + if (track_index > INVALID_TRACK_INDEX) + mm_attrs_set_int_by_name(attrs, "current_text_track_index", track_index); + else + LOGE("failed to find current track index"); + + if (mm_attrs_commit_all(attrs)) + LOGE("failed to commit"); + +EXIT: + MMPLAYER_SUBTITLE_INFO_SIGNAL(player); + MMPLAYER_SUBTITLE_INFO_UNLOCK(player); + + MMPLAYER_FLEAVE(); +} + static int __mmplayer_track_get_language(mm_player_t* player, MMPlayerTrackType type, gint stream_index, gchar **code) { int ret = MM_ERROR_NONE; @@ -332,7 +426,7 @@ static int __mmplayer_track_get_language(mm_player_t* player, MMPlayerTrackType } if (tag_list) - gst_tag_list_free(tag_list); + gst_tag_list_unref(tag_list); EXIT: MMPLAYER_FLEAVE();