@yume-chan/scrcpy 0.0.11
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/CHANGELOG.json +43 -0
- package/CHANGELOG.md +21 -0
- package/LICENSE +21 -0
- package/README.md +88 -0
- package/bin/scrcpy-server +0 -0
- package/bin/version.d.ts +1 -0
- package/bin/version.js +1 -0
- package/esm/client.d.ts +36 -0
- package/esm/client.d.ts.map +1 -0
- package/esm/client.js +209 -0
- package/esm/client.js.map +1 -0
- package/esm/codec.d.ts +34 -0
- package/esm/codec.d.ts.map +1 -0
- package/esm/codec.js +37 -0
- package/esm/codec.js.map +1 -0
- package/esm/connection.d.ts +37 -0
- package/esm/connection.d.ts.map +1 -0
- package/esm/connection.js +103 -0
- package/esm/connection.js.map +1 -0
- package/esm/decoder/index.d.ts +4 -0
- package/esm/decoder/index.d.ts.map +1 -0
- package/esm/decoder/index.js +4 -0
- package/esm/decoder/index.js.map +1 -0
- package/esm/decoder/tinyh264/index.d.ts +20 -0
- package/esm/decoder/tinyh264/index.d.ts.map +1 -0
- package/esm/decoder/tinyh264/index.js +86 -0
- package/esm/decoder/tinyh264/index.js.map +1 -0
- package/esm/decoder/tinyh264/worker.d.ts +2 -0
- package/esm/decoder/tinyh264/worker.d.ts.map +1 -0
- package/esm/decoder/tinyh264/worker.js +3 -0
- package/esm/decoder/tinyh264/worker.js.map +1 -0
- package/esm/decoder/tinyh264/wrapper.d.ts +21 -0
- package/esm/decoder/tinyh264/wrapper.d.ts.map +1 -0
- package/esm/decoder/tinyh264/wrapper.js +67 -0
- package/esm/decoder/tinyh264/wrapper.js.map +1 -0
- package/esm/decoder/types.d.ts +28 -0
- package/esm/decoder/types.d.ts.map +1 -0
- package/esm/decoder/types.js +2 -0
- package/esm/decoder/types.js.map +1 -0
- package/esm/decoder/web-codecs/index.d.ts +22 -0
- package/esm/decoder/web-codecs/index.d.ts.map +1 -0
- package/esm/decoder/web-codecs/index.js +75 -0
- package/esm/decoder/web-codecs/index.js.map +1 -0
- package/esm/index.d.ts +9 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +9 -0
- package/esm/index.js.map +1 -0
- package/esm/message.d.ts +93 -0
- package/esm/message.d.ts.map +1 -0
- package/esm/message.js +92 -0
- package/esm/message.js.map +1 -0
- package/esm/options/1_16/index.d.ts +107 -0
- package/esm/options/1_16/index.d.ts.map +1 -0
- package/esm/options/1_16/index.js +211 -0
- package/esm/options/1_16/index.js.map +1 -0
- package/esm/options/1_16/sps.d.ts +22 -0
- package/esm/options/1_16/sps.d.ts.map +1 -0
- package/esm/options/1_16/sps.js +254 -0
- package/esm/options/1_16/sps.js.map +1 -0
- package/esm/options/1_18.d.ts +19 -0
- package/esm/options/1_18.d.ts.map +1 -0
- package/esm/options/1_18.js +23 -0
- package/esm/options/1_18.js.map +1 -0
- package/esm/options/1_21.d.ts +10 -0
- package/esm/options/1_21.d.ts.map +1 -0
- package/esm/options/1_21.js +23 -0
- package/esm/options/1_21.js.map +1 -0
- package/esm/options/1_22.d.ts +43 -0
- package/esm/options/1_22.d.ts.map +1 -0
- package/esm/options/1_22.js +40 -0
- package/esm/options/1_22.js.map +1 -0
- package/esm/options/common.d.ts +30 -0
- package/esm/options/common.d.ts.map +1 -0
- package/esm/options/common.js +16 -0
- package/esm/options/common.js.map +1 -0
- package/esm/options/index.d.ts +6 -0
- package/esm/options/index.d.ts.map +1 -0
- package/esm/options/index.js +6 -0
- package/esm/options/index.js.map +1 -0
- package/esm/push-server.d.ts +6 -0
- package/esm/push-server.d.ts.map +1 -0
- package/esm/push-server.js +23 -0
- package/esm/push-server.js.map +1 -0
- package/esm/utils.d.ts +4 -0
- package/esm/utils.d.ts.map +1 -0
- package/esm/utils.js +14 -0
- package/esm/utils.js.map +1 -0
- package/package.json +61 -0
- package/scrcpy.LICENSE +203 -0
- package/scripts/fetch-server.cjs +28 -0
- package/src/client.ts +275 -0
- package/src/codec.ts +35 -0
- package/src/connection.ts +123 -0
- package/src/decoder/index.ts +3 -0
- package/src/decoder/tinyh264/index.ts +112 -0
- package/src/decoder/tinyh264/types.d.ts +137 -0
- package/src/decoder/tinyh264/worker.ts +2 -0
- package/src/decoder/tinyh264/wrapper.ts +89 -0
- package/src/decoder/types.ts +35 -0
- package/src/decoder/web-codecs/index.ts +98 -0
- package/src/index.ts +8 -0
- package/src/message.ts +105 -0
- package/src/options/1_16/index.ts +322 -0
- package/src/options/1_16/sps.ts +300 -0
- package/src/options/1_18.ts +41 -0
- package/src/options/1_21.ts +34 -0
- package/src/options/1_22.ts +80 -0
- package/src/options/common.ts +61 -0
- package/src/options/index.ts +5 -0
- package/src/push-server.ts +26 -0
- package/src/utils.ts +16 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { AdbBufferedStream } from "@yume-chan/adb";
|
|
3
|
+
import { delay } from "./utils.js";
|
|
4
|
+
export class ScrcpyClientConnection {
|
|
5
|
+
constructor(device, options) {
|
|
6
|
+
this.device = device;
|
|
7
|
+
this.options = options;
|
|
8
|
+
}
|
|
9
|
+
initialize() { }
|
|
10
|
+
dispose() { }
|
|
11
|
+
}
|
|
12
|
+
export class ScrcpyClientForwardConnection extends ScrcpyClientConnection {
|
|
13
|
+
connect() {
|
|
14
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
15
|
+
return yield this.device.createSocket('localabstract:scrcpy');
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
connectAndRetry() {
|
|
19
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
for (let i = 0; i < 100; i++) {
|
|
21
|
+
try {
|
|
22
|
+
return yield this.connect();
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
yield delay(100);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
throw new Error(`Can't connect to server after 100 retries`);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
connectVideoStream() {
|
|
32
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
33
|
+
const socket = yield this.connectAndRetry();
|
|
34
|
+
const stream = new AdbBufferedStream(socket);
|
|
35
|
+
if (this.options.sendDummyByte) {
|
|
36
|
+
// server will write a `0` to signal connection success
|
|
37
|
+
yield stream.read(1);
|
|
38
|
+
}
|
|
39
|
+
return stream;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
getStreams() {
|
|
43
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
44
|
+
const videoStream = yield this.connectVideoStream();
|
|
45
|
+
let controlStream;
|
|
46
|
+
if (this.options.control) {
|
|
47
|
+
controlStream = yield this.connectAndRetry();
|
|
48
|
+
}
|
|
49
|
+
if (this.options.sendDeviceMeta) {
|
|
50
|
+
// 64 bytes device name + 2 bytes video width + 2 bytes video height
|
|
51
|
+
yield videoStream.read(64 + 2 + 2);
|
|
52
|
+
}
|
|
53
|
+
return [videoStream, controlStream];
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export class ScrcpyClientReverseConnection extends ScrcpyClientConnection {
|
|
58
|
+
initialize() {
|
|
59
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
60
|
+
try {
|
|
61
|
+
// try to unbind first
|
|
62
|
+
yield this.device.reverse.remove('localabstract:scrcpy');
|
|
63
|
+
}
|
|
64
|
+
catch (_a) {
|
|
65
|
+
// ignore error
|
|
66
|
+
}
|
|
67
|
+
const queue = new TransformStream();
|
|
68
|
+
this.streams = queue.readable.getReader();
|
|
69
|
+
const writer = queue.writable.getWriter();
|
|
70
|
+
this.address = yield this.device.reverse.add('localabstract:scrcpy', 27183, {
|
|
71
|
+
onSocket: (packet, stream) => {
|
|
72
|
+
writer.write(stream);
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
accept() {
|
|
78
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
return (yield this.streams.read()).value;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
getStreams() {
|
|
83
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
+
const videoStream = new AdbBufferedStream(yield this.accept());
|
|
85
|
+
let controlStream;
|
|
86
|
+
if (this.options.control) {
|
|
87
|
+
controlStream = yield this.accept();
|
|
88
|
+
}
|
|
89
|
+
if (this.options.sendDeviceMeta) {
|
|
90
|
+
// 64 bytes device name + 2 bytes video width + 2 bytes video height
|
|
91
|
+
yield videoStream.read(64 + 2 + 2);
|
|
92
|
+
}
|
|
93
|
+
return [videoStream, controlStream];
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
dispose() {
|
|
97
|
+
// Don't await this!
|
|
98
|
+
// `reverse.remove`'s response will never arrive
|
|
99
|
+
// before we read all pending data from `videoStream`
|
|
100
|
+
this.device.reverse.remove(this.address);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/decoder/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decoder/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { WritableStream } from "@yume-chan/adb";
|
|
2
|
+
import { AndroidCodecLevel, AndroidCodecProfile } from "../../codec.js";
|
|
3
|
+
import type { VideoStreamPacket } from "../../options/index.js";
|
|
4
|
+
import type { H264Decoder } from "../types.js";
|
|
5
|
+
export declare class TinyH264Decoder implements H264Decoder {
|
|
6
|
+
readonly maxProfile = AndroidCodecProfile.Baseline;
|
|
7
|
+
readonly maxLevel = AndroidCodecLevel.Level4;
|
|
8
|
+
private _renderer;
|
|
9
|
+
get renderer(): HTMLCanvasElement;
|
|
10
|
+
private _frameRendered;
|
|
11
|
+
get frameRendered(): number;
|
|
12
|
+
private _writable;
|
|
13
|
+
get writable(): WritableStream<VideoStreamPacket>;
|
|
14
|
+
private _yuvCanvas;
|
|
15
|
+
private _initializer;
|
|
16
|
+
constructor();
|
|
17
|
+
private configure;
|
|
18
|
+
dispose(): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/decoder/tinyh264/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAqB,WAAW,EAAE,MAAM,aAAa,CAAC;AAgBlE,qBAAa,eAAgB,YAAW,WAAW;IAC/C,SAAgB,UAAU,gCAAgC;IAE1D,SAAgB,QAAQ,4BAA4B;IAEpD,OAAO,CAAC,SAAS,CAAoB;IACrC,IAAW,QAAQ,sBAA6B;IAEhD,OAAO,CAAC,cAAc,CAAK;IAC3B,IAAW,aAAa,WAAkC;IAE1D,OAAO,CAAC,SAAS,CAAoC;IACrD,IAAW,QAAQ,sCAA6B;IAEhD,OAAO,CAAC,UAAU,CAA2C;IAC7D,OAAO,CAAC,YAAY,CAA+C;;YA0BrD,SAAS;IA8ChB,OAAO,IAAI,IAAI;CAIzB"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { WritableStream } from "@yume-chan/adb";
|
|
3
|
+
import { PromiseResolver } from "@yume-chan/async";
|
|
4
|
+
import { AndroidCodecLevel, AndroidCodecProfile } from "../../codec.js";
|
|
5
|
+
import { createTinyH264Wrapper } from "./wrapper.js";
|
|
6
|
+
let cachedInitializePromise;
|
|
7
|
+
function initialize() {
|
|
8
|
+
if (!cachedInitializePromise) {
|
|
9
|
+
cachedInitializePromise = Promise.all([import('yuv-buffer'), import('yuv-canvas')]).then(([YuvBuffer, { default: YuvCanvas }]) => ({
|
|
10
|
+
YuvBuffer, YuvCanvas
|
|
11
|
+
}));
|
|
12
|
+
}
|
|
13
|
+
return cachedInitializePromise;
|
|
14
|
+
}
|
|
15
|
+
export class TinyH264Decoder {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.maxProfile = AndroidCodecProfile.Baseline;
|
|
18
|
+
this.maxLevel = AndroidCodecLevel.Level4;
|
|
19
|
+
this._frameRendered = 0;
|
|
20
|
+
initialize();
|
|
21
|
+
this._renderer = document.createElement('canvas');
|
|
22
|
+
this._writable = new WritableStream({
|
|
23
|
+
write: (packet) => __awaiter(this, void 0, void 0, function* () {
|
|
24
|
+
switch (packet.type) {
|
|
25
|
+
case 'configuration':
|
|
26
|
+
this.configure(packet.data);
|
|
27
|
+
break;
|
|
28
|
+
case 'frame':
|
|
29
|
+
if (!this._initializer) {
|
|
30
|
+
throw new Error('Decoder not initialized');
|
|
31
|
+
}
|
|
32
|
+
const wrapper = yield this._initializer.promise;
|
|
33
|
+
wrapper.feed(packet.data.slice().buffer);
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
get renderer() { return this._renderer; }
|
|
40
|
+
get frameRendered() { return this._frameRendered; }
|
|
41
|
+
get writable() { return this._writable; }
|
|
42
|
+
configure(config) {
|
|
43
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
44
|
+
this.dispose();
|
|
45
|
+
this._initializer = new PromiseResolver();
|
|
46
|
+
const { YuvBuffer, YuvCanvas } = yield initialize();
|
|
47
|
+
if (!this._yuvCanvas) {
|
|
48
|
+
this._yuvCanvas = YuvCanvas.attach(this._renderer);
|
|
49
|
+
;
|
|
50
|
+
}
|
|
51
|
+
const { encodedWidth, encodedHeight } = config;
|
|
52
|
+
const chromaWidth = encodedWidth / 2;
|
|
53
|
+
const chromaHeight = encodedHeight / 2;
|
|
54
|
+
this._renderer.width = config.croppedWidth;
|
|
55
|
+
this._renderer.height = config.croppedHeight;
|
|
56
|
+
const format = YuvBuffer.format({
|
|
57
|
+
width: encodedWidth,
|
|
58
|
+
height: encodedHeight,
|
|
59
|
+
chromaWidth,
|
|
60
|
+
chromaHeight,
|
|
61
|
+
cropLeft: config.cropLeft,
|
|
62
|
+
cropTop: config.cropTop,
|
|
63
|
+
cropWidth: config.croppedWidth,
|
|
64
|
+
cropHeight: config.croppedHeight,
|
|
65
|
+
displayWidth: config.croppedWidth,
|
|
66
|
+
displayHeight: config.croppedHeight,
|
|
67
|
+
});
|
|
68
|
+
const wrapper = yield createTinyH264Wrapper();
|
|
69
|
+
this._initializer.resolve(wrapper);
|
|
70
|
+
const uPlaneOffset = encodedWidth * encodedHeight;
|
|
71
|
+
const vPlaneOffset = uPlaneOffset + chromaWidth * chromaHeight;
|
|
72
|
+
wrapper.onPictureReady(({ data }) => {
|
|
73
|
+
this._frameRendered += 1;
|
|
74
|
+
const array = new Uint8Array(data);
|
|
75
|
+
const frame = YuvBuffer.frame(format, YuvBuffer.lumaPlane(format, array, encodedWidth, 0), YuvBuffer.chromaPlane(format, array, chromaWidth, uPlaneOffset), YuvBuffer.chromaPlane(format, array, chromaWidth, vPlaneOffset));
|
|
76
|
+
this._yuvCanvas.drawFrame(frame);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
dispose() {
|
|
81
|
+
var _a;
|
|
82
|
+
(_a = this._initializer) === null || _a === void 0 ? void 0 : _a.promise.then(wrapper => wrapper.dispose());
|
|
83
|
+
this._initializer = undefined;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/decoder/tinyh264/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/decoder/tinyh264/worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/decoder/tinyh264/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AutoDisposable } from '@yume-chan/event';
|
|
2
|
+
export interface PictureReadyEventArgs {
|
|
3
|
+
renderStateId: number;
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
data: ArrayBuffer;
|
|
7
|
+
}
|
|
8
|
+
export declare class TinyH264Wrapper extends AutoDisposable {
|
|
9
|
+
readonly streamId: number;
|
|
10
|
+
private readonly pictureReadyEvent;
|
|
11
|
+
get onPictureReady(): {
|
|
12
|
+
(listener: import("@yume-chan/event").EventListener<PictureReadyEventArgs, unknown, [], unknown>): import("@yume-chan/event").RemoveEventListener;
|
|
13
|
+
<TThis, TArgs extends unknown[]>(listener: import("@yume-chan/event").EventListener<PictureReadyEventArgs, TThis, TArgs, unknown>, thisArg: TThis, ...args: TArgs): import("@yume-chan/event").RemoveEventListener;
|
|
14
|
+
};
|
|
15
|
+
constructor(streamId: number);
|
|
16
|
+
private handlePictureReady;
|
|
17
|
+
feed(data: ArrayBuffer): void;
|
|
18
|
+
dispose(): void;
|
|
19
|
+
}
|
|
20
|
+
export declare function createTinyH264Wrapper(): Promise<TinyH264Wrapper>;
|
|
21
|
+
//# sourceMappingURL=wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../../src/decoder/tinyh264/wrapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAgB,MAAM,kBAAkB,CAAC;AAOhE,MAAM,WAAW,qBAAqB;IAClC,aAAa,EAAE,MAAM,CAAC;IAEtB,KAAK,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,MAAM,CAAC;IAEf,IAAI,EAAE,WAAW,CAAC;CACrB;AAID,qBAAa,eAAgB,SAAQ,cAAc;IAC/C,SAAgB,QAAQ,EAAE,MAAM,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6C;IAC/E,IAAW,cAAc;;;MAA2C;gBAEjD,QAAQ,EAAE,MAAM;IAOnC,OAAO,CAAC,kBAAkB;IAMnB,IAAI,CAAC,IAAI,EAAE,WAAW;IAUb,OAAO;CAO1B;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAAC,eAAe,CAAC,CA8BhE"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { PromiseResolver } from '@yume-chan/async';
|
|
2
|
+
import { AutoDisposable, EventEmitter } from '@yume-chan/event';
|
|
3
|
+
let worker;
|
|
4
|
+
let workerReady = false;
|
|
5
|
+
const pendingResolvers = [];
|
|
6
|
+
let streamId = 0;
|
|
7
|
+
const pictureReadyEvent = new EventEmitter();
|
|
8
|
+
export class TinyH264Wrapper extends AutoDisposable {
|
|
9
|
+
constructor(streamId) {
|
|
10
|
+
super();
|
|
11
|
+
this.pictureReadyEvent = new EventEmitter();
|
|
12
|
+
this.streamId = streamId;
|
|
13
|
+
this.addDisposable(pictureReadyEvent.event(this.handlePictureReady, this));
|
|
14
|
+
}
|
|
15
|
+
get onPictureReady() { return this.pictureReadyEvent.event; }
|
|
16
|
+
handlePictureReady(e) {
|
|
17
|
+
if (e.renderStateId === this.streamId) {
|
|
18
|
+
this.pictureReadyEvent.fire(e);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
feed(data) {
|
|
22
|
+
worker.postMessage({
|
|
23
|
+
type: 'decode',
|
|
24
|
+
data: data,
|
|
25
|
+
offset: 0,
|
|
26
|
+
length: data.byteLength,
|
|
27
|
+
renderStateId: this.streamId,
|
|
28
|
+
}, [data]);
|
|
29
|
+
}
|
|
30
|
+
dispose() {
|
|
31
|
+
super.dispose();
|
|
32
|
+
worker.postMessage({
|
|
33
|
+
type: 'release',
|
|
34
|
+
renderStateId: this.streamId,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function createTinyH264Wrapper() {
|
|
39
|
+
if (!worker) {
|
|
40
|
+
worker = new Worker(new URL('./worker.js', import.meta.url));
|
|
41
|
+
worker.addEventListener('message', (e) => {
|
|
42
|
+
const { data } = e;
|
|
43
|
+
switch (data.type) {
|
|
44
|
+
case 'decoderReady':
|
|
45
|
+
workerReady = true;
|
|
46
|
+
for (const resolver of pendingResolvers) {
|
|
47
|
+
resolver.resolve(new TinyH264Wrapper(streamId));
|
|
48
|
+
streamId += 1;
|
|
49
|
+
}
|
|
50
|
+
pendingResolvers.length = 0;
|
|
51
|
+
break;
|
|
52
|
+
case 'pictureReady':
|
|
53
|
+
pictureReadyEvent.fire(data);
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (!workerReady) {
|
|
59
|
+
const resolver = new PromiseResolver();
|
|
60
|
+
pendingResolvers.push(resolver);
|
|
61
|
+
return resolver.promise;
|
|
62
|
+
}
|
|
63
|
+
const decoder = new TinyH264Wrapper(streamId);
|
|
64
|
+
streamId += 1;
|
|
65
|
+
return Promise.resolve(decoder);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../../src/decoder/tinyh264/wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhE,IAAI,MAA0B,CAAC;AAC/B,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,MAAM,gBAAgB,GAAuC,EAAE,CAAC;AAChE,IAAI,QAAQ,GAAG,CAAC,CAAC;AAYjB,MAAM,iBAAiB,GAAG,IAAI,YAAY,EAAyB,CAAC;AAEpE,MAAM,OAAO,eAAgB,SAAQ,cAAc;IAM/C,YAAmB,QAAgB;QAC/B,KAAK,EAAE,CAAC;QAJK,sBAAiB,GAAG,IAAI,YAAY,EAAyB,CAAC;QAM3E,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/E,CAAC;IAPD,IAAW,cAAc,KAAK,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IAS5D,kBAAkB,CAAC,CAAwB;QAC/C,IAAI,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,QAAQ,EAAE;YACnC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAClC;IACL,CAAC;IAEM,IAAI,CAAC,IAAiB;QACzB,MAAO,CAAC,WAAW,CAAC;YAChB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,IAAI,CAAC,UAAU;YACvB,aAAa,EAAE,IAAI,CAAC,QAAQ;SAC/B,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACf,CAAC;IAEe,OAAO;QACnB,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,MAAO,CAAC,WAAW,CAAC;YAChB,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,IAAI,CAAC,QAAQ;SAC/B,CAAC,CAAC;IACP,CAAC;CACJ;AAED,MAAM,UAAU,qBAAqB;IACjC,IAAI,CAAC,MAAM,EAAE;QACT,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;YACrC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACnB,QAAQ,IAAI,CAAC,IAAI,EAAE;gBACf,KAAK,cAAc;oBACf,WAAW,GAAG,IAAI,CAAC;oBACnB,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE;wBACrC,QAAQ,CAAC,OAAO,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;wBAChD,QAAQ,IAAI,CAAC,CAAC;qBACjB;oBACD,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC5B,MAAM;gBACV,KAAK,cAAc;oBACf,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC7B,MAAM;aACb;QACL,CAAC,CAAC,CAAC;KACN;IAED,IAAI,CAAC,WAAW,EAAE;QACd,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAmB,CAAC;QACxD,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,QAAQ,CAAC,OAAO,CAAC;KAC3B;IAED,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC9C,QAAQ,IAAI,CAAC,CAAC;IACd,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { WritableStream } from '@yume-chan/adb';
|
|
2
|
+
import type { Disposable } from "@yume-chan/event";
|
|
3
|
+
import type { AndroidCodecLevel, AndroidCodecProfile } from "../codec.js";
|
|
4
|
+
import type { VideoStreamPacket } from "../options/index.js";
|
|
5
|
+
export interface H264Configuration {
|
|
6
|
+
profileIndex: number;
|
|
7
|
+
constraintSet: number;
|
|
8
|
+
levelIndex: number;
|
|
9
|
+
encodedWidth: number;
|
|
10
|
+
encodedHeight: number;
|
|
11
|
+
cropLeft: number;
|
|
12
|
+
cropRight: number;
|
|
13
|
+
cropTop: number;
|
|
14
|
+
cropBottom: number;
|
|
15
|
+
croppedWidth: number;
|
|
16
|
+
croppedHeight: number;
|
|
17
|
+
}
|
|
18
|
+
export interface H264Decoder extends Disposable {
|
|
19
|
+
readonly maxProfile: AndroidCodecProfile | undefined;
|
|
20
|
+
readonly maxLevel: AndroidCodecLevel | undefined;
|
|
21
|
+
readonly renderer: HTMLElement;
|
|
22
|
+
readonly frameRendered: number;
|
|
23
|
+
readonly writable: WritableStream<VideoStreamPacket>;
|
|
24
|
+
}
|
|
25
|
+
export interface H264DecoderConstructor {
|
|
26
|
+
new (): H264Decoder;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/decoder/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IAEnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IAEtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IAEnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC3C,QAAQ,CAAC,UAAU,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAEjD,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,sBAAsB;IACnC,QAAO,WAAW,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/decoder/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { WritableStream } from '@yume-chan/adb';
|
|
2
|
+
import type { VideoStreamPacket } from "../../options/index.js";
|
|
3
|
+
import type { H264Decoder } from "../types.js";
|
|
4
|
+
export declare class WebCodecsDecoder implements H264Decoder {
|
|
5
|
+
readonly maxProfile: undefined;
|
|
6
|
+
readonly maxLevel: undefined;
|
|
7
|
+
private _writable;
|
|
8
|
+
get writable(): WritableStream<VideoStreamPacket>;
|
|
9
|
+
private _renderer;
|
|
10
|
+
get renderer(): HTMLCanvasElement;
|
|
11
|
+
private _frameRendered;
|
|
12
|
+
get frameRendered(): number;
|
|
13
|
+
private context;
|
|
14
|
+
private decoder;
|
|
15
|
+
private lastFrame;
|
|
16
|
+
private animationFrame;
|
|
17
|
+
constructor();
|
|
18
|
+
private render;
|
|
19
|
+
private configure;
|
|
20
|
+
dispose(): void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/decoder/web-codecs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAqB,WAAW,EAAE,MAAM,aAAa,CAAC;AAMlE,qBAAa,gBAAiB,YAAW,WAAW;IAGhD,SAAgB,UAAU,YAAa;IACvC,SAAgB,QAAQ,YAAa;IAErC,OAAO,CAAC,SAAS,CAAoC;IACrD,IAAW,QAAQ,sCAA6B;IAEhD,OAAO,CAAC,SAAS,CAAoB;IACrC,IAAW,QAAQ,sBAA6B;IAEhD,OAAO,CAAC,cAAc,CAAK;IAC3B,IAAW,aAAa,WAAkC;IAE1D,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,OAAO,CAAe;IAG9B,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,cAAc,CAAa;;IAuCnC,OAAO,CAAC,MAAM,CASZ;IAEF,OAAO,CAAC,SAAS;IAeV,OAAO;CAIjB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { WritableStream } from '@yume-chan/adb';
|
|
3
|
+
function toHex(value) {
|
|
4
|
+
return value.toString(16).padStart(2, '0').toUpperCase();
|
|
5
|
+
}
|
|
6
|
+
export class WebCodecsDecoder {
|
|
7
|
+
constructor() {
|
|
8
|
+
// Usually, browsers can decode most configurations,
|
|
9
|
+
// So let device choose best profile and level for itself.
|
|
10
|
+
this.maxProfile = undefined;
|
|
11
|
+
this.maxLevel = undefined;
|
|
12
|
+
this._frameRendered = 0;
|
|
13
|
+
this.animationFrame = 0;
|
|
14
|
+
this.render = () => {
|
|
15
|
+
if (this.lastFrame) {
|
|
16
|
+
this._frameRendered += 1;
|
|
17
|
+
this.context.drawImage(this.lastFrame, 0, 0);
|
|
18
|
+
this.lastFrame.close();
|
|
19
|
+
this.lastFrame = undefined;
|
|
20
|
+
}
|
|
21
|
+
this.animationFrame = requestAnimationFrame(this.render);
|
|
22
|
+
};
|
|
23
|
+
this._renderer = document.createElement('canvas');
|
|
24
|
+
this.context = this._renderer.getContext('2d');
|
|
25
|
+
this.decoder = new VideoDecoder({
|
|
26
|
+
output: (frame) => {
|
|
27
|
+
if (this.lastFrame) {
|
|
28
|
+
this.lastFrame.close();
|
|
29
|
+
}
|
|
30
|
+
this.lastFrame = frame;
|
|
31
|
+
if (!this.animationFrame) {
|
|
32
|
+
// Start render loop on first frame
|
|
33
|
+
this.render();
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
error() { },
|
|
37
|
+
});
|
|
38
|
+
this._writable = new WritableStream({
|
|
39
|
+
write: (packet) => __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
switch (packet.type) {
|
|
41
|
+
case 'configuration':
|
|
42
|
+
this.configure(packet.data);
|
|
43
|
+
break;
|
|
44
|
+
case 'frame':
|
|
45
|
+
this.decoder.decode(new EncodedVideoChunk({
|
|
46
|
+
type: 'key',
|
|
47
|
+
timestamp: 0,
|
|
48
|
+
data: packet.data,
|
|
49
|
+
}));
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
get writable() { return this._writable; }
|
|
56
|
+
get renderer() { return this._renderer; }
|
|
57
|
+
get frameRendered() { return this._frameRendered; }
|
|
58
|
+
configure(config) {
|
|
59
|
+
const { profileIndex, constraintSet, levelIndex } = config;
|
|
60
|
+
this._renderer.width = config.croppedWidth;
|
|
61
|
+
this._renderer.height = config.croppedHeight;
|
|
62
|
+
// https://www.rfc-editor.org/rfc/rfc6381#section-3.3
|
|
63
|
+
// ISO Base Media File Format Name Space
|
|
64
|
+
const codec = `avc1.${[profileIndex, constraintSet, levelIndex].map(toHex).join('')}`;
|
|
65
|
+
this.decoder.configure({
|
|
66
|
+
codec: codec,
|
|
67
|
+
optimizeForLatency: true,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
dispose() {
|
|
71
|
+
cancelAnimationFrame(this.animationFrame);
|
|
72
|
+
this.decoder.close();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/decoder/web-codecs/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIhD,SAAS,KAAK,CAAC,KAAa;IACxB,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,OAAO,gBAAgB;IAsBzB;QArBA,oDAAoD;QACpD,0DAA0D;QAC1C,eAAU,GAAG,SAAS,CAAC;QACvB,aAAQ,GAAG,SAAS,CAAC;QAQ7B,mBAAc,GAAG,CAAC,CAAC;QAQnB,mBAAc,GAAW,CAAC,CAAC;QAuC3B,WAAM,GAAG,GAAG,EAAE;YAClB,IAAI,IAAI,CAAC,SAAS,EAAE;gBAChB,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;gBACzB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7C,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;aAC9B;YAED,IAAI,CAAC,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7D,CAAC,CAAC;QA7CE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAElD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAE,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC;YAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACd,IAAI,IAAI,CAAC,SAAS,EAAE;oBAChB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;iBAC1B;gBACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBAEvB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;oBACtB,mCAAmC;oBACnC,IAAI,CAAC,MAAM,EAAE,CAAC;iBACjB;YACL,CAAC;YACD,KAAK,KAAK,CAAC;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,GAAG,IAAI,cAAc,CAAoB;YACnD,KAAK,EAAE,CAAO,MAAM,EAAE,EAAE;gBACpB,QAAQ,MAAM,CAAC,IAAI,EAAE;oBACjB,KAAK,eAAe;wBAChB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;wBAC5B,MAAM;oBACV,KAAK,OAAO;wBACR,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC;4BACtC,IAAI,EAAE,KAAK;4BACX,SAAS,EAAE,CAAC;4BACZ,IAAI,EAAE,MAAM,CAAC,IAAI;yBACpB,CAAC,CAAC,CAAC;wBACJ,MAAM;iBACb;YACL,CAAC,CAAA;SACJ,CAAC,CAAC;IACP,CAAC;IAlDD,IAAW,QAAQ,KAAK,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAGhD,IAAW,QAAQ,KAAK,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAGhD,IAAW,aAAa,KAAK,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAyDlD,SAAS,CAAC,MAAyB;QACvC,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QAE3D,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;QAC3C,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;QAE7C,qDAAqD;QACrD,wCAAwC;QACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACtF,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,KAAK;YACZ,kBAAkB,EAAE,IAAI;SAC3B,CAAC,CAAC;IACP,CAAC;IAEM,OAAO;QACV,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACJ"}
|
package/esm/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './client.js';
|
|
2
|
+
export * from './codec.js';
|
|
3
|
+
export * from './connection.js';
|
|
4
|
+
export * from './decoder/index.js';
|
|
5
|
+
export * from './message.js';
|
|
6
|
+
export * from './options/index.js';
|
|
7
|
+
export * from './push-server.js';
|
|
8
|
+
export * from './utils.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
|
package/esm/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './client.js';
|
|
2
|
+
export * from './codec.js';
|
|
3
|
+
export * from './connection.js';
|
|
4
|
+
export * from './decoder/index.js';
|
|
5
|
+
export * from './message.js';
|
|
6
|
+
export * from './options/index.js';
|
|
7
|
+
export * from './push-server.js';
|
|
8
|
+
export * from './utils.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
package/esm/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
|
package/esm/message.d.ts
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import Struct from '@yume-chan/struct';
|
|
2
|
+
export declare enum ScrcpyControlMessageType {
|
|
3
|
+
InjectKeycode = 0,
|
|
4
|
+
InjectText = 1,
|
|
5
|
+
InjectTouch = 2,
|
|
6
|
+
InjectScroll = 3,
|
|
7
|
+
BackOrScreenOn = 4,
|
|
8
|
+
ExpandNotificationPanel = 5,
|
|
9
|
+
CollapseNotificationPanel = 6,
|
|
10
|
+
GetClipboard = 7,
|
|
11
|
+
SetClipboard = 8,
|
|
12
|
+
SetScreenPowerMode = 9,
|
|
13
|
+
RotateDevice = 10
|
|
14
|
+
}
|
|
15
|
+
export declare enum AndroidMotionEventAction {
|
|
16
|
+
Down = 0,
|
|
17
|
+
Up = 1,
|
|
18
|
+
Move = 2,
|
|
19
|
+
Cancel = 3,
|
|
20
|
+
Outside = 4,
|
|
21
|
+
PointerDown = 5,
|
|
22
|
+
PointerUp = 6,
|
|
23
|
+
HoverMove = 7,
|
|
24
|
+
Scroll = 8,
|
|
25
|
+
HoverEnter = 9,
|
|
26
|
+
HoverExit = 10,
|
|
27
|
+
ButtonPress = 11,
|
|
28
|
+
ButtonRelease = 12
|
|
29
|
+
}
|
|
30
|
+
export declare const ScrcpyInjectTouchControlMessage: Struct<{
|
|
31
|
+
type: ScrcpyControlMessageType.InjectTouch;
|
|
32
|
+
action: AndroidMotionEventAction;
|
|
33
|
+
pointerId: bigint;
|
|
34
|
+
pointerX: number;
|
|
35
|
+
pointerY: number;
|
|
36
|
+
screenWidth: number;
|
|
37
|
+
screenHeight: number;
|
|
38
|
+
pressure: number;
|
|
39
|
+
buttons: number;
|
|
40
|
+
}, never, {}, undefined>;
|
|
41
|
+
export declare type ScrcpyInjectTouchControlMessage = typeof ScrcpyInjectTouchControlMessage['TInit'];
|
|
42
|
+
export declare const ScrcpyInjectTextControlMessage: Struct<{
|
|
43
|
+
type: ScrcpyControlMessageType.InjectText;
|
|
44
|
+
length: number;
|
|
45
|
+
text: string;
|
|
46
|
+
}, "length", {}, undefined>;
|
|
47
|
+
export declare type ScrcpyInjectTextControlMessage = typeof ScrcpyInjectTextControlMessage['TInit'];
|
|
48
|
+
export declare enum AndroidKeyEventAction {
|
|
49
|
+
Down = 0,
|
|
50
|
+
Up = 1
|
|
51
|
+
}
|
|
52
|
+
export declare enum AndroidKeyCode {
|
|
53
|
+
Home = 3,
|
|
54
|
+
Back = 4,
|
|
55
|
+
A = 29,
|
|
56
|
+
B = 30,
|
|
57
|
+
C = 31,
|
|
58
|
+
D = 32,
|
|
59
|
+
E = 33,
|
|
60
|
+
F = 34,
|
|
61
|
+
G = 35,
|
|
62
|
+
H = 36,
|
|
63
|
+
I = 37,
|
|
64
|
+
J = 38,
|
|
65
|
+
K = 39,
|
|
66
|
+
L = 40,
|
|
67
|
+
M = 41,
|
|
68
|
+
N = 42,
|
|
69
|
+
O = 43,
|
|
70
|
+
P = 44,
|
|
71
|
+
Q = 45,
|
|
72
|
+
R = 46,
|
|
73
|
+
S = 47,
|
|
74
|
+
T = 48,
|
|
75
|
+
U = 49,
|
|
76
|
+
V = 50,
|
|
77
|
+
W = 51,
|
|
78
|
+
X = 52,
|
|
79
|
+
Y = 53,
|
|
80
|
+
Z = 54,
|
|
81
|
+
Space = 62,
|
|
82
|
+
Delete = 67,
|
|
83
|
+
AppSwitch = 187
|
|
84
|
+
}
|
|
85
|
+
export declare const ScrcpyInjectKeyCodeControlMessage: Struct<{
|
|
86
|
+
type: ScrcpyControlMessageType.InjectKeycode;
|
|
87
|
+
action: AndroidKeyEventAction;
|
|
88
|
+
keyCode: number;
|
|
89
|
+
repeat: number;
|
|
90
|
+
metaState: number;
|
|
91
|
+
}, never, {}, undefined>;
|
|
92
|
+
export declare type ScrcpyInjectKeyCodeControlMessage = typeof ScrcpyInjectKeyCodeControlMessage['TInit'];
|
|
93
|
+
//# sourceMappingURL=message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"AAAA,OAAO,MAAuB,MAAM,mBAAmB,CAAC;AAExD,oBAAY,wBAAwB;IAChC,aAAa,IAAA;IACb,UAAU,IAAA;IACV,WAAW,IAAA;IACX,YAAY,IAAA;IACZ,cAAc,IAAA;IACd,uBAAuB,IAAA;IACvB,yBAAyB,IAAA;IACzB,YAAY,IAAA;IACZ,YAAY,IAAA;IACZ,kBAAkB,IAAA;IAClB,YAAY,KAAA;CACf;AAGD,oBAAY,wBAAwB;IAChC,IAAI,IAAA;IACJ,EAAE,IAAA;IACF,IAAI,IAAA;IACJ,MAAM,IAAA;IACN,OAAO,IAAA;IACP,WAAW,IAAA;IACX,SAAS,IAAA;IACT,SAAS,IAAA;IACT,MAAM,IAAA;IACN,UAAU,IAAA;IACV,SAAS,KAAA;IACT,WAAW,KAAA;IACX,aAAa,KAAA;CAChB;AAED,eAAO,MAAM,+BAA+B;;;;;;;;;;wBAUlB,CAAC;AAE3B,oBAAY,+BAA+B,GAAG,OAAO,+BAA+B,CAAC,OAAO,CAAC,CAAC;AAE9F,eAAO,MAAM,8BAA8B;;;;2BAIO,CAAC;AAEnD,oBAAY,8BAA8B,GACtC,OAAO,8BAA8B,CAAC,OAAO,CAAC,CAAC;AAEnD,oBAAY,qBAAqB;IAC7B,IAAI,IAAI;IACR,EAAE,IAAI;CACT;AAED,oBAAY,cAAc;IACtB,IAAI,IAAI;IACR,IAAI,IAAI;IACR,CAAC,KAAK;IACN,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,CAAC,KAAA;IACD,KAAK,KAAK;IACV,MAAM,KAAK;IACX,SAAS,MAAM;CAClB;AAED,eAAO,MAAM,iCAAiC;;;;;;wBAMlB,CAAC;AAE7B,oBAAY,iCAAiC,GACzC,OAAO,iCAAiC,CAAC,OAAO,CAAC,CAAC"}
|