UNPKG

@remotion/media-parser

Version:

A pure JavaScript library for parsing video files

72 lines (71 loc) 3.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.cachedSamplePositionsState = exports.calculateFlatSamples = void 0; const are_samples_complete_1 = require("../../containers/iso-base-media/are-samples-complete"); const get_sample_positions_from_track_1 = require("../../containers/iso-base-media/get-sample-positions-from-track"); const traversal_1 = require("../../containers/iso-base-media/traversal"); const get_tracks_1 = require("../../get-tracks"); const precomputed_tfra_1 = require("./precomputed-tfra"); const calculateFlatSamples = ({ state, mediaSectionStart, }) => { var _a, _b; const tracks = (0, get_tracks_1.getTracks)(state, true); const moofBoxes = (0, traversal_1.getMoofBoxes)(state.structure.getIsoStructure().boxes); const tfraBoxes = (0, precomputed_tfra_1.deduplicateTfraBoxesByOffset)([ ...state.iso.tfra.getTfraBoxes(), ...(0, traversal_1.getTfraBoxes)(state.structure.getIsoStructure().boxes), ]); const moofComplete = (0, are_samples_complete_1.areSamplesComplete)({ moofBoxes, tfraBoxes }); const relevantMoofBox = moofBoxes.find((moofBox) => moofBox.offset + moofBox.size + 8 === mediaSectionStart); if (moofBoxes.length > 0 && !relevantMoofBox) { throw new Error('No relevant moof box found'); } const moov = (0, traversal_1.getMoovBoxFromState)({ structureState: state.structure, isoState: state.iso, mp4HeaderSegment: (_b = (_a = state.m3uPlaylistContext) === null || _a === void 0 ? void 0 : _a.mp4HeaderSegment) !== null && _b !== void 0 ? _b : null, mayUsePrecomputed: true, }); if (!moov) { throw new Error('No moov box found'); } const flatSamples = tracks.map((track) => { const trakBox = (0, traversal_1.getTrakBoxByTrackId)(moov, track.trackId); if (!trakBox) { throw new Error('No trak box found'); } const { samplePositions } = (0, get_sample_positions_from_track_1.getSamplePositionsFromTrack)({ trakBox, moofBoxes: relevantMoofBox ? [relevantMoofBox] : [], moofComplete, trexBoxes: (0, traversal_1.getTrexBoxes)(moov), }); return samplePositions.map((samplePosition) => { return { track, samplePosition, }; }); }); return flatSamples; }; exports.calculateFlatSamples = calculateFlatSamples; const cachedSamplePositionsState = () => { const cachedForMdatStart = {}; const jumpMarksForMdatStart = {}; return { getSamples: (mdatStart) => { var _a; return (_a = cachedForMdatStart[mdatStart]) !== null && _a !== void 0 ? _a : null; }, setSamples: (mdatStart, samples) => { cachedForMdatStart[mdatStart] = samples; }, setJumpMarks: (mdatStart, marks) => { jumpMarksForMdatStart[mdatStart] = marks; }, getJumpMarks: (mdatStart) => { return jumpMarksForMdatStart[mdatStart]; }, }; }; exports.cachedSamplePositionsState = cachedSamplePositionsState;