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;
}