[0.6.148] resolve transform gsterror complexity issue 34/193134/2
authorGilbok Lee <gilbok.lee@samsung.com>
Thu, 15 Nov 2018 02:56:43 +0000 (11:56 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Fri, 16 Nov 2018 04:14:21 +0000 (13:14 +0900)
- Divided the __mmplayer_gst_transform_gsterror function.

Change-Id: Ib9982f56dc0148d918de5a5cdbe633299018ce8f

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

index 4f563ae..ee0cf7a 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-player
 Summary:    Multimedia Framework Player Library
-Version:    0.6.147
+Version:    0.6.148
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index d8545a3..c44fd63 100644 (file)
 |                                                                                                                                                                                      |
 ========================================================================================== */
 
+static gboolean
+__mmplayer_check_error_posted_from_activated_track(mm_player_t *player, gchar *src_element_name)
+{
+       /* check whether the error is posted from not-activated track or not */
+       int msg_src_pos = 0;
+       gint active_pad_index = 0;
+
+       MMPLAYER_RETURN_VAL_IF_FAIL(player->pipeline->mainbin[MMPLAYER_M_A_INPUT_SELECTOR].gst, TRUE);
+
+       active_pad_index = player->selector[MM_PLAYER_TRACK_TYPE_AUDIO].active_pad_index;
+       LOGD("current  active pad index  -%d", active_pad_index);
+
+       if  (src_element_name) {
+               int idx = 0;
+
+               if (player->audio_decoders) {
+                       GList *adec = player->audio_decoders;
+                       for (; adec ; adec = g_list_next(adec)) {
+                               gchar *name = adec->data;
+
+                               LOGD("found audio decoder name  = %s", name);
+                               if (g_strrstr(name, src_element_name)) {
+                                       msg_src_pos = idx;
+                                       break;
+                               }
+                               idx++;
+                       }
+               }
+               LOGD("active pad = %d, error src index = %d", active_pad_index,  msg_src_pos);
+       }
+
+       if (active_pad_index != msg_src_pos) {
+               LOGD("skip error because error is posted from no activated track");
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+static int
+__mmplayer_gst_transform_error_decode(mm_player_t *player, const char *klass)
+{
+       /* Demuxer can't parse one track because it's corrupted.
+        * So, the decoder for it is not linked.
+        * But, it has one playable track.
+        */
+       if (g_strrstr(klass, "Demux")) {
+               if (player->can_support_codec == FOUND_PLUGIN_VIDEO) {
+                       return MM_ERROR_PLAYER_AUDIO_CODEC_NOT_FOUND;
+               } else if (player->can_support_codec == FOUND_PLUGIN_AUDIO) {
+                       return MM_ERROR_PLAYER_VIDEO_CODEC_NOT_FOUND;
+               } else {
+                       if (player->pipeline->audiobin) { // PCM
+                               return MM_ERROR_PLAYER_VIDEO_CODEC_NOT_FOUND;
+                       } else {
+                               LOGD("not found any available codec. Player should be destroyed.\n");
+                               return MM_ERROR_PLAYER_CODEC_NOT_FOUND;
+                       }
+               }
+       }
+
+       return MM_ERROR_PLAYER_INVALID_STREAM;
+}
+
+static int
+__mmplayer_gst_transform_error_type(mm_player_t *player, GstElement *src_element)
+{
+       if (src_element == player->pipeline->mainbin[MMPLAYER_M_SUBPARSE].gst) {
+               LOGE("Not supported subtitle.");
+               return MM_ERROR_PLAYER_NOT_SUPPORTED_SUBTITLE;
+       }
+       return MM_ERROR_PLAYER_NOT_SUPPORTED_FORMAT;
+}
+
+static int
+__mmplayer_gst_transform_error_failed(mm_player_t *player, const char *klass, GError *error)
+{
+       /* Decoder Custom Message */
+       if (!strstr(error->message, "ongoing"))
+               return MM_ERROR_PLAYER_NOT_SUPPORTED_FORMAT;
+
+       if (strncasecmp(klass, "audio", 5)) {
+               if ((player->can_support_codec & FOUND_PLUGIN_VIDEO)) {
+                       LOGD("Video can keep playing.\n");
+                       return MM_ERROR_PLAYER_AUDIO_CODEC_NOT_FOUND;
+               }
+       } else if (strncasecmp(klass, "video", 5)) {
+               if ((player->can_support_codec & FOUND_PLUGIN_AUDIO)) {
+                       LOGD("Audio can keep playing.\n");
+                       return MM_ERROR_PLAYER_VIDEO_CODEC_NOT_FOUND;
+               }
+       }
+
+       LOGD("not found any available codec. Player should be destroyed.\n");
+       return MM_ERROR_PLAYER_CODEC_NOT_FOUND;
+}
+
+static int
+__mmplayer_gst_transform_error_decrypt(mm_player_t *player, GError *error)
+{
+       if (strstr(error->message, "rights expired"))
+               return MM_ERROR_PLAYER_DRM_EXPIRED;
+       else if (strstr(error->message, "no rights"))
+               return MM_ERROR_PLAYER_DRM_NO_LICENSE;
+       else if (strstr(error->message, "has future rights"))
+               return MM_ERROR_PLAYER_DRM_FUTURE_USE;
+       else if (strstr(error->message, "opl violation"))
+               return MM_ERROR_PLAYER_DRM_OUTPUT_PROTECTION;
+
+       return MM_ERROR_PLAYER_DRM_NOT_AUTHORIZED;
+}
 /* NOTE : decide gstreamer state whether there is some playable track or not. */
 static gint
-__mmplayer_gst_transform_gsterror(mm_player_t* player, GstMessage * message, GError* error)
+__mmplayer_gst_transform_gsterror(mm_player_t *player, GstMessage *message, GError *error)
 {
        gchar *src_element_name = NULL;
        GstElement *src_element = NULL;
        GstElementFactory *factory = NULL;
-       const gcharklass = NULL;
+       const gchar *klass = NULL;
 
        MMPLAYER_FENTER();
 
@@ -102,128 +213,39 @@ __mmplayer_gst_transform_gsterror(mm_player_t* player, GstMessage * message, GEr
 
        src_element = GST_ELEMENT_CAST(message->src);
        if (!src_element)
-               goto INTERNAL_ERROR;
+               return MM_ERROR_PLAYER_INTERNAL;
 
        src_element_name = GST_ELEMENT_NAME(src_element);
        if (!src_element_name)
-               goto INTERNAL_ERROR;
+               return MM_ERROR_PLAYER_INTERNAL;
 
        factory = gst_element_get_factory(src_element);
        if (!factory)
-               goto INTERNAL_ERROR;
+               return MM_ERROR_PLAYER_INTERNAL;
 
        klass = gst_element_factory_get_metadata(factory, GST_ELEMENT_METADATA_KLASS);
        if (!klass)
-               goto INTERNAL_ERROR;
+               return MM_ERROR_PLAYER_INTERNAL;
 
        LOGD("error code=%d, msg=%s, src element=%s, class=%s\n",
                        error->code, error->message, src_element_name, klass);
 
-       /* check whether the error is posted from not-activated track or not */
-       if (player->pipeline->mainbin[MMPLAYER_M_A_INPUT_SELECTOR].gst) {
-               int msg_src_pos = 0;
-               gint active_pad_index = player->selector[MM_PLAYER_TRACK_TYPE_AUDIO].active_pad_index;
-               LOGD("current  active pad index  -%d", active_pad_index);
-
-               if  (src_element_name) {
-                       int idx = 0;
-
-                       if (player->audio_decoders) {
-                               GList *adec = player->audio_decoders;
-                               for (; adec ; adec = g_list_next(adec)) {
-                                       gchar *name = adec->data;
-
-                                       LOGD("found audio decoder name  = %s", name);
-                                       if (g_strrstr(name, src_element_name)) {
-                                               msg_src_pos = idx;
-                                               break;
-                                       }
-                                       idx++;
-                               }
-                       }
-                       LOGD("active pad = %d, error src index = %d", active_pad_index,  msg_src_pos);
-               }
-
-               if (active_pad_index != msg_src_pos) {
-                       LOGD("skip error because error is posted from no activated track");
-                       return MM_ERROR_NONE;
-               }
-       }
+       if (!__mmplayer_check_error_posted_from_activated_track(player, src_element_name))
+               return MM_ERROR_NONE;
 
        switch (error->code) {
        case GST_STREAM_ERROR_DECODE:
-       {
-               /* Demuxer can't parse one track because it's corrupted.
-                * So, the decoder for it is not linked.
-                * But, it has one playable track.
-                */
-               if (g_strrstr(klass, "Demux")) {
-                       if (player->can_support_codec == FOUND_PLUGIN_VIDEO) {
-                               return MM_ERROR_PLAYER_AUDIO_CODEC_NOT_FOUND;
-                       } else if (player->can_support_codec == FOUND_PLUGIN_AUDIO) {
-                               return MM_ERROR_PLAYER_VIDEO_CODEC_NOT_FOUND;
-                       } else {
-                               if (player->pipeline->audiobin) // PCM
-                                       return MM_ERROR_PLAYER_VIDEO_CODEC_NOT_FOUND;
-                               else
-                                       goto CODEC_NOT_FOUND;
-                       }
-               }
-               return MM_ERROR_PLAYER_INVALID_STREAM;
-       }
-               break;
-
+               return __mmplayer_gst_transform_error_decode(player, klass);
        case GST_STREAM_ERROR_CODEC_NOT_FOUND:
        case GST_STREAM_ERROR_TYPE_NOT_FOUND:
        case GST_STREAM_ERROR_WRONG_TYPE:
-       {
-               if (src_element == player->pipeline->mainbin[MMPLAYER_M_SUBPARSE].gst) {
-                       LOGE("Not supported subtitle.");
-                       return MM_ERROR_PLAYER_NOT_SUPPORTED_SUBTITLE;
-               }
-               return MM_ERROR_PLAYER_NOT_SUPPORTED_FORMAT;
-       }
-
+               return __mmplayer_gst_transform_error_type(player, src_element);
        case GST_STREAM_ERROR_FAILED:
-       {
-               /* Decoder Custom Message */
-               if (strstr(error->message, "ongoing")) {
-                       if (strncasecmp(klass, "audio", 5)) {
-                               if ((player->can_support_codec & FOUND_PLUGIN_VIDEO)) {
-                                       LOGD("Video can keep playing.\n");
-                                       return MM_ERROR_PLAYER_AUDIO_CODEC_NOT_FOUND;
-                               } else
-                                       goto CODEC_NOT_FOUND;
-
-                       } else if (strncasecmp(klass, "video", 5)) {
-                               if ((player->can_support_codec & FOUND_PLUGIN_AUDIO)) {
-                                       LOGD("Audio can keep playing.\n");
-                                       return MM_ERROR_PLAYER_VIDEO_CODEC_NOT_FOUND;
-                               } else
-                                       goto CODEC_NOT_FOUND;
-                       }
-               }
-               return MM_ERROR_PLAYER_NOT_SUPPORTED_FORMAT;
-       }
-               break;
-
+               return __mmplayer_gst_transform_error_failed(player, klass, error);
        case GST_STREAM_ERROR_DECRYPT:
        case GST_STREAM_ERROR_DECRYPT_NOKEY:
-       {
                LOGE("decryption error, [%s] failed, reason : [%s]\n", src_element_name, error->message);
-
-               if (strstr(error->message, "rights expired"))
-                       return MM_ERROR_PLAYER_DRM_EXPIRED;
-               else if (strstr(error->message, "no rights"))
-                       return MM_ERROR_PLAYER_DRM_NO_LICENSE;
-               else if (strstr(error->message, "has future rights"))
-                       return MM_ERROR_PLAYER_DRM_FUTURE_USE;
-               else if (strstr(error->message, "opl violation"))
-                       return MM_ERROR_PLAYER_DRM_OUTPUT_PROTECTION;
-               return MM_ERROR_PLAYER_DRM_NOT_AUTHORIZED;
-       }
-               break;
-
+               return __mmplayer_gst_transform_error_decrypt(player, error);
        default:
                break;
        }
@@ -231,13 +253,6 @@ __mmplayer_gst_transform_gsterror(mm_player_t* player, GstMessage * message, GEr
        MMPLAYER_FLEAVE();
 
        return MM_ERROR_PLAYER_INVALID_STREAM;
-
-INTERNAL_ERROR:
-       return MM_ERROR_PLAYER_INTERNAL;
-
-CODEC_NOT_FOUND:
-       LOGD("not found any available codec. Player should be destroyed.\n");
-       return MM_ERROR_PLAYER_CODEC_NOT_FOUND;
 }
 
 gint