Set multiqueue max-size-time when local playback 65/265065/4 submit/tizen/20211008.071508
authorGilbok Lee <gilbok.lee@samsung.com>
Fri, 8 Oct 2021 05:57:59 +0000 (14:57 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Fri, 8 Oct 2021 06:37:02 +0000 (15:37 +0900)
- 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
src/mm_player_gst.c

index e9cee51..92619d1 100644 (file)
@@ -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
index fb1e493..14447fc 100644 (file)
@@ -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;