diff --git a/src/common/AdaptiveTree.cpp b/src/common/AdaptiveTree.cpp index a3473e538..d02321bc0 100644 --- a/src/common/AdaptiveTree.cpp +++ b/src/common/AdaptiveTree.cpp @@ -47,7 +47,6 @@ namespace adaptive , overallSeconds_(0) , stream_start_(0) , available_time_(0) - , publish_time_(0) , base_time_(0) , minPresentationOffset(0) , has_timeshift_buffer_(false) diff --git a/src/common/AdaptiveTree.h b/src/common/AdaptiveTree.h index 258fb07dd..8a80f235a 100644 --- a/src/common/AdaptiveTree.h +++ b/src/common/AdaptiveTree.h @@ -143,11 +143,10 @@ class ATTRIBUTE_HIDDEN AdaptiveTree struct SegmentTemplate { - SegmentTemplate() : timescale(0), duration(0), presentationTimeOffset(0){}; + SegmentTemplate() : timescale(0), duration(0) {}; std::string initialization; std::string media; unsigned int timescale, duration; - uint64_t presentationTimeOffset; }; struct Representation @@ -426,7 +425,7 @@ class ATTRIBUTE_HIDDEN AdaptiveTree uint32_t currentNode_; uint32_t segcount_; uint32_t initial_sequence_ = ~0UL; - uint64_t overallSeconds_, stream_start_, available_time_, publish_time_, base_time_; + uint64_t overallSeconds_, stream_start_, available_time_, base_time_; uint64_t minPresentationOffset; bool has_timeshift_buffer_, has_overall_seconds_; diff --git a/src/parser/DASHTree.cpp b/src/parser/DASHTree.cpp index 1d04f7f4a..474185835 100644 --- a/src/parser/DASHTree.cpp +++ b/src/parser/DASHTree.cpp @@ -107,8 +107,6 @@ static unsigned int ParseSegmentTemplate(const char** attr, tpl.duration = atoi((const char*)*(attr + 1)); else if (strcmp((const char*)*attr, "media") == 0) tpl.media = (const char*)*(attr + 1); - else if (strcmp((const char*)*attr, "presentationTimeOffset") == 0) - tpl.presentationTimeOffset = atoll((const char*)*(attr + 1)); else if (strcmp((const char*)*attr, "startNumber") == 0) startNumber = atoi((const char*)*(attr + 1)); else if (strcmp((const char*)*attr, "initialization") == 0) @@ -1032,8 +1030,6 @@ static void XMLCALL start(void* data, const char* el, const char** attr) } else if (strcmp((const char*)*attr, "availabilityStartTime") == 0) dash->available_time_ = getTime((const char*)*(attr + 1)); - else if (strcmp((const char*)*attr, "publishTime") == 0) - dash->publish_time_ = getTime((const char*)*(attr + 1)); else if (strcmp((const char*)*attr, "minimumUpdatePeriod") == 0) { uint64_t dur(0); @@ -1051,9 +1047,6 @@ static void XMLCALL start(void* data, const char* el, const char** attr) dash->has_overall_seconds_ = dash->overallSeconds_ > 0; uint64_t overallsecs(dash->overallSeconds_ ? dash->overallSeconds_ + 60 : 86400); - if (!dash->base_time_ && dash->publish_time_ && dash->available_time_ && - dash->publish_time_ - dash->available_time_ > overallsecs) - dash->base_time_ = dash->publish_time_ - dash->available_time_ - overallsecs; dash->minPresentationOffset = ~0ULL; dash->currentNode_ |= MPDNODE_MPD; @@ -1242,14 +1235,9 @@ static void XMLCALL end(void* data, const char* el) if (!timeBased && dash->has_timeshift_buffer_ && tpl.duration) { - // get the closest time to calculate start_number - uint64_t calc_time = - dash->publish_time_ ? dash->publish_time_ : dash->stream_start_; - uint64_t sample_time = tpl.presentationTimeOffset - ? tpl.presentationTimeOffset / tpl.timescale - : dash->current_period_->start_ / 1000; - - seg.range_end_ += (static_cast(calc_time - dash->available_time_ - + uint64_t sample_time = dash->current_period_->start_ / 1000; + + seg.range_end_ += (static_cast(dash->stream_start_ - dash->available_time_ - overallSeconds - sample_time)) * tpl.timescale / tpl.duration + 1; diff --git a/src/test/TestDASHTree.cpp b/src/test/TestDASHTree.cpp index 9cdb59145..ebc1970df 100644 --- a/src/test/TestDASHTree.cpp +++ b/src/test/TestDASHTree.cpp @@ -129,3 +129,31 @@ TEST_F(DASHTreeTest, CalculateCorrectSegmentNumbersFromSegmentTimeline) EXPECT_EQ(segments[0]->range_end_, 487050); EXPECT_EQ(segments[12]->range_end_, 487062); } + +TEST_F(DASHTreeTest, CalculateCorrectSegmentNumbersFromSegmentTimelineWithPTO) +{ + tree->mock_time = 1617223929L; + + OpenTestFile("mpd/segtimeline_pto.mpd", "", ""); + + adaptive::SPINCACHE segments = + tree->periods_[0]->adaptationSets_[0]->representations_[0]->segments_; + + EXPECT_EQ(segments.size(), 451); + EXPECT_EQ(segments[0]->range_end_, 404305525); + EXPECT_EQ(segments[450]->range_end_, 404305975); +} + +TEST_F(DASHTreeTest, CalculateCorrectSegmentNumbersFromSegmentTimelineWithOldPublishTime) +{ + tree->mock_time = 1617229334L; + + OpenTestFile("mpd/segtimeline_old_publish_time.mpd", "", ""); + + adaptive::SPINCACHE segments = + tree->periods_[0]->adaptationSets_[0]->representations_[0]->segments_; + + EXPECT_EQ(segments.size(), 31); + EXPECT_EQ(segments[0]->range_end_, 603272); + EXPECT_EQ(segments[30]->range_end_, 603302); +} diff --git a/src/test/manifests/mpd/segtimeline_old_publish_time.mpd b/src/test/manifests/mpd/segtimeline_old_publish_time.mpd new file mode 100644 index 000000000..4c4a0ff40 --- /dev/null +++ b/src/test/manifests/mpd/segtimeline_old_publish_time.mpd @@ -0,0 +1,47 @@ + + + https://d15umi5iaezxgx.cloudfront.net/OUT/DASH/ + + + + + AAAEMHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAABBAQBAAAAQABAAYEPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwAHMAOgAvAC8AbABhADcALgBwAHIAbwBkAC4AYwBvAG4AYQB4AC4AYwBsAG8AdQBkAC8AYwB4AHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPAAvAEwAQQBfAFUAUgBMAD4APABMAFUASQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAYQA3AC4AcAByAG8AZAAuAGMAbwBuAGEAeAAuAGMAbABvAHUAZAAvAGMAeABwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAFUASQBfAFUAUgBMAD4APABLAEkARAA+AEkAWABNAEYAMgB5AEwASgBKAFUAeQBuAHoATgBkAGQAawBSADMAUgAvAEEAPQA9ADwALwBLAEkARAA+ADwAQwBVAFMAVABPAE0AQQBUAFQAUgBJAEIAVQBUAEUAUwAgAHgAbQBsAG4AcwA9ACIAIgA+ADwAQwBvAG4AdABlAG4AdABSAGUAZgA+ADgAZgA5ADUAZAA0ADAAYQAtADcANwBmAGIALQA0ADYAMAAwAC0AOABmADUAOAAtADAAOABmAGUAOAA4ADMANwA2AGEAMwA5ADwALwBDAG8AbgB0AGUAbgB0AFIAZQBmAD4APAAvAEMAVQBTAFQATwBNAEEAVABUAFIASQBCAFUAVABFAFMAPgA8AEMASABFAEMASwBTAFUATQA+AFoAegBMAGYAUQBFAFgAOABTADQAOAA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA== + + + EAQAAAEAAQAGBDwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAYQA3AC4AcAByAG8AZAAuAGMAbwBuAGEAeAAuAGMAbABvAHUAZAAvAGMAeABwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwATABVAEkAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBsAGEANwAuAHAAcgBvAGQALgBjAG8AbgBhAHgALgBjAGwAbwB1AGQALwBjAHgAcABsAGEAeQByAGUAYQBkAHkALwByAGkAZwBoAHQAcwBtAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA8AC8ATABVAEkAXwBVAFIATAA+ADwASwBJAEQAPgBJAFgATQBGADIAeQBMAEoASgBVAHkAbgB6AE4AZABkAGsAUgAzAFIALwBBAD0APQA8AC8ASwBJAEQAPgA8AEMAVQBTAFQATwBNAEEAVABUAFIASQBCAFUAVABFAFMAIAB4AG0AbABuAHMAPQAiACIAPgA8AEMAbwBuAHQAZQBuAHQAUgBlAGYAPgA4AGYAOQA1AGQANAAwAGEALQA3ADcAZgBiAC0ANAA2ADAAMAAtADgAZgA1ADgALQAwADgAZgBlADgAOAAzADcANgBhADMAOQA8AC8AQwBvAG4AdABlAG4AdABSAGUAZgA+ADwALwBDAFUAUwBUAE8ATQBBAFQAVABSAEkAQgBVAFQARQBTAD4APABDAEgARQBDAEsAUwBVAE0APgBaAHoATABmAFEARQBYADgAUwA0ADgAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA= + + + + AAAAYXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAEEIARIQ2wVzIckiTCWnzNddkR3R/BoFQ29uYXgiJDhmOTVkNDBhLTc3ZmItNDYwMC04ZjU4LTA4ZmU4ODM3NmEzOQ== + + + + + + + + + + + + + + + + + + + AAAEMHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAABBAQBAAAAQABAAYEPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwAHMAOgAvAC8AbABhADcALgBwAHIAbwBkAC4AYwBvAG4AYQB4AC4AYwBsAG8AdQBkAC8AYwB4AHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPAAvAEwAQQBfAFUAUgBMAD4APABMAFUASQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAYQA3AC4AcAByAG8AZAAuAGMAbwBuAGEAeAAuAGMAbABvAHUAZAAvAGMAeABwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAFUASQBfAFUAUgBMAD4APABLAEkARAA+AEkAWABNAEYAMgB5AEwASgBKAFUAeQBuAHoATgBkAGQAawBSADMAUgAvAEEAPQA9ADwALwBLAEkARAA+ADwAQwBVAFMAVABPAE0AQQBUAFQAUgBJAEIAVQBUAEUAUwAgAHgAbQBsAG4AcwA9ACIAIgA+ADwAQwBvAG4AdABlAG4AdABSAGUAZgA+ADgAZgA5ADUAZAA0ADAAYQAtADcANwBmAGIALQA0ADYAMAAwAC0AOABmADUAOAAtADAAOABmAGUAOAA4ADMANwA2AGEAMwA5ADwALwBDAG8AbgB0AGUAbgB0AFIAZQBmAD4APAAvAEMAVQBTAFQATwBNAEEAVABUAFIASQBCAFUAVABFAFMAPgA8AEMASABFAEMASwBTAFUATQA+AFoAegBMAGYAUQBFAFgAOABTADQAOAA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA== + + + EAQAAAEAAQAGBDwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAYQA3AC4AcAByAG8AZAAuAGMAbwBuAGEAeAAuAGMAbABvAHUAZAAvAGMAeABwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwATABVAEkAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBsAGEANwAuAHAAcgBvAGQALgBjAG8AbgBhAHgALgBjAGwAbwB1AGQALwBjAHgAcABsAGEAeQByAGUAYQBkAHkALwByAGkAZwBoAHQAcwBtAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA8AC8ATABVAEkAXwBVAFIATAA+ADwASwBJAEQAPgBJAFgATQBGADIAeQBMAEoASgBVAHkAbgB6AE4AZABkAGsAUgAzAFIALwBBAD0APQA8AC8ASwBJAEQAPgA8AEMAVQBTAFQATwBNAEEAVABUAFIASQBCAFUAVABFAFMAIAB4AG0AbABuAHMAPQAiACIAPgA8AEMAbwBuAHQAZQBuAHQAUgBlAGYAPgA4AGYAOQA1AGQANAAwAGEALQA3ADcAZgBiAC0ANAA2ADAAMAAtADgAZgA1ADgALQAwADgAZgBlADgAOAAzADcANgBhADMAOQA8AC8AQwBvAG4AdABlAG4AdABSAGUAZgA+ADwALwBDAFUAUwBUAE8ATQBBAFQAVABSAEkAQgBVAFQARQBTAD4APABDAEgARQBDAEsAUwBVAE0APgBaAHoATABmAFEARQBYADgAUwA0ADgAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA= + + + + AAAAYXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAEEIARIQ2wVzIckiTCWnzNddkR3R/BoFQ29uYXgiJDhmOTVkNDBhLTc3ZmItNDYwMC04ZjU4LTA4ZmU4ODM3NmEzOQ== + + + + + + \ No newline at end of file diff --git a/src/test/manifests/mpd/segtimeline_pto.mpd b/src/test/manifests/mpd/segtimeline_pto.mpd new file mode 100644 index 000000000..abb84d1b8 --- /dev/null +++ b/src/test/manifests/mpd/segtimeline_pto.mpd @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file