ts-nalstream
Version:
Parse NAL units out of MPEG-TS Video Stream Packets
28 lines (25 loc) • 1.01 kB
text/typescript
function * parseNALUsFromPacket(bytes: Uint8Array): Generator<Uint8Array> {
const view = new DataView(bytes.buffer, bytes.byteOffset);
const len = bytes.byteLength - 3;
let start: number;
let end = 1;
do {
// Check # of sync bytes (0x000001 or 0x00000001)
end += view.getUint16(end + 1) ? 3 : 4;
for (start = end; end < len; end++) {
// Step forward until we hit another 3- or 4-byte header
if (view.getUint16(end) === 0 &&
(bytes[end + 2] === 1 || (view.getUint16(end + 2) === 1))) {
yield bytes.subarray(start, end);
break;
}
}
} while (end < len);
// A packet can't end with a header,
// so one last NAL Unit extends to the end
yield bytes.subarray(start);
}
export function * parseNALStream(bytes: Uint8Array | Iterable<Uint8Array>): Generator<Uint8Array> {
if (bytes instanceof Uint8Array) yield * parseNALUsFromPacket(bytes);
else for (const packet of bytes) yield * parseNALUsFromPacket(packet);
}