Features

Complete FMV exploitation, built into your GIS

22 documented requirements, 33 formal correctness properties, and a full analyst workflow β€” from raw STANAG 4609 ingestion to reviewed, exported georeferenced intelligence.

QGIS 4.x ArcGIS Pro 3.x Air-Gap First 22 Requirements
Requirement 1

Video Ingestion & Playback

Robust local and live video playback using embedded open-source media engines β€” no OS-level codec packs required.

βœ” Local file playback

Open .ts, .mp4, .mxf files with embedded KLV metadata. Playback starts within 3 seconds.

βœ” Live UDP/RTP streams

Connect to multicast URIs like udp://@:5000. Stream connects and plays within 5 seconds.

βœ” Full playback controls

Play, Pause, Stop, Seek, Fast-Forward (2Γ—/4Γ—/8Γ—), Rewind (2Γ—/4Γ—/8Γ—). Frame-accurate seeking within 1 video frame.

βœ” Dockable video panel

Video renders in a dockable panel within the host GIS β€” no separate window. QGIS: QgsDockWidget. ArcGIS: WPF DockPane.

Platform Implementation

🌿QGIS 4.x
from PyQt6.QtMultimedia import QMediaPlayer, QAudioOutput
from PyQt6.QtMultimediaWidgets import QVideoWidget
from PyQt6.QtMultimedia import QVideoSink

# Qt6 backend: WMF (Win), GStreamer (Linux), AVFoundation (macOS)
player = QMediaPlayer()
video_widget = QVideoWidget()
sink = QVideoSink()         # for frame extraction
audio = QAudioOutput()

