diff --git a/libraries/scrcpy-decoder-tinyh264/src/decoder.ts b/libraries/scrcpy-decoder-tinyh264/src/decoder.ts index de1d98c4..dd58b8b3 100644 --- a/libraries/scrcpy-decoder-tinyh264/src/decoder.ts +++ b/libraries/scrcpy-decoder-tinyh264/src/decoder.ts @@ -1,4 +1,5 @@ import { PromiseResolver } from "@yume-chan/async"; +import { EventEmitter } from "@yume-chan/event"; import type { ScrcpyMediaStreamPacket } from "@yume-chan/scrcpy"; import { AndroidAvcLevel, @@ -51,6 +52,11 @@ export class TinyH264Decoder implements ScrcpyVideoDecoder { return this.#renderer; } + #sizeChanged = new EventEmitter<{ width: number; height: number }>(); + get sizeChanged() { + return this.#sizeChanged.event; + } + #frameRendered = 0; get frameRendered() { return this.#frameRendered; @@ -112,6 +118,10 @@ export class TinyH264Decoder implements ScrcpyVideoDecoder { cropLeft, cropTop, } = h264ParseConfiguration(data); + this.#sizeChanged.fire({ + width: croppedWidth, + height: croppedHeight, + }); // H.264 Baseline profile only supports YUV 420 pixel format const chromaWidth = encodedWidth / 2; diff --git a/libraries/scrcpy-decoder-tinyh264/src/types.ts b/libraries/scrcpy-decoder-tinyh264/src/types.ts index 0d2bc0ad..5cf4936c 100644 --- a/libraries/scrcpy-decoder-tinyh264/src/types.ts +++ b/libraries/scrcpy-decoder-tinyh264/src/types.ts @@ -1,4 +1,4 @@ -import type { Disposable } from "@yume-chan/event"; +import type { Disposable, Event } from "@yume-chan/event"; import type { ScrcpyMediaStreamPacket, ScrcpyVideoCodecId, @@ -12,6 +12,7 @@ export interface ScrcpyVideoDecoderCapability { export interface ScrcpyVideoDecoder extends Disposable { readonly renderer: HTMLElement; + readonly sizeChanged: Event<{ width: number; height: number }>; readonly frameRendered: number; readonly frameSkipped: number; readonly writable: WritableStream; diff --git a/libraries/scrcpy-decoder-webcodecs/package.json b/libraries/scrcpy-decoder-webcodecs/package.json index 9014db0f..a5ca7a7b 100644 --- a/libraries/scrcpy-decoder-webcodecs/package.json +++ b/libraries/scrcpy-decoder-webcodecs/package.json @@ -34,6 +34,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { + "@yume-chan/event": "workspace:^0.0.22", "@yume-chan/scrcpy": "workspace:^0.0.22", "@yume-chan/scrcpy-decoder-tinyh264": "workspace:^0.0.22", "@yume-chan/stream-extra": "workspace:^0.0.22", diff --git a/libraries/scrcpy-decoder-webcodecs/src/index.ts b/libraries/scrcpy-decoder-webcodecs/src/index.ts index 1fde80a7..67ba3137 100644 --- a/libraries/scrcpy-decoder-webcodecs/src/index.ts +++ b/libraries/scrcpy-decoder-webcodecs/src/index.ts @@ -1,3 +1,4 @@ +import { EventEmitter } from "@yume-chan/event"; import type { ScrcpyMediaStreamDataPacket, ScrcpyMediaStreamPacket, @@ -62,6 +63,11 @@ export class WebCodecsDecoder implements ScrcpyVideoDecoder { return this.#frameSkipped; } + #sizeChanged = new EventEmitter<{ width: number; height: number }>(); + get sizeChanged() { + return this.#sizeChanged.event; + } + #context: CanvasRenderingContext2D; #decoder: VideoDecoder; #config: Uint8Array | undefined; @@ -132,6 +138,10 @@ export class WebCodecsDecoder implements ScrcpyVideoDecoder { this.#renderer.width = croppedWidth; this.#renderer.height = croppedHeight; + this.#sizeChanged.fire({ + width: croppedWidth, + height: croppedHeight, + }); // https://www.rfc-editor.org/rfc/rfc6381#section-3.3 // ISO Base Media File Format Name Space