Skip to content

Commit 48f85a9

Browse files
add integration tests
1 parent 29e38c4 commit 48f85a9

File tree

13 files changed

+626
-4
lines changed

13 files changed

+626
-4
lines changed

src/main_thread/tracks_store/tracks_store.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,11 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
163163
ttype: "video" | "audio",
164164
): void {
165165
const adaptationsForType = period.adaptations[ttype];
166+
const audioVideoAdaptations = [
167+
...(period.adaptations.audio ?? []),
168+
...(period.adaptations.video ?? []),
169+
];
170+
166171
const periodHasAdaptationForType =
167172
adaptationsForType !== undefined && adaptationsForType.length > 0;
168173
if (!periodHasAdaptationForType) {
@@ -171,17 +176,29 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
171176
return;
172177
}
173178

174-
const areAllCodecsUnsupported = adaptationsForType.every(
179+
const isTypeUnsupported = adaptationsForType.every(
180+
(adapt) => adapt.supportStatus.hasSupportedCodec === false,
181+
);
182+
const isAudioAndVideoUnsupported = audioVideoAdaptations.every(
175183
(adapt) => adapt.supportStatus.hasSupportedCodec === false,
176184
);
177-
if (areAllCodecsUnsupported) {
185+
186+
if (isTypeUnsupported) {
178187
const err = new MediaError(
179188
"MANIFEST_INCOMPATIBLE_CODECS_ERROR",
180189
"No supported " + ttype + " adaptations",
181190
{ tracks: undefined },
182191
);
183-
184-
if (this.onTracksNotPlayableForType[ttype] === "continue") {
192+
if (isAudioAndVideoUnsupported) {
193+
// Both video and audio are unsupported or the content is audio/video only.
194+
// The content cannot be played without this media type as there is no other media type.
195+
this.trigger("error", err);
196+
// The previous event trigger could have had side-effects, so we
197+
// re-check if we're still mostly in the same state
198+
if (this._isDisposed) {
199+
return; // Someone disposed the `TracksStore` on the previous side-effect
200+
}
201+
} else if (this.onTracksNotPlayableForType[ttype] === "continue") {
185202
// audio or video is not playable, but let's continue the playback without audio
186203
// or without video because of the option was set to "continue".
187204
this.trigger("warning", err);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
const BASE_URL =
2+
"http://" +
3+
__TEST_CONTENT_SERVER__.URL +
4+
":" +
5+
__TEST_CONTENT_SERVER__.PORT +
6+
"/DASH_dynamic_SegmentTemplate_UnsupportedAudio/media/";
7+
8+
// Provide infos on this content under JSON.
9+
// Useful for integration tests on DASH parsers.
10+
export default {
11+
url: BASE_URL + "Manifest_audio_only_unsupported.mpd",
12+
transport: "dash",
13+
tsbd: 5 * 60,
14+
};
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
const BASE_URL =
2+
"http://" +
3+
__TEST_CONTENT_SERVER__.URL +
4+
":" +
5+
__TEST_CONTENT_SERVER__.PORT +
6+
"/DASH_dynamic_SegmentTemplate_UnsupportedAudio/media/";
7+
8+
// Provide infos on this content under JSON.
9+
// Useful for integration tests on DASH parsers.
10+
export default {
11+
url: BASE_URL + "Manifest_audio_and_video_not_supported.mpd",
12+
transport: "dash",
13+
tsbd: 5 * 60,
14+
};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import manifestInfos from "./infos";
2+
import manifestAudioOnlyInfos from "./audio_only_infos";
3+
import manifestVideoNotSupportedInfos from "./video_not_supported_infos";
4+
export { manifestInfos, manifestAudioOnlyInfos, manifestVideoNotSupportedInfos };
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
const BASE_URL =
2+
"http://" +
3+
__TEST_CONTENT_SERVER__.URL +
4+
":" +
5+
__TEST_CONTENT_SERVER__.PORT +
6+
"/DASH_dynamic_SegmentTemplate_UnsupportedAudio/media/";
7+
8+
// Provide infos on this content under JSON.
9+
// Useful for integration tests on DASH parsers.
10+
export default {
11+
url: BASE_URL + "Manifest_audio_not_supported.mpd",
12+
transport: "dash",
13+
tsbd: 5 * 60,
14+
};
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<MPD availabilityStartTime="1970-01-01T00:00:00Z" id="Config part of url maybe?"
3+
maxSegmentDuration="PT2S" minBufferTime="PT2S" minimumUpdatePeriod="PT85S"
4+
profiles="urn:mpeg:dash:profile:isoff-live:2011,http://dashif.org/guidelines/dash-if-simple"
5+
publishTime="2019-09-06T14:48:44Z" timeShiftBufferDepth="PT5M" type="dynamic"
6+
ns1:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"
7+
xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:ns1="http://www.w3.org/2001/XMLSchema-instance">
8+
<ProgramInformation>
9+
<Title>Media Presentation Description from DASHI-IF live simulator</Title>
10+
</ProgramInformation>
11+
<BaseURL>https://livesim.dashif.org/livesim/periods_20/testpic_2s/</BaseURL>
12+
<Period id="p8709894" start="PT1567780920S">
13+
<AdaptationSet contentType="audio" lang="eng" mimeType="audio/mp4" segmentAlignment="true"
14+
startWithSAP="1">
15+
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
16+
<SegmentTemplate timescale="10" duration="20" initialization="$RepresentationID$/init.mp4"
17+
media="$RepresentationID$/$Number$.m4s" presentationTimeOffset="15677809200"
18+
startNumber="783890460" />
19+
<Representation audioSamplingRate="48000" bandwidth="48000" codecs="ec-3" id="A48">
20+
<AudioChannelConfiguration
21+
schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
22+
</Representation>
23+
</AdaptationSet>
24+
<AdaptationSet contentType="video" maxFrameRate="60/2" maxHeight="360" maxWidth="640"
25+
mimeType="video/mp4" minHeight="360" minWidth="640" par="16:9" segmentAlignment="true"
26+
startWithSAP="1">
27+
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
28+
<SegmentTemplate timescale="10" duration="20" initialization="$RepresentationID$/init.mp4"
29+
media="$RepresentationID$/$Number$.m4s" presentationTimeOffset="15677809200"
30+
startNumber="783890460" />
31+
<Representation bandwidth="300000" codecs="dvh1.08.06" frameRate="60/2" height="360"
32+
id="V300" sar="1:1" width="640" />
33+
</AdaptationSet>
34+
</Period>
35+
<Period id="p8709895" start="PT1567781100S">
36+
<AdaptationSet contentType="audio" lang="eng" mimeType="audio/mp4" segmentAlignment="true"
37+
startWithSAP="1">
38+
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
39+
<SegmentTemplate timescale="10" duration="20" initialization="$RepresentationID$/init.mp4"
40+
media="$RepresentationID$/$Number$.m4s" presentationTimeOffset="15677811000"
41+
startNumber="783890550" />
42+
<Representation audioSamplingRate="48000" bandwidth="48000" codecs="ec-3" id="A48">
43+
<AudioChannelConfiguration
44+
schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
45+
</Representation>
46+
</AdaptationSet>
47+
<AdaptationSet contentType="video" maxFrameRate="60/2" maxHeight="360" maxWidth="640"
48+
mimeType="video/mp4" minHeight="360" minWidth="640" par="16:9" segmentAlignment="true"
49+
startWithSAP="1">
50+
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
51+
<SegmentTemplate timescale="10" duration="20" initialization="$RepresentationID$/init.mp4"
52+
media="$RepresentationID$/$Number$.m4s" presentationTimeOffset="15677811000"
53+
startNumber="783890550" />
54+
<Representation bandwidth="300000" codecs="dvh1.08.06" frameRate="60/2" height="360"
55+
id="V300" sar="1:1" width="640" />
56+
</AdaptationSet>
57+
</Period>
58+
<Period id="p8709896" start="PT1567781280S">
59+
<AdaptationSet contentType="audio" lang="eng" mimeType="audio/mp4" segmentAlignment="true"
60+
startWithSAP="1">
61+
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
62+
<SegmentTemplate timescale="10" duration="20" initialization="$RepresentationID$/init.mp4"
63+
media="$RepresentationID$/$Number$.m4s" presentationTimeOffset="1567781280"
64+
startNumber="783890640" />
65+
<Representation audioSamplingRate="48000" bandwidth="48000" codecs="ec-3" id="A48">
66+
<AudioChannelConfiguration
67+
schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
68+
</Representation>
69+
</AdaptationSet>
70+
<AdaptationSet contentType="video" maxFrameRate="60/2" maxHeight="360" maxWidth="640"
71+
mimeType="video/mp4" minHeight="360" minWidth="640" par="16:9" segmentAlignment="true"
72+
startWithSAP="1">
73+
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
74+
<SegmentTemplate timescale="10" duration="20" initialization="$RepresentationID$/init.mp4"
75+
media="$RepresentationID$/$Number$.m4s" presentationTimeOffset="15677812800"
76+
startNumber="783890640" />
77+
<Representation bandwidth="300000" codecs="dvh1.08.06" frameRate="60/2" height="360"
78+
id="V300" sar="1:1" width="640" />
79+
</AdaptationSet>
80+
</Period>
81+
</MPD>
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<MPD availabilityStartTime="1970-01-01T00:00:00Z" id="Config part of url maybe?"
3+
maxSegmentDuration="PT2S" minBufferTime="PT2S" minimumUpdatePeriod="PT85S"
4+
profiles="urn:mpeg:dash:profile:isoff-live:2011,http://dashif.org/guidelines/dash-if-simple"
5+
publishTime="2019-09-06T14:48:44Z" timeShiftBufferDepth="PT5M" type="dynamic"
6+
ns1:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"
7+
xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:ns1="http://www.w3.org/2001/XMLSchema-instance">
8+
<ProgramInformation>
9+
<Title>Media Presentation Description from DASHI-IF live simulator</Title>
10+
</ProgramInformation>
11+
<BaseURL>https://livesim.dashif.org/livesim/periods_20/testpic_2s/</BaseURL>
12+
<Period id="p8709894" start="PT1567780920S">
13+
<AdaptationSet contentType="audio" lang="eng" mimeType="audio/mp4" segmentAlignment="true"
14+
startWithSAP="1">
15+
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
16+
<SegmentTemplate timescale="10" duration="20" initialization="$RepresentationID$/init.mp4"
17+
media="$RepresentationID$/$Number$.m4s" presentationTimeOffset="15677809200"
18+
startNumber="783890460" />
19+
<Representation audioSamplingRate="48000" bandwidth="48000" codecs="ec-3" id="A48">
20+
<AudioChannelConfiguration
21+
schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
22+
</Representation>
23+
</AdaptationSet>
24+
<AdaptationSet contentType="video" maxFrameRate="60/2" maxHeight="360" maxWidth="640"
25+
mimeType="video/mp4" minHeight="360" minWidth="640" par="16:9" segmentAlignment="true"
26+
startWithSAP="1">
27+
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
28+
<SegmentTemplate timescale="10" duration="20" initialization="$RepresentationID$/init.mp4"
29+
media="$RepresentationID$/$Number$.m4s" presentationTimeOffset="15677809200"
30+
startNumber="783890460" />
31+
<Representation bandwidth="300000" codecs="avc1.64001e" frameRate="60/2" height="360"
32+
id="V300" sar="1:1" width="640" />
33+
</AdaptationSet>
34+
</Period>
35+
<Period id="p8709895" start="PT1567781100S">
36+
<AdaptationSet contentType="audio" lang="eng" mimeType="audio/mp4" segmentAlignment="true"
37+
startWithSAP="1">
38+
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
39+
<SegmentTemplate timescale="10" duration="20" initialization="$RepresentationID$/init.mp4"
40+
media="$RepresentationID$/$Number$.m4s" presentationTimeOffset="15677811000"
41+
startNumber="783890550" />
42+
<Representation audioSamplingRate="48000" bandwidth="48000" codecs="ec-3" id="A48">
43+
<AudioChannelConfiguration
44+
schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
45+
</Representation>
46+
</AdaptationSet>
47+
<AdaptationSet contentType="video" maxFrameRate="60/2" maxHeight="360" maxWidth="640"
48+
mimeType="video/mp4" minHeight="360" minWidth="640" par="16:9" segmentAlignment="true"
49+
startWithSAP="1">
50+
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
51+
<SegmentTemplate timescale="10" duration="20" initialization="$RepresentationID$/init.mp4"
52+
media="$RepresentationID$/$Number$.m4s" presentationTimeOffset="15677811000"
53+
startNumber="783890550" />
54+
<Representation bandwidth="300000" codecs="avc1.64001e" frameRate="60/2" height="360"
55+
id="V300" sar="1:1" width="640" />
56+
</AdaptationSet>
57+
</Period>
58+
<Period id="p8709896" start="PT1567781280S">
59+
<AdaptationSet contentType="audio" lang="eng" mimeType="audio/mp4" segmentAlignment="true"
60+
startWithSAP="1">
61+
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
62+
<SegmentTemplate timescale="10" duration="20" initialization="$RepresentationID$/init.mp4"
63+
media="$RepresentationID$/$Number$.m4s" presentationTimeOffset="1567781280"
64+
startNumber="783890640" />
65+
<Representation audioSamplingRate="48000" bandwidth="48000" codecs="ec-3" id="A48">
66+
<AudioChannelConfiguration
67+
schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
68+
</Representation>
69+
</AdaptationSet>
70+
<AdaptationSet contentType="video" maxFrameRate="60/2" maxHeight="360" maxWidth="640"
71+
mimeType="video/mp4" minHeight="360" minWidth="640" par="16:9" segmentAlignment="true"
72+
startWithSAP="1">
73+
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
74+
<SegmentTemplate timescale="10" duration="20" initialization="$RepresentationID$/init.mp4"
75+
media="$RepresentationID$/$Number$.m4s" presentationTimeOffset="15677812800"
76+
startNumber="783890640" />
77+
<Representation bandwidth="300000" codecs="avc1.64001e" frameRate="60/2" height="360"
78+
id="V300" sar="1:1" width="640" />
79+
</AdaptationSet>
80+
</Period>
81+
</MPD>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<MPD availabilityStartTime="1970-01-01T00:00:00Z" id="Config part of url maybe?"
3+
maxSegmentDuration="PT2S" minBufferTime="PT2S" minimumUpdatePeriod="PT85S"
4+
profiles="urn:mpeg:dash:profile:isoff-live:2011,http://dashif.org/guidelines/dash-if-simple"
5+
publishTime="2019-09-06T14:48:44Z" timeShiftBufferDepth="PT5M" type="dynamic"
6+
ns1:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"
7+
xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:ns1="http://www.w3.org/2001/XMLSchema-instance">
8+
<ProgramInformation>
9+
<Title>Media Presentation Description from DASHI-IF live simulator</Title>
10+
</ProgramInformation>
11+
<BaseURL>https://livesim.dashif.org/livesim/periods_20/testpic_2s/</BaseURL>
12+
<Period id="p8709894" start="PT1567780920S">
13+
<AdaptationSet contentType="audio" lang="eng" mimeType="audio/mp4" segmentAlignment="true"
14+
startWithSAP="1">
15+
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
16+
<SegmentTemplate timescale="10" duration="20" initialization="$RepresentationID$/init.mp4"
17+
media="$RepresentationID$/$Number$.m4s" presentationTimeOffset="15677809200"
18+
startNumber="783890460" />
19+
<Representation audioSamplingRate="48000" bandwidth="48000" codecs="ec-3" id="A48">
20+
<AudioChannelConfiguration
21+
schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
22+
</Representation>
23+
</AdaptationSet>
24+
</Period>
25+
<Period id="p8709895" start="PT1567781100S">
26+
<AdaptationSet contentType="audio" lang="eng" mimeType="audio/mp4" segmentAlignment="true"
27+
startWithSAP="1">
28+
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
29+
<SegmentTemplate timescale="10" duration="20" initialization="$RepresentationID$/init.mp4"
30+
media="$RepresentationID$/$Number$.m4s" presentationTimeOffset="15677811000"
31+
startNumber="783890550" />
32+
<Representation audioSamplingRate="48000" bandwidth="48000" codecs="ec-3" id="A48">
33+
<AudioChannelConfiguration
34+
schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
35+
</Representation>
36+
</AdaptationSet>
37+
</Period>
38+
<Period id="p8709896" start="PT1567781280S">
39+
<AdaptationSet contentType="audio" lang="eng" mimeType="audio/mp4" segmentAlignment="true"
40+
startWithSAP="1">
41+
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
42+
<SegmentTemplate timescale="10" duration="20" initialization="$RepresentationID$/init.mp4"
43+
media="$RepresentationID$/$Number$.m4s" presentationTimeOffset="1567781280"
44+
startNumber="783890640" />
45+
<Representation audioSamplingRate="48000" bandwidth="48000" codecs="ec-3" id="A48">
46+
<AudioChannelConfiguration
47+
schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
48+
</Representation>
49+
</AdaptationSet>
50+
</Period>
51+
</MPD>

0 commit comments

Comments
 (0)