[0.6.219] Fix g_mutex_clear crash when destroying bus msg thread
[platform/core/multimedia/libmm-player.git] / src / mm_player_gst.c
index 03411a7..7978600 100644 (file)
@@ -243,9 +243,6 @@ __mmplayer_gst_transform_gsterror(mmplayer_t *player, GstMessage *message, GErro
                                                                player->pipeline->mainbin, MM_ERROR_PLAYER_NOT_INITIALIZED);
 
        src_element = GST_ELEMENT_CAST(message->src);
-       if (!src_element)
-               return MM_ERROR_PLAYER_INTERNAL;
-
        src_element_name = GST_ELEMENT_NAME(src_element);
        if (!src_element_name)
                return MM_ERROR_PLAYER_INTERNAL;
@@ -687,7 +684,7 @@ __mmplayer_handle_streaming_error(mmplayer_t *player, GstMessage *message)
        if (message->src) {
                msg_src_element = GST_ELEMENT_NAME(GST_ELEMENT_CAST(message->src));
 
-               LOGE("-Msg src : [%s] Code : [%x] Error : [%s]",
+               LOGE("-Msg src : [%s] Code : [0x%x] Error : [%s]",
                        msg_src_element, msg_param.code, (char *)msg_param.data);
        }
 
@@ -746,7 +743,7 @@ __mmplayer_gst_extract_tag_from_msg(mmplayer_t *player, GstMessage *msg)
 {
 
 /* macro for better code readability */
-#define MMPLAYER_UPDATE_TAG_STRING(gsttag, attribute, playertag) \
+#define MMPLAYER_UPDATE_TAG_STRING(gsttag, player, playertag) \
        do { \
                if (gst_tag_list_get_string(tag_list, gsttag, &string)) {\
                        if (string != NULL) { \
@@ -755,17 +752,19 @@ __mmplayer_gst_extract_tag_from_msg(mmplayer_t *player, GstMessage *msg)
                                        char *new_string = g_malloc(MM_MAX_STRING_LENGTH); \
                                        strncpy(new_string, string, MM_MAX_STRING_LENGTH - 1); \
                                        new_string[MM_MAX_STRING_LENGTH - 1] = '\0'; \
-                                       mm_attrs_set_string_by_name(attribute, playertag, new_string); \
+                                       mm_player_set_attribute((MMHandleType)player, NULL,\
+                                                       playertag, new_string, strlen(new_string), NULL); \
                                        MMPLAYER_FREEIF(new_string); \
                                } else { \
-                                       mm_attrs_set_string_by_name(attribute, playertag, string); \
+                                       mm_player_set_attribute((MMHandleType)player, NULL,\
+                                                       playertag, string, strlen(string), NULL); \
                                } \
                                MMPLAYER_FREEIF(string); \
                        } \
                } \
        } while (0)
 
-#define MMPLAYER_UPDATE_TAG_IMAGE(gsttag, attribute, playertag) \
+#define MMPLAYER_UPDATE_TAG_IMAGE(gsttag, player, playertag) \
        do {    \
                GstSample *sample = NULL;\
                if (gst_tag_list_get_sample_index(tag_list, gsttag, index, &sample)) {\
@@ -781,7 +780,8 @@ __mmplayer_gst_extract_tag_from_msg(mmplayer_t *player, GstMessage *msg)
                        player->album_art = (gchar *)g_malloc(info.size);\
                        if (player->album_art) {\
                                memcpy(player->album_art, info.data, info.size);\
-                               mm_attrs_set_data_by_name(attribute, playertag, (void *)player->album_art, info.size);\
+                               mm_player_set_attribute((MMHandleType)player, NULL,\
+                                               playertag, (void *)player->album_art, info.size, NULL); \
                                if (MMPLAYER_IS_HTTP_LIVE_STREAMING(player)) {\
                                        msg_param.data = (void *)player->album_art;\
                                        msg_param.size = info.size;\
@@ -794,7 +794,7 @@ __mmplayer_gst_extract_tag_from_msg(mmplayer_t *player, GstMessage *msg)
                }       \
        } while (0)
 
-#define MMPLAYER_UPDATE_TAG_UINT(gsttag, attribute, playertag) \
+#define MMPLAYER_UPDATE_TAG_UINT(gsttag, player, playertag) \
        do {    \
                if (gst_tag_list_get_uint(tag_list, gsttag, &v_uint)) { \
                        if (v_uint) { \
@@ -808,34 +808,38 @@ __mmplayer_gst_extract_tag_from_msg(mmplayer_t *player, GstMessage *msg)
                                        track_type = MM_PLAYER_TRACK_TYPE_TEXT; \
                                if (!strncmp(gsttag, GST_TAG_BITRATE, strlen(GST_TAG_BITRATE))) { \
                                        if (track_type == MM_PLAYER_TRACK_TYPE_AUDIO) \
-                                               mm_attrs_set_int_by_name(attribute, "content_audio_bitrate", v_uint); \
+                                               mm_player_set_attribute((MMHandleType)player, NULL,\
+                                                               "content_audio_bitrate", v_uint, NULL); \
                                        player->bitrate[track_type] = v_uint; \
                                        player->total_bitrate = 0; \
                                        for (i = 0; i < MM_PLAYER_STREAM_COUNT_MAX; i++) \
                                                player->total_bitrate += player->bitrate[i]; \
-                                       mm_attrs_set_int_by_name(attribute, playertag, player->total_bitrate); \
+                                       mm_player_set_attribute((MMHandleType)player, NULL,\
+                                                       playertag, player->total_bitrate, NULL); \
                                        SECURE_LOGD("update bitrate %d[bps] of stream #%d.", v_uint, (int)track_type); \
                                } else if (!strncmp(gsttag, GST_TAG_MAXIMUM_BITRATE, strlen(GST_TAG_MAXIMUM_BITRATE))) { \
                                        player->maximum_bitrate[track_type] = v_uint; \
                                        player->total_maximum_bitrate = 0; \
                                        for (i = 0; i < MM_PLAYER_STREAM_COUNT_MAX; i++) \
                                                player->total_maximum_bitrate += player->maximum_bitrate[i]; \
-                                       mm_attrs_set_int_by_name(attribute, playertag, player->total_maximum_bitrate);\
+                                       mm_player_set_attribute((MMHandleType)player, NULL,\
+                                                       playertag, player->total_maximum_bitrate, NULL); \
                                        SECURE_LOGD("update maximum bitrate %d[bps] of stream #%d", v_uint, (int)track_type);\
                                } else { \
-                                       mm_attrs_set_int_by_name(attribute, playertag, v_uint); \
+                                       mm_player_set_attribute((MMHandleType)player, NULL, playertag, v_uint, NULL); \
                                } \
                                v_uint = 0;\
                        } \
                } \
        } while (0)
 
-#define MMPLAYER_UPDATE_TAG_DATE(gsttag, attribute, playertag) \
+#define MMPLAYER_UPDATE_TAG_DATE(gsttag, player, playertag) \
        do { \
                if (gst_tag_list_get_date(tag_list, gsttag, &date)) {\
                        if (date != NULL) {\
                                string = g_strdup_printf("%d", g_date_get_year(date));\
-                               mm_attrs_set_string_by_name(attribute, playertag, string);\
+                               mm_player_set_attribute((MMHandleType)player, NULL,\
+                                               playertag, string, strlen(string), NULL); \
                                SECURE_LOGD("metainfo year : %s", string);\
                                MMPLAYER_FREEIF(string);\
                                g_date_free(date);\
@@ -843,12 +847,13 @@ __mmplayer_gst_extract_tag_from_msg(mmplayer_t *player, GstMessage *msg)
                } \
        } while (0)
 
-#define MMPLAYER_UPDATE_TAG_DATE_TIME(gsttag, attribute, playertag) \
+#define MMPLAYER_UPDATE_TAG_DATE_TIME(gsttag, player, playertag) \
        do { \
                if (gst_tag_list_get_date_time(tag_list, gsttag, &datetime)) {\
                        if (datetime != NULL) {\
                                string = g_strdup_printf("%d", gst_date_time_get_year(datetime));\
-                               mm_attrs_set_string_by_name(attribute, playertag, string);\
+                               mm_player_set_attribute((MMHandleType)player, NULL,\
+                                               playertag, string, strlen(string), NULL); \
                                SECURE_LOGD("metainfo year : %s", string);\
                                MMPLAYER_FREEIF(string);\
                                gst_date_time_unref(datetime);\
@@ -856,33 +861,9 @@ __mmplayer_gst_extract_tag_from_msg(mmplayer_t *player, GstMessage *msg)
                } \
        } while (0)
 
-#define MMPLAYER_UPDATE_TAG_UINT64(gsttag, attribute, playertag) \
-       do { \
-               if (gst_tag_list_get_uint64(tag_list, gsttag, &v_uint64)) {\
-                       if (v_uint64) {\
-                               /* FIXIT : don't know how to store date */\
-                               g_assert(1);\
-                               v_uint64 = 0;\
-                       } \
-               } \
-       } while (0)
-
-#define MMPLAYER_UPDATE_TAG_DOUBLE(gsttag, attribute, playertag) \
-       do { \
-               if (gst_tag_list_get_double(tag_list, gsttag, &v_double)) {\
-                       if (v_double) {\
-                               /* FIXIT : don't know how to store date */\
-                               g_assert(1);\
-                               v_double = 0;\
-                       } \
-               } \
-       } while (0)
-
        /* function start */
        GstTagList *tag_list = NULL;
 
-       MMHandleType attrs = 0;
-
        char *string = NULL;
        guint v_uint = 0;
        GDate *date = NULL;
@@ -898,69 +879,34 @@ __mmplayer_gst_extract_tag_from_msg(mmplayer_t *player, GstMessage *msg)
 
        MMPLAYER_RETURN_VAL_IF_FAIL(player && msg, FALSE);
 
-       attrs = MMPLAYER_GET_ATTRS(player);
-
-       MMPLAYER_RETURN_VAL_IF_FAIL(attrs, FALSE);
-
        /* get tag list from gst message */
        gst_message_parse_tag(msg, &tag_list);
 
        /* store tags to player attributes */
-       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_TITLE, attrs, "tag_title");
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_TITLE_SORTNAME, ?, ?); */
-       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_ARTIST, attrs, "tag_artist");
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_ARTIST_SORTNAME, ?, ?); */
-       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_ALBUM, attrs, "tag_album");
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_ALBUM_SORTNAME, ?, ?); */
-       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_COMPOSER, attrs, "tag_author");
-       MMPLAYER_UPDATE_TAG_DATE(GST_TAG_DATE, attrs, "tag_date");
-       MMPLAYER_UPDATE_TAG_DATE_TIME(GST_TAG_DATE_TIME, attrs, "tag_date");
-       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_GENRE, attrs, "tag_genre");
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_COMMENT, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_EXTENDED_COMMENT, ?, ?); */
-       MMPLAYER_UPDATE_TAG_UINT(GST_TAG_TRACK_NUMBER, attrs, "tag_track_num");
-       /* MMPLAYER_UPDATE_TAG_UINT(GST_TAG_TRACK_COUNT, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_UINT(GST_TAG_ALBUM_VOLUME_NUMBER, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_UINT(GST_TAG_ALBUM_VOLUME_COUNT, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_LOCATION, ?, ?); */
-       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_DESCRIPTION, attrs, "tag_description");
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_VERSION, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_ISRC, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_ORGANIZATION, ?, ?); */
-       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_COPYRIGHT, attrs, "tag_copyright");
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_COPYRIGHT_URI, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_CONTACT, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_LICENSE, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_LICENSE_URI, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_PERFORMER, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_UINT64(GST_TAG_DURATION, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_CODEC, ?, ?); */
-       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_VIDEO_CODEC, attrs, "content_video_codec");
-       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_AUDIO_CODEC, attrs, "content_audio_codec");
-       MMPLAYER_UPDATE_TAG_UINT(GST_TAG_BITRATE, attrs, "content_bitrate");
-       MMPLAYER_UPDATE_TAG_UINT(GST_TAG_MAXIMUM_BITRATE, attrs, "content_max_bitrate");
+       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_TITLE, player, "tag_title");
+       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_ARTIST, player, "tag_artist");
+       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_ALBUM, player, "tag_album");
+       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_COMPOSER, player, "tag_author");
+       MMPLAYER_UPDATE_TAG_DATE(GST_TAG_DATE, player, "tag_date");
+       MMPLAYER_UPDATE_TAG_DATE_TIME(GST_TAG_DATE_TIME, player, "tag_date");
+       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_GENRE, player, "tag_genre");
+       MMPLAYER_UPDATE_TAG_UINT(GST_TAG_TRACK_NUMBER, player, "tag_track_num");
+       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_DESCRIPTION, player, "tag_description");
+       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_COPYRIGHT, player, "tag_copyright");
+       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_VIDEO_CODEC, player, "content_video_codec");
+       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_AUDIO_CODEC, player, "content_audio_codec");
+       MMPLAYER_UPDATE_TAG_UINT(GST_TAG_BITRATE, player, "content_bitrate");
+       MMPLAYER_UPDATE_TAG_UINT(GST_TAG_MAXIMUM_BITRATE, player, "content_max_bitrate");
        MMPLAYER_UPDATE_TAG_LOCK(player);
