@yume-chan/scrcpy 0.0.21 → 0.0.23

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 (75) hide show
  1. package/CHANGELOG.json +30 -0
  2. package/CHANGELOG.md +17 -1
  3. package/esm/codec/h264.js.map +1 -1
  4. package/esm/codec/h265.d.ts +72 -4
  5. package/esm/codec/h265.d.ts.map +1 -1
  6. package/esm/codec/h265.js +16 -17
  7. package/esm/codec/h265.js.map +1 -1
  8. package/esm/codec/nalu.js.map +1 -1
  9. package/esm/control/hover-helper.js.map +1 -1
  10. package/esm/control/inject-keycode.d.ts +13 -13
  11. package/esm/control/inject-keycode.d.ts.map +1 -1
  12. package/esm/control/inject-touch.d.ts.map +1 -1
  13. package/esm/control/inject-touch.js +0 -1
  14. package/esm/control/inject-touch.js.map +1 -1
  15. package/esm/control/serializer.d.ts +3 -0
  16. package/esm/control/serializer.d.ts.map +1 -1
  17. package/esm/control/serializer.js +16 -0
  18. package/esm/control/serializer.js.map +1 -1
  19. package/esm/control/type.js.map +1 -1
  20. package/esm/control/writer.d.ts +4 -0
  21. package/esm/control/writer.d.ts.map +1 -1
  22. package/esm/control/writer.js +17 -8
  23. package/esm/control/writer.js.map +1 -1
  24. package/esm/device-message/stream.js.map +1 -1
  25. package/esm/options/1_16/codec-options.d.ts +2 -2
  26. package/esm/options/1_16/codec-options.d.ts.map +1 -1
  27. package/esm/options/1_16/codec-options.js +15 -5
  28. package/esm/options/1_16/codec-options.js.map +1 -1
  29. package/esm/options/1_16/float-to-uint16.js.map +1 -1
  30. package/esm/options/1_16/options.d.ts.map +1 -1
  31. package/esm/options/1_16/options.js +1 -2
  32. package/esm/options/1_16/options.js.map +1 -1
  33. package/esm/options/1_16/scroll.js.map +1 -1
  34. package/esm/options/1_17.js +1 -1
  35. package/esm/options/1_17.js.map +1 -1
  36. package/esm/options/1_18.js +1 -1
  37. package/esm/options/1_18.js.map +1 -1
  38. package/esm/options/1_21.js.map +1 -1
  39. package/esm/options/1_22/options.js.map +1 -1
  40. package/esm/options/1_22/scroll.js.map +1 -1
  41. package/esm/options/1_23.js.map +1 -1
  42. package/esm/options/2_0.d.ts.map +1 -1
  43. package/esm/options/2_0.js +3 -3
  44. package/esm/options/2_0.js.map +1 -1
  45. package/esm/options/2_2.d.ts +67 -0
  46. package/esm/options/2_2.d.ts.map +1 -0
  47. package/esm/options/2_2.js +44 -0
  48. package/esm/options/2_2.js.map +1 -0
  49. package/esm/options/codec.js +1 -1
  50. package/esm/options/codec.js.map +1 -1
  51. package/esm/options/index.d.ts +1 -0
  52. package/esm/options/index.d.ts.map +1 -1
  53. package/esm/options/index.js +1 -0
  54. package/esm/options/index.js.map +1 -1
  55. package/esm/options/latest.d.ts +4 -4
  56. package/esm/options/latest.js +2 -2
  57. package/esm/options/types.d.ts.map +1 -1
  58. package/esm/options/types.js +5 -0
  59. package/esm/options/types.js.map +1 -1
  60. package/package.json +11 -20
  61. package/src/codec/h265.ts +26 -17
  62. package/src/control/inject-touch.ts +0 -1
  63. package/src/control/serializer.ts +25 -0
  64. package/src/control/writer.ts +20 -8
  65. package/src/options/1_16/codec-options.ts +20 -5
  66. package/src/options/1_16/options.ts +1 -2
  67. package/src/options/1_17.ts +1 -1
  68. package/src/options/1_18.ts +1 -1
  69. package/src/options/2_0.ts +5 -3
  70. package/src/options/2_2.ts +68 -0
  71. package/src/options/codec.ts +1 -1
  72. package/src/options/index.ts +1 -0
  73. package/src/options/latest.ts +4 -4
  74. package/src/options/types.ts +8 -0
  75. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/options/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/options/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -8,6 +8,7 @@ export * from "./1_24.js";
