stream.dash: fix segment duration

Fix segment duration in representations without a segment list
or segment template and add test for segments of this kind.
This commit is contained in:
bastimeyer 2023-03-18 14:23:43 +01:00 committed by Forrest
parent 88772da939
commit 98355078f1
3 changed files with 98 additions and 1 deletions

View File

@ -664,7 +664,7 @@ class Representation(_RepresentationBaseType):
yield Segment(
url=self.base_url,
number=None,
duration=None,
duration=self.period.duration.total_seconds() or self.root.mediaPresentationDuration.total_seconds(),
available_at=self.period.availabilityStartTime,
init=True,
content=True,

View File

@ -0,0 +1,62 @@
<?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="static"
mediaPresentationDuration="PT3256S"
minBufferTime="PT1.2S"
profiles="urn:mpeg:dash:profile:isoff-on-demand:2011"
>
<BaseURL>http://cdn1.example.com/</BaseURL>
<BaseURL>http://cdn2.example.com/</BaseURL>
<Period>
<!-- English Audio -->
<AdaptationSet mimeType="audio/mp4" codecs="mp4a.40" lang="en" subsegmentAlignment="true" subsegmentStartsWithSAP="1">
<Representation id="1" bandwidth="64000">
<BaseURL>7657412348.mp4</BaseURL>
</Representation>
<Representation id="2" bandwidth="32000">
<BaseURL>3463646346.mp4</BaseURL>
</Representation>
</AdaptationSet>
<!-- French Audio -->
<AdaptationSet mimeType="audio/mp4" codecs="mp4a.40.2" lang="fr" subsegmentAlignment="true" subsegmentStartsWithSAP="1">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="dub"/>
<Representation id="3" bandwidth="64000">
<BaseURL>3463275477.mp4</BaseURL>
</Representation>
<Representation id="4" bandwidth="32000">
<BaseURL>5685763463.mp4</BaseURL>
</Representation>
</AdaptationSet>
<!-- Timed text -->
<AdaptationSet mimeType="application/ttml+xml" lang="de">
<Role schemeIdUri="urn:mpeg:dash:role" value="subtitle"/>
<Representation id="5" bandwidth="256">
<BaseURL>796735657.xml</BaseURL>
</Representation>
</AdaptationSet>
<!-- Video -->
<AdaptationSet mimeType="video/mp4" codecs="avc1.4d0228" subsegmentAlignment="true" subsegmentStartsWithSAP="2">
<Representation id="6" bandwidth="256000" width="320" height="240">
<BaseURL>8563456473.mp4</BaseURL>
</Representation>
<Representation id="7" bandwidth="512000" width="320" height="240">
<BaseURL>56363634.mp4</BaseURL>
</Representation>
<Representation id="8" bandwidth="1024000" width="640" height="480">
<BaseURL>562465736.mp4</BaseURL>
</Representation>
<Representation id="9" bandwidth="1384000" width="640" height="480">
<BaseURL>41325645.mp4</BaseURL>
</Representation>
<Representation id="A" bandwidth="1536000" width="1280" height="720">
<BaseURL>89045625.mp4</BaseURL>
</Representation>
<Representation id="B" bandwidth="2048000" width="1280" height="720">
<BaseURL>23536745734.mp4</BaseURL>
</Representation>
</AdaptationSet>
</Period>
</MPD>

View File

@ -92,6 +92,41 @@ class TestMPDParsers(unittest.TestCase):
class TestMPDParser(unittest.TestCase):
maxDiff = None
def test_no_segment_list_or_template(self):
with xml("dash/test_no_segment_list_or_template.mpd") as mpd_xml:
mpd = MPD(mpd_xml, base_url="http://test/", url="http://test/manifest.mpd")
segments = [
{
"ident": representation.ident,
"mimeType": representation.mimeType,
"segments": [
(segment.url, segment.number, segment.duration, segment.available_at, segment.init, segment.content)
for segment in itertools.islice(representation.segments(), 100)
],
}
for adaptationset in mpd.periods[0].adaptationSets for representation in adaptationset.representations
if representation.id in ("1", "5", "6")
]
availability = datetime.datetime(1970, 1, 1, 0, 0, 0, tzinfo=UTC)
assert segments == [
{
"ident": (None, None, "1"),
"mimeType": "audio/mp4",
"segments": [("http://cdn1.example.com/7657412348.mp4", None, 3256.0, availability, True, True)],
},
{
"ident": (None, None, "5"),
"mimeType": "application/ttml+xml",
"segments": [("http://cdn1.example.com/796735657.xml", None, 3256.0, availability, True, True)],
},
{
"ident": (None, None, "6"),
"mimeType": "video/mp4",
"segments": [("http://cdn1.example.com/8563456473.mp4", None, 3256.0, availability, True, True)],
},
]
def test_segments_number_time(self):
with xml("dash/test_1.mpd") as mpd_xml:
mpd = MPD(mpd_xml, base_url="http://test.se/", url="http://test.se/manifest.mpd")