Spaces:
Runtime error
Runtime error
/** | |
* 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<SegmentationPoint> | 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<Tracklet, 'masks'> & { | |
masks: DatalessMask[]; | |
}; | |
export type StreamingState = | |
| 'none' | |
| 'required' | |
| 'requesting' | |
| 'aborting' | |
| 'aborted' | |
| 'partial' | |
| 'full'; | |
export interface ITracker { | |
startSession(videoUrl: string): Promise<void>; | |
closeSession(): Promise<void>; | |
createTracklet(): void; | |
deleteTracklet(trackletId: number): Promise<void>; | |
updatePoints( | |
frameIndex: number, | |
objectId: number, | |
points: SegmentationPoint[], | |
): Promise<void>; | |
clearPointsInFrame(frameIndex: number, objectId: number): Promise<void>; | |
clearPointsInVideo(): Promise<void>; | |
streamMasks(frameIndex: number): Promise<void>; | |
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<void>; | |
abstract closeSession(): Promise<void>; | |
abstract createTracklet(): void; | |
abstract deleteTracklet(trackletId: number): Promise<void>; | |
abstract updatePoints( | |
frameIndex: number, | |
objectId: number, | |
points: SegmentationPoint[], | |
): Promise<void>; | |
abstract clearPointsInFrame( | |
frameIndex: number, | |
objectId: number, | |
): Promise<void>; | |
abstract clearPointsInVideo(): Promise<void>; | |
abstract streamMasks(frameIndex: number): Promise<void>; | |
abstract abortStreamMasks(): void; | |
abstract enableStats(): void; | |
// PRIVATE FUNCTIONS | |
protected _sendResponse<T extends TrackerResponse>( | |
action: T['action'], | |
message?: Omit<T, 'action'>, | |
transfer?: Transferable[], | |
): void { | |
self.postMessage( | |
{ | |
action, | |
...message, | |
}, | |
{ | |
transfer, | |
}, | |
); | |
} | |
} | |