#include "mm_player_tracks.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(mm_player_t *player, MMPlayerTrackType type, gint stream_index, gchar **code);
/*=======================================================================================
=======================================================================================*/
int _mmplayer_get_track_count(MMHandleType hplayer, MMPlayerTrackType type, int *count)
{
- mm_player_t* player = (mm_player_t*) hplayer;
- MMHandleType attrs = 0;
int ret = MM_ERROR_NONE;
+ mm_player_t *player = (mm_player_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(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);
ret = mm_attrs_get_int_by_name(attrs, "content_text_track_num", count);
break;
default:
- ret = MM_ERROR_COMMON_INVALID_ARGUMENT;
+ ret = MM_ERROR_INVALID_ARGUMENT;
break;
}
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;
guint num_of_list = 0;
_mmplayer_sync_subtitle_pipeline(player);
- } else {
+ } else { /* audio or internal subtitle */
ret = _mmplayer_change_track_language(hplayer, type, index);
if (ret != MM_ERROR_NONE) {
LOGE("failed to change track");
MMPLAYER_FENTER();
MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
- MMPLAYER_RETURN_VAL_IF_FAIL(index, MM_ERROR_COMMON_INVALID_ARGUMENT);
+ MMPLAYER_RETURN_VAL_IF_FAIL(index, MM_ERROR_INVALID_ARGUMENT);
attrs = MMPLAYER_GET_ATTRS(player);
MMPLAYER_RETURN_VAL_IF_FAIL(attrs, MM_ERROR_PLAYER_INTERNAL);
break;
default:
LOGD("invalid input type");
- ret = MM_ERROR_COMMON_INVALID_ARGUMENT;
+ ret = MM_ERROR_INVALID_ARGUMENT;
goto EXIT;
}
int _mmplayer_get_track_language_code(MMHandleType hplayer, MMPlayerTrackType type, int index, char **code)
{
int ret = MM_ERROR_NONE;
+ mm_player_t *player = (mm_player_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);
MMPLAYER_SUBTITLE_INFO_LOCK(player);
- if (type == MM_PLAYER_TRACK_TYPE_TEXT && player->subtitle_language_list) {
- int language_code_size = 3;/*Size of ISO-639-1*/
+ if (type == MM_PLAYER_TRACK_TYPE_TEXT && player->subtitle_language_list) { /* external subtitle */
MMPlayerLangStruct *language_list = NULL;
- *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));
+ 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) {
- LOGD("%d is not a proper index \n", index);
+ LOGE("invalid index %d", index);
+ ret = MM_ERROR_INVALID_ARGUMENT;
goto EXIT;
}
- strncpy(*code, language_list->language_code, language_code_size);
- } else {
+ g_strlcpy(lang_code, language_list->language_code, LANGUAGE_CODE_SIZE);
+ } else { /* audio or internal subtitle */
if (player->selector[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);
+ }
+ g_free(lang_code);
+
MMPLAYER_FLEAVE();
return ret;
}
-void __mmplayer_track_initialize(mm_player_t* player)
+void __mmplayer_track_initialize(mm_player_t *player)
{
MMPlayerTrackType type = MM_PLAYER_TRACK_TYPE_AUDIO;
}
}
-void __mmplayer_track_destroy(mm_player_t* player)
+void __mmplayer_track_destroy(mm_player_t *player)
{
MMPlayerTrackType type = MM_PLAYER_TRACK_TYPE_AUDIO;
MMHandleType attrs = 0;
}
}
-void __mmplayer_track_update_selector_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();
MMPLAYER_FLEAVE();
}
-static int __mmplayer_track_get_language(mm_player_t* player, MMPlayerTrackType type, gint stream_index, gchar **code)
+static int __mmplayer_track_get_language(mm_player_t *player, MMPlayerTrackType type, gint stream_index, gchar **code)
{
- int ret = MM_ERROR_NONE;
-
GstTagList *tag_list = NULL;
- gchar* tag = NULL;
+ gchar *tag = NULL;
GstPad *sinkpad = NULL;
- gint language_code_size = 3; /*Size of ISO-639-1*/
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->selector[type].total_track_num)), MM_ERROR_INVALID_ARGUMENT);
- *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));
+ LOGD("type: %d, track count: %d, intput idx: %d", type, player->selector[type].total_track_num, stream_index);
- LOGD("total track num : %d , req idx : %d\n", player->selector[type].total_track_num, stream_index);
+ *code = (gchar *)g_malloc0(LANGUAGE_CODE_SIZE * sizeof(char));
- 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;
- goto EXIT;
- }
+ sinkpad = g_ptr_array_index(player->selector[type].channels, stream_index);
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);
+ if (tag_list)
+ gst_tag_list_get_string(tag_list, GST_TAG_LANGUAGE_CODE, &tag);
- if (!tag) {
- LOGD("there is no lang info - und\n");
- strncpy(*code, "und", language_code_size);
- } else {
- LOGD("language information[%d] code: %s, len: %zu", type, tag, strlen(tag));
- strncpy(*code, tag, /*strlen(tag)*/language_code_size);
+ if (tag) {
+ LOGD("language code: %s, len: %zu", tag, strlen(tag));
+ g_strlcpy(*code, tag, LANGUAGE_CODE_SIZE);
g_free(tag);
+ } else {
+ LOGD("no language code info - und");
+ g_strlcpy(*code, "und", LANGUAGE_CODE_SIZE);
}
if (tag_list)
gst_tag_list_unref(tag_list);
-EXIT:
MMPLAYER_FLEAVE();
- return ret;
+ return MM_ERROR_NONE;
}