[0.6.198] Add state-holder in case of using deinterleave 28/209528/1
authorEunhye Choi <eunhae1.choi@samsung.com>
Mon, 8 Jul 2019 11:20:16 +0000 (20:20 +0900)
committerEunhye Choi <eunhae1.choi@samsung.com>
Mon, 8 Jul 2019 11:20:16 +0000 (20:20 +0900)
Change-Id: I29f7da2084a93cfc03f1c3008b5628ee598a84e5

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

index 82c0f92..bc0cc88 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-player
 Summary:    Multimedia Framework Player Library
-Version:    0.6.197
+Version:    0.6.198
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 205c1cf..03411a7 100644 (file)
@@ -3897,7 +3897,8 @@ _mmplayer_gst_build_pipeline(mmplayer_t *player)
        }
 
        /* FIXME: need to check whether this is required or not. */
-       if (MMPLAYER_IS_HTTP_STREAMING(player) || MMPLAYER_IS_RTSP_STREAMING(player)) {
+       if (MMPLAYER_IS_HTTP_STREAMING(player) || MMPLAYER_IS_RTSP_STREAMING(player) ||
+               (player->audio_extract_opt & MM_PLAYER_AUDIO_EXTRACT_DEINTERLEAVE)) {
                /* create fakesink element for keeping the pipeline state PAUSED. if needed */
                mainbin[MMPLAYER_M_SRC_FAKESINK].id = MMPLAYER_M_SRC_FAKESINK;
                mainbin[MMPLAYER_M_SRC_FAKESINK].gst = gst_element_factory_make("fakesink", "state-holder");
index bee6733..bc00417 100644 (file)
@@ -2523,8 +2523,6 @@ __mmplayer_gst_audio_deinterleave_pad_added(GstElement *elem, GstPad *pad, gpoin
                audiobin[MMPLAYER_A_SINK].gst = sink;
        }
 
-       gst_element_set_state(sink, GST_STATE_PAUSED);
-       gst_element_set_state(queue, GST_STATE_PAUSED);
 
        _mmplayer_add_signal_connection(player,
                G_OBJECT(sink),
@@ -2535,6 +2533,16 @@ __mmplayer_gst_audio_deinterleave_pad_added(GstElement *elem, GstPad *pad, gpoin
 
        __mmplayer_add_sink(player, sink);
 
+       if (gst_element_sync_state_with_parent(queue) == GST_STATE_CHANGE_FAILURE) {
+               LOGE("failed to sync state");
+               goto ERROR;
+       }
+
+       if (gst_element_sync_state_with_parent(sink) == GST_STATE_CHANGE_FAILURE) {
+               LOGE("failed to sync state");
+               goto ERROR;
+       }
+
        MMPLAYER_FLEAVE();
        return;
 
@@ -2557,6 +2565,21 @@ ERROR:
 }
 
 void
+__mmplayer_gst_audio_deinterleave_no_more_pads(GstElement* object, gpointer data)
+{
+       mmplayer_t *player = (mmplayer_t *)data;
+
+       MMPLAYER_FENTER();
+       MMPLAYER_RETURN_IF_FAIL(player && player->pipeline && player->pipeline->mainbin);
+
+       player->no_more_pad = TRUE;
+       __mmplayer_pipeline_complete(NULL, player);
+
+       MMPLAYER_FLEAVE();
+       return;
+}
+
+void
 __mmplayer_gst_set_pulsesink_property(mmplayer_t *player)
 {
        #define MAX_PROPS_LEN 128
@@ -2937,6 +2960,9 @@ __mmplayer_gst_make_audio_extract_sink(mmplayer_t *player, GList **bucket)
                /* audiosink will be added after getting signal for each channel */
                _mmplayer_add_signal_connection(player, G_OBJECT(audiobin[MMPLAYER_A_EXTRACT_DEINTERLEAVE].gst),
                                MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "pad-added", G_CALLBACK(__mmplayer_gst_audio_deinterleave_pad_added), (gpointer)player);
+               _mmplayer_add_signal_connection(player, G_OBJECT(audiobin[MMPLAYER_A_EXTRACT_DEINTERLEAVE].gst),
+                               MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "no-more-pads", G_CALLBACK(__mmplayer_gst_audio_deinterleave_no_more_pads), (gpointer)player);
+               player->no_more_pad = FALSE;
        } else {
        /* 4-2. create fakesink to extract interlevaed pcm */
                LOGD("add audio fakesink for interleaved audio");