support rtsp playback 69/230169/2
authorEunhye Choi <eunhae1.choi@samsung.com>
Wed, 8 Apr 2020 08:50:23 +0000 (17:50 +0900)
committerEunhye Choi <eunhae1.choi@samsung.com>
Wed, 8 Apr 2020 09:25:31 +0000 (18:25 +0900)
- support rtsp playback with uridecodebin3
- set buffering criteria to queue2 and mq
  in case of streaming except rtsp

Change-Id: I7dfdc848207714c9c28bb0719092884791453944

src/include/mm_player_gst.h
src/mm_player_gst.c
src/mm_player_priv.c
src/mm_player_utils.c

index ab4bfac..298cfab 100644 (file)
@@ -72,6 +72,7 @@ int _mmplayer_gst_get_buffer_position(mmplayer_t *player, int *start_pos, int *e
 GstElement *_mmplayer_gst_create_source(mmplayer_t *player);
 int _mmplayer_gst_build_es_pipeline(mmplayer_t *player);
 int _mmplayer_gst_build_pipeline(mmplayer_t *player);
+int _mmplayer_gst_build_pipeline_with_src(mmplayer_t *player);
 int _mmplayer_gst_add_bus_watch(mmplayer_t *player);
 void _mmplayer_activate_next_source(mmplayer_t *player, GstState target);
 
index a16c0d2..c864487 100644 (file)
@@ -2867,6 +2867,17 @@ __mmplayer_gst_found_source(GObject *object, GObject *orig, GParamSpec *pspec, g
 
        if (MMPLAYER_IS_HTTP_STREAMING(player)) {
                __mmplayer_http_src_setup(source, data);
+       } else if (MMPLAYER_IS_RTSP_STREAMING(player)) {
+               gchar *user_agent = NULL;
+
+               /* get attribute */
+               mm_attrs_get_string_by_name(player->attrs, "streaming_user_agent", &user_agent);
+
+               SECURE_LOGD("user_agent : %s", user_agent);
+
+               /* setting property to streaming source */
+               if (user_agent)
+                       g_object_set(G_OBJECT(source), "user-agent", user_agent, NULL);
        } 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) {
@@ -2948,41 +2959,40 @@ __mmplayer_gst_deep_element_added(GstElement *bin, GstBin *child, GstElement *el
                return;
        }
 
-       if (!mainbin[MMPLAYER_M_MUXED_S_BUFFER].gst && g_strrstr(factory_name, "queue2")) { // fix me :streaming only..
-
-               gint64 dur_bytes = 0L;
-               muxed_buffer_type_e type = MUXED_BUFFER_TYPE_MEM_QUEUE;
-
-               mainbin[MMPLAYER_M_MUXED_S_BUFFER].id = MMPLAYER_M_MUXED_S_BUFFER;
-               mainbin[MMPLAYER_M_MUXED_S_BUFFER].gst = element;
+       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;
 
-               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));
+                       mainbin[MMPLAYER_M_MUXED_S_BUFFER].id = MMPLAYER_M_MUXED_S_BUFFER;
+                       mainbin[MMPLAYER_M_MUXED_S_BUFFER].gst = element;
 
-               LOGD("type %s, dur_bytes = %"G_GINT64_FORMAT, player->type, dur_bytes);
+                       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));
 
-               /* 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;
+                       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;
                        }
-               } else {
-                       dur_bytes = 0;
-               }
-
-               _mm_player_streaming_set_queue2(player->streamer,
-                                                                               element,
-                                                                               FALSE,
-                                                                               type,
-                                                                               (guint64)dur_bytes); /* no meaning at the moment */
 
