10870bc6c9
Wire the first end-to-end pipeline: capture -> encode -> packetize -> UDP -> depacketize -> decode -> render. - UdpRtpTransport: raw POSIX UDP sockets (IPv4 via getaddrinfo), a receive jthread woken by socket close on stop; port 0 skips binding so the sender uses an OS-assigned source port. ASIO stays deferred to the signaling phase per ARCHITECTURE.md. - SdlRenderer: SDL3 window/renderer with RGBA texture upload; the texture is recreated on resolution change. RendererFactory now returns RendererResult so SDL init failures carry a message, mirroring the codec/capture error patterns. - screencast binary: parse_cli plus SenderPipeline/ReceiverPipeline per the app scaffolds; the sender creates its encoder once capture reports real dimensions, the receiver keeps a bounded 3-frame queue to hold latency down and renders on its own thread until the window closes. cli argv signature fixed to 'const char* const*' so main's argv converts implicitly. - Encoder: drop AV_CODEC_FLAG_GLOBAL_HEADER so libx264 repeats SPS/PPS in-band at each keyframe -- the receiver decodes from the bitstream alone, which also makes mid-stream joins and later PLI recovery work without out-of-band parameter negotiation. The round-trip test now exercises exactly that path. - tests: new udp-loopback integration test pushes synthetic frames through a real localhost socket and decodes 10/10 frames with the right dimensions; valgrind clean (loopback + codec). meson test 4/4. Manual validation on the desktop (receiver window shows the captured desktop) is documented in docs/RUNBOOK.md.
28 lines
704 B
C++
28 lines
704 B
C++
#pragma once
|
|
|
|
#include <optional>
|
|
#include <string_view>
|
|
#include <variant>
|
|
|
|
namespace sc {
|
|
|
|
struct SendCommand {
|
|
std::string_view target = "monitor"; // monitor, window, region
|
|
std::string_view peer_address; // optional
|
|
int bitrate_kbps = 4000;
|
|
};
|
|
|
|
struct ReceiveCommand {
|
|
std::string_view peer_address; // optional
|
|
int local_rtp_port = 5004;
|
|
};
|
|
|
|
using Command = std::variant<SendCommand, ReceiveCommand>;
|
|
|
|
// Parse command line arguments. Prints usage and returns std::nullopt on error.
|
|
// `argv` is `char const* const*` so both `main`'s `char**` and const arrays
|
|
// convert implicitly.
|
|
std::optional<Command> parse_cli(int argc, const char* const argv[]);
|
|
|
|
} // namespace sc
|