Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeungha Yang <seungha@centricular.com>2022-10-19 19:58:53 +0300
committerSeungha Yang <seungha@centricular.com>2022-10-19 20:08:08 +0300
commitfec404f87aadb66c8a32f845158e70477be0d643 (patch)
tree0fa3217cedaf30cfca64fca48d5e58bc5ac30ca4 /utils/fallbackswitch
parent1db66e5a3b7c54f015f61f4a8385a378d8d0dd36 (diff)
fallbacksrc: Fix for imagefreeze framerate setup
Put imagefreeze before capsfilter so that user specified framerate for fallback image can be applied as expected
Diffstat (limited to 'utils/fallbackswitch')
-rw-r--r--utils/fallbackswitch/src/fallbacksrc/imp.rs53
1 files changed, 17 insertions, 36 deletions
diff --git a/utils/fallbackswitch/src/fallbacksrc/imp.rs b/utils/fallbackswitch/src/fallbacksrc/imp.rs
index 829d18f2a..26fc73e40 100644
--- a/utils/fallbackswitch/src/fallbacksrc/imp.rs
+++ b/utils/fallbackswitch/src/fallbacksrc/imp.rs
@@ -135,8 +135,6 @@ struct StreamBranch {
source_srcpad_block: Option<Block>,
// other elements in the source bin before the ghostpad
- // imagefreeze before the clocksync if this is a stillframe stream
- imagefreeze: Option<gst::Element>,
clocksync: gst::Element,
converters: gst::Element,
queue: gst::Element,
@@ -1368,9 +1366,6 @@ impl FallbackSrc {
element.remove(&branch.queue).unwrap();
element.remove(&branch.converters).unwrap();
element.remove(&branch.clocksync).unwrap();
- if let Some(ref imagefreeze) = branch.imagefreeze {
- element.remove(imagefreeze).unwrap();
- }
if branch.switch_pad.parent().as_ref() == Some(stream.switch.upcast_ref()) {
stream.switch.release_request_pad(&branch.switch_pad);
}
@@ -1715,14 +1710,27 @@ impl FallbackSrc {
.build()
.expect("No capsfilter found");
+ let imagefreeze = if is_image {
+ gst::ElementFactory::make("imagefreeze")
+ .property("is-live", true)
+ .build()
+ .expect("no imagefreeze found")
+ } else {
+ gst::ElementFactory::make("identity")
+ .name("video_identity")
+ .build()
+ .expect("No identity found")
+ };
+
if fallback_source {
capsfilter.set_property("caps", filter_caps);
}
- bin.add_many(&[&videoconvert, &videoscale, &capsfilter])
+ bin.add_many(&[&videoconvert, &videoscale, &imagefreeze, &capsfilter])
.unwrap();
- gst::Element::link_many(&[&videoconvert, &videoscale, &capsfilter]).unwrap();
+ gst::Element::link_many(&[&videoconvert, &videoscale, &imagefreeze, &capsfilter])
+ .unwrap();
let ghostpad =
gst::GhostPad::with_target(Some("sink"), &videoconvert.static_pad("sink").unwrap())
@@ -1815,27 +1823,7 @@ impl FallbackSrc {
)
})?;
- let imagefreeze = if is_image {
- gst::debug!(CAT, imp: self, "Image stream, inserting imagefreeze");
- let imagefreeze = gst::ElementFactory::make("imagefreeze")
- .property("is-live", true)
- .build()
- .expect("no imagefreeze found");
- source.source.add(&imagefreeze).unwrap();
-
- if imagefreeze.sync_state_with_parent().is_err() {
- gst::error!(CAT, imp: self, "imagefreeze failed to change state",);
- return Err(gst::error_msg!(
- gst::CoreError::StateChange,
- ["Failed to change imagefreeze state"]
- ));
- }
- gst::Element::link_many(&[&converters, &imagefreeze, &queue, &clocksync]).unwrap();
- Some(imagefreeze)
- } else {
- gst::Element::link_many(&[&converters, &queue, &clocksync]).unwrap();
- None
- };
+ gst::Element::link_many(&[&converters, &queue, &clocksync]).unwrap();
let ghostpad =
gst::GhostPad::with_target(Some(type_), &clocksync.static_pad("src").unwrap()).unwrap();
@@ -1940,7 +1928,6 @@ impl FallbackSrc {
*branch_storage = Some(StreamBranch {
source_srcpad: pad.clone(),
source_srcpad_block,
- imagefreeze,
clocksync,
converters,
queue,
@@ -2455,7 +2442,7 @@ impl FallbackSrc {
Some(state) => state,
};
- let (mut branch, is_video, source, switch) = match &mut *state {
+ let (branch, is_video, source, switch) = match &mut *state {
State {
audio_stream:
Some(Stream {
@@ -2527,12 +2514,6 @@ impl FallbackSrc {
let _ = branch.clocksync.set_state(gst::State::Null);
source.source.remove(&branch.clocksync).unwrap();
- if let Some(imagefreeze) = branch.imagefreeze.take() {
- imagefreeze.set_locked_state(true);
- let _ = imagefreeze.set_state(gst::State::Null);
- source.source.remove(&imagefreeze).unwrap();
- }
-
if branch.switch_pad.parent().as_ref() == Some(switch.upcast_ref()) {
switch.release_request_pad(&branch.switch_pad);
}