From b9272dc0e654d4ad519d572c6edc80bc628ffb3b Mon Sep 17 00:00:00 2001 From: "Andre Moreira Magalhaes (andrunko)" Date: Tue, 12 Feb 2013 22:54:32 -0200 Subject: [PATCH] dashdemux: Properly parse base uri from mpd. --- ext/dash/gstmpdparser.c | 58 +++++++++++++++++++++++++++++++++---------------- ext/dash/gstmpdparser.h | 1 + 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/ext/dash/gstmpdparser.c b/ext/dash/gstmpdparser.c index dc7ff04..c8f133d 100644 --- a/ext/dash/gstmpdparser.c +++ b/ext/dash/gstmpdparser.c @@ -110,7 +110,7 @@ static gint convert_to_millisecs (gint decimals, gint pos); static int strncmp_ext (const char *s1, const char *s2); static GstStreamPeriod *gst_mpdparser_get_stream_period (GstMpdClient * client); static gchar *gst_mpdparser_parse_baseURL (GstMpdClient * client, - GstActiveStream * stream); + GstActiveStream * stream, gchar ** query); static gchar *gst_mpdparser_get_segmentURL_for_range (gchar * url, GstRange * range); static gchar *gst_mpdparser_get_mediaURL (GstActiveStream * stream, @@ -1850,14 +1850,14 @@ gst_mpdparser_get_segment_base (GstPeriodNode * Period, if (Representation && Representation->SegmentList && Representation->SegmentList->MultSegBaseType && Representation->SegmentList->MultSegBaseType->SegBaseType - && Representation->SegmentList->MultSegBaseType-> - SegBaseType->Initialization) { + && Representation->SegmentList->MultSegBaseType->SegBaseType-> + Initialization) { SegmentBase = Representation->SegmentList->MultSegBaseType->SegBaseType; } else if (AdaptationSet && AdaptationSet->SegmentList && AdaptationSet->SegmentList->MultSegBaseType && AdaptationSet->SegmentList->MultSegBaseType->SegBaseType - && AdaptationSet->SegmentList->MultSegBaseType-> - SegBaseType->Initialization) { + && AdaptationSet->SegmentList->MultSegBaseType->SegBaseType-> + Initialization) { SegmentBase = AdaptationSet->SegmentList->MultSegBaseType->SegBaseType; } else if (Period && Period->SegmentList && Period->SegmentList->MultSegBaseType @@ -2298,6 +2298,10 @@ static void gst_mpdparser_free_active_stream (GstActiveStream * active_stream) { if (active_stream) { + g_free (active_stream->baseURL); + active_stream->baseURL = NULL; + g_free (active_stream->queryURL); + active_stream->queryURL = NULL; g_list_foreach (active_stream->segments, (GFunc) gst_mpdparser_free_media_segment, NULL); g_list_free (active_stream->segments); @@ -2424,7 +2428,8 @@ gst_mpdparser_get_stream_period (GstMpdClient * client) /* select a stream and extract the baseURL (if present) */ static gchar * -gst_mpdparser_parse_baseURL (GstMpdClient * client, GstActiveStream * stream) +gst_mpdparser_parse_baseURL (GstMpdClient * client, GstActiveStream * stream, + gchar ** query) { //GstActiveStream *stream; GstStreamPeriod *stream_period; @@ -2484,19 +2489,32 @@ gst_mpdparser_parse_baseURL (GstMpdClient * client, GstActiveStream * stream) /* get base URI from MPD file URI, if the "http" scheme is missing */ if (client->mpd_uri != NULL && strncmp (ret, "http://", 7) != 0) { gchar *last_sep, *tmp1, *tmp2; + + if (ret[0] == '?') { + if (query) + *query = g_strdup (ret); + g_free (ret); + ret = NULL; + } else { + if (query) + *query = NULL; + } + last_sep = strrchr (client->mpd_uri, '/'); if (last_sep) { tmp1 = g_strndup (client->mpd_uri, last_sep - client->mpd_uri + 1); - tmp2 = ret; - GST_DEBUG ("Got base URI from MPD file URI %s", tmp1); - ret = g_strconcat (tmp1, tmp2, NULL); - g_free (tmp1); - g_free (tmp2); + if (ret) { + tmp2 = ret; + ret = g_strconcat (tmp1, tmp2, NULL); + g_free (tmp1); + g_free (tmp2); + } else { + ret = tmp1; + } + GST_WARNING ("Got base URI from MPD file URI %s", ret); } } - GST_DEBUG ("selected baseURL with index %d: %s", stream->baseURL_idx, ret); - return ret; } @@ -2897,7 +2915,9 @@ gst_mpd_client_setup_representation (GstMpdClient * client, } g_free (stream->baseURL); - stream->baseURL = gst_mpdparser_parse_baseURL (client, stream); + g_free (stream->queryURL); + stream->baseURL = + gst_mpdparser_parse_baseURL (client, stream, &stream->queryURL); return TRUE; } @@ -3202,11 +3222,11 @@ gst_mpd_client_get_next_fragment (GstMpdClient * client, /* single segment with URL encoded in the baseURL syntax element */ *uri = g_strdup (stream->baseURL); } else if (strncmp (mediaURL, "http://", 7) != 0) { - *uri = g_strconcat (stream->baseURL, mediaURL, NULL); - g_free (mediaURL); + *uri = g_strconcat (stream->baseURL, mediaURL, stream->queryURL, NULL); } else { - *uri = mediaURL; + *uri = g_strconcat (mediaURL, stream->queryURL, NULL); } + g_free (mediaURL); gst_mpd_client_set_segment_index (stream, segment_idx + 1); GST_MPD_CLIENT_UNLOCK (client); @@ -3234,8 +3254,8 @@ gst_mpd_client_get_next_header (GstMpdClient * client, const gchar ** uri, *uri = NULL; if (stream->cur_segment_base && stream->cur_segment_base->Initialization) { *uri = - gst_mpdparser_get_initializationURL (stream-> - cur_segment_base->Initialization); + gst_mpdparser_get_initializationURL (stream->cur_segment_base-> + Initialization); } else if (stream->cur_seg_template) { const gchar *initialization = NULL; if (stream->cur_seg_template->initialization) { diff --git a/ext/dash/gstmpdparser.h b/ext/dash/gstmpdparser.h index 16ad7e0..a2b8718 100644 --- a/ext/dash/gstmpdparser.h +++ b/ext/dash/gstmpdparser.h @@ -428,6 +428,7 @@ struct _GstActiveStream guint baseURL_idx; /* index of the baseURL used for last request */ gchar *baseURL; /* active baseURL used for last request */ + gchar *queryURL; /* active baseURL used for last request */ guint max_bandwidth; /* max bandwidth allowed for this mimeType */ GstAdaptationSetNode *cur_adapt_set; /* active adaptation set */ -- 2.7.4