codec-parser
Advanced tools
Comparing version 2.4.1 to 2.4.2
{ | ||
"name": "codec-parser", | ||
"version": "2.4.1", | ||
"version": "2.4.2", | ||
"description": "Library that parses raw data from audio codecs into frames containing data, header values, duration, and other information.", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -48,2 +48,3 @@ /* Copyright 2020-2023 Ethan Halsall | ||
this._identificationHeader = null; | ||
this._setupComplete = false; | ||
@@ -62,19 +63,22 @@ this._mode = { | ||
[parseOggPage](oggPage) { | ||
const oggPageSegments = frameStore.get(oggPage)[segments]; | ||
oggPage[codecFrames] = []; | ||
if (oggPage[pageSequenceNumber] === 0) { | ||
// Identification header | ||
for (const oggPageSegment of frameStore.get(oggPage)[segments]) { | ||
if (oggPageSegment[0] === 1) { | ||
// Identification header | ||
this._headerCache[enable](); | ||
this._identificationHeader = oggPage[data]; | ||
} else if (oggPage[pageSequenceNumber] === 1) { | ||
// gather WEBM CodecPrivate data | ||
if (oggPageSegments[1]) { | ||
this._vorbisComments = oggPageSegments[0]; | ||
this._vorbisSetup = oggPageSegments[1]; | ||
this._headerCache[enable](); | ||
this._identificationHeader = oggPage[data]; | ||
this._setupComplete = false; | ||
} else if (oggPageSegment[0] === 3) { | ||
// comment header | ||
this._mode = this._parseSetupHeader(oggPageSegments[1]); | ||
} | ||
} else { | ||
oggPage[codecFrames] = oggPageSegments.map((segment) => { | ||
this._vorbisComments = oggPageSegment; | ||
} else if (oggPageSegment[0] === 5) { | ||
// setup header | ||
this._vorbisSetup = oggPageSegment; | ||
this._mode = this._parseSetupHeader(oggPageSegment); | ||
this._setupComplete = true; | ||
} else if (this._setupComplete) { | ||
const header = VorbisHeader[getHeaderFromUint8Array]( | ||
@@ -88,14 +92,16 @@ this._identificationHeader, | ||
if (header) { | ||
return new VorbisFrame( | ||
segment, | ||
header, | ||
this._getSamples(segment, header) | ||
oggPage[codecFrames].push( | ||
new VorbisFrame( | ||
oggPageSegment, | ||
header, | ||
this._getSamples(oggPageSegment, header) | ||
) | ||
); | ||
} else { | ||
this._codecParser[logError]( | ||
"Failed to parse Ogg Vorbis Header", | ||
"Not a valid Ogg Vorbis file" | ||
); | ||
} | ||
this._codecParser[logError]( | ||
"Failed to parse Ogg Vorbis Header", | ||
"Not a valid Ogg Vorbis file" | ||
); | ||
}); | ||
} | ||
} | ||
@@ -102,0 +108,0 @@ |
@@ -39,2 +39,4 @@ /* Copyright 2020-2023 Ethan Halsall | ||
uint8Array, | ||
isLastPage, | ||
streamSerialNumber, | ||
} from "../../constants.js"; | ||
@@ -50,13 +52,11 @@ | ||
export default class OggParser extends Parser { | ||
class OggStream { | ||
constructor(codecParser, headerCache, onCodec) { | ||
super(codecParser, headerCache); | ||
this._codecParser = codecParser; | ||
this._headerCache = headerCache; | ||
this._onCodec = onCodec; | ||
this._onCodec = onCodec; | ||
this.Frame = OggPage; | ||
this.Header = OggPageHeader; | ||
this._continuedPacket = new uint8Array(); | ||
this._codec = null; | ||
this._continuedPacket = new uint8Array(); | ||
this._pageSequenceNumber = 0; | ||
this._isSupported = null; | ||
} | ||
@@ -80,3 +80,3 @@ | ||
_checkForIdentifier({ data }) { | ||
_checkCodecSupport({ data }) { | ||
const idString = bytesToString(data[subarray](0, 8)); | ||
@@ -86,4 +86,2 @@ | ||
case "fishead\0": | ||
case "fisbone\0": | ||
case "index\0\0\0": | ||
return false; // ignore ogg skeleton packets | ||
@@ -99,2 +97,4 @@ case "OpusHead": | ||
return true; | ||
default: | ||
return false; | ||
} | ||
@@ -120,4 +120,7 @@ } | ||
*[parseFrame]() { | ||
const oggPage = yield* this[fixedLengthFrameSync](true); | ||
_parsePage(oggPage) { | ||
if (this._isSupported === null) { | ||
this._pageSequenceNumber = oggPage[pageSequenceNumber]; | ||
this._isSupported = this._checkCodecSupport(oggPage); | ||
} | ||
@@ -130,3 +133,2 @@ this._checkPageSequenceNumber(oggPage); | ||
let offset = 0; | ||
oggPageStore[segments] = headerData[pageSegmentTable].map((segmentLength) => | ||
@@ -157,8 +159,49 @@ oggPage[data][subarray](offset, (offset += segmentLength)) | ||
if (this._codec || this._checkForIdentifier(oggPage)) { | ||
if (this._isSupported) { | ||
const frame = this._parser[parseOggPage](oggPage); | ||
this._codecParser[mapFrameStats](frame); | ||
return frame; | ||
} else { | ||
return oggPage; | ||
} | ||
} | ||
} | ||
export default class OggParser extends Parser { | ||
constructor(codecParser, headerCache, onCodec) { | ||
super(codecParser, headerCache); | ||
this._onCodec = onCodec; | ||
this.Frame = OggPage; | ||
this.Header = OggPageHeader; | ||
this._streams = new Map(); | ||
this._currentSerialNumber = null; | ||
} | ||
get [codec]() { | ||
const oggStream = this._streams.get(this._currentSerialNumber); | ||
return oggStream ? oggStream.codec : ""; | ||
} | ||
*[parseFrame]() { | ||
const oggPage = yield* this[fixedLengthFrameSync](true); | ||
this._currentSerialNumber = oggPage[streamSerialNumber]; | ||
let oggStream = this._streams.get(this._currentSerialNumber); | ||
if (!oggStream) { | ||
oggStream = new OggStream( | ||
this._codecParser, | ||
this._headerCache, | ||
this._onCodec | ||
); | ||
this._streams.set(this._currentSerialNumber, oggStream); | ||
} | ||
if (oggPage[isLastPage]) this._streams.delete(this._currentSerialNumber); | ||
return oggStream._parsePage(oggPage); | ||
} | ||
} |
154682
3655