lesavka/client/src/input/camera.rs

64 lines
1.4 KiB
Rust
Raw Normal View History

// Webcam capture pipeline, quality selection, and launcher preview tap support.
2025-07-03 09:24:57 -05:00
use anyhow::Context;
use gst::prelude::*;
2025-07-03 08:19:59 -05:00
use gstreamer as gst;
use gstreamer_app as gst_app;
use lesavka_common::lesavka::VideoPacket;
use std::{
io::Write,
path::{Path, PathBuf},
sync::{
Arc,
atomic::{AtomicBool, Ordering},
},
thread,
time::Duration,
};
const CAMERA_PREVIEW_TAP_ENV: &str = "LESAVKA_UPLINK_CAMERA_PREVIEW";
2025-06-08 22:24:14 -05:00
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
enum CameraSourceProfile {
Raw,
Mjpeg,
AutoDecode,
}
fn env_u32(name: &str, default: u32) -> u32 {
std::env::var(name)
.ok()
.and_then(|v| v.parse::<u32>().ok())
.unwrap_or(default)
}
2026-01-28 17:52:00 -03:00
#[derive(Clone, Copy, Debug)]
pub enum CameraCodec {
H264,
Mjpeg,
}
#[derive(Clone, Copy, Debug)]
pub struct CameraConfig {
pub codec: CameraCodec,
pub width: u32,
pub height: u32,
pub fps: u32,
}
2025-06-08 22:24:14 -05:00
pub struct CameraCapture {
#[allow(dead_code)] // kept alive to hold PLAYING state
2025-07-03 08:19:59 -05:00
pipeline: gst::Pipeline,
sink: gst_app::AppSink,
preview_tap_running: Option<Arc<AtomicBool>>,
pts_rebaser: crate::live_capture_clock::DurationPacedSourcePtsRebaser,
frame_duration_us: u64,
2025-06-08 22:24:14 -05:00
}
include!("camera/capture_pipeline.rs");
include!("camera/device_selection.rs");
include!("camera/encoder_selection.rs");
2025-07-03 08:19:59 -05:00
include!("camera/source_description.rs");
include!("camera/preview_tap.rs");
include!("camera/bus_and_encoder.rs");