m2ts-helpers.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.parseTs = void 0;
  6. var _byteHelpers = require("./byte-helpers.js");
  7. var SYNC_BYTE = 0x47; // use of maxPes is deprecated as we should always look at
  8. // all pes packets to prevent being caught off guard by changes
  9. // in that stream that happen after the pes specified
  10. var parseTs = function parseTs(bytes, maxPes) {
  11. if (maxPes === void 0) {
  12. maxPes = Infinity;
  13. }
  14. bytes = (0, _byteHelpers.toUint8)(bytes);
  15. var startIndex = 0;
  16. var endIndex = 188;
  17. var pmt = {};
  18. var pesCount = 0;
  19. while (endIndex < bytes.byteLength && pesCount < maxPes) {
  20. if (bytes[startIndex] !== SYNC_BYTE && bytes[endIndex] !== SYNC_BYTE) {
  21. endIndex += 1;
  22. startIndex += 1;
  23. continue;
  24. }
  25. var packet = bytes.subarray(startIndex, endIndex);
  26. var pid = (packet[1] & 0x1f) << 8 | packet[2];
  27. var hasPusi = !!(packet[1] & 0x40);
  28. var hasAdaptationHeader = (packet[3] & 0x30) >>> 4 > 0x01;
  29. var payloadOffset = 4 + (hasAdaptationHeader ? packet[4] + 1 : 0);
  30. if (hasPusi) {
  31. payloadOffset += packet[payloadOffset] + 1;
  32. }
  33. if (pid === 0 && !pmt.pid) {
  34. pmt.pid = (packet[payloadOffset + 10] & 0x1f) << 8 | packet[payloadOffset + 11];
  35. } else if (pmt.pid && pid === pmt.pid) {
  36. var isNotForward = packet[payloadOffset + 5] & 0x01; // ignore forward pmt delarations
  37. if (!isNotForward) {
  38. continue;
  39. }
  40. pmt.streams = pmt.streams || {};
  41. var sectionLength = (packet[payloadOffset + 1] & 0x0f) << 8 | packet[payloadOffset + 2];
  42. var tableEnd = 3 + sectionLength - 4;
  43. var programInfoLength = (packet[payloadOffset + 10] & 0x0f) << 8 | packet[payloadOffset + 11];
  44. var offset = 12 + programInfoLength;
  45. while (offset < tableEnd) {
  46. // add an entry that maps the elementary_pid to the stream_type
  47. var i = payloadOffset + offset;
  48. var type = packet[i];
  49. var esPid = (packet[i + 1] & 0x1F) << 8 | packet[i + 2];
  50. var esLength = (packet[i + 3] & 0x0f) << 8 | packet[i + 4];
  51. var esInfo = packet.subarray(i + 5, i + 5 + esLength);
  52. var stream = pmt.streams[esPid] = {
  53. esInfo: esInfo,
  54. typeNumber: type,
  55. packets: [],
  56. type: '',
  57. codec: ''
  58. };
  59. if (type === 0x06 && (0, _byteHelpers.bytesMatch)(esInfo, [0x4F, 0x70, 0x75, 0x73], {
  60. offset: 2
  61. })) {
  62. stream.type = 'audio';
  63. stream.codec = 'opus';
  64. } else if (type === 0x1B || type === 0x20) {
  65. stream.type = 'video';
  66. stream.codec = 'avc1';
  67. } else if (type === 0x24) {
  68. stream.type = 'video';
  69. stream.codec = 'hev1';
  70. } else if (type === 0x10) {
  71. stream.type = 'video';
  72. stream.codec = 'mp4v.20';
  73. } else if (type === 0x0F) {
  74. stream.type = 'audio';
  75. stream.codec = 'aac';
  76. } else if (type === 0x81) {
  77. stream.type = 'audio';
  78. stream.codec = 'ac-3';
  79. } else if (type === 0x87) {
  80. stream.type = 'audio';
  81. stream.codec = 'ec-3';
  82. } else if (type === 0x03 || type === 0x04) {
  83. stream.type = 'audio';
  84. stream.codec = 'mp3';
  85. }
  86. offset += esLength + 5;
  87. }
  88. } else if (pmt.pid && pmt.streams) {
  89. pmt.streams[pid].packets.push(packet.subarray(payloadOffset));
  90. pesCount++;
  91. }
  92. startIndex += 188;
  93. endIndex += 188;
  94. }
  95. if (!pmt.streams) {
  96. pmt.streams = {};
  97. }
  98. return pmt;
  99. };
  100. exports.parseTs = parseTs;