# All files / src/demux demuxer-worker.js

2.5% Statements 1/40
0% Branches 0/7
0% Functions 0/6
2.5% Lines 1/40

    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

    1x

     /* demuxer web worker.
     *  - listen to worker message, and trigger DemuxerInline upon reception of Fragments.
     *  - provides MP4 Boxes back to main thread using [transferable objects](https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast) in order to minimize message passing overhead.
     */

     import DemuxerInline from '../demux/demuxer-inline';
     import Event from '../events';
     import {enableLogs} from '../utils/logger';
     import EventEmitter from 'events';

    var DemuxerWorker = function (self) {
      // observer setup
      var observer = new EventEmitter();
      observer.trigger = function trigger (event, ...data) {
        observer.emit(event, event, ...data);
      };

      observer.off = function off (event, ...data) {
        observer.removeListener(event, ...data);
      };

      var forwardMessage = function(ev,data) {
        self.postMessage({event: ev, data:data });
      };

      self.addEventListener('message', function (ev) {
        var data = ev.data;
        //console.log('demuxer cmd:' + data.cmd);
        switch (data.cmd) {
          case 'init':
            let config = JSON.parse(data.config);
            self.demuxer = new DemuxerInline(observer, data.typeSupported, config, data.vendor);
            try {
              enableLogs(config.debug === true);
            } catch(err) {
              console.warn('demuxerWorker: unable to enable logs');
            }
            // signal end of worker init
            forwardMessage('init',null);
            break;
          case 'demux':
            self.demuxer.push(data.data, data.decryptdata, data.initSegment, data.audioCodec, data.videoCodec, data.timeOffset,data.discontinuity, data.trackSwitch,data.contiguous,data.duration,data.accurateTimeOffset,data.defaultInitPTS);
            break;
          default:
            break;
        }
      });

      // forward events to main thread
      observer.on(Event.FRAG_DECRYPTED, forwardMessage);
      observer.on(Event.FRAG_PARSING_INIT_SEGMENT, forwardMessage);
      observer.on(Event.FRAG_PARSED, forwardMessage);
      observer.on(Event.ERROR, forwardMessage);
      observer.on(Event.FRAG_PARSING_METADATA, forwardMessage);
      observer.on(Event.FRAG_PARSING_USERDATA, forwardMessage);
      observer.on(Event.INIT_PTS_FOUND, forwardMessage);

      // special case for FRAG_PARSING_DATA: pass data1/data2 as transferable object (no copy)
      observer.on(Event.FRAG_PARSING_DATA, function(ev, data) {
        let transferable = [];
        let message = {event: ev, data:data};
        if (data.data1) {
          message.data1 = data.data1.buffer;
          transferable.push(data.data1.buffer);
          delete data.data1;
        }
        if (data.data2) {
          message.data2 = data.data2.buffer;
          transferable.push(data.data2.buffer);
          delete data.data2;
        }
        self.postMessage(message,transferable);
      });
    };

    export default DemuxerWorker;