From c9f60db2d489cda27629e91fe3009e7c90769460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 3 Sep 2015 14:20:00 +0300 Subject: mpdparser: Don't consider period start times in periods with segment lists either https://bugzilla.gnome.org/show_bug.cgi?id=754222 --- ext/dash/gstmpdparser.c | 13 ++++++------- tests/check/elements/dash_mpd.c | 24 +++++++++++++++--------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/ext/dash/gstmpdparser.c b/ext/dash/gstmpdparser.c index 7312cf953..da80aa22b 100644 --- a/ext/dash/gstmpdparser.c +++ b/ext/dash/gstmpdparser.c @@ -3204,7 +3204,7 @@ gst_mpd_client_setup_representation (GstMpdClient * client, GST_DEBUG ("No useful SegmentList node for the current Representation"); /* here we should have a single segment for each representation, whose URL is encoded in the baseURL element */ if (!gst_mpd_client_add_media_segment (stream, NULL, 1, 0, 0, - PeriodEnd - PeriodStart, PeriodStart, PeriodEnd - PeriodStart)) { + PeriodEnd - PeriodStart, 0, PeriodEnd - PeriodStart)) { return FALSE; } } else { @@ -3219,7 +3219,7 @@ gst_mpd_client_setup_representation (GstMpdClient * client, /* build segment list */ i = stream->cur_segment_list->MultSegBaseType->startNumber; start = 0; - start_time = PeriodStart; + start_time = 0; GST_LOG ("Building media segment list using a SegmentList node"); if (stream->cur_segment_list->MultSegBaseType->SegmentTimeline) { @@ -3242,7 +3242,6 @@ gst_mpd_client_setup_representation (GstMpdClient * client, if (S->t > 0) { start = S->t; start_time = gst_util_uint64_scale (S->t, GST_SECOND, timescale); - start_time += PeriodStart; } if (!gst_mpd_client_add_media_segment (stream, SegmentURL->data, i, @@ -3289,7 +3288,7 @@ gst_mpd_client_setup_representation (GstMpdClient * client, gst_mpdparser_init_active_stream_segments (stream); /* here we should have a single segment for each representation, whose URL is encoded in the baseURL element */ if (!gst_mpd_client_add_media_segment (stream, NULL, 1, 0, 0, - PeriodEnd - PeriodStart, PeriodStart, PeriodEnd - PeriodStart)) { + PeriodEnd - PeriodStart, 0, PeriodEnd - PeriodStart)) { return FALSE; } } else { @@ -3298,7 +3297,7 @@ gst_mpd_client_setup_representation (GstMpdClient * client, /* build segment list */ i = mult_seg->startNumber; start = 0; - start_time = PeriodStart; + start_time = 0; GST_LOG ("Building media segment list using this template: %s", stream->cur_seg_template->media); @@ -3329,7 +3328,6 @@ gst_mpd_client_setup_representation (GstMpdClient * client, if (S->t > 0) { start = S->t; start_time = gst_util_uint64_scale (S->t, GST_SECOND, timescale); - start_time += PeriodStart; } if (!gst_mpd_client_add_media_segment (stream, NULL, i, S->r, start, @@ -3353,7 +3351,8 @@ gst_mpd_client_setup_representation (GstMpdClient * client, if (last_media_segment && GST_CLOCK_TIME_IS_VALID (PeriodEnd)) { if (last_media_segment->start + last_media_segment->duration > PeriodEnd) { - last_media_segment->duration = PeriodEnd - last_media_segment->start; + last_media_segment->duration = + PeriodEnd - PeriodStart - last_media_segment->start; GST_LOG ("Fixed duration of last segment: %" GST_TIME_FORMAT, GST_TIME_ARGS (last_media_segment->duration)); } diff --git a/tests/check/elements/dash_mpd.c b/tests/check/elements/dash_mpd.c index 4a5277586..66b6bd7f2 100644 --- a/tests/check/elements/dash_mpd.c +++ b/tests/check/elements/dash_mpd.c @@ -3715,6 +3715,7 @@ GST_START_TEST (dash_mpdparser_fragments) GstClockTime nextFragmentDuration; GstClockTime nextFragmentTimestamp; GstClockTime nextFragmentTimestampEnd; + GstClockTime periodStartTime; GstClockTime expectedDuration; GstClockTime expectedTimestamp; GstClockTime expectedTimestampEnd; @@ -3754,8 +3755,8 @@ GST_START_TEST (dash_mpdparser_fragments) /* expected duration of the next fragment */ expectedDuration = duration_to_ms (0, 0, 0, 3, 3, 20, 0); - expectedTimestamp = duration_to_ms (0, 0, 0, 0, 0, 10, 0); - expectedTimestampEnd = duration_to_ms (0, 0, 0, 3, 3, 30, 0); + expectedTimestamp = duration_to_ms (0, 0, 0, 0, 0, 0, 0); + expectedTimestampEnd = duration_to_ms (0, 0, 0, 3, 3, 20, 0); ret = gst_mpd_client_get_next_fragment (mpdclient, 0, &fragment); assert_equals_int (ret, TRUE); @@ -3766,6 +3767,9 @@ GST_START_TEST (dash_mpdparser_fragments) assert_equals_uint64 (fragment.timestamp, expectedTimestamp * GST_MSECOND); gst_media_fragment_info_clear (&fragment); + periodStartTime = gst_mpd_parser_get_period_start_time (mpdclient); + assert_equals_uint64 (periodStartTime, 10 * GST_SECOND); + nextFragmentDuration = gst_mpd_client_get_next_fragment_duration (mpdclient, activeStream); assert_equals_uint64 (nextFragmentDuration, expectedDuration * GST_MSECOND); @@ -3902,7 +3906,7 @@ GST_START_TEST (dash_mpdparser_inherited_segmentURL) * We expect duration to be 110 */ expectedDuration = duration_to_ms (0, 0, 0, 0, 0, 110, 0); - expectedTimestamp = duration_to_ms (0, 0, 0, 0, 0, 10, 0); + expectedTimestamp = duration_to_ms (0, 0, 0, 0, 0, 0, 0); /* the representation contains 2 segments * - one inherited from AdaptationSet (duration 100) @@ -4007,7 +4011,7 @@ GST_START_TEST (dash_mpdparser_segment_list) * We expect it to be limited to period duration. */ expectedDuration = duration_to_ms (0, 0, 0, 3, 3, 20, 0); - expectedTimestamp = duration_to_ms (0, 0, 0, 0, 0, 10, 0); + expectedTimestamp = duration_to_ms (0, 0, 0, 0, 0, 0, 0); ret = gst_mpd_client_get_next_fragment (mpdclient, 0, &fragment); assert_equals_int (ret, TRUE); @@ -4039,6 +4043,7 @@ GST_START_TEST (dash_mpdparser_segment_template) GstMediaFragmentInfo fragment; GstClockTime expectedDuration; GstClockTime expectedTimestamp; + GstClockTime periodStartTime; const gchar *xml = "" "