From 962955fdefd16e6a53d36dd5eccbb039ee1482e0 Mon Sep 17 00:00:00 2001 From: Eunhye Choi Date: Wed, 8 Apr 2020 17:50:23 +0900 Subject: [PATCH] support rtsp playback - 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 | 1 + src/mm_player_gst.c | 115 +++++++++++++++++++++----------------------- src/mm_player_priv.c | 10 ++-- src/mm_player_utils.c | 3 +- 4 files changed, 63 insertions(+), 66 deletions(-) diff --git a/src/include/mm_player_gst.h b/src/include/mm_player_gst.h index ab4bfac..298cfab 100644 --- a/src/include/mm_player_gst.h +++ b/src/include/mm_player_gst.h @@ -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); diff --git a/src/mm_player_gst.c b/src/mm_player_gst.c index a16c0d2..c864487 100644 --- a/src/mm_player_gst.c +++ b/src/mm_player_gst.c @@ -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"); diff --git a/src/mm_player_priv.c b/src/mm_player_priv.c index 643c6cd..e41a496 100644 --- a/src/mm_player_priv.c +++ b/src/mm_player_priv.c @@ -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"); diff --git a/src/mm_player_utils.c b/src/mm_player_utils.c index 8af1099..4d273d3 100644 --- a/src/mm_player_utils.c +++ b/src/mm_player_utils.c @@ -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) -- 2.7.4