#include "mm_player_priv.h"
#include "mm_player_attrs.h"
#include "mm_player_utils.h"
+#include "mm_player_tracks.h"
/*===========================================================================================
| |
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;
}
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")) {
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);
}
if (mm_attrs_commit_all(attrs))
- LOGE("failed to commit.\n");
+ LOGE("failed to commit.");
}
MMPLAYER_FLEAVE();
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;
#include "mm_player_utils.h"
#include "mm_player_tracks.h"
+#define INVALID_TRACK_INDEX -1
+
/*---------------------------------------------------------------------------------------
| LOCAL FUNCTION PROTOTYPES: |
---------------------------------------------------------------------------------------*/
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);
} 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();
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();
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++) {
}
}
-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();
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;
}
if (tag_list)
- gst_tag_list_free(tag_list);
+ gst_tag_list_unref(tag_list);
EXIT:
MMPLAYER_FLEAVE();