Skip to content

feat(VideoManager): add HTTP MJPEG video source - #14730

Open
alireza787b wants to merge 19 commits into
mavlink:masterfrom
alireza787b:agent/http-mjpeg-video-source-v3
Open

feat(VideoManager): add HTTP MJPEG video source#14730
alireza787b wants to merge 19 commits into
mavlink:masterfrom
alireza787b:agent/http-mjpeg-video-source-v3

Conversation

@alireza787b

@alireza787b alireza787b commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Description

QGroundControl supports RTP, RTSP, and MPEG transports, but not the multipart MJPEG feeds exposed by many cameras and small video servers.

This adds a generic HTTP MJPEG Video Stream source:

  • accepts full http:// and https:// URLs in Video settings;
  • builds souphttpsrc ! multipartdemux ! jpegparse into QGC's existing decode/display receiver;
  • packages the required Soup, multipart, JPEG parser, and JPEG decoder plugins;
  • keeps TLS verification strict, disables redirects, rejects URL user information, strips fragments, and uses logging-safe diagnostics; and
  • uses the existing network-video watchdog and reconnect policy.

The endpoint must return multipart/x-mixed-replace with JPEG parts. Web pages, single-image URLs, arbitrary HTTP video files, request-header authentication, and recording-policy changes are out of scope.

This branch carries #14727 and #14729 as independently reviewable prerequisites. After those prerequisites, the HTTP transport slice is 15 files with 415 additions and 18 deletions. The Windows software-frame fallback from #14728 is now in master.

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation update
  • Refactoring
  • CI/Build changes
  • Other

Testing

  • Tested locally
  • Added/updated unit tests
  • Tested with simulator (not applicable)
  • Tested with camera hardware

An integrated candidate containing this transport was manually exercised on Linux, Windows, and Android. The camera-free GStreamer test starts a local HTTP server, sends a real multipart JPEG response, and requires frame delivery through appsink. Additional tests cover source properties, plugin packaging, malformed or unsafe URLs, TLS policy, and diagnostic handling.

Exact PR head: af1201e83ffce288ba2a4ea3bd900ce818d41725.

Exact-head QGC CI is complete: Linux x64/arm64 release builds, unit and integration tests, ASan/UBSan, coverage thresholds, Windows, macOS, iOS, Android, Docker, custom-plugin, and CodeQL checks passed. Linux evidence: run 30598322052.

Platforms Tested

  • Linux
  • Windows
  • macOS (QGC exact-head CI build)
  • Android
  • iOS (QGC exact-head CI build)

Flight Stacks Tested

Not applicable; this change is confined to video reception.

Screenshots

Not applicable; the UI addition uses the existing Video settings layout.

Checklist

  • I have read the Contribution Guidelines
  • I have read the Code of Conduct
  • My code follows the project coding standards
  • I have added tests that prove the feature works
  • New and existing unit and integration tests pass at the exact head in QGC CI

Related Issues


By submitting this pull request, I confirm that my contribution is made under the terms of the project's dual license (Apache 2.0 and GPL v3).

@github-actions

github-actions Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Build Results

Platform Status

Platform Status Details
Linux Passed View
Windows Passed View
MacOS Passed View
Android Passed View

All builds passed.

Pre-commit

Check Status Details
pre-commit Failed (non-blocking) View

Pre-commit hooks: 0 passed, 0 failed, 0 skipped.

Test Results

linux-coverage-integration: 37 passed, 0 skipped
linux-coverage-unit: 119 passed, 0 skipped
linux-sanitizers-integration: 20 passed, 0 skipped
linux-sanitizers-unit: 119 passed, 0 skipped
Total: 295 passed, 0 skipped

Code Coverage

Coverage: 69.4%

No baseline available for comparison

Artifact Sizes

Artifact Size
QGroundControl 222.00 MB
QGroundControl-aarch64 179.43 MB
QGroundControl-installer-AMD64 137.90 MB
QGroundControl-installer-AMD64-ARM64 80.36 MB
QGroundControl-installer-ARM64 109.16 MB
QGroundControl-linux 87.47 MB
QGroundControl-mac 87.47 MB
QGroundControl-x86_64 191.66 MB
No baseline available for comparison

