* limitations under the License.
*
*/
-#include <mm_debug.h>
+#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 INVALID_TRACK_INDEX -1
+#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 */
- return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
- return_val_if_fail(count, MM_ERROR_COMMON_INVALID_ARGUMENT);
- 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(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
+ 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 )
- {
- debug_error("cannot get content attribute");
+ 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;
}
- debug_log ("%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;
- 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);
+ MMPLAYER_SUBTITLE_INFO_LOCK(player);
- if (type == MM_PLAYER_TRACK_TYPE_TEXT && player->subtitle_language_list)
- {
+ 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;
}
- _mmplayer_get_position (hplayer, MM_PLAYER_POS_FORMAT_TIME, &cur_time);
- temp = g_list_nth_data (player->subtitle_language_list, index);
+ num_of_list = g_list_length(player->subtitle_language_list);
+ if (index < 0 || index >= num_of_list) {
+ LOGE("req track index is wrong");
+ ret = MM_ERROR_INVALID_ARGUMENT;
+ goto EXIT;
+ }
+ 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;
- debug_log("setting to language %s", temp->language_code);
- g_object_set (G_OBJECT (subparse), "current-language", temp->language_key, NULL);
+ LOGD("setting to language %s", temp->language_code);
+ g_object_set(G_OBJECT(subparse), "current-language", temp->language_key, NULL);
_mmplayer_sync_subtitle_pipeline(player);
- }
- else
- {
- ret = _mmplayer_change_track_language (hplayer, type, index);
+ } 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;
+ }
}
-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;
- 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 (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;
+ }
}
- if (player->subtitle_language_list)
- {
- GstElement *subparse = NULL;
- MMPlayerLangStruct *temp = NULL;
-
- temp = g_list_nth_data (player->subtitle_language_list, index);
- temp->active = TRUE;
-
- subparse = player->pipeline->mainbin[MMPLAYER_M_T_SUBMUX_EXTERNAL].gst;
- debug_log("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
- {
- debug_warning("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;
- return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
- MMPLAYER_FENTER();
+ mmplayer_t *player = (mmplayer_t *)hplayer;
+ MMHandleType attrs = 0;
+ gint count = 0;
- if(!player->pipeline || !player->pipeline->mainbin[MMPLAYER_M_T_SUBMUX_EXTERNAL].gst)
- {
- ret = MM_ERROR_PLAYER_NOT_INITIALIZED;
- goto EXIT;
- }
+ 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->subtitle_language_list)
- {
- GstElement *subparse = NULL;
- MMPlayerLangStruct *temp = NULL;
+ attrs = MMPLAYER_GET_ATTRS(player);
+ MMPLAYER_RETURN_VAL_IF_FAIL(attrs, MM_ERROR_PLAYER_INTERNAL);
- temp = g_list_nth_data (player->subtitle_language_list, index);
- temp->active = FALSE;
+ MMPLAYER_SUBTITLE_INFO_LOCK(player);
- subparse = player->pipeline->mainbin[MMPLAYER_M_T_SUBMUX_EXTERNAL].gst;
- debug_log("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);
+ LOGD("track type: %d", type);
- _mmplayer_sync_subtitle_pipeline(player);
- }
- else
- {
- debug_warning("It is for just subtitle track");
- ret = MM_ERROR_PLAYER_NO_OP;
- goto EXIT;
- }
+ *index = INVALID_TRACK_INDEX;
-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;
- return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
- MMPLAYER_FENTER();
-
- if (type >= MM_PLAYER_TRACK_TYPE_MAX)
- {
- ret = MM_ERROR_INVALID_ARGUMENT;
- debug_log("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)
- {
- debug_error("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", ¤t_language, NULL);
- debug_log("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)
- {
- debug_log("find the list");
- if (!strcmp(temp->language_key, current_language))
- {
- *index = total_track_count - 1;
- debug_log("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;
- debug_log("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;
- 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)
- {
- debug_log ("%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;
- debug_log("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;
- debug_log("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))
- debug_error("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);
- debug_log ("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));
- debug_log ("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", ¤t_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_debug_log ("[%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)
- {
- debug_log("there is no lang info - und\n");
- strncpy(*code, "und", language_code_size);
- }
- else
- {
- debug_log("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;
- 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)
- {
- debug_error("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)
- {
- debug_warning("There are no subtitle track selected.");
- ret = MM_ERROR_PLAYER_NO_OP;
- goto EXIT;
- }
+ LOGD("type: %d, track count: %d, intput 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)
- {
- debug_log("find the list");
- if (temp->active)
- {
- index = total_track_count - 1;
- debug_log("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));
- debug_log("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:
- debug_error("foreach callback returned error");
+ if (tag_list)
+ gst_tag_list_unref(tag_list);
-EXIT:
MMPLAYER_FLEAVE();
- return ret;
-
-
+ return MM_ERROR_NONE;
}
-#endif