diff --git a/client/src/input/inputs.rs b/client/src/input/inputs.rs index e333f01..a1adcce 100644 --- a/client/src/input/inputs.rs +++ b/client/src/input/inputs.rs @@ -55,7 +55,10 @@ impl InputAggregator { WriteFlag::NORMAL, // <-- write access needed for EVIOCGRAB ) { Ok(d) => d, - Err(e) => { … } + Err(e) => { + warn!("❌ open {path}: {e}"); + continue; + } }; // non-blocking so fetch_events never stalls the whole loop diff --git a/server/src/main.rs b/server/src/main.rs index 170f72b..65da0c2 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -15,7 +15,7 @@ use tokio_stream::wrappers::ReceiverStream; use tonic::{Request, Response, Status}; use tonic::transport::Server; use tonic_reflection::server::{Builder as ReflBuilder}; -use tracing::{info, warn, error, trace}; +use tracing::{info, warn, error, trace, debug}; use tracing_subscriber::{filter::EnvFilter, fmt, prelude::*}; use tracing_appender::non_blocking::WorkerGuard; @@ -175,7 +175,7 @@ impl Relay for Handler { 1 => "/dev/lesavka_r_eye", _ => return Err(Status::invalid_argument("monitor id must be 0 or 1")), }; - info!("🎥 streaming {dev}"); + debug!("🎥 streaming {dev}"); let s = video::eye_ball(dev, id, 6_000) .await .map_err(|e| Status::internal(format!("{e:#}")))?; diff --git a/server/src/video.rs b/server/src/video.rs index 8e2591d..ba20c50 100644 --- a/server/src/video.rs +++ b/server/src/video.rs @@ -44,24 +44,25 @@ pub async fn eye_ball( let eye = EYE_ID[id as usize]; gst::init().context("gst init")?; + let desc = format!( + "v4l2src device=\"{dev}\" io-mode=mmap ! \ + queue ! tsdemux name=d ! \ + d. ! h264parse disable-passthrough=true config-interval=-1 ! \ + video/x-h264,stream-format=byte-stream,alignment=au ! \ + appsink name=vsink emit-signals=true max-buffers=32 drop=true" + ); // let desc = format!( // "v4l2src device={dev} io-mode=mmap ! \ - // queue max-size-time=0 ! tsdemux name=d ! \ - // d. ! h264parse config-interval=1 ! queue ! appsink name=vsink emit-signals=true \ - // d. ! aacparse ! queue ! appsink name=asink emit-signals=true" + // queue max-size-buffers=0 max-size-bytes=0 max-size-time=0 ! tsdemux name=d ! \ + // video/x-h264,stream-format=byte-stream,alignment=au,profile=high ! tsdemux name=d ! \ + // d. ! h264parse config-interval=1 ! queue ! appsink name=vsink emit-signals=true \ + // d. ! aacparse ! queue ! h264parse config-interval=1 ! appsink name=sink \ + // emit-signals=true drop=false sync=false" // ); - let desc = format!( - "v4l2src device={dev} io-mode=mmap ! \ - queue max-size-buffers=0 max-size-bytes=0 max-size-time=0 ! tsdemux name=d ! \ - video/x-h264,stream-format=byte-stream,alignment=au,profile=high ! tsdemux name=d ! \ - d. ! h264parse config-interval=1 ! queue ! appsink name=vsink emit-signals=true \ - d. ! aacparse ! queue ! h264parse config-interval=1 ! appsink name=sink \ - emit-signals=true drop=false sync=false" - ); let pipeline = gst::parse::launch(&desc)? .downcast::() - .expect("pipeline down-cast"); + .expect("not a pipeline"); let sink = pipeline .by_name("sink")