@norskvideo/norsk-studio-built-ins 1.27.0-2025-03-25-b3450d18 → 1.27.0-2025-03-27-1a33b215
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/client/info.js +14888 -13757
- package/client/style.css +6 -10
- package/lib/info.js +6 -4
- package/lib/info.js.map +1 -1
- package/lib/input.rtmp/info.js +2 -0
- package/lib/input.rtmp/info.js.map +1 -1
- package/lib/input.silence/info.js +2 -0
- package/lib/input.silence/info.js.map +1 -1
- package/lib/input.srt-caller/info.d.ts +2 -2
- package/lib/input.srt-caller/info.js +39 -0
- package/lib/input.srt-caller/info.js.map +1 -1
- package/lib/input.srt-caller/inline-view.d.ts +6 -0
- package/lib/input.srt-caller/inline-view.js +10 -0
- package/lib/input.srt-caller/inline-view.js.map +1 -0
- package/lib/input.srt-caller/runtime.d.ts +25 -5
- package/lib/input.srt-caller/runtime.js +56 -24
- package/lib/input.srt-caller/runtime.js.map +1 -1
- package/lib/input.srt-listener/info.js +27 -1
- package/lib/input.srt-listener/info.js.map +1 -1
- package/lib/input.srt-listener/inline-view.js +1 -1
- package/lib/input.srt-listener/inline-view.js.map +1 -1
- package/lib/input.srt-listener/runtime.d.ts +8 -1
- package/lib/input.srt-listener/runtime.js +14 -3
- package/lib/input.srt-listener/runtime.js.map +1 -1
- package/lib/input.udp-ts/info.js +2 -0
- package/lib/input.udp-ts/info.js.map +1 -1
- package/lib/input.videoTestCard/info.js +2 -0
- package/lib/input.videoTestCard/info.js.map +1 -1
- package/lib/output.autoCmaf/info.js +2 -0
- package/lib/output.autoCmaf/info.js.map +1 -1
- package/lib/output.autoHls/info.js +2 -0
- package/lib/output.autoHls/info.js.map +1 -1
- package/lib/output.facebook/info.js +2 -0
- package/lib/output.facebook/info.js.map +1 -1
- package/lib/output.linkedin/info.js +2 -0
- package/lib/output.linkedin/info.js.map +1 -1
- package/lib/output.preview/info.js +2 -0
- package/lib/output.preview/info.js.map +1 -1
- package/lib/output.rtmp/info.d.ts +2 -0
- package/lib/output.rtmp/info.js +10 -1
- package/lib/output.rtmp/info.js.map +1 -1
- package/lib/output.rtmp/inline-view.js +5 -1
- package/lib/output.rtmp/inline-view.js.map +1 -1
- package/lib/output.rtmp/runtime.d.ts +6 -0
- package/lib/output.rtmp/runtime.js +8 -0
- package/lib/output.rtmp/runtime.js.map +1 -1
- package/lib/output.srt-caller/info.js +12 -4
- package/lib/output.srt-caller/info.js.map +1 -1
- package/lib/output.srt-caller/inline-view.js +5 -1
- package/lib/output.srt-caller/inline-view.js.map +1 -1
- package/lib/output.srt-caller/runtime.d.ts +7 -7
- package/lib/output.srt-caller/runtime.js +7 -7
- package/lib/output.srt-caller/runtime.js.map +1 -1
- package/lib/output.srt-listener/info.js +10 -4
- package/lib/output.srt-listener/info.js.map +1 -1
- package/lib/output.srt-listener/inline-view.d.ts +3 -4
- package/lib/output.srt-listener/inline-view.js +5 -1
- package/lib/output.srt-listener/inline-view.js.map +1 -1
- package/lib/output.srt-listener/runtime.d.ts +7 -7
- package/lib/output.srt-listener/runtime.js +7 -10
- package/lib/output.srt-listener/runtime.js.map +1 -1
- package/lib/output.statistics/info.js +2 -0
- package/lib/output.statistics/info.js.map +1 -1
- package/lib/output.twitch/info.js +2 -0
- package/lib/output.twitch/info.js.map +1 -1
- package/lib/output.udpTs/info.d.ts +2 -2
- package/lib/output.udpTs/info.js +26 -0
- package/lib/output.udpTs/info.js.map +1 -1
- package/lib/output.udpTs/inline-view.d.ts +6 -0
- package/lib/output.udpTs/inline-view.js +12 -0
- package/lib/output.udpTs/inline-view.js.map +1 -0
- package/lib/output.udpTs/runtime.d.ts +25 -5
- package/lib/output.udpTs/runtime.js +36 -4
- package/lib/output.udpTs/runtime.js.map +1 -1
- package/lib/output.whep/info.js +2 -0
- package/lib/output.whep/info.js.map +1 -1
- package/lib/output.youtube/info.js +2 -0
- package/lib/output.youtube/info.js.map +1 -1
- package/lib/processor.audioEncoder/info.js +2 -0
- package/lib/processor.audioEncoder/info.js.map +1 -1
- package/lib/processor.browserOverlay/info.js +2 -0
- package/lib/processor.browserOverlay/info.js.map +1 -1
- package/lib/processor.cascadingSwitch/info.js +2 -0
- package/lib/processor.cascadingSwitch/info.js.map +1 -1
- package/lib/processor.fixedLadder/info.js +2 -0
- package/lib/processor.fixedLadder/info.js.map +1 -1
- package/lib/processor.makeProgram/info.js +2 -0
- package/lib/processor.makeProgram/info.js.map +1 -1
- package/lib/processor.multiview/info.d.ts +21 -0
- package/lib/processor.multiview/info.js +130 -0
- package/lib/processor.multiview/info.js.map +1 -0
- package/lib/processor.multiview/runtime.d.ts +43 -0
- package/lib/processor.multiview/runtime.js +254 -0
- package/lib/processor.multiview/runtime.js.map +1 -0
- package/lib/processor.onscreenGraphic/info.js +2 -0
- package/lib/processor.onscreenGraphic/info.js.map +1 -1
- package/lib/processor.streamKeyOverride/info.js +2 -0
- package/lib/processor.streamKeyOverride/info.js.map +1 -1
- package/lib/processor.videoDecoder/info.js +2 -0
- package/lib/processor.videoDecoder/info.js.map +1 -1
- package/lib/shared/jitter-buffer-inline.d.ts +15 -0
- package/lib/shared/jitter-buffer-inline.js +26 -0
- package/lib/shared/jitter-buffer-inline.js.map +1 -0
- package/lib/shared/srt-caller-metrics.d.ts +8 -0
- package/lib/shared/srt-caller-metrics.js +13 -0
- package/lib/shared/srt-caller-metrics.js.map +1 -0
- package/lib/shared/srt-listener-metrics.d.ts +9 -0
- package/lib/shared/srt-listener-metrics.js +12 -0
- package/lib/shared/srt-listener-metrics.js.map +1 -0
- package/lib/shared/srt-types.d.ts +17 -0
- package/lib/shared/srt-types.js +25 -0
- package/lib/shared/srt-types.js.map +1 -1
- package/lib/shared/stream-statistics-view.d.ts +3 -0
- package/lib/shared/stream-statistics-view.js +132 -0
- package/lib/shared/stream-statistics-view.js.map +1 -0
- package/lib/test/multiview.d.ts +1 -0
- package/lib/test/multiview.js +237 -0
- package/lib/test/multiview.js.map +1 -0
- package/lib/test/udp-output.js +1 -1
- package/lib/test/udp-output.js.map +1 -1
- package/lib/util.stats.latency/info.js +2 -0
- package/lib/util.stats.latency/info.js.map +1 -1
- package/package.json +7 -5
- package/lib/output.srt-caller/srt-packet-metrics.d.ts +0 -4
- package/lib/output.srt-caller/srt-packet-metrics.js +0 -10
- package/lib/output.srt-caller/srt-packet-metrics.js.map +0 -1
- package/lib/output.srt-listener/srt-packet-metrics.d.ts +0 -4
- package/lib/output.srt-listener/srt-packet-metrics.js +0 -12
- package/lib/output.srt-listener/srt-packet-metrics.js.map +0 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/processor.streamKeyOverride/info.ts"],"names":[],"mappings":";;
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/processor.streamKeyOverride/info.ts"],"names":[],"mappings":"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"}
|
@@ -1,12 +1,14 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.default = default_1;
|
4
|
+
const FaFileVideo_1 = require("@react-icons/all-files/fa/FaFileVideo");
|
4
5
|
function default_1({ defineComponent, }) {
|
5
6
|
return defineComponent({
|
6
7
|
identifier: 'processor.videoDecoder',
|
7
8
|
category: 'processor',
|
8
9
|
name: "Video Decoder",
|
9
10
|
description: "Explicit video decode.",
|
11
|
+
icon: FaFileVideo_1.FaFileVideo,
|
10
12
|
subscription: {
|
11
13
|
accepts: {
|
12
14
|
type: 'simple-stream',
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/processor.videoDecoder/info.ts"],"names":[],"mappings":";;
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/processor.videoDecoder/info.ts"],"names":[],"mappings":";;AAIA,4BA8CC;AAhDD,uEAAoE;AAEpE,mBAAwB,EACtB,eAAe,GACF;IACb,OAAO,eAAe,CAAqB;QACzC,UAAU,EAAE,wBAAwB;QACpC,QAAQ,EAAE,WAAW;QACrB,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,wBAAwB;QACrC,IAAI,EAAE,yBAAW;QACjB,YAAY,EAAE;YACZ,OAAO,EAAE;gBACP,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,IAAI;aACZ;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,IAAI;aACZ;SACF;QACD,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;YACtB,MAAM,SAAS,GAA2B;gBACxC,YAAY,EAAE,MAAM,CAAC,IAAI;aAC1B,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;QACD,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE;oBACJ,IAAI,EAAE,cAAc;oBACpB,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,YAAY,EAAE,UAAU;wBACxB,OAAO,EAAE;4BACP,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;4BAC1C,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;4BACtC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;yBACvC;qBACF;iBACF;gBACD,KAAK,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;aACtF;SACF;KACF,CAAC,CAAC;AACL,CAAC"}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import type { BaseConfig, GatheredMetric, MetricViewProps } from "@norskvideo/norsk-studio/lib/extension/client-types";
|
2
|
+
export type BaseState = object;
|
3
|
+
export type Props = Pick<MetricViewProps<BaseConfig>, "metrics" | "config">;
|
4
|
+
export type JitterBufferState = {
|
5
|
+
target: number;
|
6
|
+
value: number;
|
7
|
+
percentage: number;
|
8
|
+
};
|
9
|
+
export declare function initialJitterBufferState(): {
|
10
|
+
target: number;
|
11
|
+
value: number;
|
12
|
+
percentage: number;
|
13
|
+
};
|
14
|
+
export declare function extractJitterBufferFromMetrics(metrics: readonly GatheredMetric[]): JitterBufferState;
|
15
|
+
export default function JitterBufferInline(jb: JitterBufferState): React.JSX.Element;
|
@@ -0,0 +1,26 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.initialJitterBufferState = initialJitterBufferState;
|
4
|
+
exports.extractJitterBufferFromMetrics = extractJitterBufferFromMetrics;
|
5
|
+
exports.default = JitterBufferInline;
|
6
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
7
|
+
function initialJitterBufferState() {
|
8
|
+
return { target: 0.0, value: 0, percentage: 0 };
|
9
|
+
}
|
10
|
+
function extractJitterBufferFromMetrics(metrics) {
|
11
|
+
const jb = metrics.find((v) => v.name == "norsk_queue_duration_ms");
|
12
|
+
if (!jb)
|
13
|
+
return initialJitterBufferState();
|
14
|
+
const target = parseFloat(jb.labels['target']);
|
15
|
+
const currentValue = Math.min(jb.history.at(-1)?.value ?? 0, target);
|
16
|
+
const percentage = currentValue / target * 100.0;
|
17
|
+
return {
|
18
|
+
target,
|
19
|
+
value: currentValue,
|
20
|
+
percentage
|
21
|
+
};
|
22
|
+
}
|
23
|
+
function JitterBufferInline(jb) {
|
24
|
+
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsxs)("div", { children: ["Buffer: ", (0, jsx_runtime_1.jsx)("meter", { value: jb.percentage, max: 100.0, high: 50, low: 25 })] }) });
|
25
|
+
}
|
26
|
+
//# sourceMappingURL=jitter-buffer-inline.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"jitter-buffer-inline.js","sourceRoot":"","sources":["../../src/shared/jitter-buffer-inline.tsx"],"names":[],"mappings":";;AAaA,4DAEC;AAED,wEAYC;AAED,qCAOC;;AAzBD,SAAgB,wBAAwB;IACtC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAA;AACjD,CAAC;AAED,SAAgB,8BAA8B,CAAC,OAAkC;IAC/E,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,yBAAyB,CAAC,CAAC;IACpE,IAAI,CAAC,EAAE;QAAE,OAAO,wBAAwB,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,KAAK,CAAC;IAEjD,OAAO;QACL,MAAM;QACN,KAAK,EAAE,YAAY;QACnB,UAAU;KACX,CAAA;AACH,CAAC;AAED,SAAwB,kBAAkB,CAAC,EAAqB;IAC9D,OAAO,2DACL,wDACU,kCAAO,KAAK,EAAE,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAU,IACxE,GACL,CAAA;AAEL,CAAC"}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import type { BaseConfig, MetricViewProps } from "@norskvideo/norsk-studio/lib/extension/client-types";
|
2
|
+
import React from "react";
|
3
|
+
import { SrtCallerMetrics } from "./srt-types";
|
4
|
+
export type BaseState = {
|
5
|
+
metrics: SrtCallerMetrics;
|
6
|
+
enabled?: boolean;
|
7
|
+
};
|
8
|
+
export default function MetricsView<Config extends BaseConfig, State extends BaseState, Command extends object>({ state }: MetricViewProps<Config, State, Command>): React.JSX.Element;
|
@@ -0,0 +1,13 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.default = MetricsView;
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
5
|
+
function MetricsView({ state }) {
|
6
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "srt-output", children: [(0, jsx_runtime_1.jsx)("div", { children: "SRT Packets" }), (state.enabled || state.enabled === undefined) ? ((0, jsx_runtime_1.jsx)("div", { children: state.metrics.connectionCount == 0 ?
|
7
|
+
(0, jsx_runtime_1.jsx)("div", { className: "active text-red-300 dark:text-red-300", children: "Not Connected" })
|
8
|
+
: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "active text-green-500 dark:text-green-300", children: "Component Enabled" }), state.metrics.packetsSent >= 0 ?
|
9
|
+
(0, jsx_runtime_1.jsxs)("div", { children: ["Sent: ", state.metrics.packetsSent] })
|
10
|
+
:
|
11
|
+
(0, jsx_runtime_1.jsxs)("div", { children: ["Received: ", state.metrics.packetsReceived] }), (0, jsx_runtime_1.jsxs)("div", { children: ["Lost/Retransmitted: ", state.metrics.packetsLost, "/", state.metrics.packetsResent] })] }) })) : ((0, jsx_runtime_1.jsx)("div", { className: "disabled text-gray-500 dark:text-gray-400", children: "Component disabled" }))] }));
|
12
|
+
}
|
13
|
+
//# sourceMappingURL=srt-caller-metrics.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"srt-caller-metrics.js","sourceRoot":"","sources":["../../src/shared/srt-caller-metrics.tsx"],"names":[],"mappings":";;AAWA,8BA6BC;;AA7BD,SAAwB,WAAW,CAA6E,EAAE,KAAK,EAA2C;IAChK,OAAO,CACL,iCAAK,SAAS,EAAC,YAAY,aACzB,0DAAsB,EACrB,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAChD,0CACG,KAAK,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;oBACnC,gCAAK,SAAS,EAAC,uCAAuC,8BAEhD;oBACN,CAAC,CAAC,6DACA,gCAAK,SAAS,EAAC,2CAA2C,kCAEpD,EACL,KAAK,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;gCAC/B,sDAAY,KAAK,CAAC,OAAO,CAAC,WAAW,IAAO;gCAC5C,CAAC;oCACD,0DAAgB,KAAK,CAAC,OAAO,CAAC,eAAe,IAAO,EAEtD,oEAA0B,KAAK,CAAC,OAAO,CAAC,WAAW,OAAG,KAAK,CAAC,OAAO,CAAC,aAAa,IAAO,IACvF,GACD,CACP,CAAC,CAAC,CAAC,CACF,gCAAK,SAAS,EAAC,2CAA2C,mCAEpD,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import type { BaseConfig, MetricViewProps } from "@norskvideo/norsk-studio/lib/extension/client-types";
|
2
|
+
import React from "react";
|
3
|
+
import type { SrtListenerMetrics } from "./srt-types";
|
4
|
+
export type BaseState = {
|
5
|
+
metrics: SrtListenerMetrics;
|
6
|
+
names?: string[];
|
7
|
+
enabled?: boolean;
|
8
|
+
};
|
9
|
+
export default function MetricsView<State extends BaseState, Command extends object>({ state }: MetricViewProps<BaseConfig, State, Command>): React.JSX.Element;
|
@@ -0,0 +1,12 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.default = MetricsView;
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
5
|
+
function MetricsView({ state }) {
|
6
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "srt-output", children: [(0, jsx_runtime_1.jsx)("div", { children: "SRT Packets" }), (state.enabled === undefined || state.enabled) ? (state.metrics.connectionCount == 0 ?
|
7
|
+
(0, jsx_runtime_1.jsx)("div", { className: "active text-red-300 dark:text-red-300", children: "No connections" })
|
8
|
+
: (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsx)("div", { className: "divide-y", children: (state.metrics.packetsSent.length == 0 ? state.metrics.packetsReceived : state.metrics.packetsSent).map((p, i) => {
|
9
|
+
return (0, jsx_runtime_1.jsxs)("div", { className: "sm:grid sm:grid-cols-2 mt-2", children: [(0, jsx_runtime_1.jsx)("dt", { children: "Connection" }), (0, jsx_runtime_1.jsx)("dd", { className: "", children: state.names?.[i] ?? i }), (0, jsx_runtime_1.jsx)("dt", { className: "", children: state.metrics.packetsSent.length == 0 ? "Received" : "Sent" }), (0, jsx_runtime_1.jsx)("dd", { className: "", children: p }), (0, jsx_runtime_1.jsx)("dt", { className: "", children: "Retransmitted" }), (0, jsx_runtime_1.jsx)("dd", { className: "", children: state.metrics.packetsResent[i] }), (0, jsx_runtime_1.jsx)("dt", { className: "", children: "Lost" }), (0, jsx_runtime_1.jsx)("dd", { className: "", children: state.metrics.packetsLost[i] })] }, i);
|
10
|
+
}) }) })) : ((0, jsx_runtime_1.jsx)("div", { className: "disabled text-gray-500 dark:text-gray-400", children: "Component disabled" }))] }));
|
11
|
+
}
|
12
|
+
//# sourceMappingURL=srt-listener-metrics.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"srt-listener-metrics.js","sourceRoot":"","sources":["../../src/shared/srt-listener-metrics.tsx"],"names":[],"mappings":";;AAaA,8BAgCC;;AAhCD,SAAwB,WAAW,CAAkD,EAAE,KAAK,EAA+C;IACzI,OAAO,CACL,iCAAK,SAAS,EAAC,YAAY,aACzB,0DAAsB,EACrB,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAChD,KAAK,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;gBAClC,gCAAK,SAAS,EAAC,uCAAuC,+BAEhD;gBACN,CAAC,CAAC,2DACA,gCAAK,SAAS,EAAC,UAAU,YACtB,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;4BAChH,OAAO,iCAAa,SAAS,EAAC,6BAA6B,aACzD,wDAAmB,EACnB,+BAAI,SAAS,EAAC,EAAE,YAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAM,EAC7C,+BAAI,SAAS,EAAC,EAAE,YAAE,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,GAAM,EACnF,+BAAI,SAAS,EAAC,EAAE,YAAE,CAAC,GAAM,EACzB,+BAAI,SAAS,EAAC,EAAE,8BAAmB,EACnC,+BAAI,SAAS,EAAC,EAAE,YAAE,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,GAAM,EACtD,+BAAI,SAAS,EAAC,EAAE,qBAAU,EAC1B,+BAAI,SAAS,EAAC,EAAE,YAAE,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,GAAM,KARrC,CAAC,CASZ,CAAA;wBACR,CAAC,CAAC,GACE,GACL,CACN,CAAC,CAAC,CAAC,CACF,gCAAK,SAAS,EAAC,2CAA2C,mCAEpD,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
|
@@ -1,2 +1,19 @@
|
|
1
1
|
import type { SrtOutputSettings as SdkSettings } from '@norskvideo/norsk-sdk';
|
2
|
+
import type { GatheredMetric } from '@norskvideo/norsk-studio/lib/extension/client-types';
|
2
3
|
export type SocketOptions = Pick<SdkSettings, 'peerLatency' | 'receiveLatency' | 'inputBandwidth' | 'overheadBandwidth' | 'maxBandwidth'>;
|
4
|
+
export type SrtListenerMetrics = {
|
5
|
+
connectionCount: number;
|
6
|
+
packetsLost: number[];
|
7
|
+
packetsResent: number[];
|
8
|
+
packetsSent: number[];
|
9
|
+
packetsReceived: number[];
|
10
|
+
};
|
11
|
+
export type SrtCallerMetrics = {
|
12
|
+
connectionCount: number;
|
13
|
+
packetsLost: number;
|
14
|
+
packetsResent: number;
|
15
|
+
packetsSent: number;
|
16
|
+
packetsReceived: number;
|
17
|
+
};
|
18
|
+
export declare function extractSrtCallerMetricsForNode(targetNodeId: string, latest: readonly GatheredMetric[]): SrtCallerMetrics;
|
19
|
+
export declare function extractSrtListenerMetricsForNode(targetNodeId: string, latest: readonly GatheredMetric[]): SrtListenerMetrics;
|
package/lib/shared/srt-types.js
CHANGED
@@ -1,3 +1,28 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.extractSrtCallerMetricsForNode = extractSrtCallerMetricsForNode;
|
4
|
+
exports.extractSrtListenerMetricsForNode = extractSrtListenerMetricsForNode;
|
5
|
+
function extractSrtCallerMetricsForNode(targetNodeId, latest) {
|
6
|
+
const matching = latest.filter((l) => l.nodeId == targetNodeId);
|
7
|
+
return {
|
8
|
+
connectionCount: matching.find((m) => m.name == "norsk_connection_count")?.history.at(-1)?.value ?? 0,
|
9
|
+
packetsSent: matching.find((m) => m.name == "norsk_packet_count" && m.labels['type'] == 'sent')?.history.at(-1)?.value ?? 0,
|
10
|
+
packetsResent: matching.find((m) => m.name == "norsk_packet_count" && m.labels['type'] == 'retransmitted')?.history.at(-1)?.value ?? 0,
|
11
|
+
packetsLost: matching.find((m) => m.name == "norsk_packet_count" && (m.labels['type'] == 'sent_lost' || m.labels['type'] == 'received_lost'))?.history.at(-1)?.value ?? 0,
|
12
|
+
packetsReceived: matching.find((m) => m.name == "norsk_packet_count" && m.labels['type'] == 'received')?.history.at(-1)?.value ?? 0,
|
13
|
+
};
|
14
|
+
}
|
15
|
+
function extractSrtListenerMetricsForNode(targetNodeId, latest) {
|
16
|
+
const matching = latest.filter((l) => l.nodeId == targetNodeId);
|
17
|
+
return {
|
18
|
+
connectionCount: matching.find((m) => m.name == "norsk_connection_count")?.history.at(-1)?.value ?? 0,
|
19
|
+
packetsSent: matching.filter((m) => m.name == "norsk_packet_count" && m.labels['type'] == 'sent').sort(byIndex).map((m) => m.history.at(-1)?.value ?? -1),
|
20
|
+
packetsResent: matching.filter((m) => m.name == "norsk_packet_count" && m.labels['type'] == 'retransmitted').sort(byIndex).map((m) => m.history.at(-1)?.value ?? 0),
|
21
|
+
packetsLost: matching.filter((m) => m.name == "norsk_packet_count" && (m.labels['type'] == 'sent_lost' || m.labels['type'] == 'received_lost')).sort(byIndex).map((m) => m.history.at(-1)?.value ?? 0),
|
22
|
+
packetsReceived: matching.filter((m) => m.name == "norsk_packet_count" && m.labels['type'] == 'received').sort(byIndex).map((m) => m.history.at(-1)?.value ?? -1),
|
23
|
+
};
|
24
|
+
}
|
25
|
+
function byIndex(l, r) {
|
26
|
+
return (l.labels['index'] ?? "").localeCompare(r.labels['index'] ?? "");
|
27
|
+
}
|
3
28
|
//# sourceMappingURL=srt-types.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"srt-types.js","sourceRoot":"","sources":["../../src/shared/srt-types.ts"],"names":[],"mappings":""}
|
1
|
+
{"version":3,"file":"srt-types.js","sourceRoot":"","sources":["../../src/shared/srt-types.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,3 @@
|
|
1
|
+
import type { BaseConfig, MetricViewProps } from "@norskvideo/norsk-studio/lib/extension/client-types";
|
2
|
+
export type BaseState = object;
|
3
|
+
export default function MetricsView<State extends BaseState, Command extends object>({ metrics, config, global, charting }: MetricViewProps<BaseConfig, State, Command>): React.JSX.Element;
|
@@ -0,0 +1,132 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.default = MetricsView;
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
5
|
+
const react_chartjs_2_1 = require("react-chartjs-2");
|
6
|
+
const chart_js_1 = require("chart.js");
|
7
|
+
function displayStreamKey(streamKey) {
|
8
|
+
if (!streamKey) {
|
9
|
+
return "unknown";
|
10
|
+
}
|
11
|
+
return `${streamKey.sourceName}-${streamKey.programNumber}-${streamKey.streamId}-${streamKey.renditionName}`;
|
12
|
+
}
|
13
|
+
chart_js_1.Chart.register(...chart_js_1.registerables);
|
14
|
+
function MetricsView({ metrics, config, global, charting }) {
|
15
|
+
const { isDarkMode } = global;
|
16
|
+
const themeColors = isDarkMode ? charting.dark : charting.light;
|
17
|
+
const cpuChartOptions = {
|
18
|
+
responsive: false,
|
19
|
+
maintainAspectRatio: false,
|
20
|
+
animation: {
|
21
|
+
duration: 0,
|
22
|
+
},
|
23
|
+
scales: {
|
24
|
+
x: {
|
25
|
+
type: "linear",
|
26
|
+
display: true,
|
27
|
+
title: {
|
28
|
+
display: true,
|
29
|
+
text: "Seconds",
|
30
|
+
},
|
31
|
+
ticks: {
|
32
|
+
callback: (value) => {
|
33
|
+
const numValue = typeof value === "string" ? parseFloat(value) : value;
|
34
|
+
if (isNaN(numValue))
|
35
|
+
return "";
|
36
|
+
return 60 - Math.round((numValue - (Date.now() - 60000)) / 1000);
|
37
|
+
},
|
38
|
+
stepSize: 10000,
|
39
|
+
},
|
40
|
+
min: Date.now() - 250000,
|
41
|
+
max: Date.now(),
|
42
|
+
},
|
43
|
+
y: {
|
44
|
+
type: "logarithmic",
|
45
|
+
min: 0,
|
46
|
+
grid: {
|
47
|
+
color: themeColors.grid,
|
48
|
+
drawTicks: false,
|
49
|
+
},
|
50
|
+
border: { display: false },
|
51
|
+
display: false
|
52
|
+
},
|
53
|
+
},
|
54
|
+
plugins: {
|
55
|
+
legend: {
|
56
|
+
display: false,
|
57
|
+
},
|
58
|
+
tooltip: {
|
59
|
+
mode: "index",
|
60
|
+
intersect: false,
|
61
|
+
callbacks: {
|
62
|
+
label: (context) => {
|
63
|
+
const value = context.parsed.y;
|
64
|
+
return `${context.dataset.label}: ${value.toFixed(1)}bps`;
|
65
|
+
},
|
66
|
+
title: (tooltipItems) => {
|
67
|
+
if (tooltipItems.length === 0)
|
68
|
+
return "";
|
69
|
+
const time = tooltipItems[0].parsed.x;
|
70
|
+
const seconds = Math.round((Date.now() - time) / 1000);
|
71
|
+
return `${seconds} second${seconds !== 1 ? "s" : ""} ago`;
|
72
|
+
},
|
73
|
+
},
|
74
|
+
backgroundColor: themeColors.tooltip,
|
75
|
+
titleColor: themeColors.line,
|
76
|
+
bodyColor: themeColors.text,
|
77
|
+
borderColor: themeColors.line,
|
78
|
+
borderWidth: 1,
|
79
|
+
padding: 10,
|
80
|
+
},
|
81
|
+
},
|
82
|
+
elements: {
|
83
|
+
line: {
|
84
|
+
tension: 0.4,
|
85
|
+
borderWidth: 2,
|
86
|
+
borderCapStyle: "round",
|
87
|
+
borderJoinStyle: "round",
|
88
|
+
},
|
89
|
+
point: {
|
90
|
+
radius: 0,
|
91
|
+
hoverRadius: 5,
|
92
|
+
},
|
93
|
+
},
|
94
|
+
};
|
95
|
+
if (!metrics[config.id])
|
96
|
+
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "Loading statistics.." });
|
97
|
+
const allBitrates = metrics[config.id]
|
98
|
+
.filter((v) => v.name == "norsk_measured_bitrate")
|
99
|
+
.sort((l, r) => displayStreamKey(l.streamKey).localeCompare(displayStreamKey(r.streamKey)));
|
100
|
+
const createInitialDataset = (label, color, initialValue) => ({
|
101
|
+
label,
|
102
|
+
data: Array(50)
|
103
|
+
.fill(null)
|
104
|
+
.map((_, index) => ({
|
105
|
+
x: index,
|
106
|
+
y: initialValue,
|
107
|
+
})),
|
108
|
+
borderColor: color,
|
109
|
+
backgroundColor: "transparent",
|
110
|
+
borderWidth: 2,
|
111
|
+
fill: false,
|
112
|
+
});
|
113
|
+
const bitrates = {
|
114
|
+
labels: Array(50)
|
115
|
+
.fill(null)
|
116
|
+
.map((_, index) => index),
|
117
|
+
datasets: allBitrates.map((b, i) => {
|
118
|
+
return createInitialDataset(`${displayStreamKey(b.streamKey)}`, charting.colours[i], b.history[0]?.value ?? 0);
|
119
|
+
})
|
120
|
+
};
|
121
|
+
allBitrates.forEach((b, bi) => {
|
122
|
+
b.history.forEach((h, hi) => {
|
123
|
+
const dataIndex = hi;
|
124
|
+
bitrates.datasets[bi].data[dataIndex] = {
|
125
|
+
x: h.time,
|
126
|
+
y: h.value
|
127
|
+
};
|
128
|
+
});
|
129
|
+
});
|
130
|
+
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { children: "Measured Bitrates" }), (0, jsx_runtime_1.jsx)(react_chartjs_2_1.Line, { options: cpuChartOptions, data: bitrates })] });
|
131
|
+
}
|
132
|
+
//# sourceMappingURL=stream-statistics-view.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"stream-statistics-view.js","sourceRoot":"","sources":["../../src/shared/stream-statistics-view.tsx"],"names":[],"mappings":"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"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,237 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
27
|
+
};
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
29
|
+
const norsk_sdk_1 = require("@norskvideo/norsk-sdk");
|
30
|
+
const __1 = require("../");
|
31
|
+
const builder_1 = require("@norskvideo/norsk-studio/lib/test/_util/builder");
|
32
|
+
const document = __importStar(require("@norskvideo/norsk-studio/lib/runtime/document"));
|
33
|
+
const yaml_1 = __importDefault(require("yaml"));
|
34
|
+
const execution_1 = __importStar(require("@norskvideo/norsk-studio/lib/runtime/execution"));
|
35
|
+
const sources_1 = require("@norskvideo/norsk-studio/lib/test/_util/sources");
|
36
|
+
const sinks_1 = require("@norskvideo/norsk-studio/lib/test/_util/sinks");
|
37
|
+
const info_1 = require("../processor.multiview/info");
|
38
|
+
const info_2 = __importDefault(require("../processor.multiview/info"));
|
39
|
+
const client_types_1 = require("@norskvideo/norsk-studio/lib/extension/client-types");
|
40
|
+
const chai_1 = require("chai");
|
41
|
+
async function defaultRuntime() {
|
42
|
+
const runtime = (0, builder_1.emptyRuntime)();
|
43
|
+
await (0, __1.registerAll)(runtime);
|
44
|
+
return runtime;
|
45
|
+
}
|
46
|
+
describe("Multiview", () => {
|
47
|
+
let testCounter = 0;
|
48
|
+
async function testDocument(rows = 2, columns = 2, resolution = { width: 1920, height: 1080 }) {
|
49
|
+
const testId = `multiview-test-${testCounter++}`;
|
50
|
+
const runtime = await defaultRuntime();
|
51
|
+
const yaml = new builder_1.YamlBuilder()
|
52
|
+
.addNode(new builder_1.YamlNodeBuilder(testId, (0, info_2.default)(client_types_1.RegistrationConsts), {
|
53
|
+
rows,
|
54
|
+
columns,
|
55
|
+
resolution,
|
56
|
+
notes: "Test multiview component",
|
57
|
+
}).reify())
|
58
|
+
.reify();
|
59
|
+
const compiled = document.load(__filename, runtime, yaml_1.default.stringify(yaml), {
|
60
|
+
resolveConfig: true,
|
61
|
+
});
|
62
|
+
return { compiled, testId };
|
63
|
+
}
|
64
|
+
afterEach(async () => {
|
65
|
+
if (norsk) {
|
66
|
+
await norsk.close();
|
67
|
+
norsk = undefined;
|
68
|
+
}
|
69
|
+
});
|
70
|
+
let norsk = undefined;
|
71
|
+
it("Initializes properly with reference stream", async () => {
|
72
|
+
const { compiled, testId } = await testDocument();
|
73
|
+
norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
|
74
|
+
const result = await (0, execution_1.default)(norsk, compiled);
|
75
|
+
const multiview = result.components[testId];
|
76
|
+
(0, chai_1.expect)(multiview).to.exist;
|
77
|
+
(0, chai_1.expect)(multiview.cfg.rows).to.equal(2);
|
78
|
+
(0, chai_1.expect)(multiview.cfg.columns).to.equal(2);
|
79
|
+
await (0, sinks_1.waitForAssert)(() => !!multiview.referenceStream, () => (0, chai_1.expect)(multiview.referenceStream).to.exist, 10000, 500);
|
80
|
+
await multiview.initialised;
|
81
|
+
(0, chai_1.expect)(multiview.referenceStream).to.exist;
|
82
|
+
});
|
83
|
+
it("Handles a single source video/audio correctly", async () => {
|
84
|
+
const { compiled, testId } = await testDocument();
|
85
|
+
norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
|
86
|
+
const result = await (0, execution_1.default)(norsk, compiled);
|
87
|
+
const multiview = result.components[testId];
|
88
|
+
const sink = new sinks_1.TraceSink(norsk, `${testId}-sink`);
|
89
|
+
await sink.initialised;
|
90
|
+
const source = await (0, sources_1.videoAndAudio)(norsk, `${testId}-source`, {
|
91
|
+
resolution: { width: 640, height: 360 },
|
92
|
+
frameRate: { frames: 25, seconds: 1 },
|
93
|
+
});
|
94
|
+
new execution_1.ComponentSubscriptions(multiview).setSources([
|
95
|
+
new execution_1.StudioNodeSubscriptionSource(source, (0, sources_1.testSourceDescription)(), {
|
96
|
+
type: "take-all-streams",
|
97
|
+
filter: [{ media: "video" }, { media: "audio" }],
|
98
|
+
}),
|
99
|
+
]);
|
100
|
+
new execution_1.ComponentSubscriptions(sink).setSources([
|
101
|
+
new execution_1.StudioNodeSubscriptionSource(multiview, compiled.components[testId].yaml, {
|
102
|
+
type: "take-all-streams",
|
103
|
+
filter: [{ media: "audio" }, { media: "video" }],
|
104
|
+
}, (0, info_2.default)(client_types_1.RegistrationConsts)),
|
105
|
+
]);
|
106
|
+
await (0, sinks_1.waitForAssert)(() => sink.streamCount() === 2, () => sink.streamCount() === 2, 10000, 500);
|
107
|
+
await (0, sinks_1.waitForAssert)(() => !!multiview.composeNode, () => (0, chai_1.expect)(multiview.composeNode).to.exist, 10000, 500);
|
108
|
+
});
|
109
|
+
it("Handles video sources with no audio", async () => {
|
110
|
+
const { compiled, testId } = await testDocument();
|
111
|
+
norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
|
112
|
+
const result = await (0, execution_1.default)(norsk, compiled);
|
113
|
+
const multiview = result.components[testId];
|
114
|
+
const sink = new sinks_1.TraceSink(norsk, `${testId}-sink`);
|
115
|
+
await sink.initialised;
|
116
|
+
const source = await (0, sources_1.videoAndAudio)(norsk, `${testId}-source`, {
|
117
|
+
resolution: { width: 640, height: 360 },
|
118
|
+
frameRate: { frames: 25, seconds: 1 },
|
119
|
+
});
|
120
|
+
new execution_1.ComponentSubscriptions(multiview).setSources([
|
121
|
+
new execution_1.StudioNodeSubscriptionSource(source, (0, sources_1.testSourceDescription)(), {
|
122
|
+
type: "take-all-streams",
|
123
|
+
filter: [{ media: "video" }],
|
124
|
+
}),
|
125
|
+
]);
|
126
|
+
new execution_1.ComponentSubscriptions(sink).setSources([
|
127
|
+
new execution_1.StudioNodeSubscriptionSource(multiview, compiled.components[testId].yaml, {
|
128
|
+
type: "take-all-streams",
|
129
|
+
filter: [{ media: "audio" }, { media: "video" }],
|
130
|
+
}, (0, info_2.default)(client_types_1.RegistrationConsts)),
|
131
|
+
]);
|
132
|
+
await (0, sinks_1.waitForAssert)(() => sink.streamCount() === 1, () => sink.streamCount() === 1, 10000, 500);
|
133
|
+
await (0, sinks_1.waitForAssert)(() => !!multiview.composeNode, () => (0, chai_1.expect)(multiview.composeNode).to.exist, 10000, 500);
|
134
|
+
});
|
135
|
+
it("Handles different output resolutions", async () => {
|
136
|
+
const customResolution = { width: 1280, height: 720 };
|
137
|
+
const { compiled, testId } = await testDocument(2, 2, customResolution);
|
138
|
+
norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
|
139
|
+
const result = await (0, execution_1.default)(norsk, compiled);
|
140
|
+
const multiview = result.components[testId];
|
141
|
+
const source = await (0, sources_1.videoAndAudio)(norsk, `${testId}-source`, {
|
142
|
+
resolution: { width: 640, height: 360 },
|
143
|
+
frameRate: { frames: 25, seconds: 1 },
|
144
|
+
});
|
145
|
+
new execution_1.ComponentSubscriptions(multiview).setSources([
|
146
|
+
new execution_1.StudioNodeSubscriptionSource(source, (0, sources_1.testSourceDescription)(), {
|
147
|
+
type: "take-all-streams",
|
148
|
+
filter: [{ media: "video" }, { media: "audio" }],
|
149
|
+
}),
|
150
|
+
]);
|
151
|
+
await (0, sinks_1.waitForAssert)(() => !!multiview.composeNode, () => {
|
152
|
+
(0, chai_1.expect)(multiview.composeNode).to.exist;
|
153
|
+
}, 10000, 500);
|
154
|
+
await (0, sinks_1.assertNodeOutputsVideoFrames)(norsk, result, testId, {
|
155
|
+
resolution: customResolution,
|
156
|
+
frameRate: { frames: 25, seconds: 1 },
|
157
|
+
});
|
158
|
+
});
|
159
|
+
it("Creates correct stream keys for different grid configurations", async () => {
|
160
|
+
const testMappings = [
|
161
|
+
{ rows: 2, columns: 2, expected: 4 },
|
162
|
+
{ rows: 3, columns: 2, expected: 6 },
|
163
|
+
{ rows: 1, columns: 4, expected: 4 },
|
164
|
+
];
|
165
|
+
for (const test of testMappings) {
|
166
|
+
const mapping = (0, info_1.getStreamKeyMapping)("test", test.rows, test.columns);
|
167
|
+
(0, chai_1.expect)(mapping.videoStreamKey.sourceName).to.equal("test");
|
168
|
+
(0, chai_1.expect)(mapping.videoStreamKey.streamId).to.equal(1);
|
169
|
+
(0, chai_1.expect)(mapping.videoStreamKey.renditionName).to.equal("default");
|
170
|
+
(0, chai_1.expect)(mapping.audioStreamKeys.length).to.equal(test.expected);
|
171
|
+
(0, chai_1.expect)(mapping.audioStreamKeys[0].key.sourceName).to.equal("test");
|
172
|
+
(0, chai_1.expect)(mapping.audioStreamKeys[0].key.streamId).to.equal(100);
|
173
|
+
(0, chai_1.expect)(mapping.audioStreamKeys[0].key.renditionName).to.equal("audio_0_0");
|
174
|
+
const lastIndex = test.expected - 1;
|
175
|
+
const lastRow = test.rows - 1;
|
176
|
+
const lastCol = test.columns - 1;
|
177
|
+
(0, chai_1.expect)(mapping.audioStreamKeys[lastIndex].key.sourceName).to.equal("test");
|
178
|
+
(0, chai_1.expect)(mapping.audioStreamKeys[lastIndex].key.renditionName).to.equal(`audio_${lastRow}_${lastCol}`);
|
179
|
+
for (let i = 0; i < test.expected; i++) {
|
180
|
+
const r = Math.floor(i / test.columns);
|
181
|
+
const c = i % test.columns;
|
182
|
+
(0, chai_1.expect)(mapping.audioStreamKeys[i].row).to.equal(r);
|
183
|
+
(0, chai_1.expect)(mapping.audioStreamKeys[i].column).to.equal(c);
|
184
|
+
}
|
185
|
+
}
|
186
|
+
});
|
187
|
+
it("Assigns video sources to grid positions for various source counts", async () => {
|
188
|
+
const { compiled, testId } = await testDocument(2, 2);
|
189
|
+
norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
|
190
|
+
const result = await (0, execution_1.default)(norsk, compiled);
|
191
|
+
const multiview = result.components[testId];
|
192
|
+
const source = await (0, sources_1.videoAndAudio)(norsk, `${testId}-source`, {
|
193
|
+
resolution: { width: 640, height: 360 },
|
194
|
+
frameRate: { frames: 25, seconds: 1 },
|
195
|
+
});
|
196
|
+
new execution_1.ComponentSubscriptions(multiview).setSources([
|
197
|
+
new execution_1.StudioNodeSubscriptionSource(source, (0, sources_1.testSourceDescription)(), {
|
198
|
+
type: "take-all-streams",
|
199
|
+
filter: [{ media: "video" }, { media: "audio" }],
|
200
|
+
}),
|
201
|
+
]);
|
202
|
+
await (0, sinks_1.waitForAssert)(() => !!multiview.composeNode, () => (0, chai_1.expect)(multiview.composeNode).to.exist, 10000, 500);
|
203
|
+
const extraSources = await Promise.all([
|
204
|
+
(0, sources_1.videoAndAudio)(norsk, `${testId}-source2`, {
|
205
|
+
resolution: { width: 640, height: 360 },
|
206
|
+
frameRate: { frames: 25, seconds: 1 },
|
207
|
+
}),
|
208
|
+
(0, sources_1.videoAndAudio)(norsk, `${testId}-source3`, {
|
209
|
+
resolution: { width: 640, height: 360 },
|
210
|
+
frameRate: { frames: 25, seconds: 1 },
|
211
|
+
}),
|
212
|
+
(0, sources_1.videoAndAudio)(norsk, `${testId}-source4`, {
|
213
|
+
resolution: { width: 640, height: 360 },
|
214
|
+
frameRate: { frames: 25, seconds: 1 },
|
215
|
+
}),
|
216
|
+
(0, sources_1.videoAndAudio)(norsk, `${testId}-source5`, {
|
217
|
+
resolution: { width: 640, height: 360 },
|
218
|
+
frameRate: { frames: 25, seconds: 1 },
|
219
|
+
}),
|
220
|
+
]);
|
221
|
+
const allSources = [source, ...extraSources];
|
222
|
+
new execution_1.ComponentSubscriptions(multiview).setSources(allSources.map((src) => new execution_1.StudioNodeSubscriptionSource(src, (0, sources_1.testSourceDescription)(), {
|
223
|
+
type: "take-all-streams",
|
224
|
+
filter: [{ media: "video" }, { media: "audio" }],
|
225
|
+
})));
|
226
|
+
const sink = new sinks_1.TraceSink(norsk, `${testId}-sink`);
|
227
|
+
await sink.initialised;
|
228
|
+
new execution_1.ComponentSubscriptions(sink).setSources([
|
229
|
+
new execution_1.StudioNodeSubscriptionSource(multiview, compiled.components[testId].yaml, {
|
230
|
+
type: "take-all-streams",
|
231
|
+
filter: [{ media: "audio" }, { media: "video" }],
|
232
|
+
}, (0, info_2.default)(client_types_1.RegistrationConsts)),
|
233
|
+
]);
|
234
|
+
await (0, sinks_1.waitForAssert)(() => sink.streamCount() === 5, () => sink.streamCount() === 5, 10000, 500);
|
235
|
+
});
|
236
|
+
});
|
237
|
+
//# sourceMappingURL=multiview.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"multiview.js","sourceRoot":"","sources":["../../src/test/multiview.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAA8C;AAC9C,2BAAkC;AAElC,6EAIyD;AACzD,wFAA0E;AAC1E,gDAAwB;AACxB,4FAGwD;AACxD,6EAGyD;AACzD,yEAIuD;AACvD,sDAAkE;AAElE,uEAAwD;AAGxD,sFAI6D;AAC7D,+BAA8B;AAE9B,KAAK,UAAU,cAAc;IAC3B,MAAM,OAAO,GAAG,IAAA,sBAAY,GAAE,CAAC;IAC/B,MAAM,IAAA,eAAW,EAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,UAAU,YAAY,CACzB,IAAI,GAAG,CAAC,EACR,OAAO,GAAG,CAAC,EACX,UAAU,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QAE1C,MAAM,MAAM,GAAG,kBAAkB,WAAW,EAAE,EAAE,CAAC;QAEjD,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,qBAAW,EAAE;aAC3B,OAAO,CACN,IAAI,yBAAe,CACjB,MAAM,EACN,IAAA,cAAa,EAAC,iCAAkB,CAAC,EACjC;YACE,IAAI;YACJ,OAAO;YACP,UAAU;YACV,KAAK,EAAE,0BAA0B;SAClC,CACF,CAAC,KAAK,EAAE,CACV;aACA,KAAK,EAAE,CAAC;QAEX,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,cAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;YACxE,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;YACpB,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,KAAK,GAAsB,SAAS,CAAC;IAEzC,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;QAClD,KAAK,GAAG,MAAM,iBAAK,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAE,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAc,CAAC;QAEzD,IAAA,aAAM,EAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC3B,IAAA,aAAM,EAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvC,IAAA,aAAM,EAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE1C,MAAM,IAAA,qBAAa,EACjB,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,EACjC,GAAG,EAAE,CAAC,IAAA,aAAM,EAAC,SAAS,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,KAAK,EAChD,KAAK,EACL,GAAG,CACJ,CAAC;QAEF,MAAM,SAAS,CAAC,WAAW,CAAC;QAC5B,IAAA,aAAM,EAAC,SAAS,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;QAClD,KAAK,GAAG,MAAM,iBAAK,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAE,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAc,CAAC;QAEzD,MAAM,IAAI,GAAG,IAAI,iBAAS,CAAC,KAAc,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;QAC7D,MAAM,IAAI,CAAC,WAAW,CAAC;QAEvB,MAAM,MAAM,GAAG,MAAM,IAAA,uBAAa,EAAC,KAAK,EAAE,GAAG,MAAM,SAAS,EAAE;YAC5D,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;YACvC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;SACtC,CAAC,CAAC;QAEH,IAAI,kCAAsB,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC;YAC/C,IAAI,wCAA4B,CAAC,MAAM,EAAE,IAAA,+BAAqB,GAAE,EAAE;gBAChE,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;aACjD,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,kCAAsB,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;YAC1C,IAAI,wCAA4B,CAC9B,SAAS,EACT,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAChC;gBACE,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;aACjD,EACD,IAAA,cAAa,EAAC,iCAAkB,CAAoC,CACrE;SACF,CAAC,CAAC;QAEH,MAAM,IAAA,qBAAa,EACjB,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAC9B,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAC9B,KAAK,EACL,GAAG,CACJ,CAAC;QAEF,MAAM,IAAA,qBAAa,EACjB,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAC7B,GAAG,EAAE,CAAC,IAAA,aAAM,EAAC,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,EAC5C,KAAK,EACL,GAAG,CACJ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;QAClD,KAAK,GAAG,MAAM,iBAAK,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAE,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAc,CAAC;QAEzD,MAAM,IAAI,GAAG,IAAI,iBAAS,CAAC,KAAc,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;QAC7D,MAAM,IAAI,CAAC,WAAW,CAAC;QAEvB,MAAM,MAAM,GAAG,MAAM,IAAA,uBAAa,EAAC,KAAK,EAAE,GAAG,MAAM,SAAS,EAAE;YAC5D,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;YACvC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;SACtC,CAAC,CAAC;QAEH,IAAI,kCAAsB,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC;YAC/C,IAAI,wCAA4B,CAAC,MAAM,EAAE,IAAA,+BAAqB,GAAE,EAAE;gBAChE,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;aAC7B,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,kCAAsB,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;YAC1C,IAAI,wCAA4B,CAC9B,SAAS,EACT,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAChC;gBACE,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;aACjD,EACD,IAAA,cAAa,EAAC,iCAAkB,CAAoC,CACrE;SACF,CAAC,CAAC;QAEH,MAAM,IAAA,qBAAa,EACjB,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAC9B,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAC9B,KAAK,EACL,GAAG,CACJ,CAAC;QAEF,MAAM,IAAA,qBAAa,EACjB,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAC7B,GAAG,EAAE,CAAC,IAAA,aAAM,EAAC,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,EAC5C,KAAK,EACL,GAAG,CACJ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,gBAAgB,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACtD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACxE,KAAK,GAAG,MAAM,iBAAK,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAE,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAc,CAAC;QAEzD,MAAM,MAAM,GAAG,MAAM,IAAA,uBAAa,EAAC,KAAK,EAAE,GAAG,MAAM,SAAS,EAAE;YAC5D,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;YACvC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;SACtC,CAAC,CAAC;QAEH,IAAI,kCAAsB,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC;YAC/C,IAAI,wCAA4B,CAAC,MAAM,EAAE,IAAA,+BAAqB,GAAE,EAAE;gBAChE,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;aACjD,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,IAAA,qBAAa,EACjB,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAC7B,GAAG,EAAE;YACH,IAAA,aAAM,EAAC,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzC,CAAC,EACD,KAAK,EACL,GAAG,CACJ,CAAC;QAEF,MAAM,IAAA,oCAA4B,EAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;YACxD,UAAU,EAAE,gBAAgB;YAC5B,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;SACtC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,YAAY,GAAG;YACnB,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;YACpC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;YACpC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;SACrC,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,IAAA,0BAAmB,EAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAErE,IAAA,aAAM,EAAC,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3D,IAAA,aAAM,EAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACpD,IAAA,aAAM,EAAC,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAEjE,IAAA,aAAM,EAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE/D,IAAA,aAAM,EAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnE,IAAA,aAAM,EAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9D,IAAA,aAAM,EAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAC3D,WAAW,CACZ,CAAC;YAEF,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YACjC,IAAA,aAAM,EAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAChE,MAAM,CACP,CAAC;YACF,IAAA,aAAM,EAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CACnE,SAAS,OAAO,IAAI,OAAO,EAAE,CAC9B,CAAC;YAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;gBAC3B,IAAA,aAAM,EAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACnD,IAAA,aAAM,EAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,KAAK,GAAG,MAAM,iBAAK,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAE,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAc,CAAC;QAEzD,MAAM,MAAM,GAAG,MAAM,IAAA,uBAAa,EAAC,KAAK,EAAE,GAAG,MAAM,SAAS,EAAE;YAC5D,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;YACvC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;SACtC,CAAC,CAAC;QAEH,IAAI,kCAAsB,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC;YAC/C,IAAI,wCAA4B,CAAC,MAAM,EAAE,IAAA,+BAAqB,GAAE,EAAE;gBAChE,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;aACjD,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,IAAA,qBAAa,EACjB,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAC7B,GAAG,EAAE,CAAC,IAAA,aAAM,EAAC,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,EAC5C,KAAK,EACL,GAAG,CACJ,CAAC;QAEF,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACrC,IAAA,uBAAa,EAAC,KAAK,EAAE,GAAG,MAAM,UAAU,EAAE;gBACxC,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;gBACvC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;aACtC,CAAC;YACF,IAAA,uBAAa,EAAC,KAAK,EAAE,GAAG,MAAM,UAAU,EAAE;gBACxC,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;gBACvC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;aACtC,CAAC;YACF,IAAA,uBAAa,EAAC,KAAK,EAAE,GAAG,MAAM,UAAU,EAAE;gBACxC,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;gBACvC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;aACtC,CAAC;YACF,IAAA,uBAAa,EAAC,KAAK,EAAE,GAAG,MAAM,UAAU,EAAE;gBACxC,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;gBACvC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;aACtC,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC;QAE7C,IAAI,kCAAsB,CAAC,SAAS,CAAC,CAAC,UAAU,CAC9C,UAAU,CAAC,GAAG,CACZ,CAAC,GAAG,EAAE,EAAE,CACN,IAAI,wCAA4B,CAAC,GAAG,EAAE,IAAA,+BAAqB,GAAE,EAAE;YAC7D,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;SACjD,CAAC,CACL,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,iBAAS,CAAC,KAAc,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;QAC7D,MAAM,IAAI,CAAC,WAAW,CAAC;QAEvB,IAAI,kCAAsB,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;YAC1C,IAAI,wCAA4B,CAC9B,SAAS,EACT,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAChC;gBACE,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;aACjD,EACD,IAAA,cAAa,EAAC,iCAAkB,CAAoC,CACrE;SACF,CAAC,CAAC;QAEH,MAAM,IAAA,qBAAa,EACjB,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAC9B,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAC9B,KAAK,EACL,GAAG,CACJ,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|