@yume-chan/scrcpy-decoder-webcodecs 0.0.17 → 0.0.19

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.
@@ -1,86 +0,0 @@
1
- import { PromiseResolver } from '@yume-chan/async';
2
- import { AndroidCodecLevel, AndroidCodecProfile } from '@yume-chan/scrcpy';
3
- import { WritableStream } from '@yume-chan/stream-extra';
4
- import { createTinyH264Wrapper } from './wrapper.js';
5
- let cachedInitializePromise;
6
- function initialize() {
7
- if (!cachedInitializePromise) {
8
- cachedInitializePromise = Promise.all([import('yuv-buffer'), import('yuv-canvas')]).then(([YuvBuffer, { default: YuvCanvas }]) => ({
9
- YuvBuffer, YuvCanvas
10
- }));
11
- }
12
- return cachedInitializePromise;
13
- }
14
- export class TinyH264Decoder {
15
- maxProfile = AndroidCodecProfile.Baseline;
16
- maxLevel = AndroidCodecLevel.Level4;
17
- _renderer;
18
- get renderer() { return this._renderer; }
19
- _frameRendered = 0;
20
- get frameRendered() { return this._frameRendered; }
21
- _writable;
22
- get writable() { return this._writable; }
23
- _yuvCanvas;
24
- _initializer;
25
- constructor() {
26
- initialize();
27
- this._renderer = document.createElement('canvas');
28
- this._writable = new WritableStream({
29
- write: async (packet) => {
30
- switch (packet.type) {
31
- case 'configuration':
32
- this.configure(packet.data);
33
- break;
34
- case 'frame':
35
- if (!this._initializer) {
36
- throw new Error('Decoder not initialized');
37
- }
38
- const wrapper = await this._initializer.promise;
39
- wrapper.feed(packet.data.slice().buffer);
40
- break;
41
- }
42
- }
43
- });
44
- }
45
- async configure(config) {
46
- this.dispose();
47
- this._initializer = new PromiseResolver();
48
- const { YuvBuffer, YuvCanvas } = await initialize();
49
- if (!this._yuvCanvas) {
50
- this._yuvCanvas = YuvCanvas.attach(this._renderer);
51
- ;
52
- }
53
- const { encodedWidth, encodedHeight } = config;
54
- const chromaWidth = encodedWidth / 2;
55
- const chromaHeight = encodedHeight / 2;
56
- this._renderer.width = config.croppedWidth;
57
- this._renderer.height = config.croppedHeight;
58
- const format = YuvBuffer.format({
59
- width: encodedWidth,
60
- height: encodedHeight,
61
- chromaWidth,
62
- chromaHeight,
63
- cropLeft: config.cropLeft,
64
- cropTop: config.cropTop,
65
- cropWidth: config.croppedWidth,
66
- cropHeight: config.croppedHeight,
67
- displayWidth: config.croppedWidth,
68
- displayHeight: config.croppedHeight,
69
- });
70
- const wrapper = await createTinyH264Wrapper();
71
- this._initializer.resolve(wrapper);
72
- const uPlaneOffset = encodedWidth * encodedHeight;
73
- const vPlaneOffset = uPlaneOffset + chromaWidth * chromaHeight;
74
- wrapper.onPictureReady(({ data }) => {
75
- this._frameRendered += 1;
76
- const array = new Uint8Array(data);
77
- const frame = YuvBuffer.frame(format, YuvBuffer.lumaPlane(format, array, encodedWidth, 0), YuvBuffer.chromaPlane(format, array, chromaWidth, uPlaneOffset), YuvBuffer.chromaPlane(format, array, chromaWidth, vPlaneOffset));
78
- this._yuvCanvas.drawFrame(frame);
79
- });
80
- }
81
- dispose() {
82
- this._initializer?.promise.then(wrapper => wrapper.dispose());
83
- this._initializer = undefined;
84
- }
85
- }
86
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tinyh264/index.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=worker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/tinyh264/worker.ts"],"names":[],"mappings":""}
@@ -1,3 +0,0 @@
1
- import { init } from 'tinyh264';
2
- init();
3
- //# sourceMappingURL=worker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/tinyh264/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,IAAI,EAAE,CAAC"}
@@ -1,21 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../src/tinyh264/wrapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAA4B,MAAM,kBAAkB,CAAC;AAO5E,MAAM,WAAW,qBAAqB;IAClC,aAAa,EAAE,MAAM,CAAC;IAEtB,KAAK,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,MAAM,CAAC;IAEf,IAAI,EAAE,WAAW,CAAC;CACrB;AAcD,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,CAExB;IAEK,IAAI,CAAC,IAAI,EAAE,WAAW;IAUb,OAAO;CAO1B;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAAC,eAAe,CAAC,CA8BhE"}
@@ -1,74 +0,0 @@
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 PICTURE_READY_SUBSCRIPTIONS = new Map();
8
- function subscribePictureReady(streamId, handler) {
9
- PICTURE_READY_SUBSCRIPTIONS.set(streamId, handler);
10
- return {
11
- dispose() {
12
- PICTURE_READY_SUBSCRIPTIONS.delete(streamId);
13
- }
14
- };
15
- }
16
- export class TinyH264Wrapper extends AutoDisposable {
17
- streamId;
18
- pictureReadyEvent = new EventEmitter();
19
- get onPictureReady() { return this.pictureReadyEvent.event; }
20
- constructor(streamId) {
21
- super();
22
- this.streamId = streamId;
23
- this.addDisposable(subscribePictureReady(streamId, this.handlePictureReady));
24
- }
25
- handlePictureReady = (e) => {
26
- this.pictureReadyEvent.fire(e);
27
- };
28
- feed(data) {
29
- worker.postMessage({
30
- type: 'decode',
31
- data: data,
32
- offset: 0,
33
- length: data.byteLength,
34
- renderStateId: this.streamId,
35
- }, [data]);
36
- }
37
- dispose() {
38
- super.dispose();
39
- worker.postMessage({
40
- type: 'release',
41
- renderStateId: this.streamId,
42
- });
43
- }
44
- }
45
- export function createTinyH264Wrapper() {
46
- if (!worker) {
47
- worker = new Worker(new URL('./worker.js', import.meta.url));
48
- worker.addEventListener('message', (e) => {
49
- const { data } = e;
50
- switch (data.type) {
51
- case 'decoderReady':
52
- workerReady = true;
53
- for (const resolver of pendingResolvers) {
54
- resolver.resolve(new TinyH264Wrapper(streamId));
55
- streamId += 1;
56
- }
57
- pendingResolvers.length = 0;
58
- break;
59
- case 'pictureReady':
60
- PICTURE_READY_SUBSCRIPTIONS.get(data.renderStateId)?.(data);
61
- break;
62
- }
63
- });
64
- }
65
- if (!workerReady) {
66
- const resolver = new PromiseResolver();
67
- pendingResolvers.push(resolver);
68
- return resolver.promise;
69
- }
70
- const decoder = new TinyH264Wrapper(streamId);
71
- streamId += 1;
72
- return Promise.resolve(decoder);
73
- }
74
- //# sourceMappingURL=wrapper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../src/tinyh264/wrapper.ts"],"names":[],"mappings":"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"}
package/jest.config.js DELETED
@@ -1,13 +0,0 @@
1
- /** @type {import('ts-jest').InitialOptionsTsJest} */
2
- export default {
3
- preset: "ts-jest/presets/default-esm",
4
- globals: {
5
- 'ts-jest': {
6
- tsconfig: 'tsconfig.test.json',
7
- useESM: true,
8
- },
9
- },
10
- moduleNameMapper: {
11
- '^(\\.{1,2}/.*)\\.js$': '$1',
12
- },
13
- };
@@ -1 +0,0 @@
1
- Invoking: tsc -b tsconfig.build.json
@@ -1 +0,0 @@
1
- Invoking: tsc -b tsconfig.build.json
package/tsconfig.json DELETED
@@ -1,16 +0,0 @@
1
- {
2
- "references": [
3
- {
4
- "path": "../stream-extra/tsconfig.build.json"
5
- },
6
- {
7
- "path": "../scrcpy/tsconfig.build.json"
8
- },
9
- {
10
- "path": "./tsconfig.test.json"
11
- },
12
- {
13
- "path": "./tsconfig.build.json"
14
- },
15
- ]
16
- }
@@ -1,8 +0,0 @@
1
- {
2
- "extends": "./tsconfig.build.json",
3
- "compilerOptions": {
4
- "types": [
5
- ],
6
- },
7
- "exclude": []
8
- }