[0.6.241] apply select-stream event for audio only
[platform/core/multimedia/libmm-player.git] / src / mm_player_tracks.c
index b6b433f..f4c761d 100644 (file)
  */
 #include <dlog.h>
 #include <mm_error.h>
-#include <mm_attrs_private.h>
 #include "mm_player_utils.h"
 #include "mm_player_tracks.h"
+#include "mm_player_attrs.h"
+
+#define LANGUAGE_CODE_SIZE (3 + 1) /* Size of ISO-639-1, and considering the nul-terminator */
 
 /*---------------------------------------------------------------------------------------
 |    LOCAL FUNCTION PROTOTYPES:                                                                                      |
 ---------------------------------------------------------------------------------------*/
-static int __mmplayer_track_get_language(mm_player_t* player, MMPlayerTrackType type, gint stream_index, gchar **code);
+static int __mmplayer_track_get_language(mmplayer_t *player, mmplayer_track_type_e type, gint stream_index, gchar **code);
 
 
 /*=======================================================================================
 |  FUNCTION DEFINITIONS                                                                                             |
 =======================================================================================*/
-int _mmplayer_get_track_count(MMHandleType hplayer,  MMPlayerTrackType type, int *count)
+int
+_mmplayer_get_track_count(MMHandleType hplayer,  mmplayer_track_type_e type, int *count)
 {
-       mm_player_t* player = (mm_player_t*) hplayer;
-       MMHandleType attrs = 0;
        int ret = MM_ERROR_NONE;
+       mmplayer_t *player = (mmplayer_t *)hplayer;
+       MMHandleType attrs = 0;
 
        MMPLAYER_FENTER();
 
        /* check player handle */
        MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
-       MMPLAYER_RETURN_VAL_IF_FAIL(count, MM_ERROR_COMMON_INVALID_ARGUMENT);
-       MMPLAYER_RETURN_VAL_IF_FAIL((MMPLAYER_CURRENT_STATE(player) != MM_PLAYER_STATE_PAUSED)
-                ||(MMPLAYER_CURRENT_STATE(player) != MM_PLAYER_STATE_PLAYING),
+       MMPLAYER_RETURN_VAL_IF_FAIL(count, MM_ERROR_INVALID_ARGUMENT);
+       MMPLAYER_RETURN_VAL_IF_FAIL((MMPLAYER_CURRENT_STATE(player) == MM_PLAYER_STATE_PAUSED)
+                || (MMPLAYER_CURRENT_STATE(player) == MM_PLAYER_STATE_PLAYING),
                MM_ERROR_PLAYER_INVALID_STATE);
 
        attrs = MMPLAYER_GET_ATTRS(player);
-       if ( !attrs )
-       {
+       if (!attrs) {
                LOGE("cannot get content attribute");
                return MM_ERROR_PLAYER_INTERNAL;
        }
 
-       switch (type)
-       {
-               case MM_PLAYER_TRACK_TYPE_AUDIO:
-                       {
-                               /*if function called for normal file [no multi audio] */
-                               if(player->selector[MM_PLAYER_TRACK_TYPE_AUDIO].total_track_num <= 0)
-                               {
-                                       *count = 0;
-                                       break;
-                               }
-                               ret = mm_attrs_get_int_by_name(attrs, "content_audio_track_num", count);
-                       }
-                       break;
-               case MM_PLAYER_TRACK_TYPE_TEXT:
-                       ret = mm_attrs_get_int_by_name(attrs, "content_text_track_num", count);
-                       break;
-               default:
-                       ret = MM_ERROR_COMMON_INVALID_ARGUMENT;
-                       break;
+       *count = 0;
+
+       switch (type) {
+       case MM_PLAYER_TRACK_TYPE_AUDIO:
+               if (player->track[MM_PLAYER_TRACK_TYPE_AUDIO].total_track_num > 0)
+                       *count = player->track[MM_PLAYER_TRACK_TYPE_AUDIO].total_track_num;
+               break;
+       case MM_PLAYER_TRACK_TYPE_TEXT: /* internal or external */
+               ret = mm_attrs_get_int_by_name(attrs, "content_text_track_num", count);
+               break;
+       default:
+               ret = MM_ERROR_INVALID_ARGUMENT;
+               break;
        }
 
-       LOGD ("%d track num : %d\n", type, *count);
+       LOGD("type: %d, the num of track: %d", type, *count);
 
        MMPLAYER_FLEAVE();
 
        return ret;
 }
 
-int _mmplayer_select_track(MMHandleType hplayer, MMPlayerTrackType type, int index)
+int
+_mmplayer_select_track(MMHandleType hplayer, mmplayer_track_type_e 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);
+       mmplayer_t *player = (mmplayer_t *)hplayer;
+
        MMPLAYER_FENTER();
+       MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
 
+       LOGD("track type: %d, index: %d", type, index);
 
-       if (type == MM_PLAYER_TRACK_TYPE_TEXT && player->subtitle_language_list)
-       {
+       MMPLAYER_SUBTITLE_INFO_LOCK(player);
+
+       if (type == MM_PLAYER_TRACK_TYPE_TEXT && player->subtitle_language_list) { /* external subtitle */
                GstElement *subparse = NULL;
-               MMPlayerLangStruct *temp = NULL;
-               unsigned long cur_time = 0;
+               mmplayer_lang_info_t *temp = NULL;
                guint num_of_list = 0;
 
-               if(!player->pipeline || !player->pipeline->textbin[MMPLAYER_T_FAKE_SINK].gst)
-               {
+               if (!player->pipeline || !player->pipeline->textbin[MMPLAYER_T_FAKE_SINK].gst) {
                        ret = MM_ERROR_PLAYER_NOT_INITIALIZED;
                        goto EXIT;
                }
 
                num_of_list = g_list_length(player->subtitle_language_list);
-               if (index < 0 || index >= num_of_list)
-               {
+               if (index < 0 || index >= num_of_list) {
                        LOGE("req track index is wrong");
                        ret = MM_ERROR_INVALID_ARGUMENT;
                        goto EXIT;
                }
 
-               _mmplayer_get_position (hplayer, MM_PLAYER_POS_FORMAT_TIME, &cur_time);
-               temp = g_list_nth_data (player->subtitle_language_list, index);
-               if (!temp)
-               {
+               temp = g_list_nth_data(player->subtitle_language_list, index);
+               if (!temp) {
                        LOGE("fail to get lang from list");
                        ret = MM_ERROR_PLAYER_INTERNAL;
                        goto EXIT;
                }
                subparse = player->pipeline->mainbin[MMPLAYER_M_SUBPARSE].gst;
                LOGD("setting to language %s", temp->language_code);
-               g_object_set (G_OBJECT (subparse), "current-language", temp->language_key, NULL);
+               g_object_set(G_OBJECT(subparse), "current-language", temp->language_key, NULL);
 
                _mmplayer_sync_subtitle_pipeline(player);
 
+       } else { /* audio or internal subtitle */
+               ret = _mmplayer_change_track_language(hplayer, type, index);
+               if (ret != MM_ERROR_NONE) {
+                       LOGE("failed to change track");
+                       goto EXIT;
+               }
        }
-       else
-       {
-               ret = _mmplayer_change_track_language (hplayer, type, index);
-       }
-
-EXIT:
-       MMPLAYER_FLEAVE();
-       return ret;
-}
-
-#ifdef _MULTI_TRACK
-int _mmplayer_track_add_subtitle_language(MMHandleType hplayer, 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);
-       MMPLAYER_FENTER();
-
-       if(!player->pipeline || !player->pipeline->mainbin[MMPLAYER_M_T_SUBMUX_EXTERNAL].gst)
-       {
-               ret = MM_ERROR_PLAYER_NOT_INITIALIZED;
-               goto EXIT;
-       }
-
-       if (player->subtitle_language_list)
-       {
-               GstElement *subparse = NULL;
-               MMPlayerLangStruct *temp = NULL;
 
-               temp = g_list_nth_data (player->subtitle_language_list, index);
-               if (!temp)
-               {
-                       LOGE("fail to get lang from list");
+       if (type == MM_PLAYER_TRACK_TYPE_TEXT) {
+               if (mm_player_set_attribute(hplayer, NULL,
+                               "current_text_track_index", index, NULL) != MM_ERROR_NONE) {
+                       LOGE("failed to set text track index");
                        ret = MM_ERROR_PLAYER_INTERNAL;
                        goto EXIT;
                }
-               temp->active = TRUE;
-
-               subparse = player->pipeline->mainbin[MMPLAYER_M_T_SUBMUX_EXTERNAL].gst;
-               LOGD("adding to language %s", temp->language_code);
-               g_object_set (G_OBJECT (subparse), "current-language", temp->language_key, NULL);
-               g_object_set (G_OBJECT (subparse), "lang-list", player->subtitle_language_list, NULL);
-
-               _mmplayer_sync_subtitle_pipeline(player);
-       }
-       else
-       {
-               LOGW("It is for just subtitle track");
-               ret = MM_ERROR_PLAYER_NO_OP;
-               goto EXIT;
        }
 
+       LOGD("current index is updated");
+
 EXIT:
+       MMPLAYER_SUBTITLE_INFO_UNLOCK(player);
        MMPLAYER_FLEAVE();
        return ret;
 }
 
-int _mmplayer_track_remove_subtitle_language(MMHandleType hplayer, int index)
+int
+_mmplayer_get_current_track(MMHandleType hplayer, mmplayer_track_type_e 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);
+       mmplayer_t *player = (mmplayer_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_INVALID_ARGUMENT);
 
-       if(!player->pipeline || !player->pipeline->mainbin[MMPLAYER_M_T_SUBMUX_EXTERNAL].gst)
-       {
-               ret = MM_ERROR_PLAYER_NOT_INITIALIZED;
-               goto EXIT;
-       }
+       attrs = MMPLAYER_GET_ATTRS(player);
+       MMPLAYER_RETURN_VAL_IF_FAIL(attrs, MM_ERROR_PLAYER_INTERNAL);
 
-       if (player->subtitle_language_list)
-       {
-               GstElement *subparse = NULL;
-               MMPlayerLangStruct *temp = NULL;
+       MMPLAYER_SUBTITLE_INFO_LOCK(player);
 
-               temp = g_list_nth_data (player->subtitle_language_list, index);
-               if (!temp)
-               {
-                       LOGE("fail to get lang from list");
-                       ret = MM_ERROR_PLAYER_INTERNAL;
-                       goto EXIT;
-               }
-               temp->active = FALSE;
+       LOGD("track type: %d", type);
 
-               subparse = player->pipeline->mainbin[MMPLAYER_M_T_SUBMUX_EXTERNAL].gst;
-               LOGD("removing to language %s", temp->language_code);
-               g_object_set (G_OBJECT (subparse), "current-language", temp->language_key, NULL);
-               g_object_set (G_OBJECT (subparse), "lang-list", player->subtitle_language_list, NULL);
+       *index = INVALID_TRACK_INDEX;
 
-               _mmplayer_sync_subtitle_pipeline(player);
-       }
-       else
-       {
-               LOGW("It is for just subtitle track");
-               ret = MM_ERROR_PLAYER_NO_OP;
-               goto EXIT;
-       }
-
-EXIT:
-       MMPLAYER_FLEAVE();
-       return ret;
-}
-#endif
-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);
-       MMPLAYER_FENTER();
-
-       if (type >= MM_PLAYER_TRACK_TYPE_MAX)
-       {
-               ret = MM_ERROR_INVALID_ARGUMENT;
-               LOGD("Not a proper type [type:%d] \n", type);
-               goto EXIT;
-       }
-
-       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;
-
-               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->track[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)
-                       {
-                               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--;
-               }
-       }
-       else
-       {
-               if (player->selector[type].total_track_num <= 0)
-               {
+               *index = player->track[MM_PLAYER_TRACK_TYPE_AUDIO].active_track_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_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();
        return ret;
 }
 
-int _mmplayer_get_track_language_code(MMHandleType hplayer, MMPlayerTrackType type, int index, char **code)
+int
+_mmplayer_get_track_language_code(MMHandleType hplayer, mmplayer_track_type_e type, int index, char **code)
 {
        int ret = MM_ERROR_NONE;
+       mmplayer_t *player = (mmplayer_t *)hplayer;
+       gchar *lang_code = NULL;
 
-       MMPLAYER_RETURN_VAL_IF_FAIL(hplayer, 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);
+       MMPLAYER_RETURN_VAL_IF_FAIL(code, MM_ERROR_INVALID_ARGUMENT);
 
-       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;
+       MMPLAYER_SUBTITLE_INFO_LOCK(player);
 
-               *code = (char*)malloc(language_code_size * sizeof(char));
-               if (*code == NULL)
-               {
-                       ret = MM_ERROR_PLAYER_INTERNAL;
-                       goto EXIT;
-               }
-               memset(*code, 0, language_code_size * sizeof(char));
+       if (type == MM_PLAYER_TRACK_TYPE_TEXT && player->subtitle_language_list) { /* external subtitle */
+               mmplayer_lang_info_t *language_list = NULL;
 
-               language_list = g_list_nth_data (player->subtitle_language_list, index);
-               if (language_list == NULL)
-               {
-                       LOGD ("%d is not a proper index \n", index);
+               lang_code = (gchar *)g_malloc0(LANGUAGE_CODE_SIZE * sizeof(char));
+
+               language_list = g_list_nth_data(player->subtitle_language_list, index);
+               if (language_list == NULL) {
+                       LOGE("invalid index %d", index);
+                       ret = MM_ERROR_INVALID_ARGUMENT;
                        goto EXIT;
                }
-               strncpy(*code, language_list->language_code, language_code_size);
-       }
-       else
-       {
-               if (player->selector[type].total_track_num <= 0)
-               {
+               g_strlcpy(lang_code, language_list->language_code, LANGUAGE_CODE_SIZE);
+       } else { /* audio or internal subtitle */
+               if (player->track[type].total_track_num <= 0) {
+                       LOGW("language list is not available. [type:%d]", type);
                        ret = MM_ERROR_PLAYER_NO_OP;
-                       LOGD("language list is not available. [type:%d] \n", type);
                        goto EXIT;
                }
 
-               if(index < 0 || index >= player->selector[type].total_track_num)
-               {
-                       ret = MM_ERROR_INVALID_ARGUMENT;
-                       LOGD("Not a proper index : %d \n", index);
-                       goto EXIT;
-               }
-
-               ret = __mmplayer_track_get_language(player, type, index, code);
+               ret = __mmplayer_track_get_language(player, type, index, &lang_code);
        }
 
 EXIT:
+       MMPLAYER_SUBTITLE_INFO_UNLOCK(player);
+
+       *code = NULL;
+       if (ret == MM_ERROR_NONE) {
+               if (g_strcmp0(lang_code, "und"))
+                       *code = strndup(lang_code, 2);
+               else
+                       *code = strndup("und", 3);
+       }
+       MMPLAYER_FREEIF(lang_code);
+
        MMPLAYER_FLEAVE();
        return ret;
 }
 
-void _mmplayer_track_initialize(mm_player_t* player)
+void
+_mmplayer_track_initialize(mmplayer_t *player)
 {
-       MMPlayerTrackType type = MM_PLAYER_TRACK_TYPE_AUDIO;
+       mmplayer_track_type_e type = MM_PLAYER_TRACK_TYPE_AUDIO;
 
        MMPLAYER_FENTER();
 
-       for (;type<MM_PLAYER_TRACK_TYPE_MAX ; type++)
-       {
-               /* active_pad_index is initialized when player is created or destroyed.
+       for (; type < MM_PLAYER_TRACK_TYPE_MAX ; type++) {
+               /* active_track_index is initialized when player is created or destroyed.
                   and the value can be set by calling _mmplayer_change_track_language()
                   before pipeline is created.*/
-               player->selector[type].total_track_num = 0;
-               player->selector[type].channels = g_ptr_array_new();
+               player->track[type].total_track_num = 0;
+               player->track[type].streams = g_ptr_array_new();
        }
 }
 
-void _mmplayer_track_destroy(mm_player_t* player)
+void
+_mmplayer_track_destroy(mmplayer_t *player)
 {
-       MMPlayerTrackType type = MM_PLAYER_TRACK_TYPE_AUDIO;
-       MMHandleType attrs = 0;
+       mmplayer_track_type_e type = MM_PLAYER_TRACK_TYPE_AUDIO;
        MMPLAYER_FENTER();
 
-       attrs = MMPLAYER_GET_ATTRS(player);
-       if (attrs)
-       {
-               mm_attrs_set_int_by_name(attrs, "content_audio_track_num", 0);
-               mm_attrs_set_int_by_name(attrs, "content_video_track_num", 0);
-               mm_attrs_set_int_by_name(attrs, "content_text_track_num", 0);
-
-               if (mmf_attrs_commit (attrs))
-                       LOGE("failed to commit.\n");
-       }
+       if (mm_player_set_attribute((MMHandleType)player, NULL, "content_text_track_num", 0,
+                       "current_text_track_index", INVALID_TRACK_INDEX, NULL) != MM_ERROR_NONE)
+               LOGE("failed to reset track attr");
 
-       for (;type<MM_PLAYER_TRACK_TYPE_MAX ; type++)
-       {
-               player->selector[type].active_pad_index = 0;
-               player->selector[type].total_track_num = 0;
+       for (; type < MM_PLAYER_TRACK_TYPE_MAX ; type++) {
+               player->track[type].active_track_index = 0;
+               player->track[type].total_track_num = 0;
 
-               if (player->selector[type].channels)
-                       g_ptr_array_free (player->selector[type].channels, TRUE);
-               player->selector[type].channels = NULL;
+               if (player->track[type].streams)
+                       g_ptr_array_free(player->track[type].streams, TRUE);
+               player->track[type].streams = NULL;
        }
 }
 
-void _mmplayer_track_update_info(mm_player_t* player, MMPlayerTrackType type, GstPad *sinkpad)
+void
+_mmplayer_track_update_stream(mmplayer_t *player, mmplayer_track_type_e type, void *stream)
 {
        MMPLAYER_FENTER();
 
-       player->selector[type].total_track_num++;
-       g_ptr_array_add (player->selector[type].channels, sinkpad);
+       player->track[type].total_track_num++;
+       g_ptr_array_add(player->track[type].streams, stream);
 
-       LOGD ("type:%d, total track:%d\n", type, player->selector[type].total_track_num);
+       LOGD("type: %d, track cnt: %d", type, player->track[type].total_track_num);
 }
 
-static int __mmplayer_track_get_language(mm_player_t* player, MMPlayerTrackType type, gint stream_index, gchar **code)
+void
+_mmplayer_track_update_text_attr_info(mmplayer_t *player, GstMessage *msg)
 {
-       int ret = MM_ERROR_NONE;
-
-       GstTagList *tag_list = NULL;
-       gchar* tag = NULL;
-       GstPad *sinkpad = NULL;
-       gint language_code_size = 3; /*Size of ISO-639-1*/
+        const GValue *lang_list = NULL;
+        mmplayer_lang_info_t *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);
+
+       if (!gst_message_get_structure(msg)) {
+               LOGE("failed to get msg structure");
+               return;
+       }
 
-       MMPLAYER_FENTER();
+       lang_list = gst_structure_get_value(gst_message_get_structure(msg), "lang_list");
+       if (!lang_list) {
+               LOGW("language list is null");
+               return;
+       }
 
-       *code = (char *)malloc(language_code_size*sizeof(char));
-       if(*code == NULL)
-       {
-               ret = MM_ERROR_PLAYER_INTERNAL;
-               goto EXIT;
+       track_count = g_list_length((GList *)g_value_get_pointer(lang_list));
+       if (track_count == 0) {
+               LOGW("track count is zero");
+               return;
        }
-       memset(*code,0,language_code_size*sizeof(char));
 
-       LOGD ("total track num : %d , req idx : %d\n", player->selector[type].total_track_num, stream_index);
+       MMPLAYER_SUBTITLE_INFO_LOCK(player);
+       player->subtitle_language_list = (GList *)g_value_get_pointer(lang_list);
+       mm_player_set_attribute((MMHandleType)player, NULL,
+                       "content_text_track_num", (gint)track_count, NULL);
+       g_object_get(G_OBJECT(msg->src), "current-language", &current_lang, NULL);
 
-       if (stream_index < player->selector[type].total_track_num)
-       {
-               sinkpad = g_ptr_array_index (player->selector[type].channels, stream_index);
-       }
-       else
-       {
-               ret = MM_ERROR_INVALID_ARGUMENT;
+       LOGI("track count: %d, current track lang: %s", track_count, current_lang);
+       if (!current_lang)
                goto EXIT;
-       }
-
-       g_object_get (sinkpad, "tags", &tag_list, NULL);
-       //SECURE_LOGD ("[%s]\n", gst_tag_list_to_string(tag_list));
 
-       gst_tag_list_get_string (tag_list, GST_TAG_LANGUAGE_CODE, &tag);
+       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(!tag)
-       {
-               LOGD("there is no lang info - und\n");
-               strncpy(*code, "und", language_code_size);
-       }
-       else
-       {
-               LOGD("language information[%d] code: %s, len: %d \n", type, tag, strlen(tag));
-               strncpy(*code, tag, /*strlen(tag)*/language_code_size);
-               g_free (tag);
+                       if (!g_strcmp0(temp->language_key, current_lang)) {
+                               LOGD("current track index : %d", index);
+                               track_index = index;
+                               break;
+                       }
+               }
        }
 
-       if (tag_list)
-               gst_tag_list_free (tag_list);
+       if (track_index > INVALID_TRACK_INDEX)
+               mm_player_set_attribute((MMHandleType)player, NULL,
+                               "current_text_track_index", track_index, NULL);
+       else
+               LOGE("failed to find current track index");
 
 EXIT:
+       MMPLAYER_SUBTITLE_INFO_SIGNAL(player);
+       MMPLAYER_SUBTITLE_INFO_UNLOCK(player);
+
        MMPLAYER_FLEAVE();
-       return ret;
 }
-#ifdef _MULTI_TRACK
-int _mmplayer_track_foreach_selected_subtitle_language(MMHandleType hplayer,_mmplayer_track_selected_subtitle_language_cb foreach_cb, void *user_data)
-{
-       int ret = MM_ERROR_NONE;
-       mm_player_t* player = (mm_player_t*) hplayer;
-       MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
-       MMPLAYER_FENTER();
 
-       int index = -1;
-
-       if (player->subtitle_language_list)
-       {
-               int total_track_count = 0;
-               MMPlayerLangStruct *temp = NULL;
-               MMHandleType attrs = 0;
+static int
+__mmplayer_track_get_language(mmplayer_t *player, mmplayer_track_type_e type, gint stream_index, gchar **code)
+{
+       GstTagList *tag_list = NULL;
+       gchar *tag = NULL;
 
-               attrs = MMPLAYER_GET_ATTRS(player);
-               if (!attrs)
-               {
-                       LOGE("cannot get content attribute");
-                       ret = MM_ERROR_PLAYER_INTERNAL;
-                       goto EXIT;
-               }
-               mm_attrs_get_int_by_name(attrs, "content_text_track_num", &total_track_count);
+       MMPLAYER_FENTER();
+       MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
+       MMPLAYER_RETURN_VAL_IF_FAIL((code && (stream_index >= 0) &&
+               (stream_index < player->track[type].total_track_num)), MM_ERROR_INVALID_ARGUMENT);
 
-               if(!total_track_count)
-               {
-                       LOGW("There are no subtitle track selected.");
-                       ret = MM_ERROR_PLAYER_NO_OP;
-                       goto EXIT;
-               }
+       LOGD("type: %d, track count: %d, input idx: %d", type, player->track[type].total_track_num, stream_index);
 
-               while (total_track_count)
-               {
-                       temp = g_list_nth_data (player->subtitle_language_list, total_track_count - 1);
-                       if (temp)
-                       {
-                               LOGD("find the list");
-                               if (temp->active)
-                               {
-                                       index = total_track_count - 1;
-                                       LOGD("active subtitle track index is %d", index);
-                                       if (!foreach_cb(index, user_data))
-                                       {
-                                               ret = MM_ERROR_PLAYER_INTERNAL;
-                                               goto CALLBACK_ERROR;
-                                       }
-                               }
-                       }
-                       total_track_count--;
-               }
+       *code = (gchar *)g_malloc0(LANGUAGE_CODE_SIZE * sizeof(char));
 
-               LOGD("we will return -1 for notifying the end to user");
+       if (MMPLAYER_USE_DECODEBIN(player)) {
+               GstPad *sinkpad = g_ptr_array_index(player->track[type].streams, stream_index);
+               g_object_get(sinkpad, "tags", &tag_list, NULL);
+       } else {
+               GstStream *stream = g_ptr_array_index(player->track[type].streams, stream_index);
+               tag_list = gst_stream_get_tags (stream);
+       }
 
-               /* After returning all selected indexs, we will return -1 for notifying the end to user */
-               if (!foreach_cb(-1, user_data))
-               {
-                       ret = MM_ERROR_PLAYER_INTERNAL;
-                       goto CALLBACK_ERROR;
-               }
+       if (tag_list)
+               gst_tag_list_get_string(tag_list, GST_TAG_LANGUAGE_CODE, &tag);
+
+       if (tag) {
+               LOGD("language code: %s, len: %zu", tag, strlen(tag));
+               g_strlcpy(*code, tag, LANGUAGE_CODE_SIZE);
+               MMPLAYER_FREEIF(tag);
+       } else {
+               LOGD("no language code info - und");
+               g_strlcpy(*code, "und", LANGUAGE_CODE_SIZE);
        }
 
-CALLBACK_ERROR:
-       LOGE("foreach callback returned error");
+       if (tag_list)
+               gst_tag_list_unref(tag_list);
 
-EXIT:
        MMPLAYER_FLEAVE();
-       return ret;
-
-
+       return MM_ERROR_NONE;
 }
-#endif