diff --git a/README.md b/README.md index 3c7bdb2..69a7321 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,82 @@ DisplayStreamer is a high-performance, ultra-low latency desktop streaming application for Windows. Built with C# and .NET, it leverages DirectX 11 and Media Foundation to provide hardware-accelerated H.265 (HEVC) and H.264 video encoding and decoding. -Designed for seamless local network streaming, it features zero-configuration UDP auto-discovery, automatic client updates, and bypasses Windows power throttling to ensure a perfectly locked 60 FPS stream. \ No newline at end of file +Designed for seamless local network streaming, it features zero-configuration UDP auto-discovery, automatic client updates, and bypasses Windows power throttling to ensure a perfectly locked 60 FPS stream. + +## Features + +* **Hardware Acceleration**: Utilizes GPU hardware encoders/decoders (NVENC, AMF, QuickSync) via Media Foundation for H.265 (HEVC) or H.264 streaming. +* **Ultra-Low Latency**: Uses DXGI Desktop Duplication for zero-copy screen capture and DirectX 11 SwapChains for tear-free, hardware VSync rendering. +* **Zero-Configuration Discovery**: Clients automatically discover active servers on the local network via UDP broadcast. +* **Auto-Updating Clients**: If a client connects to a server running a different version, it automatically downloads the new executable into memory and restarts itself. +* **Multi-Monitor Support**: Select specific network adapters and individual displays to broadcast. +* **Smart Downscaling**: Automatically downscales 4K displays to 1080p using fast parallel CPU scaling to maintain network performance. +* **Performance Optimizations**: Bypasses Windows EcoQoS (Power Throttling), utilizes AVRT Pro Audio thread characteristics, and uses high-resolution waitable timers to prevent frame drops when minimized or out of focus. +* **Hardware Cursor Rendering**: Captures and renders the host's cursor accurately on the client side. + +## Tech Stack + +* **Language**: C# 12 +* **Framework**: .NET 8.0 (Windows Forms) +* **Graphics & Capture**: DirectX 11, DXGI (Desktop Duplication API) +* **Media Processing**: Media Foundation (MFT) +* **Libraries**: + * `SharpDX` + * `SharpDX.Direct3D11` + * `SharpDX.DXGI` + * `SharpDX.MediaFoundation` + +## System Requirements + +### Server (Host) +* **OS**: Windows 10 or Windows 11 +* **GPU**: A dedicated or integrated GPU with hardware H.265 (HEVC) or H.264 encoding support. +* **Network**: Gigabit Ethernet or Wi-Fi 6 recommended for optimal latency. + +### Client (Viewer) +* **OS**: Windows 10 or Windows 11 +* **GPU**: A GPU with hardware H.265 (HEVC) or H.264 decoding support. +* **Network**: Stable local network connection to the host. + +## Build Instructions + +1. **Prerequisites**: + * Install [Visual Studio 2026](https://visualstudio.microsoft.com/) with the **.NET desktop development** workload. + * Ensure the .NET 10.0 SDK is installed. +2. **Clone the Repository**: + ```bash + git clone https://git.churchofmalware.org/mastercodeon/DisplayStreamer.git + cd DisplayStreamer + ``` +3. **Restore NuGet Packages**: + Open the solution in Visual Studio and restore the required SharpDX packages: + * `SharpDX` + * `SharpDX.Direct3D11` + * `SharpDX.DXGI` + * `SharpDX.MediaFoundation` +4. **Build**: + Build the solution in `Release` mode to ensure optimal performance. + +## Usage + +The application acts as both the Server and the Client depending on how it is launched and configured. + +### Starting a Server +1. Launch `DisplayStreamer.exe`. +2. If no servers are detected on the network, it will default to **Server Mode**. (You can also manually switch modes using the button on the UI). +3. Select the **Network Adapters** you want to broadcast on. +4. Select the **Displays** you want to capture. +5. Click **Start Streaming**. The app will minimize to the system tray to save resources. Double-click the tray icon to restore it. + +### Connecting a Client +1. Launch `DisplayStreamer.exe` on another computer on the same network. +2. The app will automatically detect active servers and open in **Client Mode**. +3. Double-click a discovered server in the list (or select it and press Enter) to connect. +4. The stream will open in a borderless fullscreen window. +5. **Controls**: + * Press `ESC` to disconnect and close the viewer. + * Press `F1` to toggle the performance metrics overlay (FPS, Encode/Decode times). + +## License + +This project is licensed under the MIT License. See the `LICENSE` file for details. \ No newline at end of file