@livepeer-frameworks/streamcrafter-core 0.0.2 → 0.1.0
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/README.md +24 -1
- package/dist/cjs/IngestControllerV2-BSD6O8gz.cjs +5662 -0
- package/dist/cjs/IngestControllerV2-BSD6O8gz.cjs.map +1 -0
- package/dist/cjs/IngestControllerV2-DZFuxrNk.cjs +5768 -0
- package/dist/cjs/IngestControllerV2-DZFuxrNk.cjs.map +1 -0
- package/dist/cjs/IngestControllerV2-Mt6aX-DU.cjs +5768 -0
- package/dist/cjs/IngestControllerV2-Mt6aX-DU.cjs.map +1 -0
- package/dist/cjs/index.cjs +60 -5
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/vanilla.cjs +1 -1
- package/dist/cjs/vanilla.cjs.map +1 -1
- package/dist/esm/IngestControllerV2-BaOxEiTq.js +5606 -0
- package/dist/esm/IngestControllerV2-BaOxEiTq.js.map +1 -0
- package/dist/esm/IngestControllerV2-DswB_ybx.js +5712 -0
- package/dist/esm/IngestControllerV2-DswB_ybx.js.map +1 -0
- package/dist/esm/IngestControllerV2-fiwB1xzE.js +5712 -0
- package/dist/esm/IngestControllerV2-fiwB1xzE.js.map +1 -0
- package/dist/esm/index.js +61 -6
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/vanilla.js +1 -1
- package/dist/esm/vanilla.js.map +1 -1
- package/dist/types/core/EncoderManager.d.ts +6 -0
- package/dist/types/core/IngestControllerV2.d.ts +7 -0
- package/dist/types/core/SceneManager.d.ts +6 -0
- package/dist/types/core/WhipClient.d.ts +1 -0
- package/dist/types/core/renderers/Canvas2DRenderer.d.ts +1 -0
- package/dist/types/core/renderers/WebGLRenderer.d.ts +1 -0
- package/dist/types/core/renderers/WebGPURenderer.d.ts +3 -0
- package/dist/types/core/renderers/index.d.ts +5 -0
- package/dist/types/types.d.ts +5 -0
- package/dist/workers/compositor.worker.js +92 -5
- package/dist/workers/compositor.worker.js.map +1 -1
- package/dist/workers/encoder.worker.js +2 -2
- package/dist/workers/encoder.worker.js.map +1 -1
- package/package.json +1 -1
- package/src/core/EncoderManager.ts +63 -1
- package/src/core/IngestControllerV2.ts +114 -98
- package/src/core/SceneManager.ts +16 -3
- package/src/core/WhipClient.ts +26 -0
- package/src/core/renderers/WebGPURenderer.ts +1 -1
- package/src/vanilla/StreamCrafterV2.ts +0 -1
- package/src/workers/compositor.worker.ts +1 -2
- package/src/workers/encoder.worker.ts +2 -2
package/dist/cjs/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var IngestControllerV2 = require('./IngestControllerV2-
|
|
3
|
+
var IngestControllerV2 = require('./IngestControllerV2-Mt6aX-DU.cjs');
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* IngestClient - Resolves ingest endpoints via Gateway
|
|
@@ -329,6 +329,20 @@ class Canvas2DRenderer {
|
|
|
329
329
|
this.lastRenderTime = performance.now() - startTime;
|
|
330
330
|
this.updateStats();
|
|
331
331
|
}
|
|
332
|
+
resize(config) {
|
|
333
|
+
this.config = config;
|
|
334
|
+
const ctx = this.canvas.getContext('2d', {
|
|
335
|
+
desynchronized: true,
|
|
336
|
+
alpha: false,
|
|
337
|
+
willReadFrequently: false,
|
|
338
|
+
});
|
|
339
|
+
if (!ctx) {
|
|
340
|
+
throw new Error('Failed to get 2D context from OffscreenCanvas');
|
|
341
|
+
}
|
|
342
|
+
this.ctx = ctx;
|
|
343
|
+
this.ctx.imageSmoothingEnabled = true;
|
|
344
|
+
this.ctx.imageSmoothingQuality = 'high';
|
|
345
|
+
}
|
|
332
346
|
renderLayer(layer, frame) {
|
|
333
347
|
const { x, y, width, height, opacity, rotation, borderRadius, crop } = layer.transform;
|
|
334
348
|
const scalingMode = layer.scalingMode || 'letterbox';
|
|
@@ -895,6 +909,12 @@ class WebGLRenderer {
|
|
|
895
909
|
this.lastRenderTime = performance.now() - startTime;
|
|
896
910
|
this.updateStats();
|
|
897
911
|
}
|
|
912
|
+
resize(config) {
|
|
913
|
+
this.config = config;
|
|
914
|
+
if (this.gl) {
|
|
915
|
+
this.gl.viewport(0, 0, config.width, config.height);
|
|
916
|
+
}
|
|
917
|
+
}
|
|
898
918
|
updateTextures(frames) {
|
|
899
919
|
const gl = this.gl;
|
|
900
920
|
for (const [sourceId, frame] of frames) {
|
|
@@ -1340,9 +1360,11 @@ class WebGPURenderer {
|
|
|
1340
1360
|
// Textures and bind groups per source
|
|
1341
1361
|
this.textures = new Map();
|
|
1342
1362
|
this.bindGroups = new Map();
|
|
1363
|
+
this.bindGroupTextures = new Map();
|
|
1343
1364
|
this.uniformBuffers = new Map();
|
|
1344
1365
|
// Sampler
|
|
1345
1366
|
this.sampler = null;
|
|
1367
|
+
this.presentationFormat = null;
|
|
1346
1368
|
// Stats tracking
|
|
1347
1369
|
this.frameCount = 0;
|
|
1348
1370
|
this.lastFrameTime = 0;
|
|
@@ -1369,6 +1391,7 @@ class WebGPURenderer {
|
|
|
1369
1391
|
throw new Error('Failed to get WebGPU context');
|
|
1370
1392
|
}
|
|
1371
1393
|
const presentationFormat = navigator.gpu.getPreferredCanvasFormat();
|
|
1394
|
+
this.presentationFormat = presentationFormat;
|
|
1372
1395
|
this.context.configure({
|
|
1373
1396
|
device: this.device,
|
|
1374
1397
|
format: presentationFormat,
|
|
@@ -1527,6 +1550,16 @@ class WebGPURenderer {
|
|
|
1527
1550
|
this.lastRenderTime = performance.now() - startTime;
|
|
1528
1551
|
this.updateStats();
|
|
1529
1552
|
}
|
|
1553
|
+
resize(config) {
|
|
1554
|
+
this.config = config;
|
|
1555
|
+
if (this.context && this.device && this.presentationFormat) {
|
|
1556
|
+
this.context.configure({
|
|
1557
|
+
device: this.device,
|
|
1558
|
+
format: this.presentationFormat,
|
|
1559
|
+
alphaMode: 'premultiplied',
|
|
1560
|
+
});
|
|
1561
|
+
}
|
|
1562
|
+
}
|
|
1530
1563
|
updateTextures(frames) {
|
|
1531
1564
|
if (!this.device)
|
|
1532
1565
|
return;
|
|
@@ -1537,7 +1570,26 @@ class WebGPURenderer {
|
|
|
1537
1570
|
// Create or recreate texture if size changed
|
|
1538
1571
|
if (!texture || texture.width !== width || texture.height !== height) {
|
|
1539
1572
|
if (texture) {
|
|
1540
|
-
texture
|
|
1573
|
+
const oldTexture = texture;
|
|
1574
|
+
// Defer destruction until GPU work is done to avoid validation errors.
|
|
1575
|
+
this.device.queue
|
|
1576
|
+
.onSubmittedWorkDone()
|
|
1577
|
+
.then(() => {
|
|
1578
|
+
try {
|
|
1579
|
+
oldTexture.destroy();
|
|
1580
|
+
}
|
|
1581
|
+
catch {
|
|
1582
|
+
// Ignore destroy errors
|
|
1583
|
+
}
|
|
1584
|
+
})
|
|
1585
|
+
.catch(() => {
|
|
1586
|
+
try {
|
|
1587
|
+
oldTexture.destroy();
|
|
1588
|
+
}
|
|
1589
|
+
catch {
|
|
1590
|
+
// Ignore destroy errors
|
|
1591
|
+
}
|
|
1592
|
+
});
|
|
1541
1593
|
}
|
|
1542
1594
|
texture = this.device.createTexture({
|
|
1543
1595
|
size: { width, height },
|
|
@@ -1547,8 +1599,8 @@ class WebGPURenderer {
|
|
|
1547
1599
|
GPUTextureUsage.RENDER_ATTACHMENT,
|
|
1548
1600
|
});
|
|
1549
1601
|
this.textures.set(sourceId, texture);
|
|
1550
|
-
//
|
|
1551
|
-
|
|
1602
|
+
// Bind groups are keyed by layer id; rebind when a layer requests this source.
|
|
1603
|
+
// We keep cached bind groups and replace them on demand in getOrCreateBindGroup.
|
|
1552
1604
|
}
|
|
1553
1605
|
// Copy frame to texture
|
|
1554
1606
|
if (frame instanceof ImageBitmap) {
|
|
@@ -1566,8 +1618,9 @@ class WebGPURenderer {
|
|
|
1566
1618
|
const texture = this.textures.get(layer.sourceId);
|
|
1567
1619
|
if (!texture)
|
|
1568
1620
|
return null;
|
|
1621
|
+
const cachedTexture = this.bindGroupTextures.get(layer.id);
|
|
1569
1622
|
let bindGroup = this.bindGroups.get(layer.id);
|
|
1570
|
-
if (!bindGroup) {
|
|
1623
|
+
if (!bindGroup || cachedTexture !== texture) {
|
|
1571
1624
|
// Create uniform buffer for this layer
|
|
1572
1625
|
let uniformBuffer = this.uniformBuffers.get(layer.id);
|
|
1573
1626
|
if (!uniformBuffer) {
|
|
@@ -1586,6 +1639,7 @@ class WebGPURenderer {
|
|
|
1586
1639
|
],
|
|
1587
1640
|
});
|
|
1588
1641
|
this.bindGroups.set(layer.id, bindGroup);
|
|
1642
|
+
this.bindGroupTextures.set(layer.id, texture);
|
|
1589
1643
|
}
|
|
1590
1644
|
return bindGroup;
|
|
1591
1645
|
}
|
|
@@ -1816,6 +1870,7 @@ class WebGPURenderer {
|
|
|
1816
1870
|
this.indexBuffer?.destroy();
|
|
1817
1871
|
// Clear bind groups (they reference destroyed resources)
|
|
1818
1872
|
this.bindGroups.clear();
|
|
1873
|
+
this.bindGroupTextures.clear();
|
|
1819
1874
|
// Device will be garbage collected
|
|
1820
1875
|
this.device = null;
|
|
1821
1876
|
this.context = null;
|