22 documented requirements, 33 formal correctness properties, and a full analyst workflow β from raw STANAG 4609 ingestion to reviewed, exported georeferenced intelligence.
Robust local and live video playback using embedded open-source media engines β no OS-level codec packs required.
Open .ts, .mp4, .mxf files with embedded KLV metadata. Playback starts within 3 seconds.
Connect to multicast URIs like udp://@:5000. Stream connects and plays within 5 seconds.
Play, Pause, Stop, Seek, Fast-Forward (2Γ/4Γ/8Γ), Rewind (2Γ/4Γ/8Γ). Frame-accurate seeking within 1 video frame.
Video renders in a dockable panel within the host GIS β no separate window. QGIS: QgsDockWidget. ArcGIS: WPF DockPane.
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
// 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);
All 146 MISB ST 0601 tags extracted synchronously with video frames. The telemetry panel updates within 100 ms; seek operations resolve within 200 ms.
| Standard | Description | Key Tags | QGIS | ArcGIS |
|---|---|---|---|---|
| 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 | β | β |
// 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
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.
Live sensor footprint, platform tracking, and bidirectional synchronization between the video timeline and the map canvas.
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.
Real-time platform position point with heading indicator. Cumulative flight trajectory polyline accumulates for the full session. Frame-centre crosshair updates synchronously.
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.
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)
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.
Both platforms support rendering footprint, platform position, and trajectory on a 3D scene layer alongside the 2D map canvas.
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.
Automated frame extraction, dual-mode inference, and georeferenced detection output β all running on a background thread so the GIS UI stays responsive.
Time-based (0.1β30 fps), telemetry-triggered (FOV change threshold), or manual ROI. Each frame is associated with its synchronous KLV packet.
YOLOv11 .onnx model. Pre-process β letterbox 640Γ640 β
normalize [0,1] β run β NMS β filter by confidence threshold.
Supports user-supplied custom models.
JPEG encode β Base64 β OpenAI Chat Completions JSON β POST. 3-attempt exponential back-off (1s/2s/4s). Supports QWEN3-VL and Llama-3.2-Vision.
AI detections are proposals, not facts. GeoFMV gives analysts full control over what enters the final intelligence product.
Cropped bounding box image, class label, confidence score, geographic coordinates
Marks detection ACCEPTED β included in all exports
Marks detection REJECTED β excluded from exports but record is kept
Update the class label β detection marked RECLASSIFIED with analyst attribution
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.
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
Export filtered detection layers in standard geospatial formats, embed AI results as MISB ST 0903 VMTI metadata, and generate georeferenced frame mosaics as GeoTIFFs.
| Format | Extension | Use Case |
|---|---|---|
| GeoPackage | .gpkg | OGC standard, all attributes, portable |
| Shapefile | .shp | Legacy enterprise GIS compatibility |
| GeoJSON | .geojson | Web interchange, JavaScript tooling |
| KML | .kml | Google Earth, legacy GIS systems |
| OGC Moving Features | .mf-json | Temporal trajectory export (OGC 20-036) |
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
}
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.
Video filters, object tracking, mosaic generation, and measurement tools β all georeferenced and integrated with the host GIS.
Converts display to greyscale
OpenCV Canny algorithm highlights structural edges
Contrast Limited Adaptive Histogram Equalisation
Flips video horizontally
Normalised Difference Vegetation Index (requires NIR channel)
Active filters are applied to both the display output and frames sent to the AI inference engine.
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.