-       MMPLAYER_UPDATE_TAG_IMAGE(GST_TAG_IMAGE, attrs, "tag_album_cover");
+       MMPLAYER_UPDATE_TAG_IMAGE(GST_TAG_IMAGE, player, "tag_album_cover");
        MMPLAYER_UPDATE_TAG_UNLOCK(player);
-       /* MMPLAYER_UPDATE_TAG_UINT(GST_TAG_NOMINAL_BITRATE, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_UINT(GST_TAG_MINIMUM_BITRATE, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_UINT(GST_TAG_SERIAL, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_ENCODER, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_UINT(GST_TAG_ENCODER_VERSION, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_DOUBLE(GST_TAG_TRACK_GAIN, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_DOUBLE(GST_TAG_TRACK_PEAK, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_DOUBLE(GST_TAG_ALBUM_GAIN, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_DOUBLE(GST_TAG_ALBUM_PEAK, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_DOUBLE(GST_TAG_REFERENCE_LEVEL, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_STRING(GST_TAG_LANGUAGE_CODE, ?, ?); */
-       /* MMPLAYER_UPDATE_TAG_DOUBLE(GST_TAG_BEATS_PER_MINUTE, ?, ?); */
-       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_IMAGE_ORIENTATION, attrs, "content_video_orientation");
+       MMPLAYER_UPDATE_TAG_STRING(GST_TAG_IMAGE_ORIENTATION, player, "content_video_orientation");
 
        if (strstr(GST_OBJECT_NAME(msg->src), "demux")) {
                if (player->video360_metadata.is_spherical == -1) {
                        __mmplayer_get_metadata_360_from_tags(tag_list, &player->video360_metadata);
-                       mm_attrs_set_int_by_name(attrs, "content_video_is_spherical",
-                                       player->video360_metadata.is_spherical);
+                       mm_player_set_attribute((MMHandleType)player, NULL,
+                                       "content_video_is_spherical", player->video360_metadata.is_spherical, NULL);
                        if (player->video360_metadata.is_spherical == 1) {
                                LOGD("This is spherical content for 360 playback.");
                                player->is_content_spherical = TRUE;
@@ -993,9 +939,6 @@ __mmplayer_gst_extract_tag_from_msg(mmplayer_t *player, GstMessage *msg)
                }
        }
 
-       if (mm_attrs_commit_all(attrs))
-               LOGE("failed to commit.");
-
        gst_tag_list_unref(tag_list);
 
        return TRUE;
@@ -1774,17 +1717,10 @@ __mmplayer_gst_handle_element_message(mmplayer_t *player, GstMessage *msg)
 {
        const gchar *structure_name;
        gint count = 0, idx = 0;
-       MMHandleType attrs = 0;
 
        MMPLAYER_FENTER();
        MMPLAYER_RETURN_IF_FAIL(player && player->pipeline && player->pipeline->mainbin);
 
-       attrs = MMPLAYER_GET_ATTRS(player);
-       if (!attrs) {
-               LOGE("Failed to get content attribute");
-               return;
-       }
-
        if (gst_message_get_structure(msg) == NULL)
                return;
 
@@ -1827,12 +1763,14 @@ __mmplayer_gst_handle_element_message(mmplayer_t *player, GstMessage *msg)
 
                if (gst_structure_get_int(gst_message_get_structure(msg), "num_buffers", &num_buffers)) {
                        LOGD("video_num_buffers : %d", num_buffers);
-                       mm_attrs_set_int_by_name(player->attrs, MM_PLAYER_VIDEO_BUFFER_TOTAL_SIZE, num_buffers);
+                       mm_player_set_attribute((MMHandleType)player, NULL,
+                                       MM_PLAYER_VIDEO_BUFFER_TOTAL_SIZE, num_buffers, NULL);
                }
 
                if (gst_structure_get_int(gst_message_get_structure(msg), "extra_num_buffers", &extra_num_buffers)) {
                        LOGD("num_of_vout_extra num buffers : %d", extra_num_buffers);
-                       mm_attrs_set_int_by_name(player->attrs, MM_PLAYER_VIDEO_BUFFER_EXTRA_SIZE, extra_num_buffers);
+                       mm_player_set_attribute((MMHandleType)player, NULL,
+                                       MM_PLAYER_VIDEO_BUFFER_EXTRA_SIZE, extra_num_buffers, NULL);
                }
                return;
        }
@@ -1856,39 +1794,36 @@ __mmplayer_gst_handle_element_message(mmplayer_t *player, GstMessage *msg)
                gchar *video_codec = NULL;
                gchar *video_frame_size = NULL;
 
-               gst_structure_get(gst_message_get_structure(msg), "rtsp_duration", G_TYPE_UINT64, &player->duration, NULL);
+               gst_structure_get(gst_message_get_structure(msg),
+                                       "rtsp_duration", G_TYPE_UINT64, &player->duration, NULL);
                LOGD("rtsp duration : %"G_GINT64_FORMAT" msec", GST_TIME_AS_MSECONDS(player->duration));
                player->streaming_type = _mmplayer_get_stream_service_type(player);
 
-               gst_structure_get(gst_message_get_structure(msg), "rtsp_audio_codec", G_TYPE_STRING, &audio_codec, NULL);
+               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(attrs, "content_audio_codec", audio_codec);
+                       mm_player_set_attribute((MMHandleType)player, NULL,
+                                       "content_audio_codec", audio_codec, strlen(audio_codec), NULL);
 
-               gst_structure_get(gst_message_get_structure(msg), "rtsp_video_codec", G_TYPE_STRING, &video_codec, NULL);
+               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(attrs, "content_video_codec", video_codec);
+                       mm_player_set_attribute((MMHandleType)player, NULL,
+                                       "content_video_codec", video_codec, strlen(video_codec), NULL);
 
-               gst_structure_get(gst_message_get_structure(msg), "rtsp_video_frame_size", G_TYPE_STRING, &video_frame_size, NULL);
+               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 (video_frame_size) {
-                       char *seperator = strchr(video_frame_size, '-');
-                       if (seperator) {
-                               char video_width[10] = {0,};
-                               int frame_size_len = strlen(video_frame_size);
-                               int separtor_len = strlen(seperator);
-
-                               strncpy(video_width, video_frame_size, (frame_size_len - separtor_len));
-                               mm_attrs_set_int_by_name(attrs, MM_PLAYER_VIDEO_WIDTH, atoi(video_width));
-
-                               seperator++;
-                               mm_attrs_set_int_by_name(attrs, MM_PLAYER_VIDEO_HEIGHT, atoi(seperator));
-                       }
+                       gchar **res_str = g_strsplit(video_frame_size, "-", 0);
+                       mm_player_set_attribute((MMHandleType)player, NULL,
+                               MM_PLAYER_VIDEO_WIDTH, atoi(res_str[0]),
+                               MM_PLAYER_VIDEO_HEIGHT, atoi(res_str[1]),
+                               NULL);
+                       g_strfreev(res_str);
                }
-
-               if (mm_attrs_commit_all(attrs))
-                       LOGE("failed to commit.");
        }
 
        MMPLAYER_FLEAVE();