8
8
  export * from "./1_25/index.js";
9
9
  export * from "./2_0.js";
10
10
  export * from "./2_1.js";
11
+ export * from "./2_2.js";
11
12
  export * from "./codec.js";
12
13
  export * from "./latest.js";
13
14
  export * from "./types.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/options/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/options/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import { ScrcpyLogLevel1_18, ScrcpyVideoOrientation1_18 } from "./1_18.js";
2
- import type { ScrcpyOptionsInit2_1 } from "./2_1.js";
3
- import { ScrcpyOptions2_1 } from "./2_1.js";
2
+ import type { ScrcpyOptionsInit2_2 } from "./2_2.js";
3
+ import { ScrcpyOptions2_2 } from "./2_2.js";
4
4
  export declare const ScrcpyLogLevel: typeof ScrcpyLogLevel1_18;
5
5
  export type ScrcpyLogLevel = ScrcpyLogLevel1_18;
6
6
  export declare const ScrcpyVideoOrientation: typeof ScrcpyVideoOrientation1_18;
7
7
  export type ScrcpyVideoOrientation = ScrcpyVideoOrientation1_18;
8
- export type ScrcpyOptionsInitLatest = ScrcpyOptionsInit2_1;
9
- export declare class ScrcpyOptionsLatest extends ScrcpyOptions2_1 {
8
+ export type ScrcpyOptionsInitLatest = ScrcpyOptionsInit2_2;
9
+ export declare class ScrcpyOptionsLatest extends ScrcpyOptions2_2 {
10
10
  }
11
11
  //# sourceMappingURL=latest.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import { ScrcpyLogLevel1_18, ScrcpyVideoOrientation1_18 } from "./1_18.js";
2
- import { ScrcpyOptions2_1 } from "./2_1.js";
2
+ import { ScrcpyOptions2_2 } from "./2_2.js";
3
3
  export const ScrcpyLogLevel = ScrcpyLogLevel1_18;
4
4
  export const ScrcpyVideoOrientation = ScrcpyVideoOrientation1_18;
5
- export class ScrcpyOptionsLatest extends ScrcpyOptions2_1 {
5
+ export class ScrcpyOptionsLatest extends ScrcpyOptions2_2 {
6
6
  }
7
7
  //# sourceMappingURL=latest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/options/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/options/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EACR,kCAAkC,EAClC,wBAAwB,EACxB,+BAA+B,EAC/B,gCAAgC,EACnC,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,KAAK,EACR,yBAAyB,EACzB,uBAAuB,EACvB,iBAAiB,EACpB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,mBAAmB,sCAAsC,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAC9B,aAAa,IAAI,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,wBAAgB,mBAAmB,CAC/B,KAAK,EAAE,OAAO,GACf,KAAK,IAAI,iBAAiB,CAO5B;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC,CAmB3E;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM;IAC3C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE/B,QAAQ,CAAC,mBAAmB,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAElE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE5B,SAAS,IAAI,MAAM,EAAE,CAAC;IAEtB;;OAEG;IACH,eAAe,IAAI,IAAI,CAAC;IAExB;;OAEG;IACH,eAAe,IAAI,IAAI,CAAC;IAExB;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IAEtD;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IAEtD;;;;;;;OAOG;IACH,wBAAwB,CACpB,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACnC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAErC,wBAAwB,CACpB,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACnC,cAAc,CAAC,yBAAyB,CAAC,CAAC;IAE7C,4BAA4B,IAAI,eAAe,CAC3C,UAAU,EACV,uBAAuB,CAC1B,CAAC;IAEF,kCAAkC,CAC9B,OAAO,EAAE,+BAA+B,GACzC,UAAU,CAAC;IAEd,qCAAqC,CACjC,OAAO,EAAE,kCAAkC,GAC5C,UAAU,GAAG,SAAS,CAAC;IAE1B,mCAAmC,CAC/B,OAAO,EAAE,gCAAgC,GAC1C,UAAU,CAAC;IAEd,sBAAsB,IAAI,sBAAsB,CAAC;CACpD;AAED,8BAAsB,iBAAiB,CACnC,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,aAAa,CAAC,MAAM,CAAC,CACjC,YAAW,aAAa,CAAC,CAAC,CAAC;;IAEzB,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;IAEnB,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;IAErC,IAAI,mBAAmB,IAAI,SAAS,wBAAwB,EAAE,CAE7D;IAED,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAEhB,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAgBvC,QAAQ,CAAC,SAAS,IAAI,MAAM,EAAE;IAE9B,eAAe,IAAI,IAAI;IAIvB,eAAe,IAAI,IAAI;IAIvB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIrD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIrD;;;;;;;OAOG;IACH,wBAAwB,CACpB,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACnC,cAAc,CAAC,iBAAiB,CAAC;IAIpC,wBAAwB,CACpB,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACnC,cAAc,CAAC,yBAAyB,CAAC;IAI5C,4BAA4B,IAAI,eAAe,CAC3C,UAAU,EACV,uBAAuB,CAC1B;IAID,kCAAkC,CAC9B,OAAO,EAAE,+BAA+B,GACzC,UAAU;IAIb,qCAAqC,CACjC,OAAO,EAAE,kCAAkC,GAC5C,UAAU,GAAG,SAAS;IAIzB,mCAAmC,CAC/B,OAAO,EAAE,gCAAgC,GAC1C,UAAU;IAIb,sBAAsB,IAAI,sBAAsB;CAGnD"}
@@ -13,6 +13,11 @@ export function toScrcpyOptionValue(value, empty) {
13
13
  if (value === undefined) {
14
14
  return empty;
15
15
  }
16
+ if (typeof value !== "string" &&
17
+ typeof value !== "number" &&
18
+ typeof value !== "boolean") {
19
+ throw new Error(`Invalid option value: ${String(value)}`);
20
+ }
16
21
  return String(value);
17
22
  }
18
23
  export class ScrcpyOptionsBase {
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/options/types.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,MAAM,mBAAmB,GAAG,mCAAmC,CAAC;AAMvE,MAAM,UAAU,mBAAmB,CAC/B,KAAc;IAEd,OAAO,CACH,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,eAAe,IAAI,KAAK;QACxB,OAAO,KAAK,CAAC,aAAa,KAAK,UAAU,CAC5C,CAAC;AACN,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAI,KAAc,EAAE,KAAQ;IAC3D,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;QAC5B,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;KACjC;IAED,uDAAuD;IACvD,IAAI,KAAK,KAAK,SAAS,EAAE;QACrB,OAAO,KAAK,CAAC;KAChB;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAgFD,MAAM,OAAgB,iBAAiB;IAKzB,KAAK,CAAI;IAInB,IAAI,mBAAmB;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;IAC1C,CAAC;IAEQ,KAAK,CAAc;IAE5B,YAAY,IAAO,EAAE,KAAkB;QACnC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC;IAED,SAAS;QACL,oCAAoC;QACpC,0DAA0D;QAC1D,2DAA2D;QAC3D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,KAAK,YAAY,iBAAiB,EAAE;YACzC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;SAC1B;IACL,CAAC;IAID,eAAe;QACX,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;IACjC,CAAC;IAED,eAAe;QACX,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,YAAY,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;OAOG;IACH,wBAAwB,CACpB,MAAkC;QAElC,OAAO,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,wBAAwB,CACpB,MAAkC;QAElC,OAAO,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,4BAA4B;QAIxB,OAAO,IAAI,CAAC,KAAK,CAAC,4BAA4B,EAAE,CAAC;IACrD,CAAC;IAED,kCAAkC,CAC9B,OAAwC;QAExC,OAAO,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,qCAAqC,CACjC,OAA2C;QAE3C,OAAO,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,mCAAmC,CAC/B,OAAyC;QAEzC,OAAO,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,OAAO,CAAC,CAAC;IACnE,CAAC;IAED,sBAAsB;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC;IAC/C,CAAC;CACJ"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/options/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yume-chan/scrcpy",
3
- "version": "0.0.21",
3
+ "version": "0.0.23",
4
4
  "description": "TypeScript implementation of Scrcpy.",
5
5
  "keywords": [
6
6
  "adb",
@@ -26,34 +26,25 @@
26
26
  "main": "esm/index.js",
27
27
  "types": "esm/index.d.ts",
28
28
  "dependencies": {
29
- "@yume-chan/stream-extra": "^0.0.21",
30
- "@yume-chan/struct": "^0.0.21",
31
- "tslib": "^2.6.0"
29
+ "@yume-chan/stream-extra": "^0.0.23",
30
+ "@yume-chan/struct": "^0.0.23",
31
+ "tslib": "^2.6.2"
32
32
  },
33
33
  "devDependencies": {
34
- "@jest/globals": "^29.6.1",
34
+ "@jest/globals": "^30.0.0-alpha.3",
35
35
  "@yume-chan/eslint-config": "^1.0.0",
36
36
  "@yume-chan/tsconfig": "^1.0.0",
37
37
  "cross-env": "^7.0.3",
38
- "eslint": "^8.44.0",
39
- "gh-release-fetch": "^3.0.2",
40
- "jest": "^29.5.0",
41
- "prettier": "^3.0.0",
42
- "ts-jest": "^29.1.1",
43
- "typescript": "^5.1.6"
44
- },
45
- "peerDependencies": {
46
- "gh-release-fetch": "^3.0.2"
47
- },
48
- "peerDependenciesMeta": {
49
- "gh-release-fetch": {
50
- "optional": true
51
- }
38
+ "eslint": "^8.57.0",
39
+ "jest": "^30.0.0-alpha.3",
40
+ "prettier": "^3.2.5",
41
+ "ts-jest": "^29.1.2",
42
+ "typescript": "^5.4.2"
52
43
  },
53
44
  "scripts": {
54
45
  "build": "tsc -b tsconfig.build.json",
55
46
  "build:watch": "tsc -b tsconfig.build.json",
56
- "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage",
47
+ "test": "cross-env NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" TS_JEST_DISABLE_VER_CHECKER=true jest --coverage",
57
48
  "lint": "eslint src/**/*.ts --fix && prettier src/**/*.ts --write --tab-width 4"
58
49
  }
59
50
  }
package/src/codec/h265.ts CHANGED
@@ -14,6 +14,9 @@
14
14
  // cspell: ignore texmc
15
15
  // cspell: ignore rbsp
16
16
  // cspell: ignore cprms
17
+ // cspell: ignore nalu
18
+ // cspell: ignore sodb
19
+ // cspell: ignore luma
17
20
 
18
21
  import { NaluSodbBitReader, annexBSplitNalu } from "./nalu.js";
19
22
 
@@ -275,9 +278,9 @@ export function h265ParseSequenceParameterSet(nalu: Uint8Array) {
275
278
  const log2_max_pic_order_cnt_lsb_minus4 =
276
279
  reader.decodeExponentialGolombNumber();
277
280
 
278
- let sps_max_dec_pic_buffering_minus1: number[] | undefined;
279
- let sps_max_num_reorder_pics: number[] | undefined;
280
- let sps_max_latency_increase_plus1: number[] | undefined;
281
+ const sps_max_dec_pic_buffering_minus1: number[] = [];
282
+ const sps_max_num_reorder_pics: number[] = [];
283
+ const sps_max_latency_increase_plus1: number[] = [];
281
284
  const sps_sub_layer_ordering_info_present_flag = !!reader.next();
282
285
  for (
283
286
  let i = sps_sub_layer_ordering_info_present_flag
@@ -286,17 +289,11 @@ export function h265ParseSequenceParameterSet(nalu: Uint8Array) {
286
289
  i <= sps_max_sub_layers_minus1;
287
290
  i += 1
288
291
  ) {
289
- sps_max_dec_pic_buffering_minus1 = [];
290
- sps_max_num_reorder_pics = [];
291
- sps_max_latency_increase_plus1 = [];
292
- for (let i = 0; i <= sps_max_sub_layers_minus1; i += 1) {
293
- sps_max_dec_pic_buffering_minus1[i] =
294
- reader.decodeExponentialGolombNumber();
295
- sps_max_num_reorder_pics[i] =
296
- reader.decodeExponentialGolombNumber();
297
- sps_max_latency_increase_plus1[i] =
298
- reader.decodeExponentialGolombNumber();
299
- }
292
+ sps_max_dec_pic_buffering_minus1[i] =
293
+ reader.decodeExponentialGolombNumber();
294
+ sps_max_num_reorder_pics[i] = reader.decodeExponentialGolombNumber();
295
+ sps_max_latency_increase_plus1[i] =
296
+ reader.decodeExponentialGolombNumber();
300
297
  }
301
298
 
302
299
  const log2_min_luma_coding_block_size_minus3 =
@@ -370,7 +367,10 @@ export function h265ParseSequenceParameterSet(nalu: Uint8Array) {
370
367
  const vui_parameters_present_flag = !!reader.next();
371
368
  let vuiParameters: H265VuiParameters | undefined;
372
369
  if (vui_parameters_present_flag) {
373
- vuiParameters = h265ParseVuiParameters(reader);
370
+ vuiParameters = h265ParseVuiParameters(
371
+ reader,
372
+ sps_max_sub_layers_minus1,
373
+ );
374
374
  }
375
375
 
376
376
  const sps_extension_present_flag = !!reader.next();
@@ -897,7 +897,10 @@ export function h265ParseShortTermReferencePictureSet(
897
897
  /**
898
898
  * E.2.1 VUI parameters syntax
899
899
  */
900
- export function h265ParseVuiParameters(reader: NaluSodbBitReader) {
900
+ export function h265ParseVuiParameters(
901
+ reader: NaluSodbBitReader,
902
+ sps_max_sub_layers_minus1: number,
903
+ ) {
901
904
  const aspect_ratio_info_present_flag = !!reader.next();
902
905
  let aspect_ratio_idc: number | undefined;
903
906
  let sar_width: number | undefined;
@@ -966,6 +969,7 @@ export function h265ParseVuiParameters(reader: NaluSodbBitReader) {
966
969
  let vui_poc_proportional_to_timing_flag: boolean | undefined;
967
970
  let vui_num_ticks_poc_diff_one_minus1: number | undefined;
968
971
  let vui_hrd_parameters_present_flag: boolean | undefined;
972
+ let vui_hrd_parameters: H265HrdParameters | undefined;
969
973
  if (vui_timing_info_present_flag) {
970
974
  vui_num_units_in_tick = reader.read(32);
971
975
  vui_time_scale = reader.read(32);
@@ -976,7 +980,11 @@ export function h265ParseVuiParameters(reader: NaluSodbBitReader) {
976
980
  }
977
981
  vui_hrd_parameters_present_flag = !!reader.next();
978
982
  if (vui_hrd_parameters_present_flag) {
979
- throw new Error("Not implemented");
983
+ vui_hrd_parameters = h265ParseHrdParameters(
984
+ reader,
985
+ true,
986
+ sps_max_sub_layers_minus1,
987
+ );
980
988
  }
981
989
  }
982
990
 
@@ -1037,6 +1045,7 @@ export function h265ParseVuiParameters(reader: NaluSodbBitReader) {
1037
1045
  vui_poc_proportional_to_timing_flag,
1038
1046
  vui_num_ticks_poc_diff_one_minus1,
1039
1047
  vui_hrd_parameters_present_flag,
1048
+ vui_hrd_parameters,
1040
1049
 
1041
1050
  bitstream_restriction_flag,
1042
1051
  tiles_fixed_structure_flag,
@@ -27,7 +27,6 @@ export enum AndroidMotionEventButton {
27
27
  StylusSecondary = 0x40,
28
28
  }
29
29
 
30
- // eslint-disable-next-line @typescript-eslint/no-namespace
31
30
  export namespace ScrcpyPointerId {
32
31
  export const Mouse = -1n;
33
32
  export const Finger = -2n;
@@ -3,6 +3,7 @@ import type {
3
3
  ScrcpyScrollController,
4
4
  } from "../options/index.js";
5
5
 
6
+ import { BasicControlMessage } from "./basic.js";
6
7
  import type { AndroidKeyEventAction } from "./inject-keycode.js";
7
8
  import { ScrcpyInjectKeyCodeControlMessage } from "./inject-keycode.js";
8
9
  import type { ScrcpyInjectScrollControlMessage } from "./inject-scroll.js";
@@ -83,6 +84,30 @@ export class ScrcpyControlMessageSerializer {
83
84
  });
84
85
  }
85
86
 
87
+ expandNotificationPanel() {
88
+ return BasicControlMessage.serialize({
89
+ type: this.#typeValues.get(
90
+ ScrcpyControlMessageType.ExpandNotificationPanel,
91
+ ),
92
+ });
93
+ }
94
+
95
+ expandSettingPanel() {
96
+ return BasicControlMessage.serialize({
97
+ type: this.#typeValues.get(
98
+ ScrcpyControlMessageType.ExpandSettingPanel,
99
+ ),
100
+ });
101
+ }
102
+
103
+ collapseNotificationPanel() {
104
+ return BasicControlMessage.serialize({
105
+ type: this.#typeValues.get(
106
+ ScrcpyControlMessageType.CollapseNotificationPanel,
107
+ ),
108
+ });
109
+ }
110
+
86
111
  rotateDevice() {
87
112
  return ScrcpyRotateDeviceControlMessage.serialize({
88
113
  type: this.#typeValues.get(ScrcpyControlMessageType.RotateDevice),
@@ -27,25 +27,25 @@ export class ScrcpyControlMessageWriter {
27
27
  this.#serializer = new ScrcpyControlMessageSerializer(options);
28
28
  }
29
29
 
30
- async #write(message: Uint8Array) {
30
+ async write(message: Uint8Array) {
31
31
  await ConsumableWritableStream.write(this.#writer, message);
32
32
  }
33
33
 
34
34
  async injectKeyCode(
35
35
  message: Omit<ScrcpyInjectKeyCodeControlMessage, "type">,
36
36
  ) {
37
- await this.#write(this.#serializer.injectKeyCode(message));
37
+ await this.write(this.#serializer.injectKeyCode(message));
38
38
  }
39
39
 
40
40
  async injectText(text: string) {
41
- await this.#write(this.#serializer.injectText(text));
41
+ await this.write(this.#serializer.injectText(text));
42
42
  }
43
43
 
44
44
  /**
45
45
  * `pressure` is a float value between 0 and 1.
46
46
  */
47
47
  async injectTouch(message: Omit<ScrcpyInjectTouchControlMessage, "type">) {
48
- await this.#write(this.#serializer.injectTouch(message));
48
+ await this.write(this.#serializer.injectTouch(message));
49
49
  }
50
50
 
51
51
  /**
@@ -56,23 +56,35 @@ export class ScrcpyControlMessageWriter {
56
56
  ) {
57
57
  const data = this.#serializer.injectScroll(message);
58
58
  if (data) {
59
- await this.#write(data);
59
+ await this.write(data);
60
60
  }
61
61
  }
62
62
 
63
63
  async backOrScreenOn(action: AndroidKeyEventAction) {
64
64
  const data = this.#serializer.backOrScreenOn(action);
65
65
  if (data) {
66
- await this.#write(data);
66
+ await this.write(data);
67
67
  }
68
68
  }
69
69
 
70
70
  async setScreenPowerMode(mode: AndroidScreenPowerMode) {
71
- await this.#write(this.#serializer.setScreenPowerMode(mode));
71
+ await this.write(this.#serializer.setScreenPowerMode(mode));
72
+ }
73
+
74
+ async expandNotificationPanel() {
75
+ await this.write(this.#serializer.expandNotificationPanel());
76
+ }
77
+
78
+ async expandSettingPanel() {
79
+ await this.write(this.#serializer.expandSettingPanel());
80
+ }
81
+
82
+ async collapseNotificationPanel() {
83
+ await this.write(this.#serializer.collapseNotificationPanel());
72
84
  }
73
85
 
74
86
  async rotateDevice() {
75
- await this.#write(this.#serializer.rotateDevice());
87
+ await this.write(this.#serializer.rotateDevice());
76
88
  }
77
89
 
78
90
  releaseLock() {
@@ -27,14 +27,22 @@ const CODEC_OPTION_TYPES: Partial<
27
27
  };
28
28
 
29
29
  export class CodecOptions implements ScrcpyOptionValue {
30
- value: Partial<CodecOptionsInit>;
30
+ options: Partial<CodecOptionsInit>;
31
31
 
32
- constructor(value: Partial<CodecOptionsInit> = {}) {
33
- this.value = value;
32
+ constructor(options: Partial<CodecOptionsInit> = {}) {
33
+ for (const [key, value] of Object.entries(options)) {
34
+ if (typeof value !== "number") {
35
+ throw new Error(
36
+ `Invalid option value for ${key}: ${String(value)}`,
37
+ );
38
+ }
39
+ }
40
+
41
+ this.options = options;
34
42
  }
35
43
 
36
44
  toOptionValue(): string | undefined {
37
- const entries = Object.entries(this.value).filter(
45
+ const entries = Object.entries(this.options).filter(
38
46
  ([, value]) => value !== undefined,
39
47
  );
40
48
 
@@ -44,8 +52,15 @@ export class CodecOptions implements ScrcpyOptionValue {
44
52
 
45
53
  return entries
46
54
  .map(([key, value]) => {
55
+ let result = toDashCase(key);
56
+
47
57
  const type = CODEC_OPTION_TYPES[key as keyof CodecOptionsInit];
48
- return `${toDashCase(key)}${type ? `:${type}` : ""}=${value}`;
58
+ if (type) {
59
+ result += `:${type}`;
60
+ }
61
+
62
+ result += `=${value}`;
63
+ return result;
49
64
  })
50
65
  .join(",");
51
66
  }
@@ -128,8 +128,7 @@ export class ScrcpyOptions1_16 implements ScrcpyOptions<ScrcpyOptionsInit1_16> {
128
128
  }
129
129
 
130
130
  parseDisplay(line: string): ScrcpyDisplay | undefined {
131
- const displayIdRegex = /\s+scrcpy --display (\d+)/;
132
- const match = line.match(displayIdRegex);
131
+ const match = line.match(/^\s+scrcpy --display (\d+)$/);
133
132
  if (match) {
134
133
  return {
135
134
  id: Number.parseInt(match[1]!, 10),
@@ -60,7 +60,7 @@ export class ScrcpyOptions1_17 extends ScrcpyOptionsBase<
60
60
  override parseEncoder(line: string): ScrcpyEncoder | undefined {
61
61
  return ScrcpyOptions1_17.parseEncoder(
62
62
  line,
63
- /\s+scrcpy --encoder-name '(.*?)'/,
63
+ /^\s+scrcpy --encoder-name '([^']+)'$/,
64
64
  );
65
65
  }
66
66
  }
@@ -125,7 +125,7 @@ export class ScrcpyOptions1_18 extends ScrcpyOptionsBase<
125
125
  override parseEncoder(line: string): ScrcpyEncoder | undefined {
126
126
  return ScrcpyOptions1_17.parseEncoder(
127
127
  line,
128
- /\s+scrcpy --encoder '(.*?)'/,
128
+ /^\s+scrcpy --encoder '([^']+)'$/,
129
129
  );
130
130
  }
131
131
 
@@ -155,7 +155,7 @@ export class ScrcpyOptions2_0 extends ScrcpyOptionsBase<
155
155
 
156
156
  override parseEncoder(line: string): ScrcpyEncoder | undefined {
157
157
  let match = line.match(
158
- /\s+--video-codec=(.*)\s+--video-encoder='(.*)'/,
158
+ /^\s+--video-codec=(\S+)\s+--video-encoder='([^']+)'$/,
159
159
  );
160
160
  if (match) {
161
161
  return {
@@ -165,7 +165,9 @@ export class ScrcpyOptions2_0 extends ScrcpyOptionsBase<
165
165
  };
166
166
  }
167
167
 
168
- match = line.match(/\s+--audio-codec=(.*)\s+--audio-encoder='(.*)'/);
168
+ match = line.match(
169
+ /^\s+--audio-codec=(\S+)\s+--audio-encoder='([^']+)'$/,
170
+ );
169
171
  if (match) {
170
172
  return {
171
173
  type: "audio",
@@ -178,7 +180,7 @@ export class ScrcpyOptions2_0 extends ScrcpyOptionsBase<
178
180
  }
179
181
 
180
182
  override parseDisplay(line: string): ScrcpyDisplay | undefined {
181
- const match = line.match(/\s+--display=(\d+)\s+\((.*?)\)/);
183
+ const match = line.match(/^\s+--display=(\d+)\s+\(([^)]+)\)$/);
182
184
  if (match) {
183
185
  const display: ScrcpyDisplay = {
184
186
  id: Number.parseInt(match[1]!, 10),
@@ -0,0 +1,68 @@
1
+ import { ScrcpyOptions1_21 } from "./1_21.js";
2
+ import type { ScrcpyOptionsInit2_1 } from "./2_1.js";
3
+ import { ScrcpyOptions2_1 } from "./2_1.js";
4
+ import type { ScrcpyDisplay } from "./types.js";
5
+ import { ScrcpyOptionsBase } from "./types.js";
6
+
7
+ export interface ScrcpyOptionsInit2_2
8
+ extends Omit<ScrcpyOptionsInit2_1, "display"> {
9
+ videoSource?: "display" | "camera";
10
+ displayId?: number;
11
+ cameraId?: string | undefined;
12
+ cameraSize?: string | undefined;
13
+ cameraFacing?: "front" | "back" | "external" | undefined;
14
+ cameraAr?: string | undefined;
15
+ cameraFps?: number | undefined;
16
+ cameraHighSpeed?: boolean;
17
+
18
+ listCameras?: boolean;
19
+ listCameraSizes?: boolean;
20
+ }
21
+
22
+ export class ScrcpyOptions2_2 extends ScrcpyOptionsBase<
23
+ ScrcpyOptionsInit2_2,
24
+ ScrcpyOptions2_1
25
+ > {
26
+ static readonly DEFAULTS = {
27
+ ...ScrcpyOptions2_1.DEFAULTS,
28
+ videoSource: "display",
29
+ displayId: 0,
30
+ cameraId: undefined,
31
+ cameraSize: undefined,
32
+ cameraFacing: undefined,
33
+ cameraAr: undefined,
34
+ cameraFps: undefined,
35
+ cameraHighSpeed: false,
36
+ listCameras: false,
37
+ listCameraSizes: false,
38
+ } as const satisfies Required<ScrcpyOptionsInit2_2>;
39
+
40
+ override get defaults(): Required<ScrcpyOptionsInit2_2> {
41
+ return ScrcpyOptions2_2.DEFAULTS;
42
+ }
43
+
44
+ constructor(init: ScrcpyOptionsInit2_2) {
45
+ super(new ScrcpyOptions2_1(init), {
46
+ ...ScrcpyOptions2_2.DEFAULTS,
47
+ ...init,
48
+ });
49
+ }
50
+
51
+ override parseDisplay(line: string): ScrcpyDisplay | undefined {
52
+ const match = line.match(/^\s+--display-id=(\d+)\s+\(([^)]+)\)$/);
53
+ if (match) {
54
+ const display: ScrcpyDisplay = {
55
+ id: Number.parseInt(match[1]!, 10),
56
+ };
57
+ if (match[2] !== "size unknown") {
58
+ display.resolution = match[2]!;
59
+ }
60
+ return display;
61
+ }
62
+ return undefined;
63
+ }
64
+
65
+ override serialize(): string[] {
66
+ return ScrcpyOptions1_21.serialize(this.value, this.defaults);
67
+ }
68
+ }
@@ -37,7 +37,7 @@ export class ScrcpyAudioCodec implements ScrcpyOptionValue {
37
37
  "raw",
38
38
  0x00_72_61_77,
39
39
  "audio/raw",
40
- "1",
40
+ "",
41
41
  );
42
42
 
43
43
  readonly optionValue: string;
@@ -8,6 +8,7 @@ export * from "./1_24.js";
8
8
  export * from "./1_25/index.js";
9
9
  export * from "./2_0.js";
10
10
  export * from "./2_1.js";
11
+ export * from "./2_2.js";
11
12
  export * from "./codec.js";
12
13
  export * from "./latest.js";
13
14
  export * from "./types.js";
@@ -1,6 +1,6 @@
1
1
  import { ScrcpyLogLevel1_18, ScrcpyVideoOrientation1_18 } from "./1_18.js";
2
- import type { ScrcpyOptionsInit2_1 } from "./2_1.js";
3
- import { ScrcpyOptions2_1 } from "./2_1.js";
2
+ import type { ScrcpyOptionsInit2_2 } from "./2_2.js";
3
+ import { ScrcpyOptions2_2 } from "./2_2.js";
4
4
 
5
5
  export const ScrcpyLogLevel = ScrcpyLogLevel1_18;
6
6
  export type ScrcpyLogLevel = ScrcpyLogLevel1_18;
@@ -8,5 +8,5 @@ export type ScrcpyLogLevel = ScrcpyLogLevel1_18;
8
8
  export const ScrcpyVideoOrientation = ScrcpyVideoOrientation1_18;
9
9
  export type ScrcpyVideoOrientation = ScrcpyVideoOrientation1_18;
10
10
 
11
- export type ScrcpyOptionsInitLatest = ScrcpyOptionsInit2_1;
12
- export class ScrcpyOptionsLatest extends ScrcpyOptions2_1 {}
11
+ export type ScrcpyOptionsInitLatest = ScrcpyOptionsInit2_2;
12
+ export class ScrcpyOptionsLatest extends ScrcpyOptions2_2 {}
@@ -42,6 +42,14 @@ export function toScrcpyOptionValue<T>(value: unknown, empty: T): string | T {
42
42
  return empty;
43
43
  }
44
44
 
45
+ if (
46
+ typeof value !== "string" &&
47
+ typeof value !== "number" &&
48
+ typeof value !== "boolean"
49
+ ) {
50
+ throw new Error(`Invalid option value: ${String(value)}`);
51
+ }
52
+
45
53
  return String(value);
46
54
  }
47
55