@remotion/renderer 3.0.30 → 3.0.31
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/download-and-map-assets-to-file.js +6 -3
- package/dist/browser/{page.d.ts → Page.d.ts} +0 -0
- package/dist/browser/{page.js → Page.js} +0 -0
- package/dist/browser/ws.d.ts +287 -0
- package/dist/browser/ws.js +21 -0
- package/dist/cancel.d.ts +7 -0
- package/dist/cancel.js +25 -0
- package/dist/codec-supports-media.d.ts +7 -0
- package/dist/codec-supports-media.js +49 -0
- package/dist/ensure-faststart.d.ts +1 -0
- package/dist/ensure-faststart.js +14 -0
- 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/guess-extension-for-media.d.ts +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/offthread/index.d.ts +0 -0
- package/dist/offthread/index.js +1 -0
- package/dist/render-gif.d.ts +2 -0
- package/dist/render-gif.js +242 -0
- package/dist/render-media.d.ts +1 -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/validate-offthreadvideo-image-format.d.ts +1 -0
- package/dist/validate-offthreadvideo-image-format.js +15 -0
- package/dist/ws/buffer-util.d.ts +10 -0
- package/dist/ws/buffer-util.js +123 -0
- package/dist/ws/constants.d.ts +10 -0
- package/dist/ws/constants.js +13 -0
- package/dist/ws/event-target.d.ts +155 -0
- package/dist/ws/event-target.js +203 -0
- package/dist/ws/extension.d.ts +16 -0
- package/dist/ws/extension.js +232 -0
- package/dist/ws/limiter.d.ts +34 -0
- package/dist/ws/limiter.js +41 -0
- package/dist/ws/permessage_deflate.d.ts +152 -0
- package/dist/ws/permessage_deflate.js +409 -0
- package/package.json +3 -3
- 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-format-for-codec.d.ts +0 -2
- package/dist/get-format-for-codec.js +0 -34
- 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
|
@@ -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 +1 @@
|
|
|
1
|
-
export declare const guessExtensionForVideo: (src: string) => Promise<"mp3" | "
|
|
1
|
+
export declare const guessExtensionForVideo: (src: string) => Promise<"mp3" | "wav" | "webm" | "mp4">;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
1
2
|
import execa from 'execa';
|
|
2
3
|
import { SymbolicateableError } from './error-handling/symbolicateable-error';
|
|
3
4
|
import { mimeContentType, mimeLookup } from './mime-types';
|
|
@@ -54,7 +55,7 @@ export declare const RenderInternals: {
|
|
|
54
55
|
task: Promise<Buffer | null>;
|
|
55
56
|
getLogs: () => string;
|
|
56
57
|
}>;
|
|
57
|
-
getFileExtensionFromCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv", type: "chunk" | "final") => "mp3" | "aac" | "wav" | "
|
|
58
|
+
getFileExtensionFromCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv", type: "chunk" | "final") => "mp3" | "aac" | "wav" | "webm" | "mp4" | "mov" | "mkv";
|
|
58
59
|
tmpDir: (str: string) => string;
|
|
59
60
|
deleteDirectory: (directory: string) => Promise<void>;
|
|
60
61
|
isServeUrl: (potentialUrl: string) => boolean;
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { RenderMediaOptions } from './render-media';
|
|
2
|
+
export declare const renderGif: ({ parallelism, proResProfile, crf, composition, imageFormat, ffmpegExecutable, inputProps, pixelFormat, codec, envVariables, quality, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, loop, skipNFrames, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, ...options }: RenderMediaOptions) => Promise<void>;
|
|
@@ -0,0 +1,242 @@
|
|
|
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.renderGif = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const remotion_1 = require("remotion");
|
|
11
|
+
const can_use_parallel_encoding_1 = require("./can-use-parallel-encoding");
|
|
12
|
+
const ensure_frames_in_order_1 = require("./ensure-frames-in-order");
|
|
13
|
+
const ensure_output_directory_1 = require("./ensure-output-directory");
|
|
14
|
+
const get_duration_from_frame_range_1 = require("./get-duration-from-frame-range");
|
|
15
|
+
const get_extension_from_codec_1 = require("./get-extension-from-codec");
|
|
16
|
+
const get_extension_of_filename_1 = require("./get-extension-of-filename");
|
|
17
|
+
const get_frame_to_render_1 = require("./get-frame-to-render");
|
|
18
|
+
const legacy_webpack_config_1 = require("./legacy-webpack-config");
|
|
19
|
+
const make_cancel_signal_1 = require("./make-cancel-signal");
|
|
20
|
+
const prespawn_ffmpeg_1 = require("./prespawn-ffmpeg");
|
|
21
|
+
const render_frames_1 = require("./render-frames");
|
|
22
|
+
const stitch_frames_to_gif_1 = require("./stitch-frames-to-gif");
|
|
23
|
+
const tmp_dir_1 = require("./tmp-dir");
|
|
24
|
+
const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
|
|
25
|
+
const validate_output_filename_1 = require("./validate-output-filename");
|
|
26
|
+
const validate_scale_1 = require("./validate-scale");
|
|
27
|
+
const renderGif = ({ parallelism, proResProfile, crf, composition, imageFormat, ffmpegExecutable, inputProps, pixelFormat, codec, envVariables, quality, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, loop, skipNFrames, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, ...options }) => {
|
|
28
|
+
remotion_1.Internals.validateQuality(quality);
|
|
29
|
+
if (typeof crf !== 'undefined' && crf !== null) {
|
|
30
|
+
remotion_1.Internals.validateSelectedCrfAndCodecCombination(crf, codec);
|
|
31
|
+
}
|
|
32
|
+
(0, validate_output_filename_1.validateOutputFilename)(codec, (0, get_extension_of_filename_1.getExtensionOfFilename)(outputLocation));
|
|
33
|
+
(0, validate_scale_1.validateScale)(scale);
|
|
34
|
+
const serveUrl = (0, legacy_webpack_config_1.getServeUrlWithFallback)(options);
|
|
35
|
+
let stitchStage = 'encoding';
|
|
36
|
+
let stitcherFfmpeg;
|
|
37
|
+
let preStitcher = null;
|
|
38
|
+
let encodedFrames = 0;
|
|
39
|
+
let renderedFrames = 0;
|
|
40
|
+
let renderedDoneIn = null;
|
|
41
|
+
let encodedDoneIn = null;
|
|
42
|
+
let cancelled = false;
|
|
43
|
+
const renderStart = Date.now();
|
|
44
|
+
const tmpdir = (0, tmp_dir_1.tmpDir)('pre-encode');
|
|
45
|
+
const parallelEncoding = (0, can_use_parallel_encoding_1.canUseParallelEncoding)(codec);
|
|
46
|
+
const actualImageFormat = imageFormat !== null && imageFormat !== void 0 ? imageFormat : 'jpeg';
|
|
47
|
+
const preEncodedFileLocation = parallelEncoding
|
|
48
|
+
? path_1.default.join(tmpdir, 'pre-encode.' + (0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec, 'chunk'))
|
|
49
|
+
: null;
|
|
50
|
+
const outputDir = parallelEncoding
|
|
51
|
+
? null
|
|
52
|
+
: fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'react-motion-render'));
|
|
53
|
+
(0, validate_even_dimensions_with_codec_1.validateEvenDimensionsWithCodec)({
|
|
54
|
+
codec,
|
|
55
|
+
height: composition.height,
|
|
56
|
+
scale: scale !== null && scale !== void 0 ? scale : 1,
|
|
57
|
+
width: composition.width,
|
|
58
|
+
});
|
|
59
|
+
const callUpdate = () => {
|
|
60
|
+
onProgress === null || onProgress === void 0 ? void 0 : onProgress({
|
|
61
|
+
encodedDoneIn,
|
|
62
|
+
encodedFrames,
|
|
63
|
+
renderedDoneIn,
|
|
64
|
+
renderedFrames,
|
|
65
|
+
stitchStage,
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
const realFrameRange = (0, get_frame_to_render_1.getRealFrameRange)(composition.durationInFrames, frameRange !== null && frameRange !== void 0 ? frameRange : null);
|
|
69
|
+
const cancelRenderFrames = (0, make_cancel_signal_1.makeCancelSignal)();
|
|
70
|
+
const cancelPrestitcher = (0, make_cancel_signal_1.makeCancelSignal)();
|
|
71
|
+
const cancelStitcher = (0, make_cancel_signal_1.makeCancelSignal)();
|
|
72
|
+
cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
|
|
73
|
+
cancelRenderFrames.cancel();
|
|
74
|
+
});
|
|
75
|
+
const { waitForRightTimeOfFrameToBeInserted, setFrameToStitch, waitForFinish } = (0, ensure_frames_in_order_1.ensureFramesInOrder)(realFrameRange);
|
|
76
|
+
const actualGifFps = Math.floor(composition.fps / (skipNFrames + 1));
|
|
77
|
+
const createPrestitcherIfNecessary = async () => {
|
|
78
|
+
if (preEncodedFileLocation) {
|
|
79
|
+
preStitcher = await (0, prespawn_ffmpeg_1.prespawnFfmpeg)({
|
|
80
|
+
width: composition.width * (scale !== null && scale !== void 0 ? scale : 1),
|
|
81
|
+
height: composition.height * (scale !== null && scale !== void 0 ? scale : 1),
|
|
82
|
+
fps: actualGifFps,
|
|
83
|
+
outputLocation: preEncodedFileLocation,
|
|
84
|
+
pixelFormat,
|
|
85
|
+
codec,
|
|
86
|
+
proResProfile,
|
|
87
|
+
crf,
|
|
88
|
+
onProgress: (frame) => {
|
|
89
|
+
encodedFrames = frame;
|
|
90
|
+
callUpdate();
|
|
91
|
+
},
|
|
92
|
+
verbose: remotion_1.Internals.Logging.isEqualOrBelowLogLevel(remotion_1.Internals.Logging.getLogLevel(), 'verbose'),
|
|
93
|
+
ffmpegExecutable,
|
|
94
|
+
imageFormat: actualImageFormat,
|
|
95
|
+
signal: cancelPrestitcher.cancelSignal,
|
|
96
|
+
});
|
|
97
|
+
stitcherFfmpeg = preStitcher.task;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const waitForPrestitcherIfNecessary = async () => {
|
|
101
|
+
var _a;
|
|
102
|
+
if (stitcherFfmpeg) {
|
|
103
|
+
await waitForFinish();
|
|
104
|
+
(_a = stitcherFfmpeg === null || stitcherFfmpeg === void 0 ? void 0 : stitcherFfmpeg.stdin) === null || _a === void 0 ? void 0 : _a.end();
|
|
105
|
+
try {
|
|
106
|
+
await stitcherFfmpeg;
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
throw new Error(preStitcher === null || preStitcher === void 0 ? void 0 : preStitcher.getLogs());
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
const happyPath = createPrestitcherIfNecessary()
|
|
114
|
+
.then(() => {
|
|
115
|
+
const renderFramesProc = (0, render_frames_1.renderFrames)({
|
|
116
|
+
config: composition,
|
|
117
|
+
onFrameUpdate: (frame) => {
|
|
118
|
+
stitchStage = 'gif';
|
|
119
|
+
renderedFrames = frame;
|
|
120
|
+
callUpdate();
|
|
121
|
+
},
|
|
122
|
+
parallelism,
|
|
123
|
+
outputDir,
|
|
124
|
+
skipNFrames,
|
|
125
|
+
onStart: (data) => {
|
|
126
|
+
renderedFrames = 0;
|
|
127
|
+
callUpdate();
|
|
128
|
+
onStart === null || onStart === void 0 ? void 0 : onStart(data);
|
|
129
|
+
},
|
|
130
|
+
inputProps,
|
|
131
|
+
envVariables,
|
|
132
|
+
imageFormat: actualImageFormat,
|
|
133
|
+
quality,
|
|
134
|
+
frameRange: frameRange !== null && frameRange !== void 0 ? frameRange : null,
|
|
135
|
+
puppeteerInstance,
|
|
136
|
+
onFrameBuffer: parallelEncoding
|
|
137
|
+
? async (buffer, frame) => {
|
|
138
|
+
var _a;
|
|
139
|
+
await waitForRightTimeOfFrameToBeInserted(frame);
|
|
140
|
+
if (cancelled) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
(_a = stitcherFfmpeg === null || stitcherFfmpeg === void 0 ? void 0 : stitcherFfmpeg.stdin) === null || _a === void 0 ? void 0 : _a.write(buffer);
|
|
144
|
+
setFrameToStitch(frame + 1);
|
|
145
|
+
}
|
|
146
|
+
: undefined,
|
|
147
|
+
serveUrl,
|
|
148
|
+
dumpBrowserLogs,
|
|
149
|
+
onBrowserLog,
|
|
150
|
+
onDownload,
|
|
151
|
+
timeoutInMilliseconds,
|
|
152
|
+
chromiumOptions,
|
|
153
|
+
scale,
|
|
154
|
+
ffmpegExecutable,
|
|
155
|
+
browserExecutable,
|
|
156
|
+
port,
|
|
157
|
+
cancelSignal: cancelRenderFrames.cancelSignal,
|
|
158
|
+
});
|
|
159
|
+
return renderFramesProc;
|
|
160
|
+
})
|
|
161
|
+
.then((renderFramesReturn) => {
|
|
162
|
+
return Promise.all([renderFramesReturn, waitForPrestitcherIfNecessary()]);
|
|
163
|
+
})
|
|
164
|
+
.then(([{ assetsInfo }]) => {
|
|
165
|
+
renderedDoneIn = Date.now() - renderStart;
|
|
166
|
+
callUpdate();
|
|
167
|
+
(0, ensure_output_directory_1.ensureOutputDirectory)(outputLocation);
|
|
168
|
+
const stitchStart = Date.now();
|
|
169
|
+
return Promise.all([
|
|
170
|
+
(0, stitch_frames_to_gif_1.stitchFramesToGif)({
|
|
171
|
+
width: composition.width * (scale !== null && scale !== void 0 ? scale : 1),
|
|
172
|
+
height: composition.height * (scale !== null && scale !== void 0 ? scale : 1),
|
|
173
|
+
fps: actualGifFps,
|
|
174
|
+
outputLocation,
|
|
175
|
+
internalOptions: {
|
|
176
|
+
preEncodedFileLocation,
|
|
177
|
+
imageFormat: actualImageFormat,
|
|
178
|
+
},
|
|
179
|
+
force: overwrite !== null && overwrite !== void 0 ? overwrite : remotion_1.Internals.DEFAULT_OVERWRITE,
|
|
180
|
+
pixelFormat,
|
|
181
|
+
codec,
|
|
182
|
+
proResProfile,
|
|
183
|
+
crf,
|
|
184
|
+
loop,
|
|
185
|
+
assetsInfo,
|
|
186
|
+
ffmpegExecutable,
|
|
187
|
+
onProgress: (frame) => {
|
|
188
|
+
stitchStage = 'gif';
|
|
189
|
+
encodedFrames = frame;
|
|
190
|
+
callUpdate();
|
|
191
|
+
},
|
|
192
|
+
verbose: remotion_1.Internals.Logging.isEqualOrBelowLogLevel(remotion_1.Internals.Logging.getLogLevel(), 'verbose'),
|
|
193
|
+
dir: outputDir !== null && outputDir !== void 0 ? outputDir : undefined,
|
|
194
|
+
cancelSignal: cancelStitcher.cancelSignal,
|
|
195
|
+
}),
|
|
196
|
+
stitchStart,
|
|
197
|
+
]);
|
|
198
|
+
})
|
|
199
|
+
.then(([, stitchStart]) => {
|
|
200
|
+
encodedFrames = (0, get_duration_from_frame_range_1.getDurationFromFrameRange)(frameRange !== null && frameRange !== void 0 ? frameRange : null, composition.durationInFrames, skipNFrames);
|
|
201
|
+
encodedDoneIn = Date.now() - stitchStart;
|
|
202
|
+
callUpdate();
|
|
203
|
+
})
|
|
204
|
+
.catch((err) => {
|
|
205
|
+
/**
|
|
206
|
+
* When an error is thrown in renderFrames(...) (e.g., when delayRender() is used incorrectly), fs.unlinkSync(...) throws an error that the file is locked because ffmpeg is still running, and renderMedia returns it.
|
|
207
|
+
* Therefore we first kill the FFMPEG process before deleting the file
|
|
208
|
+
*/
|
|
209
|
+
cancelled = true;
|
|
210
|
+
cancelRenderFrames.cancel();
|
|
211
|
+
cancelStitcher.cancel();
|
|
212
|
+
cancelPrestitcher.cancel();
|
|
213
|
+
if (stitcherFfmpeg !== undefined && stitcherFfmpeg.exitCode === null) {
|
|
214
|
+
const promise = new Promise((resolve) => {
|
|
215
|
+
setTimeout(() => {
|
|
216
|
+
resolve();
|
|
217
|
+
}, 2000);
|
|
218
|
+
stitcherFfmpeg.on('close', resolve);
|
|
219
|
+
});
|
|
220
|
+
stitcherFfmpeg.kill();
|
|
221
|
+
return promise.then(() => {
|
|
222
|
+
throw err;
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
throw err;
|
|
226
|
+
})
|
|
227
|
+
.finally(() => {
|
|
228
|
+
if (preEncodedFileLocation !== null &&
|
|
229
|
+
fs_1.default.existsSync(preEncodedFileLocation)) {
|
|
230
|
+
fs_1.default.unlinkSync(preEncodedFileLocation);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
return Promise.race([
|
|
234
|
+
happyPath,
|
|
235
|
+
new Promise((_resolve, reject) => {
|
|
236
|
+
cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
|
|
237
|
+
reject(new Error('renderMedia() got cancelled'));
|
|
238
|
+
});
|
|
239
|
+
}),
|
|
240
|
+
]);
|
|
241
|
+
};
|
|
242
|
+
exports.renderGif = renderGif;
|
package/dist/render-media.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
1
2
|
import type { BrowserExecutable, Codec, FfmpegExecutable, FrameRange, PixelFormat, ProResProfile, SmallTCompMetadata } from 'remotion';
|
|
2
3
|
import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
|
|
3
4
|
import type { BrowserLog } from './browser-log';
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { StitcherOptions } from './stitch-frames-to-video';
|
|
2
|
+
declare type ReturnType = {
|
|
3
|
+
task: Promise<unknown>;
|
|
4
|
+
getLogs: () => string;
|
|
5
|
+
};
|
|
6
|
+
export declare const spawnFfmpeg: (options: StitcherOptions) => Promise<ReturnType>;
|
|
7
|
+
export declare const stitchFramesToGif: (options: StitcherOptions) => Promise<void>;
|
|
8
|
+
export {};
|