@@ -1978,6 +1913,7 @@ __mmplayer_gst_bus_msg_callback(GstMessage *msg, gpointer data)
                break;
 
        case GST_MESSAGE_ERROR:
+               _mmplayer_set_reconfigure_state(player, FALSE);
                __mmplayer_gst_handle_error_message(player, msg);
                break;
 
@@ -2130,6 +2066,18 @@ __mmplayer_gst_bus_sync_callback(GstBus *bus, GstMessage *message, gpointer data
        case GST_MESSAGE_DURATION_CHANGED:
                __mmplayer_gst_handle_duration(player, message);
                break;
+       case GST_MESSAGE_ELEMENT:
+               {
+                       const gchar *klass = NULL;
+                       klass = gst_element_factory_get_metadata
+                               (gst_element_get_factory((GstElement *)message->src), GST_ELEMENT_METADATA_KLASS);
+                       if (!klass || !g_strrstr(klass, "Codec/Decoder")) {
+                               reply = GST_BUS_PASS;
+                               break;
+                       }
+                       __mmplayer_gst_handle_element_message(player, message);
+               }
+               break;
        case GST_MESSAGE_ASYNC_DONE:
                /* NOTE:Don't call gst_callback directly
                 * because previous frame can be showed even though this message is received for seek.
@@ -2351,6 +2299,10 @@ __mmplayer_gst_create_es_decoder(mmplayer_t *player, mmplayer_stream_type_e type
        _mmplayer_add_signal_connection(player, G_OBJECT(decodebin), MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "autoplug-select",
                                                                                G_CALLBACK(_mmplayer_gst_decode_autoplug_select), (gpointer)player);
 
+       if (player->need_video_dec_sorting || player->need_audio_dec_sorting)
+               _mmplayer_add_signal_connection(player, G_OBJECT(decodebin), MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "autoplug-sort",
+                                                       G_CALLBACK(_mmplayer_gst_decode_autoplug_sort), (gpointer)player);
+
        /* This signal is emitted when a element is added to the bin.*/
        _mmplayer_add_signal_connection(player, G_OBJECT(decodebin), MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "element-added",
                                                                                G_CALLBACK(_mmplayer_gst_element_added), (gpointer)player);
@@ -2744,6 +2696,7 @@ __mmplayer_gst_make_http_src(mmplayer_t *player)
        MMHandleType attrs = 0;
        gchar *user_agent, *cookies, **cookie_list;
        gint http_timeout = DEFAULT_HTTP_TIMEOUT;
+
        user_agent = cookies = NULL;
        cookie_list = NULL;
 
@@ -2832,7 +2785,6 @@ __mmplayer_gst_msg_push(GstBus *bus, GstMessage *msg, gpointer data)
 
        g_return_val_if_fail(player, FALSE);
        g_return_val_if_fail(msg && GST_IS_MESSAGE(msg), FALSE);
-
        gst_message_ref(msg);
 
        g_mutex_lock(&player->bus_msg_q_lock);
@@ -2849,7 +2801,6 @@ static gpointer __mmplayer_gst_bus_msg_thread(gpointer data)
 {
        mmplayer_t *player = (mmplayer_t *)(data);
        GstMessage *msg = NULL;
-       GstBus *bus = NULL;
 
        MMPLAYER_FENTER();
        MMPLAYER_RETURN_VAL_IF_FAIL(player &&
@@ -2858,12 +2809,6 @@ static gpointer __mmplayer_gst_bus_msg_thread(gpointer data)
                                                player->pipeline->mainbin[MMPLAYER_M_PIPE].gst,
                                                NULL);
 
-       bus = gst_pipeline_get_bus(GST_PIPELINE(player->pipeline->mainbin[MMPLAYER_M_PIPE].gst));
-       if (!bus) {
-               LOGE("cannot get BUS from the pipeline");
-               return NULL;
-       }
-
        MMPLAYER_BUS_MSG_THREAD_LOCK(player);
 
        LOGD("[handle: %p] gst bus msg thread will be started.", player);
@@ -2883,9 +2828,8 @@ static gpointer __mmplayer_gst_bus_msg_thread(gpointer data)
        }
 
        MMPLAYER_BUS_MSG_THREAD_UNLOCK(player);
-       gst_object_unref(GST_OBJECT(bus));
-
        MMPLAYER_FLEAVE();
+
        return NULL;
 }
 
