video update
This commit is contained in:
parent
8da4f36dc3
commit
3000871947
@ -88,7 +88,12 @@ impl LesavkaClientApp {
|
|||||||
let win1 = MonitorWindow::new(1, &el).expect("win1");
|
let win1 = MonitorWindow::new(1, &el).expect("win1");
|
||||||
|
|
||||||
let _ = el.run(move |_: Event<()>, _| {
|
let _ = el.run(move |_: Event<()>, _| {
|
||||||
|
static CNT: std::sync::atomic::AtomicU64 = std::sync::atomic::AtomicU64::new(0);
|
||||||
while let Ok(pkt) = video_rx.try_recv() {
|
while let Ok(pkt) = video_rx.try_recv() {
|
||||||
|
CNT.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
||||||
|
if CNT.load(std::sync::atomic::Ordering::Relaxed) % 300 == 0 {
|
||||||
|
tracing::debug!("🎥 received {} video packets", CNT.load(std::sync::atomic::Ordering::Relaxed));
|
||||||
|
}
|
||||||
match pkt.id {
|
match pkt.id {
|
||||||
0 => win0.push_packet(pkt),
|
0 => win0.push_packet(pkt),
|
||||||
1 => win1.push_packet(pkt),
|
1 => win1.push_packet(pkt),
|
||||||
|
|||||||
@ -29,7 +29,7 @@ impl MonitorWindow {
|
|||||||
let window = el
|
let window = el
|
||||||
.create_window(
|
.create_window(
|
||||||
WindowAttributes::default()
|
WindowAttributes::default()
|
||||||
.with_title(format!("Lesavka‑monitor‑{id}"))
|
.with_title(format!("Lesavka-eye-{id}"))
|
||||||
.with_decorations(true),
|
.with_decorations(true),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
@ -39,15 +39,22 @@ impl MonitorWindow {
|
|||||||
.field("alignment", &"au")
|
.field("alignment", &"au")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
let pipeline = gst::parse::launch(DESC)?
|
// let pipeline = gst::parse::launch(DESC)?
|
||||||
.downcast::<gst::Pipeline>()
|
// .downcast::<gst::Pipeline>()
|
||||||
.expect("pipeline down‑cast");
|
// .expect("pipeline down‑cast");
|
||||||
|
let pipeline: gst::Pipeline = gst::parse::launch(DESC)?
|
||||||
|
.downcast()
|
||||||
|
.expect("pipeline");
|
||||||
|
|
||||||
let src = pipeline
|
// let src = pipeline
|
||||||
.by_name("src")
|
// .by_name("src")
|
||||||
.expect("appsrc element not found")
|
// .expect("appsrc element not found")
|
||||||
.downcast::<gst_app::AppSrc>()
|
// .downcast::<gst_app::AppSrc>()
|
||||||
.expect("appsrc down‑cast");
|
// .expect("appsrc down‑cast");
|
||||||
|
let src: gst_app::AppSrc = pipeline.by_name("src")
|
||||||
|
.expect("appsrc")
|
||||||
|
.downcast()
|
||||||
|
.expect("appsrc");
|
||||||
|
|
||||||
src.set_caps(Some(&caps));
|
src.set_caps(Some(&caps));
|
||||||
src.set_format(gst::Format::Time); // downstream clock
|
src.set_format(gst::Format::Time); // downstream clock
|
||||||
@ -65,7 +72,11 @@ impl MonitorWindow {
|
|||||||
pub fn push_packet(&self, pkt: VideoPacket) {
|
pub fn push_packet(&self, pkt: VideoPacket) {
|
||||||
// Mutable so we can set the PTS:
|
// Mutable so we can set the PTS:
|
||||||
let mut buf = gst::Buffer::from_slice(pkt.data);
|
let mut buf = gst::Buffer::from_slice(pkt.data);
|
||||||
if let Some(ref mut b) = buf.get_mut() {
|
// if let Some(ref mut b) = buf.get_mut() {
|
||||||
|
// b.set_pts(Some(gst::ClockTime::from_useconds(pkt.pts)));
|
||||||
|
// }
|
||||||
|
{
|
||||||
|
let b = buf.get_mut().unwrap();
|
||||||
b.set_pts(Some(gst::ClockTime::from_useconds(pkt.pts)));
|
b.set_pts(Some(gst::ClockTime::from_useconds(pkt.pts)));
|
||||||
}
|
}
|
||||||
let _ = self.src.push_buffer(buf); // ignore Eos / flushing
|
let _ = self.src.push_buffer(buf); // ignore Eos / flushing
|
||||||
|
|||||||
@ -6,6 +6,7 @@ ORIG_USER=${SUDO_USER:-$(id -un)}
|
|||||||
|
|
||||||
# 1. packages (Arch)
|
# 1. packages (Arch)
|
||||||
sudo pacman -Syq --needed --noconfirm git rustup protobuf gcc evtest gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav
|
sudo pacman -Syq --needed --noconfirm git rustup protobuf gcc evtest gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav
|
||||||
|
yay -S --noconfirm grpcurl-bin
|
||||||
|
|
||||||
# 2. Rust tool-chain for both root & user
|
# 2. Rust tool-chain for both root & user
|
||||||
sudo rustup default stable
|
sudo rustup default stable
|
||||||
|
|||||||
@ -11,7 +11,7 @@ if ! command -v yay >/dev/null 2>&1; then
|
|||||||
cd /tmp && git clone --depth 1 https://aur.archlinux.org/yay.git &&
|
cd /tmp && git clone --depth 1 https://aur.archlinux.org/yay.git &&
|
||||||
cd yay && makepkg -si --noconfirm'
|
cd yay && makepkg -si --noconfirm'
|
||||||
fi
|
fi
|
||||||
yay -S --noconfirm grpcurl-bin
|
# yay -S --noconfirm grpcurl-bin
|
||||||
|
|
||||||
echo "==> 2a. Kernel‑driver tweaks"
|
echo "==> 2a. Kernel‑driver tweaks"
|
||||||
cat <<'EOF' | sudo tee /etc/modprobe.d/gc311-stream.conf >/dev/null
|
cat <<'EOF' | sudo tee /etc/modprobe.d/gc311-stream.conf >/dev/null
|
||||||
@ -105,7 +105,7 @@ After=network.target lesavka-core.service
|
|||||||
[Service]
|
[Service]
|
||||||
ExecStart=/usr/local/bin/lesavka-server
|
ExecStart=/usr/local/bin/lesavka-server
|
||||||
Restart=always
|
Restart=always
|
||||||
Environment=RUST_LOG=lesavka_server=debug,lesavka_server::video=trace,lesavka_server::usb_gadget=info
|
Environment=RUST_LOG=lesavka_server=info,lesavka_server::video=trace,lesavka_server::usb_gadget=info
|
||||||
Environment=RUST_BACKTRACE=1
|
Environment=RUST_BACKTRACE=1
|
||||||
Restart=always
|
Restart=always
|
||||||
RestartSec=5
|
RestartSec=5
|
||||||
|
|||||||
@ -50,7 +50,8 @@ pub async fn eye_ball(
|
|||||||
std::sync::atomic::AtomicU64::new(0);
|
std::sync::atomic::AtomicU64::new(0);
|
||||||
let n = FRAME.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
let n = FRAME.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
||||||
if n % 120 == 0 {
|
if n % 120 == 0 {
|
||||||
trace!("eye{id}: delivered {n} frames");
|
// trace!("eye{id}: delivered {n} frames");
|
||||||
|
trace!(target: "lesavka_server::video", "eye{id}: delivered {n} frames");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------- map once, reuse ----- */
|
/* -------- map once, reuse ----- */
|
||||||
@ -58,6 +59,7 @@ pub async fn eye_ball(
|
|||||||
|
|
||||||
// write first IDR to disk (quick sanity check)
|
// write first IDR to disk (quick sanity check)
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
|
// let map = buffer.map_readable().map_err(|_| gst::FlowError::Error)?;
|
||||||
std::fs::write(format!("/tmp/eye{id}-idr.h264"), map.as_slice()).ok();
|
std::fs::write(format!("/tmp/eye{id}-idr.h264"), map.as_slice()).ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user