/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import VideoWorkerContext from '@/common/components/video/VideoWorkerContext'; import {TrackerOptions} from '@/common/tracker/Trackers'; import {TrackerResponse} from '@/common/tracker/TrackerTypes'; import {RLEObject} from '@/jscocotools/mask'; export type Point = [x: number, y: number]; export type SegmentationPoint = [...point: Point, label: 0 | 1]; export type FramePoints = Array | undefined; export type Mask = DatalessMask & { data: Blob | RLEObject; }; export type DatalessMask = { shape: number[]; bounds: [[number, number], [number, number]]; isEmpty: boolean; }; export type Tracklet = { id: number; color: string; thumbnail: string | null; points: FramePoints[]; masks: Mask[]; isInitialized: boolean; }; export type BaseTracklet = Omit & { masks: DatalessMask[]; }; export type StreamingState = | 'none' | 'required' | 'requesting' | 'aborting' | 'aborted' | 'partial' | 'full'; export interface ITracker { startSession(videoUrl: string): Promise; closeSession(): Promise; createTracklet(): void; deleteTracklet(trackletId: number): Promise; updatePoints( frameIndex: number, objectId: number, points: SegmentationPoint[], ): Promise; clearPointsInFrame(frameIndex: number, objectId: number): Promise; clearPointsInVideo(): Promise; streamMasks(frameIndex: number): Promise; abortStreamMasks(): void; enableStats(): void; } export abstract class Tracker implements ITracker { protected _context: VideoWorkerContext; constructor(context: VideoWorkerContext, _options?: TrackerOptions) { this._context = context; } abstract startSession(videoUrl: string): Promise; abstract closeSession(): Promise; abstract createTracklet(): void; abstract deleteTracklet(trackletId: number): Promise; abstract updatePoints( frameIndex: number, objectId: number, points: SegmentationPoint[], ): Promise; abstract clearPointsInFrame( frameIndex: number, objectId: number, ): Promise; abstract clearPointsInVideo(): Promise; abstract streamMasks(frameIndex: number): Promise; abstract abortStreamMasks(): void; abstract enableStats(): void; // PRIVATE FUNCTIONS protected _sendResponse( action: T['action'], message?: Omit, transfer?: Transferable[], ): void { self.postMessage( { action, ...message, }, { transfer, }, ); } }