@@ -3730,32 +3674,24 @@ _mmplayer_gst_create_source(mmplayer_t *player)
 int
 _mmplayer_gst_build_es_pipeline(mmplayer_t *player)
 {
-       MMHandleType attrs = 0;
-
        MMPLAYER_FENTER();
        MMPLAYER_RETURN_VAL_IF_FAIL(player && player->pipeline &&
                                player->pipeline->mainbin, MM_ERROR_PLAYER_NOT_INITIALIZED);
 
-       /* get profile attribute */
-       attrs = MMPLAYER_GET_ATTRS(player);
-       if (!attrs) {
-               LOGE("failed to get content attribute");
-               return MM_ERROR_PLAYER_INTERNAL;
-       }
-
        SECURE_LOGD("uri : %s", player->profile.uri);
 
-       mm_attrs_set_int_by_name(attrs, "profile_prepare_async", TRUE);
-       if (mm_attrs_commit_all(attrs)) /* return -1 if error */
-               LOGE("failed to commit");
+       mm_player_set_attribute((MMHandleType)player, NULL, "profile_prepare_async", TRUE, NULL);
 
-       if (player->v_stream_caps && !__mmplayer_gst_create_es_path(player, MM_PLAYER_STREAM_TYPE_VIDEO, player->v_stream_caps))
+       if ((player->v_stream_caps) &&
+               !(__mmplayer_gst_create_es_path(player, MM_PLAYER_STREAM_TYPE_VIDEO, player->v_stream_caps)))
                return MM_ERROR_PLAYER_INTERNAL;
 
-       if (player->a_stream_caps && !__mmplayer_gst_create_es_path(player, MM_PLAYER_STREAM_TYPE_AUDIO, player->a_stream_caps))
+       if ((player->a_stream_caps) &&
+               !(__mmplayer_gst_create_es_path(player, MM_PLAYER_STREAM_TYPE_AUDIO, player->a_stream_caps)))
                return MM_ERROR_PLAYER_INTERNAL;
 
-       if (player->s_stream_caps && !__mmplayer_gst_create_es_path(player, MM_PLAYER_STREAM_TYPE_TEXT, player->s_stream_caps))
+       if ((player->s_stream_caps) &&
+               !(__mmplayer_gst_create_es_path(player, MM_PLAYER_STREAM_TYPE_TEXT, player->s_stream_caps)))
                return MM_ERROR_PLAYER_INTERNAL;
 
        MMPLAYER_FLEAVE();
@@ -3769,20 +3705,12 @@ _mmplayer_gst_build_pipeline(mmplayer_t *player)
        GstElement *src_elem = NULL;
        GstElement *autoplug_elem = NULL;
        GList *element_bucket = NULL;
-       MMHandleType attrs = 0;
        main_element_id_e autoplug_elem_id = MMPLAYER_M_NUM;
 
        MMPLAYER_FENTER();
        MMPLAYER_RETURN_VAL_IF_FAIL(player && player->pipeline &&
                                player->pipeline->mainbin, MM_ERROR_PLAYER_NOT_INITIALIZED);
 
-       /* get profile attribute */
-       attrs = MMPLAYER_GET_ATTRS(player);
-       if (!attrs) {
-               LOGE("failed to get content attribute");
-               return MM_ERROR_PLAYER_INTERNAL;
-       }
-
        LOGD("uri type %d", player->profile.uri_type);
 
        /* create source element */
@@ -3962,7 +3890,17 @@ _mmplayer_gst_add_bus_watch(mmplayer_t *player)
                return MM_ERROR_PLAYER_INTERNAL;
        }
 
