support mem src playback 33/230033/2
authorEunhye Choi <eunhae1.choi@samsung.com>
Tue, 7 Apr 2020 08:33:26 +0000 (17:33 +0900)
committerEunhye Choi <eunhae1.choi@samsung.com>
Tue, 7 Apr 2020 08:37:12 +0000 (17:37 +0900)
- support mem src playback with uridecodebin3

Change-Id: I62acbf22cb542ef80f2028ccfcf97f94fdb24e5c

src/mm_player_gst.c

index 246e0ba..7e5e69e 100644 (file)
@@ -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");