@remotion/renderer
Version:
Render Remotion videos using Node.js or Bun
51 lines (50 loc) • 2.24 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.renderPartitions = void 0;
const renderPartitions = ({ frames, concurrency, }) => {
const partitions = [];
let start = 0;
for (let i = 0; i < concurrency; i++) {
const end = start + Math.ceil((frames.length - start) / (concurrency - i));
partitions.push(frames.slice(start, end));
start = end;
}
return {
partitions,
getNextFrame: (pageIndex) => {
if (partitions[pageIndex].length === 0) {
const partitionLengths = partitions.map((p) => p.length);
if (partitionLengths.every((p) => p === 0)) {
throw new Error('No more frames to render');
}
let longestRemainingPartitionIndex = -1;
for (let i = 0; i < partitions.length; i++) {
if (longestRemainingPartitionIndex === -1) {
longestRemainingPartitionIndex = i;
continue;
}
if (partitions[i].length >
partitions[longestRemainingPartitionIndex].length) {
longestRemainingPartitionIndex = i;
}
}
if (longestRemainingPartitionIndex === -1) {
throw new Error('No more frames to render');
}
// Round up - let's say only one frame is left to render, we should take this one
const slicePoint = Math.ceil(partitions[longestRemainingPartitionIndex].length / 2) -
// but don't forget it's zero indexed :)
1;
partitions[pageIndex] =
partitions[longestRemainingPartitionIndex].slice(slicePoint);
partitions[longestRemainingPartitionIndex] = partitions[longestRemainingPartitionIndex].slice(0, slicePoint);
}
const value = partitions[pageIndex].shift();
if (value === undefined) {
throw new Error('No more frames to render');
}
return value;
},
};
};
exports.renderPartitions = renderPartitions;