From acf607e216dfc978fcb2c240134b98799a1555c1 Mon Sep 17 00:00:00 2001 From: Eunhye Choi Date: Tue, 7 Apr 2020 17:33:26 +0900 Subject: [PATCH] support mem src playback - support mem src playback with uridecodebin3 Change-Id: I62acbf22cb542ef80f2028ccfcf97f94fdb24e5c --- src/mm_player_gst.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/mm_player_gst.c b/src/mm_player_gst.c index 246e0ba..7e5e69e 100644 --- a/src/mm_player_gst.c +++ b/src/mm_player_gst.c @@ -2800,7 +2800,7 @@ __mmplayer_gst_make_rtsp_src(mmplayer_t *player) return element; } -void __mmplayer_http_src_setup(GstElement *element, GstElement *source, gpointer data) +void __mmplayer_http_src_setup(GstElement *source, gpointer data) { #define HTTP_SOURCE_BLOCK_SIZE (64 * 1024) @@ -2852,19 +2852,33 @@ void __mmplayer_http_src_setup(GstElement *element, GstElement *source, gpointer } static void -__mmplayer_source_setup_cb(GstElement *element, GstElement *source, gpointer data) +__mmplayer_gst_found_source(GObject *object, GObject *orig, GParamSpec *pspec, gpointer data) { mmplayer_t *player = (mmplayer_t *)data; - LOGD("%s >> %s", GST_ELEMENT_NAME(element), GST_ELEMENT_NAME(source)); + GstElement *source = NULL; + + MMPLAYER_FENTER(); + LOGD("%s >> %s", GST_ELEMENT_NAME(object), pspec->name); + + g_object_get(orig, pspec->name, &source, NULL); player->pipeline->mainbin[MMPLAYER_M_SRC].id = MMPLAYER_M_SRC; player->pipeline->mainbin[MMPLAYER_M_SRC].gst = source; if (MMPLAYER_IS_HTTP_STREAMING(player)) { - __mmplayer_http_src_setup(element, source, data); + __mmplayer_http_src_setup(source, data); } else if (MMPLAYER_IS_SMOOTH_STREAMING(player)) { g_object_set(G_OBJECT(source), "timeout", DEFAULT_HTTP_TIMEOUT, NULL); + } else if (player->profile.uri_type == MM_PLAYER_URI_TYPE_MEM) { + g_object_set(source, "stream-type", GST_APP_STREAM_TYPE_RANDOM_ACCESS, + "size", (gint64)player->profile.input_mem.len, "blocksize", 20480, NULL); + + _mmplayer_add_signal_connection(player, G_OBJECT(source), MM_PLAYER_SIGNAL_TYPE_OTHERS, "seek-data", + G_CALLBACK(__mmplayer_gst_appsrc_seek_data_mem), (gpointer)&player->profile.input_mem); + _mmplayer_add_signal_connection(player, G_OBJECT(source), MM_PLAYER_SIGNAL_TYPE_OTHERS, "need-data", + G_CALLBACK(__mmplayer_gst_appsrc_feed_data_mem), (gpointer)&player->profile.input_mem); } + MMPLAYER_FLEAVE(); } gint __mmplayer_gst_select_stream (GstElement * uridecodebin, GstStreamCollection * collection, @@ -3055,7 +3069,7 @@ __mmplayer_gst_make_uridecodebin(mmplayer_t *player) "buffer-size", DEFAULT_BUFFER_SIZE_BYTES, NULL); _mmplayer_add_signal_connection(player, G_OBJECT(uridecodebin3), - MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "source-setup", G_CALLBACK(__mmplayer_source_setup_cb), (gpointer)player); + MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "deep-notify::source", G_CALLBACK(__mmplayer_gst_found_source), (gpointer)player); _mmplayer_add_signal_connection(player, G_OBJECT(uridecodebin3), MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "pad-added", G_CALLBACK(_mmplayer_gst_decode_pad_added), (gpointer)player); @@ -4239,6 +4253,13 @@ _mmplayer_gst_build_pipeline(mmplayer_t *player) { GstAppStreamType stream_type = GST_APP_STREAM_TYPE_RANDOM_ACCESS; + if (player->ini.use_uridecodebin3) { + LOGD("uridecodebin include src element."); + + g_strlcpy(player->profile.uri, "appsrc://", MM_MAX_URL_LEN); + return __mmplayer_gst_build_pipeline_with_src(player); + } + src_elem = gst_element_factory_make("appsrc", "mem-source"); if (!src_elem) { LOGE("failed to create appsrc element"); -- 2.7.4