@remotion/web-renderer 4.0.402 → 4.0.404

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.
@@ -0,0 +1,9 @@
1
+ import { type WebRendererAudioCodec, type WebRendererContainer, type WebRendererQuality, type WebRendererVideoCodec } from './mediabunny-mappings';
2
+ export type GetEncodableVideoCodecsOptions = {
3
+ videoBitrate?: number | WebRendererQuality;
4
+ };
5
+ export type GetEncodableAudioCodecsOptions = {
6
+ audioBitrate?: number | WebRendererQuality;
7
+ };
8
+ export declare const getEncodableVideoCodecs: (container: WebRendererContainer, options?: GetEncodableVideoCodecsOptions | undefined) => Promise<WebRendererVideoCodec[]>;
9
+ export declare const getEncodableAudioCodecs: (container: WebRendererContainer, options?: GetEncodableAudioCodecsOptions | undefined) => Promise<WebRendererAudioCodec[]>;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,11 @@
1
1
  import './symbol-dispose';
2
2
  export type { EmittedArtifact, WebRendererOnArtifact } from './artifact';
3
+ export { canRenderMediaOnWeb } from './can-render-media-on-web';
4
+ export type { CanRenderIssue, CanRenderMediaOnWebOptions, CanRenderMediaOnWebResult, } from './can-render-media-on-web';
3
5
  export type { FrameRange } from './frame-range';
4
- export type { WebRendererContainer, WebRendererQuality, WebRendererVideoCodec, } from './mediabunny-mappings';
6
+ export { getEncodableAudioCodecs, getEncodableVideoCodecs, type GetEncodableAudioCodecsOptions, type GetEncodableVideoCodecsOptions, } from './get-encodable-codecs';
7
+ export { getDefaultAudioCodecForContainer, getDefaultVideoCodecForContainer, getSupportedAudioCodecsForContainer, getSupportedVideoCodecsForContainer, } from './mediabunny-mappings';
8
+ export type { WebRendererAudioCodec, WebRendererContainer, WebRendererQuality, WebRendererVideoCodec, } from './mediabunny-mappings';
5
9
  export type { WebRendererOutputTarget } from './output-target';
6
10
  export { renderMediaOnWeb } from './render-media-on-web';
7
11
  export type { RenderMediaOnWebOptions, RenderMediaOnWebProgress, RenderMediaOnWebProgressCallback, RenderMediaOnWebResult, } from './render-media-on-web';
@@ -6,7 +6,8 @@ type HelperCanvas = {
6
6
  aPosition: number;
7
7
  aTexCoord: number;
8
8
  uTransform: WebGLUniformLocation | null;
9
- uProjection: WebGLUniformLocation | null;
9
+ uResolution: WebGLUniformLocation | null;
10
+ uOffset: WebGLUniformLocation | null;
10
11
  uTexture: WebGLUniformLocation | null;
11
12
  };
12
13
  cleanup: () => void;
@@ -2,9 +2,14 @@ import type { Quality } from 'mediabunny';
2
2
  import { type OutputFormat } from 'mediabunny';
3
3
  export type WebRendererVideoCodec = 'h264' | 'h265' | 'vp8' | 'vp9' | 'av1';
4
4
  export type WebRendererContainer = 'mp4' | 'webm';
5
+ export type WebRendererAudioCodec = 'aac' | 'opus';
5
6
  export type WebRendererQuality = 'very-low' | 'low' | 'medium' | 'high' | 'very-high';
6
7
  export declare const codecToMediabunnyCodec: (codec: WebRendererVideoCodec) => "av1" | "avc" | "hevc" | "vp8" | "vp9";
7
8
  export declare const containerToMediabunnyContainer: (container: WebRendererContainer) => OutputFormat;
8
9
  export declare const getDefaultVideoCodecForContainer: (container: WebRendererContainer) => WebRendererVideoCodec;
9
10
  export declare const getQualityForWebRendererQuality: (quality: WebRendererQuality) => Quality;
10
11
  export declare const getMimeType: (container: WebRendererContainer) => string;
12
+ export declare const getDefaultAudioCodecForContainer: (container: WebRendererContainer) => WebRendererAudioCodec;
13
+ export declare const getSupportedVideoCodecsForContainer: (container: WebRendererContainer) => WebRendererVideoCodec[];
14
+ export declare const getSupportedAudioCodecsForContainer: (container: WebRendererContainer) => WebRendererAudioCodec[];
15
+ export declare const audioCodecToMediabunnyAudioCodec: (audioCodec: WebRendererAudioCodec) => "aac" | "alaw" | "flac" | "mp3" | "opus" | "pcm-f32" | "pcm-f32be" | "pcm-f64" | "pcm-f64be" | "pcm-s16" | "pcm-s16be" | "pcm-s24" | "pcm-s24be" | "pcm-s32" | "pcm-s32be" | "pcm-s8" | "pcm-u8" | "ulaw" | "vorbis";
@@ -3,7 +3,7 @@ import type { AnyZodObject, z } from 'zod';
3
3
  import { type WebRendererOnArtifact } from './artifact';
