@yume-chan/scrcpy 0.0.19 → 0.0.21
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 +30 -0
- package/CHANGELOG.md +17 -1
- package/README.md +76 -266
- package/esm/codec/av1.js +2 -2
- package/esm/codec/av1.js.map +1 -1
- package/esm/codec/h264.d.ts +1 -21
- package/esm/codec/h264.d.ts.map +1 -1
- package/esm/codec/h264.js +15 -236
- package/esm/codec/h264.js.map +1 -1
- package/esm/codec/h265.d.ts +454 -0
- package/esm/codec/h265.d.ts.map +1 -1
- package/esm/codec/h265.js +1062 -2
- package/esm/codec/h265.js.map +1 -1
- package/esm/codec/index.d.ts +1 -0
- package/esm/codec/index.d.ts.map +1 -1
- package/esm/codec/index.js +1 -0
- package/esm/codec/index.js.map +1 -1
- package/esm/codec/nalu.d.ts +37 -0
- package/esm/codec/nalu.d.ts.map +1 -0
- package/esm/codec/nalu.js +323 -0
- package/esm/codec/nalu.js.map +1 -0
- package/esm/control/back-or-screen-on.d.ts +1 -1
- package/esm/control/back-or-screen-on.d.ts.map +1 -1
- package/esm/control/hover-helper.d.ts +1 -1
- package/esm/control/hover-helper.d.ts.map +1 -1
- package/esm/control/hover-helper.js +8 -9
- package/esm/control/hover-helper.js.map +1 -1
- package/esm/control/index.d.ts +2 -0
- package/esm/control/index.d.ts.map +1 -1
- package/esm/control/index.js +2 -0
- package/esm/control/index.js.map +1 -1
- package/esm/control/inject-keycode.d.ts +1 -2
- package/esm/control/inject-keycode.d.ts.map +1 -1
- package/esm/control/inject-keycode.js +4 -5
- package/esm/control/inject-keycode.js.map +1 -1
- package/esm/control/inject-text.d.ts +1 -2
- package/esm/control/inject-text.d.ts.map +1 -1
- package/esm/control/inject-text.js +1 -2
- package/esm/control/inject-text.js.map +1 -1
- package/esm/control/inject-touch.d.ts +15 -20
- package/esm/control/inject-touch.d.ts.map +1 -1
- package/esm/control/inject-touch.js +16 -43
- package/esm/control/inject-touch.js.map +1 -1
- package/esm/control/rotate-device.d.ts +2 -4
- package/esm/control/rotate-device.d.ts.map +1 -1
- package/esm/control/rotate-device.js +2 -3
- package/esm/control/rotate-device.js.map +1 -1
- package/esm/control/serializer.d.ts +11 -23
- package/esm/control/serializer.d.ts.map +1 -1
- package/esm/control/serializer.js +23 -52
- package/esm/control/serializer.js.map +1 -1
- package/esm/control/set-screen-power-mode.d.ts +1 -2
- package/esm/control/set-screen-power-mode.d.ts.map +1 -1
- package/esm/control/set-screen-power-mode.js +2 -3
- package/esm/control/set-screen-power-mode.js.map +1 -1
- package/esm/control/type.d.ts +14 -0
- package/esm/control/type.d.ts.map +1 -1
- package/esm/control/type.js +23 -1
- package/esm/control/type.js.map +1 -1
- package/esm/control/writer.d.ts +26 -0
- package/esm/control/writer.d.ts.map +1 -0
- package/esm/control/writer.js +53 -0
- package/esm/control/writer.js.map +1 -0
- package/esm/device-message/stream.d.ts.map +1 -1
- package/esm/device-message/stream.js +23 -8
- package/esm/device-message/stream.js.map +1 -1
- package/esm/device-message/type.js +1 -1
- package/esm/device-message/type.js.map +1 -1
- package/esm/index.d.ts +1 -2
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -2
- package/esm/index.js.map +1 -1
- package/esm/options/1_16/codec-options.d.ts +2 -3
- package/esm/options/1_16/codec-options.d.ts.map +1 -1
- package/esm/options/1_16/codec-options.js.map +1 -1
- package/esm/options/1_16/index.d.ts +3 -1
- package/esm/options/1_16/index.d.ts.map +1 -1
- package/esm/options/1_16/index.js +3 -1
- package/esm/options/1_16/index.js.map +1 -1
- package/esm/options/1_16/init.js +2 -2
- package/esm/options/1_16/init.js.map +1 -1
- package/esm/options/1_16/options.d.ts +42 -96
- package/esm/options/1_16/options.d.ts.map +1 -1
- package/esm/options/1_16/options.js +104 -142
- package/esm/options/1_16/options.js.map +1 -1
- package/esm/options/1_16/scroll.d.ts +2 -4
- package/esm/options/1_16/scroll.d.ts.map +1 -1
- package/esm/options/1_16/scroll.js +13 -14
- package/esm/options/1_16/scroll.js.map +1 -1
- package/esm/options/1_17.d.ts +1 -0
- package/esm/options/1_17.d.ts.map +1 -1
- package/esm/options/1_17.js +8 -3
- package/esm/options/1_17.js.map +1 -1
- package/esm/options/1_18.d.ts +49 -11
- package/esm/options/1_18.d.ts.map +1 -1
- package/esm/options/1_18.js +64 -32
- package/esm/options/1_18.js.map +1 -1
- package/esm/options/1_21.d.ts +26 -7
- package/esm/options/1_21.d.ts.map +1 -1
- package/esm/options/1_21.js +34 -20
- package/esm/options/1_21.js.map +1 -1
- package/esm/options/1_22/index.d.ts +1 -0
- package/esm/options/1_22/index.d.ts.map +1 -1
- package/esm/options/1_22/index.js +1 -0
- package/esm/options/1_22/index.js.map +1 -1
- package/esm/options/1_22/options.d.ts +32 -26
- package/esm/options/1_22/options.d.ts.map +1 -1
- package/esm/options/1_22/options.js +26 -16
- package/esm/options/1_22/options.js.map +1 -1
- package/esm/options/1_22/scroll.d.ts +1 -1
- package/esm/options/1_22/scroll.d.ts.map +1 -1
- package/esm/options/1_22/scroll.js +1 -1
- package/esm/options/1_22/scroll.js.map +1 -1
- package/esm/options/1_23.d.ts +32 -8
- package/esm/options/1_23.d.ts.map +1 -1
- package/esm/options/1_23.js +23 -14
- package/esm/options/1_23.js.map +1 -1
- package/esm/options/1_24.d.ts +29 -4
- package/esm/options/1_24.d.ts.map +1 -1
- package/esm/options/1_24.js +16 -7
- package/esm/options/1_24.js.map +1 -1
- package/esm/options/1_25/options.d.ts +6 -2
- package/esm/options/1_25/options.d.ts.map +1 -1
- package/esm/options/1_25/options.js +16 -2
- package/esm/options/1_25/options.js.map +1 -1
- package/esm/options/1_25/scroll.d.ts.map +1 -1
- package/esm/options/1_25/scroll.js +2 -1
- package/esm/options/1_25/scroll.js.map +1 -1
- package/esm/options/2_0.d.ts +12 -8
- package/esm/options/2_0.d.ts.map +1 -1
- package/esm/options/2_0.js +82 -15
- package/esm/options/2_0.js.map +1 -1
- package/esm/options/2_1.d.ts +48 -0
- package/esm/options/2_1.d.ts.map +1 -0
- package/esm/options/2_1.js +23 -0
- package/esm/options/2_1.js.map +1 -0
- package/esm/options/codec.d.ts +4 -4
- package/esm/options/codec.d.ts.map +1 -1
- package/esm/options/codec.js +5 -6
- package/esm/options/codec.js.map +1 -1
- package/esm/options/index.d.ts +5 -0
- package/esm/options/index.d.ts.map +1 -1
- package/esm/options/index.js +5 -0
- package/esm/options/index.js.map +1 -1
- package/esm/options/latest.d.ts +4 -5
- package/esm/options/latest.d.ts.map +1 -1
- package/esm/options/latest.js +2 -3
- package/esm/options/latest.js.map +1 -1
- package/esm/options/types.d.ts +74 -33
- package/esm/options/types.d.ts.map +1 -1
- package/esm/options/types.js +62 -0
- package/esm/options/types.js.map +1 -1
- package/package.json +9 -19
- package/src/codec/av1.ts +33 -0
- package/src/codec/h264.ts +317 -0
- package/src/codec/h265.ts +1375 -0
- package/src/codec/index.ts +4 -0
- package/src/codec/nalu.ts +391 -0
- package/src/control/back-or-screen-on.ts +1 -1
- package/{esm/control/simple.js → src/control/basic.ts} +3 -3
- package/src/control/hover-helper.ts +10 -11
- package/src/control/index.ts +2 -0
- package/src/control/inject-keycode.ts +1 -3
- package/src/control/inject-text.ts +1 -3
- package/src/control/inject-touch.ts +16 -55
- package/src/control/rotate-device.ts +2 -7
- package/src/control/serializer.ts +50 -113
- package/src/control/set-screen-power-mode.ts +1 -3
- package/src/control/type.ts +32 -0
- package/src/control/writer.ts +85 -0
- package/src/device-message/stream.ts +32 -12
- package/src/index.ts +1 -2
- package/src/options/1_16/codec-options.ts +6 -7
- package/src/options/1_16/float-to-uint16.ts +33 -0
- package/src/options/1_16/index.ts +3 -1
- package/src/options/1_16/init.ts +80 -0
- package/src/options/1_16/message.ts +55 -0
- package/src/options/1_16/options.ts +147 -260
- package/src/options/1_16/scroll.ts +17 -18
- package/src/options/1_17.ts +66 -0
- package/src/options/1_18.ts +103 -39
- package/src/options/1_21.ts +49 -27
- package/src/options/1_22/index.ts +1 -0
- package/src/options/1_22/init.ts +19 -0
- package/src/options/1_22/options.ts +38 -45
- package/src/options/1_22/scroll.ts +3 -3
- package/src/options/1_23.ts +34 -22
- package/src/options/1_24.ts +23 -11
- package/src/options/1_25/options.ts +22 -4
- package/src/options/1_25/scroll.ts +4 -3
- package/src/options/2_0.ts +342 -0
- package/src/options/2_1.ts +35 -0
- package/src/options/codec.ts +98 -0
- package/src/options/index.ts +5 -0
- package/src/options/latest.ts +12 -0
- package/src/options/types.ts +164 -43
- package/tsconfig.build.json +9 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/bin/scrcpy-server +0 -0
- package/bin/version.d.ts +0 -1
- package/bin/version.js +0 -1
- package/esm/adb/client.d.ts +0 -41
- package/esm/adb/client.d.ts.map +0 -1
- package/esm/adb/client.js +0 -224
- package/esm/adb/client.js.map +0 -1
- package/esm/adb/connection.d.ts +0 -49
- package/esm/adb/connection.d.ts.map +0 -1
- package/esm/adb/connection.js +0 -122
- package/esm/adb/connection.js.map +0 -1
- package/esm/adb/index.d.ts +0 -4
- package/esm/adb/index.d.ts.map +0 -1
- package/esm/adb/index.js +0 -4
- package/esm/adb/index.js.map +0 -1
- package/esm/adb/options/1_16.d.ts +0 -8
- package/esm/adb/options/1_16.d.ts.map +0 -1
- package/esm/adb/options/1_16.js +0 -20
- package/esm/adb/options/1_16.js.map +0 -1
- package/esm/adb/options/1_22.d.ts +0 -8
- package/esm/adb/options/1_22.d.ts.map +0 -1
- package/esm/adb/options/1_22.js +0 -17
- package/esm/adb/options/1_22.js.map +0 -1
- package/esm/adb/options/1_26.d.ts +0 -9
- package/esm/adb/options/1_26.d.ts.map +0 -1
- package/esm/adb/options/1_26.js +0 -11
- package/esm/adb/options/1_26.js.map +0 -1
- package/esm/adb/options/2_0.d.ts +0 -8
- package/esm/adb/options/2_0.d.ts.map +0 -1
- package/esm/adb/options/2_0.js +0 -13
- package/esm/adb/options/2_0.js.map +0 -1
- package/esm/adb/options/index.d.ts +0 -4
- package/esm/adb/options/index.d.ts.map +0 -1
- package/esm/adb/options/index.js +0 -4
- package/esm/adb/options/index.js.map +0 -1
- package/esm/adb/options/types.d.ts +0 -24
- package/esm/adb/options/types.d.ts.map +0 -1
- package/esm/adb/options/types.js +0 -37
- package/esm/adb/options/types.js.map +0 -1
- package/esm/codec.d.ts +0 -34
- package/esm/codec.d.ts.map +0 -1
- package/esm/codec.js +0 -37
- package/esm/codec.js.map +0 -1
- package/esm/control/simple.d.ts +0 -5
- package/esm/control/simple.d.ts.map +0 -1
- package/esm/control/simple.js.map +0 -1
- package/esm/decoder.d.ts +0 -2
- package/esm/decoder.d.ts.map +0 -1
- package/esm/decoder.js +0 -2
- package/esm/decoder.js.map +0 -1
- package/esm/options/1.17.d.ts +0 -3
- package/esm/options/1.17.d.ts.map +0 -1
- package/esm/options/1.17.js +0 -2
- package/esm/options/1.17.js.map +0 -1
- package/esm/options/1_16/h264-configuration.d.ts +0 -49
- package/esm/options/1_16/h264-configuration.d.ts.map +0 -1
- package/esm/options/1_16/h264-configuration.js +0 -414
- package/esm/options/1_16/h264-configuration.js.map +0 -1
- package/esm/options/1_16/sps.d.ts +0 -22
- package/esm/options/1_16/sps.d.ts.map +0 -1
- package/esm/options/1_16/sps.js +0 -263
- package/esm/options/1_16/sps.js.map +0 -1
- package/esm/options/1_26.d.ts +0 -57
- package/esm/options/1_26.d.ts.map +0 -1
- package/esm/options/1_26.js +0 -67
- package/esm/options/1_26.js.map +0 -1
- package/esm/options/2.d.ts +0 -57
- package/esm/options/2.d.ts.map +0 -1
- package/esm/options/2.js +0 -67
- package/esm/options/2.js.map +0 -1
- package/scripts/fetch-server.cjs +0 -38
- package/src/adb/client.ts +0 -329
- package/src/adb/connection.ts +0 -209
- package/src/adb/index.ts +0 -3
- package/src/adb/options/1_16.ts +0 -32
- package/src/adb/options/1_22.ts +0 -26
- package/src/adb/options/index.ts +0 -3
- package/src/adb/options/types.ts +0 -75
- package/src/codec.ts +0 -35
- package/src/options/1_16/h264-configuration.ts +0 -485
|
@@ -1,329 +1,216 @@
|
|
|
1
|
+
import type { ReadableStream } from "@yume-chan/stream-extra";
|
|
1
2
|
import {
|
|
3
|
+
BufferedReadableStream,
|
|
2
4
|
StructDeserializeStream,
|
|
3
5
|
TransformStream,
|
|
4
6
|
} from "@yume-chan/stream-extra";
|
|
5
|
-
import
|
|
7
|
+
import type { AsyncExactReadable, ValueOrPromise } from "@yume-chan/struct";
|
|
8
|
+
import { NumberFieldType, decodeUtf8 } from "@yume-chan/struct";
|
|
6
9
|
|
|
7
10
|
import type {
|
|
8
11
|
ScrcpyBackOrScreenOnControlMessage,
|
|
9
|
-
ScrcpySetClipboardControlMessage,
|
|
10
|
-
} from "../../control/index.js";
|
|
11
|
-
import {
|
|
12
|
-
AndroidKeyEventAction,
|
|
13
12
|
ScrcpyControlMessageType,
|
|
13
|
+
ScrcpyInjectTouchControlMessage,
|
|
14
|
+
ScrcpySetClipboardControlMessage,
|
|
14
15
|
} from "../../control/index.js";
|
|
15
|
-
import
|
|
16
|
+
import { AndroidKeyEventAction } from "../../control/index.js";
|
|
17
|
+
import type {
|
|
18
|
+
ScrcpyMediaStreamPacket,
|
|
19
|
+
ScrcpyVideoStream,
|
|
20
|
+
ScrcpyVideoStreamMetadata,
|
|
21
|
+
} from "../codec.js";
|
|
22
|
+
import { ScrcpyVideoCodecId } from "../codec.js";
|
|
23
|
+
import type { ScrcpyDisplay, ScrcpyEncoder, ScrcpyOptions } from "../types.js";
|
|
16
24
|
import { toScrcpyOptionValue } from "../types.js";
|
|
17
25
|
|
|
18
26
|
import { CodecOptions } from "./codec-options.js";
|
|
27
|
+
import type { ScrcpyOptionsInit1_16 } from "./init.js";
|
|
28
|
+
import { ScrcpyLogLevel1_16, ScrcpyVideoOrientation1_16 } from "./init.js";
|
|
19
29
|
import {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
30
|
+
SCRCPY_CONTROL_MESSAGE_TYPES_1_16,
|
|
31
|
+
SCRCPY_MEDIA_PACKET_FLAG_CONFIG,
|
|
32
|
+
ScrcpyBackOrScreenOnControlMessage1_16,
|
|
33
|
+
ScrcpyInjectTouchControlMessage1_16,
|
|
34
|
+
ScrcpyMediaStreamRawPacket,
|
|
35
|
+
ScrcpySetClipboardControlMessage1_15,
|
|
36
|
+
} from "./message.js";
|
|
24
37
|
import type { ScrcpyScrollController } from "./scroll.js";
|
|
25
38
|
import { ScrcpyScrollController1_16 } from "./scroll.js";
|
|
26
39
|
|
|
27
|
-
export
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
*
|
|
64
|
-
* It will not keep the device screen in specific orientation,
|
|
65
|
-
* only the captured video will in this orientation.
|
|
66
|
-
*/
|
|
67
|
-
lockVideoOrientation: ScrcpyVideoOrientation;
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Use ADB forward tunnel instead of reverse tunnel.
|
|
71
|
-
*
|
|
72
|
-
* This option is mainly used for working around the bug that on Android <9,
|
|
73
|
-
* ADB daemon can't create reverse tunnels if connected wirelessly (ADB over WiFi).
|
|
74
|
-
*
|
|
75
|
-
* When using `AdbScrcpyClient`, it can detect this situation and enable this option automatically.
|
|
76
|
-
*/
|
|
77
|
-
tunnelForward: boolean;
|
|
78
|
-
|
|
79
|
-
crop: string;
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Send PTS so that the client may record properly
|
|
83
|
-
*
|
|
84
|
-
* Note: When `sendFrameMeta: false` is specified,
|
|
85
|
-
* `onChangeEncoding` event won't fire and `onVideoData` event doesn't
|
|
86
|
-
* merge sps/pps frame and first video frame. Which means you can't use
|
|
87
|
-
* the shipped decoders to render the video
|
|
88
|
-
* (You can still record the stream into a file).
|
|
89
|
-
*
|
|
90
|
-
* @default true
|
|
91
|
-
*/
|
|
92
|
-
sendFrameMeta: boolean;
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* @default true
|
|
96
|
-
*/
|
|
97
|
-
control: boolean;
|
|
98
|
-
|
|
99
|
-
displayId: number;
|
|
100
|
-
|
|
101
|
-
showTouches: boolean;
|
|
102
|
-
|
|
103
|
-
stayAwake: boolean;
|
|
104
|
-
|
|
105
|
-
codecOptions: CodecOptions;
|
|
40
|
+
export class ScrcpyOptions1_16 implements ScrcpyOptions<ScrcpyOptionsInit1_16> {
|
|
41
|
+
static readonly DEFAULTS = {
|
|
42
|
+
logLevel: ScrcpyLogLevel1_16.Debug,
|
|
43
|
+
maxSize: 0,
|
|
44
|
+
bitRate: 8_000_000,
|
|
45
|
+
maxFps: 0,
|
|
46
|
+
lockVideoOrientation: ScrcpyVideoOrientation1_16.Unlocked,
|
|
47
|
+
tunnelForward: false,
|
|
48
|
+
crop: undefined,
|
|
49
|
+
sendFrameMeta: true,
|
|
50
|
+
control: true,
|
|
51
|
+
displayId: 0,
|
|
52
|
+
showTouches: false,
|
|
53
|
+
stayAwake: false,
|
|
54
|
+
codecOptions: new CodecOptions(),
|
|
55
|
+
} as const satisfies Required<ScrcpyOptionsInit1_16>;
|
|
56
|
+
|
|
57
|
+
static readonly SERIALIZE_ORDER = [
|
|
58
|
+
"logLevel",
|
|
59
|
+
"maxSize",
|
|
60
|
+
"bitRate",
|
|
61
|
+
"maxFps",
|
|
62
|
+
"lockVideoOrientation",
|
|
63
|
+
"tunnelForward",
|
|
64
|
+
"crop",
|
|
65
|
+
"sendFrameMeta",
|
|
66
|
+
"control",
|
|
67
|
+
"displayId",
|
|
68
|
+
"showTouches",
|
|
69
|
+
"stayAwake",
|
|
70
|
+
"codecOptions",
|
|
71
|
+
] as const satisfies readonly (keyof ScrcpyOptionsInit1_16)[];
|
|
72
|
+
|
|
73
|
+
static serialize<T>(options: T, order: readonly (keyof T)[]) {
|
|
74
|
+
return order.map((key) => toScrcpyOptionValue(options[key], "-"));
|
|
75
|
+
}
|
|
106
76
|
|
|
107
|
-
|
|
108
|
-
|
|
77
|
+
static async parseCString(
|
|
78
|
+
stream: AsyncExactReadable,
|
|
79
|
+
maxLength: number,
|
|
80
|
+
): Promise<string> {
|
|
81
|
+
let result = decodeUtf8(await stream.readExactly(maxLength));
|
|
82
|
+
result = result.substring(0, result.indexOf("\0"));
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
109
85
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
86
|
+
static async parseUint16BE(stream: AsyncExactReadable): Promise<number> {
|
|
87
|
+
const buffer = await stream.readExactly(NumberFieldType.Uint16.size);
|
|
88
|
+
return NumberFieldType.Uint16.deserialize(buffer, false);
|
|
89
|
+
}
|
|
114
90
|
|
|
115
|
-
|
|
91
|
+
static async parseUint32BE(stream: AsyncExactReadable): Promise<number> {
|
|
92
|
+
const buffer = await stream.readExactly(NumberFieldType.Uint32.size);
|
|
93
|
+
return NumberFieldType.Uint32.deserialize(buffer, false);
|
|
94
|
+
}
|
|
116
95
|
|
|
117
|
-
|
|
118
|
-
"type",
|
|
119
|
-
ScrcpyControlMessageType.BackOrScreenOn as const
|
|
120
|
-
);
|
|
96
|
+
value: Required<ScrcpyOptionsInit1_16>;
|
|
121
97
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
.uint32("length")
|
|
125
|
-
.string("content", { lengthField: "length" });
|
|
98
|
+
readonly defaults: Required<ScrcpyOptionsInit1_16> =
|
|
99
|
+
ScrcpyOptions1_16.DEFAULTS;
|
|
126
100
|
|
|
127
|
-
|
|
128
|
-
|
|
101
|
+
readonly controlMessageTypes: readonly ScrcpyControlMessageType[] =
|
|
102
|
+
SCRCPY_CONTROL_MESSAGE_TYPES_1_16;
|
|
129
103
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
{
|
|
134
|
-
public value: Partial<T>;
|
|
104
|
+
constructor(init: ScrcpyOptionsInit1_16) {
|
|
105
|
+
this.value = { ...ScrcpyOptions1_16.DEFAULTS, ...init };
|
|
106
|
+
}
|
|
135
107
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
)
|
|
141
|
-
|
|
142
|
-
}
|
|
108
|
+
serialize(): string[] {
|
|
109
|
+
return ScrcpyOptions1_16.serialize(
|
|
110
|
+
this.value,
|
|
111
|
+
ScrcpyOptions1_16.SERIALIZE_ORDER,
|
|
112
|
+
);
|
|
113
|
+
}
|
|
143
114
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
) {
|
|
148
|
-
value.lockVideoOrientation = ScrcpyVideoOrientation.Unlocked;
|
|
149
|
-
}
|
|
115
|
+
setListEncoders(): void {
|
|
116
|
+
throw new Error("Not supported");
|
|
117
|
+
}
|
|
150
118
|
|
|
151
|
-
|
|
119
|
+
setListDisplays(): void {
|
|
120
|
+
// Set to an invalid value
|
|
121
|
+
// Server will print valid values before crashing
|
|
122
|
+
// (server will crash before opening sockets)
|
|
123
|
+
this.value.displayId = -1;
|
|
152
124
|
}
|
|
153
125
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
"logLevel",
|
|
157
|
-
"maxSize",
|
|
158
|
-
"bitRate",
|
|
159
|
-
"maxFps",
|
|
160
|
-
"lockVideoOrientation",
|
|
161
|
-
"tunnelForward",
|
|
162
|
-
"crop",
|
|
163
|
-
"sendFrameMeta",
|
|
164
|
-
"control",
|
|
165
|
-
"displayId",
|
|
166
|
-
"showTouches",
|
|
167
|
-
"stayAwake",
|
|
168
|
-
"codecOptions",
|
|
169
|
-
"encoderName",
|
|
170
|
-
];
|
|
126
|
+
parseEncoder(): ScrcpyEncoder | undefined {
|
|
127
|
+
throw new Error("Not supported");
|
|
171
128
|
}
|
|
172
129
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
sendFrameMeta: true,
|
|
183
|
-
control: true,
|
|
184
|
-
displayId: 0,
|
|
185
|
-
showTouches: false,
|
|
186
|
-
stayAwake: false,
|
|
187
|
-
codecOptions: new CodecOptions({}),
|
|
188
|
-
encoderName: "-",
|
|
189
|
-
} as T;
|
|
130
|
+
parseDisplay(line: string): ScrcpyDisplay | undefined {
|
|
131
|
+
const displayIdRegex = /\s+scrcpy --display (\d+)/;
|
|
132
|
+
const match = line.match(displayIdRegex);
|
|
133
|
+
if (match) {
|
|
134
|
+
return {
|
|
135
|
+
id: Number.parseInt(match[1]!, 10),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return undefined;
|
|
190
139
|
}
|
|
191
140
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
141
|
+
parseVideoStreamMetadata(
|
|
142
|
+
stream: ReadableStream<Uint8Array>,
|
|
143
|
+
): ValueOrPromise<ScrcpyVideoStream> {
|
|
144
|
+
return (async () => {
|
|
145
|
+
const buffered = new BufferedReadableStream(stream);
|
|
146
|
+
const metadata: ScrcpyVideoStreamMetadata = {
|
|
147
|
+
codec: ScrcpyVideoCodecId.H264,
|
|
148
|
+
};
|
|
149
|
+
metadata.deviceName = await ScrcpyOptions1_16.parseCString(
|
|
150
|
+
buffered,
|
|
151
|
+
64,
|
|
152
|
+
);
|
|
153
|
+
metadata.width = await ScrcpyOptions1_16.parseUint16BE(buffered);
|
|
154
|
+
metadata.height = await ScrcpyOptions1_16.parseUint16BE(buffered);
|
|
155
|
+
return { stream: buffered.release(), metadata };
|
|
156
|
+
})();
|
|
197
157
|
}
|
|
198
158
|
|
|
199
|
-
|
|
200
|
-
|
|
159
|
+
parseAudioStreamMetadata(): never {
|
|
160
|
+
throw new Error("Not supported");
|
|
201
161
|
}
|
|
202
162
|
|
|
203
|
-
|
|
163
|
+
createMediaStreamTransformer(): TransformStream<
|
|
204
164
|
Uint8Array,
|
|
205
|
-
|
|
165
|
+
ScrcpyMediaStreamPacket
|
|
206
166
|
> {
|
|
207
167
|
// Optimized path for video frames only
|
|
208
|
-
if (this.value.sendFrameMeta
|
|
168
|
+
if (!this.value.sendFrameMeta) {
|
|
209
169
|
return new TransformStream({
|
|
210
170
|
transform(chunk, controller) {
|
|
211
171
|
controller.enqueue({
|
|
212
|
-
type: "
|
|
172
|
+
type: "data",
|
|
213
173
|
data: chunk,
|
|
214
174
|
});
|
|
215
175
|
},
|
|
216
176
|
});
|
|
217
177
|
}
|
|
218
178
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
179
|
+
const deserializeStream = new StructDeserializeStream(
|
|
180
|
+
ScrcpyMediaStreamRawPacket,
|
|
181
|
+
);
|
|
222
182
|
return {
|
|
223
183
|
writable: deserializeStream.writable,
|
|
224
184
|
readable: deserializeStream.readable.pipeThrough(
|
|
225
185
|
new TransformStream({
|
|
226
186
|
transform(packet, controller) {
|
|
227
|
-
if (packet.pts ===
|
|
228
|
-
const {
|
|
229
|
-
sequenceParameterSet,
|
|
230
|
-
pictureParameterSet,
|
|
231
|
-
} = parseH264Configuration(packet.data);
|
|
232
|
-
|
|
233
|
-
const {
|
|
234
|
-
profile_idc: profileIndex,
|
|
235
|
-
constraint_set: constraintSet,
|
|
236
|
-
level_idc: levelIndex,
|
|
237
|
-
pic_width_in_mbs_minus1,
|
|
238
|
-
pic_height_in_map_units_minus1,
|
|
239
|
-
frame_mbs_only_flag,
|
|
240
|
-
frame_crop_left_offset,
|
|
241
|
-
frame_crop_right_offset,
|
|
242
|
-
frame_crop_top_offset,
|
|
243
|
-
frame_crop_bottom_offset,
|
|
244
|
-
} = parseSequenceParameterSet(
|
|
245
|
-
removeH264Emulation(sequenceParameterSet)
|
|
246
|
-
);
|
|
247
|
-
|
|
248
|
-
const encodedWidth =
|
|
249
|
-
(pic_width_in_mbs_minus1 + 1) * 16;
|
|
250
|
-
const encodedHeight =
|
|
251
|
-
(pic_height_in_map_units_minus1 + 1) *
|
|
252
|
-
(2 - frame_mbs_only_flag) *
|
|
253
|
-
16;
|
|
254
|
-
const cropLeft = frame_crop_left_offset * 2;
|
|
255
|
-
const cropRight = frame_crop_right_offset * 2;
|
|
256
|
-
const cropTop = frame_crop_top_offset * 2;
|
|
257
|
-
const cropBottom = frame_crop_bottom_offset * 2;
|
|
258
|
-
|
|
259
|
-
const croppedWidth =
|
|
260
|
-
encodedWidth - cropLeft - cropRight;
|
|
261
|
-
const croppedHeight =
|
|
262
|
-
encodedHeight - cropTop - cropBottom;
|
|
263
|
-
|
|
264
|
-
header = packet.data;
|
|
187
|
+
if (packet.pts === SCRCPY_MEDIA_PACKET_FLAG_CONFIG) {
|
|
265
188
|
controller.enqueue({
|
|
266
189
|
type: "configuration",
|
|
267
|
-
|
|
268
|
-
sequenceParameterSet,
|
|
269
|
-
data: {
|
|
270
|
-
profileIndex,
|
|
271
|
-
constraintSet,
|
|
272
|
-
levelIndex,
|
|
273
|
-
encodedWidth,
|
|
274
|
-
encodedHeight,
|
|
275
|
-
cropLeft,
|
|
276
|
-
cropRight,
|
|
277
|
-
cropTop,
|
|
278
|
-
cropBottom,
|
|
279
|
-
croppedWidth,
|
|
280
|
-
croppedHeight,
|
|
281
|
-
},
|
|
190
|
+
data: packet.data,
|
|
282
191
|
});
|
|
283
192
|
return;
|
|
284
193
|
}
|
|
285
194
|
|
|
286
|
-
let frameData: Uint8Array;
|
|
287
|
-
if (header) {
|
|
288
|
-
frameData = new Uint8Array(
|
|
289
|
-
header.byteLength + packet.data.byteLength
|
|
290
|
-
);
|
|
291
|
-
frameData.set(header);
|
|
292
|
-
frameData.set(packet.data, header.byteLength);
|
|
293
|
-
header = undefined;
|
|
294
|
-
} else {
|
|
295
|
-
frameData = packet.data;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
195
|
controller.enqueue({
|
|
299
|
-
type: "
|
|
196
|
+
type: "data",
|
|
300
197
|
pts: packet.pts,
|
|
301
|
-
data:
|
|
198
|
+
data: packet.data,
|
|
302
199
|
});
|
|
303
200
|
},
|
|
304
|
-
})
|
|
201
|
+
}),
|
|
305
202
|
),
|
|
306
203
|
};
|
|
307
204
|
}
|
|
308
205
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
/* 2 */ ScrcpyControlMessageType.InjectTouch,
|
|
314
|
-
/* 3 */ ScrcpyControlMessageType.InjectScroll,
|
|
315
|
-
/* 4 */ ScrcpyControlMessageType.BackOrScreenOn,
|
|
316
|
-
/* 5 */ ScrcpyControlMessageType.ExpandNotificationPanel,
|
|
317
|
-
/* 6 */ ScrcpyControlMessageType.CollapseNotificationPanel,
|
|
318
|
-
/* 7 */ ScrcpyControlMessageType.GetClipboard,
|
|
319
|
-
/* 8 */ ScrcpyControlMessageType.SetClipboard,
|
|
320
|
-
/* 9 */ ScrcpyControlMessageType.SetScreenPowerMode,
|
|
321
|
-
/* 10 */ ScrcpyControlMessageType.RotateDevice,
|
|
322
|
-
];
|
|
206
|
+
serializeInjectTouchControlMessage(
|
|
207
|
+
message: ScrcpyInjectTouchControlMessage,
|
|
208
|
+
): Uint8Array {
|
|
209
|
+
return ScrcpyInjectTouchControlMessage1_16.serialize(message);
|
|
323
210
|
}
|
|
324
211
|
|
|
325
|
-
|
|
326
|
-
message: ScrcpyBackOrScreenOnControlMessage
|
|
212
|
+
serializeBackOrScreenOnControlMessage(
|
|
213
|
+
message: ScrcpyBackOrScreenOnControlMessage,
|
|
327
214
|
) {
|
|
328
215
|
if (message.action === AndroidKeyEventAction.Down) {
|
|
329
216
|
return ScrcpyBackOrScreenOnControlMessage1_16.serialize(message);
|
|
@@ -332,13 +219,13 @@ export class ScrcpyOptions1_16<
|
|
|
332
219
|
return undefined;
|
|
333
220
|
}
|
|
334
221
|
|
|
335
|
-
|
|
336
|
-
message: ScrcpySetClipboardControlMessage
|
|
222
|
+
serializeSetClipboardControlMessage(
|
|
223
|
+
message: ScrcpySetClipboardControlMessage,
|
|
337
224
|
): Uint8Array {
|
|
338
225
|
return ScrcpySetClipboardControlMessage1_15.serialize(message);
|
|
339
226
|
}
|
|
340
227
|
|
|
341
|
-
|
|
228
|
+
createScrollController(): ScrcpyScrollController {
|
|
342
229
|
return new ScrcpyScrollController1_16();
|
|
343
230
|
}
|
|
344
231
|
}
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import Struct from "@yume-chan/struct";
|
|
2
2
|
|
|
3
3
|
import type { ScrcpyInjectScrollControlMessage } from "../../control/index.js";
|
|
4
|
-
import { ScrcpyControlMessageType } from "../../control/index.js";
|
|
5
4
|
|
|
6
5
|
export interface ScrcpyScrollController {
|
|
7
6
|
serializeScrollMessage(
|
|
8
|
-
message: ScrcpyInjectScrollControlMessage
|
|
7
|
+
message: ScrcpyInjectScrollControlMessage,
|
|
9
8
|
): Uint8Array | undefined;
|
|
10
9
|
}
|
|
11
10
|
|
|
12
11
|
export const ScrcpyInjectScrollControlMessage1_16 = new Struct()
|
|
13
|
-
.uint8("type"
|
|
12
|
+
.uint8("type")
|
|
14
13
|
.uint32("pointerX")
|
|
15
14
|
.uint32("pointerY")
|
|
16
15
|
.uint16("screenWidth")
|
|
@@ -25,31 +24,31 @@ export const ScrcpyInjectScrollControlMessage1_16 = new Struct()
|
|
|
25
24
|
* reaches 1 or -1.
|
|
26
25
|
*/
|
|
27
26
|
export class ScrcpyScrollController1_16 implements ScrcpyScrollController {
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
#accumulatedX = 0;
|
|
28
|
+
#accumulatedY = 0;
|
|
30
29
|
|
|
31
30
|
protected processMessage(
|
|
32
|
-
message: ScrcpyInjectScrollControlMessage
|
|
31
|
+
message: ScrcpyInjectScrollControlMessage,
|
|
33
32
|
): ScrcpyInjectScrollControlMessage | undefined {
|
|
34
|
-
this
|
|
35
|
-
this
|
|
33
|
+
this.#accumulatedX += message.scrollX;
|
|
34
|
+
this.#accumulatedY += message.scrollY;
|
|
36
35
|
|
|
37
36
|
let scrollX = 0;
|
|
38
37
|
let scrollY = 0;
|
|
39
|
-
if (this
|
|
38
|
+
if (this.#accumulatedX >= 1) {
|
|
40
39
|
scrollX = 1;
|
|
41
|
-
this
|
|
42
|
-
} else if (this
|
|
40
|
+
this.#accumulatedX = 0;
|
|
41
|
+
} else if (this.#accumulatedX <= -1) {
|
|
43
42
|
scrollX = -1;
|
|
44
|
-
this
|
|
43
|
+
this.#accumulatedX = 0;
|
|
45
44
|
}
|
|
46
45
|
|
|
47
|
-
if (this
|
|
46
|
+
if (this.#accumulatedY >= 1) {
|
|
48
47
|
scrollY = 1;
|
|
49
|
-
this
|
|
50
|
-
} else if (this
|
|
48
|
+
this.#accumulatedY = 0;
|
|
49
|
+
} else if (this.#accumulatedY <= -1) {
|
|
51
50
|
scrollY = -1;
|
|
52
|
-
this
|
|
51
|
+
this.#accumulatedY = 0;
|
|
53
52
|
}
|
|
54
53
|
|
|
55
54
|
if (scrollX === 0 && scrollY === 0) {
|
|
@@ -61,8 +60,8 @@ export class ScrcpyScrollController1_16 implements ScrcpyScrollController {
|
|
|
61
60
|
return message;
|
|
62
61
|
}
|
|
63
62
|
|
|
64
|
-
|
|
65
|
-
message: ScrcpyInjectScrollControlMessage
|
|
63
|
+
serializeScrollMessage(
|
|
64
|
+
message: ScrcpyInjectScrollControlMessage,
|
|
66
65
|
): Uint8Array | undefined {
|
|
67
66
|
const processed = this.processMessage(message);
|
|
68
67
|
if (!processed) {
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { ScrcpyOptionsInit1_16 } from "./1_16/index.js";
|
|
2
|
+
import { ScrcpyOptions1_16 } from "./1_16/index.js";
|
|
3
|
+
import type { ScrcpyEncoder } from "./types.js";
|
|
4
|
+
import { ScrcpyOptionsBase } from "./types.js";
|
|
5
|
+
|
|
6
|
+
export interface ScrcpyOptionsInit1_17 extends ScrcpyOptionsInit1_16 {
|
|
7
|
+
encoderName?: string | undefined;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export class ScrcpyOptions1_17 extends ScrcpyOptionsBase<
|
|
11
|
+
ScrcpyOptionsInit1_17,
|
|
12
|
+
ScrcpyOptions1_16
|
|
13
|
+
> {
|
|
14
|
+
static readonly DEFAULTS = {
|
|
15
|
+
...ScrcpyOptions1_16.DEFAULTS,
|
|
16
|
+
encoderName: undefined,
|
|
17
|
+
} as const satisfies Required<ScrcpyOptionsInit1_17>;
|
|
18
|
+
|
|
19
|
+
static readonly SERIALIZE_ORDER = [
|
|
20
|
+
...ScrcpyOptions1_16.SERIALIZE_ORDER,
|
|
21
|
+
"encoderName",
|
|
22
|
+
] as const satisfies readonly (keyof ScrcpyOptionsInit1_17)[];
|
|
23
|
+
|
|
24
|
+
static parseEncoder(
|
|
25
|
+
line: string,
|
|
26
|
+
encoderNameRegex: RegExp,
|
|
27
|
+
): ScrcpyEncoder | undefined {
|
|
28
|
+
const match = line.match(encoderNameRegex);
|
|
29
|
+
if (match) {
|
|
30
|
+
return { type: "video", name: match[1]! };
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
override get defaults(): Required<ScrcpyOptionsInit1_17> {
|
|
36
|
+
return ScrcpyOptions1_17.DEFAULTS;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
constructor(init: ScrcpyOptionsInit1_17) {
|
|
40
|
+
super(new ScrcpyOptions1_16(init), {
|
|
41
|
+
...ScrcpyOptions1_17.DEFAULTS,
|
|
42
|
+
...init,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
override serialize(): string[] {
|
|
47
|
+
return ScrcpyOptions1_16.serialize(
|
|
48
|
+
this.value,
|
|
49
|
+
ScrcpyOptions1_17.SERIALIZE_ORDER,
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
override setListEncoders() {
|
|
54
|
+
// Set to an invalid value
|
|
55
|
+
// Server will print valid values before crashing
|
|
56
|
+
// (server will crash after opening video and control sockets)
|
|
57
|
+
this.value.encoderName = "_";
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
override parseEncoder(line: string): ScrcpyEncoder | undefined {
|
|
61
|
+
return ScrcpyOptions1_17.parseEncoder(
|
|
62
|
+
line,
|
|
63
|
+
/\s+scrcpy --encoder-name '(.*?)'/,
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
}
|