-               return;
-       }
+                       _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")) {
-               if (!mainbin[MMPLAYER_M_DEMUXED_S_BUFFER].gst) {
+               /* 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;
@@ -2993,16 +3003,14 @@ __mmplayer_gst_deep_element_added(GstElement *bin, GstBin *child, GstElement *el
                                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;
 
-                                               if ((MMPLAYER_IS_HTTP_STREAMING(player)) ||
-                                                       (MMPLAYER_IS_HTTP_LIVE_STREAMING(player)) ||
-                                                       (MMPLAYER_IS_DASH_STREAMING(player))) {
-                                                       _mm_player_streaming_set_multiqueue(player->streamer, 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;
                                        }
@@ -4113,8 +4121,8 @@ _mmplayer_gst_build_es_pipeline(mmplayer_t *player)
        return MM_ERROR_NONE;
 }
 
-static int
-__mmplayer_gst_build_pipeline_with_src(mmplayer_t *player)
+int
+_mmplayer_gst_build_pipeline_with_src(mmplayer_t *player)
 {
        mmplayer_gst_element_t *mainbin = NULL;
        GstElement *autoplug_elem = NULL;
@@ -4127,6 +4135,15 @@ __mmplayer_gst_build_pipeline_with_src(mmplayer_t *player)
 
        LOGD("uri type %d", player->profile.uri_type);
 
+       if ((player->profile.uri_type == MM_PLAYER_URI_TYPE_FILE) &&
+               (!_mmplayer_get_storage_info(player->profile.uri, &player->storage_info[MMPLAYER_PATH_VOD]))) {
+               return MM_ERROR_PLAYER_INTERNAL;
+       }
+
+       if (player->profile.uri_type == MM_PLAYER_URI_TYPE_MEM) {
+               g_strlcpy(player->profile.uri, "appsrc://", MM_MAX_URL_LEN);
+       }
+
        autoplug_elem = __mmplayer_gst_make_uridecodebin(player);
        if (!autoplug_elem) {
                LOGE("failed to create uridecodebin3 element");
@@ -4200,31 +4217,14 @@ _mmplayer_gst_build_pipeline(mmplayer_t *player)
                src_elem = __mmplayer_gst_make_rtsp_src(player);
                break;
        case MM_PLAYER_URI_TYPE_URL_HTTP:
-               if (player->ini.use_uridecodebin3) {
-                       LOGD("uridecodebin include src element.");
-                       return __mmplayer_gst_build_pipeline_with_src(player);
-               }
                src_elem = __mmplayer_gst_make_http_src(player);
                break;
        case MM_PLAYER_URI_TYPE_FILE:
-               if (player->ini.use_uridecodebin3) {
-                       if (!_mmplayer_get_storage_info(player->profile.uri, &player->storage_info[MMPLAYER_PATH_VOD])) {
-                               LOGE("failed to get storage info");
-                               break;
-                       }
-                       LOGD("uridecodebin include src element.");
-                       return __mmplayer_gst_build_pipeline_with_src(player);
-               }
                src_elem = __mmplayer_gst_make_file_src(player);
                break;
        case MM_PLAYER_URI_TYPE_SS:
                {
                        gint http_timeout = DEFAULT_HTTP_TIMEOUT;
-                       if (player->ini.use_uridecodebin3) {
-                               LOGD("uridecodebin include src element.");
-                               return __mmplayer_gst_build_pipeline_with_src(player);
-                       }
-
                        src_elem = gst_element_factory_make("souphttpsrc", "http streaming source");
                        if (!src_elem) {
                                LOGE("failed to create http streaming source element[%s]", player->ini.httpsrc_element);
@@ -4244,13 +4244,6 @@ _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");
index 643c6cd..e41a496 100644 (file)
@@ -4178,10 +4178,14 @@ __mmplayer_gst_create_pipeline(mmplayer_t *player)
        player->pipeline->mainbin = mainbin;
 
        /* create the source and decoder elements */
-       if (MMPLAYER_IS_MS_BUFF_SRC(player))
+       if (MMPLAYER_IS_MS_BUFF_SRC(player)) {
                ret = _mmplayer_gst_build_es_pipeline(player);
-       else
-               ret = _mmplayer_gst_build_pipeline(player);
+       } else {
+               if (player->ini.use_uridecodebin3)
+                       ret = _mmplayer_gst_build_pipeline_with_src(player);
+               else
+                       ret = _mmplayer_gst_build_pipeline(player);
+       }
 
        if (ret != MM_ERROR_NONE) {
                LOGE("failed to create some elements");
index 8af1099..4d273d3 100644 (file)
@@ -650,8 +650,7 @@ gboolean _mmplayer_use_uridecodebin3(mmplayer_t *player) /* MMPLAYER_USE_URIDECO
 {
        MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
 
-       if (MMPLAYER_IS_RTSP_STREAMING(player) ||
-               MMPLAYER_IS_MS_BUFF_SRC(player))
+       if (MMPLAYER_IS_MS_BUFF_SRC(player))
                return FALSE;
 
        if (!player->ini.use_uridecodebin3)