Updated: 2026-07-31 02:52:43 UTC • Commit: af1201e • Triggered by: Windows

@codecov

codecov Bot commented Jul 28, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 12.24490% with 172 lines in your changes missing coverage. Please review.
✅ Project coverage is 32.63%. Comparing base (f29efd3) to head (af1201e).
⚠️ Report is 236 commits behind head on master.

Files with missing lines Patch % Lines
...anager/VideoReceiver/GStreamer/GstSourceFactory.cc 21.59% 17 Missing and 52 partials ⚠️
...anager/VideoReceiver/GStreamer/GstVideoReceiver.cc 0.00% 63 Missing ⚠️
src/Settings/VideoSettings.cc 15.38% 17 Missing and 5 partials ⚠️
src/VideoManager/VideoManager.cc 0.00% 13 Missing ⚠️
src/Camera/VehicleCameraControl.cc 0.00% 4 Missing ⚠️
...anager/VideoReceiver/GStreamer/GStreamerHelpers.cc 0.00% 0 Missing and 1 partial ⚠️

❌ Your patch check has failed because the patch coverage (12.24%) is below the target coverage (30.00%). You can increase the patch coverage or adjust the target coverage.

Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##           master   #14730      +/-   ##
==========================================
+ Coverage   25.47%   32.63%   +7.16%     
==========================================
  Files         769      784      +15     
  Lines       65912    67686    +1774     
  Branches    30495    31376     +881     
==========================================
+ Hits        16788    22092    +5304     
+ Misses      37285    30679    -6606     
- Partials    11839    14915    +3076     
Flag Coverage Δ
unittests 32.63% <12.24%> (+7.16%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/Settings/VideoSettings.h 100.00% <100.00%> (+85.71%) ⬆️
src/Utilities/Network/QGCNetworkHelper.h 0.00% <ø> (ø)
...Manager/VideoReceiver/GStreamer/GstVideoReceiver.h 0.00% <ø> (ø)
...anager/VideoReceiver/GStreamer/GStreamerHelpers.cc 38.65% <0.00%> (+1.96%) ⬆️
src/Camera/VehicleCameraControl.cc 9.52% <0.00%> (+7.77%) ⬆️
src/VideoManager/VideoManager.cc 7.91% <0.00%> (+6.01%) ⬆️
src/Settings/VideoSettings.cc 30.00% <15.38%> (+14.21%) ⬆️
...anager/VideoReceiver/GStreamer/GstVideoReceiver.cc 3.03% <0.00%> (+0.13%) ⬆️
...anager/VideoReceiver/GStreamer/GstSourceFactory.cc 29.38% <21.59%> (ø)

... and 469 files with indirect coverage changes


Continue to review full report in Codecov by Harness.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update ed09a05...af1201e. Read the comment docs.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@alireza787b
alireza787b marked this pull request as ready for review July 28, 2026 16:40
@alireza787b
alireza787b requested a review from HTRamsey as a code owner July 28, 2026 16:40
@alireza787b

Copy link
Copy Markdown
Contributor Author

@HTRamsey, this focused HTTP MJPEG source is ready for review. Exact head e9303ae571c41fdc1b4d78dba088042e21769212 passed QGC Linux release, unit, integration, coverage and sanitizer jobs; all Windows, Android, macOS, iOS, Docker, pre-commit and CodeQL checks are green as well. After #14727 and #14729, the transport itself is 15 files (+423/-27). The test uses a local multipart server and requires a real JPEG sample through appsink, so no camera or external service is needed. The endpoint contract is deliberately anonymous multipart MJPEG only; authentication remains outside this PR.

@DonLakeFlyer DonLakeFlyer added this to the Release V5.2 milestone Jul 29, 2026
@alireza787b
alireza787b force-pushed the agent/http-mjpeg-video-source-v3 branch from e9303ae to 2cc2389 Compare July 31, 2026 01:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CMake Docs github_actions Pull requests that update GitHub Actions code size/M Tests Video

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants