[0.6.277] Update uridecodebin3 setting to sync GST 1.22.0 99/289199/3 accepted/tizen/unified/20230303.162757
authorEunhye Choi <eunhae1.choi@samsung.com>
Thu, 2 Mar 2023 09:56:45 +0000 (18:56 +0900)
committerEunhye Choi <eunhae1.choi@samsung.com>
Fri, 3 Mar 2023 02:44:36 +0000 (11:44 +0900)
- uridecodebin3 structure is changed at GST 1.22.0
  : parsebin is added in sourcebin instead of decodebin
  : queue2 is removed

Change-Id: I0a81aac05792b36c52ea5e5cad6b8bc741aa29ae

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

index 5cec31e..92ffdd0 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-player
 Summary:    Multimedia Framework Player Library
-Version:    0.6.276
+Version:    0.6.277
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 4d9df97..53fb954 100644 (file)
@@ -166,7 +166,6 @@ typedef enum {
        /* it could be a decodebin or could be a typefind. depends on player ini */
        MMPLAYER_M_TYPEFIND,
        MMPLAYER_M_AUTOPLUG,
-       MMPLAYER_M_AUTOPLUG_PARSEBIN,
 
        MMPLAYER_M_AUTOPLUG_V_DEC,
        MMPLAYER_M_AUTOPLUG_A_DEC,
@@ -916,7 +915,7 @@ void _mmplayer_gst_decode_pad_added(GstElement *elem, GstPad *pad, gpointer data
 gint _mmplayer_gst_decode_autoplug_select(GstElement *bin,  GstPad *pad, GstCaps *caps, GstElementFactory *factory, gpointer data);
 GValueArray *_mmplayer_gst_decode_autoplug_sort(GstElement *bin, GstPad *pad, GstCaps *caps, GValueArray *factories, gpointer data);
 gboolean _mmplayer_gst_create_decoder(mmplayer_t *player, GstPad *srcpad, const GstCaps *caps);
-void _mmplayer_gst_element_added(GstElement *bin, GstElement *element, gpointer data);
+void _mmplayer_gst_element_added(GstBin *bin, GstElement *element, gpointer data);
 GstElement *_mmplayer_gst_make_decodebin(mmplayer_t *player);
 int _mmplayer_gst_element_add_bucket_to_bin(GstBin *bin, GList *element_bucket);
 int _mmplayer_gst_element_link_bucket(GList *element_bucket);
index 8d442fe..6679d43 100644 (file)
@@ -3047,124 +3047,68 @@ __mmplayer_gst_find_child_element(GstBin *bin, const gchar *element_name)
        return ch_element;
 }
 
-static void
-__mmplayer_gst_deep_element_added(GstElement *bin, GstBin *child, GstElement *element, gpointer data)
+static void __mmplayer_parsebin_setup(GstBin *bin, gpointer data)
 {
-       gchar *factory_name = NULL;
        mmplayer_t *player = (mmplayer_t *)data;
-       mmplayer_gst_element_t *mainbin = NULL;
-
-       MMPLAYER_FENTER();
-       MMPLAYER_RETURN_IF_FAIL(player && player->pipeline && player->pipeline->mainbin);
 
-       factory_name = GST_OBJECT_NAME(gst_element_get_factory(element));
-       mainbin = player->pipeline->mainbin;
+       g_object_set(G_OBJECT(bin), "message-forward", TRUE, NULL);
 
-       LOGD("%s > %s > %s : %s", GST_ELEMENT_NAME(bin), GST_ELEMENT_NAME(child),
-               factory_name, GST_ELEMENT_NAME(element));
+       _mmplayer_add_signal_connection(player, G_OBJECT(bin),
+       MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "unknown-type",
+                       G_CALLBACK(_mmplayer_gst_decode_unknown_type), (gpointer)player);
 
-       /* keep the first typefind reference only */
-       if (!mainbin[MMPLAYER_M_TYPEFIND].gst && g_strrstr(factory_name, "typefind")) {  // FIXME : not required for local playback+
-               mainbin[MMPLAYER_M_TYPEFIND].id = MMPLAYER_M_TYPEFIND;
-               mainbin[MMPLAYER_M_TYPEFIND].gst = element;
+       _mmplayer_add_signal_connection(player, G_OBJECT(bin),
+       MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "autoplug-select",
+                       G_CALLBACK(_mmplayer_gst_decode_autoplug_select), (gpointer)player);
+}
 
-               _mmplayer_add_signal_connection(player, G_OBJECT(element),
-                       MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "have-type", G_CALLBACK(_mmplayer_typefind_have_type), (gpointer)player);
-               LOGD("typefind reference is added");
-               return;
-       }
+static void __mmplayer_decodebin3_setup(GstBin *bin, gpointer data)
+{
+       mmplayer_t *player = (mmplayer_t *)data;
+       int video_codec_type = 0;
+       int audio_codec_type = 0;
 
-       if ((MMPLAYER_IS_STREAMING(player)) && (!MMPLAYER_IS_RTSP_STREAMING(player))) {
-               /* update queue2 setting */
-               if (g_strrstr(factory_name, "queue2") && (!mainbin[MMPLAYER_M_MUXED_S_BUFFER].gst)) {
-                       gint64 dur_bytes = 0L;
-                       muxed_buffer_type_e type = MUXED_BUFFER_TYPE_MEM_QUEUE;
+       g_object_set(G_OBJECT(bin), "message-forward", TRUE, NULL);
 
-                       mainbin[MMPLAYER_M_MUXED_S_BUFFER].id = MMPLAYER_M_MUXED_S_BUFFER;
-                       mainbin[MMPLAYER_M_MUXED_S_BUFFER].gst = element;
+       mm_attrs_get_int_by_name(player->attrs, MM_PLAYER_VIDEO_CODEC_TYPE, &video_codec_type);
+       mm_attrs_get_int_by_name(player->attrs, MM_PLAYER_AUDIO_CODEC_TYPE, &audio_codec_type);
 
-                       if (!gst_element_query_duration(mainbin[MMPLAYER_M_SRC].gst, GST_FORMAT_BYTES, &dur_bytes))
-                               LOGW("failed to get duration from source %s", GST_ELEMENT_NAME(mainbin[MMPLAYER_M_SRC].gst));
+       LOGD("set codec type v(%d) a(%d)", video_codec_type, audio_codec_type);
 
-                       LOGD("type %s, dur_bytes = %"G_GINT64_FORMAT, player->type, dur_bytes);
-                       /* NOTE : in case of ts streaming, player could not get the correct duration info *
-                        *                skip the pull mode(file or ring buffering) setting. */
-                       if (dur_bytes > 0) {
-                               if ((!g_strrstr(player->type, "video/mpegts")) && (!g_strrstr(player->type, "application/x-hls"))) {
-                                       type = MUXED_BUFFER_TYPE_MEM_RING_BUFFER;
-                                       player->streamer->ring_buffer_size = player->ini.http_ring_buffer_size;
-                               }
-                       } else {
-                               dur_bytes = 0;
-                       }
+       if (video_codec_type == MM_PLAYER_CODEC_TYPE_SW)
+               g_object_set(G_OBJECT(bin), "force-sw-decoders-for-video", TRUE, NULL);
+       if (audio_codec_type == MM_PLAYER_CODEC_TYPE_SW)
+               g_object_set(G_OBJECT(bin), "force-sw-decoders-for-audio", TRUE, NULL);
 
-                       _mm_player_streaming_set_queue2(player->streamer,
-                                                                                       element,
-                                                                                       FALSE,
-                                                                                       type,
-                                                                                       (guint64)dur_bytes); /* no meaning at the moment */
-                       return;
-               }
-       }
-
-       if (g_strrstr(factory_name, "parsebin") /* will be removed after gst 1.22.0 is applied */
-               || g_strrstr(factory_name, "identity")) {
-               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);
-                               }
-                       }
-               }
-               int video_codec_type = 0;
-               int audio_codec_type = 0;
-
-               g_object_set(G_OBJECT(child), "message-forward", TRUE, NULL);
-               g_object_set(G_OBJECT(element), "message-forward", TRUE, NULL);
-               if (player->type_caps &&
-                       !MMPLAYER_IS_HTTP_LIVE_STREAMING(player) &&
-                       !MMPLAYER_IS_DASH_STREAMING(player))
-                       g_object_set(G_OBJECT(element), "sink-caps", player->type_caps, NULL);
-
-               mm_attrs_get_int_by_name(player->attrs, MM_PLAYER_VIDEO_CODEC_TYPE, &video_codec_type);
-               mm_attrs_get_int_by_name(player->attrs, MM_PLAYER_AUDIO_CODEC_TYPE, &audio_codec_type);
+       _mmplayer_add_signal_connection(player, G_OBJECT(bin), MM_PLAYER_SIGNAL_TYPE_AUTOPLUG,
+                       "request-resource", G_CALLBACK(__mmplayer_gst_decode_request_resource), (gpointer)player);
+}
 