4
4
  import { type FrameRange } from './frame-range';
5
5
  import type { InternalState } from './internal-state';
6
- import type { WebRendererContainer, WebRendererQuality } from './mediabunny-mappings';
6
+ import type { WebRendererAudioCodec, WebRendererContainer, WebRendererQuality } from './mediabunny-mappings';
7
7
  import { type WebRendererVideoCodec } from './mediabunny-mappings';
8
8
  import type { WebRendererOutputTarget } from './output-target';
9
9
  import type { CompositionCalculateMetadataOrExplicit } from './props-if-has-props';
@@ -35,6 +35,8 @@ type OptionalRenderMediaOnWebOptions<Schema extends AnyZodObject> = {
35
35
  schema: Schema | undefined;
36
36
  mediaCacheSizeInBytes: number | null;
37
37
  videoCodec: WebRendererVideoCodec;
38
+ audioCodec: WebRendererAudioCodec | null;
39
+ audioBitrate: number | WebRendererQuality;
38
40
  container: WebRendererContainer;
39
41
  signal: AbortSignal | null;
40
42
  onProgress: RenderMediaOnWebProgressCallback | null;
@@ -0,0 +1,119 @@
1
+ /** Image format for encoded screenshot output. */
2
+ export type ImageFormat = 'png' | 'jpeg' | 'webp';
3
+ /** Options for rendering a screenshot to canvas. */
4
+ export interface RenderOptions {
5
+ /**
6
+ * Canvas background color. Set to `null` (or omit) for a transparent canvas.
7
+ * When provided, the string is passed directly to `fillStyle`.
8
+ */
9
+ backgroundColor?: string | null;
10
+ /**
11
+ * Optional existing canvas to render into.
12
+ * When omitted, a new canvas element is created.
13
+ */
14
+ canvas?: HTMLCanvasElement;
15
+ /**
16
+ * Rendering scale factor. Defaults to `window.devicePixelRatio` (or `1`).
17
+ */
18
+ scale?: number;
19
+ /**
20
+ * Crop origin X (CSS pixels) relative to the element's left edge.
21
+ * Defaults to the element's left edge.
22
+ */
23
+ x?: number;
24
+ /**
25
+ * Crop origin Y (CSS pixels) relative to the element's top edge.
26
+ * Defaults to the element's top edge.
27
+ */
28
+ y?: number;
29
+ /**
30
+ * Output width in CSS pixels. Defaults to the element's width.
31
+ */
32
+ width?: number;
33
+ /**
34
+ * Output height in CSS pixels. Defaults to the element's height.
35
+ */
36
+ height?: number;
37
+ /**
38
+ * Controls how `position: fixed` elements outside the captured subtree are
39
+ * handled.
40
+ *
41
+ * - `none` – ignore all fixed elements outside `element`.
42
+ * - `intersecting` – include fixed elements whose bounding rect intersects the capture rect.
43
+ * - `all` – include all fixed elements that overlap the viewport.
44
+ */
45
+ includeFixed?: 'none' | 'intersecting' | 'all';
46
+ }
47
+ /** Options for encoding a canvas to an image format. */
48
+ export interface EncodeOptions {
49
+ /**
50
+ * Image format to encode. Defaults to `'png'`.
51
+ */
52
+ format?: ImageFormat;
53
+ /**
54
+ * Image quality for lossy formats (`jpeg`, `webp`). A number between `0` and `1`.
55
+ * Ignored for `png`. Defaults to `0.92`.
56
+ */
57
+ quality?: number;
58
+ }
59
+ /** Combined options for one-shot screenshot methods that render and encode. */
60
+ export type ScreenshotOptions = RenderOptions & EncodeOptions;
61
+ /**
62
+ * A promise-like object representing a screenshot capture. The underlying
63
+ * render happens once; subsequent calls to `.canvas()`, `.blob()`, or `.url()`
64
+ * reuse the same rendered canvas.
65
+ */
66
+ export interface ScreenshotTask extends Promise<HTMLCanvasElement> {
67
+ /** Returns the rendered canvas. */
68
+ canvas(): Promise<HTMLCanvasElement>;
69
+ /** Encodes the rendered canvas to a Blob. */
70
+ blob(options?: EncodeOptions): Promise<Blob>;
71
+ /**
72
+ * Encodes the rendered canvas to a Blob and creates an object URL.
73
+ * Remember to call `URL.revokeObjectURL(url)` when done to avoid memory leaks.
74
+ */
75
+ url(options?: EncodeOptions): Promise<string>;
76
+ }
77
+ /**
78
+ * Renders a DOM element into a canvas using modern browser features.
79
+ *
80
+ * Returns a `ScreenshotTask` that is both a Promise and provides methods
81
+ * to encode the rendered canvas. The underlying render happens once;
82
+ * subsequent calls to `.canvas()`, `.blob()`, or `.url()` reuse the same result.
83
+ *
84
+ * This implementation targets evergreen browsers only and assumes a real DOM +
85
+ * Canvas2D environment (not Node.js).
86
+ *
87
+ * @example
88
+ * // Capture handle pattern - render once, encode multiple ways
89
+ * const shot = screenshot(element, { scale: 2 })
90
+ * const canvas = await shot.canvas()
91
+ * const pngBlob = await shot.blob({ format: 'png' })
92
+ * const webpUrl = await shot.url({ format: 'webp', quality: 0.9 })
93
+ *
94
+ * @example
95
+ * // Direct await returns the canvas
96
+ * const canvas = await screenshot(element)
97
+ *
98
+ * @example
99
+ * // One-shot convenience methods
100
+ * const canvas = await screenshot.canvas(element, { scale: 2 })
101
+ * const blob = await screenshot.blob(element, { format: 'jpeg', quality: 0.85 })
102
+ * const url = await screenshot.url(element, { format: 'png' })
103
+ */
104
+ declare function screenshot(target: Element | string, options?: RenderOptions): ScreenshotTask;
105
+ declare namespace screenshot {
106
+ var canvas: (target: string | Element, options?: RenderOptions | undefined) => Promise<HTMLCanvasElement>;
107
+ }
108
+ declare namespace screenshot {
109
+ var blob: (target: string | Element, options?: ScreenshotOptions | undefined) => Promise<Blob>;
110
+ }
111
+ declare namespace screenshot {
112
+ var url: (target: string | Element, options?: ScreenshotOptions | undefined) => Promise<string>;
113
+ }
114
+ export { screenshot };
115
+ declare global {
116
+ interface CanvasRenderingContext2D {
117
+ _filterPolyfillValue?: string;
118
+ }
119
+ }
@@ -0,0 +1,13 @@
1
+ import { type Quality } from 'mediabunny';
2
+ import type { CanRenderIssue } from './can-render-types';
3
+ import { type WebRendererAudioCodec, type WebRendererContainer } from './mediabunny-mappings';
4
+ export type ResolveAudioCodecResult = {
5
+ codec: WebRendererAudioCodec | null;
6
+ issues: CanRenderIssue[];
7
+ };
8
+ export declare const resolveAudioCodec: (options: {
9
+ container: WebRendererContainer;
10
+ requestedCodec: WebRendererAudioCodec | null | undefined;
11
+ userSpecifiedAudioCodec: boolean;
12
+ bitrate: number | Quality;
13
+ }) => Promise<ResolveAudioCodecResult>;
@@ -0,0 +1,7 @@
1
+ import type { CanRenderIssue } from './can-render-types';
2
+ import type { WebRendererVideoCodec } from './mediabunny-mappings';
3
+ export declare const validateDimensions: (options: {
4
+ width: number;
5
+ height: number;
6
+ codec: WebRendererVideoCodec;
7
+ }) => CanRenderIssue | null;
@@ -1,5 +1,6 @@
1
1
  import type { DelayRenderScope } from 'remotion';
2
- export declare const waitForReady: ({ timeoutInMilliseconds, scope, signal, apiName, internalState, }: {
2
+ import type { BackgroundKeepalive } from './background-keepalive';
3
+ export declare const waitForReady: ({ timeoutInMilliseconds, scope, signal, apiName, internalState, keepalive, }: {
3
4
  timeoutInMilliseconds: number;
4
5
  scope: DelayRenderScope;
5
6
  signal: AbortSignal | null;
@@ -22,4 +23,5 @@ export declare const waitForReady: ({ timeoutInMilliseconds, scope, signal, apiN
22
23
  getAudioMixingTime: () => number;
23
24
  addAudioMixingTime: (time: number) => void;
24
25
  } | null;
26
+ keepalive: BackgroundKeepalive | null;
25
27
  }) => Promise<void>;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/web-renderer"
4
4
  },
5
5
  "name": "@remotion/web-renderer",
6
- "version": "4.0.402",
6
+ "version": "4.0.404",
7
7
  "main": "dist/index.js",
8
8
  "type": "module",
9
9
  "sideEffects": false,
@@ -18,14 +18,14 @@
18
18
  "author": "Remotion <jonny@remotion.dev>",
19
19
  "license": "UNLICENSED",
20
20
  "dependencies": {
21
- "@remotion/licensing": "4.0.402",
22
- "remotion": "4.0.402",
21
+ "@remotion/licensing": "4.0.404",
22
+ "remotion": "4.0.404",
23
23
  "mediabunny": "1.27.3"
24
24
  },
25
25
  "devDependencies": {
26
- "@remotion/eslint-config-internal": "4.0.402",
27
- "@remotion/player": "4.0.402",
28
- "@remotion/media": "4.0.402",
26
+ "@remotion/eslint-config-internal": "4.0.404",
27
+ "@remotion/player": "4.0.404",
28
+ "@remotion/media": "4.0.404",
29
29
  "@typescript/native-preview": "7.0.0-dev.20260105.1",
30
30
  "@vitejs/plugin-react": "4.1.0",
31
31
  "@vitest/browser-playwright": "4.0.9",