Summary
Allow a second machine on the LAN to act as a virtual monitor for the main machine. No HDMI cable. The main machine creates a virtual display, streams its content over the network, and the sub machine renders it fullscreen. Input from the sub machine flows back to the main machine.
Architecture
`
Main machine (server):
VDD creates virtual monitor
-> DXGI captures virtual display
-> FFmpeg encodes to H.264/H.265
-> StreamChunker splits into chunks
-> SecureSocket encrypts
-> TCP sends to client
Sub machine (client):
TCP receives chunks
-> SecureSocket decrypts
-> StreamChunker reassembles
-> FFmpeg decodes
-> Qt renders in fullscreen window
-> Input forwarded back to server
`
Dependencies
| Dependency |
Purpose |
License |
| Virtual Display Driver |
Virtual monitor creation |
MIT |
| FFmpeg (libavcodec) |
Video encoding/decoding |
LGPL 2.1 |
| DXGI (Windows SDK) |
Screen capture |
Proprietary |
Milestones
New modules
src/lib/display/ DisplayManager.h/cpp # Virtual display lifecycle ScreenCapture.h/cpp # DXGI capture VideoEncoder.h/cpp # FFmpeg encoding DisplayStreamServer.h/cpp # Server-side streaming DisplayStreamClient.h/cpp # Client-side receiving DisplayViewer.h/cpp # Qt fullscreen viewer
Protocol extensions
New messages added to the wire protocol:
| Message |
Direction |
Purpose |
| kMsgDisplayInit |
Server -> Client |
Start stream, send resolution |
| kMsgDisplayFrame |
Server -> Client |
Encoded video frame |
| kMsgDisplayEnd |
Server -> Client |
Stop stream |
| kMsgDisplayInput |
Client -> Server |
Input from display client |
| kMsgDisplayReady |
Client -> Server |
Client ready for frames |
Full design doc
See docs/dev/virtual-display-plan.md in the repository.
Scope
- Windows first (IddCx virtual display driver)
- Linux and macOS support planned for later
- Hardware encoding (NVENC/AMF/QSV) where available
- Software fallback via FFmpeg libx264
Summary
Allow a second machine on the LAN to act as a virtual monitor for the main machine. No HDMI cable. The main machine creates a virtual display, streams its content over the network, and the sub machine renders it fullscreen. Input from the sub machine flows back to the main machine.
Architecture
`
Main machine (server):
VDD creates virtual monitor
-> DXGI captures virtual display
-> FFmpeg encodes to H.264/H.265
-> StreamChunker splits into chunks
-> SecureSocket encrypts
-> TCP sends to client
Sub machine (client):
TCP receives chunks
-> SecureSocket decrypts
-> StreamChunker reassembles
-> FFmpeg decodes
-> Qt renders in fullscreen window
-> Input forwarded back to server
`
Dependencies
Milestones
New modules
src/lib/display/ DisplayManager.h/cpp # Virtual display lifecycle ScreenCapture.h/cpp # DXGI capture VideoEncoder.h/cpp # FFmpeg encoding DisplayStreamServer.h/cpp # Server-side streaming DisplayStreamClient.h/cpp # Client-side receiving DisplayViewer.h/cpp # Qt fullscreen viewerProtocol extensions
New messages added to the wire protocol:
Full design doc
See docs/dev/virtual-display-plan.md in the repository.
Scope