@remotion/media-parser
Version:
A pure JavaScript library for parsing video files
75 lines (74 loc) • 3.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.performSeek = void 0;
const log_1 = require("./log");
const seek_backwards_1 = require("./seek-backwards");
const seek_forwards_1 = require("./seek-forwards");
const video_section_1 = require("./state/video-section");
const performSeek = async ({ seekTo, userInitiated, controller, mediaSection, iterator, seekInfiniteLoop, logLevel, mode, contentLength, currentReader, readerInterface, src, discardReadBytes, fields, prefetchCache, }) => {
const byteInMediaSection = (0, video_section_1.isByteInMediaSection)({
position: seekTo,
mediaSections: mediaSection.getMediaSections(),
});
if (byteInMediaSection !== 'in-section' && userInitiated) {
const sections = mediaSection.getMediaSections();
const sectionStrings = sections.map((section) => {
return `start: ${section.start}, end: ${section.size + section.start}`;
});
throw new Error(`Cannot seek to a byte that is not in the video section. Seeking to: ${seekTo}, sections: ${sectionStrings.join(' | ')}`);
}
seekInfiniteLoop.registerSeek(seekTo);
if (seekTo <= iterator.counter.getOffset() && mode === 'download') {
throw new Error(`Seeking backwards is not supported in parseAndDownloadMedia() mode. Current position: ${iterator.counter.getOffset()}, seekTo: ${seekTo}`);
}
if (seekTo > contentLength) {
throw new Error(`Cannot seek beyond the end of the file: ${seekTo} > ${contentLength}`);
}
if (mode === 'download') {
log_1.Log.verbose(logLevel, `Skipping over video data from position ${iterator.counter.getOffset()} -> ${seekTo}. Fetching but not reading all the data inbetween because in download mode`);
iterator.discard(seekTo - iterator.counter.getOffset());
return;
}
await controller._internals.checkForAbortAndPause();
const alreadyAtByte = iterator.counter.getOffset() === seekTo;
if (alreadyAtByte) {
log_1.Log.verbose(logLevel, `Already at the desired position, seeking done`);
controller._internals.performedSeeksSignal.markLastSeekAsUserInitiated();
return;
}
const skippingForward = seekTo > iterator.counter.getOffset();
controller._internals.performedSeeksSignal.recordSeek({
from: iterator.counter.getOffset(),
to: seekTo,
type: userInitiated ? 'user-initiated' : 'internal',
});
if (skippingForward) {
await (0, seek_forwards_1.seekForward)({
seekTo,
userInitiated,
iterator,
fields,
logLevel,
currentReader,
readerInterface,
src,
controller,
discardReadBytes,
prefetchCache,
});
}
else {
await (0, seek_backwards_1.seekBackwards)({
controller,
seekTo,
iterator,
logLevel,
currentReader,
readerInterface,
src,
prefetchCache,
});
}
await controller._internals.checkForAbortAndPause();
};
exports.performSeek = performSeek;