@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.
Files changed (43) hide show
  1. package/README.md +24 -1
  2. package/dist/cjs/IngestControllerV2-BSD6O8gz.cjs +5662 -0
  3. package/dist/cjs/IngestControllerV2-BSD6O8gz.cjs.map +1 -0
  4. package/dist/cjs/IngestControllerV2-DZFuxrNk.cjs +5768 -0
  5. package/dist/cjs/IngestControllerV2-DZFuxrNk.cjs.map +1 -0
  6. package/dist/cjs/IngestControllerV2-Mt6aX-DU.cjs +5768 -0
  7. package/dist/cjs/IngestControllerV2-Mt6aX-DU.cjs.map +1 -0
  8. package/dist/cjs/index.cjs +60 -5
  9. package/dist/cjs/index.cjs.map +1 -1
  10. package/dist/cjs/vanilla.cjs +1 -1
  11. package/dist/cjs/vanilla.cjs.map +1 -1
  12. package/dist/esm/IngestControllerV2-BaOxEiTq.js +5606 -0
  13. package/dist/esm/IngestControllerV2-BaOxEiTq.js.map +1 -0
  14. package/dist/esm/IngestControllerV2-DswB_ybx.js +5712 -0
  15. package/dist/esm/IngestControllerV2-DswB_ybx.js.map +1 -0
  16. package/dist/esm/IngestControllerV2-fiwB1xzE.js +5712 -0
  17. package/dist/esm/IngestControllerV2-fiwB1xzE.js.map +1 -0
  18. package/dist/esm/index.js +61 -6
  19. package/dist/esm/index.js.map +1 -1
  20. package/dist/esm/vanilla.js +1 -1
  21. package/dist/esm/vanilla.js.map +1 -1
  22. package/dist/types/core/EncoderManager.d.ts +6 -0
  23. package/dist/types/core/IngestControllerV2.d.ts +7 -0
  24. package/dist/types/core/SceneManager.d.ts +6 -0
  25. package/dist/types/core/WhipClient.d.ts +1 -0
  26. package/dist/types/core/renderers/Canvas2DRenderer.d.ts +1 -0
  27. package/dist/types/core/renderers/WebGLRenderer.d.ts +1 -0
  28. package/dist/types/core/renderers/WebGPURenderer.d.ts +3 -0
  29. package/dist/types/core/renderers/index.d.ts +5 -0
  30. package/dist/types/types.d.ts +5 -0
  31. package/dist/workers/compositor.worker.js +92 -5
  32. package/dist/workers/compositor.worker.js.map +1 -1
  33. package/dist/workers/encoder.worker.js +2 -2
  34. package/dist/workers/encoder.worker.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/core/EncoderManager.ts +63 -1
  37. package/src/core/IngestControllerV2.ts +114 -98
  38. package/src/core/SceneManager.ts +16 -3
  39. package/src/core/WhipClient.ts +26 -0
  40. package/src/core/renderers/WebGPURenderer.ts +1 -1
  41. package/src/vanilla/StreamCrafterV2.ts +0 -1
  42. package/src/workers/compositor.worker.ts +1 -2
  43. package/src/workers/encoder.worker.ts +2 -2
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var IngestControllerV2 = require('./IngestControllerV2-7OKm7INi.cjs');
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.destroy();
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
- // Invalidate bind group since texture changed
1551
- this.bindGroups.delete(sourceId);
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;