parse-sidx.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. "use strict";
  2. var getUint64 = require('../utils/numbers.js').getUint64;
  3. var parseSidx = function parseSidx(data) {
  4. var view = new DataView(data.buffer, data.byteOffset, data.byteLength),
  5. result = {
  6. version: data[0],
  7. flags: new Uint8Array(data.subarray(1, 4)),
  8. references: [],
  9. referenceId: view.getUint32(4),
  10. timescale: view.getUint32(8)
  11. },
  12. i = 12;
  13. if (result.version === 0) {
  14. result.earliestPresentationTime = view.getUint32(i);
  15. result.firstOffset = view.getUint32(i + 4);
  16. i += 8;
  17. } else {
  18. // read 64 bits
  19. result.earliestPresentationTime = getUint64(data.subarray(i));
  20. result.firstOffset = getUint64(data.subarray(i + 8));
  21. i += 16;
  22. }
  23. i += 2; // reserved
  24. var referenceCount = view.getUint16(i);
  25. i += 2; // start of references
  26. for (; referenceCount > 0; i += 12, referenceCount--) {
  27. result.references.push({
  28. referenceType: (data[i] & 0x80) >>> 7,
  29. referencedSize: view.getUint32(i) & 0x7FFFFFFF,
  30. subsegmentDuration: view.getUint32(i + 4),
  31. startsWithSap: !!(data[i + 8] & 0x80),
  32. sapType: (data[i + 8] & 0x70) >>> 4,
  33. sapDeltaTime: view.getUint32(i + 8) & 0x0FFFFFFF
  34. });
  35. }
  36. return result;
  37. };
  38. module.exports = parseSidx;