@remotion/media-parser 4.0.250 → 4.0.251
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/add-avc-profile-to-track.js +2 -2
- package/dist/buffer-iterator.d.ts +3 -2
- package/dist/buffer-iterator.js +60 -34
- package/dist/containers/aac/parse-aac.d.ts +3 -0
- package/dist/containers/aac/parse-aac.js +83 -0
- package/dist/containers/aac/types.d.ts +4 -0
- package/dist/{boxes → containers}/avc/key.d.ts +1 -1
- package/dist/containers/flac/get-block-size.d.ts +2 -0
- package/dist/containers/flac/get-block-size.js +26 -0
- package/dist/containers/flac/get-channel-count.d.ts +2 -0
- package/dist/containers/flac/get-channel-count.js +36 -0
- package/dist/containers/flac/get-duration-from-flac.d.ts +2 -0
- package/dist/containers/flac/get-duration-from-flac.js +15 -0
- package/dist/containers/flac/get-metadata-from-flac.d.ts +2 -0
- package/dist/containers/flac/get-metadata-from-flac.js +11 -0
- package/dist/containers/flac/get-sample-rate.d.ts +3 -0
- package/dist/containers/flac/get-sample-rate.js +60 -0
- package/dist/containers/flac/parse-flac-frame.d.ts +15 -0
- package/dist/containers/flac/parse-flac-frame.js +175 -0
- package/dist/{boxes/riff/parse-riff.d.ts → containers/flac/parse-flac.d.ts} +1 -1
- package/dist/containers/flac/parse-flac.js +54 -0
- package/dist/{boxes/mp3/parse-mp3.d.ts → containers/flac/parse-header.d.ts} +2 -2
- package/dist/containers/flac/parse-header.js +10 -0
- package/dist/{boxes/iso-base-media/parse-boxes.d.ts → containers/flac/parse-metadata.d.ts} +3 -2
- package/dist/containers/flac/parse-metadata.js +24 -0
- package/dist/{boxes/webm/parse-webm-header.d.ts → containers/flac/parse-streaminfo.d.ts} +1 -1
- package/dist/containers/flac/parse-streaminfo.js +53 -0
- package/dist/{boxes/riff/parse-riff-body.d.ts → containers/flac/parse-unknown-block.d.ts} +2 -1
- package/dist/containers/flac/parse-unknown-block.js +11 -0
- package/dist/containers/flac/types.d.ts +26 -0
- package/dist/containers/iso-base-media/base-media-box.d.ts +40 -0
- package/dist/containers/iso-base-media/get-children.d.ts +6 -0
- package/dist/{boxes → containers}/iso-base-media/get-children.js +3 -5
- package/dist/{boxes → containers}/iso-base-media/get-sample-positions-from-track.d.ts +1 -1
- package/dist/containers/iso-base-media/mdat/mdat.d.ts +2 -0
- package/dist/{boxes → containers}/iso-base-media/mdat/mdat.js +4 -4
- package/dist/{boxes → containers}/iso-base-media/moov/moov.d.ts +1 -3
- package/dist/{boxes → containers}/iso-base-media/moov/moov.js +1 -2
- package/dist/containers/iso-base-media/parse-boxes.d.ts +3 -0
- package/dist/{boxes → containers}/iso-base-media/parse-boxes.js +5 -11
- package/dist/containers/iso-base-media/process-box.d.ts +3 -0
- package/dist/{boxes → containers}/iso-base-media/process-box.js +2 -6
- package/dist/{boxes → containers}/iso-base-media/stsd/mebx.d.ts +1 -3
- package/dist/{boxes → containers}/iso-base-media/stsd/mebx.js +3 -4
- package/dist/{boxes → containers}/iso-base-media/stsd/samples.d.ts +4 -6
- package/dist/{boxes → containers}/iso-base-media/stsd/samples.js +4 -7
- package/dist/{boxes → containers}/iso-base-media/stsd/stsd.d.ts +1 -3
- package/dist/{boxes → containers}/iso-base-media/stsd/stsd.js +2 -2
- package/dist/{boxes → containers}/iso-base-media/trak/trak.d.ts +1 -3
- package/dist/{boxes → containers}/iso-base-media/trak/trak.js +1 -2
- package/dist/{boxes → containers}/iso-base-media/traversal.d.ts +2 -1
- package/dist/containers/iso-base-media/void-box.js +2 -0
- package/dist/containers/mp3/get-tracks-from-mp3.d.ts +4 -0
- package/dist/{boxes → containers}/mp3/get-tracks-from-mp3.js +6 -6
- package/dist/containers/mp3/id3.d.ts +4 -0
- package/dist/{boxes → containers}/mp3/id3.js +2 -1
- package/dist/containers/mp3/parse-mp3.d.ts +3 -0
- package/dist/{boxes → containers}/mp3/parse-mp3.js +3 -3
- package/dist/containers/mp3/parse-mpeg-header.d.ts +4 -0
- package/dist/{boxes → containers}/mp3/parse-mpeg-header.js +2 -1
- package/dist/containers/riff/expect-riff-box.d.ts +7 -0
- package/dist/{boxes → containers}/riff/expect-riff-box.js +4 -4
- package/dist/containers/riff/get-duration.d.ts +3 -0
- package/dist/containers/riff/get-duration.js +33 -0
- package/dist/{boxes → containers}/riff/get-tracks-from-avi.d.ts +1 -2
- package/dist/{boxes → containers}/riff/parse-list-box.d.ts +1 -3
- package/dist/{boxes → containers}/riff/parse-list-box.js +3 -5
- package/dist/{boxes → containers}/riff/parse-movi.d.ts +2 -5
- package/dist/{boxes → containers}/riff/parse-movi.js +6 -4
- package/dist/containers/riff/parse-riff-body.d.ts +3 -0
- package/dist/{boxes → containers}/riff/parse-riff-body.js +4 -7
- package/dist/{boxes → containers}/riff/parse-riff-box.d.ts +1 -3
- package/dist/{boxes → containers}/riff/parse-riff-box.js +3 -6
- package/dist/containers/riff/parse-riff-header.d.ts +3 -0
- package/dist/{boxes → containers}/riff/parse-riff-header.js +4 -4
- package/dist/containers/riff/parse-riff.d.ts +3 -0
- package/dist/{boxes → containers}/riff/parse-riff.js +4 -7
- package/dist/containers/riff/parse-video-section.d.ts +2 -0
- package/dist/{boxes → containers}/riff/parse-video-section.js +1 -2
- package/dist/{boxes → containers}/riff/riff-box.d.ts +5 -10
- package/dist/containers/riff/riff-box.js +2 -0
- package/dist/{boxes → containers}/riff/traversal.d.ts +1 -2
- package/dist/containers/transport-stream/boxes.js +2 -0
- package/dist/{boxes → containers}/transport-stream/parse-packet.d.ts +1 -3
- package/dist/{boxes → containers}/transport-stream/parse-packet.js +2 -2
- package/dist/{boxes → containers}/transport-stream/parse-stream-packet.d.ts +1 -3
- package/dist/{boxes → containers}/transport-stream/parse-stream-packet.js +2 -1
- package/dist/containers/transport-stream/parse-transport-stream.d.ts +3 -0
- package/dist/{boxes → containers}/transport-stream/parse-transport-stream.js +2 -12
- package/dist/containers/wav/get-duration-from-wav.d.ts +3 -0
- package/dist/containers/wav/get-duration-from-wav.js +29 -0
- package/dist/containers/wav/get-metadata-from-wav.d.ts +3 -0
- package/dist/containers/wav/get-metadata-from-wav.js +11 -0
- package/dist/containers/wav/parse-data.d.ts +5 -0
- package/dist/containers/wav/parse-data.js +25 -0
- package/dist/containers/wav/parse-fmt.d.ts +5 -0
- package/dist/containers/wav/parse-fmt.js +56 -0
- package/dist/containers/wav/parse-header.d.ts +5 -0
- package/dist/containers/wav/parse-header.js +17 -0
- package/dist/containers/wav/parse-id3.d.ts +5 -0
- package/dist/containers/wav/parse-id3.js +17 -0
- package/dist/containers/wav/parse-list.d.ts +5 -0
- package/dist/containers/wav/parse-list.js +32 -0
- package/dist/containers/wav/parse-video-section.d.ts +5 -0
- package/dist/containers/wav/parse-video-section.js +37 -0
- package/dist/containers/wav/parse-wav.d.ts +3 -0
- package/dist/containers/wav/parse-wav.js +36 -0
- package/dist/containers/wav/types.d.ts +30 -0
- package/dist/containers/wav/types.js +2 -0
- package/dist/{boxes → containers}/webm/parse-ebml.d.ts +1 -2
- package/dist/{boxes → containers}/webm/parse-ebml.js +3 -2
- package/dist/containers/webm/parse-webm-header.d.ts +3 -0
- package/dist/{boxes → containers}/webm/parse-webm-header.js +2 -2
- package/dist/{boxes → containers}/webm/segments.d.ts +1 -3
- package/dist/{boxes → containers}/webm/segments.js +7 -6
- package/dist/emit-available-info.d.ts +1 -3
- package/dist/emit-available-info.js +82 -72
- package/dist/errors.d.ts +1 -1
- package/dist/esm/index.mjs +1539 -555
- package/dist/file-types/detect-file-type.d.ts +5 -1
- package/dist/file-types/detect-file-type.js +6 -1
- package/dist/file-types/index.js +3 -0
- package/dist/get-audio-codec.d.ts +3 -4
- package/dist/get-audio-codec.js +3 -3
- package/dist/get-container.d.ts +2 -2
- package/dist/get-container.js +10 -1
- package/dist/get-dimensions.d.ts +2 -3
- package/dist/get-dimensions.js +13 -9
- package/dist/get-duration.d.ts +5 -5
- package/dist/get-duration.js +28 -26
- package/dist/get-fields-from-callbacks.js +4 -0
- package/dist/get-fps.d.ts +1 -1
- package/dist/get-fps.js +12 -4
- package/dist/get-is-hdr.d.ts +1 -2
- package/dist/get-is-hdr.js +2 -2
- package/dist/get-keyframes.d.ts +1 -1
- package/dist/get-keyframes.js +4 -3
- package/dist/get-number-of-audio-channels.d.ts +3 -0
- package/dist/get-number-of-audio-channels.js +14 -0
- package/dist/get-sample-aspect-ratio.d.ts +8 -8
- package/dist/get-sample-aspect-ratio.js +1 -1
- package/dist/get-sample-positions-from-lpcm.d.ts +1 -1
- package/dist/get-sample-positions-from-lpcm.js +1 -1
- package/dist/get-sample-positions.d.ts +6 -6
- package/dist/get-sample-rate.d.ts +3 -0
- package/dist/get-sample-rate.js +14 -0
- package/dist/get-tracks.d.ts +8 -7
- package/dist/get-tracks.js +23 -10
- package/dist/get-video-codec.d.ts +2 -3
- package/dist/get-video-codec.js +4 -4
- package/dist/has-all-info.js +26 -15
- package/dist/index.d.ts +103 -25
- package/dist/index.js +7 -7
- package/dist/init-video.d.ts +7 -0
- package/dist/{parse-video.js → init-video.js} +26 -55
- package/dist/is-audio-structure.d.ts +2 -0
- package/dist/is-audio-structure.js +31 -0
- package/dist/metadata/get-metadata.js +16 -1
- package/dist/metadata/metadata-from-iso.d.ts +2 -1
- package/dist/metadata/metadata-from-iso.js +1 -1
- package/dist/metadata/metadata-from-matroska.js +1 -1
- package/dist/metadata/metadata-from-riff.d.ts +1 -1
- package/dist/options.d.ts +64 -38
- package/dist/parse-media.js +101 -34
- package/dist/parse-result.d.ts +8 -44
- package/dist/perform-seek.d.ts +13 -0
- package/dist/perform-seek.js +29 -0
- package/dist/readers/reader.d.ts +1 -1
- package/dist/register-track.d.ts +3 -3
- package/dist/run-parse-iteration.d.ts +8 -0
- package/dist/run-parse-iteration.js +48 -0
- package/dist/samples-from-moof.js +1 -1
- package/dist/state/aac-state.d.ts +13 -0
- package/dist/state/aac-state.js +17 -0
- package/dist/state/can-skip-tracks.js +5 -1
- package/dist/state/emitted-fields.js +4 -0
- package/dist/state/flac-state.d.ts +4 -0
- package/dist/state/flac-state.js +13 -0
- package/dist/state/has-tracks-section.d.ts +2 -1
- package/dist/state/has-tracks-section.js +4 -1
- package/dist/state/iso-base-media/cached-sample-positions.js +2 -2
- package/dist/{may-skip-video-data → state}/may-skip-video-data.d.ts +1 -1
- package/dist/{may-skip-video-data → state}/need-samples-for-fields.js +4 -0
- package/dist/state/parser-state.d.ts +88 -9
- package/dist/state/parser-state.js +8 -3
- package/dist/state/sample-callbacks.d.ts +1 -1
- package/dist/state/sample-callbacks.js +1 -1
- package/dist/state/slow-duration-fps.d.ts +2 -0
- package/dist/state/slow-duration-fps.js +18 -0
- package/dist/state/transport-stream.d.ts +3 -3
- package/dist/state/transport-stream.js +1 -1
- package/dist/state/webm.d.ts +2 -2
- package/dist/state/webm.js +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/webcodec-sample-types.d.ts +3 -3
- package/package.json +3 -3
- package/dist/boxes/iso-base-media/continue-mdat-routine.d.ts +0 -14
- package/dist/boxes/iso-base-media/continue-mdat-routine.js +0 -74
- package/dist/boxes/iso-base-media/get-children.d.ts +0 -8
- package/dist/boxes/iso-base-media/mdat/mdat.d.ts +0 -6
- package/dist/boxes/iso-base-media/parse-all-children.d.ts +0 -8
- package/dist/boxes/iso-base-media/parse-all-children.js +0 -20
- package/dist/boxes/iso-base-media/parse-mdat-partially.d.ts +0 -9
- package/dist/boxes/iso-base-media/parse-mdat-partially.js +0 -24
- package/dist/boxes/iso-base-media/process-box.d.ts +0 -7
- package/dist/boxes/mp3/get-tracks-from-mp3.d.ts +0 -4
- package/dist/boxes/mp3/id3-v2.d.ts +0 -0
- package/dist/boxes/mp3/id3-v2.js +0 -1
- package/dist/boxes/mp3/id3.d.ts +0 -6
- package/dist/boxes/mp3/parse-mpeg-header.d.ts +0 -6
- package/dist/boxes/riff/continue-after-riff-result.d.ts +0 -13
- package/dist/boxes/riff/continue-after-riff-result.js +0 -34
- package/dist/boxes/riff/expect-riff-box.d.ts +0 -11
- package/dist/boxes/riff/parse-box.d.ts +0 -9
- package/dist/boxes/riff/parse-box.js +0 -35
- package/dist/boxes/riff/parse-fmt-box.d.ts +0 -8
- package/dist/boxes/riff/parse-fmt-box.js +0 -35
- package/dist/boxes/riff/parse-riff-header.d.ts +0 -7
- package/dist/boxes/riff/parse-video-section.d.ts +0 -6
- package/dist/boxes/transport-stream/parse-transport-stream.d.ts +0 -7
- package/dist/boxes/webm/segments/parse-children.d.ts +0 -9
- package/dist/boxes/webm/segments/parse-children.js +0 -21
- package/dist/bun-reader.d.ts +0 -1
- package/dist/bun-reader.js +0 -17
- package/dist/continue-mdat-routine.d.ts +0 -17
- package/dist/continue-mdat-routine.js +0 -92
- package/dist/parse-video.d.ts +0 -14
- package/dist/state/iso-state.d.ts +0 -4
- package/dist/state/iso-state.js +0 -13
- /package/dist/{boxes/iso-base-media/base-type.js → containers/aac/types.js} +0 -0
- /package/dist/{boxes → containers}/avc/codec-string.d.ts +0 -0
- /package/dist/{boxes → containers}/avc/codec-string.js +0 -0
- /package/dist/{boxes → containers}/avc/color.d.ts +0 -0
- /package/dist/{boxes → containers}/avc/color.js +0 -0
- /package/dist/{boxes → containers}/avc/create-sps-pps-data.d.ts +0 -0
- /package/dist/{boxes → containers}/avc/create-sps-pps-data.js +0 -0
- /package/dist/{boxes → containers}/avc/interpret-sps.d.ts +0 -0
- /package/dist/{boxes → containers}/avc/interpret-sps.js +0 -0
- /package/dist/{boxes → containers}/avc/key.js +0 -0
- /package/dist/{boxes → containers}/avc/parse-avc.d.ts +0 -0
- /package/dist/{boxes → containers}/avc/parse-avc.js +0 -0
- /package/dist/{boxes → containers}/avc/sps-and-pps.d.ts +0 -0
- /package/dist/{boxes → containers}/avc/sps-and-pps.js +0 -0
- /package/dist/{boxes/iso-base-media/void-box.js → containers/flac/types.js} +0 -0
- /package/dist/{boxes/riff/riff-box.js → containers/iso-base-media/base-media-box.js} +0 -0
- /package/dist/{boxes → containers}/iso-base-media/base-type.d.ts +0 -0
- /package/dist/{boxes/transport-stream/boxes.js → containers/iso-base-media/base-type.js} +0 -0
- /package/dist/{boxes → containers}/iso-base-media/esds/decoder-specific-config.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/esds/decoder-specific-config.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/esds/esds-descriptors.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/esds/esds-descriptors.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/esds/esds.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/esds/esds.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/ftyp.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/ftyp.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/get-actual-number-of-channels.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/get-actual-number-of-channels.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/get-keyframes.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/get-keyframes.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/get-sample-positions-from-track.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/get-video-codec-from-iso-track.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/get-video-codec-from-iso-track.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/make-track.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/make-track.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/mdhd.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/mdhd.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/meta/hdlr.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/meta/hdlr.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/meta/ilst.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/meta/ilst.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/mvhd.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/mvhd.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/parse-icc-profile.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/parse-icc-profile.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/av1c.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/av1c.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/avcc.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/avcc.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/colr.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/colr.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/ctts.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/ctts.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/hvcc.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/hvcc.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/keys.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/keys.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/pasp.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/pasp.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/stco.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/stco.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/stsc.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/stsc.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/stss.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/stss.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/stsz.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/stsz.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/stts.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/stsd/stts.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/tfdt.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/tfdt.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/tfhd.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/tfhd.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/tkhd.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/tkhd.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/to-date.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/to-date.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/traversal.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/trun.d.ts +0 -0
- /package/dist/{boxes → containers}/iso-base-media/trun.js +0 -0
- /package/dist/{boxes → containers}/iso-base-media/void-box.d.ts +0 -0
- /package/dist/{boxes → containers}/mp3/get-duration.d.ts +0 -0
- /package/dist/{boxes → containers}/mp3/get-duration.js +0 -0
- /package/dist/{boxes → containers}/mp3/get-frame-length.d.ts +0 -0
- /package/dist/{boxes → containers}/mp3/get-frame-length.js +0 -0
- /package/dist/{boxes → containers}/mp3/get-metadata-from-mp3.d.ts +0 -0
- /package/dist/{boxes → containers}/mp3/get-metadata-from-mp3.js +0 -0
- /package/dist/{boxes → containers}/mp3/id3-v1.d.ts +0 -0
- /package/dist/{boxes → containers}/mp3/id3-v1.js +0 -0
- /package/dist/{boxes → containers}/mp3/samples-per-mpeg-file.d.ts +0 -0
- /package/dist/{boxes → containers}/mp3/samples-per-mpeg-file.js +0 -0
- /package/dist/{boxes → containers}/riff/get-tracks-from-avi.js +0 -0
- /package/dist/{boxes → containers}/riff/is-movi.d.ts +0 -0
- /package/dist/{boxes → containers}/riff/is-movi.js +0 -0
- /package/dist/{boxes → containers}/riff/parse-avih.d.ts +0 -0
- /package/dist/{boxes → containers}/riff/parse-avih.js +0 -0
- /package/dist/{boxes → containers}/riff/parse-isft.d.ts +0 -0
- /package/dist/{boxes → containers}/riff/parse-isft.js +0 -0
- /package/dist/{boxes → containers}/riff/parse-strf.d.ts +0 -0
- /package/dist/{boxes → containers}/riff/parse-strf.js +0 -0
- /package/dist/{boxes → containers}/riff/parse-strh.d.ts +0 -0
- /package/dist/{boxes → containers}/riff/parse-strh.js +0 -0
- /package/dist/{boxes → containers}/riff/timescale.d.ts +0 -0
- /package/dist/{boxes → containers}/riff/timescale.js +0 -0
- /package/dist/{boxes → containers}/riff/traversal.js +0 -0
- /package/dist/{boxes → containers}/transport-stream/adts-header.d.ts +0 -0
- /package/dist/{boxes → containers}/transport-stream/adts-header.js +0 -0
- /package/dist/{boxes → containers}/transport-stream/boxes.d.ts +0 -0
- /package/dist/{boxes → containers}/transport-stream/discard-rest-of-packet.d.ts +0 -0
- /package/dist/{boxes → containers}/transport-stream/discard-rest-of-packet.js +0 -0
- /package/dist/{boxes → containers}/transport-stream/find-separator.d.ts +0 -0
- /package/dist/{boxes → containers}/transport-stream/find-separator.js +0 -0
- /package/dist/{boxes → containers}/transport-stream/get-tracks.d.ts +0 -0
- /package/dist/{boxes → containers}/transport-stream/get-tracks.js +0 -0
- /package/dist/{boxes → containers}/transport-stream/handle-aac-packet.d.ts +0 -0
- /package/dist/{boxes → containers}/transport-stream/handle-aac-packet.js +0 -0
- /package/dist/{boxes → containers}/transport-stream/handle-avc-packet.d.ts +0 -0
- /package/dist/{boxes → containers}/transport-stream/handle-avc-packet.js +0 -0
- /package/dist/{boxes → containers}/transport-stream/next-pes-header-store.d.ts +0 -0
- /package/dist/{boxes → containers}/transport-stream/next-pes-header-store.js +0 -0
- /package/dist/{boxes → containers}/transport-stream/parse-pat.d.ts +0 -0
- /package/dist/{boxes → containers}/transport-stream/parse-pat.js +0 -0
- /package/dist/{boxes → containers}/transport-stream/parse-pes.d.ts +0 -0
- /package/dist/{boxes → containers}/transport-stream/parse-pes.js +0 -0
- /package/dist/{boxes → containers}/transport-stream/parse-pmt.d.ts +0 -0
- /package/dist/{boxes → containers}/transport-stream/parse-pmt.js +0 -0
- /package/dist/{boxes → containers}/transport-stream/process-stream-buffers.d.ts +0 -0
- /package/dist/{boxes → containers}/transport-stream/process-stream-buffers.js +0 -0
- /package/dist/{boxes → containers}/transport-stream/traversal.d.ts +0 -0
- /package/dist/{boxes → containers}/transport-stream/traversal.js +0 -0
- /package/dist/{boxes → containers}/webm/allowed-partial-segments.d.ts +0 -0
- /package/dist/{boxes → containers}/webm/allowed-partial-segments.js +0 -0
- /package/dist/{boxes → containers}/webm/av1-codec-private.d.ts +0 -0
- /package/dist/{boxes → containers}/webm/av1-codec-private.js +0 -0
- /package/dist/{boxes → containers}/webm/color.d.ts +0 -0
- /package/dist/{boxes → containers}/webm/color.js +0 -0
- /package/dist/{boxes → containers}/webm/description.d.ts +0 -0
- /package/dist/{boxes → containers}/webm/description.js +0 -0
- /package/dist/{boxes → containers}/webm/get-ready-tracks.d.ts +0 -0
- /package/dist/{boxes → containers}/webm/get-ready-tracks.js +0 -0
- /package/dist/{boxes → containers}/webm/get-sample-from-block.d.ts +0 -0
- /package/dist/{boxes → containers}/webm/get-sample-from-block.js +0 -0
- /package/dist/{boxes → containers}/webm/make-track.d.ts +0 -0
- /package/dist/{boxes → containers}/webm/make-track.js +0 -0
- /package/dist/{boxes → containers}/webm/segments/all-segments.d.ts +0 -0
- /package/dist/{boxes → containers}/webm/segments/all-segments.js +0 -0
- /package/dist/{boxes → containers}/webm/segments/block-simple-block-flags.d.ts +0 -0
- /package/dist/{boxes → containers}/webm/segments/block-simple-block-flags.js +0 -0
- /package/dist/{boxes → containers}/webm/segments/track-entry.d.ts +0 -0
- /package/dist/{boxes → containers}/webm/segments/track-entry.js +0 -0
- /package/dist/{boxes → containers}/webm/traversal.d.ts +0 -0
- /package/dist/{boxes → containers}/webm/traversal.js +0 -0
- /package/dist/{may-skip-video-data → state}/may-skip-video-data.js +0 -0
- /package/dist/{may-skip-video-data → state}/need-samples-for-fields.d.ts +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.addAvcProfileToTrack = void 0;
|
|
4
|
-
const codec_string_1 = require("./
|
|
5
|
-
const create_sps_pps_data_1 = require("./
|
|
4
|
+
const codec_string_1 = require("./containers/avc/codec-string");
|
|
5
|
+
const create_sps_pps_data_1 = require("./containers/avc/create-sps-pps-data");
|
|
6
6
|
const addAvcProfileToTrack = (track, avc1Profile) => {
|
|
7
7
|
if (avc1Profile === null) {
|
|
8
8
|
return track;
|
|
@@ -12,7 +12,7 @@ export declare class OffsetCounter {
|
|
|
12
12
|
export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes: number | null) => {
|
|
13
13
|
startReadingBits: () => void;
|
|
14
14
|
stopReadingBits: () => void;
|
|
15
|
-
skipTo: (offset: number
|
|
15
|
+
skipTo: (offset: number) => void;
|
|
16
16
|
addData: (newData: Uint8Array) => void;
|
|
17
17
|
counter: OffsetCounter;
|
|
18
18
|
peekB: (length: number) => void;
|
|
@@ -20,7 +20,7 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
|
|
|
20
20
|
getBits: (bits: number) => number;
|
|
21
21
|
bytesRemaining: () => number;
|
|
22
22
|
leb128: () => number;
|
|
23
|
-
removeBytesRead: () =>
|
|
23
|
+
removeBytesRead: (force: boolean) => number | undefined;
|
|
24
24
|
discard: (length: number) => void;
|
|
25
25
|
getEightByteNumber: (littleEndian?: boolean) => number;
|
|
26
26
|
getFourByteNumber: () => number;
|
|
@@ -65,5 +65,6 @@ export declare const getArrayBufferIterator: (initialData: Uint8Array, maxBytes:
|
|
|
65
65
|
startCheckpoint: () => {
|
|
66
66
|
returnToCheckpoint: () => void;
|
|
67
67
|
};
|
|
68
|
+
getFlacCodecNumber: () => number;
|
|
68
69
|
};
|
|
69
70
|
export type BufferIterator = ReturnType<typeof getArrayBufferIterator>;
|
package/dist/buffer-iterator.js
CHANGED
|
@@ -14,7 +14,7 @@ var _OffsetCounter_offset, _OffsetCounter_discardedBytes;
|
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.getArrayBufferIterator = exports.OffsetCounter = void 0;
|
|
16
16
|
/* eslint-disable @typescript-eslint/no-use-before-define */
|
|
17
|
-
const all_segments_1 = require("./
|
|
17
|
+
const all_segments_1 = require("./containers/webm/segments/all-segments");
|
|
18
18
|
const file_types_1 = require("./file-types");
|
|
19
19
|
class OffsetCounter {
|
|
20
20
|
constructor(initial) {
|
|
@@ -65,9 +65,9 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
65
65
|
if (!buf.resize) {
|
|
66
66
|
throw new Error('`ArrayBuffer.resize` is not supported in this Runtime. On the server: Use at least Node.js 20 or Bun. In the browser: Chrome 111, Edge 111, Safari 16.4, Firefox 128, Opera 111');
|
|
67
67
|
}
|
|
68
|
-
let
|
|
69
|
-
|
|
70
|
-
let view = new DataView(
|
|
68
|
+
let uintArray = new Uint8Array(buf);
|
|
69
|
+
uintArray.set(initialData);
|
|
70
|
+
let view = new DataView(uintArray.buffer);
|
|
71
71
|
const counter = makeOffsetCounter();
|
|
72
72
|
const startCheckpoint = () => {
|
|
73
73
|
const checkpoint = counter.getOffset();
|
|
@@ -78,7 +78,7 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
78
78
|
};
|
|
79
79
|
};
|
|
80
80
|
const getSlice = (amount) => {
|
|
81
|
-
const value =
|
|
81
|
+
const value = uintArray.slice(counter.getDiscardedOffset(), counter.getDiscardedOffset() + amount);
|
|
82
82
|
counter.increment(amount);
|
|
83
83
|
return value;
|
|
84
84
|
};
|
|
@@ -201,47 +201,41 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
201
201
|
buf.resize(newLength);
|
|
202
202
|
const newArray = new Uint8Array(buf);
|
|
203
203
|
newArray.set(newData, oldLength);
|
|
204
|
-
|
|
205
|
-
view = new DataView(
|
|
204
|
+
uintArray = newArray;
|
|
205
|
+
view = new DataView(uintArray.buffer);
|
|
206
206
|
};
|
|
207
207
|
const bytesRemaining = () => {
|
|
208
|
-
return
|
|
208
|
+
return uintArray.byteLength - counter.getDiscardedOffset();
|
|
209
209
|
};
|
|
210
|
-
const removeBytesRead = () => {
|
|
210
|
+
const removeBytesRead = (force) => {
|
|
211
211
|
const bytesToRemove = counter.getDiscardedOffset();
|
|
212
212
|
// Only do this operation if it is really worth it 😇
|
|
213
|
-
|
|
213
|
+
// let's set the threshold to 3MB
|
|
214
|
+
if (bytesToRemove < 3000000 && !force) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
// Don't remove if the data is not even available
|
|
218
|
+
if (view.byteLength < bytesToRemove && !force) {
|
|
214
219
|
return;
|
|
215
220
|
}
|
|
216
221
|
counter.discardBytes(bytesToRemove);
|
|
217
|
-
const newData =
|
|
218
|
-
|
|
222
|
+
const newData = uintArray.slice(bytesToRemove);
|
|
223
|
+
uintArray.set(newData);
|
|
219
224
|
buf.resize(newData.byteLength);
|
|
220
|
-
view = new DataView(
|
|
225
|
+
view = new DataView(uintArray.buffer);
|
|
226
|
+
return bytesToRemove;
|
|
221
227
|
};
|
|
222
|
-
const skipTo = (offset
|
|
228
|
+
const skipTo = (offset) => {
|
|
223
229
|
const becomesSmaller = offset < counter.getOffset();
|
|
224
|
-
if (becomesSmaller) {
|
|
225
|
-
if (reset) {
|
|
226
|
-
buf.resize(0);
|
|
227
|
-
counter.decrement(counter.getOffset() - offset);
|
|
228
|
-
counter.setDiscardedOffset(offset);
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
const toDecrement = counter.getOffset() - offset;
|
|
232
|
-
const newOffset = counter.getOffset() - toDecrement;
|
|
233
|
-
counter.decrement(toDecrement);
|
|
234
|
-
const c = counter.getDiscardedBytes();
|
|
235
|
-
if (c > newOffset) {
|
|
236
|
-
throw new Error('already discarded too many bytes');
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
230
|
+
if (!becomesSmaller) {
|
|
241
231
|
const currentOffset = counter.getOffset();
|
|
242
232
|
counter.increment(offset - currentOffset);
|
|
243
|
-
removeBytesRead();
|
|
233
|
+
removeBytesRead(true);
|
|
234
|
+
return;
|
|
244
235
|
}
|
|
236
|
+
buf.resize(0);
|
|
237
|
+
counter.decrement(counter.getOffset() - offset);
|
|
238
|
+
counter.setDiscardedOffset(offset);
|
|
245
239
|
};
|
|
246
240
|
const readExpGolomb = () => {
|
|
247
241
|
if (!bitReadingMode) {
|
|
@@ -292,6 +286,37 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
292
286
|
bitReadingMode = true;
|
|
293
287
|
byteToShift = getUint8();
|
|
294
288
|
};
|
|
289
|
+
// https://www.rfc-editor.org/rfc/rfc9639.html#name-coded-number
|
|
290
|
+
const getFlacCodecNumber = () => {
|
|
291
|
+
let ones = 0;
|
|
292
|
+
let bits = 0;
|
|
293
|
+
// eslint-disable-next-line no-constant-binary-expression
|
|
294
|
+
while ((++bits || true) && getBits(1) === 1) {
|
|
295
|
+
ones++;
|
|
296
|
+
}
|
|
297
|
+
if (ones === 0) {
|
|
298
|
+
return getBits(7);
|
|
299
|
+
}
|
|
300
|
+
const bitArray = [];
|
|
301
|
+
const firstByteBits = 8 - ones - 1;
|
|
302
|
+
for (let i = 0; i < firstByteBits; i++) {
|
|
303
|
+
bitArray.unshift(getBits(1));
|
|
304
|
+
}
|
|
305
|
+
const extraBytes = ones - 1;
|
|
306
|
+
for (let i = 0; i < extraBytes; i++) {
|
|
307
|
+
for (let j = 0; j < 8; j++) {
|
|
308
|
+
const val = getBits(1);
|
|
309
|
+
if (j < 2) {
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
bitArray.unshift(val);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
const encoded = bitArray.reduce((acc, bit, index) => {
|
|
316
|
+
return acc | (bit << index);
|
|
317
|
+
}, 0);
|
|
318
|
+
return encoded;
|
|
319
|
+
};
|
|
295
320
|
const getBits = (bits) => {
|
|
296
321
|
let result = 0;
|
|
297
322
|
let bitsCollected = 0;
|
|
@@ -312,7 +337,7 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
312
337
|
return result;
|
|
313
338
|
};
|
|
314
339
|
const destroy = () => {
|
|
315
|
-
|
|
340
|
+
uintArray = new Uint8Array(0);
|
|
316
341
|
buf.resize(0);
|
|
317
342
|
};
|
|
318
343
|
return {
|
|
@@ -336,7 +361,7 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
336
361
|
return new TextDecoder().decode(atom);
|
|
337
362
|
},
|
|
338
363
|
detectFileType: () => {
|
|
339
|
-
return (0, file_types_1.detectFileType)(
|
|
364
|
+
return (0, file_types_1.detectFileType)(uintArray);
|
|
340
365
|
},
|
|
341
366
|
getPaddedFourByteNumber,
|
|
342
367
|
getMatroskaSegmentId: () => {
|
|
@@ -531,6 +556,7 @@ const getArrayBufferIterator = (initialData, maxBytes) => {
|
|
|
531
556
|
startBox,
|
|
532
557
|
readExpGolomb,
|
|
533
558
|
startCheckpoint,
|
|
559
|
+
getFlacCodecNumber,
|
|
534
560
|
};
|
|
535
561
|
};
|
|
536
562
|
exports.getArrayBufferIterator = getArrayBufferIterator;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseAac = void 0;
|
|
4
|
+
const aac_codecprivate_1 = require("../../aac-codecprivate");
|
|
5
|
+
const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
|
|
6
|
+
const register_track_1 = require("../../register-track");
|
|
7
|
+
const parseAac = async (state) => {
|
|
8
|
+
const { iterator } = state;
|
|
9
|
+
const startOffset = iterator.counter.getOffset();
|
|
10
|
+
iterator.startReadingBits();
|
|
11
|
+
const syncWord = iterator.getBits(12);
|
|
12
|
+
if (syncWord !== 0xfff) {
|
|
13
|
+
throw new Error('Invalid syncword: ' + syncWord);
|
|
14
|
+
}
|
|
15
|
+
const id = iterator.getBits(1);
|
|
16
|
+
if (id !== 0) {
|
|
17
|
+
throw new Error('Only supporting MPEG-4 for .aac');
|
|
18
|
+
}
|
|
19
|
+
const layer = iterator.getBits(2);
|
|
20
|
+
if (layer !== 0) {
|
|
21
|
+
throw new Error('Only supporting layer 0 for .aac');
|
|
22
|
+
}
|
|
23
|
+
const protectionAbsent = iterator.getBits(1); // protection absent
|
|
24
|
+
const audioObjectType = iterator.getBits(2); // 1 = 'AAC-LC'
|
|
25
|
+
const samplingFrequencyIndex = iterator.getBits(4);
|
|
26
|
+
const sampleRate = (0, aac_codecprivate_1.getSampleRateFromSampleFrequencyIndex)(samplingFrequencyIndex);
|
|
27
|
+
iterator.getBits(1); // private bit
|
|
28
|
+
const channelConfiguration = iterator.getBits(3);
|
|
29
|
+
const codecPrivate = (0, aac_codecprivate_1.createAacCodecPrivate)({
|
|
30
|
+
audioObjectType,
|
|
31
|
+
sampleRate,
|
|
32
|
+
channelConfiguration,
|
|
33
|
+
});
|
|
34
|
+
iterator.getBits(1); // originality
|
|
35
|
+
iterator.getBits(1); // home
|
|
36
|
+
iterator.getBits(1); // copyright bit
|
|
37
|
+
iterator.getBits(1); // copy start
|
|
38
|
+
const frameLength = iterator.getBits(13); // frame length
|
|
39
|
+
iterator.getBits(11); // buffer fullness
|
|
40
|
+
iterator.getBits(2); // number of AAC frames minus 1
|
|
41
|
+
if (!protectionAbsent) {
|
|
42
|
+
iterator.getBits(16); // crc
|
|
43
|
+
}
|
|
44
|
+
iterator.stopReadingBits();
|
|
45
|
+
iterator.counter.decrement(iterator.counter.getOffset() - startOffset);
|
|
46
|
+
const data = iterator.getSlice(frameLength);
|
|
47
|
+
if (state.callbacks.tracks.getTracks().length === 0) {
|
|
48
|
+
await (0, register_track_1.registerTrack)({
|
|
49
|
+
state,
|
|
50
|
+
container: 'aac',
|
|
51
|
+
track: {
|
|
52
|
+
codec: (0, aac_codecprivate_1.mapAudioObjectTypeToCodecString)(audioObjectType),
|
|
53
|
+
codecWithoutConfig: 'aac',
|
|
54
|
+
codecPrivate,
|
|
55
|
+
description: codecPrivate,
|
|
56
|
+
numberOfChannels: channelConfiguration,
|
|
57
|
+
sampleRate,
|
|
58
|
+
timescale: 1000000,
|
|
59
|
+
trackId: 0,
|
|
60
|
+
trakBox: null,
|
|
61
|
+
type: 'audio',
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
state.callbacks.tracks.setIsDone();
|
|
65
|
+
}
|
|
66
|
+
const duration = 1024 / sampleRate;
|
|
67
|
+
const { index } = state.aac.addSample({ offset: startOffset, size: frameLength });
|
|
68
|
+
const timestamp = (1024 / sampleRate) * index;
|
|
69
|
+
// One ADTS frame contains 1024 samples
|
|
70
|
+
await state.callbacks.onAudioSample(0, (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
|
|
71
|
+
duration,
|
|
72
|
+
type: 'key',
|
|
73
|
+
data,
|
|
74
|
+
offset: startOffset,
|
|
75
|
+
timescale: 1000000,
|
|
76
|
+
trackId: 0,
|
|
77
|
+
cts: timestamp,
|
|
78
|
+
dts: timestamp,
|
|
79
|
+
timestamp,
|
|
80
|
+
}, 1));
|
|
81
|
+
return Promise.resolve({ skipTo: null });
|
|
82
|
+
};
|
|
83
|
+
exports.parseAac = parseAac;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { AvcInfo } from './parse-avc';
|
|
2
|
-
export declare const getKeyFrameOrDeltaFromAvcInfo: (infos: AvcInfo[]) => "
|
|
2
|
+
export declare const getKeyFrameOrDeltaFromAvcInfo: (infos: AvcInfo[]) => "key" | "delta";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getBlockSize = void 0;
|
|
4
|
+
const getBlockSize = (iterator) => {
|
|
5
|
+
const bits = iterator.getBits(4);
|
|
6
|
+
if (bits === 0b0000) {
|
|
7
|
+
throw new Error('Reserved block size');
|
|
8
|
+
}
|
|
9
|
+
if (bits === 0b0001) {
|
|
10
|
+
return 192;
|
|
11
|
+
}
|
|
12
|
+
if (bits >= 0b0010 && bits <= 0b0101) {
|
|
13
|
+
return 144 * 2 ** bits;
|
|
14
|
+
}
|
|
15
|
+
if (bits === 0b0110) {
|
|
16
|
+
return 'uncommon-u8';
|
|
17
|
+
}
|
|
18
|
+
if (bits === 0b0111) {
|
|
19
|
+
return 'uncommon-u16';
|
|
20
|
+
}
|
|
21
|
+
if (bits >= 0b1000 && bits <= 0b1111) {
|
|
22
|
+
return 2 ** bits;
|
|
23
|
+
}
|
|
24
|
+
throw new Error('Invalid block size');
|
|
25
|
+
};
|
|
26
|
+
exports.getBlockSize = getBlockSize;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getChannelCount = void 0;
|
|
4
|
+
// https://www.rfc-editor.org/rfc/rfc9639.html#name-channels-bits
|
|
5
|
+
const getChannelCount = (iterator) => {
|
|
6
|
+
const bits = iterator.getBits(4);
|
|
7
|
+
if (bits === 0b0000) {
|
|
8
|
+
return 1;
|
|
9
|
+
}
|
|
10
|
+
if (bits === 0b0001) {
|
|
11
|
+
return 2;
|
|
12
|
+
}
|
|
13
|
+
if (bits === 0b0010) {
|
|
14
|
+
return 3;
|
|
15
|
+
}
|
|
16
|
+
if (bits === 0b0011) {
|
|
17
|
+
return 4;
|
|
18
|
+
}
|
|
19
|
+
if (bits === 0b0100) {
|
|
20
|
+
return 5;
|
|
21
|
+
}
|
|
22
|
+
if (bits === 0b0101) {
|
|
23
|
+
return 6;
|
|
24
|
+
}
|
|
25
|
+
if (bits === 0b0110) {
|
|
26
|
+
return 7;
|
|
27
|
+
}
|
|
28
|
+
if (bits === 0b0111) {
|
|
29
|
+
return 8;
|
|
30
|
+
}
|
|
31
|
+
if (bits === 0b1000 || bits === 0b1001 || bits === 0b1010) {
|
|
32
|
+
return 2;
|
|
33
|
+
}
|
|
34
|
+
throw new Error(`Invalid channel count: ${bits.toString(2)}`);
|
|
35
|
+
};
|
|
36
|
+
exports.getChannelCount = getChannelCount;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDurationFromFlac = void 0;
|
|
4
|
+
const getDurationFromFlac = (parserState) => {
|
|
5
|
+
const structure = parserState.structure.getStructure();
|
|
6
|
+
if (structure.type !== 'flac') {
|
|
7
|
+
throw new Error('Not a FLAC file');
|
|
8
|
+
}
|
|
9
|
+
const streaminfo = structure.boxes.find((b) => b.type === 'flac-streaminfo');
|
|
10
|
+
if (!streaminfo) {
|
|
11
|
+
throw new Error('Streaminfo not found');
|
|
12
|
+
}
|
|
13
|
+
return streaminfo.totalSamples / streaminfo.sampleRate;
|
|
14
|
+
};
|
|
15
|
+
exports.getDurationFromFlac = getDurationFromFlac;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMetadataFromFlac = void 0;
|
|
4
|
+
const getMetadataFromFlac = (structure) => {
|
|
5
|
+
const box = structure.boxes.find((b) => b.type === 'flac-vorbis-comment');
|
|
6
|
+
if (!box) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
return box.fields;
|
|
10
|
+
};
|
|
11
|
+
exports.getMetadataFromFlac = getMetadataFromFlac;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSampleRate = void 0;
|
|
4
|
+
// https://www.rfc-editor.org/rfc/rfc9639.html#name-sample-rate-bits
|
|
5
|
+
const getSampleRate = (iterator, state) => {
|
|
6
|
+
var _a, _b;
|
|
7
|
+
const mode = iterator.getBits(4);
|
|
8
|
+
if (mode === 0b0000) {
|
|
9
|
+
const structure = state.structure.getStructure();
|
|
10
|
+
const sampleRate = (_b = (_a = structure.boxes.find((box) => box.type === 'flac-streaminfo')) === null || _a === void 0 ? void 0 : _a.sampleRate) !== null && _b !== void 0 ? _b : null;
|
|
11
|
+
if (sampleRate === null) {
|
|
12
|
+
throw new Error('Sample rate not found');
|
|
13
|
+
}
|
|
14
|
+
return sampleRate;
|
|
15
|
+
}
|
|
16
|
+
if (mode === 0b0001) {
|
|
17
|
+
return 88200;
|
|
18
|
+
}
|
|
19
|
+
if (mode === 0b0010) {
|
|
20
|
+
return 176400;
|
|
21
|
+
}
|
|
22
|
+
if (mode === 0b0011) {
|
|
23
|
+
return 192000;
|
|
24
|
+
}
|
|
25
|
+
if (mode === 0b0100) {
|
|
26
|
+
return 8000;
|
|
27
|
+
}
|
|
28
|
+
if (mode === 0b0101) {
|
|
29
|
+
return 16000;
|
|
30
|
+
}
|
|
31
|
+
if (mode === 0b0110) {
|
|
32
|
+
return 22050;
|
|
33
|
+
}
|
|
34
|
+
if (mode === 0b0111) {
|
|
35
|
+
return 24000;
|
|
36
|
+
}
|
|
37
|
+
if (mode === 0b1000) {
|
|
38
|
+
return 32000;
|
|
39
|
+
}
|
|
40
|
+
if (mode === 0b1001) {
|
|
41
|
+
return 44100;
|
|
42
|
+
}
|
|
43
|
+
if (mode === 0b1010) {
|
|
44
|
+
return 48000;
|
|
45
|
+
}
|
|
46
|
+
if (mode === 0b1011) {
|
|
47
|
+
return 96000;
|
|
48
|
+
}
|
|
49
|
+
if (mode === 0b1100) {
|
|
50
|
+
return 'uncommon-u8';
|
|
51
|
+
}
|
|
52
|
+
if (mode === 0b1101) {
|
|
53
|
+
return 'uncommon-u16';
|
|
54
|
+
}
|
|
55
|
+
if (mode === 0b1110) {
|
|
56
|
+
return 'uncommon-u16-10';
|
|
57
|
+
}
|
|
58
|
+
throw new Error(`Invalid sample rate mode: ${mode.toString(2)}`);
|
|
59
|
+
};
|
|
60
|
+
exports.getSampleRate = getSampleRate;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type BufferIterator } from '../../buffer-iterator';
|
|
2
|
+
import type { ParseResult } from '../../parse-result';
|
|
3
|
+
import type { ParserState } from '../../state/parser-state';
|
|
4
|
+
export declare const parseFrameHeader: ({ iterator, state, }: {
|
|
5
|
+
iterator: BufferIterator;
|
|
6
|
+
state: ParserState;
|
|
7
|
+
}) => {
|
|
8
|
+
num: number;
|
|
9
|
+
blockSize: number;
|
|
10
|
+
sampleRate: number;
|
|
11
|
+
} | null;
|
|
12
|
+
export declare const parseFlacFrame: ({ state, iterator, }: {
|
|
13
|
+
state: ParserState;
|
|
14
|
+
iterator: BufferIterator;
|
|
15
|
+
}) => Promise<ParseResult>;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseFlacFrame = exports.parseFrameHeader = void 0;
|
|
4
|
+
const buffer_iterator_1 = require("../../buffer-iterator");
|
|
5
|
+
const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
|
|
6
|
+
const get_block_size_1 = require("./get-block-size");
|
|
7
|
+
const get_channel_count_1 = require("./get-channel-count");
|
|
8
|
+
const get_sample_rate_1 = require("./get-sample-rate");
|
|
9
|
+
// https://www.rfc-editor.org/rfc/rfc9639.html#section-9.1.1
|
|
10
|
+
function calculateCRC8(data) {
|
|
11
|
+
const polynomial = 0x07; // x^8 + x^2 + x^1 + x^0
|
|
12
|
+
let crc = 0x00; // Initialize CRC to 0
|
|
13
|
+
for (const byte of data) {
|
|
14
|
+
crc ^= byte; // XOR byte into least significant byte of crc
|
|
15
|
+
for (let i = 0; i < 8; i++) {
|
|
16
|
+
// For each bit in the byte
|
|
17
|
+
if ((crc & 0x80) !== 0) {
|
|
18
|
+
// If the leftmost bit (MSB) is set
|
|
19
|
+
crc = (crc << 1) ^ polynomial; // Shift left and XOR with polynomial
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
crc <<= 1; // Just shift left
|
|
23
|
+
}
|
|
24
|
+
crc &= 0xff; // Ensure CRC remains 8-bit
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return crc;
|
|
28
|
+
}
|
|
29
|
+
const parseFrameHeader = ({ iterator, state, }) => {
|
|
30
|
+
if (iterator.bytesRemaining() < 10) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
const startOffset = iterator.counter.getOffset();
|
|
34
|
+
iterator.discard(2); // sync code
|
|
35
|
+
iterator.startReadingBits();
|
|
36
|
+
const blockSizeBits = (0, get_block_size_1.getBlockSize)(iterator);
|
|
37
|
+
const sampleRateBits = (0, get_sample_rate_1.getSampleRate)(iterator, state);
|
|
38
|
+
(0, get_channel_count_1.getChannelCount)(iterator); // channel count
|
|
39
|
+
iterator.getBits(3); // bit depth
|
|
40
|
+
iterator.getBits(1);
|
|
41
|
+
const num = iterator.getFlacCodecNumber();
|
|
42
|
+
const blockSize = blockSizeBits === 'uncommon-u16'
|
|
43
|
+
? iterator.getBits(16) + 1
|
|
44
|
+
: blockSizeBits === 'uncommon-u8'
|
|
45
|
+
? iterator.getBits(8) + 1
|
|
46
|
+
: blockSizeBits;
|
|
47
|
+
const sampleRate = sampleRateBits === 'uncommon-u16'
|
|
48
|
+
? iterator.getBits(16)
|
|
49
|
+
: sampleRateBits === 'uncommon-u16-10'
|
|
50
|
+
? iterator.getBits(16) * 10
|
|
51
|
+
: sampleRateBits === 'uncommon-u8'
|
|
52
|
+
? iterator.getBits(8)
|
|
53
|
+
: sampleRateBits;
|
|
54
|
+
iterator.stopReadingBits();
|
|
55
|
+
const size = iterator.counter.getOffset() - startOffset;
|
|
56
|
+
const crc = iterator.getUint8();
|
|
57
|
+
iterator.counter.decrement(size + 1);
|
|
58
|
+
const crcCalculated = calculateCRC8(iterator.getSlice(size));
|
|
59
|
+
iterator.counter.decrement(size);
|
|
60
|
+
if (crcCalculated !== crc) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
return { num, blockSize, sampleRate };
|
|
64
|
+
};
|
|
65
|
+
exports.parseFrameHeader = parseFrameHeader;
|
|
66
|
+
const emitSample = async ({ state, data, offset, }) => {
|
|
67
|
+
const iterator = (0, buffer_iterator_1.getArrayBufferIterator)(data, null);
|
|
68
|
+
const parsed = (0, exports.parseFrameHeader)({ iterator, state });
|
|
69
|
+
if (!parsed) {
|
|
70
|
+
throw new Error('Invalid CRC');
|
|
71
|
+
}
|
|
72
|
+
const { blockSize, num, sampleRate } = parsed;
|
|
73
|
+
const duration = blockSize / sampleRate;
|
|
74
|
+
const structure = state.structure.getStructure();
|
|
75
|
+
const streamInfo = structure.boxes.find((box) => box.type === 'flac-streaminfo');
|
|
76
|
+
if (!streamInfo) {
|
|
77
|
+
throw new Error('Stream info not found');
|
|
78
|
+
}
|
|
79
|
+
if (streamInfo.minimumBlockSize !== streamInfo.maximumBlockSize) {
|
|
80
|
+
throw new Error('Cannot determine timestamp');
|
|
81
|
+
}
|
|
82
|
+
const timestamp = (num * streamInfo.maximumBlockSize) / streamInfo.sampleRate;
|
|
83
|
+
await state.callbacks.onAudioSample(0, (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
|
|
84
|
+
data,
|
|
85
|
+
duration,
|
|
86
|
+
cts: timestamp,
|
|
87
|
+
dts: timestamp,
|
|
88
|
+
timestamp,
|
|
89
|
+
type: 'key',
|
|
90
|
+
offset,
|
|
91
|
+
timescale: 1000000,
|
|
92
|
+
trackId: 0,
|
|
93
|
+
}, 1));
|
|
94
|
+
iterator.destroy();
|
|
95
|
+
};
|
|
96
|
+
const parseFlacFrame = async ({ state, iterator, }) => {
|
|
97
|
+
var _a, _b;
|
|
98
|
+
const blockingBit = state.flac.getBlockingBitStrategy();
|
|
99
|
+
const offset = iterator.counter.getOffset();
|
|
100
|
+
const { returnToCheckpoint } = iterator.startCheckpoint();
|
|
101
|
+
iterator.startReadingBits();
|
|
102
|
+
if (blockingBit === undefined) {
|
|
103
|
+
const bits = iterator.getBits(15);
|
|
104
|
+
if (bits !== 0b111111111111100) {
|
|
105
|
+
throw new Error('Invalid sync code');
|
|
106
|
+
}
|
|
107
|
+
state.flac.setBlockingBitStrategy(iterator.getBits(1));
|
|
108
|
+
}
|
|
109
|
+
else if (blockingBit === 1) {
|
|
110
|
+
const bits = iterator.getBits(16);
|
|
111
|
+
if (bits !== 0b1111111111111001) {
|
|
112
|
+
throw new Error('Blocking bit changed, it should not');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else if (blockingBit === 0) {
|
|
116
|
+
const bits = iterator.getBits(16);
|
|
117
|
+
if (bits !== 0b1111111111111000) {
|
|
118
|
+
throw new Error('Blocking bit changed, it should not');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const setBlockingBit = state.flac.getBlockingBitStrategy();
|
|
122
|
+
if (setBlockingBit === undefined) {
|
|
123
|
+
throw new Error('Blocking bit should be set');
|
|
124
|
+
}
|
|
125
|
+
iterator.stopReadingBits();
|
|
126
|
+
const structure = state.structure.getStructure();
|
|
127
|
+
if (structure.type !== 'flac') {
|
|
128
|
+
throw new Error('Expected flac-structure');
|
|
129
|
+
}
|
|
130
|
+
const minimumFrameSize = (_b = (_a = structure.boxes.find((b) => b.type === 'flac-streaminfo')) === null || _a === void 0 ? void 0 : _a.minimumFrameSize) !== null && _b !== void 0 ? _b : null;
|
|
131
|
+
if (minimumFrameSize === null) {
|
|
132
|
+
throw new Error('Expected flac-streaminfo');
|
|
133
|
+
}
|
|
134
|
+
if (minimumFrameSize !== 0) {
|
|
135
|
+
iterator.getSlice(minimumFrameSize - 2);
|
|
136
|
+
}
|
|
137
|
+
while (true) {
|
|
138
|
+
if (!state.contentLength) {
|
|
139
|
+
throw new Error('Need content-length for FLAC to parse');
|
|
140
|
+
}
|
|
141
|
+
if (iterator.counter.getOffset() === state.contentLength) {
|
|
142
|
+
const size = iterator.counter.getOffset() - offset;
|
|
143
|
+
returnToCheckpoint();
|
|
144
|
+
const slice = iterator.getSlice(size);
|
|
145
|
+
await emitSample({ state, data: slice, offset });
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
if (iterator.bytesRemaining() === 0) {
|
|
149
|
+
returnToCheckpoint();
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
const nextByte = iterator.getUint8();
|
|
153
|
+
if (nextByte === 0xff) {
|
|
154
|
+
const nextBits = iterator.getUint8();
|
|
155
|
+
const expected = setBlockingBit === 1 ? 249 : 248;
|
|
156
|
+
if (nextBits !== expected) {
|
|
157
|
+
iterator.counter.decrement(1);
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
iterator.counter.decrement(2);
|
|
161
|
+
const nextIsLegit = (0, exports.parseFrameHeader)({ iterator, state });
|
|
162
|
+
if (!nextIsLegit) {
|
|
163
|
+
iterator.discard(1);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
const size = iterator.counter.getOffset() - offset;
|
|
167
|
+
returnToCheckpoint();
|
|
168
|
+
const data = iterator.getSlice(size);
|
|
169
|
+
await emitSample({ state, data, offset });
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return { skipTo: null };
|
|
174
|
+
};
|
|
175
|
+
exports.parseFlacFrame = parseFlacFrame;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { BufferIterator } from '../../buffer-iterator';
|
|
2
2
|
import type { ParseResult } from '../../parse-result';
|
|
3
3
|
import type { ParserState } from '../../state/parser-state';
|
|
4
|
-
export declare const
|
|
4
|
+
export declare const parseFlac: ({ iterator, state, }: {
|
|
5
5
|
iterator: BufferIterator;
|
|
6
6
|
state: ParserState;
|
|
7
7
|
}) => Promise<ParseResult>;
|