-               /* CAUTION: if there is hw decoder, the rank value has to be higher than sw decoder
-                  and codec default type in ini has to be hw.
-                */
-               LOGD("set codec type v(%d) a(%d)", video_codec_type, audio_codec_type);
-               if (video_codec_type == MM_PLAYER_CODEC_TYPE_SW)
-                       g_object_set(G_OBJECT(child), "force-sw-decoders-for-video", TRUE, NULL);
-               if (audio_codec_type == MM_PLAYER_CODEC_TYPE_SW)
-                       g_object_set(G_OBJECT(child), "force-sw-decoders-for-audio", TRUE, NULL);
-
-               mainbin[MMPLAYER_M_AUTOPLUG_PARSEBIN].id = MMPLAYER_M_AUTOPLUG_PARSEBIN;
-               mainbin[MMPLAYER_M_AUTOPLUG_PARSEBIN].gst = element;
-               _mmplayer_add_signal_connection(player, G_OBJECT(element),
-                       MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "unknown-type", G_CALLBACK(_mmplayer_gst_decode_unknown_type), (gpointer)player);
+static void
+__mmplayer_gst_deep_element_added(GstElement *bin, GstBin *child, GstElement *element, gpointer data)
+{
+       gchar *factory_name = NULL;
+       mmplayer_t *player = (mmplayer_t *)data;
 
-               _mmplayer_add_signal_connection(player, G_OBJECT(element),
-                       MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "autoplug-continue", G_CALLBACK(_mmplayer_gst_decode_autoplug_continue), (gpointer)player);
+       MMPLAYER_FENTER();
+       MMPLAYER_RETURN_IF_FAIL(player && player->pipeline && player->pipeline->mainbin);
 
-               _mmplayer_add_signal_connection(player, G_OBJECT(element),
-                       MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "autoplug-select", G_CALLBACK(_mmplayer_gst_decode_autoplug_select), (gpointer)player);
+       factory_name = GST_OBJECT_NAME(gst_element_get_factory(element));
 
-               _mmplayer_add_signal_connection(player, G_OBJECT(child),
-                       MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "request-resource", G_CALLBACK(__mmplayer_gst_decode_request_resource), (gpointer)player);
+       LOGD("child: %s, elem: %s (%s)", GST_ELEMENT_NAME(child), factory_name, GST_ELEMENT_NAME(element));
 
+       if (g_strrstr(factory_name, "urisourcebin")) {
+               GstElement *dbin3 = __mmplayer_gst_find_child_element(child, "decodebin3");
+               if (dbin3)
+                       __mmplayer_decodebin3_setup(GST_BIN(dbin3), data);
+               else
+                       LOGW("failed to find decodebin3");
+       } else if (g_strrstr(factory_name, "parsebin")) {
+               g_object_set(G_OBJECT(child), "message-forward", TRUE, NULL); /* urisourcebin */
+               __mmplayer_parsebin_setup(GST_BIN(element), data);
        } else {
-               _mmplayer_gst_element_added((GstElement *)child, element, data);
+               _mmplayer_gst_element_added(child, element, data);
        }
-       return;
 }
 
 static void