player.setVideoOutput(video_widget)
player.setAudioOutput(audio)
player.setVideoSink(sink)   # intercepts decoded frames
πŸ—ΊArcGIS Pro (C#)
// LibVLCSharp β€” plays every format VLC supports
using LibVLCSharp.Shared;
using LibVLCSharp.WPF;

var libVlc = new LibVLC();
var mediaPlayer = new MediaPlayer(libVlc);
// Attach to WPF VideoView in DockPane XAML
videoView.MediaPlayer = mediaPlayer;

// Open UDP stream
var media = new Media(libVlc, "udp://@:5000",
    FromType.FromLocation);
mediaPlayer.Play(media);
Requirements 2–4

KLV Metadata Extraction & Synchronization

All 146 MISB ST 0601 tags extracted synchronously with video frames. The telemetry panel updates within 100 ms; seek operations resolve within 200 ms.

Supported MISB Standards

StandardDescriptionKey TagsQGISArcGIS
MISB ST 0601 UAS Datalink Local Set β€” primary standard, 146 tags Sensor Lat/Lon/Alt, Heading, FOV, Corner Coords 82–89 βœ”βœ”
MISB ST 0102 Security Metadata β€” classification & releasability Tag 1: Security Class, Tag 12: Country βœ”βœ”
MISB EG 0104 Predator UAV Basic Universal Metadata Set (legacy) Mapped to ST 0601 equivalents βœ”βœ”
MISB ST 0903 VMTI β€” AI detection output encoding VTarget Pack: location, bbox, class, confidence βœ”βœ”

Universal Key (MISB ST 0601)

// 16-byte sliding-window search
06 0E 2B 34 02 0B 01 01
0E 01 03 01 01 00 00 00

// BER length decoding
// TLV iteration β†’ named MisbTelemetry fields

Telemetry Fields Extracted

Tag 13/14
Sensor Lat / Lon
Β±0.17 Β΅deg precision
Tag 15
Sensor Altitude
βˆ’900 to 19,000 m, Β±0.3 m
Tags 5/6/7
Heading / Pitch / Roll
0.005Β° precision
Tags 16/17
H/V FOV
0–180Β°, Β±0.003Β°
Tag 21
Slant Range
0–5,000 km, Β±0.076 m
Tags 82–89
Corner Coordinates
4 corners Γ— Lat/Lon, Β±3.5 Β΅deg
Tags 23/24
Frame Centre
Lat / Lon of scene centre
Tag 2
Precision Timestamp
Unix microseconds

DJI Telemetry Multiplexing

Combine a raw DJI video file with its CSV flight log to produce a STANAG 4609-compliant MPEG-TS with embedded MISB ST 0601 KLV. Linear interpolation fills timestamp gaps >1 second.

DJI CSV β†’ MISB FFmpeg mux Linear interpolation
Requirements 5–6

Geospatial Visualization & Map–Video Sync

Live sensor footprint, platform tracking, and bidirectional synchronization between the video timeline and the map canvas.

πŸ”·

FOV Footprint Polygon

Dynamic filled polygon on the map canvas updated at β‰₯5 Hz. Computed from KLV Corner Coordinates (Tags 82–89) when present, or via ray-casting from sensor pose + DEM when absent.

✈️

Platform & Trajectory

Real-time platform position point with heading indicator. Cumulative flight trajectory polyline accumulates for the full session. Frame-centre crosshair updates synchronously.

πŸ”

Bidirectional Sync

Map→Video: Click a location in a historical footprint to seek to that timestamp. Video→Map: Scrubbing the seek bar updates footprint, platform, and crosshair within 200 ms.

Georeferencing Algorithms

Primary Homography (Tags 82–89)

When MISB Corner Coordinates are present, a perspective transform matrix is computed from the four corner pixels to four WGS 84 geographic positions. Achieves <15 m CEP at 100–5,000 m AGL.

# QGIS Python
M = cv2.getPerspectiveTransform(src_px, dst_geo)
geo_pt = cv2.perspectiveTransform(px_pt, M)
Fallback Ray-Casting from Sensor Pose

When corner coordinates are absent: unit look vector from Sensor Lat/Lon/Alt, rotated by Heading/Pitch/Roll, intersects the DEM (or WGS 84 ellipsoid). Output converted ECEF β†’ WGS84.

3D Scene Support

Both platforms support rendering footprint, platform position, and trajectory on a 3D scene layer alongside the 2D map canvas.

QGIS 3D Map Canvas QgsRay3D ArcGIS SceneView DEM Integration

DEM Terrain Correction

When a DEM raster layer is active in the project, the georeferencing engine applies terrain-corrected ray-casting to account for elevation relief in footprint vertex computation.

Requirements 7–10

AI Vision Pipeline

Automated frame extraction, dual-mode inference, and georeferenced detection output β€” all running on a background thread so the GIS UI stays responsive.

β†’ See the full AI Pipeline documentation
πŸ“Έ

Frame Extraction

Time-based (0.1–30 fps), telemetry-triggered (FOV change threshold), or manual ROI. Each frame is associated with its synchronous KLV packet.

🧠

Local ONNX Inference

YOLOv11 .onnx model. Pre-process β†’ letterbox 640Γ—640 β†’ normalize [0,1] β†’ run β†’ NMS β†’ filter by confidence threshold. Supports user-supplied custom models.

🌐

Remote OpenRouter

JPEG encode β†’ Base64 β†’ OpenAI Chat Completions JSON β†’ POST. 3-attempt exponential back-off (1s/2s/4s). Supports QWEN3-VL and Llama-3.2-Vision.

Requirements 12–13

Analyst Review Workflow

AI detections are proposals, not facts. GeoFMV gives analysts full control over what enters the final intelligence product.

Review Panel

πŸ–Ό
Detection preview

Cropped bounding box image, class label, confidence score, geographic coordinates

βœ…
Accept

Marks detection ACCEPTED β€” included in all exports

❌
Reject

Marks detection REJECTED β€” excluded from exports but record is kept

🏷
Reclassify

Update the class label β†’ detection marked RECLASSIFIED with analyst attribution

Map Symbology by Status

Detection points on the map use visually distinct symbols based on review status β€” making the spatial distribution of accepted, pending, and rejected detections immediately readable.

ACCEPTED β€” styled by class label (distinct colour per class)
PENDING β€” awaiting analyst decision
REJECTED β€” suppressed from exports
RECLASSIFIED β€” analyst-assigned label

Detection Layer Schema

detection_id  UUID          unique
class_label   String(64)    YOLO class / OpenRouter
confidence    Float         0.0–1.0
timestamp_us  Int64         Unix microseconds
sensor_alt_m  Float         altitude at detection
bbox_x/y/w/h  Int           pixel bounding box
geo_point     Point WGS84   georeferenced location
review_status String(16)    PENDING/ACCEPTED/...
analyst_label String(64)    nullable
Requirements 11, 14, 17

Export & Interoperability

Export filtered detection layers in standard geospatial formats, embed AI results as MISB ST 0903 VMTI metadata, and generate georeferenced frame mosaics as GeoTIFFs.

Vector Export Formats

FormatExtensionUse Case
GeoPackage.gpkgOGC standard, all attributes, portable
Shapefile.shpLegacy enterprise GIS compatibility
GeoJSON.geojsonWeb interchange, JavaScript tooling
KML.kmlGoogle Earth, legacy GIS systems
OGC Moving Features.mf-jsonTemporal trajectory export (OGC 20-036)

Export Filters

βœ” Review status (accepted / rejected / all)
βœ” Class label (e.g., export "vehicle" only)
βœ” Confidence threshold slider
βœ” Time range (start / end timestamp)

VMTI Output (MISB ST 0903)

Each accepted AI detection is encoded as a MISB ST 0903 VTarget Pack and embedded into the output MPEG-TS alongside the original video and MISB ST 0601 KLV stream.

VTargetPack {
  target_id:    uint16   // unique
  target_lat:   float64  // Tag 17
  target_lon:   float64  // Tag 18
  bbox_tl_x:    uint16   // Tag 10
  bbox_tl_y:    uint16   // Tag 11
  bbox_width:   uint16   // Tag 12
  bbox_height:  uint16   // Tag 13
  confidence:   uint8    // Tag 23 (0–255)
  classification: str    // Tag 102
}

GeoTIFF Mosaic (Req. 17)

Extract frames at a configurable interval, georeference each via the KLV corner coordinates, and assemble into a single GeoTIFF mosaic (nearest-neighbour blending, user-specified CRS). Each exported frame embeds MISB timestamp, sensor altitude, and platform heading as GeoTIFF metadata tags.

Requirements 15–18

Advanced Analyst Tools

Video filters, object tracking, mosaic generation, and measurement tools β€” all georeferenced and integrated with the host GIS.

Video Filters (Req. 15)

⬛
Greyscale

Converts display to greyscale

πŸ“
Canny Edge Detection

OpenCV Canny algorithm highlights structural edges

β˜€οΈ
CLAHE Auto-Contrast

Contrast Limited Adaptive Histogram Equalisation

↔️
Horizontal Mirror

Flips video horizontally

🌿
NDVI

Normalised Difference Vegetation Index (requires NIR channel)

Active filters are applied to both the display output and frames sent to the AI inference engine.

Object Tracking (Req. 16)

Select a bounding box in the video frame to initialise a tracker. The tracked position is georeferenced on each frame and appended to a track polyline on the map canvas.

MOSSE Tracker CSRT Tracker OpenCV Track Polyline Layer

Measurement & Drawing (Req. 18)

βœ” Distance measurement tool β€” ground distance in metres via homography
βœ” Point, line, polygon drawing annotations on the video frame
βœ” Annotations are georeferenced and added to the Detection Layer
βœ” Annotations are hidden when seeking to a different timestamp