session tweak, update docs
This commit is contained in:
@@ -1,54 +1,71 @@
|
||||
// Server pipeline — Phase 2 (stub) + planned architecture
|
||||
// Receiver machine (X11, RTX 3080, NVDEC)
|
||||
// Server pipeline — current implementation
|
||||
// Receiver machine (mcrndeb: X11, RTX 3080, NVDEC)
|
||||
digraph server_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"]
|
||||
|
||||
net [label="TCP :4444" shape=parallelogram fillcolor="#1e2a3e" color="#89b4fa"]
|
||||
python [label="Python app\n(stream/manager.py)" shape=parallelogram fillcolor="#2a2a3e" color="#cba6f7"]
|
||||
net [label="TCP :4447\n(WirePacket)" shape=parallelogram fillcolor="#1e2a3e" color="#89b4fa"]
|
||||
python [label="Python GUI\n(cht app)" shape=parallelogram fillcolor="#2a2a3e" color="#cba6f7"]
|
||||
|
||||
subgraph cluster_implemented {
|
||||
label="Implemented (Phase 2)" fontcolor="#a6e3a1" color="#a6e3a1" fontname="monospace"
|
||||
subgraph cluster_rust {
|
||||
label="cht-server (Rust)" fontcolor="#a6e3a1" color="#a6e3a1" fontname="monospace"
|
||||
|
||||
listener [label="Listener\n─────────────\nTCP accept loop\nspawns task per client\nreads WirePacket headers\ncounts video/audio pkts\nlogs keyframes + ts"
|
||||
listener [label="Listener\n─────────────\nTCP accept\nreads WirePacket\nroutes by type:\n Video → ffmpeg + scene relay\n Audio → ADTS file\n Control → session lifecycle"
|
||||
fillcolor="#1e2d3e" color="#89b4fa"]
|
||||
|
||||
ffmpeg_rec [label="ffmpeg subprocess\n─────────────\nH.264 pipe:0 → 2 outputs:\n 1. fMP4 (frag_keyframe)\n 2. UDP :4445 (mpegts)"
|
||||
fillcolor="#1e2d3e" color="#89b4fa"]
|
||||
|
||||
scene_relay [label="Scene Relay\n─────────────\nUnix socket (scene.sock)\nbuffers latest keyframe\nbest-effort: drops if slow\n100ms write timeout"
|
||||
fillcolor="#1e2d3e" color="#89b4fa"]
|
||||
|
||||
audio_writer [label="Audio Writer\n─────────────\nADTS header + raw AAC\n→ stream/audio.aac"
|
||||
fillcolor="#1e2d3e" color="#89b4fa"]
|
||||
|
||||
active_session [label="active-session\n─────────────\nfile at data/active-session\nPython polls to discover\nsession dir" shape=note
|
||||
fillcolor="#2a2a3e" color="#585b70"]
|
||||
}
|
||||
|
||||
subgraph cluster_planned {
|
||||
label="Planned" fontcolor="#f38ba8" color="#f38ba8" fontname="monospace" style=dashed
|
||||
subgraph cluster_python {
|
||||
label="Python (cht app)" fontcolor="#cba6f7" color="#cba6f7" fontname="monospace"
|
||||
|
||||
decoder [label="Decoder (Phase 3)\n─────────────\nNVDEC H.264 → NV12\nGPU frames" fillcolor="#2d1e1e" color="#f38ba8"]
|
||||
scene [label="Scene Detector (Phase 3)\n─────────────\nffmpeg select filter\nin-process (no subprocess)\nJPEG → frames/\nframes/index.json" fillcolor="#2d1e1e" color="#f38ba8"]
|
||||
audio [label="Audio Extractor (Phase 4)\n─────────────\nAAC decode\nWAV chunks → audio/" fillcolor="#2d1e1e" color="#f38ba8"]
|
||||
writer [label="Segment Writer (Phase 3)\n─────────────\nfMP4 segments → stream/\nkeyframe boundaries" fillcolor="#2d1e1e" color="#f38ba8"]
|
||||
framebuf [label="Frame Buffer (Phase 6)\n─────────────\nGPU ring buffer ~300 frames\nscrub: GPU→CPU on demand\n→ /dev/shm/cht_scrub_frame" fillcolor="#2d1e1e" color="#f38ba8"]
|
||||
ipc [label="IPC Server (Phase 5)\n─────────────\nUnix socket JSON-lines\ncommands: start/stop/get_frame\nevents: frame_detected/audio_chunk/…" fillcolor="#2d1e1e" color="#f38ba8"]
|
||||
scene_ffmpeg [label="Scene Detector\n─────────────\nconnects to scene.sock\npipes H.264 → ffmpeg:\n CUDA decode\n select=gt(scene,thresh)\n showinfo → timestamps\n MJPEG → JPEG frames"
|
||||
fillcolor="#2d2038" color="#cba6f7"]
|
||||
|
||||
audio_extract [label="Audio Extractor\n─────────────\nreads audio.aac\nffmpeg → 16kHz mono WAV\nchunks + transcript WAVs"
|
||||
fillcolor="#2d2038" color="#cba6f7"]
|
||||
|
||||
transcriber [label="Transcriber\n─────────────\nfaster-whisper (CUDA)\nsegment grouping\nslider: chunk size + lines/group"
|
||||
fillcolor="#2d2038" color="#cba6f7"]
|
||||
}
|
||||
|
||||
// Flow — implemented
|
||||
// Flow — Rust server
|
||||
net -> listener [label="WirePacket"]
|
||||
listener -> ffmpeg_rec [label="H.264 video"]
|
||||
listener -> scene_relay [label="H.264 copy\n+ keyframe flag"]
|
||||
listener -> audio_writer [label="AAC audio"]
|
||||
listener -> active_session [style=dashed label="on SessionStart"]
|
||||
|
||||
// Flow — planned
|
||||
listener -> decoder [style=dashed label="H.264 payload"]
|
||||
decoder -> scene [style=dashed label="NV12 frame"]
|
||||
decoder -> writer [style=dashed label="encoded pkt"]
|
||||
decoder -> framebuf [style=dashed label="GPU frame"]
|
||||
decoder -> audio [style=dashed label="audio pkt"]
|
||||
scene -> ipc [style=dashed label="frame_detected"]
|
||||
audio -> ipc [style=dashed label="audio_chunk"]
|
||||
writer -> ipc [style=dashed label="segment_completed"]
|
||||
ipc -> python [style=dashed label="JSON-lines\n(Unix socket)"]
|
||||
// Flow — Python scene detection
|
||||
scene_relay -> scene_ffmpeg [label="raw H.264\n(Unix socket)" color="#a6e3a1"]
|
||||
|
||||
// Outputs
|
||||
frames_dir [label="frames/\nindex.json + *.jpg" shape=folder fillcolor="#2a2a3e" color="#585b70"]
|
||||
audio_dir [label="audio/\n*.wav chunks" shape=folder fillcolor="#2a2a3e" color="#585b70"]
|
||||
stream_dir [label="stream/\n*.mp4 segments" shape=folder fillcolor="#2a2a3e" color="#585b70"]
|
||||
shm [label="/dev/shm/cht_scrub_frame\nraw RGBA pixels" shape=folder fillcolor="#2a2a3e" color="#585b70"]
|
||||
fmp4 [label="stream/\nrecording_000.mp4\n(fragmented MP4)" shape=folder fillcolor="#2a2a3e" color="#585b70"]
|
||||
udp_live [label="UDP :4445\n(mpegts → mpv)" shape=parallelogram fillcolor="#2a2a3e" color="#585b70"]
|
||||
aac_file [label="stream/\naudio.aac\n(ADTS-wrapped)" shape=folder fillcolor="#2a2a3e" color="#585b70"]
|
||||
frames [label="frames/\nindex.json + *.jpg" shape=folder fillcolor="#2a2a3e" color="#585b70"]
|
||||
audio_dir [label="audio/\nchunk_*.wav\ntranscript_*.wav" shape=folder fillcolor="#2a2a3e" color="#585b70"]
|
||||
|
||||
scene -> frames_dir [style=dashed]
|
||||
audio -> audio_dir [style=dashed]
|
||||
writer -> stream_dir [style=dashed]
|
||||
framebuf -> shm [style=dashed label="get_frame cmd"]
|
||||
ffmpeg_rec -> fmp4 [label="copy"]
|
||||
ffmpeg_rec -> udp_live [label="copy"]
|
||||
audio_writer -> aac_file
|
||||
scene_ffmpeg -> frames [label="JPEG on\nscene change"]
|
||||
audio_extract -> audio_dir
|
||||
audio_dir -> transcriber [label="WAV chunks"]
|
||||
|
||||
// Python reads files
|
||||
aac_file -> audio_extract [label="reads" style=dashed]
|
||||
active_session -> python [label="discovers\nsession dir" style=dashed]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user