From d7a87ab62438a76f1033c152cc1375788f6ce000 Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Fri, 8 Oct 2021 14:57:59 +0900 Subject: [PATCH] Set multiqueue max-size-time when local playback - player is blocked when player_set_position using contents which the key frame interval high. - demuxer don't push video frame, because of audio queue is full. Change-Id: I654b33b372b8d9ce2db1cae5558f6015a9371187 --- packaging/libmm-player.spec | 2 +- src/mm_player_gst.c | 74 ++++++++++++++++++++++++++++----------------- 2 files changed, 47 insertions(+), 29 deletions(-) diff --git a/packaging/libmm-player.spec b/packaging/libmm-player.spec index e9cee51..92619d1 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.262 +Version: 0.6.263 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/mm_player_gst.c b/src/mm_player_gst.c index fb1e493..14447fc 100644 --- a/src/mm_player_gst.c +++ b/src/mm_player_gst.c @@ -3043,6 +3043,37 @@ __mmplayer_gst_decode_request_resource(GstElement * uridecodebin, GstStreamColle return TRUE; } +static GstElement * +__mmplayer_gst_find_child_element(GstBin *bin, const gchar *element_name) +{ + GstIterator *iter = NULL; + GValue item = {0, }; + GstElement *ch_element = NULL; + GstElementFactory *ch_factory = NULL; + + MMPLAYER_FENTER(); + MMPLAYER_RETURN_VAL_IF_FAIL(bin && element_name, NULL); + + iter = gst_bin_iterate_recurse(bin); + if (iter != NULL) { + while (gst_iterator_next(iter, &item) == GST_ITERATOR_OK) { + ch_element = g_value_get_object(&item); + ch_factory = gst_element_get_factory(ch_element); + LOGD("children factory %s", GST_OBJECT_NAME(ch_factory)); + if (g_strrstr(GST_OBJECT_NAME(ch_factory), element_name)) { + LOGD("Find %s element", element_name); + break; + } + ch_element = NULL; + g_value_reset(&item); + } + gst_iterator_free(iter); + } + + MMPLAYER_FLEAVE(); + return ch_element; +} + static void __mmplayer_gst_deep_element_added(GstElement *bin, GstBin *child, GstElement *element, gpointer data) { @@ -3101,38 +3132,25 @@ __mmplayer_gst_deep_element_added(GstElement *bin, GstBin *child, GstElement *el (guint64)dur_bytes); /* no meaning at the moment */ return; } + } - /* update mq setting */ - if (g_strrstr(factory_name, "parsebin") && (!mainbin[MMPLAYER_M_DEMUXED_S_BUFFER].gst)) { - GstIterator *iter = NULL; - GValue item = {0, }; - GstElement *ch_element = NULL; - GstElementFactory *ch_factory = NULL; - - iter = gst_bin_iterate_recurse(child); - if (iter != NULL) { - while (gst_iterator_next(iter, &item) == GST_ITERATOR_OK) { - ch_element = g_value_get_object(&item); - ch_factory = gst_element_get_factory(ch_element); - LOGD("children factory %s", GST_OBJECT_NAME(ch_factory)); - if (g_strrstr(GST_OBJECT_NAME(ch_factory), "multiqueue")) { - LOGD("get multiqueue"); - player->pipeline->mainbin[MMPLAYER_M_DEMUXED_S_BUFFER].id = MMPLAYER_M_DEMUXED_S_BUFFER; - player->pipeline->mainbin[MMPLAYER_M_DEMUXED_S_BUFFER].gst = ch_element; - - /* in case of multiqueue, max bytes size is defined with fixed value in mm_player_streaming.h */ - _mm_player_streaming_set_multiqueue(player->streamer, ch_element); - g_value_reset(&item); - break; - } - g_value_reset(&item); + if (g_strrstr(factory_name, "parsebin")) { + if ((!MMPLAYER_IS_RTSP_STREAMING(player)) && (!mainbin[MMPLAYER_M_DEMUXED_S_BUFFER].gst)) { + GstElement *ch_element = __mmplayer_gst_find_child_element(child, "multiqueue"); + if (ch_element) { + player->pipeline->mainbin[MMPLAYER_M_DEMUXED_S_BUFFER].id = MMPLAYER_M_DEMUXED_S_BUFFER; + player->pipeline->mainbin[MMPLAYER_M_DEMUXED_S_BUFFER].gst = ch_element; + + /* in case of multiqueue, max bytes size is defined with fixed value in mm_player_streaming.h */ + if (MMPLAYER_IS_STREAMING(player)) { + _mm_player_streaming_set_multiqueue(player->streamer, ch_element); + } else { + g_object_set(G_OBJECT(ch_element), + "max-size-time", (guint64)(5 * GST_SECOND), + "use-interleave", FALSE, NULL); } - gst_iterator_free(iter); } } - } - - if (g_strrstr(factory_name, "parsebin")) { int video_codec_type = 0; int audio_codec_type = 0; -- 2.7.4