[0.6.154] use attr for current text track info 62/194162/3
authorEunhae Choi <eunhae1.choi@samsung.com>
Thu, 29 Nov 2018 12:08:23 +0000 (21:08 +0900)
committerEunhae Choi <eunhae1.choi@samsung.com>
Fri, 30 Nov 2018 00:13:23 +0000 (09:13 +0900)
- 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

packaging/libmm-player.spec
src/include/mm_player_tracks.h
src/mm_player_attrs.c
src/mm_player_gst.c
src/mm_player_priv.c [changed mode: 0755->0644]
src/mm_player_tracks.c

index d00afe0..91ea680 100644 (file)
@@ -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
index bece5a7..d622df8 100644 (file)
@@ -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);
 
index 8f41561..3d0454f 100644 (file)
@@ -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,
index 0d2120f..11749a6 100644 (file)
@@ -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;
old mode 100755 (executable)
new mode 100644 (file)
index f7d2266..e3503e0
@@ -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);
        }
index e5237d9..d839282 100644 (file)
@@ -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_tplayer = (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", &current_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", &current_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();