Skip to content

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

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

feat(VideoManager): add HTTP MJPEG video source#14730
alireza787b wants to merge 8 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 avoids logging invalid URL values; 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.

The branch is rebased directly onto current master. The deterministic local HTTP fixture from #14729 is already in master; #14727 is independent and is no longer carried by this branch. The HTTP feature diff is 15 files with 416 additions and 18 deletions.

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.

Current head: d5ab4fbd5980522a788cb186c17c424d51b2ca8c. Fresh exact-head CI is running after the rebase. The previous integrated head completed the QGC Linux x64/arm64, unit/integration, sanitizer, coverage, Windows, macOS, iOS, Android, Docker, custom-plugin, and CodeQL checks.

Platforms Tested

  • Linux
  • Windows
  • macOS (QGC CI build)
  • Android
  • iOS (QGC 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 current exact head (running)

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: 2 passed, 76 failed, 7 skipped.

Test Results

linux-coverage-integration: 52 passed, 0 skipped
linux-coverage-unit: 185 passed, 0 skipped
linux-sanitizers-integration: 31 passed, 0 skipped
linux-sanitizers-unit: 185 passed, 0 skipped
Total: 453 passed, 0 skipped

Code Coverage

Coverage: 70.6%

No baseline available for comparison

Artifact Sizes

Artifact Size
QGroundControl 253.30 MB
QGroundControl-aarch64 177.37 MB
QGroundControl-installer-AMD64 128.50 MB
QGroundControl-installer-AMD64-ARM64 70.82 MB
QGroundControl-installer-ARM64 99.61 MB
QGroundControl-linux 85.19 MB
QGroundControl-mac 85.19 MB
QGroundControl-x86_64 189.65 MB
No baseline available for comparison

Updated: 2026-09-03 04:43:24 UTC • Commit: d5ab4fb • Triggered by: Linux

@codecov

codecov Bot commented Jul 28, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 23.95833% with 73 lines in your changes missing coverage. Please review.
✅ Project coverage is 34.48%. Comparing base (f29efd3) to head (d5ab4fb).
⚠️ Report is 354 commits behind head on master.

Files with missing lines Patch % Lines
...anager/VideoReceiver/GStreamer/GstSourceFactory.cc 23.75% 16 Missing and 45 partials ⚠️
src/Settings/VideoSettings.cc 33.33% 3 Missing and 3 partials ⚠️
src/VideoManager/VideoManager.cc 0.00% 5 Missing ⚠️
...anager/VideoReceiver/GStreamer/GstVideoReceiver.cc 0.00% 1 Missing ⚠️

❌ Your patch check has failed because the patch coverage (23.95%) 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%   34.48%   +9.01%     
==========================================
  Files         769      945     +176     
  Lines       65912    85719   +19807     
  Branches    30495    39531    +9036     
==========================================
+ Hits        16788    29561   +12773     
+ Misses      37285    36474     -811     
- Partials    11839    19684    +7845     
Flag Coverage Δ
unittests 34.48% <23.95%> (+9.01%) ⬆️

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%) ⬆️
...anager/VideoReceiver/GStreamer/GstVideoReceiver.cc 5.33% <0.00%> (+2.43%) ⬆️
src/VideoManager/VideoManager.cc 7.96% <0.00%> (+6.06%) ⬆️
src/Settings/VideoSettings.cc 30.85% <33.33%> (+15.06%) ⬆️
...anager/VideoReceiver/GStreamer/GstSourceFactory.cc 30.13% <23.75%> (ø)

... and 658 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 a8150b0...d5ab4fb. 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
@alireza787b
alireza787b force-pushed the agent/http-mjpeg-video-source-v3 branch from af1201e to b482159 Compare August 20, 2026 09:12
@github-actions github-actions Bot added size/S and removed size/M labels Aug 20, 2026
@alireza787b

Copy link
Copy Markdown
Contributor Author

Restacked this branch onto current master (cf80b98d1) at b482159230f4941135ec298310e94e11fa70930c.

Local checks passed: JSON parsing, git diff --check, whitespace/EOF hooks, and cmake -P cmake/GStreamer/tests/test_plugin_policy.cmake. Fresh exact-head CI is running. The current link-check failure is an unrelated HTTP 500 from an existing URL in docs/en/qgc-user-guide/troubleshooting/qgc_setup.md; this branch does not touch that file.

@alireza787b
alireza787b force-pushed the agent/http-mjpeg-video-source-v3 branch from b482159 to d5ab4fb Compare September 3, 2026 03:10
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/S Tests Video

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants