index.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /**
  2. * mux.js
  3. *
  4. * Copyright (c) Brightcove
  5. * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE
  6. *
  7. * A stream-based aac to mp4 converter. This utility can be used to
  8. * deliver mp4s to a SourceBuffer on platforms that support native
  9. * Media Source Extensions.
  10. */
  11. 'use strict';
  12. var Stream = require('../utils/stream.js');
  13. var aacUtils = require('./utils'); // Constants
  14. var _AacStream;
  15. /**
  16. * Splits an incoming stream of binary data into ADTS and ID3 Frames.
  17. */
  18. _AacStream = function AacStream() {
  19. var everything = new Uint8Array(),
  20. timeStamp = 0;
  21. _AacStream.prototype.init.call(this);
  22. this.setTimestamp = function (timestamp) {
  23. timeStamp = timestamp;
  24. };
  25. this.push = function (bytes) {
  26. var frameSize = 0,
  27. byteIndex = 0,
  28. bytesLeft,
  29. chunk,
  30. packet,
  31. tempLength; // If there are bytes remaining from the last segment, prepend them to the
  32. // bytes that were pushed in
  33. if (everything.length) {
  34. tempLength = everything.length;
  35. everything = new Uint8Array(bytes.byteLength + tempLength);
  36. everything.set(everything.subarray(0, tempLength));
  37. everything.set(bytes, tempLength);
  38. } else {
  39. everything = bytes;
  40. }
  41. while (everything.length - byteIndex >= 3) {
  42. if (everything[byteIndex] === 'I'.charCodeAt(0) && everything[byteIndex + 1] === 'D'.charCodeAt(0) && everything[byteIndex + 2] === '3'.charCodeAt(0)) {
  43. // Exit early because we don't have enough to parse
  44. // the ID3 tag header
  45. if (everything.length - byteIndex < 10) {
  46. break;
  47. } // check framesize
  48. frameSize = aacUtils.parseId3TagSize(everything, byteIndex); // Exit early if we don't have enough in the buffer
  49. // to emit a full packet
  50. // Add to byteIndex to support multiple ID3 tags in sequence
  51. if (byteIndex + frameSize > everything.length) {
  52. break;
  53. }
  54. chunk = {
  55. type: 'timed-metadata',
  56. data: everything.subarray(byteIndex, byteIndex + frameSize)
  57. };
  58. this.trigger('data', chunk);
  59. byteIndex += frameSize;
  60. continue;
  61. } else if ((everything[byteIndex] & 0xff) === 0xff && (everything[byteIndex + 1] & 0xf0) === 0xf0) {
  62. // Exit early because we don't have enough to parse
  63. // the ADTS frame header
  64. if (everything.length - byteIndex < 7) {
  65. break;
  66. }
  67. frameSize = aacUtils.parseAdtsSize(everything, byteIndex); // Exit early if we don't have enough in the buffer
  68. // to emit a full packet
  69. if (byteIndex + frameSize > everything.length) {
  70. break;
  71. }
  72. packet = {
  73. type: 'audio',
  74. data: everything.subarray(byteIndex, byteIndex + frameSize),
  75. pts: timeStamp,
  76. dts: timeStamp
  77. };
  78. this.trigger('data', packet);
  79. byteIndex += frameSize;
  80. continue;
  81. }
  82. byteIndex++;
  83. }
  84. bytesLeft = everything.length - byteIndex;
  85. if (bytesLeft > 0) {
  86. everything = everything.subarray(byteIndex);
  87. } else {
  88. everything = new Uint8Array();
  89. }
  90. };
  91. this.reset = function () {
  92. everything = new Uint8Array();
  93. this.trigger('reset');
  94. };
  95. this.endTimeline = function () {
  96. everything = new Uint8Array();
  97. this.trigger('endedtimeline');
  98. };
  99. };
  100. _AacStream.prototype = new Stream();
  101. module.exports = _AacStream;