Service
app.application.services.tracking.serviceTracking worker orchestration and multi-object tracking management.
See Also
TrackingWorkerManager— coordinates worker lifecycleTrackingWorkerFactoryAdapter— creates tracking workers
Layer: Application. Context: Coordinates domain state and infrastructure to complete application use cases.
TrackingService
Orchestrates multi-object tracking operations and worker lifecycle.
Responsibilities
- Start background
TrackingWorkerfor multi-frame tracking. - Validate tracking prerequisites (layer data, worker view_state).
- Clear tracking output layers before starting new tracking.
- Synchronize tracking results from worker to
DataLayer.C. - Handle worker creation and view_state management.
Note
Creates TrackingWorker instances (runs in background thread).
Manages Layer C/D lifecycle (clears C before tracking, syncs after).
Validates the source layer and seeds missing Layer B frames from Layer A.
Does NOT manage tracking layer editing (delegates to TrackingLayerService).
Tracking Layers:
DataLayer.C — Post-processed tracking output (immutable, machine-written).
DataLayer.D — User-editable tracking results (eagerly seeded from C).
| PARAMETER | DESCRIPTION |
|---|---|
app
|
Application adapted for tracking-worker startup and result processing against session data.
TYPE:
|
__init__(app: Application)
get_detection_frame_coverage(s_id: SessionId) -> tuple[int, int]
Return detection-frame coverage and total video frames before tracking.
| PARAMETER | DESCRIPTION |
|---|---|
s_id
|
Session to inspect without changing its annotation layers.
TYPE:
|
| RETURNS | DESCRIPTION |
|---|---|
int
|
Pair of initialized Layer A frame count and video frame count. |
int
|
Empty detection results count as processed; absent frames do not. |
tuple[int, int]
|
Older/imported data can only provide evidence from stored entries, |
tuple[int, int]
|
not proof that a particular background worker completed. |
start_background_tracking(s_id: SessionId, strategy_name: str, source_layer_name: VideoDataLayer) -> None
Start background multi-object tracking on detection/tracking data.
| PARAMETER | DESCRIPTION |
|---|---|
s_id
|
Session ID.
TYPE:
|
strategy_name
|
Tracking algorithm (e.g., "Hungarian", "DeepSort").
TYPE:
|
source_layer_name
|
Source layer (
TYPE:
|
Note
Flow: start_background_tracking(s_id, strategy, source_layer) ├── Validate session ID is valid ├── Check no tracking already running ├── Validate source layer (A or B only), seeding missing B frames ├── Clear Layer C/D (immutable/editable tracking layers) ├── Create TrackingWorker with source data └──> Start worker in background thread
Error Handling:
Raises InvalidSessionIdException if session ID is invalid.
Raises TrackingWorkerAlreadyRunningException if tracking already running.
Raises UnsupportedLayerException if source layer is C or D (immutable).
Raises EmptyLayerException if source layer has no detections.
Side Effects:
Clears DataLayer.C and DataLayer.D to prepare for new tracking.
Creates and starts TrackingWorker thread.
sync_tracking_cache(s_id: SessionId) -> None
Synchronize tracking results from worker to DataLayer.C (immutable tracking output).
| PARAMETER | DESCRIPTION |
|---|---|
s_id
|
Session ID.
TYPE:
|
Note
Called after TrackingWorker finishes processing all frames.
Fetches tracking results from worker (dict of frame_index → [boxes]).
Overwrites DataLayer.C with post-processed tracking output.
Uninitialized DataLayer.D frames are eagerly seeded with the current filter.
Layer Updates: Layer.C — Updated with post-processed tracking output (immutable). Layer.D — Seeded for uninitialized frames while preserving existing edits.
Error Handling:
Raises InvalidSessionIdException if session ID invalid.
Raises TrackingWorkerNotFoundException if no worker exists for session.
Side Effects:
Overwrites all of DataLayer.C with new tracking data.
Preserves initialized DataLayer.D frames (including user edits).