From: Eunhae Choi Date: Wed, 28 Dec 2016 08:11:07 +0000 (+0900) Subject: souphttpsrc: add dash segment handling X-Git-Tag: accepted/tizen/3.0.m2/mobile/20170104.143027~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F92%2F107492%2F2;p=platform%2Fupstream%2Fgst-plugins-good.git souphttpsrc: add dash segment handling Change-Id: I91f95265fa925188789a1aa11b86331e80a99aaa --- diff --git a/ext/soup/gstsouphttpsrc.c b/ext/soup/gstsouphttpsrc.c index 7a8fee5..adea645 100644 --- a/ext/soup/gstsouphttpsrc.c +++ b/ext/soup/gstsouphttpsrc.c @@ -447,6 +447,16 @@ gst_soup_http_src_reset (GstSoupHTTPSrc * src) src->content_size = 0; src->have_body = FALSE; +#ifdef TIZEN_FEATURE_SOUP_MODIFICATION + if (src->dash_oldest_segment) { + g_free (src->dash_oldest_segment); + src->dash_oldest_segment = NULL; + } + if (src->dash_newest_segment) { + g_free (src->dash_newest_segment); + src->dash_newest_segment = NULL; + } +#endif src->ret = GST_FLOW_OK; gst_caps_replace (&src->src_caps, NULL); @@ -486,6 +496,10 @@ gst_soup_http_src_init (GstSoupHTTPSrc * src) src->tls_database = DEFAULT_TLS_DATABASE; src->max_retries = DEFAULT_RETRIES; src->method = DEFAULT_SOUP_METHOD; +#ifdef TIZEN_FEATURE_SOUP_MODIFICATION + src->dash_oldest_segment = NULL; + src->dash_newest_segment = NULL; +#endif proxy = g_getenv ("http_proxy"); if (!gst_soup_http_src_set_proxy (src, proxy)) { GST_WARNING_OBJECT (src, @@ -838,10 +852,9 @@ gst_soup_http_src_add_range_header (GstSoupHTTPSrc * src, guint64 offset, soup_message_headers_remove (src->msg->request_headers, "Range"); -/*[prasenjit.c]This changes are needed to enable Seekable Contents from server. -We have observed that , for few specific networks ( VODAFONE ) , without theabove headers , -Youtube is sending non-seekable contents to the Client. -*/ +/* This changes are needed to enable Seekable Contents from server. + We have observed that , for few specific networks ( VODAFONE ) , without theabove headers , + Youtube is sending non-seekable contents to the Client. */ #ifndef TIZEN_FEATURE_SOUP_MODIFICATION if (offset || stop_offset != -1) #endif @@ -1096,9 +1109,9 @@ gst_soup_http_src_session_close (GstSoupHTTPSrc * src) g_mutex_lock (&src->mutex); if (src->session) { #ifdef TIZEN_FEATURE_SOUP_MODIFICATION -//[prasenjit.c] When Playback is ongoing and Browser is moved to background ( Pressing Menu or Home Key ), The Session gets destroyed. -// But the cookie_jar property remains unfreed. This results in garbage pointer and causes crash. -// Removing the cookie_jar feature during close session of browser to handle the issue. +/* When Playback is ongoing and Browser is moved to background ( Pressing Menu or Home Key ), The Session gets destroyed. + But the cookie_jar property remains unfreed. This results in garbage pointer and causes crash. + Removing the cookie_jar feature during close session of browser to handle the issue. */ GST_DEBUG_OBJECT (src, "Removing Cookie Jar instance"); soup_session_remove_feature_by_type(src->session, SOUP_TYPE_COOKIE_JAR); src->cookie_jar = NULL; @@ -1217,6 +1230,24 @@ gst_soup_http_src_headers_foreach (const gchar * name, const gchar * val, GST_INFO_OBJECT (src, "request url [%s], posted cookies [%s] msg and returned = %d", tmp->location, val, bret); } } + else if (g_ascii_strcasecmp (name, "Dash-Oldest-Segment") == 0) + { + if (val) + { + GstSoupHTTPSrc * tmp = src; + tmp->dash_oldest_segment = g_strdup (val); + GST_INFO_OBJECT (src, "Dash-Oldest-Segment set as %s ", tmp->dash_oldest_segment); + } + } + else if (g_ascii_strcasecmp (name, "Dash-Newest-Segment") == 0) + { + if (val) + { + GstSoupHTTPSrc * tmp = src; + tmp->dash_newest_segment = g_strdup (val); + GST_INFO_OBJECT (src, "Dash-Newest-Segment set as %s ", tmp->dash_newest_segment); + } + } } #endif @@ -1815,10 +1846,9 @@ gst_soup_http_src_build_message (GstSoupHTTPSrc * src, const gchar * method) } #ifdef TIZEN_FEATURE_SOUP_MODIFICATION -/*[prasenjit.c]This changes are needed to enable Seekable Contents from server. -We have observed that , for few specific networks ( VODAFONE ) , without theabove headers , -Youtube is sending non-seekable contents to the Client. -*/ +/* This changes are needed to enable Seekable Contents from server. + We have observed that , for few specific networks ( VODAFONE ) , without theabove headers , + Youtube is sending non-seekable contents to the Client. */ soup_message_headers_append (src->msg->request_headers, "Accept-Ranges","bytes"); if (src->cookie_jar) { @@ -2018,6 +2048,16 @@ gst_soup_http_src_start (GstBaseSrc * bsrc) GST_DEBUG_OBJECT (src, "start(\"%s\")", src->location); +#ifdef TIZEN_FEATURE_SOUP_MODIFICATION + if (src->dash_oldest_segment) { + g_free (src->dash_oldest_segment); + src->dash_oldest_segment = NULL; + } + if (src->dash_newest_segment) { + g_free (src->dash_newest_segment); + src->dash_newest_segment = NULL; + } +#endif return gst_soup_http_src_session_open (src); } diff --git a/ext/soup/gstsouphttpsrc.h b/ext/soup/gstsouphttpsrc.h index bfb32e0..fdc8318 100644 --- a/ext/soup/gstsouphttpsrc.h +++ b/ext/soup/gstsouphttpsrc.h @@ -114,6 +114,10 @@ struct _GstSoupHTTPSrc { GCond request_finished_cond; GstEvent *http_headers_event; +#ifdef TIZEN_FEATURE_SOUP_MODIFICATION + gchar *dash_oldest_segment; + gchar *dash_newest_segment; +#endif }; struct _GstSoupHTTPSrcClass { diff --git a/gst/rtpmanager/gstrtpbin.c b/gst/rtpmanager/gstrtpbin.c index 9098eed..d921235 100644 --- a/gst/rtpmanager/gstrtpbin.c +++ b/gst/rtpmanager/gstrtpbin.c @@ -2613,44 +2613,44 @@ gst_rtp_bin_handle_message (GstBin * bin, GstMessage * message) streams = g_slist_next (streams)) { GstRtpBinStream *stream = (GstRtpBinStream *) streams->data; #ifdef TIZEN_FEATURE_RTSP_MODIFICATION - GstPad *temp_pad_src = NULL; - GstCaps *temp_caps_src = NULL; - GstStructure *caps_structure; - const gchar *caps_str_media = NULL; - temp_pad_src = gst_element_get_static_pad (stream->buffer, "src"); - temp_caps_src = gst_pad_get_current_caps(temp_pad_src); - GST_DEBUG_OBJECT (bin, "stream %p percent %d : temp_caps_src=%"GST_PTR_FORMAT, stream,stream->percent,temp_caps_src); - if (temp_caps_src) - { - caps_structure = gst_caps_get_structure (temp_caps_src, 0); - caps_str_media = gst_structure_get_string (caps_structure, "media"); - if (caps_str_media != NULL) - { - if ((strcmp(caps_str_media,"video") != 0)&&(strcmp(caps_str_media,"audio") != 0)) - { - GST_DEBUG_OBJECT (bin, "Non Audio/Video Stream.. ignoring the same !!"); - gst_caps_unref( temp_caps_src ); - gst_object_unref( temp_pad_src ); - continue; - } - else if(stream->percent >= 100) - { - /*[shweta.agg] Most of the time buffering icon displays in rtsp playback. - Optimizing the buffering updation code. Whenever any stream percentage - reaches 100 do not post buffering messages.*/ - if(stream->prev_percent < 100) - { - buffering_flag = TRUE; - } - else - { - update_buffering_status = FALSE; - } - } - } - gst_caps_unref( temp_caps_src ); - } - gst_object_unref( temp_pad_src ); + GstPad *temp_pad_src = NULL; + GstCaps *temp_caps_src = NULL; + GstStructure *caps_structure; + const gchar *caps_str_media = NULL; + temp_pad_src = gst_element_get_static_pad (stream->buffer, "src"); + temp_caps_src = gst_pad_get_current_caps(temp_pad_src); + GST_DEBUG_OBJECT (bin, "stream %p percent %d : temp_caps_src=%"GST_PTR_FORMAT, stream,stream->percent,temp_caps_src); + if (temp_caps_src) + { + caps_structure = gst_caps_get_structure (temp_caps_src, 0); + caps_str_media = gst_structure_get_string (caps_structure, "media"); + if (caps_str_media != NULL) + { + if ((strcmp(caps_str_media,"video") != 0)&&(strcmp(caps_str_media,"audio") != 0)) + { + GST_DEBUG_OBJECT (bin, "Non Audio/Video Stream.. ignoring the same !!"); + gst_caps_unref( temp_caps_src ); + gst_object_unref( temp_pad_src ); + continue; + } + else if(stream->percent >= 100) + { + /* Most of the time buffering icon displays in rtsp playback. + Optimizing the buffering updation code. Whenever any stream percentage + reaches 100 do not post buffering messages.*/ + if(stream->prev_percent < 100) + { + buffering_flag = TRUE; + } + else + { + update_buffering_status = FALSE; + } + } + } + gst_caps_unref( temp_caps_src ); + } + gst_object_unref( temp_pad_src ); #else GST_DEBUG_OBJECT (bin, "stream %p percent %d", stream, stream->percent); @@ -2659,8 +2659,8 @@ gst_rtp_bin_handle_message (GstBin * bin, GstMessage * message) if (min_percent > stream->percent) min_percent = stream->percent; #ifdef TIZEN_FEATURE_RTSP_MODIFICATION - /* Updating prev stream percentage */ - stream->prev_percent = stream->percent; + /* Updating prev stream percentage */ + stream->prev_percent = stream->percent; #endif } } else { diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c index a8e6209..01a8535 100644 --- a/gst/rtsp/gstrtspsrc.c +++ b/gst/rtsp/gstrtspsrc.c @@ -5571,7 +5571,7 @@ gst_rtspsrc_loop_error_cmd (GstRTSPSrc * src, gint cmd) case CMD_OPEN: GST_ELEMENT_PROGRESS (src, ERROR, "open", ("Open failed")); #ifdef TIZEN_FEATURE_RTSP_MODIFICATION -/*[shweta.agg] Ending conditional wait for pause when open fails.*/ +/* Ending conditional wait for pause when open fails.*/ g_mutex_lock(&(src)->pause_lock); g_cond_signal (&(src)->open_end); g_mutex_unlock(&(src)->pause_lock); @@ -7248,7 +7248,7 @@ gst_rtspsrc_parse_range (GstRTSPSrc * src, const gchar * range, segment->start = seconds; #ifndef TIZEN_FEATURE_RTSP_MODIFICATION /* -[prasenjit.c] The range-min points to the start of the segment , not the current position. +The range-min points to the start of the segment , not the current position. After getting the current position from MSL during normal pause/resume or during seek , we should not update the segment->position again with the rtp header npt timestamp. */ @@ -7449,7 +7449,7 @@ gst_rtspsrc_open_from_sdp (GstRTSPSrc * src, GstSDPMessage * sdp, src->state = GST_RTSP_STATE_INIT; #ifdef TIZEN_FEATURE_RTSP_MODIFICATION - //[prasenjit.c] Check for the support for the Media codecs + /* Check for the support for the Media codecs */ if ((!src->is_audio_codec_supported)&&(!src->is_video_codec_supported)) { GST_ERROR_OBJECT (src, "UnSupported Media Type !!!! \n"); @@ -8132,7 +8132,7 @@ gst_rtspsrc_play (GstRTSPSrc * src, GstSegment * segment, gboolean async) else { /* -[prasenjit.c] Updating position with the MSL current position as gst_rtspsrc_get_position() does not return correct position. + Updating position with the MSL current position as gst_rtspsrc_get_position() does not return correct position. */ GST_DEBUG_OBJECT (src, " During normal pause-resume , segment->position=%" GST_TIME_FORMAT",src->start_position=%"GST_TIME_FORMAT, GST_TIME_ARGS (segment->position),GST_TIME_ARGS (src->start_position)); @@ -8140,7 +8140,7 @@ gst_rtspsrc_play (GstRTSPSrc * src, GstSegment * segment, gboolean async) } /* -[prasenjit.c] Sending the npt range request for each play request for updating the segment position properly. + Sending the npt range request for each play request for updating the segment position properly. */ hval = gen_range_header (src, segment); gst_rtsp_message_take_header (&request, GST_RTSP_HDR_RANGE, hval);