feat: Phase 1 MVP with audit fixes — Wayland screen capture + VAAPI encoding
Phase 1 MVP implementation of wl-webrtc: Wayland screen capture tool with hardware-accelerated VAAPI H.264 encoding and WebTransport output. Includes all 9 runtime bug fixes from code audit (fix-audit-issues plan): CRITICAL: - C2: h264_metadata BSF with repeat_sps/repeat_pps in encode pipeline - C4: FpsLimit wired as timing gate in on_copy_complete HIGH: - C3+A2: DRM device discovery via dmabuf feedback MainDevice event, unified resolve_drm_path() helper (CLI > compositor > auto > fallback) - H2: Separate physical_size (mm) from mode_size (pixels) in wl_output - H1+A3: Multi-output warning + named-output-not-found error MEDIUM: - M5: tv_sec u32->u64 to avoid Y2106 timestamp truncation - M4: Guard against SHM Buffer event (DMA-BUF only) Key components: - src/avhw.rs: FFmpeg VAAPI encoder + filter graph + BSF pipeline - src/state.rs: Wayland event loop + output negotiation + screencopy - src/cap_wlr_screencopy.rs: wlr-screencopy capture source - src/fps_limit.rs: Frame rate limiting with configurable target - src/transform.rs: Frame format conversion utilities
This commit is contained in:
+45
@@ -0,0 +1,45 @@
|
||||
use clap::Parser;
|
||||
|
||||
#[derive(Parser, Debug, Clone)]
|
||||
#[command(name = "wl-webrtc", about = "Wayland screen capture and encoding tool")]
|
||||
pub struct Args {
|
||||
/// Output file path (e.g., output.mp4, output.mkv)
|
||||
#[arg(short, long)]
|
||||
pub output: String,
|
||||
|
||||
/// Wayland output name to capture
|
||||
#[arg(long)]
|
||||
pub output_name: Option<String>,
|
||||
|
||||
/// Target frames per second
|
||||
#[arg(long, default_value_t = 30)]
|
||||
pub fps: u32,
|
||||
|
||||
/// Video codec (h264 only for MVP)
|
||||
#[arg(long, default_value = "h264")]
|
||||
pub codec: String,
|
||||
|
||||
/// Hardware acceleration method (vaapi only for MVP)
|
||||
#[arg(long, default_value = "vaapi")]
|
||||
pub hw_accel: String,
|
||||
|
||||
/// DRM render device path (e.g., /dev/dri/renderD128)
|
||||
#[arg(long)]
|
||||
pub drm_device: Option<String>,
|
||||
|
||||
/// Target bitrate in bits per second
|
||||
#[arg(long)]
|
||||
pub bitrate: Option<u64>,
|
||||
|
||||
/// Group of Pictures (GOP) size
|
||||
#[arg(long)]
|
||||
pub gop_size: Option<u32>,
|
||||
|
||||
/// Enable verbose logging
|
||||
#[arg(short, long)]
|
||||
pub verbose: bool,
|
||||
|
||||
/// Port for WebTransport server (Phase 2, unused in MVP)
|
||||
#[arg(long, default_value_t = 0)]
|
||||
pub port: u16,
|
||||
}
|
||||
Reference in New Issue
Block a user