@remotion/renderer 3.0.21 → 3.0.24
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/abort.d.ts +7 -0
- package/dist/abort.js +20 -0
- package/dist/assets/calculate-asset-positions.d.ts +2 -2
- package/dist/assets/convert-assets-to-file-urls.d.ts +2 -2
- package/dist/assets/download-and-map-assets-to-file.d.ts +1 -1
- package/dist/assets/ffmpeg-volume-expression.d.ts +1 -1
- package/dist/assets/flatten-volume-array.d.ts +1 -1
- package/dist/assets/get-audio-channels.d.ts +1 -1
- package/dist/assets/types.d.ts +1 -1
- package/dist/browser/Browser.d.ts +5 -159
- package/dist/browser/Browser.js +5 -190
- package/dist/browser/BrowserConnector.d.ts +1 -8
- package/dist/browser/BrowserConnector.js +0 -32
- package/dist/browser/BrowserFetcher.d.ts +1 -1
- package/dist/browser/BrowserFetcher.js +8 -10
- package/dist/browser/BrowserRunner.d.ts +2 -2
- package/dist/browser/BrowserRunner.js +1 -1
- package/dist/browser/Connection.d.ts +4 -11
- package/dist/browser/Connection.js +5 -25
- package/dist/browser/ConsoleMessage.d.ts +4 -28
- package/dist/browser/ConsoleMessage.js +5 -32
- package/dist/browser/DOMWorld.d.ts +5 -6
- package/dist/browser/DOMWorld.js +2 -18
- package/dist/browser/EvalTypes.d.ts +1 -1
- package/dist/browser/EventEmitter.d.ts +1 -48
- package/dist/browser/EventEmitter.js +0 -49
- package/dist/browser/ExecutionContext.d.ts +7 -8
- package/dist/browser/ExecutionContext.js +0 -16
- package/dist/browser/FrameManager.d.ts +10 -14
- package/dist/browser/FrameManager.js +3 -19
- package/dist/browser/HTTPRequest.d.ts +4 -18
- package/dist/browser/HTTPRequest.js +3 -48
- package/dist/browser/HTTPResponse.d.ts +2 -81
- package/dist/browser/HTTPResponse.js +3 -173
- package/dist/browser/JSHandle.d.ts +4 -5
- package/dist/browser/JSHandle.js +0 -3
- package/dist/browser/LaunchOptions.d.ts +2 -81
- package/dist/browser/Launcher.d.ts +2 -2
- package/dist/browser/Launcher.js +21 -119
- package/dist/browser/LifecycleWatcher.d.ts +4 -4
- package/dist/browser/LifecycleWatcher.js +4 -17
- package/dist/browser/NetworkEventManager.d.ts +2 -4
- package/dist/browser/NetworkEventManager.js +0 -47
- package/dist/browser/NetworkManager.d.ts +1 -3
- package/dist/browser/NetworkManager.js +6 -42
- package/dist/browser/NodeWebSocketTransport.d.ts +8 -2
- package/dist/browser/NodeWebSocketTransport.js +1 -1
- package/dist/browser/{page.d.ts → Page.d.ts} +7 -13
- package/dist/browser/{page.js → Page.js} +14 -9
- package/dist/browser/PuppeteerNode.d.ts +7 -59
- package/dist/browser/PuppeteerNode.js +4 -66
- package/dist/browser/Target.d.ts +4 -4
- package/dist/browser/assert.d.ts +0 -20
- package/dist/browser/assert.js +0 -20
- package/dist/browser/create-browser-fetcher.d.ts +1 -1
- package/dist/browser/create-browser-fetcher.js +4 -25
- package/dist/browser/util.d.ts +3 -3
- package/dist/browser/util.js +1 -1
- package/dist/browser-log.d.ts +1 -1
- package/dist/calculate-ffmpeg-filters.d.ts +1 -1
- package/dist/can-use-parallel-encoding.d.ts +1 -1
- package/dist/cancel.d.ts +7 -0
- package/dist/cancel.js +25 -0
- package/dist/combine-videos.d.ts +1 -1
- package/dist/convert-to-pcm.d.ts +1 -1
- package/dist/create-silent-audio.d.ts +1 -1
- package/dist/cycle-browser-tabs.d.ts +1 -1
- package/dist/delay-render-embedded-stack.d.ts +1 -1
- package/dist/ensure-faststart.d.ts +1 -0
- package/dist/ensure-faststart.js +14 -0
- package/dist/ensure-presentation-timestamp.d.ts +1 -1
- package/dist/ensure-presentation-timestamp.js +1 -1
- package/dist/error-handling/handle-javascript-exception.d.ts +2 -2
- package/dist/error-handling/handle-javascript-exception.js +2 -2
- package/dist/error-handling/symbolicate-error.d.ts +1 -1
- package/dist/error-handling/symbolicateable-error.d.ts +1 -1
- package/dist/extract-frame-from-video.d.ts +7 -2
- package/dist/extract-frame-from-video.js +62 -11
- package/dist/faststart/atom.d.ts +35 -0
- package/dist/faststart/atom.js +138 -0
- package/dist/faststart/index.d.ts +0 -0
- package/dist/faststart/index.js +1 -0
- package/dist/faststart/options.d.ts +6 -0
- package/dist/faststart/options.js +2 -0
- package/dist/faststart/qt-faststart.d.ts +18 -0
- package/dist/faststart/qt-faststart.js +66 -0
- package/dist/faststart/update-chunk-offsets.d.ts +10 -0
- package/dist/faststart/update-chunk-offsets.js +114 -0
- package/dist/faststart/util.d.ts +9 -0
- package/dist/faststart/util.js +34 -0
- package/dist/get-audio-codec-name.d.ts +1 -1
- package/dist/get-browser-instance.d.ts +4 -3
- package/dist/get-codec-name.d.ts +1 -1
- package/dist/get-compositions.d.ts +4 -4
- package/dist/get-compositions.js +2 -2
- package/dist/get-duration-from-frame-range.d.ts +1 -1
- package/dist/get-extension-from-codec.d.ts +1 -1
- package/dist/get-frame-to-render.d.ts +1 -1
- package/dist/get-local-browser-executable.d.ts +1 -1
- package/dist/get-local-browser-executable.js +7 -5
- package/dist/get-prores-profile-name.d.ts +1 -1
- package/dist/get-video-info.d.ts +8 -0
- package/dist/get-video-info.js +45 -0
- package/dist/image-format.d.ts +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/is-vp9-video.d.ts +3 -0
- package/dist/is-vp9-video.js +24 -0
- package/dist/last-frame-from-video-cache.d.ts +5 -1
- package/dist/last-frame-from-video-cache.js +6 -1
- package/dist/merge-audio-track.d.ts +1 -1
- package/dist/offthread/index.d.ts +0 -0
- package/dist/offthread/index.js +1 -0
- package/dist/offthread-video-server.d.ts +4 -3
- package/dist/offthread-video-server.js +14 -3
- package/dist/open-browser.d.ts +5 -3
- package/dist/open-browser.js +8 -8
- package/dist/prepare-server.d.ts +2 -2
- package/dist/preprocess-audio-track.d.ts +2 -2
- package/dist/prespawn-ffmpeg.d.ts +2 -2
- package/dist/provide-screenshot.d.ts +4 -4
- package/dist/provide-screenshot.js +0 -1
- package/dist/puppeteer-evaluate.d.ts +1 -1
- package/dist/puppeteer-evaluate.js +3 -4
- package/dist/puppeteer-screenshot.d.ts +3 -2
- package/dist/puppeteer-screenshot.js +2 -4
- package/dist/render-frames.d.ts +9 -9
- package/dist/render-frames.js +18 -10
- package/dist/render-gif.d.ts +2 -0
- package/dist/render-gif.js +242 -0
- package/dist/render-media.d.ts +8 -8
- package/dist/render-still.d.ts +6 -6
- package/dist/screenshot-dom-element.d.ts +6 -7
- package/dist/screenshot-dom-element.js +3 -6
- package/dist/screenshot-task.d.ts +3 -2
- package/dist/screenshot-task.js +3 -5
- package/dist/seek-to-frame.d.ts +2 -2
- package/dist/serve-handler/index.d.ts +1 -1
- package/dist/serve-handler/index.js +0 -1
- package/dist/serve-static.d.ts +2 -2
- package/dist/set-props-and-env.d.ts +1 -1
- package/dist/set-props-and-env.js +3 -0
- package/dist/should-use-vp9-decoder.d.ts +0 -0
- package/dist/should-use-vp9-decoder.js +1 -0
- package/dist/stitch-frames-to-gif.d.ts +8 -0
- package/dist/stitch-frames-to-gif.js +128 -0
- package/dist/stitch-frames-to-video.d.ts +3 -3
- package/dist/stringify-ffmpeg-filter.d.ts +2 -2
- package/dist/stringify-ffmpeg-filter.js +3 -0
- package/dist/symbolicate-stacktrace.d.ts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/validate-even-dimensions-with-codec.d.ts +1 -1
- package/dist/validate-offthreadvideo-image-format.d.ts +1 -0
- package/dist/validate-offthreadvideo-image-format.js +15 -0
- package/dist/validate-output-filename.d.ts +1 -1
- package/package.json +10 -6
- package/dist/assets/calculate-asset-positions.d.ts.map +0 -1
- package/dist/assets/calculate-asset-positions.js.map +0 -1
- package/dist/assets/calculate-atempo.d.ts.map +0 -1
- package/dist/assets/calculate-atempo.js.map +0 -1
- package/dist/assets/convert-assets-to-file-urls.d.ts.map +0 -1
- package/dist/assets/convert-assets-to-file-urls.js.map +0 -1
- package/dist/assets/download-and-map-assets-to-file.d.ts.map +0 -1
- package/dist/assets/download-and-map-assets-to-file.js.map +0 -1
- package/dist/assets/download-file.d.ts.map +0 -1
- package/dist/assets/download-file.js.map +0 -1
- package/dist/assets/ffmpeg-volume-expression.d.ts.map +0 -1
- package/dist/assets/ffmpeg-volume-expression.js.map +0 -1
- package/dist/assets/flatten-volume-array.d.ts.map +0 -1
- package/dist/assets/flatten-volume-array.js.map +0 -1
- package/dist/assets/get-audio-channels.d.ts.map +0 -1
- package/dist/assets/get-audio-channels.js.map +0 -1
- package/dist/assets/read-file.d.ts.map +0 -1
- package/dist/assets/read-file.js.map +0 -1
- package/dist/assets/round-volume-to-avoid-stack-overflow.d.ts.map +0 -1
- package/dist/assets/round-volume-to-avoid-stack-overflow.js.map +0 -1
- package/dist/assets/sanitize-filename.d.ts.map +0 -1
- package/dist/assets/sanitize-filename.js.map +0 -1
- package/dist/assets/sanitize-filepath.d.ts.map +0 -1
- package/dist/assets/sanitize-filepath.js.map +0 -1
- package/dist/assets/truncate-utf8-bytes.d.ts.map +0 -1
- package/dist/assets/truncate-utf8-bytes.js.map +0 -1
- package/dist/assets/types.d.ts.map +0 -1
- package/dist/assets/types.js.map +0 -1
- package/dist/browser/Accessibility.d.ts +0 -175
- package/dist/browser/Accessibility.js +0 -423
- package/dist/browser/AriaQueryHandler.d.ts +0 -20
- package/dist/browser/AriaQueryHandler.js +0 -108
- package/dist/browser/Coverage.d.ts +0 -180
- package/dist/browser/Coverage.js +0 -371
- package/dist/browser/Debug.d.ts +0 -19
- package/dist/browser/Debug.js +0 -42
- package/dist/browser/DeviceDescriptors.d.ts +0 -40
- package/dist/browser/DeviceDescriptors.js +0 -1407
- package/dist/browser/FileChooser.d.ts +0 -56
- package/dist/browser/FileChooser.js +0 -86
- package/dist/browser/Input.d.ts +0 -355
- package/dist/browser/Input.js +0 -592
- package/dist/browser/NetworkConditions.d.ts +0 -26
- package/dist/browser/NetworkConditions.js +0 -33
- package/dist/browser/PDFOptions.d.ts +0 -165
- package/dist/browser/PDFOptions.js +0 -34
- package/dist/browser/PipeTransport.d.ts +0 -10
- package/dist/browser/PipeTransport.js +0 -86
- package/dist/browser/Puppeteer.d.ts +0 -35
- package/dist/browser/Puppeteer.js +0 -17
- package/dist/browser/QueryHandler.d.ts +0 -64
- package/dist/browser/QueryHandler.js +0 -183
- package/dist/browser/SecurityDetails.d.ts +0 -55
- package/dist/browser/SecurityDetails.js +0 -95
- package/dist/browser/Tracing.d.ts +0 -45
- package/dist/browser/Tracing.js +0 -136
- package/dist/browser/USKeyboardLayout.d.ts +0 -39
- package/dist/browser/USKeyboardLayout.js +0 -406
- package/dist/browser/WebWorker.d.ts +0 -96
- package/dist/browser/WebWorker.js +0 -122
- package/dist/browser/dialog.d.ts +0 -70
- package/dist/browser/dialog.js +0 -114
- package/dist/browser/fetch.d.ts +0 -16
- package/dist/browser/fetch.js +0 -46
- package/dist/browser/find-up.d.ts +0 -4
- package/dist/browser/find-up.js +0 -85
- package/dist/browser/pkg-dir.d.ts +0 -3
- package/dist/browser/pkg-dir.js +0 -13
- package/dist/browser-log.d.ts.map +0 -1
- package/dist/browser-log.js.map +0 -1
- package/dist/calculate-ffmpeg-filters.d.ts.map +0 -1
- package/dist/calculate-ffmpeg-filters.js.map +0 -1
- package/dist/can-use-parallel-encoding.d.ts.map +0 -1
- package/dist/can-use-parallel-encoding.js.map +0 -1
- package/dist/chunk.d.ts.map +0 -1
- package/dist/chunk.js.map +0 -1
- package/dist/combine-videos.d.ts.map +0 -1
- package/dist/combine-videos.js.map +0 -1
- package/dist/convert-to-pcm.d.ts.map +0 -1
- package/dist/convert-to-pcm.js.map +0 -1
- package/dist/create-ffmpeg-complex-filter.d.ts.map +0 -1
- package/dist/create-ffmpeg-complex-filter.js.map +0 -1
- package/dist/create-ffmpeg-merge-filter.d.ts.map +0 -1
- package/dist/create-ffmpeg-merge-filter.js.map +0 -1
- package/dist/create-silent-audio.d.ts.map +0 -1
- package/dist/create-silent-audio.js.map +0 -1
- package/dist/cycle-browser-tabs.d.ts.map +0 -1
- package/dist/cycle-browser-tabs.js.map +0 -1
- package/dist/delay-render-embedded-stack.d.ts.map +0 -1
- package/dist/delay-render-embedded-stack.js.map +0 -1
- package/dist/delete-directory.d.ts.map +0 -1
- package/dist/delete-directory.js.map +0 -1
- package/dist/ensure-frames-in-order.d.ts.map +0 -1
- package/dist/ensure-frames-in-order.js.map +0 -1
- package/dist/ensure-output-directory.d.ts.map +0 -1
- package/dist/ensure-output-directory.js.map +0 -1
- package/dist/error-handling/handle-javascript-exception.d.ts.map +0 -1
- package/dist/error-handling/handle-javascript-exception.js.map +0 -1
- package/dist/error-handling/symbolicate-error.d.ts.map +0 -1
- package/dist/error-handling/symbolicate-error.js.map +0 -1
- package/dist/error-handling/symbolicateable-error.d.ts.map +0 -1
- package/dist/error-handling/symbolicateable-error.js.map +0 -1
- package/dist/ffmpeg-filter-file.d.ts.map +0 -1
- package/dist/ffmpeg-filter-file.js.map +0 -1
- package/dist/ffmpeg-flags.d.ts.map +0 -1
- package/dist/ffmpeg-flags.js.map +0 -1
- package/dist/get-audio-codec-name.d.ts.map +0 -1
- package/dist/get-audio-codec-name.js.map +0 -1
- package/dist/get-browser-instance.d.ts.map +0 -1
- package/dist/get-browser-instance.js.map +0 -1
- package/dist/get-codec-name.d.ts.map +0 -1
- package/dist/get-codec-name.js.map +0 -1
- package/dist/get-compositions.d.ts.map +0 -1
- package/dist/get-compositions.js.map +0 -1
- package/dist/get-concurrency.d.ts.map +0 -1
- package/dist/get-concurrency.js.map +0 -1
- package/dist/get-duration-from-frame-range.d.ts.map +0 -1
- package/dist/get-duration-from-frame-range.js.map +0 -1
- package/dist/get-extension-from-codec.d.ts.map +0 -1
- package/dist/get-extension-from-codec.js.map +0 -1
- package/dist/get-frame-to-render.d.ts.map +0 -1
- package/dist/get-frame-to-render.js.map +0 -1
- package/dist/get-local-browser-executable.d.ts.map +0 -1
- package/dist/get-local-browser-executable.js.map +0 -1
- package/dist/get-port.d.ts.map +0 -1
- package/dist/get-port.js.map +0 -1
- package/dist/get-prores-profile-name.d.ts.map +0 -1
- package/dist/get-prores-profile-name.js.map +0 -1
- package/dist/image-format.d.ts.map +0 -1
- package/dist/image-format.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/is-serve-url.d.ts.map +0 -1
- package/dist/is-serve-url.js.map +0 -1
- package/dist/legacy-webpack-config.d.ts.map +0 -1
- package/dist/legacy-webpack-config.js.map +0 -1
- package/dist/make-assets-download-dir.d.ts.map +0 -1
- package/dist/make-assets-download-dir.js.map +0 -1
- package/dist/merge-audio-track.d.ts.map +0 -1
- package/dist/merge-audio-track.js.map +0 -1
- package/dist/normalize-serve-url.d.ts.map +0 -1
- package/dist/normalize-serve-url.js.map +0 -1
- package/dist/open-browser.d.ts.map +0 -1
- package/dist/open-browser.js.map +0 -1
- package/dist/p-limit.d.ts.map +0 -1
- package/dist/p-limit.js.map +0 -1
- package/dist/parse-browser-error-stack.d.ts.map +0 -1
- package/dist/parse-browser-error-stack.js.map +0 -1
- package/dist/parse-ffmpeg-progress.d.ts.map +0 -1
- package/dist/parse-ffmpeg-progress.js.map +0 -1
- package/dist/pool.d.ts.map +0 -1
- package/dist/pool.js.map +0 -1
- package/dist/prepare-server.d.ts.map +0 -1
- package/dist/prepare-server.js.map +0 -1
- package/dist/preprocess-audio-track.d.ts.map +0 -1
- package/dist/preprocess-audio-track.js.map +0 -1
- package/dist/prespawn-ffmpeg.d.ts.map +0 -1
- package/dist/prespawn-ffmpeg.js.map +0 -1
- package/dist/provide-screenshot.d.ts.map +0 -1
- package/dist/provide-screenshot.js.map +0 -1
- package/dist/puppeteer-evaluate.d.ts.map +0 -1
- package/dist/puppeteer-evaluate.js.map +0 -1
- package/dist/puppeteer-screenshot.d.ts.map +0 -1
- package/dist/puppeteer-screenshot.js.map +0 -1
- package/dist/render-frames.d.ts.map +0 -1
- package/dist/render-frames.js.map +0 -1
- package/dist/render-media.d.ts.map +0 -1
- package/dist/render-media.js.map +0 -1
- package/dist/render-still.d.ts.map +0 -1
- package/dist/render-still.js.map +0 -1
- package/dist/resolve-asset-src.d.ts.map +0 -1
- package/dist/resolve-asset-src.js.map +0 -1
- package/dist/sample-rate.d.ts.map +0 -1
- package/dist/sample-rate.js.map +0 -1
- package/dist/screenshot-dom-element.d.ts.map +0 -1
- package/dist/screenshot-dom-element.js.map +0 -1
- package/dist/screenshot-task.d.ts.map +0 -1
- package/dist/screenshot-task.js.map +0 -1
- package/dist/seek-to-frame.d.ts.map +0 -1
- package/dist/seek-to-frame.js.map +0 -1
- package/dist/serve-static.d.ts.map +0 -1
- package/dist/serve-static.js.map +0 -1
- package/dist/set-props-and-env.d.ts.map +0 -1
- package/dist/set-props-and-env.js.map +0 -1
- package/dist/stitch-frames-to-video.d.ts.map +0 -1
- package/dist/stitch-frames-to-video.js.map +0 -1
- package/dist/stringify-ffmpeg-filter.d.ts.map +0 -1
- package/dist/stringify-ffmpeg-filter.js.map +0 -1
- package/dist/symbolicate-stacktrace.d.ts.map +0 -1
- package/dist/symbolicate-stacktrace.js.map +0 -1
- package/dist/tmp-dir.d.ts.map +0 -1
- package/dist/tmp-dir.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/validate-even-dimensions-with-codec.d.ts.map +0 -1
- package/dist/validate-even-dimensions-with-codec.js.map +0 -1
- package/dist/validate-ffmpeg.d.ts.map +0 -1
- package/dist/validate-ffmpeg.js.map +0 -1
- package/dist/validate-puppeteer-timeout.d.ts.map +0 -1
- package/dist/validate-puppeteer-timeout.js.map +0 -1
- package/dist/validate-scale.d.ts.map +0 -1
- package/dist/validate-scale.js.map +0 -1
|
@@ -3,33 +3,53 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.extractFrameFromVideo = exports.getLastFrameOfVideo = void 0;
|
|
6
|
+
exports.extractFrameFromVideo = exports.getLastFrameOfVideo = exports.determineResizeParams = void 0;
|
|
7
7
|
const execa_1 = __importDefault(require("execa"));
|
|
8
8
|
const remotion_1 = require("remotion");
|
|
9
9
|
const get_audio_channels_1 = require("./assets/get-audio-channels");
|
|
10
10
|
const ensure_presentation_timestamp_1 = require("./ensure-presentation-timestamp");
|
|
11
11
|
const frame_to_ffmpeg_timestamp_1 = require("./frame-to-ffmpeg-timestamp");
|
|
12
|
+
const get_video_info_1 = require("./get-video-info");
|
|
12
13
|
const is_beyond_last_frame_1 = require("./is-beyond-last-frame");
|
|
13
14
|
const last_frame_from_video_cache_1 = require("./last-frame-from-video-cache");
|
|
14
15
|
const p_limit_1 = require("./p-limit");
|
|
15
16
|
const lastFrameLimit = (0, p_limit_1.pLimit)(1);
|
|
16
17
|
const mainLimit = (0, p_limit_1.pLimit)(5);
|
|
18
|
+
const determineVcodecFfmepgFlags = (vcodecFlag) => {
|
|
19
|
+
return [
|
|
20
|
+
vcodecFlag === 'vp9' ? '-vcodec' : null,
|
|
21
|
+
vcodecFlag === 'vp9' ? 'libvpx-vp9' : null,
|
|
22
|
+
vcodecFlag === 'vp8' ? '-vcodec' : null,
|
|
23
|
+
vcodecFlag === 'vp8' ? 'libvpx' : null,
|
|
24
|
+
].filter(remotion_1.Internals.truthy);
|
|
25
|
+
};
|
|
26
|
+
const determineResizeParams = (needsResize) => {
|
|
27
|
+
if (needsResize === null) {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
return ['-s', `${needsResize[0]}x${needsResize[1]}`];
|
|
31
|
+
};
|
|
32
|
+
exports.determineResizeParams = determineResizeParams;
|
|
17
33
|
// Uses no seeking, therefore the whole video has to be decoded. This is a last resort and should only happen
|
|
18
34
|
// if the video is corrupted
|
|
19
|
-
const
|
|
20
|
-
console.warn(`\nUsing a slow method to
|
|
21
|
-
const actualOffset = `-${
|
|
35
|
+
const getFrameOfVideoSlow = async ({ src, timestamp, ffmpegExecutable, imageFormat, specialVCodecForTransparency, needsResize, }) => {
|
|
36
|
+
console.warn(`\nUsing a slow method to extract the frame at ${timestamp}ms of ${src}. See https://remotion.dev/docs/slow-method-to-extract-frame for advice`);
|
|
37
|
+
const actualOffset = `-${timestamp * 1000}ms`;
|
|
22
38
|
const command = [
|
|
23
39
|
'-itsoffset',
|
|
24
40
|
actualOffset,
|
|
41
|
+
...determineVcodecFfmepgFlags(specialVCodecForTransparency),
|
|
25
42
|
'-i',
|
|
26
43
|
src,
|
|
27
44
|
'-frames:v',
|
|
28
45
|
'1',
|
|
46
|
+
'-c:v',
|
|
47
|
+
imageFormat === 'jpeg' ? 'mjpeg' : 'png',
|
|
29
48
|
'-f',
|
|
30
49
|
'image2pipe',
|
|
50
|
+
...(0, exports.determineResizeParams)(needsResize),
|
|
31
51
|
'-',
|
|
32
|
-
];
|
|
52
|
+
].filter(remotion_1.Internals.truthy);
|
|
33
53
|
const { stdout, stderr } = (0, execa_1.default)(ffmpegExecutable !== null && ffmpegExecutable !== void 0 ? ffmpegExecutable : 'ffmpeg', command);
|
|
34
54
|
if (!stderr) {
|
|
35
55
|
throw new Error('unexpectedly did not get stderr');
|
|
@@ -66,11 +86,14 @@ const getLastFrameOfVideoFastUnlimited = async (options) => {
|
|
|
66
86
|
if (duration === null) {
|
|
67
87
|
throw new Error(`Could not determine the duration of ${src} using FFMPEG. The file is not supported.`);
|
|
68
88
|
}
|
|
69
|
-
if (offset > 40) {
|
|
70
|
-
const last = await
|
|
71
|
-
duration,
|
|
89
|
+
if (options.specialVCodecForTransparency === 'vp8' || offset > 40) {
|
|
90
|
+
const last = await getFrameOfVideoSlow({
|
|
91
|
+
timestamp: duration,
|
|
72
92
|
ffmpegExecutable,
|
|
73
93
|
src,
|
|
94
|
+
imageFormat: options.imageFormat,
|
|
95
|
+
specialVCodecForTransparency: options.specialVCodecForTransparency,
|
|
96
|
+
needsResize: options.needsResize,
|
|
74
97
|
});
|
|
75
98
|
return last;
|
|
76
99
|
}
|
|
@@ -78,14 +101,18 @@ const getLastFrameOfVideoFastUnlimited = async (options) => {
|
|
|
78
101
|
const { stdout, stderr } = (0, execa_1.default)(ffmpegExecutable !== null && ffmpegExecutable !== void 0 ? ffmpegExecutable : 'ffmpeg', [
|
|
79
102
|
'-ss',
|
|
80
103
|
actualOffset,
|
|
104
|
+
...determineVcodecFfmepgFlags(options.specialVCodecForTransparency),
|
|
81
105
|
'-i',
|
|
82
106
|
src,
|
|
83
107
|
'-frames:v',
|
|
84
108
|
'1',
|
|
109
|
+
'-c:v',
|
|
110
|
+
options.imageFormat === 'jpeg' ? 'mjpeg' : 'png',
|
|
85
111
|
'-f',
|
|
86
112
|
'image2pipe',
|
|
113
|
+
...(0, exports.determineResizeParams)(options.needsResize),
|
|
87
114
|
'-',
|
|
88
|
-
]);
|
|
115
|
+
].filter(remotion_1.Internals.truthy));
|
|
89
116
|
if (!stderr) {
|
|
90
117
|
throw new Error('unexpectedly did not get stderr');
|
|
91
118
|
}
|
|
@@ -118,6 +145,9 @@ const getLastFrameOfVideoFastUnlimited = async (options) => {
|
|
|
118
145
|
offset: offset + 10,
|
|
119
146
|
src,
|
|
120
147
|
ffprobeExecutable,
|
|
148
|
+
imageFormat: options.imageFormat,
|
|
149
|
+
specialVCodecForTransparency: options.specialVCodecForTransparency,
|
|
150
|
+
needsResize: options.needsResize,
|
|
121
151
|
});
|
|
122
152
|
return unlimited;
|
|
123
153
|
}
|
|
@@ -129,14 +159,28 @@ const getLastFrameOfVideo = async (options) => {
|
|
|
129
159
|
return result;
|
|
130
160
|
};
|
|
131
161
|
exports.getLastFrameOfVideo = getLastFrameOfVideo;
|
|
132
|
-
const extractFrameFromVideoFn = async ({ time, src, ffmpegExecutable, ffprobeExecutable, }) => {
|
|
162
|
+
const extractFrameFromVideoFn = async ({ time, src, ffmpegExecutable, ffprobeExecutable, imageFormat, }) => {
|
|
133
163
|
await (0, ensure_presentation_timestamp_1.ensurePresentationTimestamps)(src);
|
|
164
|
+
const { specialVcodec, needsResize } = await (0, get_video_info_1.getVideoInfo)(src, ffprobeExecutable);
|
|
165
|
+
if (specialVcodec === 'vp8') {
|
|
166
|
+
return getFrameOfVideoSlow({
|
|
167
|
+
ffmpegExecutable,
|
|
168
|
+
imageFormat,
|
|
169
|
+
specialVCodecForTransparency: specialVcodec,
|
|
170
|
+
src,
|
|
171
|
+
timestamp: time,
|
|
172
|
+
needsResize,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
134
175
|
if ((0, is_beyond_last_frame_1.isBeyondLastFrame)(src, time)) {
|
|
135
176
|
const lastFrame = await (0, exports.getLastFrameOfVideo)({
|
|
136
177
|
ffmpegExecutable,
|
|
137
178
|
ffprobeExecutable,
|
|
138
179
|
offset: 0,
|
|
139
180
|
src,
|
|
181
|
+
imageFormat,
|
|
182
|
+
specialVCodecForTransparency: specialVcodec,
|
|
183
|
+
needsResize,
|
|
140
184
|
});
|
|
141
185
|
return lastFrame;
|
|
142
186
|
}
|
|
@@ -144,14 +188,18 @@ const extractFrameFromVideoFn = async ({ time, src, ffmpegExecutable, ffprobeExe
|
|
|
144
188
|
const { stdout, stderr } = (0, execa_1.default)(ffmpegExecutable !== null && ffmpegExecutable !== void 0 ? ffmpegExecutable : 'ffmpeg', [
|
|
145
189
|
'-ss',
|
|
146
190
|
ffmpegTimestamp,
|
|
191
|
+
...determineVcodecFfmepgFlags(specialVcodec),
|
|
147
192
|
'-i',
|
|
148
193
|
src,
|
|
149
194
|
'-frames:v',
|
|
150
195
|
'1',
|
|
151
196
|
'-f',
|
|
152
197
|
'image2pipe',
|
|
198
|
+
'-vcodec',
|
|
199
|
+
imageFormat === 'jpeg' ? 'mjpeg' : 'png',
|
|
200
|
+
...(0, exports.determineResizeParams)(needsResize),
|
|
153
201
|
'-',
|
|
154
|
-
], {
|
|
202
|
+
].filter(remotion_1.Internals.truthy), {
|
|
155
203
|
buffer: false,
|
|
156
204
|
});
|
|
157
205
|
if (!stderr) {
|
|
@@ -183,6 +231,9 @@ const extractFrameFromVideoFn = async ({ time, src, ffmpegExecutable, ffprobeExe
|
|
|
183
231
|
ffprobeExecutable,
|
|
184
232
|
offset: 0,
|
|
185
233
|
src,
|
|
234
|
+
imageFormat,
|
|
235
|
+
specialVCodecForTransparency: specialVcodec,
|
|
236
|
+
needsResize,
|
|
186
237
|
});
|
|
187
238
|
return last;
|
|
188
239
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
export declare const FREE_ATOM: number;
|
|
3
|
+
export declare const JUNK_ATOM: number;
|
|
4
|
+
export declare const MDAT_ATOM: number;
|
|
5
|
+
export declare const MOOV_ATOM: number;
|
|
6
|
+
export declare const PNOT_ATOM: number;
|
|
7
|
+
export declare const SKIP_ATOM: number;
|
|
8
|
+
export declare const WIDE_ATOM: number;
|
|
9
|
+
export declare const PICT_ATOM: number;
|
|
10
|
+
export declare const FTYP_ATOM: number;
|
|
11
|
+
export declare const UUID_ATOM: number;
|
|
12
|
+
export declare const CMOV_ATOM: number;
|
|
13
|
+
export declare const TRAK_ATOM: number;
|
|
14
|
+
export declare const MDIA_ATOM: number;
|
|
15
|
+
export declare const MINF_ATOM: number;
|
|
16
|
+
export declare const STBL_ATOM: number;
|
|
17
|
+
export declare const STCO_ATOM: number;
|
|
18
|
+
export declare const CO64_ATOM: number;
|
|
19
|
+
export declare const ATOM_PREAMBLE_SIZE: bigint;
|
|
20
|
+
export declare const MAX_FTYP_ATOM_SIZE: bigint;
|
|
21
|
+
export declare enum SizeKind {
|
|
22
|
+
U32 = 0,
|
|
23
|
+
U64 = 1
|
|
24
|
+
}
|
|
25
|
+
export interface QtAtom {
|
|
26
|
+
kind: string;
|
|
27
|
+
size: BigInt;
|
|
28
|
+
sizeKind: SizeKind;
|
|
29
|
+
data: QtAtom[] | Buffer;
|
|
30
|
+
}
|
|
31
|
+
export declare function parseAtoms(infile: Buffer, depth?: number, shallow?: boolean): QtAtom[];
|
|
32
|
+
export declare function recurseFlattenAtoms(atoms: QtAtom[], depth?: number): Buffer;
|
|
33
|
+
export declare function traverseAtoms(atoms: QtAtom[], callback: (atom: QtAtom) => void): void;
|
|
34
|
+
export declare function isQtAtom(atomType: number): boolean;
|
|
35
|
+
export declare function hasSubatoms(atomType: number): boolean;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hasSubatoms = exports.isQtAtom = exports.traverseAtoms = exports.recurseFlattenAtoms = exports.parseAtoms = exports.SizeKind = exports.MAX_FTYP_ATOM_SIZE = exports.ATOM_PREAMBLE_SIZE = exports.CO64_ATOM = exports.STCO_ATOM = exports.STBL_ATOM = exports.MINF_ATOM = exports.MDIA_ATOM = exports.TRAK_ATOM = exports.CMOV_ATOM = exports.UUID_ATOM = exports.FTYP_ATOM = exports.PICT_ATOM = exports.WIDE_ATOM = exports.SKIP_ATOM = exports.PNOT_ATOM = exports.MOOV_ATOM = exports.MDAT_ATOM = exports.JUNK_ATOM = exports.FREE_ATOM = void 0;
|
|
4
|
+
/* eslint-disable no-bitwise */
|
|
5
|
+
const util_1 = require("./util");
|
|
6
|
+
exports.FREE_ATOM = (0, util_1.asciiToU32Be)('free');
|
|
7
|
+
exports.JUNK_ATOM = (0, util_1.asciiToU32Be)('junk');
|
|
8
|
+
exports.MDAT_ATOM = (0, util_1.asciiToU32Be)('mdat');
|
|
9
|
+
exports.MOOV_ATOM = (0, util_1.asciiToU32Be)('moov');
|
|
10
|
+
exports.PNOT_ATOM = (0, util_1.asciiToU32Be)('pnot');
|
|
11
|
+
exports.SKIP_ATOM = (0, util_1.asciiToU32Be)('skip');
|
|
12
|
+
exports.WIDE_ATOM = (0, util_1.asciiToU32Be)('wide');
|
|
13
|
+
exports.PICT_ATOM = (0, util_1.asciiToU32Be)('PICT');
|
|
14
|
+
exports.FTYP_ATOM = (0, util_1.asciiToU32Be)('ftyp');
|
|
15
|
+
exports.UUID_ATOM = (0, util_1.asciiToU32Be)('uuid');
|
|
16
|
+
exports.CMOV_ATOM = (0, util_1.asciiToU32Be)('cmov');
|
|
17
|
+
exports.TRAK_ATOM = (0, util_1.asciiToU32Be)('trak');
|
|
18
|
+
exports.MDIA_ATOM = (0, util_1.asciiToU32Be)('mdia');
|
|
19
|
+
exports.MINF_ATOM = (0, util_1.asciiToU32Be)('minf');
|
|
20
|
+
exports.STBL_ATOM = (0, util_1.asciiToU32Be)('stbl');
|
|
21
|
+
exports.STCO_ATOM = (0, util_1.asciiToU32Be)('stco');
|
|
22
|
+
exports.CO64_ATOM = (0, util_1.asciiToU32Be)('co64');
|
|
23
|
+
exports.ATOM_PREAMBLE_SIZE = BigInt(8);
|
|
24
|
+
exports.MAX_FTYP_ATOM_SIZE = BigInt(1048576);
|
|
25
|
+
var SizeKind;
|
|
26
|
+
(function (SizeKind) {
|
|
27
|
+
SizeKind[SizeKind["U32"] = 0] = "U32";
|
|
28
|
+
SizeKind[SizeKind["U64"] = 1] = "U64";
|
|
29
|
+
})(SizeKind = exports.SizeKind || (exports.SizeKind = {}));
|
|
30
|
+
function parseAtoms(infile, depth = 0, shallow = false) {
|
|
31
|
+
const atoms = [];
|
|
32
|
+
const cur = {
|
|
33
|
+
pos: BigInt(0),
|
|
34
|
+
};
|
|
35
|
+
const len = BigInt(infile.byteLength);
|
|
36
|
+
while (cur.pos < len) {
|
|
37
|
+
if (len - cur.pos < 8) {
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
let fwd; // forward-seek counter
|
|
41
|
+
let atomSize = BigInt((0, util_1.readU32)(cur, infile));
|
|
42
|
+
const atomType = (0, util_1.readU32)(cur, infile);
|
|
43
|
+
let sizeKind = SizeKind.U32;
|
|
44
|
+
if (atomSize === BigInt(1)) {
|
|
45
|
+
// 64-bit atom size
|
|
46
|
+
atomSize = (0, util_1.readU64)(cur, infile);
|
|
47
|
+
if (atomSize > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
48
|
+
throw new Error(`"${atomType}" atom size is larger than MAX_SAFE_INTEGER!`);
|
|
49
|
+
}
|
|
50
|
+
fwd = atomSize - exports.ATOM_PREAMBLE_SIZE * BigInt(2);
|
|
51
|
+
sizeKind = SizeKind.U64;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
fwd = atomSize - exports.ATOM_PREAMBLE_SIZE;
|
|
55
|
+
}
|
|
56
|
+
const endOfAtom = cur.pos + fwd;
|
|
57
|
+
const subatoms = Buffer.from(infile.slice(Number(cur.pos), Number(endOfAtom)));
|
|
58
|
+
const data = hasSubatoms(atomType) && depth < 10 && !shallow
|
|
59
|
+
? parseAtoms(subatoms, depth + 1)
|
|
60
|
+
: subatoms;
|
|
61
|
+
cur.pos = endOfAtom;
|
|
62
|
+
if (depth === 0 && !isQtAtom(atomType)) {
|
|
63
|
+
throw new Error(`Non-QT top-level atom found: ${(0, util_1.u32BeToAscii)(atomType)}`);
|
|
64
|
+
}
|
|
65
|
+
atoms.push({
|
|
66
|
+
kind: (0, util_1.u32BeToAscii)(atomType),
|
|
67
|
+
size: atomSize,
|
|
68
|
+
sizeKind,
|
|
69
|
+
data,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return atoms;
|
|
73
|
+
}
|
|
74
|
+
exports.parseAtoms = parseAtoms;
|
|
75
|
+
function recurseFlattenAtoms(atoms, depth = 0) {
|
|
76
|
+
const buffers = [];
|
|
77
|
+
for (const atom of atoms) {
|
|
78
|
+
if (!Buffer.isBuffer(atom.data)) {
|
|
79
|
+
atom.data = recurseFlattenAtoms(atom.data, depth + 1);
|
|
80
|
+
}
|
|
81
|
+
let header;
|
|
82
|
+
const u64Size = Number(exports.ATOM_PREAMBLE_SIZE) + atom.data.byteLength > 2 ** 32 - 1;
|
|
83
|
+
if (u64Size) {
|
|
84
|
+
const u64Preamble = Number(exports.ATOM_PREAMBLE_SIZE) * 2;
|
|
85
|
+
header = Buffer.alloc(u64Preamble);
|
|
86
|
+
header.writeUInt32BE(1, 0);
|
|
87
|
+
header.writeUInt32BE((0, util_1.asciiToU32Be)(atom.kind), 4);
|
|
88
|
+
const newSize = u64Preamble + atom.data.byteLength;
|
|
89
|
+
header.writeUInt32BE((newSize >> 32) & 0xffffffff, 8);
|
|
90
|
+
header.writeUInt32BE(newSize & 0xffffffff, 12);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
header = Buffer.alloc(Number(exports.ATOM_PREAMBLE_SIZE));
|
|
94
|
+
const newSize = Number(exports.ATOM_PREAMBLE_SIZE) + atom.data.byteLength;
|
|
95
|
+
header.writeUInt32BE(newSize, 0);
|
|
96
|
+
header.writeUInt32BE((0, util_1.asciiToU32Be)(atom.kind), 4);
|
|
97
|
+
}
|
|
98
|
+
const buf = Buffer.concat([header, atom.data]);
|
|
99
|
+
buffers.push(buf);
|
|
100
|
+
}
|
|
101
|
+
return Buffer.concat(buffers);
|
|
102
|
+
}
|
|
103
|
+
exports.recurseFlattenAtoms = recurseFlattenAtoms;
|
|
104
|
+
function traverseAtoms(atoms, callback) {
|
|
105
|
+
for (const atom of atoms) {
|
|
106
|
+
if (!Buffer.isBuffer(atom.data)) {
|
|
107
|
+
traverseAtoms(atom.data, callback);
|
|
108
|
+
}
|
|
109
|
+
callback(atom);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.traverseAtoms = traverseAtoms;
|
|
113
|
+
function isQtAtom(atomType) {
|
|
114
|
+
return [
|
|
115
|
+
exports.FREE_ATOM,
|
|
116
|
+
exports.JUNK_ATOM,
|
|
117
|
+
exports.MDAT_ATOM,
|
|
118
|
+
exports.MOOV_ATOM,
|
|
119
|
+
exports.PNOT_ATOM,
|
|
120
|
+
exports.SKIP_ATOM,
|
|
121
|
+
exports.WIDE_ATOM,
|
|
122
|
+
exports.PICT_ATOM,
|
|
123
|
+
exports.FTYP_ATOM,
|
|
124
|
+
exports.UUID_ATOM,
|
|
125
|
+
exports.CMOV_ATOM,
|
|
126
|
+
exports.TRAK_ATOM,
|
|
127
|
+
exports.MDIA_ATOM,
|
|
128
|
+
exports.MINF_ATOM,
|
|
129
|
+
exports.STBL_ATOM,
|
|
130
|
+
exports.STCO_ATOM,
|
|
131
|
+
exports.CO64_ATOM,
|
|
132
|
+
].includes(atomType);
|
|
133
|
+
}
|
|
134
|
+
exports.isQtAtom = isQtAtom;
|
|
135
|
+
function hasSubatoms(atomType) {
|
|
136
|
+
return [exports.MOOV_ATOM, exports.TRAK_ATOM, exports.MDIA_ATOM, exports.MINF_ATOM, exports.STBL_ATOM].includes(atomType);
|
|
137
|
+
}
|
|
138
|
+
exports.hasSubatoms = hasSubatoms;
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { QtAtom } from './atom';
|
|
3
|
+
import { FaststartOptions } from './options';
|
|
4
|
+
export declare function supportStreaming(infile: Buffer): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Enables "faststart" for QuickTime files so that they can be streamed.
|
|
7
|
+
*
|
|
8
|
+
* @param infile QT/mp4 to faststart
|
|
9
|
+
* @returns Faststarted QT/mp4
|
|
10
|
+
*/
|
|
11
|
+
export default function faststart(infile: Buffer, options?: FaststartOptions): Buffer;
|
|
12
|
+
/**
|
|
13
|
+
* Sorts an array of QT atoms so that the first two atoms are `ftyp`, then `moov`.
|
|
14
|
+
* Additionally updates all chunk offsets (`stco`/`co64` atoms) in `moov`.
|
|
15
|
+
*
|
|
16
|
+
* @param atoms QT atoms to sort
|
|
17
|
+
*/
|
|
18
|
+
export declare function sortFaststartAtoms(atoms: QtAtom[], options: FaststartOptions): QtAtom[];
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.sortFaststartAtoms = exports.supportStreaming = void 0;
|
|
7
|
+
const atom_1 = require("./atom");
|
|
8
|
+
const update_chunk_offsets_1 = __importDefault(require("./update-chunk-offsets"));
|
|
9
|
+
function supportStreaming(infile) {
|
|
10
|
+
const file = Buffer.from(infile);
|
|
11
|
+
const atoms = (0, atom_1.parseAtoms)(file, 0, true);
|
|
12
|
+
const mdatIndex = atoms.findIndex((atom) => atom.kind === 'mdat');
|
|
13
|
+
const moovIndex = atoms.findIndex((atom) => atom.kind === 'moov');
|
|
14
|
+
if (moovIndex === -1 || mdatIndex === -1) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
return moovIndex < mdatIndex;
|
|
18
|
+
}
|
|
19
|
+
exports.supportStreaming = supportStreaming;
|
|
20
|
+
/**
|
|
21
|
+
* Enables "faststart" for QuickTime files so that they can be streamed.
|
|
22
|
+
*
|
|
23
|
+
* @param infile QT/mp4 to faststart
|
|
24
|
+
* @returns Faststarted QT/mp4
|
|
25
|
+
*/
|
|
26
|
+
function faststart(infile, options = {}) {
|
|
27
|
+
const file = Buffer.from(infile);
|
|
28
|
+
const atoms = (0, atom_1.parseAtoms)(file);
|
|
29
|
+
console.log({ atoms });
|
|
30
|
+
const mdatIndex = atoms.findIndex((atom) => atom.kind === 'mdat');
|
|
31
|
+
if (mdatIndex === -1) {
|
|
32
|
+
throw new Error(`No mdat atom found!`);
|
|
33
|
+
}
|
|
34
|
+
const moovIndex = atoms.findIndex((atom) => atom.kind === 'moov');
|
|
35
|
+
if (moovIndex === -1) {
|
|
36
|
+
throw new Error(`No moov atom found!`);
|
|
37
|
+
}
|
|
38
|
+
const faststarted = sortFaststartAtoms(atoms, options);
|
|
39
|
+
return (0, atom_1.recurseFlattenAtoms)(faststarted);
|
|
40
|
+
}
|
|
41
|
+
exports.default = faststart;
|
|
42
|
+
/**
|
|
43
|
+
* Sorts an array of QT atoms so that the first two atoms are `ftyp`, then `moov`.
|
|
44
|
+
* Additionally updates all chunk offsets (`stco`/`co64` atoms) in `moov`.
|
|
45
|
+
*
|
|
46
|
+
* @param atoms QT atoms to sort
|
|
47
|
+
*/
|
|
48
|
+
function sortFaststartAtoms(atoms, options) {
|
|
49
|
+
const faststarted = [];
|
|
50
|
+
const ftyp = atoms.find((atom) => atom.kind === 'ftyp');
|
|
51
|
+
if (!ftyp) {
|
|
52
|
+
throw new Error('Missing ftyp atom!');
|
|
53
|
+
}
|
|
54
|
+
if (ftyp.size > atom_1.MAX_FTYP_ATOM_SIZE) {
|
|
55
|
+
throw new Error(`ftyp atom is greater than ${atom_1.MAX_FTYP_ATOM_SIZE}`);
|
|
56
|
+
}
|
|
57
|
+
console.log('before', { atoms });
|
|
58
|
+
const moov = atoms.find((atom) => atom.kind === 'moov');
|
|
59
|
+
(0, update_chunk_offsets_1.default)(moov, options);
|
|
60
|
+
faststarted.push(ftyp, moov);
|
|
61
|
+
const rest = atoms.filter((atom) => !['ftyp', 'moov'].includes(atom.kind));
|
|
62
|
+
faststarted.push(...rest);
|
|
63
|
+
console.log('after', { faststarted });
|
|
64
|
+
return faststarted;
|
|
65
|
+
}
|
|
66
|
+
exports.sortFaststartAtoms = sortFaststartAtoms;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { QtAtom } from './atom';
|
|
2
|
+
import { FaststartOptions } from './options';
|
|
3
|
+
/**
|
|
4
|
+
* Adds the specified offset to each entry in stco/co64 atoms
|
|
5
|
+
*
|
|
6
|
+
* @param atoms QT atoms to traverse
|
|
7
|
+
* @param offset offset to add
|
|
8
|
+
* @param forceUpgrade always upgrade stco atoms to co64
|
|
9
|
+
*/
|
|
10
|
+
export default function updateChunkOffsets(moov: QtAtom, options: FaststartOptions): void;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable no-bitwise */
|
|
4
|
+
const atom_1 = require("./atom");
|
|
5
|
+
/**
|
|
6
|
+
* Adds the specified offset to each entry in stco/co64 atoms
|
|
7
|
+
*
|
|
8
|
+
* @param atoms QT atoms to traverse
|
|
9
|
+
* @param offset offset to add
|
|
10
|
+
* @param forceUpgrade always upgrade stco atoms to co64
|
|
11
|
+
*/
|
|
12
|
+
function updateChunkOffsets(moov, options) {
|
|
13
|
+
const atoms = moov.data;
|
|
14
|
+
const originalMoovSize = Number(moov.size);
|
|
15
|
+
let newChunksSize = 0;
|
|
16
|
+
let originalChunksSize = 0;
|
|
17
|
+
// First pass to count total entries, which is needed for co64 upgrades.
|
|
18
|
+
(0, atom_1.traverseAtoms)(atoms, (atom) => {
|
|
19
|
+
if (!['stco', 'co64'].includes(atom.kind) || !Buffer.isBuffer(atom.data)) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const entries = atom.data.readUInt32BE(4);
|
|
23
|
+
const originalEntrySize = isCo64(atom.kind) ? 8 : 4;
|
|
24
|
+
originalChunksSize += entries * originalEntrySize;
|
|
25
|
+
const newEntrySize = isCo64(atom.kind) || options.forceUpgradeToCo64 ? 8 : 4;
|
|
26
|
+
newChunksSize += entries * newEntrySize;
|
|
27
|
+
});
|
|
28
|
+
// Calculate new mdat offsets to add to stco/co64 chunk offset values
|
|
29
|
+
const totalOffset = originalMoovSize - originalChunksSize + newChunksSize;
|
|
30
|
+
// Second pass to actually update offsets.
|
|
31
|
+
(0, atom_1.traverseAtoms)(atoms, (atom) => {
|
|
32
|
+
if (!['stco', 'co64'].includes(atom.kind) || !Buffer.isBuffer(atom.data)) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const overflow = updateChunkAtom(atom, totalOffset, options);
|
|
36
|
+
if (!overflow) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
upgradeStcoToCo64(atom, totalOffset);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
exports.default = updateChunkOffsets;
|
|
43
|
+
/**
|
|
44
|
+
* Updates `stco` or `co64` atoms' chunk offsets.
|
|
45
|
+
*
|
|
46
|
+
* @param atom `stco` or `co64` to update chunk offsets of
|
|
47
|
+
* @param totalOffset the total offset value to add to the existing chunk offsets
|
|
48
|
+
* @param options
|
|
49
|
+
* @returns {boolean} `true` if overflowed (did not finish updating chunks), `false` if succeeded
|
|
50
|
+
*/
|
|
51
|
+
function updateChunkAtom(atom, totalOffset, options) {
|
|
52
|
+
if (!Buffer.isBuffer(atom.data)) {
|
|
53
|
+
throw new Error(`${atom.kind} data is not a Buffer!`);
|
|
54
|
+
}
|
|
55
|
+
let overflow = false;
|
|
56
|
+
const entrySize = isCo64(atom.kind) ? 8 : 4;
|
|
57
|
+
const entries = atom.data.readUInt32BE(4);
|
|
58
|
+
const newData = Buffer.alloc(8 + entries * entrySize); // 8 byte header
|
|
59
|
+
atom.data.copy(newData, 0, 0, 8); // copy header
|
|
60
|
+
for (let i = 0; i < entries; i++) {
|
|
61
|
+
const cur = 8 + i * entrySize; // 8 byte header
|
|
62
|
+
if (isCo64(atom.kind)) {
|
|
63
|
+
const newVal64 = Number((BigInt(atom.data.readUInt32BE(cur)) << BigInt(32)) |
|
|
64
|
+
BigInt(atom.data.readUInt32BE(cur + 4))) + totalOffset;
|
|
65
|
+
newData.writeUInt32BE(Number((BigInt(newVal64) >> BigInt(32)) & BigInt(0xffffffff)), cur);
|
|
66
|
+
newData.writeUInt32BE(Number(BigInt(newVal64) & BigInt(0xffffffff)), cur + 4);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (options.forceUpgradeToCo64) {
|
|
70
|
+
overflow = true;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
const newVal32 = atom.data.readUInt32BE(cur) + totalOffset;
|
|
74
|
+
if (newVal32 > 2 ** 32 - 1) {
|
|
75
|
+
overflow = true;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
newData.writeUInt32BE(newVal32, cur);
|
|
79
|
+
}
|
|
80
|
+
if (!overflow) {
|
|
81
|
+
atom.data = newData;
|
|
82
|
+
}
|
|
83
|
+
return overflow;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* **Upgrades** `stco` atom to a `co64` atom and also updates the chunk offsets.
|
|
87
|
+
*
|
|
88
|
+
* @param atom `stco` or `co64` to update chunk offsets of
|
|
89
|
+
* @param totalOffset the total offset value to add to the existing chunk offsets
|
|
90
|
+
*/
|
|
91
|
+
function upgradeStcoToCo64(atom, totalOffset) {
|
|
92
|
+
if (!Buffer.isBuffer(atom.data)) {
|
|
93
|
+
throw new Error(`${atom.kind} data is not a Buffer!`);
|
|
94
|
+
}
|
|
95
|
+
// Upgrade to stco atoms to co64 atoms
|
|
96
|
+
const entries = atom.data.readUInt32BE(4);
|
|
97
|
+
const upgradedData = Buffer.alloc(8 + entries * 8); // 8-byte header, 8-byte entry size
|
|
98
|
+
atom.data.copy(upgradedData, 0, 0, 8);
|
|
99
|
+
upgradedData.writeUInt32BE((entries >> 32) & 0xffffffff, 8); // MSB 64-bit size
|
|
100
|
+
upgradedData.writeUInt32BE(entries & 0xffffffff, 12); // LSB 64-bit size
|
|
101
|
+
for (let i = 0; i < entries; i++) {
|
|
102
|
+
const cur32 = 8 + i * 4; // 8-byte header, 4-byte entry size for READS (stco)
|
|
103
|
+
const newVal = atom.data.readUInt32BE(cur32) + totalOffset;
|
|
104
|
+
const cur64 = 8 + i * 8; // 8-byte header, 8-byte entry size for WRITES (co64)
|
|
105
|
+
upgradedData.writeUInt32BE(Number((BigInt(newVal) >> BigInt(32)) & BigInt(0xffffffff)), cur64);
|
|
106
|
+
upgradedData.writeUInt32BE(Number(BigInt(newVal) & BigInt(0xffffffff)), cur64 + 4);
|
|
107
|
+
}
|
|
108
|
+
atom.kind = 'co64';
|
|
109
|
+
atom.data = upgradedData;
|
|
110
|
+
atom.size = atom_1.ATOM_PREAMBLE_SIZE * BigInt(2) + BigInt(upgradedData.byteLength);
|
|
111
|
+
}
|
|
112
|
+
function isCo64(atomKind) {
|
|
113
|
+
return atomKind === 'co64';
|
|
114
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
export interface Cursor {
|
|
3
|
+
pos: bigint;
|
|
4
|
+
}
|
|
5
|
+
export declare function numToHex(val: number): string;
|
|
6
|
+
export declare function asciiToU32Be(chars: string): number;
|
|
7
|
+
export declare function u32BeToAscii(u32: number): string;
|
|
8
|
+
export declare function readU32(cur: Cursor, buf: Buffer): number;
|
|
9
|
+
export declare function readU64(cur: Cursor, buf: Buffer): bigint;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readU64 = exports.readU32 = exports.u32BeToAscii = exports.asciiToU32Be = exports.numToHex = void 0;
|
|
4
|
+
function numToHex(val) {
|
|
5
|
+
return val.toString(16);
|
|
6
|
+
}
|
|
7
|
+
exports.numToHex = numToHex;
|
|
8
|
+
function asciiToU32Be(chars) {
|
|
9
|
+
return Buffer.from(chars.split('').map((char) => char.charCodeAt(0))).readUInt32BE(0);
|
|
10
|
+
}
|
|
11
|
+
exports.asciiToU32Be = asciiToU32Be;
|
|
12
|
+
function u32BeToAscii(u32) {
|
|
13
|
+
const buf = Buffer.alloc(4);
|
|
14
|
+
buf.writeUInt32BE(u32, 0);
|
|
15
|
+
return buf.toString('ascii');
|
|
16
|
+
}
|
|
17
|
+
exports.u32BeToAscii = u32BeToAscii;
|
|
18
|
+
function readU32(cur, buf) {
|
|
19
|
+
const u32 = buf.readUInt32BE(Number(cur.pos));
|
|
20
|
+
cur.pos += BigInt(4);
|
|
21
|
+
return u32;
|
|
22
|
+
}
|
|
23
|
+
exports.readU32 = readU32;
|
|
24
|
+
function readU64(cur, buf) {
|
|
25
|
+
const long = buf.slice(Number(cur.pos), Number(cur.pos + BigInt(8)));
|
|
26
|
+
const u64 =
|
|
27
|
+
// eslint-disable-next-line no-bitwise
|
|
28
|
+
(BigInt(long.readUInt32BE(0)) << BigInt(32)) |
|
|
29
|
+
// eslint-disable-next-line no-bitwise
|
|
30
|
+
(BigInt(long.readUInt32BE(4)) & BigInt(0xffffffff));
|
|
31
|
+
cur.pos += BigInt(8);
|
|
32
|
+
return u64;
|
|
33
|
+
}
|
|
34
|
+
exports.readU64 = readU64;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Codec } from 'remotion';
|
|
1
|
+
import type { Codec } from 'remotion';
|
|
2
2
|
export declare const getAudioCodecName: (codec: Codec) => string | null;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import type { BrowserExecutable } from 'remotion';
|
|
2
|
+
import type { Browser } from './browser/Browser';
|
|
3
|
+
import type { Page } from './browser/Page';
|
|
4
|
+
import type { ChromiumOptions } from './open-browser';
|
|
4
5
|
export declare const getPageAndCleanupFn: ({ passedInInstance, browserExecutable, chromiumOptions, }: {
|
|
5
6
|
passedInInstance: Browser | undefined;
|
|
6
7
|
browserExecutable: BrowserExecutable | null;
|
package/dist/get-codec-name.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Codec } from 'remotion';
|
|
1
|
+
import type { Codec } from 'remotion';
|
|
2
2
|
export declare const getCodecName: (codec: Codec) => string | null;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { ChromiumOptions } from './open-browser';
|
|
1
|
+
import type { BrowserExecutable, FfmpegExecutable, TCompMetadata } from 'remotion';
|
|
2
|
+
import type { BrowserLog } from './browser-log';
|
|
3
|
+
import type { Browser } from './browser/Browser';
|
|
4
|
+
import type { ChromiumOptions } from './open-browser';
|
|
5
5
|
declare type GetCompositionsConfig = {
|
|
6
6
|
inputProps?: object | null;
|
|
7
7
|
envVariables?: Record<string, string>;
|
package/dist/get-compositions.js
CHANGED
|
@@ -14,8 +14,8 @@ const innerGetCompositions = async (serveUrl, page, config, proxyPort) => {
|
|
|
14
14
|
var _a;
|
|
15
15
|
(_a = config.onBrowserLog) === null || _a === void 0 ? void 0 : _a.call(config, {
|
|
16
16
|
stackTrace: log.stackTrace(),
|
|
17
|
-
text: log.text
|
|
18
|
-
type: log.type
|
|
17
|
+
text: log.text,
|
|
18
|
+
type: log.type,
|
|
19
19
|
});
|
|
20
20
|
});
|
|
21
21
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { FrameRange } from 'remotion';
|
|
1
|
+
import type { FrameRange } from 'remotion';
|
|
2
2
|
export declare const getDurationFromFrameRange: (frameRange: FrameRange | null, durationInFrames: number) => number;
|