media_source_utils.js revision 5f1c94371a64b3196d4be9466099bb892df9b88e
1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// MediaSourceUtils provides basic functionality to load content using MSE API.
6var MediaSourceUtils = new function() {
7}
8
9MediaSourceUtils.loadMediaSourceFromTestConfig = function(testConfig,
10                                                          appendCallbackFn) {
11  return this.loadMediaSource(testConfig.mediaFile,
12                              testConfig.mediaType,
13                              appendCallbackFn);
14};
15
16MediaSourceUtils.loadMediaSource = function(mediaFiles,
17                                            mediaTypes,
18                                            appendCallbackFn) {
19  if (!mediaFiles || !mediaTypes)
20    Utils.failTest('Missing parameters in loadMediaSource().');
21
22  var mediaFiles = Utils.convertToArray(mediaFiles);
23  var mediaTypes = Utils.convertToArray(mediaTypes);
24  var totalAppended = 0;
25  function onSourceOpen(e) {
26    Utils.timeLog('onSourceOpen', e);
27    // We can load multiple media files using the same media type. However, if
28    // more than one media type is used, we expect to have a media type entry
29    // for each corresponding media file.
30    var srcBuffer = null;
31    for (var i = 0; i < mediaFiles.length; i++) {
32      if (i == 0 || mediaFiles.length == mediaTypes.length) {
33        Utils.timeLog('Creating a source buffer for type ' + mediaTypes[i]);
34        try {
35          srcBuffer = mediaSource.addSourceBuffer(mediaTypes[i]);
36        } catch (e) {
37          Utils.failTest('Exception adding source buffer: ' + e.message);
38          return;
39        }
40      }
41      doAppend(mediaFiles[i], srcBuffer);
42    }
43  }
44
45  function doAppend(mediaFile, srcBuffer) {
46    var xhr = new XMLHttpRequest();
47    xhr.open('GET', mediaFile);
48    xhr.responseType = 'arraybuffer';
49    xhr.addEventListener('load', function(e) {
50      var onUpdateEnd = function(e) {
51        Utils.timeLog('End of appending buffer from ' + mediaFile);
52        srcBuffer.removeEventListener('updateend', onUpdateEnd);
53        totalAppended++;
54        if (totalAppended == mediaFiles.length) {
55          if (appendCallbackFn)
56            appendCallbackFn(mediaSource);
57          else
58            mediaSource.endOfStream();
59        }
60      };
61      srcBuffer.addEventListener('updateend', onUpdateEnd);
62      srcBuffer.appendBuffer(new Uint8Array(e.target.response));
63    });
64    xhr.send();
65  }
66
67  var mediaSource = new MediaSource();
68  mediaSource.addEventListener('sourceopen', onSourceOpen);
69  return mediaSource;
70};
71