Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix MPD Timing (remove publishTime & presentationTimeOffset) #564

Merged
merged 3 commits into from
Apr 8, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/common/AdaptiveTree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
5 changes: 2 additions & 3 deletions src/common/AdaptiveTree.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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_;

Expand Down
18 changes: 3 additions & 15 deletions src/parser/DASHTree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand All @@ -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;
Expand Down Expand Up @@ -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<int64_t>(calc_time - dash->available_time_ -
uint64_t sample_time = dash->current_period_->start_ / 1000;

seg.range_end_ += (static_cast<int64_t>(dash->stream_start_ - dash->available_time_ -
overallSeconds - sample_time)) *
tpl.timescale / tpl.duration +
1;
Expand Down
28 changes: 28 additions & 0 deletions src/test/TestDASHTree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<adaptive::AdaptiveTree::Segment> 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<adaptive::AdaptiveTree::Segment> 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);
}
47 changes: 47 additions & 0 deletions src/test/manifests/mpd/segtimeline_old_publish_time.mpd
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:cenc="urn:mpeg:cenc:2013" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" type="dynamic" publishTime="2021-03-04T00:02:12.271Z" minimumUpdatePeriod="PT4S" availabilityStartTime="2021-03-04T00:02:12.271Z" minBufferTime="PT12S" suggestedPresentationDelay="PT30S" timeShiftBufferDepth="PT2M" profiles="urn:mpeg:dash:profile:isoff-live:2011">
<BaseURL>https://d15umi5iaezxgx.cloudfront.net/OUT/DASH/</BaseURL>
<Period start="PT0S" id="1" >
<AdaptationSet mimeType="video/mp4" frameRate="25/1" segmentAlignment="true" subsegmentAlignment="true" startWithSAP="1" subsegmentStartsWithSAP="1" bitstreamSwitching="false" >
<ContentProtection cenc:default_KID="DB057321-C922-4C25-A7CC-D75D911DD1FC" schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc"/>
<ContentProtection cenc:default_KID="DB057321-C922-4C25-A7CC-D75D911DD1FC" schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95">
<cenc:pssh xmlns:cenc="urn:mpeg:cenc:2013">AAAEMHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAABBAQBAAAAQABAAYEPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwAHMAOgAvAC8AbABhADcALgBwAHIAbwBkAC4AYwBvAG4AYQB4AC4AYwBsAG8AdQBkAC8AYwB4AHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPAAvAEwAQQBfAFUAUgBMAD4APABMAFUASQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAYQA3AC4AcAByAG8AZAAuAGMAbwBuAGEAeAAuAGMAbABvAHUAZAAvAGMAeABwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAFUASQBfAFUAUgBMAD4APABLAEkARAA+AEkAWABNAEYAMgB5AEwASgBKAFUAeQBuAHoATgBkAGQAawBSADMAUgAvAEEAPQA9ADwALwBLAEkARAA+ADwAQwBVAFMAVABPAE0AQQBUAFQAUgBJAEIAVQBUAEUAUwAgAHgAbQBsAG4AcwA9ACIAIgA+ADwAQwBvAG4AdABlAG4AdABSAGUAZgA+ADgAZgA5ADUAZAA0ADAAYQAtADcANwBmAGIALQA0ADYAMAAwAC0AOABmADUAOAAtADAAOABmAGUAOAA4ADMANwA2AGEAMwA5ADwALwBDAG8AbgB0AGUAbgB0AFIAZQBmAD4APAAvAEMAVQBTAFQATwBNAEEAVABUAFIASQBCAFUAVABFAFMAPgA8AEMASABFAEMASwBTAFUATQA+AFoAegBMAGYAUQBFAFgAOABTADQAOAA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==</cenc:pssh>
</ContentProtection>
<ContentProtection xmlns:mspr="urn:microsoft:playready" schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95">
<mspr:pro>EAQAAAEAAQAGBDwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAYQA3AC4AcAByAG8AZAAuAGMAbwBuAGEAeAAuAGMAbABvAHUAZAAvAGMAeABwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwATABVAEkAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBsAGEANwAuAHAAcgBvAGQALgBjAG8AbgBhAHgALgBjAGwAbwB1AGQALwBjAHgAcABsAGEAeQByAGUAYQBkAHkALwByAGkAZwBoAHQAcwBtAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA8AC8ATABVAEkAXwBVAFIATAA+ADwASwBJAEQAPgBJAFgATQBGADIAeQBMAEoASgBVAHkAbgB6AE4AZABkAGsAUgAzAFIALwBBAD0APQA8AC8ASwBJAEQAPgA8AEMAVQBTAFQATwBNAEEAVABUAFIASQBCAFUAVABFAFMAIAB4AG0AbABuAHMAPQAiACIAPgA8AEMAbwBuAHQAZQBuAHQAUgBlAGYAPgA4AGYAOQA1AGQANAAwAGEALQA3ADcAZgBiAC0ANAA2ADAAMAAtADgAZgA1ADgALQAwADgAZgBlADgAOAAzADcANgBhADMAOQA8AC8AQwBvAG4AdABlAG4AdABSAGUAZgA+ADwALwBDAFUAUwBUAE8ATQBBAFQAVABSAEkAQgBVAFQARQBTAD4APABDAEgARQBDAEsAUwBVAE0APgBaAHoATABmAFEARQBYADgAUwA0ADgAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=</mspr:pro>
</ContentProtection>
<ContentProtection cenc:default_KID="DB057321-C922-4C25-A7CC-D75D911DD1FC" schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc"/>
<ContentProtection cenc:default_KID="DB057321-C922-4C25-A7CC-D75D911DD1FC" schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh xmlns:cenc="urn:mpeg:cenc:2013">AAAAYXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAEEIARIQ2wVzIckiTCWnzNddkR3R/BoFQ29uYXgiJDhmOTVkNDBhLTc3ZmItNDYwMC04ZjU4LTA4ZmU4ODM3NmEzOQ==</cenc:pssh>
</ContentProtection>
<SegmentTemplate timescale="90000" duration="360000" startNumber="1"/>
<Representation id="1" width="960" height="540" bandwidth="1700000" codecs="avc1.64001f">
<SegmentTemplate duration="360000" startNumber="1" media="Live_960x540_$Number%09d$.mp4" initialization="Live_960x540init.mp4" availabilityTimeOffset="-30.0"/>
</Representation>
<Representation id="2" width="640" height="360" bandwidth="660000" codecs="avc1.4d401e">
<SegmentTemplate duration="360000" startNumber="1" media="Live_640x360_$Number%09d$.mp4" initialization="Live_640x360init.mp4" availabilityTimeOffset="-30.0"/>
</Representation>
<Representation id="3" width="480" height="270" bandwidth="350000" codecs="avc1.4d401e">
<SegmentTemplate duration="360000" startNumber="1" media="Live_480x270_$Number%09d$.mp4" initialization="Live_480x270init.mp4" availabilityTimeOffset="-30.0"/>
</Representation>
<Representation id="4" width="416" height="234" bandwidth="145000" codecs="avc1.4d401e">
<SegmentTemplate duration="360000" startNumber="1" media="Live_416x234_$Number%09d$.mp4" initialization="Live_416x234init.mp4" availabilityTimeOffset="-30.0"/>
</Representation>
</AdaptationSet>
<AdaptationSet mimeType="audio/mp4" segmentAlignment="0">
<ContentProtection cenc:default_KID="DB057321-C922-4C25-A7CC-D75D911DD1FC" schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc"/>
<ContentProtection cenc:default_KID="DB057321-C922-4C25-A7CC-D75D911DD1FC" schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95">
<cenc:pssh xmlns:cenc="urn:mpeg:cenc:2013">AAAEMHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAABBAQBAAAAQABAAYEPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwAHMAOgAvAC8AbABhADcALgBwAHIAbwBkAC4AYwBvAG4AYQB4AC4AYwBsAG8AdQBkAC8AYwB4AHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPAAvAEwAQQBfAFUAUgBMAD4APABMAFUASQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAYQA3AC4AcAByAG8AZAAuAGMAbwBuAGEAeAAuAGMAbABvAHUAZAAvAGMAeABwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAFUASQBfAFUAUgBMAD4APABLAEkARAA+AEkAWABNAEYAMgB5AEwASgBKAFUAeQBuAHoATgBkAGQAawBSADMAUgAvAEEAPQA9ADwALwBLAEkARAA+ADwAQwBVAFMAVABPAE0AQQBUAFQAUgBJAEIAVQBUAEUAUwAgAHgAbQBsAG4AcwA9ACIAIgA+ADwAQwBvAG4AdABlAG4AdABSAGUAZgA+ADgAZgA5ADUAZAA0ADAAYQAtADcANwBmAGIALQA0ADYAMAAwAC0AOABmADUAOAAtADAAOABmAGUAOAA4ADMANwA2AGEAMwA5ADwALwBDAG8AbgB0AGUAbgB0AFIAZQBmAD4APAAvAEMAVQBTAFQATwBNAEEAVABUAFIASQBCAFUAVABFAFMAPgA8AEMASABFAEMASwBTAFUATQA+AFoAegBMAGYAUQBFAFgAOABTADQAOAA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==</cenc:pssh>
</ContentProtection>
<ContentProtection xmlns:mspr="urn:microsoft:playready" schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95">
<mspr:pro>EAQAAAEAAQAGBDwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAYQA3AC4AcAByAG8AZAAuAGMAbwBuAGEAeAAuAGMAbABvAHUAZAAvAGMAeABwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwATABVAEkAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBsAGEANwAuAHAAcgBvAGQALgBjAG8AbgBhAHgALgBjAGwAbwB1AGQALwBjAHgAcABsAGEAeQByAGUAYQBkAHkALwByAGkAZwBoAHQAcwBtAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA8AC8ATABVAEkAXwBVAFIATAA+ADwASwBJAEQAPgBJAFgATQBGADIAeQBMAEoASgBVAHkAbgB6AE4AZABkAGsAUgAzAFIALwBBAD0APQA8AC8ASwBJAEQAPgA8AEMAVQBTAFQATwBNAEEAVABUAFIASQBCAFUAVABFAFMAIAB4AG0AbABuAHMAPQAiACIAPgA8AEMAbwBuAHQAZQBuAHQAUgBlAGYAPgA4AGYAOQA1AGQANAAwAGEALQA3ADcAZgBiAC0ANAA2ADAAMAAtADgAZgA1ADgALQAwADgAZgBlADgAOAAzADcANgBhADMAOQA8AC8AQwBvAG4AdABlAG4AdABSAGUAZgA+ADwALwBDAFUAUwBUAE8ATQBBAFQAVABSAEkAQgBVAFQARQBTAD4APABDAEgARQBDAEsAUwBVAE0APgBaAHoATABmAFEARQBYADgAUwA0ADgAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=</mspr:pro>
</ContentProtection>
<ContentProtection cenc:default_KID="DB057321-C922-4C25-A7CC-D75D911DD1FC" schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc"/>
<ContentProtection cenc:default_KID="DB057321-C922-4C25-A7CC-D75D911DD1FC" schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh xmlns:cenc="urn:mpeg:cenc:2013">AAAAYXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAEEIARIQ2wVzIckiTCWnzNddkR3R/BoFQ29uYXgiJDhmOTVkNDBhLTc3ZmItNDYwMC04ZjU4LTA4ZmU4ODM3NmEzOQ==</cenc:pssh>
</ContentProtection>
<SegmentTemplate timescale="44100" media="Live_Audio_$Number%09d$.mp4" initialization="Live_Audioinit.mp4" duration="176400" startNumber="1" availabilityTimeOffset="-30.0"/>
<Representation id="5" bandwidth="96000" audioSamplingRate="44100" codecs="mp4a.40.2"/>
</AdaptationSet>
</Period>
</MPD>
22 changes: 22 additions & 0 deletions src/test/manifests/mpd/segtimeline_pto.mpd
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" type="dynamic" minimumUpdatePeriod="PT4.000S" minBufferTime="PT5.000S" maxSegmentDuration="PT4.500S" availabilityStartTime="2021-03-25T23:44:03Z" timeShiftBufferDepth="PT1800.000S" publishTime="2021-03-31T20:52:37Z" profiles="urn:mpeg:dash:profile:isoff-live:2011">
<Period id="404187865" start="PT35652S">
<AdaptationSet mimeType="video/mp4" segmentAlignment="true" startWithSAP="1" maxWidth="1920" maxHeight="1080" maxFrameRate="25" par="25:14">
<SegmentTemplate timescale="90000" initialization="$RepresentationID$/segment-Header-init.m4s" media="$RepresentationID$/segment-$Number$.m4s" duration="360000" startNumber="404187866" presentationTimeOffset="7539818380345"/>
<Representation id="video1" width="400" height="224" frameRate="25" sar="1:1" scanType="progressive" bandwidth="450000" codecs="avc1.4D4015"/>
<Representation id="video2" width="640" height="360" frameRate="25" sar="1:1" scanType="progressive" bandwidth="600000" codecs="avc1.4D401E"/>
<Representation id="video3" width="960" height="540" frameRate="25" sar="1:1" scanType="progressive" bandwidth="1200000" codecs="avc1.4D401F"/>
<Representation id="video4" width="960" height="540" frameRate="25" sar="1:1" scanType="progressive" bandwidth="1800000" codecs="avc1.4D401F"/>
<Representation id="video5" width="1280" height="720" frameRate="25" sar="1:1" scanType="progressive" bandwidth="2600000" codecs="avc1.4D401F"/>
<Representation id="video6" width="1920" height="1080" frameRate="25" sar="1:1" scanType="progressive" bandwidth="3400000" codecs="avc1.4D4028"/>
</AdaptationSet>
<AdaptationSet mimeType="audio/mp4" lang="ar" segmentAlignment="true" startWithSAP="1">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<SegmentTemplate timescale="90000" initialization="$RepresentationID$/segment-Header-init.m4s" media="$RepresentationID$/segment-$Number$.m4s" duration="360000" startNumber="404187866" presentationTimeOffset="7539818380345"/>
<Representation id="audio1" audioSamplingRate="24000" bandwidth="96000" codecs="mp4a.40.2">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
</Representation>
</AdaptationSet>
</Period>
<UTCTiming schemeIdUri="urn:mpeg:dash:utc:direct:2014" value="2021-03-31T20:53:07Z"/>
</MPD>