summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/media-source/mediasource-activesourcebuffers.html
blob: 02ebecc7738aba01759d0b3d464a28f26862edc0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
<!DOCTYPE html>
<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
    <head>
        <title>Checks MediaSource.activeSourceBuffers and changes to selected/enabled track state</title>
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="mediasource-util.js"></script>
    </head>
    <body>
        <div id="log"></div>
        <script>
          // Audio / Video files supported by the user agent under test
          var subType = MediaSourceUtil.getSubType(MediaSourceUtil.AUDIO_ONLY_TYPE);
          var manifestFilenameAudio = subType + "/test-a-128k-44100Hz-1ch-manifest.json";
          var manifestFilenameVideo = subType + "/test-v-128k-320x240-30fps-10kfr-manifest.json";
          var manifestFilenameAV = subType + "/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json";

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
              MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAudio, function (typeAudio, dataAudio)
              {
                  var sourceBuffer = mediaSource.addSourceBuffer(typeAudio);
                  assert_equals(mediaSource.sourceBuffers.length, 1,
                    "sourceBuffers list contains one SourceBuffer");
                  assert_equals(mediaSource.activeSourceBuffers.length, 0,
                    "activeSourceBuffers is empty to start with");

                  test.expectEvent(mediaSource.activeSourceBuffers, "addsourcebuffer");
                  test.expectEvent(mediaElement, "loadedmetadata");
                  sourceBuffer.appendBuffer(dataAudio);

                  test.waitForExpectedEvents(function()
                  {
                      assert_equals(mediaSource.activeSourceBuffers.length, 1,
                        "activeSourceBuffers updated when media element is loaded");
                      assert_equals(mediaSource.activeSourceBuffers[0], sourceBuffer,
                        "activeSourceBuffers contains sourceBuffer when media element is loaded");
                      test.done();
                  });
              });
          }, "SourceBuffer added to activeSourceBuffers list when its only audio track gets loaded (and thus becomes enabled).");


          mediasource_test(function(test, mediaElement, mediaSource)
          {
              mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
              MediaSourceUtil.fetchManifestAndData(test, manifestFilenameVideo, function (typeVideo, dataVideo)
              {
                  var sourceBuffer = mediaSource.addSourceBuffer(typeVideo);
                  assert_equals(mediaSource.sourceBuffers.length, 1,
                    "sourceBuffers list contains one SourceBuffer");
                  assert_equals(mediaSource.activeSourceBuffers.length, 0,
                    "activeSourceBuffers is empty to start with");

                  test.expectEvent(mediaSource.activeSourceBuffers, "addsourcebuffer");
                  test.expectEvent(mediaElement, "loadedmetadata");
                  sourceBuffer.appendBuffer(dataVideo);

                  test.waitForExpectedEvents(function()
                  {
                      assert_equals(mediaSource.activeSourceBuffers.length, 1,
                        "activeSourceBuffers updated when media element is loaded");
                      assert_equals(mediaSource.activeSourceBuffers[0], sourceBuffer,
                        "activeSourceBuffers contains sourceBuffer when media element is loaded");
                      test.done();
                  });
              });
          }, "SourceBuffer added to activeSourceBuffers list when its only video track gets loaded (and thus becomes selected).");

          function mediaSourceActiveSourceBufferOrderTest(addAudioFirst, appendAudioFirst)
          {
              mediasource_test(function(test, mediaElement, mediaSource)
              {
                  mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
                  MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAudio, function (typeAudio, dataAudio)
                  {
                      MediaSourceUtil.fetchManifestAndData(test, manifestFilenameVideo, function (typeVideo, dataVideo)
                      {
                          var sourceBufferAudio, sourceBufferVideo, expectedFirstSB, expectedSecondSB;
                          if (addAudioFirst) {
                              expectedFirstSB = sourceBufferAudio = mediaSource.addSourceBuffer(typeAudio);
                              expectedSecondSB = sourceBufferVideo = mediaSource.addSourceBuffer(typeVideo);
                          } else {
                              expectedFirstSB = sourceBufferVideo = mediaSource.addSourceBuffer(typeVideo);
                              expectedSecondSB = sourceBufferAudio = mediaSource.addSourceBuffer(typeAudio);
                          }

                          assert_equals(mediaSource.activeSourceBuffers.length, 0,
                            "activeSourceBuffers is empty to start with");
                          assert_equals(mediaSource.sourceBuffers.length, 2,
                            "sourceBuffers list contains both SourceBuffers");
                          assert_equals(mediaSource.sourceBuffers[0], expectedFirstSB,
                            "first SourceBuffer matches expectation");
                          assert_equals(mediaSource.sourceBuffers[1], expectedSecondSB,
                            "second SourceBuffer matches expectation");
                          test.expectEvent(mediaSource.activeSourceBuffers, "addsourcebuffer");
                          test.expectEvent(mediaSource.activeSourceBuffers, "addsourcebuffer");
                          test.expectEvent(mediaElement, "loadedmetadata");
                          if (appendAudioFirst) {
                              sourceBufferAudio.appendBuffer(dataAudio);
                              sourceBufferVideo.appendBuffer(dataVideo);
                          } else {
                              sourceBufferVideo.appendBuffer(dataVideo);
                              sourceBufferAudio.appendBuffer(dataAudio);
                          }

                          test.waitForExpectedEvents(function()
                          {
                              assert_equals(mediaSource.activeSourceBuffers.length, 2,
                                "activeSourceBuffers list updated when tracks are loaded");
                              assert_equals(mediaSource.activeSourceBuffers[0], mediaSource.sourceBuffers[0],
                                "first active SourceBuffer matches first SourceBuffer");
                              assert_equals(mediaSource.activeSourceBuffers[1], mediaSource.sourceBuffers[1],
                                "second active SourceBuffer matches second SourceBuffer");
                              test.done();
                          });
                      });
                  });
              },
              "Active SourceBuffers must appear in the same order as they appear in the sourceBuffers attribute: " +
                (addAudioFirst ? "audio is first sourceBuffer" : "video is first sourceBuffer") + ", " +
                (appendAudioFirst ? "audio media appended first" : "video media appended first"));
          }

          mediaSourceActiveSourceBufferOrderTest(true, true);
          mediaSourceActiveSourceBufferOrderTest(true, false);
          mediaSourceActiveSourceBufferOrderTest(false, true);
          mediaSourceActiveSourceBufferOrderTest(false, false);

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
              MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAudio, function (typeAudio, dataAudio)
              {
                  MediaSourceUtil.fetchManifestAndData(test, manifestFilenameVideo, function (typeVideo, dataVideo)
                  {
                      var sourceBufferAudio = mediaSource.addSourceBuffer(typeAudio);
                      var sourceBufferVideo = mediaSource.addSourceBuffer(typeVideo);

                      test.expectEvent(sourceBufferAudio.audioTracks, "addtrack");
                      test.expectEvent(sourceBufferVideo.videoTracks, "addtrack");
                      sourceBufferAudio.appendBuffer(dataAudio);
                      sourceBufferVideo.appendBuffer(dataVideo);

                      test.waitForExpectedEvents(function()
                      {
                          assert_equals(mediaSource.activeSourceBuffers.length, 2,
                            "activeSourceBuffers list updated when tracks are loaded");
                          assert_equals(sourceBufferAudio.audioTracks.length, 1,
                            "audio track list contains loaded audio track");
                          assert_equals(sourceBufferVideo.videoTracks.length, 1,
                            "video track list contains loaded video track");

                          test.expectEvent(mediaSource.activeSourceBuffers, "removesourcebuffer");
                          sourceBufferAudio.audioTracks[0].enabled = false;
                      });

                      test.waitForExpectedEvents(function()
                      {
                          assert_equals(mediaSource.activeSourceBuffers.length, 1,
                            "audio source buffer no longer in the activeSourceBuffers list");
                          assert_equals(mediaSource.activeSourceBuffers[0], sourceBufferVideo,
                            "activeSourceBuffers list only contains the video SourceBuffer");

                          test.expectEvent(mediaSource.activeSourceBuffers, "addsourcebuffer");
                          test.expectEvent(mediaSource.activeSourceBuffers, "removesourcebuffer");
                          sourceBufferAudio.audioTracks[0].enabled = true;
                          sourceBufferVideo.videoTracks[0].selected = false;
                      });

                      test.waitForExpectedEvents(function()
                      {
                          assert_equals(mediaSource.activeSourceBuffers.length, 1,
                            "video source buffer no longer in the activeSourceBuffers list");
                          assert_equals(mediaSource.activeSourceBuffers[0], sourceBufferAudio,
                            "activeSourceBuffers list only contains the audio SourceBuffer");
                          test.done();
                      });
                  });
              });
          }, "Active SourceBuffers list reflects changes to selected audio/video tracks associated with separate SourceBuffers.");


          mediasource_test(function(test, mediaElement, mediaSource)
          {
              mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
              MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAV, function (typeAV, dataAV)
              {
                  var sourceBuffer = mediaSource.addSourceBuffer(typeAV);

                  test.expectEvent(sourceBuffer.audioTracks, "addtrack");
                  test.expectEvent(sourceBuffer.videoTracks, "addtrack");
                  sourceBuffer.appendBuffer(dataAV);

                  test.waitForExpectedEvents(function()
                  {
                      assert_equals(mediaSource.activeSourceBuffers.length, 1,
                        "activeSourceBuffers list updated when tracks are loaded");
                      assert_equals(sourceBuffer.audioTracks.length, 1,
                        "audio track list contains loaded audio track");
                      assert_equals(sourceBuffer.videoTracks.length, 1,
                        "video track list contains loaded video track");

                      mediaSource.activeSourceBuffers.addEventListener("removesourcebuffer", test.unreached_func(
                        "Unexpected removal from activeSourceBuffers list"));
                      mediaSource.activeSourceBuffers.addEventListener("addsourcebuffer", test.unreached_func(
                        "Unexpected insertion in activeSourceBuffers list"));

                      // Changes should only trigger events at the
                      // AudioTrack/VideoTrack instance
                      test.expectEvent(sourceBuffer.audioTracks, "change");
                      sourceBuffer.audioTracks[0].enabled = false;
                  });

                  test.waitForExpectedEvents(function()
                  {
                      assert_equals(mediaSource.activeSourceBuffers.length, 1,
                        "activeSourceBuffers list unchanged");

                      test.expectEvent(sourceBuffer.videoTracks, "change");
                      sourceBuffer.audioTracks[0].enabled = true;
                      sourceBuffer.videoTracks[0].selected = false;
                  });

                  test.waitForExpectedEvents(function()
                  {
                      assert_equals(mediaSource.activeSourceBuffers.length, 1,
                        "activeSourceBuffers list unchanged");
                      test.done();
                  });
              });
          }, "Active SourceBuffers list ignores changes to selected audio/video tracks " +
            "that do not affect the activation of the SourceBuffer.");
        </script>
    </body>
</html>