Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cc5df9d

Browse files
committed
Limit appsrc queue and add relayd tests
1 parent b43a3b0 commit cc5df9d

2 files changed

Lines changed: 78 additions & 10 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ Notes:
122122
- For Linux vsock: `--listen vsock://CID:PORT`.
123123
- Appsrc queue controls (optional): `--appsrc-max-buffers <n>`, `--appsrc-max-bytes <n>`, `--appsrc-max-time <ns>`,
124124
`--appsrc-block|--appsrc-no-block`, `--appsrc-leaky none|upstream|downstream`. Defaults: max-buffers=8, max-bytes=0,
125-
max-time=0, block=true, leaky=none.
125+
max-time=0, block=false, leaky=downstream.
126126
- Use `--no-deep-copy` to avoid payload duplication (shallow buffer copy only).
127127

128128
## Plugin Discovery

src/bin/shm2_relayd.rs

Lines changed: 77 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ impl Default for AppSrcConfig {
9898
max_buffers: 8,
9999
max_bytes: 0,
100100
max_time_ns: 0,
101-
block: true,
102-
leaky: gst_app::AppLeakyType::None,
101+
block: false,
102+
leaky: gst_app::AppLeakyType::Downstream,
103103
}
104104
}
105105
}
@@ -240,19 +240,23 @@ fn output_pipeline_create(
240240
.and_then(|e| e.downcast::<gst_app::AppSrc>().ok())
241241
.ok_or_else(|| gst::glib::Error::new(gst::CoreError::Failed, "appsrc not found"))?;
242242

243+
apply_appsrc_config(&appsrc, appsrc_cfg);
244+
245+
Ok((pipeline, appsrc))
246+
}
247+
248+
fn apply_appsrc_config(appsrc: &gst_app::AppSrc, cfg: AppSrcConfig) {
243249
appsrc.set_property("is-live", true);
244250
appsrc.set_property("format", gst::Format::Time);
245251
appsrc.set_property("stream-type", gst_app::AppStreamType::Stream);
246-
appsrc.set_property("block", appsrc_cfg.block);
247-
appsrc.set_property("max-buffers", appsrc_cfg.max_buffers);
248-
appsrc.set_property("max-bytes", appsrc_cfg.max_bytes);
252+
appsrc.set_property("block", cfg.block);
253+
appsrc.set_property("max-buffers", cfg.max_buffers);
254+
appsrc.set_property("max-bytes", cfg.max_bytes);
249255
appsrc.set_property(
250256
"max-time",
251-
gst::ClockTime::from_nseconds(appsrc_cfg.max_time_ns),
257+
gst::ClockTime::from_nseconds(cfg.max_time_ns),
252258
);
253-
appsrc.set_property("leaky-type", appsrc_cfg.leaky);
254-
255-
Ok((pipeline, appsrc))
259+
appsrc.set_property("leaky-type", cfg.leaky);
256260
}
257261

258262
#[derive(Clone)]
@@ -595,6 +599,70 @@ fn flush_appsrc(appsrc: &gst_app::AppSrc) {
595599
}
596600
}
597601

602+
#[cfg(test)]
603+
mod tests {
604+
use super::*;
605+
use gst::prelude::*;
606+
607+
#[test]
608+
fn appsrc_config_applies_properties() {
609+
gst::init().unwrap();
610+
let appsrc = gst::ElementFactory::make("appsrc")
611+
.build()
612+
.unwrap()
613+
.downcast::<gst_app::AppSrc>()
614+
.unwrap();
615+
let cfg = AppSrcConfig {
616+
max_buffers: 5,
617+
max_bytes: 1234,
618+
max_time_ns: 5678,
619+
block: false,
620+
leaky: gst_app::AppLeakyType::Downstream,
621+
};
622+
apply_appsrc_config(&appsrc, cfg);
623+
624+
assert_eq!(appsrc.property::<bool>("block"), cfg.block);
625+
assert_eq!(appsrc.property::<u64>("max-buffers"), cfg.max_buffers);
626+
assert_eq!(appsrc.property::<u64>("max-bytes"), cfg.max_bytes);
627+
assert_eq!(appsrc.property::<u64>("max-time"), cfg.max_time_ns);
628+
assert_eq!(appsrc.property::<gst_app::AppLeakyType>("leaky-type"), cfg.leaky);
629+
}
630+
631+
#[test]
632+
fn appsrc_flush_allows_stop() {
633+
gst::init().unwrap();
634+
let pipeline = gst::parse::launch(
635+
"appsrc name=appsrc is-live=true format=time stream-type=stream ! fakesink sync=false",
636+
)
637+
.unwrap()
638+
.downcast::<gst::Pipeline>()
639+
.unwrap();
640+
let appsrc = pipeline
641+
.by_name("appsrc")
642+
.and_then(|e| e.downcast::<gst_app::AppSrc>().ok())
643+
.unwrap();
644+
645+
let cfg = AppSrcConfig {
646+
max_buffers: 2,
647+
max_bytes: 0,
648+
max_time_ns: 0,
649+
block: false,
650+
leaky: gst_app::AppLeakyType::Downstream,
651+
};
652+
apply_appsrc_config(&appsrc, cfg);
653+
654+
pipeline.set_state(gst::State::Playing).unwrap();
655+
let buffer = gst::Buffer::from_slice(vec![0u8; 1]);
656+
let _ = appsrc.push_buffer(buffer);
657+
flush_appsrc(&appsrc);
658+
659+
pipeline.set_state(gst::State::Null).unwrap();
660+
let (res, state, _) = pipeline.state(gst::ClockTime::from_seconds(2));
661+
assert!(res.is_ok());
662+
assert_eq!(state, gst::State::Null);
663+
}
664+
}
665+
598666
fn main() -> Result<(), Box<dyn std::error::Error>> {
599667
if let Err(err) = gst::init() {
600668
return Err(Box::new(err));

0 commit comments

Comments
 (0)