From: Gilbok Lee Date: Thu, 15 Nov 2018 02:56:43 +0000 (+0900) Subject: [0.6.148] resolve transform gsterror complexity issue X-Git-Tag: submit/tizen/20181123.080458~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=792818c02740261ca85ec4bfe06da1e392ab2ed2;p=platform%2Fcore%2Fmultimedia%2Flibmm-player.git [0.6.148] resolve transform gsterror complexity issue - Divided the __mmplayer_gst_transform_gsterror function. Change-Id: Ib9982f56dc0148d918de5a5cdbe633299018ce8f --- diff --git a/packaging/libmm-player.spec b/packaging/libmm-player.spec index 4f563ae..ee0cf7a 100644 --- a/packaging/libmm-player.spec +++ b/packaging/libmm-player.spec @@ -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 diff --git a/src/mm_player_gst.c b/src/mm_player_gst.c index d8545a3..c44fd63 100644 --- a/src/mm_player_gst.c +++ b/src/mm_player_gst.c @@ -82,14 +82,125 @@ | | ========================================================================================== */ +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 gchar* klass = 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