@revideo/2d 0.5.8-beta.1082 → 0.5.9-alpha.1086
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/editor/editor/tsconfig.build.tsbuildinfo +1 -1
- package/lib/components/Media.d.ts +1 -0
- package/lib/components/Media.d.ts.map +1 -1
- package/lib/components/Media.js +4 -1
- package/lib/components/Video.d.ts +2 -2
- package/lib/components/Video.d.ts.map +1 -1
- package/lib/components/Video.js +1 -1
- package/lib/scenes/Scene2D.d.ts.map +1 -1
- package/lib/scenes/Scene2D.js +3 -2
- package/lib/tsconfig.build.tsbuildinfo +1 -1
- package/lib/utils/video/ffmpeg-client.d.ts +1 -3
- package/lib/utils/video/ffmpeg-client.d.ts.map +1 -1
- package/lib/utils/video/ffmpeg-client.js +22 -35
- package/package.json +4 -4
- package/src/lib/components/Media.ts +4 -0
- package/src/lib/components/Video.ts +2 -2
- package/src/lib/scenes/Scene2D.ts +2 -1
- package/src/lib/utils/video/ffmpeg-client.ts +29 -43
|
@@ -1,45 +1,32 @@
|
|
|
1
1
|
export class ImageCommunication {
|
|
2
2
|
constructor() {
|
|
3
|
-
this.nextFrameHandlers = [];
|
|
4
3
|
if (!import.meta.hot) {
|
|
5
4
|
throw new Error('FfmpegVideoFrame can only be used with HMR.');
|
|
6
5
|
}
|
|
7
|
-
import.meta.hot.on('revideo:ffmpeg-decoder:video-frame-res', this.handler.bind(this));
|
|
8
|
-
}
|
|
9
|
-
handler(event) {
|
|
10
|
-
const handlers = this.nextFrameHandlers;
|
|
11
|
-
this.nextFrameHandlers = [];
|
|
12
|
-
for (const handler of handlers) {
|
|
13
|
-
handler(event);
|
|
14
|
-
}
|
|
15
6
|
}
|
|
16
7
|
async getFrame(id, src, time, duration, fps) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
this.nextFrameHandlers.push(handler);
|
|
33
|
-
import.meta.hot.send('revideo:ffmpeg-decoder:video-frame', {
|
|
34
|
-
data: {
|
|
35
|
-
id: id,
|
|
36
|
-
filePath: src,
|
|
37
|
-
startTime: time,
|
|
38
|
-
duration,
|
|
39
|
-
fps,
|
|
40
|
-
},
|
|
41
|
-
});
|
|
8
|
+
const response = await fetch('/revideo-ffmpeg-decoder/video-frame', {
|
|
9
|
+
method: 'POST',
|
|
10
|
+
headers: {
|
|
11
|
+
// eslint-disable-next-line
|
|
12
|
+
'Content-Type': 'application/json',
|
|
13
|
+
},
|
|
14
|
+
body: JSON.stringify({
|
|
15
|
+
id,
|
|
16
|
+
filePath: src,
|
|
17
|
+
startTime: time,
|
|
18
|
+
duration,
|
|
19
|
+
fps,
|
|
20
|
+
}),
|
|
42
21
|
});
|
|
22
|
+
if (!response.ok) {
|
|
23
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
24
|
+
}
|
|
25
|
+
const width = parseInt(response.headers.get('X-Frame-Width') || '1080', 10);
|
|
26
|
+
const height = parseInt(response.headers.get('X-Frame-Height') || '1920', 10);
|
|
27
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
28
|
+
const imageData = new ImageData(new Uint8ClampedArray(arrayBuffer), width, height);
|
|
29
|
+
return createImageBitmap(imageData);
|
|
43
30
|
}
|
|
44
31
|
}
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmZtcGVnLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdXRpbHMvdmlkZW8vZmZtcGVnLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCO1FBQ0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FDbkIsRUFBVSxFQUNWLEdBQVcsRUFDWCxJQUFZLEVBQ1osUUFBZ0IsRUFDaEIsR0FBVztRQUVYLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLHFDQUFxQyxFQUFFO1lBQ2xFLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFO2dCQUNQLDJCQUEyQjtnQkFDM0IsY0FBYyxFQUFFLGtCQUFrQjthQUNuQztZQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNuQixFQUFFO2dCQUNGLFFBQVEsRUFBRSxHQUFHO2dCQUNiLFNBQVMsRUFBRSxJQUFJO2dCQUNmLFFBQVE7Z0JBQ1IsR0FBRzthQUNKLENBQUM7U0FDSCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FDckIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxNQUFNLEVBQ2hELEVBQUUsQ0FDSCxDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQUcsTUFBTSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFakQsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQzdCLElBQUksaUJBQWlCLENBQUMsV0FBVyxDQUFDLEVBQ2xDLEtBQUssRUFDTCxNQUFNLENBQ1AsQ0FBQztRQUVGLE9BQU8saUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNGIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@revideo/2d",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.9-alpha.1086+9e6dd0dd",
|
|
4
4
|
"description": "A 2D renderer for revideo",
|
|
5
5
|
"author": "revideo",
|
|
6
6
|
"homepage": "https://re.video/",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@preact/signals": "^1.2.1",
|
|
32
32
|
"@revideo/internal": "^0.0.0",
|
|
33
|
-
"@revideo/ui": "^0.5.
|
|
33
|
+
"@revideo/ui": "^0.5.9-alpha.1086+9e6dd0dd",
|
|
34
34
|
"clsx": "^2.0.0",
|
|
35
35
|
"jsdom": "^22.1.0",
|
|
36
36
|
"preact": "^10.19.2",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"@codemirror/language": "^6.10.1",
|
|
41
41
|
"@lezer/common": "^1.2.1",
|
|
42
42
|
"@lezer/highlight": "^1.2.0",
|
|
43
|
-
"@revideo/core": "^0.5.
|
|
43
|
+
"@revideo/core": "^0.5.9-alpha.1086+9e6dd0dd",
|
|
44
44
|
"@rive-app/canvas-advanced": "2.7.3",
|
|
45
45
|
"code-fns": "^0.8.2",
|
|
46
46
|
"hls.js": "^1.5.11",
|
|
@@ -48,5 +48,5 @@
|
|
|
48
48
|
"mp4box": "^0.5.2",
|
|
49
49
|
"parse-svg-path": "^0.1.2"
|
|
50
50
|
},
|
|
51
|
-
"gitHead": "
|
|
51
|
+
"gitHead": "9e6dd0dd6df36e20bfa983eab0d9267e4f518fc1"
|
|
52
52
|
}
|
|
@@ -197,7 +197,7 @@ export class Video extends Media {
|
|
|
197
197
|
return video;
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
protected lastFrame:
|
|
200
|
+
protected lastFrame: ImageBitmap | null = null;
|
|
201
201
|
|
|
202
202
|
protected async webcodecSeekedVideo(): Promise<CanvasImageSource> {
|
|
203
203
|
const video = this.video();
|
|
@@ -213,7 +213,7 @@ export class Video extends Media {
|
|
|
213
213
|
return getFrame(this.key, video.src, time, fps);
|
|
214
214
|
}
|
|
215
215
|
|
|
216
|
-
protected async ffmpegSeekedVideo(): Promise<
|
|
216
|
+
protected async ffmpegSeekedVideo(): Promise<ImageBitmap> {
|
|
217
217
|
const video = this.video();
|
|
218
218
|
const time = this.clampTime(this.time());
|
|
219
219
|
const duration = this.getDuration();
|
|
@@ -170,7 +170,8 @@ export class Scene2D extends GeneratorScene<View2D> implements Inspectable {
|
|
|
170
170
|
...playingVideos.map(vid => ({
|
|
171
171
|
key: vid.key,
|
|
172
172
|
type: 'video' as const,
|
|
173
|
-
src: vid.
|
|
173
|
+
src: vid.getUrl(),
|
|
174
|
+
decoder: vid.decoder(),
|
|
174
175
|
playbackRate:
|
|
175
176
|
typeof vid.playbackRate === 'function'
|
|
176
177
|
? vid.playbackRate()
|
|
@@ -3,22 +3,6 @@ export class ImageCommunication {
|
|
|
3
3
|
if (!import.meta.hot) {
|
|
4
4
|
throw new Error('FfmpegVideoFrame can only be used with HMR.');
|
|
5
5
|
}
|
|
6
|
-
|
|
7
|
-
import.meta.hot.on(
|
|
8
|
-
'revideo:ffmpeg-decoder:video-frame-res',
|
|
9
|
-
this.handler.bind(this),
|
|
10
|
-
);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
private nextFrameHandlers: ((event: MessageEvent) => void)[] = [];
|
|
14
|
-
|
|
15
|
-
private handler(event: MessageEvent) {
|
|
16
|
-
const handlers = this.nextFrameHandlers;
|
|
17
|
-
this.nextFrameHandlers = [];
|
|
18
|
-
|
|
19
|
-
for (const handler of handlers) {
|
|
20
|
-
handler(event);
|
|
21
|
-
}
|
|
22
6
|
}
|
|
23
7
|
|
|
24
8
|
public async getFrame(
|
|
@@ -28,37 +12,39 @@ export class ImageCommunication {
|
|
|
28
12
|
duration: number,
|
|
29
13
|
fps: number,
|
|
30
14
|
) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
15
|
+
const response = await fetch('/revideo-ffmpeg-decoder/video-frame', {
|
|
16
|
+
method: 'POST',
|
|
17
|
+
headers: {
|
|
18
|
+
// eslint-disable-next-line
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
},
|
|
21
|
+
body: JSON.stringify({
|
|
22
|
+
id,
|
|
23
|
+
filePath: src,
|
|
24
|
+
startTime: time,
|
|
25
|
+
duration,
|
|
26
|
+
fps,
|
|
27
|
+
}),
|
|
28
|
+
});
|
|
39
29
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
30
|
+
if (!response.ok) {
|
|
31
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
32
|
+
}
|
|
43
33
|
|
|
44
|
-
|
|
34
|
+
const width = parseInt(response.headers.get('X-Frame-Width') || '1080', 10);
|
|
35
|
+
const height = parseInt(
|
|
36
|
+
response.headers.get('X-Frame-Height') || '1920',
|
|
37
|
+
10,
|
|
38
|
+
);
|
|
45
39
|
|
|
46
|
-
|
|
47
|
-
resolve(image);
|
|
48
|
-
};
|
|
49
|
-
}
|
|
40
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
50
41
|
|
|
51
|
-
|
|
42
|
+
const imageData = new ImageData(
|
|
43
|
+
new Uint8ClampedArray(arrayBuffer),
|
|
44
|
+
width,
|
|
45
|
+
height,
|
|
46
|
+
);
|
|
52
47
|
|
|
53
|
-
|
|
54
|
-
data: {
|
|
55
|
-
id: id,
|
|
56
|
-
filePath: src,
|
|
57
|
-
startTime: time,
|
|
58
|
-
duration,
|
|
59
|
-
fps,
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
});
|
|
48
|
+
return createImageBitmap(imageData);
|
|
63
49
|
}
|
|
64
50
|
}
|