From cc16a2341a41f2501816181b051e825e29e71a25 Mon Sep 17 00:00:00 2001 From: Eunhye Choi Date: Mon, 8 Jul 2019 20:20:16 +0900 Subject: [PATCH] [0.6.198] Add state-holder in case of using deinterleave Change-Id: I29f7da2084a93cfc03f1c3008b5628ee598a84e5 --- packaging/libmm-player.spec | 2 +- src/mm_player_gst.c | 3 ++- src/mm_player_priv.c | 30 ++++++++++++++++++++++++++++-- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/packaging/libmm-player.spec b/packaging/libmm-player.spec index 82c0f92..bc0cc88 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.197 +Version: 0.6.198 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/mm_player_gst.c b/src/mm_player_gst.c index 205c1cf..03411a7 100644 --- a/src/mm_player_gst.c +++ b/src/mm_player_gst.c @@ -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"); diff --git a/src/mm_player_priv.c b/src/mm_player_priv.c index bee6733..bc00417 100644 --- a/src/mm_player_priv.c +++ b/src/mm_player_priv.c @@ -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; @@ -2556,6 +2564,21 @@ ERROR: return; } +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) { @@ -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"); -- 2.34.1