mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-11-23 12:01:01 +00:00
threadshare/inputselector: Set DISCONT flag on first buffer after each pad switch
This commit is contained in:
parent
625798c5db
commit
ad4597a40e
1 changed files with 12 additions and 7 deletions
|
@ -147,7 +147,7 @@ impl InputSelectorPadSinkHandler {
|
||||||
&self,
|
&self,
|
||||||
pad: &PadSinkRef<'_>,
|
pad: &PadSinkRef<'_>,
|
||||||
element: &gst::Element,
|
element: &gst::Element,
|
||||||
buffer: gst::Buffer,
|
mut buffer: gst::Buffer,
|
||||||
) -> Result<gst::FlowSuccess, gst::FlowError> {
|
) -> Result<gst::FlowSuccess, gst::FlowError> {
|
||||||
let inputselector = InputSelector::from_instance(element);
|
let inputselector = InputSelector::from_instance(element);
|
||||||
|
|
||||||
|
@ -167,15 +167,20 @@ impl InputSelectorPadSinkHandler {
|
||||||
if state.active_sinkpad.as_ref() == Some(pad.gst_pad()) {
|
if state.active_sinkpad.as_ref() == Some(pad.gst_pad()) {
|
||||||
gst_log!(CAT, obj: pad.gst_pad(), "Forwarding {:?}", buffer);
|
gst_log!(CAT, obj: pad.gst_pad(), "Forwarding {:?}", buffer);
|
||||||
|
|
||||||
|
if state.switched_pad && !buffer.get_flags().contains(gst::BufferFlags::DISCONT) {
|
||||||
|
let buffer = buffer.make_mut();
|
||||||
|
buffer.set_flags(gst::BufferFlags::DISCONT);
|
||||||
|
}
|
||||||
|
|
||||||
let mut stickies: Vec<gst::Event> = vec![];
|
let mut stickies: Vec<gst::Event> = vec![];
|
||||||
if inner.send_sticky || state.send_sticky {
|
if inner.send_sticky || state.switched_pad {
|
||||||
pad.gst_pad().sticky_events_foreach(|event| {
|
pad.gst_pad().sticky_events_foreach(|event| {
|
||||||
stickies.push(event.clone());
|
stickies.push(event.clone());
|
||||||
Ok(Some(event))
|
Ok(Some(event))
|
||||||
});
|
});
|
||||||
|
|
||||||
inner.send_sticky = false;
|
inner.send_sticky = false;
|
||||||
state.send_sticky = false;
|
state.switched_pad = false;
|
||||||
}
|
}
|
||||||
drop(inner);
|
drop(inner);
|
||||||
drop(state);
|
drop(state);
|
||||||
|
@ -332,14 +337,14 @@ impl PadSrcHandler for InputSelectorPadSrcHandler {
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct State {
|
struct State {
|
||||||
active_sinkpad: Option<gst::Pad>,
|
active_sinkpad: Option<gst::Pad>,
|
||||||
send_sticky: bool,
|
switched_pad: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for State {
|
impl Default for State {
|
||||||
fn default() -> State {
|
fn default() -> State {
|
||||||
State {
|
State {
|
||||||
active_sinkpad: None,
|
active_sinkpad: None,
|
||||||
send_sticky: true,
|
switched_pad: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -509,7 +514,7 @@ impl ObjectImpl for InputSelector {
|
||||||
if let Some(pad) = pad {
|
if let Some(pad) = pad {
|
||||||
if pads.sink_pads.get(&pad).is_some() {
|
if pads.sink_pads.get(&pad).is_some() {
|
||||||
state.active_sinkpad = Some(pad);
|
state.active_sinkpad = Some(pad);
|
||||||
state.send_sticky = true;
|
state.switched_pad = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
state.active_sinkpad = None;
|
state.active_sinkpad = None;
|
||||||
|
@ -602,7 +607,7 @@ impl ElementImpl for InputSelector {
|
||||||
|
|
||||||
if state.active_sinkpad.is_none() {
|
if state.active_sinkpad.is_none() {
|
||||||
state.active_sinkpad = Some(ret.clone());
|
state.active_sinkpad = Some(ret.clone());
|
||||||
state.send_sticky = true;
|
state.switched_pad = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
pads.sink_pads.insert(ret.clone(), sink_pad);
|
pads.sink_pads.insert(ret.clone(), sink_pad);
|
||||||
|
|
Loading…
Reference in a new issue