@@ -3229,7 +3173,8 @@ __mmplayer_gst_make_uridecodebin(mmplayer_t *player)
        /* setting property to streaming source */
        g_object_set(G_OBJECT(uridecodebin3), "uri", player->profile.uri,
                        "message-forward", TRUE,
-                       "buffer-size", DEFAULT_BUFFER_SIZE_BYTES, NULL);
+                       "buffer-size", DEFAULT_BUFFER_SIZE_BYTES,
+                       "use-buffering", TRUE, NULL);
 
        _mmplayer_add_signal_connection(player, G_OBJECT(uridecodebin3),
                MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "deep-notify::source", G_CALLBACK(__mmplayer_gst_found_source), (gpointer)player);
@@ -3881,7 +3826,7 @@ _mmplayer_gst_send_event_to_sink(mmplayer_t *player, GstEvent *event)
        }
 
        /* Note : Textbin is not linked to the video or audio bin.
-        * It needs to send the event to the text sink seperately.
+        * It needs to send the event to the text sink separately.
         */
        if (player->play_subtitle && player->pipeline) {
                GstElement *text_sink = GST_ELEMENT_CAST(player->pipeline->textbin[MMPLAYER_T_FAKE_SINK].gst);
index bcf15b5..2453a5b 100644 (file)
@@ -752,7 +752,6 @@ __mmplayer_gapless_play_thread(gpointer data)
                } 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;
                }
 
@@ -7749,7 +7748,7 @@ _mmplayer_gst_decode_drained(GstElement *bin, gpointer data)
 }
 
 void
-_mmplayer_gst_element_added(GstElement *bin, GstElement *element, gpointer data)
+_mmplayer_gst_element_added(GstBin *bin, GstElement *element, gpointer data)
 {
        mmplayer_t *player = (mmplayer_t *)data;
        const gchar *klass = NULL;