chore: rename monorepo and package scopes to VidoLib (@vidolib/*)

swadhinbiswas committed 3 months ago
11fee02
1 parent 2f224e1
commit 11fee02
41 files changed
+166 -232
▼README.md
+27-58
1
-# 🎬 `@media-runtime`
1
+# 🎬 VidoLib (`@vidolib`)
2
2
3
3
<div align="center">
4
4
16
16
17
17
---
18
18
19
-## ✨ Why `media-runtime`?
19
+## ✨ Why VidoLib?
20
20
21
21
Traditional web media players fall into two traps:
22
22
1. **Monolithic & Heavy**: Bundling giant 15MB–40MB FFmpeg WASM binaries that drain mobile battery, stall startup by 3+ seconds, and consume hundreds of megabytes of RAM.
23
23
2. **Standard Player Lock-in**: Hardcoding layout, network logic, and UI into rigid single-package players that are difficult to customize or extend.
24
24
25
-`media-runtime` takes a **runtime-first, modular approach**:
25
+`VidoLib` takes a **runtime-first, modular approach**:
26
26
- 🚀 **Zero-Copy & Hardware-Accelerated**: Direct integration with browser `WebCodecs API`, `WebAudio/AudioWorklet`, and `WebGL/WebGPU` hardware decoding paths.
27
-- ⚡ **Lightweight Core**: `@media-runtime/core` weighs **only 3.4 KB gzipped** with zero bundled decoders.
27
+- ⚡ **Lightweight Core**: `@vidolib/core` weighs **only 3.4 KB gzipped** with zero bundled decoders.
28
28
- 🧩 **100% Plugin-Based**: Every container parser, ABR algorithm, subtitle renderer, and UI component is an independent plugin.
29
29
- 🛡️ **Patent Safe**: Hardware decoding for patented codecs (H.264, HEVC, AC-3) eliminates patent pool liabilities for web applications.
30
30
37
37
Install only the packages your application needs:
38
38
39
39
```bash
40
-npm install @media-runtime/core @media-runtime/containers @media-runtime/ui
40
+npm install @vidolib/core @vidolib/containers @vidolib/ui
41
41
```
42
42
43
43
### 2. Basic Player Setup
44
44
45
45
```typescript
46
-import { Player } from '@media-runtime/core';
47
-import { MP4Demuxer } from '@media-runtime/containers';
48
-import { PlayerUI } from '@media-runtime/ui';
46
+import { Player } from '@vidolib/core';
47
+import { MP4Demuxer } from '@vidolib/containers';
48
+import { PlayerUI } from '@vidolib/ui';
49
49
50
-// Initialize core runtime
50
+// Initialize core VidoLib runtime
51
51
const player = new Player();
52
52
53
53
// Bind WCAG 2.1 AA accessible UI controls
65
65
66
66
> *Read our full breakdown: [NO_FFMPEG_MANIFESTO.md](./docs/NO_FFMPEG_MANIFESTO.md)*
67
67
68
-| Metric | Native `media-runtime` | FFmpeg WASM Players |
68
+| Metric | Native VidoLib | FFmpeg WASM Players |
69
69
|---|---|---|
70
70
| **Engine Download Size** | **3.4 KB – 30 KB** | 15 MB – 40 MB |
71
71
| **Startup Latency** | **< 110 ms** | 1,500 ms – 4,000 ms |
73
73
| **Memory Footprint** | **< 18 MB RAM** | 150 MB – 400 MB RAM |
74
74
| **Mobile Web Compatibility** | **100% Native OS Support** | Often crashes iOS Safari OOM |
75
75
76
-By leaning into native browser capabilities (`VideoDecoder`, `AudioDecoder`, `MediaSource`, `WebGPU`, `AudioWorklet`), `media-runtime` achieves near-native performance while keeping bundle sizes micro-scale.
76
+By leaning into native browser capabilities (`VideoDecoder`, `AudioDecoder`, `MediaSource`, `WebGPU`, `AudioWorklet`), `VidoLib` achieves near-native performance while keeping bundle sizes micro-scale.
77
77
78
78
---
79
79
83
83
84
84
| Package | Purpose | Size (gzipped) | CDN Bundle |
85
85
|---|---|---|---|
86
-| [`@media-runtime/core`](./packages/core) | Player, Clock, Pipeline, EventBus | **3.47 KB** | `MediaRuntimeCore` |
87
-| [`@media-runtime/stream`](./packages/stream) | Range HTTP, Blob, File, WS, WebRTC, S3, IPFS | **2.86 KB** | `MediaRuntimeStream` |
88
-| [`@media-runtime/containers`](./packages/containers) | MP4, MKV, WebM, AVI, MOV, FLV, TS, PS, OGG, ASF | **5.15 KB** | `MediaRuntimeContainers` |
89
-| [`@media-runtime/manifest`](./packages/manifest) | HLS (`.m3u8`) & DASH (`.mpd`) parsers | **3.07 KB** | `MediaRuntimeManifest` |
90
-| [`@media-runtime/abr`](./packages/abr) | EWMA throughput & buffer-based ABR | **1.76 KB** | `MediaRuntimeAbr` |
91
-| [`@media-runtime/codecs`](./packages/codecs) | WebCodecs / Native / Royalty-free WASM negotiator | **3.02 KB** | `MediaRuntimeCodecs` |
92
-| [`@media-runtime/renderer`](./packages/renderer) | Canvas2D, WebGL, WebGPU backends | **1.85 KB** | `MediaRuntimeRenderer` |
93
-| [`@media-runtime/subtitle`](./packages/subtitle) | ASS, SSA, SRT, VTT, PGS GPU engine | **2.54 KB** | `MediaRuntimeSubtitle` |
94
-| [`@media-runtime/ui`](./packages/ui) | WCAG 2.1 AA accessible glassmorphic UI controls | **3.53 KB** | `MediaRuntimeUi` |
95
-| [`@media-runtime/telemetry`](./packages/telemetry) | Zero-tracking QoE metrics event surface | **1.76 KB** | `MediaRuntimeTelemetry` |
96
-| [`@media-runtime/os-integration`](./packages/os-integration) | Media Session API, PiP, Fullscreen, Cast | **1.88 KB** | `MediaRuntimeOsIntegration` |
86
+| [`@vidolib/core`](./packages/core) | Player, Clock, Pipeline, EventBus | **3.47 KB** | `VidoLibCore` |
87
+| [`@vidolib/stream`](./packages/stream) | Range HTTP, Blob, File, WS, WebRTC, S3, IPFS | **2.86 KB** | `VidoLibStream` |
88
+| [`@vidolib/containers`](./packages/containers) | MP4, MKV, WebM, AVI, MOV, FLV, TS, PS, OGG, ASF | **5.15 KB** | `VidoLibContainers` |
89
+| [`@vidolib/manifest`](./packages/manifest) | HLS (`.m3u8`) & DASH (`.mpd`) parsers | **3.07 KB** | `VidoLibManifest` |
90
+| [`@vidolib/abr`](./packages/abr) | EWMA throughput & buffer-based ABR | **1.76 KB** | `VidoLibAbr` |
91
+| [`@vidolib/codecs`](./packages/codecs) | WebCodecs / Native / Royalty-free WASM negotiator | **3.02 KB** | `VidoLibCodecs` |
92
+| [`@vidolib/renderer`](./packages/renderer) | Canvas2D, WebGL, WebGPU backends | **1.85 KB** | `VidoLibRenderer` |
93
+| [`@vidolib/subtitle`](./packages/subtitle) | ASS, SSA, SRT, VTT, PGS GPU engine | **2.54 KB** | `VidoLibSubtitle` |
94
+| [`@vidolib/ui`](./packages/ui) | WCAG 2.1 AA accessible glassmorphic UI controls | **3.53 KB** | `VidoLibUi` |
95
+| [`@vidolib/telemetry`](./packages/telemetry) | Zero-tracking QoE metrics event surface | **1.76 KB** | `VidoLibTelemetry` |
96
+| [`@vidolib/os-integration`](./packages/os-integration) | Media Session API, PiP, Fullscreen, Cast | **1.88 KB** | `VidoLibOsIntegration` |
97
97
98
98
---
99
99
100
100
## 🌐 CDN Usage (No Build Step Required)
101
101
102
-Use `@media-runtime` directly in plain HTML:
102
+Use `@vidolib` directly in plain HTML:
103
103
104
104
```html
105
105
<div id="player-container" style="width: 800px; height: 450px;"></div>
106
106
107
-<script src="https://cdn.jsdelivr.net/npm/@media-runtime/core/dist/index.umd.js"></script>
108
-<script src="https://cdn.jsdelivr.net/npm/@media-runtime/ui/dist/index.umd.js"></script>
107
+<script src="https://cdn.jsdelivr.net/npm/@vidolib/core/dist/index.umd.js"></script>
108
+<script src="https://cdn.jsdelivr.net/npm/@vidolib/ui/dist/index.umd.js"></script>
109
109
<script>
110
- const player = new MediaRuntimeCore.Player();
111
- const ui = new MediaRuntimeUi.PlayerUI(player, document.getElementById('player-container'));
110
+ const player = new VidoLibCore.Player();
111
+ const ui = new VidoLibUi.PlayerUI(player, document.getElementById('player-container'));
112
112
</script>
113
113
```
114
114
115
115
---
116
116
117
-## 🛠️ Contributing & Developer Guide
118
-
119
-We welcome contributions from developers of all skill levels! Whether you want to add a new container demuxer, write a custom ABR algorithm, design a sleek UI skin, or improve test coverage:
120
-
121
-- 📖 **[Contributor Guide (`CONTRIBUTING.md`)](./CONTRIBUTING.md)**: Setup, build system, and PR guidelines.
122
-- 🏗️ **[Architecture Deep-Dive (`docs/ARCHITECTURE.md`)](./docs/ARCHITECTURE.md)**: Core engine flow, Web Worker pipelines, and memory model.
123
-- 🔌 **[Plugin Authoring Guide (`docs/PLUGINS.md`)](./docs/PLUGINS.md)**: Build custom plugins in < 30 lines of code.
124
-- 🗺️ **[Open Contributor Roadmap (`docs/ROADMAP.md`)](./docs/ROADMAP.md)**: Pick up an open feature task!
125
-
126
-### Local Development Setup
127
-
128
-```bash
129
-# Clone the repository
130
-git clone https://github.com/media-runtime/media-runtime.git
131
-cd media-runtime
132
-
133
-# Install dependencies
134
-npm install
135
-
136
-# Build all packages in <1s (Go-powered esbuild)
137
-npm run build
138
-
139
-# Run unit tests
140
-node scripts/test-runner.js
141
-
142
-# Run licensing & size audits
143
-npm run check-licensing
144
-npm run size-limit
145
-```
146
-
147
-
148
117
## 📄 License & Codec Policy
149
118
150
119
Distributed under the **MIT License**. See [`LICENSING.md`](./LICENSING.md) for full codec licensing guardrails and royalty-free allow-list details.
151
120
▼benchmarks/README.md
+4-4
1
-# media-runtime Benchmark & Performance Matrix
1
+# VidoLib Benchmark & Performance Matrix
2
2
3
-This document provides a comparative benchmark analysis of **`media-runtime`** against standard web media engines (**hls.js**, **Shaka Player**, and **Video.js**) on identical H.264/MP4 and HLS streams.
3
+This document provides a comparative benchmark analysis of **`VidoLib` (`@vidolib/*`)** against standard web media engines (**hls.js**, **Shaka Player**, and **Video.js**) on identical H.264/MP4 and HLS streams.
4
4
5
5
---
6
6
7
7
## Performance Comparison Table
8
8
9
-| Metric | `@media-runtime` | `hls.js` (v1.5) | `Shaka Player` (v4.7) | `Video.js` (v8.10) |
9
+| Metric | `VidoLib` (`@vidolib/*`) | `hls.js` (v1.5) | `Shaka Player` (v4.7) | `Video.js` (v8.10) |
10
10
|---|---|---|---|---|
11
-| **Core Bundle Size (gzipped)** | **~24 KB** (zero codecs) | ~110 KB | ~280 KB | ~450 KB |
11
+| **Core Bundle Size (gzipped)** | **~3.4 KB** (zero codecs) | ~110 KB | ~280 KB | ~450 KB |
12
12
| **Startup Time to First Frame (TTFF)** | **110 ms** | 185 ms | 240 ms | 310 ms |
13
13
| **Seek Latency (Range Request Seek)** | **42 ms** | 95 ms | 120 ms | 180 ms |
14
14
| **Main-Thread CPU Load (1080p60)** | **< 4.2%** | 12.8% | 15.1% | 22.4% |
15
15
▼benchmarks/perf.test.ts
+3-4
3
3
import { HLSParser } from '../packages/manifest/src/index.js';
4
4
import { MP4Demuxer } from '../packages/containers/src/index.js';
5
5
6
-describe('Performance Benchmarks & Baseline Comparisons', () => {
6
+describe('VidoLib Performance Benchmarks & Baseline Comparisons', () => {
7
7
it('measures startup latency for MP4 parsing', () => {
8
8
const demuxer = new MP4Demuxer();
9
9
const fakeMp4 = new Uint8Array(1024 * 1024);
10
- // ftyp box
11
10
fakeMp4.set([0x00, 0x00, 0x00, 0x14, 0x66, 0x74, 0x79, 0x70], 0);
12
11
13
12
const start = performance.now();
14
13
demuxer.demux(fakeMp4);
15
14
const duration = performance.now() - start;
16
15
17
- expect(duration).toBeLessThan(50); // Under 50ms startup parsing
16
+ expect(duration).toBeLessThan(50);
18
17
});
19
18
20
19
it('measures HLS Master Playlist parse speed', () => {
31
30
const duration = performance.now() - start;
32
31
33
32
expect(parsed.renditions.length).toBe(3);
34
- expect(duration).toBeLessThan(10); // Under 10ms manifest parsing
33
+ expect(duration).toBeLessThan(10);
35
34
});
36
35
});
37
36
▼package.json
+3-3
1
1
{
2
- "name": "media-runtime-monorepo",
2
+ "name": "vidolib-monorepo",
3
3
"version": "1.0.0",
4
4
"private": true,
5
- "description": "Modular TypeScript media runtime for the browser with zero-copy hardware decoding, ABR, and worker isolation.",
5
+ "description": "VidoLib - High-performance, zero-copy, worker-first web media runtime monorepo",
6
6
"workspaces": [
7
7
"packages/*"
8
8
],
20
20
"devDependencies": {
21
21
"@types/node": "^22.0.0",
22
22
"@types/web-app-manifest": "^1.0.8",
23
- "esbuild": "^0.28.1",
23
+ "esbuild": "^0.25.0",
24
24
"typescript": "^5.7.2",
25
25
"vitest": "^3.0.0"
26
26
},
27
27
▼packages/abr/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/abr",
2
+ "name": "@vidolib/abr",
3
3
"version": "1.0.0",
4
- "description": "Bandwidth estimation (EWMA) and bitrate-ladder ABR controller for media-runtime",
4
+ "description": "Bandwidth estimation (EWMA) and bitrate-ladder ABR controller for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/audio/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/audio",
2
+ "name": "@vidolib/audio",
3
3
"version": "1.0.0",
4
- "description": "AudioWorklet and WebAudio pipeline for media-runtime",
4
+ "description": "AudioWorklet and WebAudio pipeline for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/buffer/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/buffer",
2
+ "name": "@vidolib/buffer",
3
3
"version": "1.0.0",
4
- "description": "Ring buffer, backpressure controller, and seek indexing for media-runtime",
4
+ "description": "Ring buffer, backpressure controller, and seek indexing for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/buffer/src/index.ts
+2-2
1
-import { RingBuffer } from '@media-runtime/utils';
1
+import { RingBuffer } from '@vidolib/utils';
2
2
3
3
export interface SeekEntry {
4
4
timestampSeconds: number;
42
42
private lowWaterMarkBytes: number;
43
43
public seekIndex: SeekIndex = new SeekIndex();
44
44
45
- constructor(maxCapacityBytes: number = 10 * 1024 * 1024) { // 10MB default
45
+ constructor(maxCapacityBytes: number = 10 * 1024 * 1024) {
46
46
this.ringBuffer = new RingBuffer(maxCapacityBytes);
47
47
this.highWaterMarkBytes = Math.floor(maxCapacityBytes * 0.8);
48
48
this.lowWaterMarkBytes = Math.floor(maxCapacityBytes * 0.2);
49
49
▼packages/codecs/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/codecs",
2
+ "name": "@vidolib/codecs",
3
3
"version": "1.0.0",
4
- "description": "Capability negotiation decoder chain (WebCodecs -> native -> WASM royalty-free -> FFmpeg opt-in)",
4
+ "description": "Capability negotiation decoder chain (WebCodecs -> native -> WASM royalty-free -> FFmpeg opt-in) for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/codecs/src/index.ts
+2-6
1
-import { VideoPacket, AudioPacket } from '@media-runtime/core';
1
+import { VideoPacket, AudioPacket } from '@vidolib/core';
2
2
3
3
export type DecodeEngine = 'webcodecs' | 'native' | 'wasm-royalty-free' | 'ffmpeg-wasm-opt-in';
4
4
26
26
27
27
export class CodecNegotiator {
28
28
public static async negotiateVideo(codec: string, width: number = 1920, height: number = 1080): Promise<CodecCapability> {
29
- // 1. Check WebCodecs API
30
29
if (typeof (globalThis as any).VideoDecoder !== 'undefined') {
31
30
try {
32
31
const support = await (globalThis as any).VideoDecoder.isConfigSupported({
45
44
} catch {}
46
45
}
47
46
48
- // 2. Check Native HTMLMediaElement / MSE
49
47
if (typeof document !== 'undefined' && typeof document.createElement === 'function') {
50
48
try {
51
49
const v = document.createElement('video');
63
61
} catch {}
64
62
}
65
63
66
- // 3. Headless / Node testing environment capability fallback
67
64
if (typeof process !== 'undefined' && process.env) {
68
65
return {
69
66
codec,
73
70
};
74
71
}
75
72
76
- // 4. Royalty-free WASM software decoders
77
73
const royaltyFreeCodecs = ['av01.', 'vp8', 'vp09.', 'theora'];
78
74
const isRoyaltyFree = royaltyFreeCodecs.some(rf => codec.toLowerCase().includes(rf));
79
75
157
153
export class FFmpegWasmOptInFallback {
158
154
constructor() {
159
155
console.warn(
160
- '⚠️ [media-runtime NOTICE] FFmpeg WASM fallback plugin loaded! ' +
156
+ '⚠️ [VidoLib NOTICE] FFmpeg WASM fallback plugin loaded! ' +
161
157
'This software decoder bundle increases package size by ~12MB and may carry patent licensing obligations for H.264/HEVC/AC-3.'
162
158
);
163
159
}
164
160
▼packages/containers/package.json
+1-1
1
1
{
2
- "name": "@media-runtime/containers",
2
+ "name": "@vidolib/containers",
3
3
"version": "1.0.0",
4
4
"description": "Isolated demuxers for MP4, MKV, WebM, AVI, MOV, FLV, TS, PS, OGG, and ASF containers",
5
5
"main": "dist/index.cjs",
6
6
▼packages/containers/src/index.ts
+2-13
1
-import { BitStreamReader } from '@media-runtime/utils';
2
-import { VideoPacket, AudioPacket, SubtitlePacket, Track } from '@media-runtime/core';
1
+import { BitStreamReader } from '@vidolib/utils';
2
+import { VideoPacket, AudioPacket, SubtitlePacket, Track } from '@vidolib/core';
3
3
4
4
export interface DemuxResult {
5
5
tracks: Track[];
14
14
demux(data: Uint8Array): DemuxResult;
15
15
}
16
16
17
-// 1. MP4 Demuxer (ISO-BMFF)
18
17
export class MP4Demuxer implements ContainerDemuxer {
19
18
public readonly formatName: string = 'mp4';
20
19
42
41
if (boxSize < 8 && boxSize !== 0) break;
43
42
const payloadSize = boxSize === 0 ? reader.byteLength - reader.position : boxSize - 8;
44
43
45
- // Security check against unbounded memory allocations
46
44
if (payloadSize > 50 * 1024 * 1024) {
47
45
throw new Error(`[Security] MP4 Box size ${payloadSize} exceeds maximum safety limit (50MB)`);
48
46
}
49
47
50
48
if (reader.position + payloadSize > reader.byteLength) {
51
- // Truncated box payload - stop demuxing safely
52
49
break;
53
50
}
54
51
78
75
}
79
76
}
80
77
81
-// 2. MOV Demuxer
82
78
export class MOVDemuxer extends MP4Demuxer {
83
79
override readonly formatName: string = 'mov';
84
80
override probe(data: Uint8Array): boolean {
90
86
}
91
87
}
92
88
93
-// 3. MKV & 4. WebM Demuxer
94
89
export class MKVDemuxer implements ContainerDemuxer {
95
90
public readonly formatName: string = 'mkv';
96
91
119
114
override readonly formatName: string = 'webm';
120
115
}
121
116
122
-// 5. FLV Demuxer
123
117
export class FLVDemuxer implements ContainerDemuxer {
124
118
public readonly formatName: string = 'flv';
125
119
162
156
}
163
157
}
164
158
165
-// 6. TS Demuxer
166
159
export class TSDemuxer implements ContainerDemuxer {
167
160
public readonly formatName: string = 'ts';
168
161
197
190
}
198
191
}
199
192
200
-// 7. PS Demuxer
201
193
export class PSDemuxer implements ContainerDemuxer {
202
194
public readonly formatName: string = 'ps';
203
195
215
207
}
216
208
}
217
209
218
-// 8. AVI Demuxer
219
210
export class AVIDemuxer implements ContainerDemuxer {
220
211
public readonly formatName: string = 'avi';
221
212
238
229
}
239
230
}
240
231
241
-// 9. OGG Demuxer
242
232
export class OGGDemuxer implements ContainerDemuxer {
243
233
public readonly formatName: string = 'ogg';
244
234
256
246
}
257
247
}
258
248
259
-// 10. ASF Demuxer
260
249
export class ASFDemuxer implements ContainerDemuxer {
261
250
public readonly formatName: string = 'asf';
262
251
263
252
▼packages/core/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/core",
2
+ "name": "@vidolib/core",
3
3
"version": "1.0.0",
4
- "description": "Core player, master clock, pipeline, scheduler, and packet contracts for media-runtime",
4
+ "description": "Core player, master clock, pipeline, scheduler, and packet contracts for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/core/src/index.ts
+3-5
1
-import { PluginRegistry, MediaPlugin, PluginContext } from '@media-runtime/plugins';
1
+import { PluginRegistry, MediaPlugin, PluginContext } from '@vidolib/plugins';
2
2
3
3
export interface VideoPacket {
4
- pts: number; // Presentation timestamp in seconds
5
- dts: number; // Decode timestamp in seconds
4
+ pts: number;
5
+ dts: number;
6
6
data: Uint8Array;
7
7
isKeyframe: boolean;
8
8
duration?: number;
113
113
private durationSeconds: number = 0;
114
114
private volumeLevel: number = 1.0;
115
115
private isMuted: boolean = false;
116
- private activeTracks: Map<TrackKind, Track> = new Map();
117
116
118
117
constructor(initialConfig?: Record<string, unknown>) {
119
118
if (initialConfig) {
140
139
this.setState('loading');
141
140
try {
142
141
this.emit('loadstart', { source });
143
- // Pipeline execution via registered plugins
144
142
this.setState('paused');
145
143
} catch (err) {
146
144
this.setState('error');
147
145
▼packages/drm/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/drm",
2
+ "name": "@vidolib/drm",
3
3
"version": "1.0.0",
4
- "description": "Encrypted Media Extensions (EME) plugin interface for Widevine, PlayReady, and FairPlay",
4
+ "description": "Encrypted Media Extensions (EME) plugin interface for Widevine, PlayReady, and FairPlay in VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/drm/src/index.ts
+1-1
1
-import { MediaPlugin, PluginContext } from '@media-runtime/plugins';
1
+import { MediaPlugin, PluginContext } from '@vidolib/plugins';
2
2
3
3
export type KeySystem =
4
4
| 'com.widevine.alpha'
5
5
▼packages/manifest/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/manifest",
2
+ "name": "@vidolib/manifest",
3
3
"version": "1.0.0",
4
- "description": "HLS (.m3u8) and DASH (.mpd) manifest parsing with common variant and rendition model",
4
+ "description": "HLS (.m3u8) and DASH (.mpd) manifest parsing with common variant and rendition model for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/os-integration/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/os-integration",
2
+ "name": "@vidolib/os-integration",
3
3
"version": "1.0.0",
4
- "description": "Media Session API, Picture-in-Picture, Fullscreen, and Cast/AirPlay OS plugins",
4
+ "description": "Media Session API, Picture-in-Picture, Fullscreen, and Cast/AirPlay OS plugins for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/os-integration/src/index.ts
+1-1
1
-import { MediaPlugin, PluginContext } from '@media-runtime/plugins';
1
+import { MediaPlugin, PluginContext } from '@vidolib/plugins';
2
2
3
3
export interface MediaMetadataConfig {
4
4
title: string;
5
5
▼packages/plugins/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/plugins",
2
+ "name": "@vidolib/plugins",
3
3
"version": "1.0.0",
4
- "description": "Plugin architecture and lifecycle contracts for media-runtime",
4
+ "description": "Plugin architecture and lifecycle contracts for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/renderer/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/renderer",
2
+ "name": "@vidolib/renderer",
3
3
"version": "1.0.0",
4
- "description": "Canvas2D, WebGL, and WebGPU high-performance video frame renderers",
4
+ "description": "Canvas2D, WebGL, and WebGPU high-performance video frame renderers for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/scheduler/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/scheduler",
2
+ "name": "@vidolib/scheduler",
3
3
"version": "1.0.0",
4
- "description": "Audio/Video synchronization, frame timing, dropped frame counter, and speed controller",
4
+ "description": "Audio/Video synchronization, frame timing, dropped frame counter, and speed controller for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/scheduler/src/index.ts
+2-4
1
-import { Clock, VideoPacket } from '@media-runtime/core';
1
+import { Clock, VideoPacket } from '@vidolib/core';
2
2
3
3
export interface SchedulerStats {
4
4
renderedFrames: number;
9
9
export class AVSynchronizer {
10
10
private renderedFramesCount: number = 0;
11
11
private droppedFramesCount: number = 0;
12
- private maxDriftThresholdMs: number = 40; // 40ms A/V sync tolerance window
12
+ private maxDriftThresholdMs: number = 40;
13
13
14
14
constructor(private clock: Clock) {}
15
15
18
18
const diffMs = (videoPts - audioPts) * 1000;
19
19
20
20
if (diffMs < -this.maxDriftThresholdMs) {
21
- // Video is too far behind audio -> drop frame to catch up
22
21
this.droppedFramesCount++;
23
22
return 'drop';
24
23
} else if (diffMs > this.maxDriftThresholdMs) {
25
- // Video is ahead of audio -> wait for audio clock to advance
26
24
return 'wait';
27
25
}
28
26
29
27
▼packages/security/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/security",
2
+ "name": "@vidolib/security",
3
3
"version": "1.0.0",
4
- "description": "Container parser fuzzing targets, byte mutation engine, and CSP sandbox helpers",
4
+ "description": "Container parser fuzzing targets, byte mutation engine, and CSP sandbox helpers for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/security/src/index.ts
+3-3
1
-import { ContainerDemuxer } from '@media-runtime/containers';
1
+import { ContainerDemuxer } from '@vidolib/containers';
2
2
3
3
export interface FuzzResult {
4
4
iterations: number;
47
47
msg.includes('End of Stream') ||
48
48
msg.includes('out of bounds')
49
49
) {
50
- // Expected input validation catch
50
+ // Expected catch
51
51
} else {
52
52
crashes++;
53
53
errors.push({ iteration: i, message: msg });
60
60
}
61
61
62
62
export const CSP_RECOMMENDED_DIRECTIVES = `
63
-# media-runtime Recommended Content Security Policy (CSP)
63
+# VidoLib Recommended Content Security Policy (CSP)
64
64
default-src 'self';
65
65
script-src 'self' 'wasm-unsafe-eval' blob:;
66
66
worker-src 'self' blob:;
67
67
▼packages/stream/package.json
+1-1
1
1
{
2
- "name": "@media-runtime/stream",
2
+ "name": "@vidolib/stream",
3
3
"version": "1.0.0",
4
4
"description": "Source adapters normalizing HTTP, Blob, File, WebSocket, WebRTC, S3, and IPFS to ReadableStream<Uint8Array>",
5
5
"main": "dist/index.cjs",
6
6
▼packages/subtitle/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/subtitle",
2
+ "name": "@vidolib/subtitle",
3
3
"version": "1.0.0",
4
- "description": "GPU/Canvas subtitle engine supporting ASS, SSA, SRT, VTT, and PGS formats",
4
+ "description": "GPU/Canvas subtitle engine supporting ASS, SSA, SRT, VTT, and PGS formats for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/subtitle/src/index.ts
+3-3
1
-import { SubtitlePacket } from '@media-runtime/core';
1
+import { SubtitlePacket } from '@vidolib/core';
2
2
3
3
export class SRTParser {
4
4
public static parse(srtText: string): SubtitlePacket[] {
50
50
packets.push({
51
51
startTime: this.parseTimestamp(start),
52
52
endTime: this.parseTimestamp(end),
53
- text: rawText.replace(/\{[^}]+\}/g, ''), // Plain text
54
- styledMarkup: rawText // Preserve ASS styling tags {\k50}, {\pos(x,y)}, etc.
53
+ text: rawText.replace(/\{[^}]+\}/g, ''),
54
+ styledMarkup: rawText
55
55
});
56
56
}
57
57
}
58
58
▼packages/telemetry/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/telemetry",
2
+ "name": "@vidolib/telemetry",
3
3
"version": "1.0.0",
4
- "description": "Zero-tracking QoE event bus and telemetry surface for media-runtime",
4
+ "description": "Zero-tracking QoE event bus and telemetry surface for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/telemetry/src/index.ts
+2-2
1
-import { MediaPlugin, PluginContext } from '@media-runtime/plugins';
1
+import { MediaPlugin, PluginContext } from '@vidolib/plugins';
2
2
3
3
export interface QoEMetrics {
4
4
startupTimeMs: number;
5
5
totalPlayTimeSeconds: number;
6
6
totalRebufferTimeSeconds: number;
7
- rebufferRatio: number; // rebufferTime / totalPlayTime
7
+ rebufferRatio: number;
8
8
bitrateSwitchCount: number;
9
9
droppedFramesCount: number;
10
10
currentBitrate: number;
11
11
▼packages/ui/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/ui",
2
+ "name": "@vidolib/ui",
3
3
"version": "1.0.0",
4
- "description": "Framework-agnostic, WCAG 2.1 AA compliant UI controls for media-runtime",
4
+ "description": "Framework-agnostic, WCAG 2.1 AA compliant UI controls for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/ui/src/index.ts
+14-22
1
-import { Player } from '@media-runtime/core';
1
+import { Player } from '@vidolib/core';
2
2
3
3
export class PlayerUI {
4
4
private container: HTMLElement;
19
19
}
20
20
21
21
private initDOM(): void {
22
- this.container.classList.add('media-runtime-container');
22
+ this.container.classList.add('vidolib-container');
23
23
this.container.setAttribute('role', 'region');
24
- this.container.setAttribute('aria-label', 'Media Player Controls');
24
+ this.container.setAttribute('aria-label', 'VidoLib Media Player Controls');
25
25
this.container.style.position = 'relative';
26
26
this.container.style.overflow = 'hidden';
27
27
this.container.style.backgroundColor = '#000';
28
28
29
- // Apply dark glassmorphic styling
30
29
const style = document.createElement('style');
31
30
style.textContent = `
32
- .media-runtime-controls {
31
+ .vidolib-controls {
33
32
position: absolute;
34
33
bottom: 0;
35
34
left: 0;
47
46
box-sizing: border-box;
48
47
z-index: 100;
49
48
}
50
- .media-runtime-btn {
49
+ .vidolib-btn {
51
50
background: transparent;
52
51
border: none;
53
52
color: #F8FAFC;
58
57
align-items: center;
59
58
justify-content: center;
60
59
}
61
- .media-runtime-btn:focus-visible {
60
+ .vidolib-btn:focus-visible {
62
61
outline: 2px solid #38BDF8;
63
62
outline-offset: 2px;
64
63
}
65
- .media-runtime-slider {
64
+ .vidolib-slider {
66
65
accent-color: #38BDF8;
67
66
cursor: pointer;
68
67
flex: 1;
71
70
document.head.appendChild(style);
72
71
73
72
this.controlsBar = document.createElement('div');
74
- this.controlsBar.className = 'media-runtime-controls';
73
+ this.controlsBar.className = 'vidolib-controls';
75
74
76
- // Play/Pause Button
77
75
this.playBtn = document.createElement('button');
78
- this.playBtn.className = 'media-runtime-btn';
76
+ this.playBtn.className = 'vidolib-btn';
79
77
this.playBtn.setAttribute('aria-label', 'Play');
80
78
this.playBtn.innerHTML = '▶';
81
79
82
- // Time Slider
83
80
this.timeSlider = document.createElement('input');
84
81
this.timeSlider.type = 'range';
85
- this.timeSlider.className = 'media-runtime-slider';
82
+ this.timeSlider.className = 'vidolib-slider';
86
83
this.timeSlider.min = '0';
87
84
this.timeSlider.max = '100';
88
85
this.timeSlider.value = '0';
89
86
this.timeSlider.setAttribute('aria-label', 'Seek timeline');
90
87
91
- // Time Display
92
88
this.timeDisplay = document.createElement('span');
93
89
this.timeDisplay.textContent = '00:00 / 00:00';
94
90
95
- // Volume Button
96
91
this.volumeBtn = document.createElement('button');
97
- this.volumeBtn.className = 'media-runtime-btn';
92
+ this.volumeBtn.className = 'vidolib-btn';
98
93
this.volumeBtn.setAttribute('aria-label', 'Mute');
99
94
this.volumeBtn.innerHTML = '🔊';
100
95
101
- // Volume Slider
102
96
this.volumeSlider = document.createElement('input');
103
97
this.volumeSlider.type = 'range';
104
- this.volumeSlider.className = 'media-runtime-slider';
98
+ this.volumeSlider.className = 'vidolib-slider';
105
99
this.volumeSlider.style.width = '60px';
106
100
this.volumeSlider.min = '0';
107
101
this.volumeSlider.max = '1';
109
103
this.volumeSlider.value = '1';
110
104
this.volumeSlider.setAttribute('aria-label', 'Volume level');
111
105
112
- // PiP Button
113
106
this.pipBtn = document.createElement('button');
114
- this.pipBtn.className = 'media-runtime-btn';
107
+ this.pipBtn.className = 'vidolib-btn';
115
108
this.pipBtn.setAttribute('aria-label', 'Picture in Picture');
116
109
this.pipBtn.innerHTML = '⧉';
117
110
118
- // Fullscreen Button
119
111
this.fullscreenBtn = document.createElement('button');
120
- this.fullscreenBtn.className = 'media-runtime-btn';
112
+ this.fullscreenBtn.className = 'vidolib-btn';
121
113
this.fullscreenBtn.setAttribute('aria-label', 'Toggle Fullscreen');
122
114
this.fullscreenBtn.innerHTML = '⛶';
123
115
124
116
▼packages/utils/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/utils",
2
+ "name": "@vidolib/utils",
3
3
"version": "1.0.0",
4
- "description": "Shared bitstream readers, ring buffers, and utilities for media-runtime",
4
+ "description": "Shared bitstream readers, ring buffers, and utilities for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼packages/worker/package.json
+2-2
1
1
{
2
- "name": "@media-runtime/worker",
2
+ "name": "@vidolib/worker",
3
3
"version": "1.0.0",
4
- "description": "Worker thread orchestration and Transferable object pipeline for media-runtime",
4
+ "description": "Worker thread orchestration and Transferable object pipeline for VidoLib",
5
5
"main": "dist/index.cjs",
6
6
"module": "dist/index.js",
7
7
"types": "dist/index.d.ts",
8
8
▼scripts/build-all.js
+3-4
12
12
.filter(d => d.isDirectory())
13
13
.map(d => d.name);
14
14
15
-console.log(`⚡ Building ${packages.length} packages using Go-powered esbuild...\n`);
15
+console.log(`⚡ Building ${packages.length} packages in VidoLib monorepo using Go-powered esbuild...\n`);
16
16
const startTotal = performance.now();
17
17
18
18
for (const pkg of packages) {
26
26
fs.mkdirSync(distDir, { recursive: true });
27
27
}
28
28
29
- const globalName = `MediaRuntime${pkg.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('')}`;
29
+ const globalName = `VidoLib${pkg.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('')}`;
30
30
31
31
// 1. Build ESM (.js)
32
32
esbuild.buildSync({
61
61
sourcemap: true
62
62
});
63
63
64
- console.log(`⚡ [esbuild] @media-runtime/${pkg.padEnd(16)} -> ESM, CJS & UMD (Global: window.${globalName})`);
64
+ console.log(`⚡ [esbuild] @vidolib/${pkg.padEnd(16)} -> ESM, CJS & UMD (Global: window.${globalName})`);
65
65
}
66
66
67
67
// 4. Generate TypeScript Type Declarations (.d.ts) via tsc --emitDeclarationOnly
70
70
execSync('npx tsc --emitDeclarationOnly', { cwd: rootDir, stdio: 'inherit' });
71
71
console.log('✅ Type Declarations (.d.ts) generated successfully.');
72
72
} catch {
73
- // Copy src/index.ts fallback typings if any warning
74
73
for (const pkg of packages) {
75
74
const srcIndex = path.join(rootDir, 'packages', pkg, 'src', 'index.ts');
76
75
const distDts = path.join(rootDir, 'packages', pkg, 'dist', 'index.d.ts');
77
76
▼scripts/build-umd.js
+3-5
1
1
import fs from 'node:fs';
2
2
import path from 'node:path';
3
3
import { fileURLToPath } from 'node:url';
4
-import { execSync } from 'node:child_process';
5
4
6
5
const __filename = fileURLToPath(import.meta.url);
7
6
const __dirname = path.dirname(__filename);
13
12
'scheduler', 'os-integration', 'telemetry', 'security', 'ui'
14
13
];
15
14
16
-console.log('Building UMD/IIFE CDN bundles for all packages...');
15
+console.log('Building UMD/IIFE CDN bundles for VidoLib packages...');
17
16
18
17
for (const pkg of packages) {
19
18
const pkgDir = path.join(rootDir, 'packages', pkg);
25
24
const indexJs = path.join(distDir, 'index.js');
26
25
if (fs.existsSync(indexJs)) {
27
26
const code = fs.readFileSync(indexJs, 'utf8');
28
- const globalName = `MediaRuntime${pkg.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('')}`;
27
+ const globalName = `VidoLib${pkg.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('')}`;
29
28
30
- // Generate UMD wrapper
31
29
const umdContent = `(function (root, factory) {
32
30
if (typeof define === 'function' && define.amd) {
33
31
define(['exports'], factory);
44
42
45
43
fs.writeFileSync(path.join(distDir, 'index.umd.js'), umdContent, 'utf8');
46
44
fs.writeFileSync(path.join(distDir, 'index.umd.js.map'), `{"version":3,"sources":["index.js"],"names":[],"mappings":""}`, 'utf8');
47
- console.log(` Created UMD bundle: @media-runtime/${pkg} -> dist/index.umd.js (Global: window.${globalName})`);
45
+ console.log(` Created UMD bundle: @vidolib/${pkg} -> dist/index.umd.js (Global: window.${globalName})`);
48
46
}
49
47
}
50
48
51
49
▼scripts/check-licensing.js
+1-3
26
26
} else if (entry.isFile()) {
27
27
const lowerName = entry.name.toLowerCase();
28
28
29
- // Check WASM files
30
29
if (lowerName.endsWith('.wasm')) {
31
30
let isAllowed = false;
32
31
for (const allowed of ROYALTY_FREE_ALLOWLIST) {
40
39
}
41
40
}
42
41
43
- // Check JS/TS files in packages/codecs/software for prohibited patent pool software implementations
44
42
if ((lowerName.endsWith('.ts') || lowerName.endsWith('.js')) && fullPath.includes('packages/codecs/src/software')) {
45
43
const content = fs.readFileSync(fullPath, 'utf8').toLowerCase();
46
44
for (const prohibited of PROHIBITED_WASM_CODECS) {
56
54
}
57
55
58
56
const packagesDir = path.join(rootDir, 'packages');
59
-console.log('Running media-runtime Codec Licensing Audit...');
57
+console.log('Running VidoLib Codec Licensing Audit...');
60
58
const errors = scanDirectory(packagesDir);
61
59
62
60
if (errors.length > 0) {
63
61
▼scripts/size-limit.js
+3-4
29
29
{ package: 'utils', maxSizeKb: 25 }
30
30
];
31
31
32
-console.log('Running Bundle Size Budget Audit...\n');
32
+console.log('Running VidoLib Bundle Size Budget Audit...\n');
33
33
let failed = false;
34
34
35
35
for (const item of BUDGETS) {
45
45
totalBytes += gzipped.length;
46
46
}
47
47
} else {
48
- // Estimate based on src if dist not yet built
49
48
const srcPath = path.join(rootDir, 'packages', item.package, 'src');
50
49
if (fs.existsSync(srcPath)) {
51
50
const getFiles = (dir) => {
65
64
for (const file of files) {
66
65
const content = fs.readFileSync(file);
67
66
const gzipped = zlib.gzipSync(content);
68
- totalBytes += Math.floor(gzipped.length * 0.4); // compressed JS estimate
67
+ totalBytes += Math.floor(gzipped.length * 0.4);
69
68
}
70
69
}
71
70
}
74
73
const status = totalBytes <= item.maxSizeKb * 1024 ? '✅ PASS' : '❌ FAIL';
75
74
if (totalBytes > item.maxSizeKb * 1024) failed = true;
76
75
77
- console.log(`${status} @media-runtime/${item.package.padEnd(16)} Size: ${sizeKb.padStart(6)} KB (Max Budget: ${item.maxSizeKb} KB gzipped)`);
76
+ console.log(`${status} @vidolib/${item.package.padEnd(16)} Size: ${sizeKb.padStart(6)} KB (Max Budget: ${item.maxSizeKb} KB gzipped)`);
78
77
}
79
78
80
79
if (failed) {
81
80
▼tests/all.test.ts
+10-10
16
16
import { TelemetryPlugin } from '../packages/telemetry/src/index.js';
17
17
import { FuzzTarget } from '../packages/security/src/index.js';
18
18
19
-describe('media-runtime Comprehensive Monorepo Unit Test Suite', () => {
20
- it('@media-runtime/utils: BitStreamReader & RingBuffer', () => {
19
+describe('VidoLib Comprehensive Monorepo Unit Test Suite', () => {
20
+ it('@vidolib/utils: BitStreamReader & RingBuffer', () => {
21
21
const data = new Uint8Array([0x12, 0x34, 0x56, 0x78]);
22
22
const reader = new BitStreamReader(data);
23
23
expect(reader.readUint16BE()).toBe(0x1234);
30
30
expect(Array.from(out)).toEqual([1, 2, 3, 4]);
31
31
});
32
32
33
- it('@media-runtime/core: Player state lifecycle and clock', () => {
33
+ it('@vidolib/core: Player state lifecycle and clock', () => {
34
34
const player = new Player();
35
35
expect(player.getState()).toBe('idle');
36
36
player.play();
41
41
expect(player.getCurrentTime()).toBe(15.5);
42
42
});
43
43
44
- it('@media-runtime/plugins: Plugin registration and event dispatching', async () => {
44
+ it('@vidolib/plugins: Plugin registration and event dispatching', async () => {
45
45
const registry = new PluginRegistry();
46
46
let eventReceived = false;
47
47
await registry.register({
58
58
expect(eventReceived).toBe(true);
59
59
});
60
60
61
- it('@media-runtime/containers: Demuxer probing & demuxing', () => {
61
+ it('@vidolib/containers: Demuxer probing & demuxing', () => {
62
62
const registry = new ContainerRegistry();
63
- const mp4Data = new Uint8Array([0x00, 0x00, 0x00, 0x14, 0x66, 0x74, 0x79, 0x70]); // ftyp
63
+ const mp4Data = new Uint8Array([0x00, 0x00, 0x00, 0x14, 0x66, 0x74, 0x79, 0x70]);
64
64
const res = registry.autoDemux(mp4Data);
65
65
expect(res.tracks.length).toBeGreaterThan(0);
66
66
68
68
expect(flv.probe(new Uint8Array([0x46, 0x4C, 0x56]))).toBe(true);
69
69
});
70
70
71
- it('@media-runtime/manifest: HLS & DASH parsing', () => {
71
+ it('@vidolib/manifest: HLS & DASH parsing', () => {
72
72
const hls = `#EXTM3U
73
73
#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720,CODECS="avc1.4d401f"
74
74
http://example.com/stream.m3u8`;
77
77
expect(playlist.renditions[0].bandwidth).toBe(2000000);
78
78
});
79
79
80
- it('@media-runtime/codecs: Codec capability negotiation', async () => {
80
+ it('@vidolib/codecs: Codec capability negotiation', async () => {
81
81
const cap = await CodecNegotiator.negotiateVideo('avc1.4d401f');
82
82
expect(cap.supported).toBe(true);
83
83
});
84
84
85
- it('@media-runtime/subtitle: SRT and ASS subtitle parsers', () => {
85
+ it('@vidolib/subtitle: SRT and ASS subtitle parsers', () => {
86
86
const srt = `1
87
87
00:00:01,000 --> 00:00:04,000
88
88
Hello World`;
92
92
expect(packets[0].startTime).toBe(1);
93
93
});
94
94
95
- it('@media-runtime/security: Container parser fuzz target', () => {
95
+ it('@vidolib/security: Container parser fuzz target', () => {
96
96
const demuxer = new MP4Demuxer();
97
97
const sample = new Uint8Array([0x00, 0x00, 0x00, 0x14, 0x66, 0x74, 0x79, 0x70]);
98
98
const res = FuzzTarget.run(demuxer, sample, 20);
99
99
▼tsconfig.json
+19-19
6
6
"lib": ["ES2022", "DOM", "DOM.Iterable", "WebWorker"],
7
7
"baseUrl": ".",
8
8
"paths": {
9
- "@media-runtime/utils": ["packages/utils/src/index.ts"],
10
- "@media-runtime/plugins": ["packages/plugins/src/index.ts"],
11
- "@media-runtime/core": ["packages/core/src/index.ts"],
12
- "@media-runtime/stream": ["packages/stream/src/index.ts"],
13
- "@media-runtime/buffer": ["packages/buffer/src/index.ts"],
14
- "@media-runtime/manifest": ["packages/manifest/src/index.ts"],
15
- "@media-runtime/abr": ["packages/abr/src/index.ts"],
16
- "@media-runtime/containers": ["packages/containers/src/index.ts"],
17
- "@media-runtime/codecs": ["packages/codecs/src/index.ts"],
18
- "@media-runtime/drm": ["packages/drm/src/index.ts"],
19
- "@media-runtime/renderer": ["packages/renderer/src/index.ts"],
20
- "@media-runtime/audio": ["packages/audio/src/index.ts"],
21
- "@media-runtime/subtitle": ["packages/subtitle/src/index.ts"],
22
- "@media-runtime/worker": ["packages/worker/src/index.ts"],
23
- "@media-runtime/scheduler": ["packages/scheduler/src/index.ts"],
24
- "@media-runtime/os-integration": ["packages/os-integration/src/index.ts"],
25
- "@media-runtime/telemetry": ["packages/telemetry/src/index.ts"],
26
- "@media-runtime/security": ["packages/security/src/index.ts"],
27
- "@media-runtime/ui": ["packages/ui/src/index.ts"]
9
+ "@vidolib/utils": ["packages/utils/src/index.ts"],
10
+ "@vidolib/plugins": ["packages/plugins/src/index.ts"],
11
+ "@vidolib/core": ["packages/core/src/index.ts"],
12
+ "@vidolib/stream": ["packages/stream/src/index.ts"],
13
+ "@vidolib/buffer": ["packages/buffer/src/index.ts"],
14
+ "@vidolib/manifest": ["packages/manifest/src/index.ts"],
15
+ "@vidolib/abr": ["packages/abr/src/index.ts"],
16
+ "@vidolib/containers": ["packages/containers/src/index.ts"],
17
+ "@vidolib/codecs": ["packages/codecs/src/index.ts"],
18
+ "@vidolib/drm": ["packages/drm/src/index.ts"],
19
+ "@vidolib/renderer": ["packages/renderer/src/index.ts"],
20
+ "@vidolib/audio": ["packages/audio/src/index.ts"],
21
+ "@vidolib/subtitle": ["packages/subtitle/src/index.ts"],
22
+ "@vidolib/worker": ["packages/worker/src/index.ts"],
23
+ "@vidolib/scheduler": ["packages/scheduler/src/index.ts"],
24
+ "@vidolib/os-integration": ["packages/os-integration/src/index.ts"],
25
+ "@vidolib/telemetry": ["packages/telemetry/src/index.ts"],
26
+ "@vidolib/security": ["packages/security/src/index.ts"],
27
+ "@vidolib/ui": ["packages/ui/src/index.ts"]
28
28
},
29
29
"declaration": true,
30
30
"declarationMap": true,
31
31
▼vitest.config.ts
+19-19
4
4
export default defineConfig({
5
5
resolve: {
6
6
alias: {
7
- '@media-runtime/utils': path.resolve(__dirname, 'packages/utils/src/index.ts'),
8
- '@media-runtime/plugins': path.resolve(__dirname, 'packages/plugins/src/index.ts'),
9
- '@media-runtime/core': path.resolve(__dirname, 'packages/core/src/index.ts'),
10
- '@media-runtime/stream': path.resolve(__dirname, 'packages/stream/src/index.ts'),
11
- '@media-runtime/buffer': path.resolve(__dirname, 'packages/buffer/src/index.ts'),
12
- '@media-runtime/manifest': path.resolve(__dirname, 'packages/manifest/src/index.ts'),
13
- '@media-runtime/abr': path.resolve(__dirname, 'packages/abr/src/index.ts'),
14
- '@media-runtime/containers': path.resolve(__dirname, 'packages/containers/src/index.ts'),
15
- '@media-runtime/codecs': path.resolve(__dirname, 'packages/codecs/src/index.ts'),
16
- '@media-runtime/drm': path.resolve(__dirname, 'packages/drm/src/index.ts'),
17
- '@media-runtime/renderer': path.resolve(__dirname, 'packages/renderer/src/index.ts'),
18
- '@media-runtime/audio': path.resolve(__dirname, 'packages/audio/src/index.ts'),
19
- '@media-runtime/subtitle': path.resolve(__dirname, 'packages/subtitle/src/index.ts'),
20
- '@media-runtime/worker': path.resolve(__dirname, 'packages/worker/src/index.ts'),
21
- '@media-runtime/scheduler': path.resolve(__dirname, 'packages/scheduler/src/index.ts'),
22
- '@media-runtime/os-integration': path.resolve(__dirname, 'packages/os-integration/src/index.ts'),
23
- '@media-runtime/telemetry': path.resolve(__dirname, 'packages/telemetry/src/index.ts'),
24
- '@media-runtime/security': path.resolve(__dirname, 'packages/security/src/index.ts'),
25
- '@media-runtime/ui': path.resolve(__dirname, 'packages/ui/src/index.ts')
7
+ '@vidolib/utils': path.resolve(__dirname, 'packages/utils/src/index.ts'),
8
+ '@vidolib/plugins': path.resolve(__dirname, 'packages/plugins/src/index.ts'),
9
+ '@vidolib/core': path.resolve(__dirname, 'packages/core/src/index.ts'),
10
+ '@vidolib/stream': path.resolve(__dirname, 'packages/stream/src/index.ts'),
11
+ '@vidolib/buffer': path.resolve(__dirname, 'packages/buffer/src/index.ts'),
12
+ '@vidolib/manifest': path.resolve(__dirname, 'packages/manifest/src/index.ts'),
13
+ '@vidolib/abr': path.resolve(__dirname, 'packages/abr/src/index.ts'),
14
+ '@vidolib/containers': path.resolve(__dirname, 'packages/containers/src/index.ts'),
15
+ '@vidolib/codecs': path.resolve(__dirname, 'packages/codecs/src/index.ts'),
16
+ '@vidolib/drm': path.resolve(__dirname, 'packages/drm/src/index.ts'),
17
+ '@vidolib/renderer': path.resolve(__dirname, 'packages/renderer/src/index.ts'),
18
+ '@vidolib/audio': path.resolve(__dirname, 'packages/audio/src/index.ts'),
19
+ '@vidolib/subtitle': path.resolve(__dirname, 'packages/subtitle/src/index.ts'),
20
+ '@vidolib/worker': path.resolve(__dirname, 'packages/worker/src/index.ts'),
21
+ '@vidolib/scheduler': path.resolve(__dirname, 'packages/scheduler/src/index.ts'),
22
+ '@vidolib/os-integration': path.resolve(__dirname, 'packages/os-integration/src/index.ts'),
23
+ '@vidolib/telemetry': path.resolve(__dirname, 'packages/telemetry/src/index.ts'),
24
+ '@vidolib/security': path.resolve(__dirname, 'packages/security/src/index.ts'),
25
+ '@vidolib/ui': path.resolve(__dirname, 'packages/ui/src/index.ts')
26
26
}
27
27
},
28
28
test: {
29
29