parse-sidx.js 1.2 KB

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