@nuralogix.ai/tf-face-tracker-worker-ts
Version:
MediaPipe Tasks-vision Face Landmarker - Module Worker
267 lines (248 loc) • 8.25 kB
TypeScript
interface MediaDevice {
device: InputDeviceInfo;
capabilities: MediaTrackCapabilities;
}
interface VideoTrackCapabilities {
[x: string]: {
isSupported: boolean;
min: number;
max: number;
step: number;
value: number;
}
}
interface CameraStatusChanged extends CustomEvent {
detail: {
isOpen: boolean;
capabilities: VideoTrackCapabilities;
}
}
interface SelectedCameraChanged extends CustomEvent {
detail: {
deviceId: string;
}
}
interface DevicePixelRatioChanged extends CustomEvent {
detail: {
devicePixelRatio: number;
}
}
declare class CameraController extends EventTarget {
#private;
mediaDevices: MediaDevice[];
selectedDeviceId: string;
cameraStream: MediaStream;
cameraWidth: number;
cameraHeight: number;
cameraFrameRate: number;
settingsInputIds: string[];
standardSettingsIds: string[];
videoTrackCapabilities: VideoTrackCapabilities;
constructor();
static init(): CameraController;
updatePixelRatio(): void;
/** Enumerates the list of video input devices
*
* The label field for each MediaDevice will be empty if the permission
* is not equal to `granted`
*/
enumerate(): Promise<MediaDevice[]>;
/** Request access to the camera
*
* If the camera permission is set to `prompt` then it will ask for permission.
*
* If permission is granted it returns `true` otherwise it returns `false`
*/
requestPermission(): Promise<{
isPermissionGranted: boolean;
cameras: MediaDevice[];
}>;
/** Populates the list of `mediaDevices` and sets `selectedDeviceId`
*
* If the camera permission is set to `prompt` then it will prompt for permission.
*
* If camera permission granted it will populate `mediaDevices` with the list of available cameras and
* sets `selectedDeviceId` to that of the first available camera.
*
* If camera permission is blocked, it will set `mediaDevices` to [] and `selectedDeviceId` to an empty string
*
*/
list(): Promise<void>;
/** Change selected media device Id
*
*/
setDeviceId(deviceId: string): void;
/** Start camera
*
*/
start(frameWidth: number, frameHeight: number): Promise<boolean>;
/** Return VideoTrackCapabilities
*
*/
getVideoTrackCapabilities(): VideoTrackCapabilities;
/** Stop camera
*
*/
stop(): void;
getCameraStatusEvent(isOpen: boolean): CameraStatusChanged;
getSelectedDeviceChangedEvent(): SelectedCameraChanged;
getDeviceAspectRatioChangedEvent(): DevicePixelRatioChanged;
}
interface VideoControllerInterface {
getBytesCallback(bytes: number): void;
videoLoadedCallback(isLoaded: boolean): Promise<void>;
videoEndedCallback(): void;
mimeCodec: string;
videoSource: HTMLSourceElement;
canvas: HTMLCanvasElement;
bytesDownloaded: number;
isVideoLoaded: boolean;
videoFrameCallback: VideoFrameRequestCallback;
ctx: CanvasRenderingContext2D | null;
mediaStream: MediaStream | null;
}
interface VideoControllerSettings {
mimeCodec: string,
getBytesCallback: (bytes: number) => void,
videoLoadedCallback: (isLoaded: boolean) => Promise<void>
videoEndedCallback: () => void;
}
declare class VideoController implements VideoControllerInterface {
mimeCodec: string;
videoElement: HTMLVideoElement;
videoSource: HTMLSourceElement;
canvas: HTMLCanvasElement;
mediaStream: MediaStream | null;
bytesDownloaded: number;
isVideoLoaded: boolean;
ctx: CanvasRenderingContext2D | null;
static init(settings: VideoControllerSettings): VideoController;
constructor(settings: VideoControllerSettings);
getBytesCallback(bytes: number): void;
videoLoadedCallback(isLoaded: boolean): Promise<void>;
videoEndedCallback(): void;
videoFrameCallback(now: DOMHighResTimeStamp, metadata: VideoFrameCallbackMetadata): void;
captureFromCanvas(): void;
captureFromVideoElement(): void;
setMediaStream(): void;
getBuffer(url: string): Promise<ArrayBuffer | undefined>;
init(url: string): Promise<void>;
}
interface ImageSequenceSettings {
url: string,
imageName: {
prefix: string;
numberOfDigits: number;
extension: string;
}
}
interface ImageSequenceMediaStreamReadyEvent extends CustomEvent {
detail: {
isReady: boolean;
}
}
declare class ImageSequenceController extends EventTarget {
canvas: HTMLCanvasElement;
ctx: CanvasRenderingContext2D | null;
imageBitmaps: ImageBitmap[];
canDrawImage: boolean;
settings: ImageSequenceSettings;
static init(settings: ImageSequenceSettings, videoEndedCallback: () => void): ImageSequenceController;
constructor(settings: ImageSequenceSettings, videoEndedCallback: () => void);
videoEndedCallback(): void;
getImageName(sequence: number): string;
getImageBitmapFromUrl(url: string): Promise<ImageBitmap>;
getImageBitmapFromArrayOfUrls(urls: string[]): Promise<void>;
setImageBitmaps(imageBitmaps: ImageBitmap[]): void;
drawImageBitmapOnCanvas(imageBitmap: ImageBitmap): void;
getMediaStreamReadyEvent(isReady: boolean): ImageSequenceMediaStreamReadyEvent;
drawImagesOnCanvas(): void;
}
interface BytesDownloaded extends CustomEvent {
detail: {
bytes: number;
url: string;
done: boolean;
}
}
interface BytesDownloadError extends CustomEvent {
detail: {
url: string;
error: unknown;
}
}
declare class AssetDownloader extends EventTarget {
#private;
static init(): AssetDownloader;
isSimdSupported(): Promise<boolean>;
dispatch(eventType: string, payload: unknown): void;
getBytesDownloadedEvent(bytes: number, url: string, done: boolean): BytesDownloaded;
getBytesDownloadErrorEvent(url: string, error: unknown): BytesDownloadError;
/** Decompresses a Brotli compressed/based 64 encoded string and returns an ArrayBuffer */
decompressBrotli(compressedBuffer: string): ArrayBufferLike;
/** Returns either an ArrayBuffer or undefined */
fetchAsset(url: string, decompress: boolean): Promise<ArrayBuffer | undefined>;
}
declare const utils: {
/**
* Example usage:
*
* ```js
* const camera = CameraController.init();
* ```
*
*/
CameraController: typeof CameraController;
/**
* Example usage:
*
* ```js
* const video = VideoController.init({
* mimeCodec: 'video/mp4',
* getBytesCallback: () => {},
* videoLoadedCallback: async () => {}
*});
* ```
*
*/
VideoController: typeof VideoController;
/**
* Example usage:
*
* ```js
* const imageSequence = ImageSequenceController.init({
url: 'http://localhost/frames/',
imageName: {
prefix: 'img',
numberOfDigits: 4,
extension: 'jpg',
}
});
* ```
*
*/
ImageSequenceController: typeof ImageSequenceController;
/**
* Example usage:
*
* ```js
* const assetDownloader = AssetDownloader.init();
* const onBytesDownloaded = (e: CustomEvent) => {
const { bytes, url, done } = e.detail;
console.log(bytes, url, done);
};
assetDownloader.addEventListener('bytesDownloaded', onBytesDownloaded as EventListener);
const onDownloadedError = (e: CustomEvent) => {
const { error, url } = e.detail;
console.log(error, url);
};
assetDownloader.addEventListener('downloadedError', onDownloadedError as EventListener);
*
* const isSimdSupported = await assetDownloader.isSimdSupported();
* const arrayBuffer = await assetDownloader.fetchAsset(url);
* ```
*
*/
AssetDownloader: typeof AssetDownloader;
};
export { type BytesDownloadError, type BytesDownloaded, type CameraStatusChanged, type DevicePixelRatioChanged, type ImageSequenceMediaStreamReadyEvent, type SelectedCameraChanged, utils as default };