Blame view

node_modules/videojs-contrib-hls/src/rendition-mixin.js 3.12 KB
2a09d1a4   liuqimichale   添加宜春 天水 宣化
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
  import { isIncompatible, isEnabled } from './playlist.js';
  
  /**
   * Returns a function that acts as the Enable/disable playlist function.
   *
   * @param {PlaylistLoader} loader - The master playlist loader
   * @param {String} playlistUri - uri of the playlist
   * @param {Function} changePlaylistFn - A function to be called after a
   * playlist's enabled-state has been changed. Will NOT be called if a
   * playlist's enabled-state is unchanged
   * @param {Boolean=} enable - Value to set the playlist enabled-state to
   * or if undefined returns the current enabled-state for the playlist
   * @return {Function} Function for setting/getting enabled
   */
  const enableFunction = (loader, playlistUri, changePlaylistFn) => (enable) => {
    const playlist = loader.master.playlists[playlistUri];
    const incompatible = isIncompatible(playlist);
    const currentlyEnabled = isEnabled(playlist);
  
    if (typeof enable === 'undefined') {
      return currentlyEnabled;
    }
  
    if (enable) {
      delete playlist.disabled;
    } else {
      playlist.disabled = true;
    }
  
    if (enable !== currentlyEnabled && !incompatible) {
      // Ensure the outside world knows about our changes
      changePlaylistFn();
      if (enable) {
        loader.trigger('renditionenabled');
      } else {
        loader.trigger('renditiondisabled');
      }
    }
    return enable;
  };
  
  /**
   * The representation object encapsulates the publicly visible information
   * in a media playlist along with a setter/getter-type function (enabled)
   * for changing the enabled-state of a particular playlist entry
   *
   * @class Representation
   */
  class Representation {
    constructor(hlsHandler, playlist, id) {
      // Get a reference to a bound version of fastQualityChange_
      let fastChangeFunction = hlsHandler
                                .masterPlaylistController_
                                .fastQualityChange_
                                .bind(hlsHandler.masterPlaylistController_);
  
      // some playlist attributes are optional
      if (playlist.attributes.RESOLUTION) {
        const resolution = playlist.attributes.RESOLUTION;
  
        this.width = resolution.width;
        this.height = resolution.height;
      }
  
      this.bandwidth = playlist.attributes.BANDWIDTH;
  
      // The id is simply the ordinality of the media playlist
      // within the master playlist
      this.id = id;
  
      // Partially-apply the enableFunction to create a playlist-
      // specific variant
      this.enabled = enableFunction(hlsHandler.playlists,
                                    playlist.uri,
                                    fastChangeFunction);
    }
  }
  
  /**
   * A mixin function that adds the `representations` api to an instance
   * of the HlsHandler class
   * @param {HlsHandler} hlsHandler - An instance of HlsHandler to add the
   * representation API into
   */
  let renditionSelectionMixin = function(hlsHandler) {
    let playlists = hlsHandler.playlists;
  
    // Add a single API-specific function to the HlsHandler instance
    hlsHandler.representations = () => {
      return playlists
        .master
        .playlists
        .filter((media) => !isIncompatible(media))
        .map((e, i) => new Representation(hlsHandler, e, e.uri));
    };
  };
  
  export default renditionSelectionMixin;