-       player->bus_watcher = gst_bus_add_watch(bus, (GstBusFunc)__mmplayer_gst_msg_push, player);
+       player->bus_watcher = gst_bus_add_watch_full(bus, G_PRIORITY_DEFAULT,
+                                                       (GstBusFunc)__mmplayer_gst_msg_push, player,
+                                                       (GDestroyNotify)_mmplayer_watcher_removed_notify);
+       if (player->bus_watcher == 0) {
+               LOGE("failed to add bus watch");
+               return MM_ERROR_PLAYER_INTERNAL;
+       }
+
+       g_mutex_init(&player->bus_watcher_mutex);
+       g_cond_init(&player->bus_watcher_cond);
+
        player->context.thread_default = g_main_context_get_thread_default();
        if (player->context.thread_default == NULL) {
                player->context.thread_default = g_main_context_default();
@@ -4087,11 +4025,6 @@ _mmplayer_activate_next_source(mmplayer_t *player, GstState target)
                goto ERROR;
        }
 
-       if (gst_element_set_state(mainbin[MMPLAYER_M_SRC].gst, target) == GST_STATE_CHANGE_FAILURE) {
-               LOGE("Failed to change state of src element");
-               goto ERROR;
-       }
-
        if (!MMPLAYER_IS_HTTP_STREAMING(player)) {
                if (gst_element_set_state(mainbin[MMPLAYER_M_AUTOPLUG].gst, target) == GST_STATE_CHANGE_FAILURE) {
                        LOGE("Failed to change state of decodebin");
@@ -4104,6 +4037,11 @@ _mmplayer_activate_next_source(mmplayer_t *player, GstState target)
                }
        }
 
+       if (gst_element_set_state(mainbin[MMPLAYER_M_SRC].gst, target) == GST_STATE_CHANGE_FAILURE) {
+               LOGE("Failed to change state of src element");
+               goto ERROR;
+       }
+
        player->gapless.stream_changed = TRUE;
        player->gapless.running = TRUE;
        MMPLAYER_FLEAVE();
@@ -4111,8 +4049,7 @@ _mmplayer_activate_next_source(mmplayer_t *player, GstState target)
 
 ERROR:
        if (player) {
-               MMPLAYER_PLAYBACK_UNLOCK(player);
-
+               _mmplayer_set_reconfigure_state(player, FALSE);
                if (!player->msg_posted) {
                        MMPLAYER_POST_MSG(player, MM_MESSAGE_ERROR, &msg_param);
                        player->msg_posted = TRUE;