0.4.0 mostly complete milestone

This commit is contained in:
Brad Stein 2025-06-29 04:17:44 -05:00
parent 32c27efd8d
commit e93b5a7bde
3 changed files with 19 additions and 15 deletions

View File

@ -55,7 +55,10 @@ impl InputAggregator {
WriteFlag::NORMAL, // <-- write access needed for EVIOCGRAB WriteFlag::NORMAL, // <-- write access needed for EVIOCGRAB
) { ) {
Ok(d) => d, Ok(d) => d,
Err(e) => { } Err(e) => {
warn!("❌ open {path}: {e}");
continue;
}
}; };
// non-blocking so fetch_events never stalls the whole loop // non-blocking so fetch_events never stalls the whole loop

View File

@ -15,7 +15,7 @@ use tokio_stream::wrappers::ReceiverStream;
use tonic::{Request, Response, Status}; use tonic::{Request, Response, Status};
use tonic::transport::Server; use tonic::transport::Server;
use tonic_reflection::server::{Builder as ReflBuilder}; 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_subscriber::{filter::EnvFilter, fmt, prelude::*};
use tracing_appender::non_blocking::WorkerGuard; use tracing_appender::non_blocking::WorkerGuard;
@ -175,7 +175,7 @@ impl Relay for Handler {
1 => "/dev/lesavka_r_eye", 1 => "/dev/lesavka_r_eye",
_ => return Err(Status::invalid_argument("monitor id must be 0 or 1")), _ => 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) let s = video::eye_ball(dev, id, 6_000)
.await .await
.map_err(|e| Status::internal(format!("{e:#}")))?; .map_err(|e| Status::internal(format!("{e:#}")))?;

View File

@ -44,24 +44,25 @@ pub async fn eye_ball(
let eye = EYE_ID[id as usize]; let eye = EYE_ID[id as usize];
gst::init().context("gst init")?; 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!( // let desc = format!(
// "v4l2src device={dev} io-mode=mmap ! \ // "v4l2src device={dev} io-mode=mmap ! \
// queue max-size-time=0 ! tsdemux name=d ! \ // queue max-size-buffers=0 max-size-bytes=0 max-size-time=0 ! tsdemux name=d ! \
// d. ! h264parse config-interval=1 ! queue ! appsink name=vsink emit-signals=true \ // video/x-h264,stream-format=byte-stream,alignment=au,profile=high ! tsdemux name=d ! \
// d. ! aacparse ! queue ! appsink name=asink emit-signals=true" // 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)? let pipeline = gst::parse::launch(&desc)?
.downcast::<gst::Pipeline>() .downcast::<gst::Pipeline>()
.expect("pipeline down-cast"); .expect("not a pipeline");
let sink = pipeline let sink = pipeline
.by_name("sink") .by_name("sink")