@revideo/2d 0.5.3 → 0.5.4-alpha.1061
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/Layout.d.ts.map +1 -1
- package/lib/components/Layout.js +15 -9
- package/lib/partials/types.d.ts +1 -1
- package/lib/partials/types.d.ts.map +1 -1
- package/lib/tsconfig.build.tsbuildinfo +1 -1
- package/lib/utils/video/parser/segment.d.ts +3 -0
- package/lib/utils/video/parser/segment.d.ts.map +1 -1
- package/lib/utils/video/parser/segment.js +25 -7
- package/package.json +5 -5
- package/src/lib/components/Layout.ts +19 -7
- package/src/lib/partials/types.ts +1 -1
- package/src/lib/utils/video/parser/segment.ts +28 -6
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { MP4FileSink } from './sink';
|
|
2
|
+
const MAX_DECODE_QUEUE_SIZE = 30;
|
|
2
3
|
export class Segment {
|
|
3
4
|
constructor(uri, file, edits, currentSegment, startTime = 0) {
|
|
4
5
|
this.done = false;
|
|
6
|
+
this.decodingDone = false;
|
|
5
7
|
this.abortController = new AbortController();
|
|
6
8
|
this.responseFinished = false;
|
|
7
9
|
this.framesProcessed = 0;
|
|
8
10
|
this.framesDue = 0;
|
|
9
11
|
this.frameBuffer = [];
|
|
12
|
+
this.encodedChunkQueue = [];
|
|
10
13
|
this.readMore = async () => { };
|
|
11
14
|
this.uri = uri;
|
|
12
15
|
this.file = file;
|
|
@@ -31,7 +34,7 @@ export class Segment {
|
|
|
31
34
|
this.decoder.close();
|
|
32
35
|
const segmentDurationInSeconds = this.edit.segmentDuration /
|
|
33
36
|
this.file.getInfo().videoTracks[0].movie_timescale;
|
|
34
|
-
const framesToFill = segmentDurationInSeconds * this.edit.fps;
|
|
37
|
+
const framesToFill = Math.ceil(segmentDurationInSeconds * this.edit.fps);
|
|
35
38
|
const height = this.file.getInfo().videoTracks[0].track_height;
|
|
36
39
|
const width = this.file.getInfo().videoTracks[0].track_width;
|
|
37
40
|
const bufferSize = height * width * 4;
|
|
@@ -87,7 +90,6 @@ export class Segment {
|
|
|
87
90
|
this.responseFinished = true;
|
|
88
91
|
this.abortController.abort();
|
|
89
92
|
sink.close();
|
|
90
|
-
this.decoder.flush();
|
|
91
93
|
return;
|
|
92
94
|
}
|
|
93
95
|
sink.write(value);
|
|
@@ -107,13 +109,26 @@ export class Segment {
|
|
|
107
109
|
duration: (1e6 * sample.duration) / sample.timescale,
|
|
108
110
|
data: sample.data,
|
|
109
111
|
});
|
|
110
|
-
this.
|
|
111
|
-
this.decoder.decode(chunk);
|
|
112
|
+
this.encodedChunkQueue.push(chunk);
|
|
112
113
|
const videoTrack = this.file.getInfo().videoTracks[0];
|
|
113
114
|
const trak = this.file.getTrackById(videoTrack.id);
|
|
114
115
|
this.file.releaseSample(trak, sample.number);
|
|
115
116
|
}
|
|
116
117
|
}
|
|
118
|
+
async decodeChunks() {
|
|
119
|
+
while (this.encodedChunkQueue.length > 0 &&
|
|
120
|
+
this.decoder.decodeQueueSize < MAX_DECODE_QUEUE_SIZE) {
|
|
121
|
+
const chunk = this.encodedChunkQueue.shift();
|
|
122
|
+
if (chunk) {
|
|
123
|
+
this.framesDue++;
|
|
124
|
+
this.decoder.decode(chunk);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (this.responseFinished && this.encodedChunkQueue.length === 0) {
|
|
128
|
+
await this.decoder.flush();
|
|
129
|
+
this.decodingDone = true;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
117
132
|
/**
|
|
118
133
|
* Called when the decoder has a frame ready.
|
|
119
134
|
* Pushes the frame to the buffer so it can be consumed.
|
|
@@ -142,8 +157,11 @@ export class Segment {
|
|
|
142
157
|
}
|
|
143
158
|
async populateBuffer() {
|
|
144
159
|
// Fetch more frames if we don't have any.
|
|
145
|
-
while (this.frameBuffer.length === 0 && !this.
|
|
146
|
-
|
|
160
|
+
while (this.frameBuffer.length === 0 && !this.decodingDone) {
|
|
161
|
+
if (!this.responseFinished) {
|
|
162
|
+
await this.readMore();
|
|
163
|
+
}
|
|
164
|
+
await this.decodeChunks();
|
|
147
165
|
await new Promise(res => setTimeout(res, 0));
|
|
148
166
|
}
|
|
149
167
|
// Wait for decoder if there are frames due.
|
|
@@ -192,4 +210,4 @@ export class Segment {
|
|
|
192
210
|
return this.startTime;
|
|
193
211
|
}
|
|
194
212
|
}
|
|
195
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdXRpbHMvdmlkZW8vcGFyc2VyL3NlZ21lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUduQyxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztBQUVqQyxNQUFNLE9BQU8sT0FBTztJQW9CbEIsWUFDRSxHQUFXLEVBQ1gsSUFBUyxFQUNULEtBQWEsRUFDYixjQUFzQixFQUN0QixZQUFvQixDQUFDO1FBeEJmLFNBQUksR0FBWSxLQUFLLENBQUM7UUFDdEIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsb0JBQWUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBTXhDLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUdsQyxvQkFBZSxHQUFHLENBQUMsQ0FBQztRQUVwQixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsZ0JBQVcsR0FBaUIsRUFBRSxDQUFDO1FBQy9CLHNCQUFpQixHQUF3QixFQUFFLENBQUM7UUFFNUMsYUFBUSxHQUF3QixLQUFLLElBQUksRUFBRSxHQUFFLENBQUMsQ0FBQztRQVNyRCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUVmLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRWxDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBRTNCLGtHQUFrRztRQUNsRyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@revideo/2d",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.4-alpha.1061+6b2cb335",
|
|
4
4
|
"description": "A 2D renderer for revideo",
|
|
5
5
|
"author": "revideo",
|
|
6
6
|
"homepage": "https://re.video/",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
],
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@preact/signals": "^1.2.1",
|
|
32
|
-
"@revideo/internal": "0.0.0",
|
|
33
|
-
"@revideo/ui": "0.5.
|
|
32
|
+
"@revideo/internal": "^0.0.0",
|
|
33
|
+
"@revideo/ui": "^0.5.4-alpha.1061+6b2cb335",
|
|
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.4-alpha.1061+6b2cb335",
|
|
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": "6b2cb3357194ff3e48e8d34edc51eea2ae440bf0"
|
|
52
52
|
}
|
|
@@ -992,13 +992,25 @@ export class Layout extends Node {
|
|
|
992
992
|
|
|
993
993
|
if (this.textWrap.isInitial()) {
|
|
994
994
|
this.element.style.whiteSpace = '';
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
995
|
+
return;
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
const wrap = this.textWrap();
|
|
999
|
+
|
|
1000
|
+
if (typeof wrap === 'boolean') {
|
|
1001
|
+
this.element.style.whiteSpace = wrap ? 'normal' : 'nowrap';
|
|
1002
|
+
return;
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
if (wrap === 'pre') {
|
|
1006
|
+
this.element.style.whiteSpace = wrap;
|
|
1007
|
+
return;
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
if (wrap === 'balance') {
|
|
1011
|
+
this.element.style.whiteSpace = 'normal';
|
|
1012
|
+
this.element.style.textWrap = wrap;
|
|
1013
|
+
return;
|
|
1002
1014
|
}
|
|
1003
1015
|
}
|
|
1004
1016
|
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import {MP4FileSink} from './sink';
|
|
2
2
|
import {Edit} from './utils';
|
|
3
3
|
|
|
4
|
+
const MAX_DECODE_QUEUE_SIZE = 30;
|
|
5
|
+
|
|
4
6
|
export class Segment {
|
|
5
7
|
private done: boolean = false;
|
|
8
|
+
private decodingDone: boolean = false;
|
|
6
9
|
private abortController = new AbortController();
|
|
7
10
|
private uri: string;
|
|
8
11
|
|
|
@@ -16,6 +19,7 @@ export class Segment {
|
|
|
16
19
|
private startTime: number;
|
|
17
20
|
private framesDue = 0;
|
|
18
21
|
private frameBuffer: VideoFrame[] = [];
|
|
22
|
+
private encodedChunkQueue: EncodedVideoChunk[] = [];
|
|
19
23
|
|
|
20
24
|
private readMore: () => Promise<void> = async () => {};
|
|
21
25
|
|
|
@@ -56,7 +60,7 @@ export class Segment {
|
|
|
56
60
|
const segmentDurationInSeconds =
|
|
57
61
|
this.edit.segmentDuration /
|
|
58
62
|
this.file.getInfo().videoTracks[0].movie_timescale;
|
|
59
|
-
const framesToFill = segmentDurationInSeconds * this.edit.fps;
|
|
63
|
+
const framesToFill = Math.ceil(segmentDurationInSeconds * this.edit.fps);
|
|
60
64
|
|
|
61
65
|
const height = this.file.getInfo().videoTracks[0].track_height;
|
|
62
66
|
const width = this.file.getInfo().videoTracks[0].track_width;
|
|
@@ -127,7 +131,6 @@ export class Segment {
|
|
|
127
131
|
this.responseFinished = true;
|
|
128
132
|
this.abortController.abort();
|
|
129
133
|
sink.close();
|
|
130
|
-
this.decoder.flush();
|
|
131
134
|
return;
|
|
132
135
|
}
|
|
133
136
|
|
|
@@ -149,8 +152,7 @@ export class Segment {
|
|
|
149
152
|
duration: (1e6 * sample.duration) / sample.timescale,
|
|
150
153
|
data: sample.data,
|
|
151
154
|
});
|
|
152
|
-
this.
|
|
153
|
-
this.decoder.decode(chunk);
|
|
155
|
+
this.encodedChunkQueue.push(chunk);
|
|
154
156
|
|
|
155
157
|
const videoTrack = this.file.getInfo().videoTracks[0];
|
|
156
158
|
const trak = this.file.getTrackById(videoTrack.id);
|
|
@@ -158,6 +160,23 @@ export class Segment {
|
|
|
158
160
|
}
|
|
159
161
|
}
|
|
160
162
|
|
|
163
|
+
private async decodeChunks() {
|
|
164
|
+
while (
|
|
165
|
+
this.encodedChunkQueue.length > 0 &&
|
|
166
|
+
this.decoder.decodeQueueSize < MAX_DECODE_QUEUE_SIZE
|
|
167
|
+
) {
|
|
168
|
+
const chunk = this.encodedChunkQueue.shift();
|
|
169
|
+
if (chunk) {
|
|
170
|
+
this.framesDue++;
|
|
171
|
+
this.decoder.decode(chunk);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (this.responseFinished && this.encodedChunkQueue.length === 0) {
|
|
175
|
+
await this.decoder.flush();
|
|
176
|
+
this.decodingDone = true;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
161
180
|
/**
|
|
162
181
|
* Called when the decoder has a frame ready.
|
|
163
182
|
* Pushes the frame to the buffer so it can be consumed.
|
|
@@ -192,8 +211,11 @@ export class Segment {
|
|
|
192
211
|
|
|
193
212
|
private async populateBuffer() {
|
|
194
213
|
// Fetch more frames if we don't have any.
|
|
195
|
-
while (this.frameBuffer.length === 0 && !this.
|
|
196
|
-
|
|
214
|
+
while (this.frameBuffer.length === 0 && !this.decodingDone) {
|
|
215
|
+
if (!this.responseFinished) {
|
|
216
|
+
await this.readMore();
|
|
217
|
+
}
|
|
218
|
+
await this.decodeChunks();
|
|
197
219
|
await new Promise(res => setTimeout(res, 0));
|
|
198
220
|
}
|
|
199
221
|
|