Loading .vscode/settings.json +1 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ "allowlist", "arraybuffer", "autorun", "Bframes", "brotli", "Callout", "Cascadia", Loading apps/demo/src/components/scrcpy/settings.tsx +1 −0 Original line number Diff line number Diff line Loading @@ -184,6 +184,7 @@ export interface H264Decoder extends Disposable { readonly renderer: HTMLElement; readonly frameRendered: number; readonly frameSkipped: number; readonly writable: WritableStream<ScrcpyVideoStreamPacket>; } Loading apps/demo/src/components/scrcpy/state.tsx +16 −5 Original line number Diff line number Diff line Loading @@ -67,7 +67,7 @@ export class ScrcpyPageState { decoder: H264Decoder | undefined = undefined; configuration: ScrcpyVideoStreamConfigurationPacket | undefined = undefined; fpsCounterIntervalId: any = undefined; fps = 0; fps = "0"; connecting = false; serverTotalSize = 0; Loading Loading @@ -199,11 +199,22 @@ export class ScrcpyPageState { runInAction(() => { this.decoder = decoder; let lastFrameCount = 0; let lastFrameRendered = 0; let lastFrameSkipped = 0; this.fpsCounterIntervalId = setInterval( action(() => { this.fps = decoder.frameRendered - lastFrameCount; lastFrameCount = decoder.frameRendered; const deltaRendered = decoder.frameRendered - lastFrameRendered; const deltaSkipped = decoder.frameSkipped - lastFrameSkipped; // prettier-ignore this.fps = `${ deltaRendered }${ deltaSkipped ? `+${deltaSkipped} skipped` : "" }`; lastFrameRendered = decoder.frameRendered; lastFrameSkipped = decoder.frameSkipped; }), 1000 ); Loading Loading @@ -328,7 +339,7 @@ export class ScrcpyPageState { RECORD_STATE.recording = false; } this.fps = 0; this.fps = "0"; clearTimeout(this.fpsCounterIntervalId); this.client = undefined; Loading libraries/scrcpy-decoder-tinyh264/src/index.ts +5 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,11 @@ export class TinyH264Decoder { return this._frameRendered; } private _frameSkipped = 0; public get frameSkipped() { return this._frameSkipped; } private _writable: WritableStream<ScrcpyVideoStreamPacket>; public get writable() { return this._writable; Loading libraries/scrcpy-decoder-webcodecs/src/index.ts +6 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,11 @@ export class WebCodecsDecoder { return this._frameRendered; } private _frameSkipped = 0; public get frameSkipped() { return this._frameSkipped; } private context: CanvasRenderingContext2D; private decoder: VideoDecoder; Loading @@ -43,6 +48,7 @@ export class WebCodecsDecoder { this.decoder = new VideoDecoder({ output: (frame) => { if (this.lastFrame) { this._frameSkipped += 1; this.lastFrame.close(); } this.lastFrame = frame; Loading Loading
.vscode/settings.json +1 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ "allowlist", "arraybuffer", "autorun", "Bframes", "brotli", "Callout", "Cascadia", Loading
apps/demo/src/components/scrcpy/settings.tsx +1 −0 Original line number Diff line number Diff line Loading @@ -184,6 +184,7 @@ export interface H264Decoder extends Disposable { readonly renderer: HTMLElement; readonly frameRendered: number; readonly frameSkipped: number; readonly writable: WritableStream<ScrcpyVideoStreamPacket>; } Loading
apps/demo/src/components/scrcpy/state.tsx +16 −5 Original line number Diff line number Diff line Loading @@ -67,7 +67,7 @@ export class ScrcpyPageState { decoder: H264Decoder | undefined = undefined; configuration: ScrcpyVideoStreamConfigurationPacket | undefined = undefined; fpsCounterIntervalId: any = undefined; fps = 0; fps = "0"; connecting = false; serverTotalSize = 0; Loading Loading @@ -199,11 +199,22 @@ export class ScrcpyPageState { runInAction(() => { this.decoder = decoder; let lastFrameCount = 0; let lastFrameRendered = 0; let lastFrameSkipped = 0; this.fpsCounterIntervalId = setInterval( action(() => { this.fps = decoder.frameRendered - lastFrameCount; lastFrameCount = decoder.frameRendered; const deltaRendered = decoder.frameRendered - lastFrameRendered; const deltaSkipped = decoder.frameSkipped - lastFrameSkipped; // prettier-ignore this.fps = `${ deltaRendered }${ deltaSkipped ? `+${deltaSkipped} skipped` : "" }`; lastFrameRendered = decoder.frameRendered; lastFrameSkipped = decoder.frameSkipped; }), 1000 ); Loading Loading @@ -328,7 +339,7 @@ export class ScrcpyPageState { RECORD_STATE.recording = false; } this.fps = 0; this.fps = "0"; clearTimeout(this.fpsCounterIntervalId); this.client = undefined; Loading
libraries/scrcpy-decoder-tinyh264/src/index.ts +5 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,11 @@ export class TinyH264Decoder { return this._frameRendered; } private _frameSkipped = 0; public get frameSkipped() { return this._frameSkipped; } private _writable: WritableStream<ScrcpyVideoStreamPacket>; public get writable() { return this._writable; Loading
libraries/scrcpy-decoder-webcodecs/src/index.ts +6 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,11 @@ export class WebCodecsDecoder { return this._frameRendered; } private _frameSkipped = 0; public get frameSkipped() { return this._frameSkipped; } private context: CanvasRenderingContext2D; private decoder: VideoDecoder; Loading @@ -43,6 +48,7 @@ export class WebCodecsDecoder { this.decoder = new VideoDecoder({ output: (frame) => { if (this.lastFrame) { this._frameSkipped += 1; this.lastFrame.close(); } this.lastFrame = frame; Loading