client: add MJPG camera input
This commit is contained in:
parent
6a76be3c38
commit
d8b0d739a5
@ -31,9 +31,19 @@ impl CameraCapture {
|
|||||||
None => "/dev/video0".into(),
|
None => "/dev/video0".into(),
|
||||||
};
|
};
|
||||||
|
|
||||||
// let (enc, raw_caps) = Self::pick_encoder();
|
let use_mjpg = std::env::var("LESAVKA_CAM_MJPG").is_ok()
|
||||||
// (NVIDIA → VA-API → software x264).
|
|| std::env::var("LESAVKA_CAM_FORMAT")
|
||||||
let (enc, kf_prop, kf_val) = Self::choose_encoder();
|
.ok()
|
||||||
|
.map(|v| matches!(v.to_ascii_lowercase().as_str(), "mjpg" | "mjpeg" | "jpeg"))
|
||||||
|
.unwrap_or(false);
|
||||||
|
let (enc, kf_prop, kf_val) = if use_mjpg {
|
||||||
|
("x264enc", "key-int-max", "30")
|
||||||
|
} else {
|
||||||
|
Self::choose_encoder()
|
||||||
|
};
|
||||||
|
if use_mjpg {
|
||||||
|
tracing::info!("📸 using MJPG source with software encode");
|
||||||
|
}
|
||||||
tracing::info!("📸 using encoder element: {enc}");
|
tracing::info!("📸 using encoder element: {enc}");
|
||||||
let width = env_u32("LESAVKA_CAM_WIDTH", 1280);
|
let width = env_u32("LESAVKA_CAM_WIDTH", 1280);
|
||||||
let height = env_u32("LESAVKA_CAM_HEIGHT", 720);
|
let height = env_u32("LESAVKA_CAM_HEIGHT", 720);
|
||||||
@ -72,13 +82,25 @@ impl CameraCapture {
|
|||||||
// * nvh264enc needs NVMM memory caps;
|
// * nvh264enc needs NVMM memory caps;
|
||||||
// * vaapih264enc wants system-memory caps;
|
// * vaapih264enc wants system-memory caps;
|
||||||
// * x264enc needs the usual raw caps.
|
// * x264enc needs the usual raw caps.
|
||||||
let desc = format!(
|
let desc = if use_mjpg {
|
||||||
"v4l2src device={dev} do-timestamp=true ! {src_caps} ! \
|
format!(
|
||||||
{preenc} {enc} {kf_prop}={kf_val} ! \
|
"v4l2src device={dev} do-timestamp=true ! \
|
||||||
h264parse config-interval=-1 ! video/x-h264,stream-format=byte-stream,alignment=au ! \
|
image/jpeg,width={width},height={height} ! \
|
||||||
queue max-size-buffers=30 leaky=downstream ! \
|
jpegdec ! videorate ! video/x-raw,framerate={fps}/1 ! \
|
||||||
appsink name=asink emit-signals=true max-buffers=60 drop=true"
|
videoconvert ! {enc} {kf_prop}={kf_val} ! \
|
||||||
);
|
h264parse config-interval=-1 ! video/x-h264,stream-format=byte-stream,alignment=au ! \
|
||||||
|
queue max-size-buffers=30 leaky=downstream ! \
|
||||||
|
appsink name=asink emit-signals=true max-buffers=60 drop=true"
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
format!(
|
||||||
|
"v4l2src device={dev} do-timestamp=true ! {src_caps} ! \
|
||||||
|
{preenc} {enc} {kf_prop}={kf_val} ! \
|
||||||
|
h264parse config-interval=-1 ! video/x-h264,stream-format=byte-stream,alignment=au ! \
|
||||||
|
queue max-size-buffers=30 leaky=downstream ! \
|
||||||
|
appsink name=asink emit-signals=true max-buffers=60 drop=true"
|
||||||
|
)
|
||||||
|
};
|
||||||
tracing::info!(%enc, width, height, fps, ?desc, "📸 using encoder element");
|
tracing::info!(%enc, width, height, fps, ?desc, "📸 using encoder element");
|
||||||
|
|
||||||
let pipeline: gst::Pipeline = gst::parse::launch(&desc)
|
let pipeline: gst::Pipeline = gst::parse::launch(&desc)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user