@yume-chan/scrcpy-decoder-webcodecs
Version:
Raw H.264 stream decoder and renderer using WebCodecs API (requires modern browser).
51 lines (44 loc) • 1.62 kB
text/typescript
import { getUint32LittleEndian } from "@yume-chan/no-data-view";
import { h265ParseConfiguration } from "@yume-chan/scrcpy";
import { H26xDecoder } from "./h26x.js";
import { hexDigits } from "./utils.js";
export class H265Decoder extends H26xDecoder {
#decoder: VideoDecoder;
#updateSize: (width: number, height: number) => void;
constructor(
decoder: VideoDecoder,
updateSize: (width: number, height: number) => void,
) {
super(decoder);
this.#decoder = decoder;
this.#updateSize = updateSize;
}
override configure(data: Uint8Array): void {
const {
generalProfileSpace,
generalProfileIndex,
generalProfileCompatibilitySet,
generalTierFlag,
generalLevelIndex,
generalConstraintSet,
croppedWidth,
croppedHeight,
} = h265ParseConfiguration(data);
this.#updateSize(croppedWidth, croppedHeight);
const codec = [
"hev1",
["", "A", "B", "C"][generalProfileSpace]! +
generalProfileIndex.toString(),
hexDigits(getUint32LittleEndian(generalProfileCompatibilitySet, 0)),
(generalTierFlag ? "H" : "L") + generalLevelIndex.toString(),
...Array.from(generalConstraintSet, hexDigits),
].join(".");
this.#decoder.configure({
codec,
// Microsoft Edge requires explicit size to work
codedWidth: croppedWidth,
codedHeight: croppedHeight,
optimizeForLatency: true,
});
}
}