summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2015-09-03 14:20:00 +0300
committerSebastian Dröge <sebastian@centricular.com>2015-09-14 19:53:18 +0200
commitc9f60db2d489cda27629e91fe3009e7c90769460 (patch)
treedae6a710991481023d44c45e70f6b34d758d410f
parentd9c45e918fd70cfbb2dea076c0320f1b69146c3a (diff)
downloadgstreamer-plugins-bad-c9f60db2d489cda27629e91fe3009e7c90769460.tar.gz
mpdparser: Don't consider period start times in periods with segment lists either
https://bugzilla.gnome.org/show_bug.cgi?id=754222
-rw-r--r--ext/dash/gstmpdparser.c13
-rw-r--r--tests/check/elements/dash_mpd.c24
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 =
"<?xml version=\"1.0\"?>"
"<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
@@ -4103,6 +4108,9 @@ GST_START_TEST (dash_mpdparser_segment_template)
assert_equals_uint64 (fragment.duration, expectedDuration * GST_MSECOND);
assert_equals_uint64 (fragment.timestamp, expectedTimestamp * GST_MSECOND);
+ periodStartTime = gst_mpd_parser_get_period_start_time (mpdclient);
+ assert_equals_uint64 (periodStartTime, 10 * GST_SECOND);
+
gst_media_fragment_info_clear (&fragment);
gst_mpd_client_free (mpdclient);
@@ -4177,7 +4185,7 @@ GST_START_TEST (dash_mpdparser_segment_timeline)
/* expected duration of the next fragment */
expectedDuration = duration_to_ms (0, 0, 0, 0, 0, 2, 0);
- expectedTimestamp = duration_to_ms (0, 0, 0, 0, 0, 13, 0);
+ expectedTimestamp = duration_to_ms (0, 0, 0, 0, 0, 3, 0);
ret = gst_mpd_client_get_next_fragment (mpdclient, 0, &fragment);
assert_equals_int (ret, TRUE);
@@ -4209,11 +4217,9 @@ GST_START_TEST (dash_mpdparser_segment_timeline)
flow = gst_mpd_client_advance_segment (mpdclient, activeStream, TRUE);
assert_equals_int (flow, GST_FLOW_OK);
- /* third segment has a small gap after the second ends (t=10)
- * We also need to take into consideration period's start (10)
- */
+ /* third segment has a small gap after the second ends (t=10) */
expectedDuration = duration_to_ms (0, 0, 0, 0, 0, 3, 0);
- expectedTimestamp = duration_to_ms (0, 0, 0, 0, 0, 20, 0);
+ expectedTimestamp = duration_to_ms (0, 0, 0, 0, 0, 10, 0);
/* check third segment */
ret = gst_mpd_client_get_next_fragment (mpdclient, 0, &fragment);