# Windows Sender Demo This is a simplified demo of the Windows Host sender for DisplayFlow. It demonstrates: 1. Screen Capture using Desktop Duplication API (DXGI). 2. Hardware/Software H.264 Encoding using **FFmpeg** (switched from Media Foundation for better compatibility). 3. Network Transmission using UDP. ## Prerequisites - Windows 10/11 - Visual Studio 2022 or later (with C++ Desktop Development) - CMake 3.10+ - **FFmpeg Development Libraries** (Shared) - Ensure you have the `include` and `lib` directories. - Example path: `D:\tools\ffmpeg-8.0.1-full_build-shared` ## Build 1. Open a terminal (Developer Command Prompt for VS or PowerShell). 2. Navigate to this directory: ```cmd cd demo\windows_sender ``` 3. Create a build directory: ```cmd mkdir build cd build ``` 4. Configure and Build (Replace path with your FFmpeg location): ```cmd cmake .. -DFFMPEG_ROOT="D:/tools/ffmpeg-8.0.1-full_build-shared" cmake --build . --config Release ``` *Note: If your FFmpeg is installed elsewhere, change the path accordingly.* 5. **Important**: Copy FFmpeg DLLs to the executable directory. - Copy `avcodec-*.dll`, `avutil-*.dll`, `swscale-*.dll`, `avformat-*.dll` from your FFmpeg `bin` directory to `demo\windows_sender\build\Release`. ## Run Run the executable with optional arguments: Target IP, Port, and Output File. ```cmd .\Release\WindowsSenderDemo.exe [TargetIP] [Port] [OutputFile] ``` ### Examples 1. **Basic Streaming** (Default: 127.0.0.1:8888): ```cmd .\Release\WindowsSenderDemo.exe ``` 2. **Specify Target**: ```cmd .\Release\WindowsSenderDemo.exe 192.168.1.100 8888 ``` 3. **Stream and Save to File** (for debugging): ```cmd .\Release\WindowsSenderDemo.exe 127.0.0.1 8888 debug.h264 ``` You can play the saved `debug.h264` using VLC player to verify the encoding quality. ## Implementation Details - **ScreenCapture**: Uses `IDXGIOutputDuplication` to capture desktop frames. - **VideoEncoder**: - Uses **FFmpeg (libx264)** for encoding. - Performs **BGRA to YUV420P** color conversion using `libswscale`. - Configured for low latency (`zerolatency` tune, `ultrafast` preset). - **NetworkSender**: Fragments the H.264 stream into UDP packets (MTU ~1400 bytes) and sends them to the target. ## Protocol The demo uses a simple custom protocol for feasibility verification: - **Packet Header** (Network Layer): `FrameID` (4B), `FragID` (2B), `TotalFrags` (2B). - **Frame Header** (Application Layer, in first fragment/reassembled): `Timestamp` (8B), `Width` (4B), `Height` (4B), `Type` (4B), `Size` (4B). - **Payload**: H.264 NAL units.