[0.6.158] add language code error handling 83/194983/6
authorEunhae Choi <eunhae1.choi@samsung.com>
Mon, 10 Dec 2018 05:09:16 +0000 (14:09 +0900)
committerEunhae Choi <eunhae1.choi@samsung.com>
Mon, 10 Dec 2018 07:22:32 +0000 (16:22 +0900)
- release language code memory in libmm-player in case of error
  which was released at legacy_player.
- add language code converting to two letter for api return
  which was done at legacy_player.
- apply minor changes for cleanup

Change-Id: I9bc2fd2ebfbcc60d671c124abf9f3f6edfd3cb4c

packaging/libmm-player.spec
src/mm_player_tracks.c

index dd501c4..f5c607b 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-player
 Summary:    Multimedia Framework Player Library
-Version:    0.6.157
+Version:    0.6.158
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index a92e05f..9664b04 100644 (file)
 #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_tplayer, MMPlayerTrackType type, gint stream_index, gchar **code);
+static int __mmplayer_track_get_language(mm_player_t *player, MMPlayerTrackType type, gint stream_index, gchar **code);
 
 
 /*=======================================================================================
@@ -37,15 +38,15 @@ static int __mmplayer_track_get_language(mm_player_t* player, MMPlayerTrackType
 =======================================================================================*/
 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);
@@ -67,7 +68,7 @@ int _mmplayer_get_track_count(MMHandleType hplayer,  MMPlayerTrackType type, int
                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;
        }
 
@@ -90,7 +91,7 @@ int _mmplayer_select_track(MMHandleType hplayer, MMPlayerTrackType type, int ind
 
        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;
@@ -119,7 +120,7 @@ int _mmplayer_select_track(MMHandleType hplayer, MMPlayerTrackType type, int ind
 
                _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");
@@ -161,7 +162,7 @@ int _mmplayer_get_current_track(MMHandleType hplayer, MMPlayerTrackType type, in
 
        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);
@@ -194,7 +195,7 @@ int _mmplayer_get_current_track(MMHandleType hplayer, MMPlayerTrackType type, in
                break;
        default:
                LOGD("invalid input type");
-               ret = MM_ERROR_COMMON_INVALID_ARGUMENT;
+               ret = MM_ERROR_INVALID_ARGUMENT;
                goto EXIT;
        }
 
@@ -215,53 +216,54 @@ 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_tplayer)
+void __mmplayer_track_initialize(mm_player_t *player)
 {
        MMPlayerTrackType type = MM_PLAYER_TRACK_TYPE_AUDIO;
 
@@ -276,7 +278,7 @@ void __mmplayer_track_initialize(mm_player_t* player)
        }
 }
 
-void __mmplayer_track_destroy(mm_player_tplayer)
+void __mmplayer_track_destroy(mm_player_t *player)
 {
        MMPlayerTrackType type = MM_PLAYER_TRACK_TYPE_AUDIO;
        MMHandleType attrs = 0;
@@ -301,7 +303,7 @@ void __mmplayer_track_destroy(mm_player_t* player)
        }
 }
 
-void __mmplayer_track_update_selector_info(mm_player_tplayer, MMPlayerTrackType type, GstPad *sinkpad)
+void __mmplayer_track_update_selector_info(mm_player_t *player, MMPlayerTrackType type, GstPad *sinkpad)
 {
        MMPLAYER_FENTER();
 
@@ -384,51 +386,39 @@ EXIT:
        MMPLAYER_FLEAVE();
 }
 
-static int __mmplayer_track_get_language(mm_player_tplayer, 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;
-       gchartag = 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;
 }