@yume-chan/scrcpy-decoder-webcodecs 2.5.0 → 3.0.0-beta.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/LICENSE +1 -1
- package/README.md +1 -1
- package/esm/video/codec/av1.d.ts +4 -6
- package/esm/video/codec/av1.d.ts.map +1 -1
- package/esm/video/codec/av1.js +28 -70
- package/esm/video/codec/av1.js.map +1 -1
- package/esm/video/codec/h264.d.ts +4 -6
- package/esm/video/codec/h264.d.ts.map +1 -1
- package/esm/video/codec/h264.js +13 -25
- package/esm/video/codec/h264.js.map +1 -1
- package/esm/video/codec/h265.d.ts +4 -6
- package/esm/video/codec/h265.d.ts.map +1 -1
- package/esm/video/codec/h265.js +15 -31
- package/esm/video/codec/h265.js.map +1 -1
- package/esm/video/codec/h26x.d.ts +9 -6
- package/esm/video/codec/h26x.d.ts.map +1 -1
- package/esm/video/codec/h26x.js +25 -31
- package/esm/video/codec/h26x.js.map +1 -1
- package/esm/video/codec/index.d.ts +0 -1
- package/esm/video/codec/index.d.ts.map +1 -1
- package/esm/video/codec/index.js +0 -1
- package/esm/video/codec/index.js.map +1 -1
- package/esm/video/codec/type.d.ts +23 -8
- package/esm/video/codec/type.d.ts.map +1 -1
- package/esm/video/decoder.d.ts +62 -15
- package/esm/video/decoder.d.ts.map +1 -1
- package/esm/video/decoder.js +170 -134
- package/esm/video/decoder.js.map +1 -1
- package/esm/video/index.d.ts +1 -0
- package/esm/video/index.d.ts.map +1 -1
- package/esm/video/index.js +1 -0
- package/esm/video/index.js.map +1 -1
- package/esm/video/render/auto-canvas.d.ts +26 -0
- package/esm/video/render/auto-canvas.d.ts.map +1 -0
- package/esm/video/render/auto-canvas.js +80 -0
- package/esm/video/render/auto-canvas.js.map +1 -0
- package/esm/video/render/bitmap.d.ts +2 -2
- package/esm/video/render/bitmap.d.ts.map +1 -1
- package/esm/video/render/bitmap.js +18 -8
- package/esm/video/render/bitmap.js.map +1 -1
- package/esm/video/render/canvas.d.ts +38 -4
- package/esm/video/render/canvas.d.ts.map +1 -1
- package/esm/video/render/canvas.js +97 -10
- package/esm/video/render/canvas.js.map +1 -1
- package/esm/video/render/flow-control.d.ts +32 -0
- package/esm/video/render/flow-control.d.ts.map +1 -0
- package/esm/video/render/flow-control.js +139 -0
- package/esm/video/render/flow-control.js.map +1 -0
- package/esm/video/render/index.d.ts +2 -0
- package/esm/video/render/index.d.ts.map +1 -1
- package/esm/video/render/index.js +2 -0
- package/esm/video/render/index.js.map +1 -1
- package/esm/video/render/insertable-stream.d.ts +15 -3
- package/esm/video/render/insertable-stream.d.ts.map +1 -1
- package/esm/video/render/insertable-stream.js +29 -11
- package/esm/video/render/insertable-stream.js.map +1 -1
- package/esm/video/render/redraw.d.ts +31 -0
- package/esm/video/render/redraw.d.ts.map +1 -0
- package/esm/video/render/redraw.js +75 -0
- package/esm/video/render/redraw.js.map +1 -0
- package/esm/video/render/type.d.ts +8 -2
- package/esm/video/render/type.d.ts.map +1 -1
- package/esm/video/render/webgl.d.ts +38 -5
- package/esm/video/render/webgl.d.ts.map +1 -1
- package/esm/video/render/webgl.js +228 -59
- package/esm/video/render/webgl.js.map +1 -1
- package/esm/video/utils/index.d.ts +4 -0
- package/esm/video/utils/index.d.ts.map +1 -0
- package/esm/video/utils/index.js +4 -0
- package/esm/video/utils/index.js.map +1 -0
- package/esm/video/utils/snapshot.d.ts +2 -0
- package/esm/video/utils/snapshot.d.ts.map +1 -0
- package/esm/video/utils/snapshot.js +18 -0
- package/esm/video/utils/snapshot.js.map +1 -0
- package/esm/video/utils/timestamp.d.ts +19 -0
- package/esm/video/utils/timestamp.d.ts.map +1 -0
- package/esm/video/utils/timestamp.js +87 -0
- package/esm/video/utils/timestamp.js.map +1 -0
- package/esm/video/utils/video-decoder-stream.d.ts +30 -0
- package/esm/video/utils/video-decoder-stream.d.ts.map +1 -0
- package/esm/video/utils/video-decoder-stream.js +284 -0
- package/esm/video/utils/video-decoder-stream.js.map +1 -0
- package/package.json +12 -11
- package/src/video/codec/av1.ts +40 -102
- package/src/video/codec/h264.ts +17 -41
- package/src/video/codec/h265.ts +18 -49
- package/src/video/codec/h26x.ts +41 -36
- package/src/video/codec/index.ts +0 -1
- package/src/video/codec/type.ts +32 -12
- package/src/video/decoder.ts +203 -165
- package/src/video/index.ts +1 -0
- package/src/video/render/auto-canvas.ts +105 -0
- package/src/video/render/bitmap.ts +23 -9
- package/src/video/render/canvas.ts +157 -12
- package/src/video/render/flow-control.ts +182 -0
- package/src/video/render/index.ts +2 -0
- package/src/video/render/insertable-stream.ts +50 -10
- package/src/video/render/redraw.ts +88 -0
- package/src/video/render/type.ts +10 -2
- package/src/video/render/webgl.ts +316 -80
- package/src/video/utils/index.ts +3 -0
- package/src/video/utils/snapshot.ts +22 -0
- package/src/video/utils/timestamp.ts +108 -0
- package/src/video/utils/video-decoder-stream.ts +406 -0
- package/tsconfig.build.json +0 -14
- package/CHANGELOG.md +0 -140
- package/esm/video/codec/utils.d.ts +0 -4
- package/esm/video/codec/utils.d.ts.map +0 -1
- package/esm/video/codec/utils.js +0 -10
- package/esm/video/codec/utils.js.map +0 -1
- package/esm/video/snapshot.d.ts +0 -6
- package/esm/video/snapshot.d.ts.map +0 -1
- package/esm/video/snapshot.js +0 -41
- package/esm/video/snapshot.js.map +0 -1
- package/src/video/codec/utils.ts +0 -11
- package/src/video/snapshot.ts +0 -41
- package/tsconfig.build.tsbuildinfo +0 -1
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -37,7 +37,7 @@ Check the latest documentation at https://tangoadb.dev/scrcpy/video/web-codecs/
|
|
|
37
37
|
|
|
38
38
|
## Sponsors
|
|
39
39
|
|
|
40
|
-
[Become a backer](https://opencollective.com/ya-webadb) and get your image on our README on
|
|
40
|
+
[Become a backer](https://opencollective.com/ya-webadb) and get your image on our README on GitHub with a link to your site.
|
|
41
41
|
|
|
42
42
|
<a href="https://opencollective.com/ya-webadb/backer/0/website?requireActive=false" target="_blank"><img src="https://opencollective.com/ya-webadb/backer/0/avatar.svg?requireActive=false"></a>
|
|
43
43
|
<a href="https://opencollective.com/ya-webadb/backer/1/website?requireActive=false" target="_blank"><img src="https://opencollective.com/ya-webadb/backer/1/avatar.svg?requireActive=false"></a>
|
package/esm/video/codec/av1.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type {
|
|
3
|
-
export declare class
|
|
4
|
-
|
|
5
|
-
constructor(decoder: VideoDecoder, updateSize: (width: number, height: number) => void, options?: CodecDecoderOptions);
|
|
6
|
-
decode(packet: ScrcpyMediaStreamPacket): void;
|
|
1
|
+
import { TransformStream } from "@yume-chan/stream-extra";
|
|
2
|
+
import type { CodecTransformStream } from "./type.js";
|
|
3
|
+
export declare class Av1TransformStream extends TransformStream<CodecTransformStream.Input, CodecTransformStream.Output> implements CodecTransformStream {
|
|
4
|
+
constructor();
|
|
7
5
|
}
|
|
8
6
|
//# sourceMappingURL=av1.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"av1.d.ts","sourceRoot":"","sources":["../../../src/video/codec/av1.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"av1.d.ts","sourceRoot":"","sources":["../../../src/video/codec/av1.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEtD,qBAAa,kBACT,SAAQ,eAAe,CACnB,oBAAoB,CAAC,KAAK,EAC1B,oBAAoB,CAAC,MAAM,CAE/B,YAAW,oBAAoB;;CAiClC"}
|
package/esm/video/codec/av1.js
CHANGED
|
@@ -1,74 +1,32 @@
|
|
|
1
|
-
import { Av1 } from "@yume-chan/
|
|
2
|
-
import {
|
|
3
|
-
export class
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
} = sequenceHeader.color_config);
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
colorPrimaries = Av1.ColorPrimaries.Bt709;
|
|
33
|
-
transferCharacteristics = Av1.TransferCharacteristics.Bt709;
|
|
34
|
-
matrixCoefficients = Av1.MatrixCoefficients.Bt709;
|
|
35
|
-
colorRange = false;
|
|
36
|
-
}
|
|
37
|
-
const width = max_frame_width_minus_1 + 1;
|
|
38
|
-
const height = max_frame_height_minus_1 + 1;
|
|
39
|
-
this.#updateSize(width, height);
|
|
40
|
-
const codec = [
|
|
41
|
-
"av01",
|
|
42
|
-
seqProfile.toString(16),
|
|
43
|
-
decimalTwoDigits(seqLevelIdx) +
|
|
44
|
-
(sequenceHeader.seq_tier[0] ? "H" : "M"),
|
|
45
|
-
decimalTwoDigits(BitDepth),
|
|
46
|
-
monoChrome ? "1" : "0",
|
|
47
|
-
(subsamplingX ? "1" : "0") +
|
|
48
|
-
(subsamplingY ? "1" : "0") +
|
|
49
|
-
chromaSamplePosition.toString(),
|
|
50
|
-
decimalTwoDigits(colorPrimaries),
|
|
51
|
-
decimalTwoDigits(transferCharacteristics),
|
|
52
|
-
decimalTwoDigits(matrixCoefficients),
|
|
53
|
-
colorRange ? "1" : "0",
|
|
54
|
-
].join(".");
|
|
55
|
-
this.#decoder.configure({
|
|
56
|
-
codec,
|
|
57
|
-
hardwareAcceleration: this.#options?.hardwareAcceleration ?? "no-preference",
|
|
58
|
-
optimizeForLatency: true,
|
|
1
|
+
import { Av1 } from "@yume-chan/media-codec";
|
|
2
|
+
import { TransformStream } from "@yume-chan/stream-extra";
|
|
3
|
+
export class Av1TransformStream extends TransformStream {
|
|
4
|
+
constructor() {
|
|
5
|
+
super({
|
|
6
|
+
transform: (packet, controller) => {
|
|
7
|
+
if (packet.type === "configuration") {
|
|
8
|
+
// AV1 decoder doesn't need configuration packets
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const parser = new Av1(packet.data);
|
|
12
|
+
const sequenceHeader = parser.searchSequenceHeaderObu();
|
|
13
|
+
if (sequenceHeader) {
|
|
14
|
+
const width = sequenceHeader.max_frame_width_minus_1 + 1;
|
|
15
|
+
const height = sequenceHeader.max_frame_height_minus_1 + 1;
|
|
16
|
+
controller.enqueue({
|
|
17
|
+
codec: Av1.toCodecString(sequenceHeader),
|
|
18
|
+
codedWidth: width,
|
|
19
|
+
codedHeight: height,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
controller.enqueue({
|
|
23
|
+
// AV1 was added in Scrcpy 2.0 which must have `keyframe` property.
|
|
24
|
+
type: packet.keyframe ? "key" : "delta",
|
|
25
|
+
timestamp: packet.timestamp,
|
|
26
|
+
data: packet.data,
|
|
27
|
+
});
|
|
28
|
+
},
|
|
59
29
|
});
|
|
60
30
|
}
|
|
61
|
-
decode(packet) {
|
|
62
|
-
if (packet.type === "configuration") {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
this.#configure(packet.data);
|
|
66
|
-
this.#decoder.decode(new EncodedVideoChunk({
|
|
67
|
-
// Treat `undefined` as `key`, otherwise it won't decode.
|
|
68
|
-
type: packet.keyframe === false ? "delta" : "key",
|
|
69
|
-
timestamp: 0,
|
|
70
|
-
data: packet.data,
|
|
71
|
-
}));
|
|
72
|
-
}
|
|
73
31
|
}
|
|
74
32
|
//# sourceMappingURL=av1.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"av1.js","sourceRoot":"","sources":["../../../src/video/codec/av1.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"av1.js","sourceRoot":"","sources":["../../../src/video/codec/av1.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI1D,MAAM,OAAO,kBACT,SAAQ,eAGP;IAGD;QACI,KAAK,CAAC;YACF,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;gBAC9B,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;oBAClC,iDAAiD;oBACjD,OAAO;gBACX,CAAC;gBAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACpC,MAAM,cAAc,GAAG,MAAM,CAAC,uBAAuB,EAAE,CAAC;gBAExD,IAAI,cAAc,EAAE,CAAC;oBACjB,MAAM,KAAK,GAAG,cAAc,CAAC,uBAAuB,GAAG,CAAC,CAAC;oBACzD,MAAM,MAAM,GAAG,cAAc,CAAC,wBAAwB,GAAG,CAAC,CAAC;oBAE3D,UAAU,CAAC,OAAO,CAAC;wBACf,KAAK,EAAE,GAAG,CAAC,aAAa,CAAC,cAAc,CAAC;wBACxC,UAAU,EAAE,KAAK;wBACjB,WAAW,EAAE,MAAM;qBACtB,CAAC,CAAC;gBACP,CAAC;gBAED,UAAU,CAAC,OAAO,CAAC;oBACf,mEAAmE;oBACnE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;oBACvC,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;iBACpB,CAAC,CAAC;YACP,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;CACJ"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
constructor(decoder: VideoDecoder, updateSize: (width: number, height: number) => void, options?: CodecDecoderOptions);
|
|
6
|
-
configure(data: Uint8Array): void;
|
|
1
|
+
import { H26xTransformStream } from "./h26x.js";
|
|
2
|
+
export declare class H264TransformStream extends H26xTransformStream {
|
|
3
|
+
convertFrameType(keyframe: boolean | undefined, data: Uint8Array): EncodedVideoChunkType;
|
|
4
|
+
configure(data: Uint8Array): H26xTransformStream.Config;
|
|
7
5
|
}
|
|
8
6
|
//# sourceMappingURL=h264.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"h264.d.ts","sourceRoot":"","sources":["../../../src/video/codec/h264.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"h264.d.ts","sourceRoot":"","sources":["../../../src/video/codec/h264.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,qBAAa,mBAAoB,SAAQ,mBAAmB;IAC/C,gBAAgB,CACrB,QAAQ,EAAE,OAAO,GAAG,SAAS,EAC7B,IAAI,EAAE,UAAU,GACjB,qBAAqB;IAMf,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,mBAAmB,CAAC,MAAM;CASnE"}
|
package/esm/video/codec/h264.js
CHANGED
|
@@ -1,30 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
constructor(decoder, updateSize, options) {
|
|
9
|
-
super(decoder);
|
|
10
|
-
this.#decoder = decoder;
|
|
11
|
-
this.#updateSize = updateSize;
|
|
12
|
-
this.#options = options;
|
|
1
|
+
import { H264 } from "@yume-chan/media-codec";
|
|
2
|
+
import { H26xTransformStream } from "./h26x.js";
|
|
3
|
+
export class H264TransformStream extends H26xTransformStream {
|
|
4
|
+
convertFrameType(keyframe, data) {
|
|
5
|
+
// Older versions of Scrcpy doesn't have `keyframe` property,
|
|
6
|
+
// so detect it from the frame data.
|
|
7
|
+
return (keyframe ?? H264.containsKeyFrame(data)) ? "key" : "delta";
|
|
13
8
|
}
|
|
14
9
|
configure(data) {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
hexTwoDigits(constraintSet) +
|
|
22
|
-
hexTwoDigits(levelIndex);
|
|
23
|
-
this.#decoder.configure({
|
|
24
|
-
codec: codec,
|
|
25
|
-
hardwareAcceleration: this.#options?.hardwareAcceleration ?? "no-preference",
|
|
26
|
-
optimizeForLatency: true,
|
|
27
|
-
});
|
|
10
|
+
const configuration = H264.parseConfiguration(data);
|
|
11
|
+
return {
|
|
12
|
+
codec: H264.toCodecString(configuration),
|
|
13
|
+
codedHeight: configuration.croppedHeight,
|
|
14
|
+
codedWidth: configuration.croppedWidth,
|
|
15
|
+
};
|
|
28
16
|
}
|
|
29
17
|
}
|
|
30
18
|
//# sourceMappingURL=h264.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"h264.js","sourceRoot":"","sources":["../../../src/video/codec/h264.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"h264.js","sourceRoot":"","sources":["../../../src/video/codec/h264.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,OAAO,mBAAoB,SAAQ,mBAAmB;IAC/C,gBAAgB,CACrB,QAA6B,EAC7B,IAAgB;QAEhB,6DAA6D;QAC7D,oCAAoC;QACpC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;IACvE,CAAC;IAEQ,SAAS,CAAC,IAAgB;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAEpD,OAAO;YACH,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;YACxC,WAAW,EAAE,aAAa,CAAC,aAAa;YACxC,UAAU,EAAE,aAAa,CAAC,YAAY;SACzC,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
constructor(decoder: VideoDecoder, updateSize: (width: number, height: number) => void, options?: CodecDecoderOptions);
|
|
6
|
-
configure(data: Uint8Array): void;
|
|
1
|
+
import { H26xTransformStream } from "./h26x.js";
|
|
2
|
+
export declare class H265TransformStream extends H26xTransformStream {
|
|
3
|
+
convertFrameType(keyframe: boolean | undefined): EncodedVideoChunkType;
|
|
4
|
+
configure(data: Uint8Array): H26xTransformStream.Config;
|
|
7
5
|
}
|
|
8
6
|
//# sourceMappingURL=h265.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"h265.d.ts","sourceRoot":"","sources":["../../../src/video/codec/h265.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"h265.d.ts","sourceRoot":"","sources":["../../../src/video/codec/h265.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,qBAAa,mBAAoB,SAAQ,mBAAmB;IAC/C,gBAAgB,CACrB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAC9B,qBAAqB;IAKf,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,mBAAmB,CAAC,MAAM;CAYnE"}
|
package/esm/video/codec/h265.js
CHANGED
|
@@ -1,36 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
#updateSize;
|
|
8
|
-
#options;
|
|
9
|
-
constructor(decoder, updateSize, options) {
|
|
10
|
-
super(decoder);
|
|
11
|
-
this.#decoder = decoder;
|
|
12
|
-
this.#updateSize = updateSize;
|
|
13
|
-
this.#options = options;
|
|
1
|
+
import { H265 } from "@yume-chan/media-codec";
|
|
2
|
+
import { H26xTransformStream } from "./h26x.js";
|
|
3
|
+
export class H265TransformStream extends H26xTransformStream {
|
|
4
|
+
convertFrameType(keyframe) {
|
|
5
|
+
// H.265 was added in Scrcpy 2.0 which must have `keyframe` property.
|
|
6
|
+
return keyframe ? "key" : "delta";
|
|
14
7
|
}
|
|
15
8
|
configure(data) {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
].join(".");
|
|
26
|
-
this.#decoder.configure({
|
|
27
|
-
codec,
|
|
28
|
-
// Microsoft Edge requires explicit size to work
|
|
29
|
-
codedWidth: croppedWidth,
|
|
30
|
-
codedHeight: croppedHeight,
|
|
31
|
-
hardwareAcceleration: this.#options?.hardwareAcceleration ?? "no-preference",
|
|
32
|
-
optimizeForLatency: true,
|
|
33
|
-
});
|
|
9
|
+
const configuration = H265.parseConfiguration(data);
|
|
10
|
+
return {
|
|
11
|
+
codec: H265.toCodecString(configuration),
|
|
12
|
+
// Microsoft Edge on Windows requires explicit size,
|
|
13
|
+
// otherwise it returns frames in incorrect size.
|
|
14
|
+
// And it needs cropped size, as opposed to the option name.
|
|
15
|
+
codedWidth: configuration.croppedWidth,
|
|
16
|
+
codedHeight: configuration.croppedHeight,
|
|
17
|
+
};
|
|
34
18
|
}
|
|
35
19
|
}
|
|
36
20
|
//# sourceMappingURL=h265.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"h265.js","sourceRoot":"","sources":["../../../src/video/codec/h265.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"h265.js","sourceRoot":"","sources":["../../../src/video/codec/h265.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,OAAO,mBAAoB,SAAQ,mBAAmB;IAC/C,gBAAgB,CACrB,QAA6B;QAE7B,qEAAqE;QACrE,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;IACtC,CAAC;IAEQ,SAAS,CAAC,IAAgB;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAEpD,OAAO;YACH,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;YACxC,oDAAoD;YACpD,iDAAiD;YACjD,4DAA4D;YAC5D,UAAU,EAAE,aAAa,CAAC,YAAY;YACtC,WAAW,EAAE,aAAa,CAAC,aAAa;SAC3C,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type {
|
|
3
|
-
export declare abstract class
|
|
1
|
+
import { TransformStream } from "@yume-chan/stream-extra";
|
|
2
|
+
import type { CodecTransformStream } from "./type.js";
|
|
3
|
+
export declare abstract class H26xTransformStream extends TransformStream<CodecTransformStream.Input, CodecTransformStream.Output> implements CodecTransformStream {
|
|
4
4
|
#private;
|
|
5
|
-
constructor(
|
|
6
|
-
abstract
|
|
7
|
-
|
|
5
|
+
constructor();
|
|
6
|
+
abstract convertFrameType(keyframe: boolean | undefined, data: Uint8Array): EncodedVideoChunkType;
|
|
7
|
+
abstract configure(data: Uint8Array): H26xTransformStream.Config;
|
|
8
|
+
}
|
|
9
|
+
export declare namespace H26xTransformStream {
|
|
10
|
+
type Config = Omit<CodecTransformStream.Config, "raw">;
|
|
8
11
|
}
|
|
9
12
|
//# sourceMappingURL=h26x.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"h26x.d.ts","sourceRoot":"","sources":["../../../src/video/codec/h26x.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"h26x.d.ts","sourceRoot":"","sources":["../../../src/video/codec/h26x.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEtD,8BAAsB,mBAClB,SAAQ,eAAe,CACnB,oBAAoB,CAAC,KAAK,EAC1B,oBAAoB,CAAC,MAAM,CAE/B,YAAW,oBAAoB;;;IAmB/B,QAAQ,CAAC,gBAAgB,CACrB,QAAQ,EAAE,OAAO,GAAG,SAAS,EAC7B,IAAI,EAAE,UAAU,GACjB,qBAAqB;IAExB,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,mBAAmB,CAAC,MAAM;CAYnE;AAED,yBAAiB,mBAAmB,CAAC;IACjC,KAAY,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CACjE"}
|
package/esm/video/codec/h26x.js
CHANGED
|
@@ -1,35 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { TransformStream } from "@yume-chan/stream-extra";
|
|
2
|
+
export class H26xTransformStream extends TransformStream {
|
|
3
|
+
constructor() {
|
|
4
|
+
super({
|
|
5
|
+
transform: (packet, controller) => {
|
|
6
|
+
if (packet.type === "configuration") {
|
|
7
|
+
controller.enqueue(this.#configure(packet.data));
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
controller.enqueue({
|
|
11
|
+
type: this.convertFrameType(packet.keyframe, packet.data),
|
|
12
|
+
timestamp: packet.timestamp,
|
|
13
|
+
data: packet.data,
|
|
14
|
+
});
|
|
15
|
+
},
|
|
16
|
+
});
|
|
6
17
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
this
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
// https://www.w3.org/TR/webcodecs-avc-codec-registration/#encodedvideochunk-type
|
|
17
|
-
let data;
|
|
18
|
-
if (this.#config !== undefined) {
|
|
19
|
-
data = new Uint8Array(this.#config.length + packet.data.length);
|
|
20
|
-
data.set(this.#config, 0);
|
|
21
|
-
data.set(packet.data, this.#config.length);
|
|
22
|
-
this.#config = undefined;
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
data = packet.data;
|
|
26
|
-
}
|
|
27
|
-
this.#decoder.decode(new EncodedVideoChunk({
|
|
28
|
-
// Treat `undefined` as `key`, otherwise won't decode.
|
|
29
|
-
type: packet.keyframe === false ? "delta" : "key",
|
|
30
|
-
timestamp: 0,
|
|
31
|
-
data,
|
|
32
|
-
}));
|
|
18
|
+
#configure(data) {
|
|
19
|
+
return {
|
|
20
|
+
...this.configure(data),
|
|
21
|
+
// For H.264 and H.265, when the stream is in Annex B format
|
|
22
|
+
// (which Scrcpy uses, as Android MediaCodec produces),
|
|
23
|
+
// configuration data needs to be combined with the first frame data.
|
|
24
|
+
// https://www.w3.org/TR/webcodecs-avc-codec-registration/#encodedvideochunk-type
|
|
25
|
+
raw: data,
|
|
26
|
+
};
|
|
33
27
|
}
|
|
34
28
|
}
|
|
35
29
|
//# sourceMappingURL=h26x.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"h26x.js","sourceRoot":"","sources":["../../../src/video/codec/h26x.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"h26x.js","sourceRoot":"","sources":["../../../src/video/codec/h26x.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI1D,MAAM,OAAgB,mBAClB,SAAQ,eAGP;IAGD;QACI,KAAK,CAAC;YACF,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;gBAC9B,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;oBAClC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;oBACjD,OAAO;gBACX,CAAC;gBAED,UAAU,CAAC,OAAO,CAAC;oBACf,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC;oBACzD,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;iBACpB,CAAC,CAAC;YACP,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;IASD,UAAU,CAAC,IAAgB;QACvB,OAAO;YACH,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YACvB,4DAA4D;YAC5D,uDAAuD;YACvD,qEAAqE;YACrE,iFAAiF;YACjF,GAAG,EAAE,IAAI;SACZ,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/video/codec/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/video/codec/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC"}
|
package/esm/video/codec/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/video/codec/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/video/codec/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC"}
|
|
@@ -1,11 +1,26 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import type { ScrcpyMediaStreamConfigurationPacket, ScrcpyMediaStreamDataPacket } from "@yume-chan/scrcpy";
|
|
2
|
+
import type { TransformStream } from "@yume-chan/stream-extra";
|
|
3
|
+
export type CodecTransformStream = TransformStream<CodecTransformStream.Input, CodecTransformStream.Output>;
|
|
4
|
+
export declare namespace CodecTransformStream {
|
|
5
|
+
type Input = ScrcpyMediaStreamConfigurationPacket | (ScrcpyMediaStreamDataPacket & {
|
|
6
|
+
timestamp: number;
|
|
7
|
+
});
|
|
8
|
+
type Config = VideoDecoderConfig & {
|
|
9
|
+
codedWidth: number;
|
|
10
|
+
codedHeight: number;
|
|
11
|
+
/**
|
|
12
|
+
* Sets an optional raw buffer what will be prepended with the first key frame for decoding.
|
|
13
|
+
*
|
|
14
|
+
* Some codecs (e.g. H.264 and H.265 in Annex B format)
|
|
15
|
+
* send configuration in separate packet,
|
|
16
|
+
* but the configuration also needs to be feed into the decoder.
|
|
17
|
+
*/
|
|
18
|
+
raw?: AllowSharedBufferSource;
|
|
19
|
+
};
|
|
20
|
+
type VideoChunk = EncodedVideoChunkInit;
|
|
21
|
+
type Output = Config | VideoChunk;
|
|
4
22
|
}
|
|
5
|
-
export interface
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
export interface CodecDecoderConstructor {
|
|
9
|
-
new (decoder: VideoDecoder, updateSize: (width: number, height: number) => void, options?: CodecDecoderOptions): CodecDecoder;
|
|
23
|
+
export interface CodecTransformStreamConstructor {
|
|
24
|
+
new (): CodecTransformStream;
|
|
10
25
|
}
|
|
11
26
|
//# sourceMappingURL=type.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../../src/video/codec/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../../src/video/codec/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,oCAAoC,EACpC,2BAA2B,EAC9B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,MAAM,oBAAoB,GAAG,eAAe,CAC9C,oBAAoB,CAAC,KAAK,EAC1B,oBAAoB,CAAC,MAAM,CAC9B,CAAC;AAEF,yBAAiB,oBAAoB,CAAC;IAClC,KAAY,KAAK,GACX,oCAAoC,GACpC,CAAC,2BAA2B,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE5D,KAAY,MAAM,GAAG,kBAAkB,GAAG;QACtC,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB;;;;;;WAMG;QACH,GAAG,CAAC,EAAE,uBAAuB,CAAC;KACjC,CAAC;IAEF,KAAY,UAAU,GAAG,qBAAqB,CAAC;IAE/C,KAAY,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;CAC5C;AAED,MAAM,WAAW,+BAA+B;IAC5C,QAAQ,oBAAoB,CAAC;CAChC"}
|
package/esm/video/decoder.d.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import type { ScrcpyMediaStreamPacket } from "@yume-chan/scrcpy";
|
|
2
1
|
import { ScrcpyVideoCodecId } from "@yume-chan/scrcpy";
|
|
3
|
-
import type { ScrcpyVideoDecoder, ScrcpyVideoDecoderCapability } from "@yume-chan/scrcpy-decoder-
|
|
4
|
-
import { WritableStream } from "@yume-chan/stream-extra";
|
|
5
|
-
import type { CodecDecoderOptions } from "./codec/type.js";
|
|
2
|
+
import type { ScrcpyVideoDecoder, ScrcpyVideoDecoderCapability } from "@yume-chan/scrcpy-decoder-shared";
|
|
6
3
|
import type { VideoFrameRenderer } from "./render/index.js";
|
|
7
4
|
export declare class WebCodecsVideoDecoder implements ScrcpyVideoDecoder {
|
|
8
5
|
#private;
|
|
@@ -10,29 +7,79 @@ export declare class WebCodecsVideoDecoder implements ScrcpyVideoDecoder {
|
|
|
10
7
|
static readonly capabilities: Record<string, ScrcpyVideoDecoderCapability>;
|
|
11
8
|
get codec(): ScrcpyVideoCodecId;
|
|
12
9
|
get renderer(): VideoFrameRenderer;
|
|
13
|
-
get
|
|
14
|
-
get
|
|
15
|
-
get
|
|
10
|
+
get rendererType(): ScrcpyVideoDecoder.RendererType;
|
|
11
|
+
get onRendererTypeChange(): import("@yume-chan/event").Event<ScrcpyVideoDecoder.RendererType> | undefined;
|
|
12
|
+
get paused(): boolean;
|
|
13
|
+
get writable(): import("@yume-chan/stream-extra").WritableStream<import("@yume-chan/scrcpy").ScrcpyMediaStreamPacket>;
|
|
14
|
+
get width(): number;
|
|
15
|
+
get height(): number;
|
|
16
16
|
get sizeChanged(): import("@yume-chan/event").Event<{
|
|
17
17
|
width: number;
|
|
18
18
|
height: number;
|
|
19
|
-
}
|
|
20
|
-
get
|
|
21
|
-
get
|
|
19
|
+
}>;
|
|
20
|
+
get type(): "software" | "hardware";
|
|
21
|
+
get onTypeChange(): import("@yume-chan/event").Event<"software" | "hardware">;
|
|
22
|
+
/**
|
|
23
|
+
* Gets the number of frames waiting to be decoded.
|
|
24
|
+
*/
|
|
25
|
+
get decodeQueueSize(): number;
|
|
26
|
+
/**
|
|
27
|
+
* Gets an event when a frame is dequeued (either decoded or discarded).
|
|
28
|
+
*/
|
|
29
|
+
get onDequeue(): import("@yume-chan/event").Event<undefined>;
|
|
30
|
+
/**
|
|
31
|
+
* Gets the number of times the decoder has been reset to catch up new keyframes.
|
|
32
|
+
*/
|
|
33
|
+
get decoderResetCount(): number;
|
|
34
|
+
/**
|
|
35
|
+
* Gets the number of frames decoded by the decoder.
|
|
36
|
+
*/
|
|
37
|
+
get framesDecoded(): number;
|
|
38
|
+
/**
|
|
39
|
+
* Gets the number of frames skipped by the decoder.
|
|
40
|
+
*/
|
|
41
|
+
get framesSkippedDecoding(): number;
|
|
42
|
+
/**
|
|
43
|
+
* Gets the total time spent processing and decoding frames in milliseconds.
|
|
44
|
+
*/
|
|
45
|
+
get totalDecodeTime(): number;
|
|
46
|
+
/**
|
|
47
|
+
* Gets the number of frames that have been drawn on the renderer.
|
|
48
|
+
*/
|
|
49
|
+
get framesRendered(): number;
|
|
50
|
+
/**
|
|
51
|
+
* Gets the number of frames that's visible to the user.
|
|
52
|
+
*
|
|
53
|
+
* Multiple frames might be rendered during one vertical sync interval,
|
|
54
|
+
* but only the last of them is represented to the user.
|
|
55
|
+
* This costs some performance but reduces latency by 1 frame.
|
|
56
|
+
*
|
|
57
|
+
* Might be `0` if the renderer is in a nested Web Worker on Chrome due to a Chrome bug.
|
|
58
|
+
* https://issues.chromium.org/issues/41483010
|
|
59
|
+
*/
|
|
60
|
+
get framesDisplayed(): number;
|
|
61
|
+
/**
|
|
62
|
+
* Gets the number of frames that wasn't drawn on the renderer
|
|
63
|
+
* because the renderer can't keep up
|
|
64
|
+
*/
|
|
65
|
+
get framesSkippedRendering(): number;
|
|
22
66
|
/**
|
|
23
67
|
* Create a new WebCodecs video decoder.
|
|
24
68
|
*/
|
|
25
|
-
constructor({ codec, renderer,
|
|
26
|
-
|
|
27
|
-
|
|
69
|
+
constructor({ codec, renderer, hardwareAcceleration, optimizeForLatency, }: WebCodecsVideoDecoder.Options);
|
|
70
|
+
pause(): void;
|
|
71
|
+
resume(): undefined;
|
|
72
|
+
trackDocumentVisibility(document: Document): () => undefined;
|
|
73
|
+
snapshot(options?: ImageEncodeOptions): Promise<Blob | undefined>;
|
|
74
|
+
dispose(): undefined;
|
|
28
75
|
}
|
|
29
76
|
export declare namespace WebCodecsVideoDecoder {
|
|
30
|
-
interface Options extends
|
|
77
|
+
interface Options extends Pick<VideoDecoderConfig, "hardwareAcceleration" | "optimizeForLatency"> {
|
|
31
78
|
/**
|
|
32
79
|
* The video codec to decode
|
|
33
80
|
*/
|
|
34
81
|
codec: ScrcpyVideoCodecId;
|
|
35
|
-
renderer
|
|
82
|
+
renderer?: VideoFrameRenderer | undefined;
|
|
36
83
|
}
|
|
37
84
|
}
|
|
38
85
|
//# sourceMappingURL=decoder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decoder.d.ts","sourceRoot":"","sources":["../../src/video/decoder.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"decoder.d.ts","sourceRoot":"","sources":["../../src/video/decoder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAuB,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EACR,kBAAkB,EAClB,4BAA4B,EAC/B,MAAM,kCAAkC,CAAC;AAU1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAQ5D,qBAAa,qBAAsB,YAAW,kBAAkB;;IAC5D,MAAM,KAAK,WAAW,YAErB;IAED,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAKpE;IAKN,IAAI,KAAK,uBAER;IAGD,IAAI,QAAQ,uBAEX;IACD,IAAI,YAAY,oCAEf;IACD,IAAI,oBAAoB,kFAEvB;IAOD,IAAI,MAAM,YAET;IACD,IAAI,QAAQ,0GAEX;IAOD,IAAI,KAAK,WAER;IACD,IAAI,MAAM,WAET;IACD,IAAI,WAAW;;;OAEd;IAOD,IAAI,IAAI,4BAIP;IAKD,IAAI,YAAY,8DAEf;IACD;;OAEG;IACH,IAAI,eAAe,WAElB;IACD;;OAEG;IACH,IAAI,SAAS,gDAEZ;IACD;;OAEG;IACH,IAAI,iBAAiB,WAEpB;IACD;;OAEG;IACH,IAAI,aAAa,WAEhB;IACD;;OAEG;IACH,IAAI,qBAAqB,WAExB;IAKD;;OAEG;IACH,IAAI,eAAe,WAElB;IAKD;;OAEG;IACH,IAAI,cAAc,WAEjB;IACD;;;;;;;;;OASG;IACH,IAAI,eAAe,WAElB;IACD;;;OAGG;IACH,IAAI,sBAAsB,WAEzB;IAID;;OAEG;gBACS,EACR,KAAK,EACL,QAAmC,EACnC,oBAAsC,EACtC,kBAAyB,GAC5B,EAAE,qBAAqB,CAAC,OAAO;IAgDhC,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,SAAS;IAInB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,SAAS;IAItD,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB;IA2B3C,OAAO,IAAI,SAAS;CAUvB;AAED,yBAAiB,qBAAqB,CAAC;IACnC,UAAiB,OAAQ,SAAQ,IAAI,CACjC,kBAAkB,EAClB,sBAAsB,GAAG,oBAAoB,CAChD;QACG;;WAEG;QACH,KAAK,EAAE,kBAAkB,CAAC;QAE1B,QAAQ,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;KAC7C;CACJ"}
|