UNPKG

@remotion/media-parser

Version:

A pure JavaScript library for parsing video files

78 lines (77 loc) 2.86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parsePes = void 0; const parsePes = ({ iterator, offset, }) => { const ident = iterator.getUint24(); if (ident !== 0x000001) { throw new Error(`Unexpected PES packet start code: ${ident.toString(16)}`); } const streamId = iterator.getUint8(); iterator.getUint16(); // PES packet length, is most of the time 0, so useless iterator.startReadingBits(); const markerBits = iterator.getBits(2); if (markerBits !== 0b10) { throw new Error(`Invalid marker bits: ${markerBits}`); } const scrambled = iterator.getBits(2); if (scrambled !== 0b00) { throw new Error(`Only supporting non-scrambled streams`); } const priority = iterator.getBits(1); iterator.getBits(1); // data alignment indicator iterator.getBits(1); // copy right iterator.getBits(1); // original or copy const ptsPresent = iterator.getBits(1); const dtsPresent = iterator.getBits(1); if (!ptsPresent && dtsPresent) { throw new Error(`DTS is present but not PTS, this is not allowed in the spec`); } iterator.getBits(1); // escr flag iterator.getBits(1); // es rate flag iterator.getBits(1); // dsm trick mode flag iterator.getBits(1); // additional copy info flag iterator.getBits(1); // crc flag iterator.getBits(1); // extension flag const pesHeaderLength = iterator.getBits(8); const offsetAfterHeader = iterator.counter.getOffset(); let pts = null; if (!ptsPresent) { throw new Error(`PTS is required`); } const fourBits = iterator.getBits(4); if (fourBits !== 0b0011 && fourBits !== 0b0010) { throw new Error(`Invalid PTS marker bits: ${fourBits}`); } const pts1 = iterator.getBits(3); iterator.getBits(1); // marker bit const pts2 = iterator.getBits(15); iterator.getBits(1); // marker bit const pts3 = iterator.getBits(15); iterator.getBits(1); // marker bit pts = (pts1 << 30) | (pts2 << 15) | pts3; let dts = null; if (dtsPresent) { const _fourBits = iterator.getBits(4); if (_fourBits !== 0b0001) { throw new Error(`Invalid DTS marker bits: ${_fourBits}`); } const dts1 = iterator.getBits(3); iterator.getBits(1); // marker bit const dts2 = iterator.getBits(15); iterator.getBits(1); // marker bit const dts3 = iterator.getBits(15); iterator.getBits(1); // marker bit dts = (dts1 << 30) | (dts2 << 15) | dts3; } iterator.stopReadingBits(); iterator.discard(pesHeaderLength - (iterator.counter.getOffset() - offsetAfterHeader)); const packet = { dts, pts, streamId, priority, offset, }; return packet; }; exports.parsePes = parsePes;