[Cocoa] Fix failing imported/w3c/web-platform-tests/media-source/mediasource-changety...
[WebKit-https.git] / LayoutTests / imported / w3c / web-platform-tests / media-source / mediasource-changetype-util.js
1 // Copyright © 2018 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).
2
3 function findSupportedChangeTypeTestTypes(cb)
4 {
5     var CHANGE_TYPE_MEDIA_LIST = [
6         {
7             type: 'video/webm; codecs="vp8"',
8             is_video: true,
9             url: 'webm/test-v-128k-320x240-24fps-8kfr.webm'
10         },
11         {
12             type: 'video/webm; codecs="vp9"',
13             is_video: true,
14             url: 'webm/test-vp9.webm'
15         },
16         {
17             type: 'video/mp4; codecs="avc1.4D4001"',
18             is_video: true,
19             url: 'mp4/test-v-128k-320x240-24fps-8kfr.mp4'
20         },
21         {
22             type: 'video/mp4; codecs="hvc1.1.6.L60.90"',
23             is_video: true,
24             url: 'hevc/test-v-128k-320x240-24fps-8kfr.mp4'
25         },
26         {
27             type: 'audio/webm; codecs="vorbis"',
28             is_video: false,
29             url: 'webm/test-a-128k-44100Hz-1ch.webm'
30         },
31         {
32             type: 'audio/mp4; codecs="mp4a.40.2"',
33             is_video: false,
34             url: 'mp4/test-a-128k-44100Hz-1ch.mp4'
35         },
36         {
37             type: 'audio/mpeg',
38             is_video: false,
39             url: 'mp3/sound_5.mp3'
40         }
41     ];
42
43     var audio_result = [];
44     var video_result = [];
45
46     for (var i = 0; i < CHANGE_TYPE_MEDIA_LIST.length; ++i) {
47         var media = CHANGE_TYPE_MEDIA_LIST[i];
48         if (window.MediaSource && MediaSource.isTypeSupported(media.type)) {
49             if (media.is_video === true) {
50                 video_result.push(media);
51             } else {
52                 audio_result.push(media);
53             }
54         }
55     }
56
57
58     cb(audio_result, video_result);
59 }
60
61 function appendBuffer(test, sourceBuffer, data)
62 {
63     test.expectEvent(sourceBuffer, "update");
64     test.expectEvent(sourceBuffer, "updateend");
65     sourceBuffer.appendBuffer(data);
66 }
67
68 function trimBuffered(test, mediaElement, sourceBuffer, minimumPreviousDuration, newDuration)
69 {
70     assert_less_than(newDuration, minimumPreviousDuration);
71     assert_less_than(minimumPreviousDuration, mediaElement.duration);
72     test.expectEvent(sourceBuffer, "update");
73     test.expectEvent(sourceBuffer, "updateend");
74     sourceBuffer.remove(newDuration, Infinity);
75 }
76
77 function trimDuration(test, mediaElement, mediaSource, newDuration)
78 {
79     assert_less_than(newDuration, mediaElement.duration);
80     test.expectEvent(mediaElement, "durationchange");
81     mediaSource.duration = newDuration;
82 }
83
84 function runChangeTypeTest(test, mediaElement, mediaSource, typeA, dataA, typeB, dataB)
85 {
86     var sourceBuffer = mediaSource.addSourceBuffer(typeA);
87
88     appendBuffer(test, sourceBuffer, dataA);
89
90     // changeType A->B and append B starting at 0.5 seconds.
91     test.waitForExpectedEvents(function()
92     {
93         sourceBuffer.changeType(typeB);
94         sourceBuffer.timestampOffset = 0.5;
95         appendBuffer(test, sourceBuffer, dataB);
96     });
97
98     // changeType B->B and append B starting at 1.0 seconds.
99     test.waitForExpectedEvents(function()
100     {
101         sourceBuffer.changeType(typeB);
102         sourceBuffer.timestampOffset = 1.0;
103         appendBuffer(test, sourceBuffer, dataB);
104     });
105
106     // changeType B->A and append A starting at 1.5 seconds.
107     test.waitForExpectedEvents(function()
108     {
109         sourceBuffer.changeType(typeA);
110         sourceBuffer.timestampOffset = 1.5;
111         appendBuffer(test, sourceBuffer, dataA);
112     });
113
114     // changeTypoe A->A and append A starting at 1.3 seconds.
115     test.waitForExpectedEvents(function()
116     {
117         sourceBuffer.changeType(typeA);
118         sourceBuffer.timestampOffset = 1.3;
119         appendBuffer(test, sourceBuffer, dataA);
120     });
121
122     // Trim duration to 2 seconds, then play through to end.
123     test.waitForExpectedEvents(function()
124     {
125         trimBuffered(test, mediaElement, sourceBuffer, 2.1, 2);
126     });
127
128     test.waitForExpectedEvents(function()
129     {
130         trimDuration(test, mediaElement, mediaSource, 2);
131     });
132
133     test.waitForExpectedEvents(function()
134     {
135         assert_equals(mediaElement.currentTime, 0);
136         test.expectEvent(mediaSource, "sourceended");
137         test.expectEvent(mediaElement, "play");
138         test.expectEvent(mediaElement, "ended");
139         mediaSource.endOfStream();
140         mediaElement.play();
141     });
142
143     test.waitForExpectedEvents(function() {
144         test.done();
145     });
146 }
147
148 function mediaSourceChangeTypeTest(metadataA, metadataB, description)
149 {
150     mediasource_test(function(test, mediaElement, mediaSource)
151     {
152         mediaElement.pause();
153         mediaElement.addEventListener('error', test.unreached_func("Unexpected event 'error'"));
154         MediaSourceUtil.loadBinaryData(test, metadataA.url, function(dataA) {
155             MediaSourceUtil.loadBinaryData(test, metadataB.url, function(dataB) {
156                 runChangeTypeTest(test, mediaElement, mediaSource, metadataA.type, dataA, metadataB.type, dataB);
157             });
158         });
159     }, description);
160 }
161