diff options
author | Seungha Yang <seungha@centricular.com> | 2022-10-19 19:58:53 +0300 |
---|---|---|
committer | Seungha Yang <seungha@centricular.com> | 2022-10-19 20:08:08 +0300 |
commit | fec404f87aadb66c8a32f845158e70477be0d643 (patch) | |
tree | 0fa3217cedaf30cfca64fca48d5e58bc5ac30ca4 /utils/fallbackswitch | |
parent | 1db66e5a3b7c54f015f61f4a8385a378d8d0dd36 (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.rs | 53 |
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); } |