DJI media
DJI dock aircraft capture photos and videos to the aircraft’s SD card during flight. On landing, the dock copies the SD card to its own storage and streams the files to S3 through ARGUS’s media pipeline. Everything is indexed into Firestore so the mission ops view can surface captured media per flight task.
Capture source
- Photos — triggered by waypoint actions in the wayline, by a manual shutter press during DRC, or by the aircraft’s intelligent-tracking mode.
- Videos — recorded on DRC video-record start, or on a waypoint’s
startRecordaction. - PPK / RTK sidecars —
.obs(RINEX observations),.rtk(dock base-station observations),.mrk(per-photo exposure marker),.nav(GNSS navigation message),.dat(raw binary). Captured whenever the aircraft flies with RTK enabled.
The aircraft writes to its own SD card; no upload happens in-flight.
On-landing upload
When the aircraft lands and re-docks:
- The dock copies the SD-card contents to its internal storage. This takes 30–300 s depending on payload size.
- The dock publishes
file_upload_progressover MQTT as it queues files for upload. - For each file, the dock requests a presigned S3 PUT from argus-api and uploads directly to S3 — no intermediate hop.
- On each completed upload, the dock publishes
fileupload_callbackwith{file_name, object_key, sub_file_type, fingerprint, size, ...}. - argus-dji receives the callback and, inside a Firestore transaction,
writes a
dji_media/{id}doc with:deviceSn/dockSn;- S3 bucket + key;
fileName,fileSize,fileType(photo/video);flightTaskId— link back to the wayline / ad-hoc flight that produced it;position(lat/lng/alt of capture, from the aircraft EXIF);capturedAt+uploadedAttimestamps.
Media appears in the Media tab of the mission ops view within seconds of the dock’s upload completing.
PPK / RTK sidecar handling
Sidecar files share the base name of their photo (DJI_0042.JPG pairs
with DJI_0042.MRK). argus-dji tags them with a subFileType so the
mission post-processor can bundle each photo with its exposure marker
and the dock’s raw observations for centimetre-accurate georeferencing.
A typical RTK mission produces ~7 files per image:
.JPG— the image itself..MRK— per-photo exposure timestamp.- Per-mission:
.obs,.rtk,.nav,.dat, and the wayline result JSON.
If PPK post-processing is enabled for the mission, argus-media picks up the sidecars and runs the RTKLib-based post-solver to produce corrected EXIF coordinates — replacing the raw aircraft-side position.
Deduplication
Each upload’s object_key is unique per capture session, but a dock can
retry a fileupload_callback (e.g. on a transient Firestore write
failure). argus-dji writes each dji_media/{id} doc inside a Firestore
transaction keyed by object_key: if a doc for that key already
exists, the retry is a no-op. This keeps the index clean even on flaky
links.
Prioritisation
By default, media uploads run in the dock’s native order (oldest capture first). For an active mission where the operator needs a specific image now (e.g. a target-of-interest photo for triage), the mission-ops view offers a Prioritise action on any pending upload row:
- ARGUS publishes a
media_upload_prioritizeMQTT service to the dock with theobject_key. - The dock re-sorts its upload queue so that key jumps to the front.
- Status on the row flips from
queuedtouploadingwithin a few seconds.
Aspirational: bulk-prioritise by wayline waypoint id (so a critical-waypoint batch jumps the whole queue) is planned but not yet wired — at present the operator prioritises one file at a time.
Download / view
In the mission Media tab, clicking any thumbnail calls
GET /api/dji/media/{id}/url and redirects to a short-lived presigned
S3 GET. Video files open in an inline player; photos in a lightbox.
Bulk-download zips are generated server-side from the selection.
Storage location
Per-org bucket, prefixed by dock serial and capture date:
s3://{org-bucket}/dji-media/{dockSn}/{yyyy-mm-dd}/{filename}. Retention
follows the org’s storage policy (default 1 year, configurable under
Admin → Organisation → Storage).
Troubleshooting
- Photos appear but videos don’t. Videos can be hundreds of MB —
filter the media tab on
fileType: videoand wait; the progress bar on the dock tile shows the dock’s upload queue depth. - PPK sidecars missing. The aircraft was flown with RTK disabled — sidecars are only emitted when RTK was active at capture time.
- Thumbnails empty. Thumbnail generation is lazy; the first open kicks off the generator. Refresh after ~10 s.
Related
- Flight tasks — the wayline dispatch that triggers most captures.
- DRC — manual capture path.
- Dock tile — surfaces dock storage used / total.