Skip to content

Commit

Permalink
Merge pull request #1186 from canalplus/feat/endnumber
Browse files Browse the repository at this point in the history
DASH: Now handle `endNumber` DASH attribute
  • Loading branch information
peaBerberian committed Feb 9, 2023
2 parents 2868277 + d4df246 commit 84bae86
Show file tree
Hide file tree
Showing 34 changed files with 1,073 additions and 62 deletions.
149 changes: 149 additions & 0 deletions manifest.mpd
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8" ?>
<MPD profiles="urn:mpeg:dash:profile:isoff-live:2011" type="dynamic" availabilityStartTime="2022-10-26T02:33:26Z" minimumUpdatePeriod="PT2.0S" minBufferTime="PT2.0S" publishTime="2022-12-02T14:29:12.527Z" timeShiftBufferDepth="PT5M" suggestedPresentationDelay="PT2.0S" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:cenc="urn:mpeg:cenc:2013" xmlns:mspr="urn:microsoft:playready" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd">
<Period start="PT0S" id="1">
<AdaptationSet mimeType="video/mp4" startWithSAP="1" segmentAlignment="true" par="16:9">
<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc"></ContentProtection>
<ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95"><mspr:pro xmlns:mspr="urn:microsoft:playready">VAMAAAEAAQBKAzwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4ARgAyAEsAcwBzAGgARgA2AGMAawBDAFEAYwBpAE0AQwA0AGUATwBqAEwAQQA9AD0APAAvAEsASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBEAGsARQBYAHQAYwBsAFMAWABrAFUAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBsAGkAYwBlAG4AcwBlAC4AYwB1AGIAbwB2AGkAcwBpAG8AbgAuAGkAdAAvAEwAaQBjAGUAbgBzAGUALwByAGkAZwBoAHQAcwBtAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA8AC8ATABBAF8AVQBSAEwAPgA8AEwAVQBJAF8AVQBSAEwAPgBoAHQAdABwADoALwAvAGMAbwBuAHQAbwBzAG8ALgBtAGkAYwByAG8AcwBvAGYAdAAuAGMAbwBtAC8APAAvAEwAVQBJAF8AVQBSAEwAPgA8AEMAVQBTAFQATwBNAEEAVABUAFIASQBCAFUAVABFAFMAIAB4AG0AbABuAHMAPQAiACIAPgA8AC8AQwBVAFMAVABPAE0AQQBUAFQAUgBJAEIAVQBUAEUAUwA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</mspr:pro><cenc:pssh xmlns:cenc="urn:mpeg:cenc:2013">AAADdHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAA1RUAwAAAQABAEoDPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBGADIASwBzAHMAaABGADYAYwBrAEMAUQBjAGkATQBDADQAZQBPAGoATABBAD0APQA8AC8ASwBJAEQAPgA8AEMASABFAEMASwBTAFUATQA+AEQAawBFAFgAdABjAGwAUwBYAGsAVQA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAaQBjAGUAbgBzAGUALgBjAHUAYgBvAHYAaQBzAGkAbwBuAC4AaQB0AC8ATABpAGMAZQBuAHMAZQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwATABVAEkAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AYwBvAG4AdABvAHMAbwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwA8AC8ATABVAEkAXwBVAFIATAA+ADwAQwBVAFMAVABPAE0AQQBUAFQAUgBJAEIAVQBUAEUAUwAgAHgAbQBsAG4AcwA9ACIAIgA+ADwALwBDAFUAUwBUAE8ATQBBAFQAVABSAEkAQgBVAFQARQBTAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=</cenc:pssh></ContentProtection>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"><cenc:pssh xmlns:cenc="urn:mpeg:cenc:2013">AAAAYnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAEIIARIQsqxiF3oRQHKQciMC4eOjLBoAIh45MDIwMDEzMV8yMDIyMDIwMTAwMDBfTElWRUNFTkMqAkhEMgBI49yVmwY=</cenc:pssh></ContentProtection>
<SegmentTemplate timescale="10000000" presentationTimeOffset="0" media="$RepresentationID$_Segment-$Time$.m4v" initialization="$RepresentationID$_init.m4i">
<SegmentTimeline>
<S t="32394546833710" d="20000000" r="149" />
</SegmentTimeline>
</SegmentTemplate>
<Representation width="384" height="216" frameRate="25" codecs="avc1.4d400d" scanType="progressive" sar="1:1" id="1666751597836item-01item" bandwidth="350000" />
<Representation width="480" height="270" frameRate="25" codecs="avc1.4d4015" scanType="progressive" sar="1:1" id="1666751597836item-02item" bandwidth="650000" />
<Representation width="768" height="432" frameRate="25" codecs="avc1.4d401e" scanType="progressive" sar="1:1" id="1666751597836item-03item" bandwidth="1000000" />
<Representation width="768" height="432" frameRate="25" codecs="avc1.4d401e" scanType="progressive" sar="1:1" id="1666751597836item-04item" bandwidth="1700000" />
<Representation width="1280" height="720" frameRate="25" codecs="avc1.4d401f" scanType="progressive" sar="1:1" id="1666751597836item-05item" bandwidth="2800000" />
<Representation width="1280" height="720" frameRate="25" codecs="avc1.4d401f" scanType="progressive" sar="1:1" id="1666751597836item-06item" bandwidth="4000000" />
<Representation width="1920" height="1080" frameRate="25" codecs="avc1.640028" scanType="progressive" sar="1:1" id="1666751597836item-07item" bandwidth="5500000" />
<Representation width="1920" height="1080" frameRate="25" codecs="avc1.64002a" scanType="progressive" sar="1:1" id="1666751597836item-08item" bandwidth="7000000" />
</AdaptationSet>
<AdaptationSet mimeType="audio/mp4" startWithSAP="1" lang="ita" segmentAlignment="true">
<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc"></ContentProtection>
<ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95"><mspr:pro xmlns:mspr="urn:microsoft:playready">VAMAAAEAAQBKAzwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4ARgAyAEsAcwBzAGgARgA2AGMAawBDAFEAYwBpAE0AQwA0AGUATwBqAEwAQQA9AD0APAAvAEsASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBEAGsARQBYAHQAYwBsAFMAWABrAFUAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBsAGkAYwBlAG4AcwBlAC4AYwB1AGIAbwB2AGkAcwBpAG8AbgAuAGkAdAAvAEwAaQBjAGUAbgBzAGUALwByAGkAZwBoAHQAcwBtAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA8AC8ATABBAF8AVQBSAEwAPgA8AEwAVQBJAF8AVQBSAEwAPgBoAHQAdABwADoALwAvAGMAbwBuAHQAbwBzAG8ALgBtAGkAYwByAG8AcwBvAGYAdAAuAGMAbwBtAC8APAAvAEwAVQBJAF8AVQBSAEwAPgA8AEMAVQBTAFQATwBNAEEAVABUAFIASQBCAFUAVABFAFMAIAB4AG0AbABuAHMAPQAiACIAPgA8AC8AQwBVAFMAVABPAE0AQQBUAFQAUgBJAEIAVQBUAEUAUwA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</mspr:pro><cenc:pssh xmlns:cenc="urn:mpeg:cenc:2013">AAADdHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAA1RUAwAAAQABAEoDPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBGADIASwBzAHMAaABGADYAYwBrAEMAUQBjAGkATQBDADQAZQBPAGoATABBAD0APQA8AC8ASwBJAEQAPgA8AEMASABFAEMASwBTAFUATQA+AEQAawBFAFgAdABjAGwAUwBYAGsAVQA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAaQBjAGUAbgBzAGUALgBjAHUAYgBvAHYAaQBzAGkAbwBuAC4AaQB0AC8ATABpAGMAZQBuAHMAZQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwATABVAEkAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AYwBvAG4AdABvAHMAbwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwA8AC8ATABVAEkAXwBVAFIATAA+ADwAQwBVAFMAVABPAE0AQQBUAFQAUgBJAEIAVQBUAEUAUwAgAHgAbQBsAG4AcwA9ACIAIgA+ADwALwBDAFUAUwBUAE8ATQBBAFQAVABSAEkAQgBVAFQARQBTAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=</cenc:pssh></ContentProtection>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"><cenc:pssh xmlns:cenc="urn:mpeg:cenc:2013">AAAAYnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAEIIARIQsqxiF3oRQHKQciMC4eOjLBoAIh45MDIwMDEzMV8yMDIyMDIwMTAwMDBfTElWRUNFTkMqAkhEMgBI49yVmwY=</cenc:pssh></ContentProtection>
<SegmentTemplate timescale="10000000" presentationTimeOffset="0" media="$RepresentationID$_Segment-$Time$.m4a" initialization="$RepresentationID$_init.m4i">
<SegmentTimeline>
<S t="32394546887043" d="20053333" />
<S t="32394566940376" d="20053334" />
<S t="32394586993710" d="19840000" />
<S t="32394606833710" d="20053333" r="1" />
<S t="32394646940376" d="20053334" />
<S t="32394666993710" d="19840000" />
<S t="32394686833710" d="20053333" r="1" />
<S t="32394726940376" d="20053334" />
<S t="32394746993710" d="19840000" />
<S t="32394766833710" d="20053333" r="1" />
<S t="32394806940376" d="20053334" />
<S t="32394826993710" d="19840000" />
<S t="32394846833710" d="20053333" r="1" />
<S t="32394886940376" d="20053334" />
<S t="32394906993710" d="19840000" />
<S t="32394926833710" d="20053333" r="1" />
<S t="32394966940376" d="20053334" />
<S t="32394986993710" d="19840000" />
<S t="32395006833710" d="20053333" r="1" />
<S t="32395046940376" d="20053334" />
<S t="32395066993710" d="19840000" />
<S t="32395086833710" d="20053333" r="1" />
<S t="32395126940376" d="20053334" />
<S t="32395146993710" d="19840000" />
<S t="32395166833710" d="20053333" r="1" />
<S t="32395206940376" d="20053334" />
<S t="32395226993710" d="19840000" />
<S t="32395246833710" d="20053333" r="1" />
<S t="32395286940376" d="20053334" />
<S t="32395306993710" d="19840000" />
<S t="32395326833710" d="20053333" r="1" />
<S t="32395366940376" d="20053334" />
<S t="32395386993710" d="19840000" />
<S t="32395406833710" d="20053333" r="1" />
<S t="32395446940376" d="20053334" />
<S t="32395466993710" d="19840000" />
<S t="32395486833710" d="20053333" r="1" />
<S t="32395526940376" d="20053334" />
<S t="32395546993710" d="19840000" />
<S t="32395566833710" d="20053333" r="1" />
<S t="32395606940376" d="20053334" />
<S t="32395626993710" d="19840000" />
<S t="32395646833710" d="20053333" r="1" />
<S t="32395686940376" d="20053334" />
<S t="32395706993710" d="19840000" />
<S t="32395726833710" d="20053333" r="1" />
<S t="32395766940376" d="20053334" />
<S t="32395786993710" d="19840000" />
<S t="32395806833710" d="20053333" r="1" />
<S t="32395846940376" d="20053334" />
<S t="32395866993710" d="19840000" />
<S t="32395886833710" d="20053333" r="1" />
<S t="32395926940376" d="20053334" />
<S t="32395946993710" d="19840000" />
<S t="32395966833710" d="20053333" r="1" />
<S t="32396006940376" d="20053334" />
<S t="32396026993710" d="19840000" />
<S t="32396046833710" d="20053333" r="1" />
<S t="32396086940376" d="20053334" />
<S t="32396106993710" d="19840000" />
<S t="32396126833710" d="20053333" r="1" />
<S t="32396166940376" d="20053334" />
<S t="32396186993710" d="19840000" />
<S t="32396206833710" d="20053333" r="1" />
<S t="32396246940376" d="20053334" />
<S t="32396266993710" d="19840000" />
<S t="32396286833710" d="20053333" r="1" />
<S t="32396326940376" d="20053334" />
<S t="32396346993710" d="19840000" />
<S t="32396366833710" d="20053333" r="1" />
<S t="32396406940376" d="20053334" />
<S t="32396426993710" d="19840000" />
<S t="32396446833710" d="20053333" r="1" />
<S t="32396486940376" d="20053334" />
<S t="32396506993710" d="19840000" />
<S t="32396526833710" d="20053333" r="1" />
<S t="32396566940376" d="20053334" />
<S t="32396586993710" d="19840000" />
<S t="32396606833710" d="20053333" r="1" />
<S t="32396646940376" d="20053334" />
<S t="32396666993710" d="19840000" />
<S t="32396686833710" d="20053333" r="1" />
<S t="32396726940376" d="20053334" />
<S t="32396746993710" d="19840000" />
<S t="32396766833710" d="20053333" r="1" />
<S t="32396806940376" d="20053334" />
<S t="32396826993710" d="19840000" />
<S t="32396846833710" d="20053333" r="1" />
<S t="32396886940376" d="20053334" />
<S t="32396906993710" d="19840000" />
<S t="32396926833710" d="20053333" r="1" />
<S t="32396966940376" d="20053334" />
<S t="32396986993710" d="19840000" />
<S t="32397006833710" d="20053333" r="1" />
<S t="32397046940376" d="20053334" />
<S t="32397066993710" d="19840000" />
<S t="32397086833710" d="20053333" r="1" />
<S t="32397126940376" d="20053334" />
<S t="32397146993710" d="19840000" />
<S t="32397166833710" d="20053333" r="1" />
<S t="32397206940376" d="20053334" />
<S t="32397226993710" d="19840000" />
<S t="32397246833710" d="20053333" r="1" />
<S t="32397286940376" d="20053334" />
<S t="32397306993710" d="19840000" />
<S t="32397326833710" d="20053333" r="1" />
<S t="32397366940376" d="20053334" />
<S t="32397386993710" d="19840000" />
<S t="32397406833710" d="20053333" r="1" />
<S t="32397446940376" d="20053334" />
<S t="32397466993710" d="19840000" />
<S t="32397486833710" d="20053333" r="1" />
<S t="32397526940376" d="20053334" />
</SegmentTimeline>
</SegmentTemplate>
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="1666751597836item-09item" bandwidth="96000" />
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="1666751597836item-10item" bandwidth="128000" />
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="1666751597836item-11item" bandwidth="192000" />
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="1666751597836item-12item" bandwidth="256000" />
</AdaptationSet>
</Period>
</MPD>
2 changes: 0 additions & 2 deletions src/core/init/media_source_content_initializer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -569,8 +569,6 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
return this.trigger("periodStreamCleared", evt.value);
case "representationChange":
return this.trigger("representationChange", evt.value);
case "complete-stream":
return this.trigger("completeStream", evt.value);
case "bitrateEstimationChange":
return this.trigger("bitrateEstimationChange", evt.value);
case "added-segment":
Expand Down
5 changes: 0 additions & 5 deletions src/core/init/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,11 +177,6 @@ export interface IContentInitializerEvents {
*/
period : Period;
};
/**
* The last (chronologically) `Period` for a given type has pushed all
* the segments it needs until the end.
*/
completeStream: { type: IBufferType };
/** Emitted when a new `Adaptation` is being considered. */
adaptationChange: {
/** The type of buffer for which the Representation is changing. */
Expand Down
6 changes: 0 additions & 6 deletions src/core/stream/events_generators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import {
IActivePeriodChangedEvent,
IAdaptationChangeEvent,
IBitrateEstimationChangeEvent,
ICompletedStreamEvent,
IEncryptionDataEncounteredEvent,
IEndOfStreamEvent,
ILockedStreamEvent,
Expand Down Expand Up @@ -88,11 +87,6 @@ const EVENTS = {
value: { type, bitrate } };
},

streamComplete(bufferType: IBufferType) : ICompletedStreamEvent {
return { type: "complete-stream",
value: { type: bufferType } };
},

endOfStream() : IEndOfStreamEvent {
return { type: "end-of-stream",
value: undefined };
Expand Down
20 changes: 14 additions & 6 deletions src/core/stream/orchestrator/are_streams_complete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ import {
Observable,
startWith,
} from "rxjs";
import { IStreamOrchestratorEvent } from "../types";
import Manifest from "../../../manifest";
import filterMap from "../../../utils/filter_map";
import { IStreamOrchestratorEvent, IStreamStatusEvent } from "../types";

/**
* Returns an Observable which emits ``true`` when all PeriodStreams given are
Expand All @@ -38,10 +40,12 @@ import { IStreamOrchestratorEvent } from "../types";
* segments needed for this Stream have been downloaded.
*
* When the Observable returned here emits, every Stream are finished.
* @param {Object} manifest
* @param {...Observable} streams
* @returns {Observable}
*/
export default function areStreamsComplete(
manifest : Manifest,
...streams : Array<Observable<IStreamOrchestratorEvent>>
) : Observable<boolean> {
/**
Expand All @@ -53,11 +57,15 @@ export default function areStreamsComplete(
const isCompleteArray : Array<Observable<boolean>> = streams
.map((stream) => {
return stream.pipe(
filter((evt) => {
return evt.type === "complete-stream" ||
(evt.type === "stream-status" && !evt.value.hasFinishedLoading);
}),
map((evt) => evt.type === "complete-stream"),
filter((evt) : evt is IStreamStatusEvent => evt.type === "stream-status"),
filterMap<IStreamStatusEvent, boolean, null>((evt) => {
if (evt.value.hasFinishedLoading || evt.value.isEmptyStream) {
return manifest.getPeriodAfter(evt.value.period) === null ?
true :
null; // not the last Period: ignore event
}
return false;
}, null),
startWith(false),
distinctUntilChanged()
);
Expand Down
5 changes: 2 additions & 3 deletions src/core/stream/orchestrator/stream_orchestrator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ export default function StreamOrchestrator(

// Emits an "end-of-stream" event once every PeriodStream are complete.
// Emits a 'resume-stream" when it's not
const endOfStream$ = combineLatest([areStreamsComplete(...streamsArray),
const endOfStream$ = combineLatest([areStreamsComplete(manifest, ...streamsArray),
isLastPeriodKnown$])
.pipe(map(([areComplete, isLastPeriodKnown]) => areComplete && isLastPeriodKnown),
distinctUntilChanged(),
Expand Down Expand Up @@ -506,8 +506,7 @@ export default function StreamOrchestrator(
if (evt.value.hasFinishedLoading) {
const nextPeriod = manifest.getPeriodAfter(basePeriod);
if (nextPeriod === null) {
return observableConcat(observableOf(evt),
observableOf(EVENTS.streamComplete(bufferType)));
return observableOf(evt);
}

// current Stream is full, create the next one if not
Expand Down
1 change: 1 addition & 0 deletions src/core/stream/period/create_empty_adaptation_stream.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ export default function createEmptyAdaptationStream(
bufferType,
position,
imminentDiscontinuity: null,
isEmptyStream: true,
hasFinishedLoading,
neededSegments: [],
shouldRefreshManifest: false } });
Expand Down
1 change: 1 addition & 0 deletions src/core/stream/representation/representation_stream.ts
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ export default function RepresentationStream<TSegmentDataType>({
position: observation.position.last,
bufferType,
imminentDiscontinuity: status.imminentDiscontinuity,
isEmptyStream: false,
hasFinishedLoading: status.hasFinishedLoading,
neededSegments: status.neededSegments } });
let bufferRemoval = EMPTY;
Expand Down

0 comments on commit 84bae86

Please sign in to comment.