function parseMp4()

in 2020/lib/parsers/mp4.js [48:106]


function parseMp4(data) {
  var sidxStartBytes = getSIDXOffset(data);
  var currPos = sidxStartBytes;

  function read(bytes) {
    if (currPos + bytes > data.length)
      throw 'sidx box is incomplete.';
    var result = [];
    for (var i = 0; i < bytes; ++i)
      result.push(data[currPos + i]);
    currPos += bytes;
    return result;
  }

  var size = btoi(read(4));
  var sidxEnd = sidxStartBytes + size;
  var boxType = read(4);
  boxType = btofourcc(boxType);
  if (boxType !== 'sidx')
    throw 'Unrecognized box type ' + boxType;

  var verFlags = btoi(read(4));
  var refId = read(4);
  var timescale = btoi(read(4));

  var earliestPts, offset;
  if (verFlags === 0) {
    earliestPts = btoi(read(4));
    offset = btoi(read(4));
  } else {
    dlog(2, 'Warning: may be truncating sidx values');
    read(4);
    earliestPts = btoi(read(4));
    read(4);
    offset = btoi(read(4));
  }
  offset = offset + sidxEnd;

  var count = btoi(read(4));
  var time = earliestPts;

  var res = [];
  for (var i = 0; i < count; ++i) {
    var size = btoi(read(4));
    var duration = btoi(read(4));
    var sapStuff = read(4);
    res.push({
      time: time / timescale,
      duration: duration / timescale,
      offset: offset,
      size: size
    });
    time = time + duration;
    offset = offset + size;
  }
  if (currPos !== sidxEnd)
    throw 'Bad end point' + currPos + sidxEnd;
  return res;
}