From: Eunhye Choi Date: Thu, 2 Mar 2023 09:56:45 +0000 (+0900) Subject: [0.6.277] Update uridecodebin3 setting to sync GST 1.22.0 X-Git-Tag: accepted/tizen/unified/20230303.162757^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2203bcd71ad147b311c197443aca67f312f7512d;hp=b4a859c494f84d44d7cd1d4fa46b6f9e305554fc;p=platform%2Fcore%2Fmultimedia%2Flibmm-player.git [0.6.277] Update uridecodebin3 setting to sync GST 1.22.0 - uridecodebin3 structure is changed at GST 1.22.0 : parsebin is added in sourcebin instead of decodebin : queue2 is removed Change-Id: I0a81aac05792b36c52ea5e5cad6b8bc741aa29ae --- diff --git a/packaging/libmm-player.spec b/packaging/libmm-player.spec index 5cec31e..92ffdd0 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.276 +Version: 0.6.277 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_player_priv.h b/src/include/mm_player_priv.h index 4d9df97..53fb954 100644 --- a/src/include/mm_player_priv.h +++ b/src/include/mm_player_priv.h @@ -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); diff --git a/src/mm_player_gst.c b/src/mm_player_gst.c index 8d442fe..6679d43 100644 --- a/src/mm_player_gst.c +++ b/src/mm_player_gst.c @@ -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); diff --git a/src/mm_player_priv.c b/src/mm_player_priv.c index bcf15b5..2453a5b 100644 --- a/src/mm_player_priv.c +++ b/src/mm_player_priv.c @@ -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;