@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.
Files changed (111) hide show
  1. package/CHANGELOG.json +43 -0
  2. package/CHANGELOG.md +21 -0
  3. package/LICENSE +21 -0
  4. package/README.md +88 -0
  5. package/bin/scrcpy-server +0 -0
  6. package/bin/version.d.ts +1 -0
  7. package/bin/version.js +1 -0
  8. package/esm/client.d.ts +36 -0
  9. package/esm/client.d.ts.map +1 -0
  10. package/esm/client.js +209 -0
  11. package/esm/client.js.map +1 -0
  12. package/esm/codec.d.ts +34 -0
  13. package/esm/codec.d.ts.map +1 -0
  14. package/esm/codec.js +37 -0
  15. package/esm/codec.js.map +1 -0
  16. package/esm/connection.d.ts +37 -0
  17. package/esm/connection.d.ts.map +1 -0
  18. package/esm/connection.js +103 -0
  19. package/esm/connection.js.map +1 -0
  20. package/esm/decoder/index.d.ts +4 -0
  21. package/esm/decoder/index.d.ts.map +1 -0
  22. package/esm/decoder/index.js +4 -0
  23. package/esm/decoder/index.js.map +1 -0
  24. package/esm/decoder/tinyh264/index.d.ts +20 -0
  25. package/esm/decoder/tinyh264/index.d.ts.map +1 -0
  26. package/esm/decoder/tinyh264/index.js +86 -0
  27. package/esm/decoder/tinyh264/index.js.map +1 -0
  28. package/esm/decoder/tinyh264/worker.d.ts +2 -0
  29. package/esm/decoder/tinyh264/worker.d.ts.map +1 -0
  30. package/esm/decoder/tinyh264/worker.js +3 -0
  31. package/esm/decoder/tinyh264/worker.js.map +1 -0
  32. package/esm/decoder/tinyh264/wrapper.d.ts +21 -0
  33. package/esm/decoder/tinyh264/wrapper.d.ts.map +1 -0
  34. package/esm/decoder/tinyh264/wrapper.js +67 -0
  35. package/esm/decoder/tinyh264/wrapper.js.map +1 -0
  36. package/esm/decoder/types.d.ts +28 -0
  37. package/esm/decoder/types.d.ts.map +1 -0
  38. package/esm/decoder/types.js +2 -0
  39. package/esm/decoder/types.js.map +1 -0
  40. package/esm/decoder/web-codecs/index.d.ts +22 -0
  41. package/esm/decoder/web-codecs/index.d.ts.map +1 -0
  42. package/esm/decoder/web-codecs/index.js +75 -0
  43. package/esm/decoder/web-codecs/index.js.map +1 -0
  44. package/esm/index.d.ts +9 -0
  45. package/esm/index.d.ts.map +1 -0
  46. package/esm/index.js +9 -0
  47. package/esm/index.js.map +1 -0
  48. package/esm/message.d.ts +93 -0
  49. package/esm/message.d.ts.map +1 -0
  50. package/esm/message.js +92 -0
  51. package/esm/message.js.map +1 -0
  52. package/esm/options/1_16/index.d.ts +107 -0
  53. package/esm/options/1_16/index.d.ts.map +1 -0
  54. package/esm/options/1_16/index.js +211 -0
  55. package/esm/options/1_16/index.js.map +1 -0
  56. package/esm/options/1_16/sps.d.ts +22 -0
  57. package/esm/options/1_16/sps.d.ts.map +1 -0
  58. package/esm/options/1_16/sps.js +254 -0
  59. package/esm/options/1_16/sps.js.map +1 -0
  60. package/esm/options/1_18.d.ts +19 -0
  61. package/esm/options/1_18.d.ts.map +1 -0
  62. package/esm/options/1_18.js +23 -0
  63. package/esm/options/1_18.js.map +1 -0
  64. package/esm/options/1_21.d.ts +10 -0
  65. package/esm/options/1_21.d.ts.map +1 -0
  66. package/esm/options/1_21.js +23 -0
  67. package/esm/options/1_21.js.map +1 -0
  68. package/esm/options/1_22.d.ts +43 -0
  69. package/esm/options/1_22.d.ts.map +1 -0
  70. package/esm/options/1_22.js +40 -0
  71. package/esm/options/1_22.js.map +1 -0
  72. package/esm/options/common.d.ts +30 -0
  73. package/esm/options/common.d.ts.map +1 -0
  74. package/esm/options/common.js +16 -0
  75. package/esm/options/common.js.map +1 -0
  76. package/esm/options/index.d.ts +6 -0
  77. package/esm/options/index.d.ts.map +1 -0
  78. package/esm/options/index.js +6 -0
  79. package/esm/options/index.js.map +1 -0
  80. package/esm/push-server.d.ts +6 -0
  81. package/esm/push-server.d.ts.map +1 -0
  82. package/esm/push-server.js +23 -0
  83. package/esm/push-server.js.map +1 -0
  84. package/esm/utils.d.ts +4 -0
  85. package/esm/utils.d.ts.map +1 -0
  86. package/esm/utils.js +14 -0
  87. package/esm/utils.js.map +1 -0
  88. package/package.json +61 -0
  89. package/scrcpy.LICENSE +203 -0
  90. package/scripts/fetch-server.cjs +28 -0
  91. package/src/client.ts +275 -0
  92. package/src/codec.ts +35 -0
  93. package/src/connection.ts +123 -0
  94. package/src/decoder/index.ts +3 -0
  95. package/src/decoder/tinyh264/index.ts +112 -0
  96. package/src/decoder/tinyh264/types.d.ts +137 -0
  97. package/src/decoder/tinyh264/worker.ts +2 -0
  98. package/src/decoder/tinyh264/wrapper.ts +89 -0
  99. package/src/decoder/types.ts +35 -0
  100. package/src/decoder/web-codecs/index.ts +98 -0
  101. package/src/index.ts +8 -0
  102. package/src/message.ts +105 -0
  103. package/src/options/1_16/index.ts +322 -0
  104. package/src/options/1_16/sps.ts +300 -0
  105. package/src/options/1_18.ts +41 -0
  106. package/src/options/1_21.ts +34 -0
  107. package/src/options/1_22.ts +80 -0
  108. package/src/options/common.ts +61 -0
  109. package/src/options/index.ts +5 -0
  110. package/src/push-server.ts +26 -0
  111. 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,4 @@
1
+ export * from './types.js';
2
+ export * from './tinyh264/index.js';
3
+ export * from './web-codecs/index.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ export * from './types.js';
2
+ export * from './tinyh264/index.js';
3
+ export * from './web-codecs/index.js';
4
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/decoder/tinyh264/worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { init } from 'tinyh264';
2
+ init();
3
+ //# sourceMappingURL=worker.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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":"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"}
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
@@ -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"}
@@ -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"}