// Client pipeline data flow // Sender machine (Wayland, VAAPI GPU) digraph client_pipeline { graph [fontname="monospace" bgcolor="#1e1e2e" rankdir=TB pad="0.6" splines=polyline] node [fontname="monospace" fontcolor="#cdd6f4" style=filled shape=box fillcolor="#313244" color="#585b70" margin="0.25,0.12"] edge [color="#585b70" fontname="monospace" fontcolor="#a6adc8" labelfontname="monospace"] // Hardware drm [label="/dev/dri/card0\n(KMS scanout)" shape=cylinder fillcolor="#1e3a2f" color="#a6e3a1"] vaapi [label="/dev/dri/renderD128\n(VAAPI)" shape=cylinder fillcolor="#1e3a2f" color="#a6e3a1"] pulse [label="PulseAudio\n─────────────\nmonitor: default_sink.monitor\nmic: default-source" shape=cylinder fillcolor="#1e3a2f" color="#a6e3a1"] net [label="TCP :4447\nmcrndeb" shape=parallelogram fillcolor="#1e2a3e" color="#89b4fa"] subgraph cluster_main { label="main thread (tokio async)" fontcolor="#a6adc8" color="#45475a" fontname="monospace" wait_server [label="wait_for_server\n─────────────\nretry connect / 2s\nCtrl-C to cancel" fillcolor="#2d2038" color="#cba6f7"] session_start [label="session_start\n─────────────\nid: YYYYMMDD_HHMMSS\nvideo + audio params" fillcolor="#2d2038" color="#cba6f7"] mux [label="select!\npkt_rx | keepalive | ctrl-c" fillcolor="#2d2038" color="#cba6f7"] write [label="BufWriter\nwrite_packet()" fillcolor="#1e2d3e" color="#89b4fa"] shutdown [label="Shutdown\n─────────────\npipeline.stop() (5s timeout)\nSessionStop (2s timeout)\nsingle Ctrl-C" fillcolor="#2d2038" color="#cba6f7"] } subgraph cluster_subprocess { label="Subprocess backend (default)" fontcolor="#a6adc8" color="#45475a" fontname="monospace" ffmpeg_cli [label="ffmpeg subprocess\n─────────────\nkmsgrab → VAAPI h264\n+ PulseAudio inputs:\n amix(monitor, mic)\noutput: NUT pipe" fillcolor="#1e2d3e" color="#89b4fa"] demux [label="NUT Demuxer\n─────────────\nffmpeg-next in-process\nfinds video + audio streams\nsends EncodedPacket\n { data, pts, media_type }" fillcolor="#1e2d3e" color="#89b4fa"] chan [label="mpsc::channel(64)\nEncodedPacket" shape=parallelogram fillcolor="#2d2038" color="#cba6f7"] } subgraph cluster_direct { label="VaapiDirect backend (experimental)" fontcolor="#6c7086" color="#45475a" fontname="monospace" style=dashed capture [label="KmsCapture\n─────────────\nDRM_PRIME frames" fillcolor="#2d1e1e" color="#f38ba8"] encoder [label="VaapiEncoder\n─────────────\nhwmap → scale_vaapi\nh264_vaapi QP=20" fillcolor="#2d1e1e" color="#f38ba8"] } // Flow — subprocess drm -> ffmpeg_cli [label="kmsgrab"] vaapi -> ffmpeg_cli [label="h264_vaapi"] pulse -> ffmpeg_cli [label="-f pulse\nmonitor + mic"] ffmpeg_cli -> demux [label="NUT pipe\n(stdout)"] demux -> chan [label="EncodedPacket\n(Video or Audio)"] // Flow — direct (dashed, experimental) drm -> capture [style=dashed] vaapi -> encoder [style=dashed] capture -> encoder [style=dashed label="DRM_PRIME"] encoder -> chan [style=dashed] // Flow — main chan -> mux wait_server -> session_start session_start -> write mux -> write [label="WirePacket\nVideo | Audio"] write -> net mux -> shutdown [label="Ctrl-C or\nchannel closed"] // Types note types [label="WirePacket types\n─────────────\nVideo: H.264 NALUs + keyframe flag\nAudio: AAC frames\nControl: SessionStart/Stop/Keepalive" shape=note fillcolor="#2a2a3e" color="#585b70"] }