[0.6.270] fix crash during gapless playback
[platform/core/multimedia/libmm-player.git] / src / mm_player_priv.c
index 73e60b4..eb5ad2a 100644 (file)
@@ -156,7 +156,6 @@ static int __mmplayer_change_selector_pad(mmplayer_t *player, mmplayer_track_typ
 
 static gboolean __mmplayer_check_subtitle(mmplayer_t *player);
 static int             __mmplayer_handle_missed_plugin(mmplayer_t *player);
-static int             __mmplayer_check_not_supported_codec(mmplayer_t *player, const gchar *factory_class, const gchar *mime);
 static void            __mmplayer_add_sink(mmplayer_t *player, GstElement *sink, gboolean first);
 static void            __mmplayer_del_sink(mmplayer_t *player, GstElement *sink);
 static void            __mmplayer_release_signal_connection(mmplayer_t *player, mmplayer_signal_type_e type);
@@ -745,11 +744,17 @@ __mmplayer_gapless_play_thread(gpointer data)
 
                mainbin = player->pipeline->mainbin;
 
-               MMPLAYER_RELEASE_ELEMENT(player, mainbin, MMPLAYER_M_MUXED_S_BUFFER);
-               MMPLAYER_RELEASE_ELEMENT(player, mainbin, MMPLAYER_M_ID3DEMUX);
-               MMPLAYER_RELEASE_ELEMENT(player, mainbin, MMPLAYER_M_AUTOPLUG);
-               MMPLAYER_RELEASE_ELEMENT(player, mainbin, MMPLAYER_M_TYPEFIND);
-               MMPLAYER_RELEASE_ELEMENT(player, mainbin, MMPLAYER_M_SRC);
+               if (MMPLAYER_USE_DECODEBIN(player)) {
+                       MMPLAYER_RELEASE_ELEMENT(player, mainbin, MMPLAYER_M_MUXED_S_BUFFER);
+                       MMPLAYER_RELEASE_ELEMENT(player, mainbin, MMPLAYER_M_AUTOPLUG); /* decodebin */
+                       MMPLAYER_RELEASE_ELEMENT(player, mainbin, MMPLAYER_M_TYPEFIND);
+                       MMPLAYER_RELEASE_ELEMENT(player, mainbin, MMPLAYER_M_SRC);
+               } else {
+                       MMPLAYER_RELEASE_ELEMENT(player, mainbin, MMPLAYER_M_AUTOPLUG); /* uridecodebin */
+                       mainbin[MMPLAYER_M_MUXED_S_BUFFER].gst = NULL;
+                       mainbin[MMPLAYER_M_TYPEFIND].gst = NULL;
+                       mainbin[MMPLAYER_M_SRC].gst = NULL;
+               }
 
                /* Initialize Player values */
                __mmplayer_initialize_gapless_play(player);
@@ -1410,7 +1415,7 @@ _mmplayer_gst_decode_pad_added(GstElement *elem, GstPad *pad, gpointer data)
        }
 
        /* link */
-       sinkpad = gst_element_get_request_pad(combiner, "sink_%u");
+       sinkpad = gst_element_request_pad_simple(combiner, "sink_%u");
 
        LOGD("pad link: %s:%s - %s:%s", GST_DEBUG_PAD_NAME(pad), GST_DEBUG_PAD_NAME(sinkpad));
 
@@ -6376,8 +6381,8 @@ ERROR:
        return FALSE;
 }
 
-static int
-__mmplayer_check_not_supported_codec(mmplayer_t *player, const gchar *factory_class, const gchar *mime)
+int
+_mmplayer_update_not_supported_codec_info(mmplayer_t *player, const gchar *factory_class, const gchar *mime)
 {
        MMPLAYER_FENTER();
 
@@ -6978,7 +6983,7 @@ _mmplayer_gst_decode_unknown_type(GstElement *elem, GstPad *pad,
        MMPLAYER_FREEIF(caps_str);
 
        /* There is no available codec. */
-       __mmplayer_check_not_supported_codec(player, klass, mime);
+       _mmplayer_update_not_supported_codec_info(player, klass, mime);
 }
 
 gboolean
@@ -7585,6 +7590,7 @@ _mmplayer_gst_decode_pad_removed(GstElement *elem, GstPad *pad,
        mmplayer_t *player = (mmplayer_t *)data;
        mmplayer_gst_element_t *mainbin = player->pipeline->mainbin;
        mmplayer_gst_element_t *videobin = player->pipeline->videobin;
+       gint timeout = MMPLAYER_STATE_CHANGE_TIMEOUT(player);
 
        MMPLAYER_FENTER();
        MMPLAYER_RETURN_IF_FAIL(player && player->pipeline && mainbin);
@@ -7601,11 +7607,27 @@ _mmplayer_gst_decode_pad_removed(GstElement *elem, GstPad *pad,
 
        __mmplayer_del_sink(player, videobin[MMPLAYER_V_SINK].gst);
 
+       LOGD("remove videobin");
+       ret = _mmplayer_gst_set_state(player, videobin[MMPLAYER_V_BIN].gst,
+                               GST_STATE_NULL, FALSE, timeout);
+       if (ret != MM_ERROR_NONE) {
+               LOGE("fail to change state of videobin to NULL");
+               return;
+       }
+
        if (!gst_bin_remove(GST_BIN_CAST(mainbin[MMPLAYER_M_PIPE].gst), videobin[MMPLAYER_V_BIN].gst)) {
                LOGE("failed to remove videobin");
                gst_object_unref(GST_OBJECT(videobin[MMPLAYER_V_BIN].gst));
        }
 
+       LOGD("remove concat");
+       ret = _mmplayer_gst_set_state(player, mainbin[MMPLAYER_M_V_CONCAT].gst,
+                               GST_STATE_NULL, FALSE, timeout);
+       if (ret != MM_ERROR_NONE) {
+               LOGE("fail to change state of concat to NULL");
+               return;
+       }
+
        if (!gst_bin_remove(GST_BIN_CAST(mainbin[MMPLAYER_M_PIPE].gst), mainbin[MMPLAYER_M_V_CONCAT].gst)) {
                LOGE("failed to remove video concat");
                gst_object_unref(GST_OBJECT(mainbin[MMPLAYER_M_V_CONCAT].gst));