signal-desktop/ts/test-both/helpers/fakeGetGroupCallVideoFrameSource.ts
2023-01-09 10:38:57 -08:00

61 lines
1.6 KiB
TypeScript

// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { VideoFrameSource } from '@signalapp/ringrtc';
const COLORS: Array<[number, number, number]> = [
[0xff, 0x00, 0x00],
[0xff, 0x99, 0x00],
[0xff, 0xff, 0x00],
[0x00, 0xff, 0x00],
[0x00, 0x99, 0xff],
[0xff, 0x00, 0xff],
[0x99, 0x33, 0xff],
];
class FakeGroupCallVideoFrameSource implements VideoFrameSource {
private readonly sourceArray: Uint8Array;
private readonly dimensions: [number, number];
constructor(width: number, height: number, r: number, g: number, b: number) {
const length = width * height * 4;
this.sourceArray = new Uint8Array(length);
for (let i = 0; i < length; i += 4) {
this.sourceArray[i] = r;
this.sourceArray[i + 1] = g;
this.sourceArray[i + 2] = b;
this.sourceArray[i + 3] = 255;
}
this.dimensions = [width, height];
}
receiveVideoFrame(destinationBuffer: Buffer): [number, number] | undefined {
// Simulate network jitter. Also improves performance when testing.
if (Math.random() < 0.5) {
return undefined;
}
destinationBuffer.set(this.sourceArray);
return this.dimensions;
}
}
/**
* This produces a fake video frame source that is a single color.
*
* The aspect ratio is fixed at 1.3 because that matches many of our stories.
*/
export function fakeGetGroupCallVideoFrameSource(
demuxId: number
): VideoFrameSource {
const color = COLORS[demuxId % COLORS.length];
if (!color) {
throw new Error('Expected a color, but it was not found');
}
const [r, g, b] = color;
return new FakeGroupCallVideoFrameSource(13, 10, r, g, b);
}