@norskvideo/moq-hang 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 +65 -0
- package/catalog/audio.d.ts +139 -0
- package/catalog/audio.d.ts.map +1 -0
- package/catalog/audio.js +55 -0
- package/catalog/audio.js.map +1 -0
- package/catalog/consumer.d.ts +34 -0
- package/catalog/consumer.d.ts.map +1 -0
- package/catalog/consumer.js +30 -0
- package/catalog/consumer.js.map +1 -0
- package/catalog/container.d.ts +24 -0
- package/catalog/container.d.ts.map +1 -0
- package/catalog/container.js +30 -0
- package/catalog/container.js.map +1 -0
- package/catalog/format.d.ts +13 -0
- package/catalog/format.d.ts.map +1 -0
- package/catalog/format.js +24 -0
- package/catalog/format.js.map +1 -0
- package/catalog/index.d.ts +18 -0
- package/catalog/index.d.ts.map +1 -0
- package/catalog/index.js +19 -0
- package/catalog/index.js.map +1 -0
- package/catalog/integers.d.ts +23 -0
- package/catalog/integers.d.ts.map +1 -0
- package/catalog/integers.js +24 -0
- package/catalog/integers.js.map +1 -0
- package/catalog/priority.d.ts +7 -0
- package/catalog/priority.d.ts.map +1 -0
- package/catalog/priority.js +9 -0
- package/catalog/priority.js.map +1 -0
- package/catalog/producer.d.ts +31 -0
- package/catalog/producer.d.ts.map +1 -0
- package/catalog/producer.js +25 -0
- package/catalog/producer.js.map +1 -0
- package/catalog/root.d.ts +252 -0
- package/catalog/root.d.ts.map +1 -0
- package/catalog/root.js +17 -0
- package/catalog/root.js.map +1 -0
- package/catalog/root.test.d.ts +2 -0
- package/catalog/root.test.d.ts.map +1 -0
- package/catalog/root.test.js +20 -0
- package/catalog/root.test.js.map +1 -0
- package/catalog/timeline.d.ts +26 -0
- package/catalog/timeline.d.ts.map +1 -0
- package/catalog/timeline.js +33 -0
- package/catalog/timeline.js.map +1 -0
- package/catalog/track.d.ts +8 -0
- package/catalog/track.d.ts.map +1 -0
- package/catalog/track.js +7 -0
- package/catalog/track.js.map +1 -0
- package/catalog/video.d.ts +171 -0
- package/catalog/video.d.ts.map +1 -0
- package/catalog/video.js +87 -0
- package/catalog/video.js.map +1 -0
- package/container/cmaf/decode.d.ts +68 -0
- package/container/cmaf/decode.d.ts.map +1 -0
- package/container/cmaf/decode.js +303 -0
- package/container/cmaf/decode.js.map +1 -0
- package/container/cmaf/encode.d.ts +51 -0
- package/container/cmaf/encode.d.ts.map +1 -0
- package/container/cmaf/encode.js +834 -0
- package/container/cmaf/encode.js.map +1 -0
- package/container/cmaf/format.d.ts +12 -0
- package/container/cmaf/format.d.ts.map +1 -0
- package/container/cmaf/format.js +19 -0
- package/container/cmaf/format.js.map +1 -0
- package/container/cmaf/index.d.ts +9 -0
- package/container/cmaf/index.d.ts.map +1 -0
- package/container/cmaf/index.js +10 -0
- package/container/cmaf/index.js.map +1 -0
- package/container/consumer.d.ts +41 -0
- package/container/consumer.d.ts.map +1 -0
- package/container/consumer.js +424 -0
- package/container/consumer.js.map +1 -0
- package/container/consumer.test.d.ts +2 -0
- package/container/consumer.test.d.ts.map +1 -0
- package/container/consumer.test.js +396 -0
- package/container/consumer.test.js.map +1 -0
- package/container/format.d.ts +12 -0
- package/container/format.d.ts.map +1 -0
- package/container/format.js +3 -0
- package/container/format.js.map +1 -0
- package/container/index.d.ts +14 -0
- package/container/index.d.ts.map +1 -0
- package/container/index.js +18 -0
- package/container/index.js.map +1 -0
- package/container/legacy.d.ts +39 -0
- package/container/legacy.d.ts.map +1 -0
- package/container/legacy.js +53 -0
- package/container/legacy.js.map +1 -0
- package/container/timeline.d.ts +67 -0
- package/container/timeline.d.ts.map +1 -0
- package/container/timeline.js +87 -0
- package/container/timeline.js.map +1 -0
- package/container/types.d.ts +22 -0
- package/container/types.d.ts.map +1 -0
- package/container/types.js +22 -0
- package/container/types.js.map +1 -0
- package/index.d.ts +13 -0
- package/index.d.ts.map +1 -0
- package/index.js +18 -0
- package/index.js.map +1 -0
- package/package.json +37 -0
- package/util/aac.d.ts +8 -0
- package/util/aac.d.ts.map +1 -0
- package/util/aac.js +57 -0
- package/util/aac.js.map +1 -0
- package/util/aac.test.d.ts +2 -0
- package/util/aac.test.d.ts.map +1 -0
- package/util/aac.test.js +34 -0
- package/util/aac.test.js.map +1 -0
- package/util/hacks.d.ts +5 -0
- package/util/hacks.d.ts.map +1 -0
- package/util/hacks.js +6 -0
- package/util/hacks.js.map +1 -0
- package/util/hex.d.ts +5 -0
- package/util/hex.d.ts.map +1 -0
- package/util/hex.js +18 -0
- package/util/hex.js.map +1 -0
- package/util/index.d.ts +12 -0
- package/util/index.d.ts.map +1 -0
- package/util/index.js +18 -0
- package/util/index.js.map +1 -0
- package/util/latency.d.ts +38 -0
- package/util/latency.d.ts.map +1 -0
- package/util/latency.js +49 -0
- package/util/latency.js.map +1 -0
- package/util/libav.d.ts +3 -0
- package/util/libav.d.ts.map +1 -0
- package/util/libav.js +26 -0
- package/util/libav.js.map +1 -0
package/util/latency.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/* @ts-self-types="./latency.d.ts" */
|
|
2
|
+
import { Time } from "@norskvideo/moq-net";
|
|
3
|
+
import { Effect, Signal } from "@norskvideo/moq-signals";
|
|
4
|
+
/**
|
|
5
|
+
* A helper class that computes the final latency based on the catalog's jitter and the user's buffer.
|
|
6
|
+
* If the jitter is not present, then we use framerate to estimate a default.
|
|
7
|
+
*
|
|
8
|
+
* Effective latency = catalog.jitter + buffer
|
|
9
|
+
*/
|
|
10
|
+
export class Latency {
|
|
11
|
+
/** The user-configured buffer, added on top of the catalog jitter. */
|
|
12
|
+
buffer;
|
|
13
|
+
/** The track config supplying jitter and framerate. */
|
|
14
|
+
config;
|
|
15
|
+
/** The reactive effect recomputing the combined latency. */
|
|
16
|
+
signals = new Effect();
|
|
17
|
+
#combined = new Signal(0);
|
|
18
|
+
/** The effective latency in milliseconds (catalog jitter plus buffer). */
|
|
19
|
+
combined = this.#combined;
|
|
20
|
+
/** Start tracking latency from the given buffer and config signals. */
|
|
21
|
+
constructor(props) {
|
|
22
|
+
this.buffer = props.buffer;
|
|
23
|
+
this.config = props.config;
|
|
24
|
+
this.signals.run(this.#run.bind(this));
|
|
25
|
+
}
|
|
26
|
+
#run(effect) {
|
|
27
|
+
const buffer = effect.get(this.buffer);
|
|
28
|
+
// Compute the latency based on the catalog's jitter and the user's buffer.
|
|
29
|
+
const config = effect.get(this.config);
|
|
30
|
+
// Use jitter from catalog if available, otherwise estimate from framerate
|
|
31
|
+
let jitter = config?.jitter;
|
|
32
|
+
if (jitter === undefined && config?.framerate !== undefined && config.framerate > 0) {
|
|
33
|
+
// Estimate jitter as one frame duration if framerate is available
|
|
34
|
+
jitter = 1000 / config.framerate;
|
|
35
|
+
}
|
|
36
|
+
jitter ??= 0;
|
|
37
|
+
const latency = Time.Milli.add(jitter, buffer);
|
|
38
|
+
this.#combined.set(latency);
|
|
39
|
+
}
|
|
40
|
+
/** Read the current effective latency without subscribing. */
|
|
41
|
+
peek() {
|
|
42
|
+
return this.#combined.peek();
|
|
43
|
+
}
|
|
44
|
+
/** Stop tracking and release the effect. */
|
|
45
|
+
close() {
|
|
46
|
+
this.signals.close();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=latency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"latency.js","sourceRoot":"","sources":["../../src/util/latency.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,EAAe,MAAM,EAAE,MAAM,cAAc,CAAC;AAY3D;;;;;GAKG;AACH,MAAM,OAAO,OAAO;IACnB,sEAAsE;IACtE,MAAM,CAAyB;IAC/B,uDAAuD;IACvD,MAAM,CAAuC;IAE7C,4DAA4D;IAC5D,OAAO,GAAG,IAAI,MAAM,EAAE,CAAC;IAEvB,SAAS,GAAG,IAAI,MAAM,CAAiB,CAAmB,CAAC,CAAC;IAC5D,0EAA0E;IACjE,QAAQ,GAA2B,IAAI,CAAC,SAAS,CAAC;IAE3D,uEAAuE;IACvE,YAAY,KAAmB;QAC9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAE3B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,MAAc;QAClB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEvC,2EAA2E;QAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEvC,0EAA0E;QAC1E,IAAI,MAAM,GAAuB,MAAM,EAAE,MAAM,CAAC;QAChD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,EAAE,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YACrF,kEAAkE;YAClE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,CAAC;QACD,MAAM,KAAK,CAAC,CAAC;QAEb,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAwB,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,8DAA8D;IAC9D,IAAI;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,4CAA4C;IAC5C,KAAK;QACJ,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACD","sourcesContent":["import type * as Moq from \"@moq/net\";\nimport { Time } from \"@moq/net\";\nimport { Effect, type Getter, Signal } from \"@moq/signals\";\n\ntype ConfigWithJitter = { jitter?: number; framerate?: number };\n\n/** Options for constructing a {@link Latency}. */\nexport interface LatencyProps {\n\t/** The user-configured buffer, added on top of the catalog jitter. */\n\tbuffer: Signal<Moq.Time.Milli>;\n\t/** The track config supplying jitter and framerate, or undefined until known. */\n\tconfig: Getter<ConfigWithJitter | undefined>;\n}\n\n/**\n * A helper class that computes the final latency based on the catalog's jitter and the user's buffer.\n * If the jitter is not present, then we use framerate to estimate a default.\n *\n * Effective latency = catalog.jitter + buffer\n */\nexport class Latency {\n\t/** The user-configured buffer, added on top of the catalog jitter. */\n\tbuffer: Signal<Moq.Time.Milli>;\n\t/** The track config supplying jitter and framerate. */\n\tconfig: Getter<ConfigWithJitter | undefined>;\n\n\t/** The reactive effect recomputing the combined latency. */\n\tsignals = new Effect();\n\n\t#combined = new Signal<Moq.Time.Milli>(0 as Moq.Time.Milli);\n\t/** The effective latency in milliseconds (catalog jitter plus buffer). */\n\treadonly combined: Signal<Moq.Time.Milli> = this.#combined;\n\n\t/** Start tracking latency from the given buffer and config signals. */\n\tconstructor(props: LatencyProps) {\n\t\tthis.buffer = props.buffer;\n\t\tthis.config = props.config;\n\n\t\tthis.signals.run(this.#run.bind(this));\n\t}\n\n\t#run(effect: Effect): void {\n\t\tconst buffer = effect.get(this.buffer);\n\n\t\t// Compute the latency based on the catalog's jitter and the user's buffer.\n\t\tconst config = effect.get(this.config);\n\n\t\t// Use jitter from catalog if available, otherwise estimate from framerate\n\t\tlet jitter: number | undefined = config?.jitter;\n\t\tif (jitter === undefined && config?.framerate !== undefined && config.framerate > 0) {\n\t\t\t// Estimate jitter as one frame duration if framerate is available\n\t\t\tjitter = 1000 / config.framerate;\n\t\t}\n\t\tjitter ??= 0;\n\n\t\tconst latency = Time.Milli.add(jitter as Moq.Time.Milli, buffer);\n\t\tthis.#combined.set(latency);\n\t}\n\n\t/** Read the current effective latency without subscribing. */\n\tpeek(): Moq.Time.Milli {\n\t\treturn this.#combined.peek();\n\t}\n\n\t/** Stop tracking and release the effect. */\n\tclose(): void {\n\t\tthis.signals.close();\n\t}\n}\n"]}
|
package/util/libav.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"libav.d.ts","sourceRoot":"","sources":["../../src/util/libav.ts"],"names":[],"mappings":"AAEA,uHAAuH;AACvH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAuBjD"}
|
package/util/libav.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/* @ts-self-types="./libav.d.ts" */
|
|
2
|
+
let loading;
|
|
3
|
+
/** Load the libav WebCodecs polyfill (Opus) if AudioEncoder/AudioDecoder are missing. Resolves true once available. */
|
|
4
|
+
export async function polyfill() {
|
|
5
|
+
if (globalThis.AudioEncoder && globalThis.AudioDecoder) {
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
if (!loading) {
|
|
9
|
+
console.warn("using Opus polyfill; performance may be degraded");
|
|
10
|
+
// Load the polyfill and the libav variant we're using.
|
|
11
|
+
// TODO build with AAC support.
|
|
12
|
+
// I forked libavjs-webcodecs-polyfill to avoid Typescript errors; there's no changes otherwise.
|
|
13
|
+
loading = Promise.all([
|
|
14
|
+
import("@libav.js/variant-opus-af"),
|
|
15
|
+
import("@kixelated/libavjs-webcodecs-polyfill"),
|
|
16
|
+
]).then(async ([opus, libav]) => {
|
|
17
|
+
await libav.load({
|
|
18
|
+
LibAV: opus,
|
|
19
|
+
polyfill: true,
|
|
20
|
+
});
|
|
21
|
+
return true;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return await loading;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=libav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"libav.js","sourceRoot":"","sources":["../../src/util/libav.ts"],"names":[],"mappings":"AAAA,IAAI,OAAqC,CAAC;AAE1C,uHAAuH;AACvH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC7B,IAAI,UAAU,CAAC,YAAY,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAEjE,uDAAuD;QACvD,+BAA+B;QAC/B,gGAAgG;QAChG,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;YACrB,MAAM,CAAC,2BAA2B,CAAC;YACnC,MAAM,CAAC,uCAAuC,CAAC;SAC/C,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YAC/B,MAAM,KAAK,CAAC,IAAI,CAAC;gBAChB,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,IAAI;aACd,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,OAAO,CAAC;AACtB,CAAC","sourcesContent":["let loading: Promise<boolean> | undefined;\n\n/** Load the libav WebCodecs polyfill (Opus) if AudioEncoder/AudioDecoder are missing. Resolves true once available. */\nexport async function polyfill(): Promise<boolean> {\n\tif (globalThis.AudioEncoder && globalThis.AudioDecoder) {\n\t\treturn true;\n\t}\n\n\tif (!loading) {\n\t\tconsole.warn(\"using Opus polyfill; performance may be degraded\");\n\n\t\t// Load the polyfill and the libav variant we're using.\n\t\t// TODO build with AAC support.\n\t\t// I forked libavjs-webcodecs-polyfill to avoid Typescript errors; there's no changes otherwise.\n\t\tloading = Promise.all([\n\t\t\timport(\"@libav.js/variant-opus-af\"),\n\t\t\timport(\"@kixelated/libavjs-webcodecs-polyfill\"),\n\t\t]).then(async ([opus, libav]) => {\n\t\t\tawait libav.load({\n\t\t\t\tLibAV: opus,\n\t\t\t\tpolyfill: true,\n\t\t\t});\n\t\t\treturn true;\n\t\t});\n\t}\n\treturn await loading;\n}\n"]}
|