Home Reference Source

src/demux/demuxer-worker.js

  1. /* demuxer web worker.
  2. * - listen to worker message, and trigger DemuxerInline upon reception of Fragments.
  3. * - 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.
  4. */
  5.  
  6. import DemuxerInline from '../demux/demuxer-inline';
  7. import Event from '../events';
  8. import { enableLogs } from '../utils/logger';
  9.  
  10. import { EventEmitter } from 'eventemitter3';
  11.  
  12. let DemuxerWorker = function (self) {
  13. // observer setup
  14. let observer = new EventEmitter();
  15. observer.trigger = function trigger (event, ...data) {
  16. observer.emit(event, event, ...data);
  17. };
  18.  
  19. observer.off = function off (event, ...data) {
  20. observer.removeListener(event, ...data);
  21. };
  22.  
  23. let forwardMessage = function (ev, data) {
  24. self.postMessage({ event: ev, data: data });
  25. };
  26.  
  27. self.addEventListener('message', function (ev) {
  28. let data = ev.data;
  29. // console.log('demuxer cmd:' + data.cmd);
  30. switch (data.cmd) {
  31. case 'init':
  32. const config = JSON.parse(data.config);
  33. self.demuxer = new DemuxerInline(observer, data.typeSupported, config, data.vendor);
  34.  
  35. enableLogs(config.debug);
  36.  
  37. // signal end of worker init
  38. forwardMessage('init', null);
  39. break;
  40. case 'demux':
  41. 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);
  42. break;
  43. default:
  44. break;
  45. }
  46. });
  47.  
  48. // forward events to main thread
  49. observer.on(Event.FRAG_DECRYPTED, forwardMessage);
  50. observer.on(Event.FRAG_PARSING_INIT_SEGMENT, forwardMessage);
  51. observer.on(Event.FRAG_PARSED, forwardMessage);
  52. observer.on(Event.ERROR, forwardMessage);
  53. observer.on(Event.FRAG_PARSING_METADATA, forwardMessage);
  54. observer.on(Event.FRAG_PARSING_USERDATA, forwardMessage);
  55. observer.on(Event.INIT_PTS_FOUND, forwardMessage);
  56.  
  57. // special case for FRAG_PARSING_DATA: pass data1/data2 as transferable object (no copy)
  58. observer.on(Event.FRAG_PARSING_DATA, function (ev, data) {
  59. let transferable = [];
  60. let message = { event: ev, data: data };
  61. if (data.data1) {
  62. message.data1 = data.data1.buffer;
  63. transferable.push(data.data1.buffer);
  64. delete data.data1;
  65. }
  66. if (data.data2) {
  67. message.data2 = data.data2.buffer;
  68. transferable.push(data.data2.buffer);
  69. delete data.data2;
  70. }
  71. self.postMessage(message, transferable);
  72. });
  73. };
  74.  
  75. export default DemuxerWorker;