Stream-line pad probe code

Don't take another reference of the data passed through the pad probes,
i.e. keeping buffers writable if they're writable.
This commit is contained in:
Sebastian Dröge 2018-07-26 03:14:04 +03:00
parent 632d5f4c57
commit ec8b55ec30

View file

@ -87,7 +87,8 @@ pub enum PadProbeData<'a> {
BufferList(BufferList), BufferList(BufferList),
Query(&'a mut QueryRef), Query(&'a mut QueryRef),
Event(Event), Event(Event),
Unknown, #[doc(hidden)]
__Unknown(*mut ffi::GstMiniObject),
} }
pub struct StreamLock(Pad); pub struct StreamLock(Pad);
@ -875,15 +876,16 @@ unsafe extern "C" fn trampoline_pad_probe(
data: if (*info).data.is_null() { data: if (*info).data.is_null() {
None None
} else { } else {
let data = (*info).data as *const ffi::GstMiniObject; let data = (*info).data as *mut ffi::GstMiniObject;
(*info).data = ptr::null_mut();
if (*data).type_ == Buffer::static_type().to_glib() { if (*data).type_ == Buffer::static_type().to_glib() {
data_type = Some(Buffer::static_type()); data_type = Some(Buffer::static_type());
Some(PadProbeData::Buffer(from_glib_none( Some(PadProbeData::Buffer(from_glib_full(
data as *const ffi::GstBuffer, data as *const ffi::GstBuffer,
))) )))
} else if (*data).type_ == BufferList::static_type().to_glib() { } else if (*data).type_ == BufferList::static_type().to_glib() {
data_type = Some(BufferList::static_type()); data_type = Some(BufferList::static_type());
Some(PadProbeData::BufferList(from_glib_none( Some(PadProbeData::BufferList(from_glib_full(
data as *const ffi::GstBufferList, data as *const ffi::GstBufferList,
))) )))
} else if (*data).type_ == Query::static_type().to_glib() { } else if (*data).type_ == Query::static_type().to_glib() {
@ -893,11 +895,11 @@ unsafe extern "C" fn trampoline_pad_probe(
))) )))
} else if (*data).type_ == Event::static_type().to_glib() { } else if (*data).type_ == Event::static_type().to_glib() {
data_type = Some(Event::static_type()); data_type = Some(Event::static_type());
Some(PadProbeData::Event(from_glib_none( Some(PadProbeData::Event(from_glib_full(
data as *const ffi::GstEvent, data as *const ffi::GstEvent,
))) )))
} else { } else {
Some(PadProbeData::Unknown) Some(PadProbeData::__Unknown(data))
} }
}, },
}; };
@ -907,33 +909,26 @@ unsafe extern "C" fn trampoline_pad_probe(
match probe_info.data { match probe_info.data {
Some(PadProbeData::Buffer(buffer)) => { Some(PadProbeData::Buffer(buffer)) => {
assert_eq!(data_type, Some(Buffer::static_type())); assert_eq!(data_type, Some(Buffer::static_type()));
if (*info).data != buffer.as_mut_ptr() as *mut _ { (*info).data = buffer.into_ptr() as *mut libc::c_void;
ffi::gst_mini_object_unref((*info).data as *mut _);
(*info).data = buffer.into_ptr() as *mut libc::c_void;
}
} }
Some(PadProbeData::BufferList(bufferlist)) => { Some(PadProbeData::BufferList(bufferlist)) => {
assert_eq!(data_type, Some(BufferList::static_type())); assert_eq!(data_type, Some(BufferList::static_type()));
if (*info).data != bufferlist.as_mut_ptr() as *mut _ { (*info).data = bufferlist.into_ptr() as *mut libc::c_void;
ffi::gst_mini_object_unref((*info).data as *mut _);
(*info).data = bufferlist.into_ptr() as *mut libc::c_void;
}
} }
Some(PadProbeData::Event(event)) => { Some(PadProbeData::Event(event)) => {
assert_eq!(data_type, Some(Event::static_type())); assert_eq!(data_type, Some(Event::static_type()));
if (*info).data != event.as_mut_ptr() as *mut _ { (*info).data = event.into_ptr() as *mut libc::c_void;
ffi::gst_mini_object_unref((*info).data as *mut _); }
(*info).data = event.into_ptr() as *mut libc::c_void; Some(PadProbeData::Query(query)) => {
} assert_eq!(data_type, Some(Query::static_type()));
(*info).data = query.as_mut_ptr() as *mut libc::c_void;
}
Some(PadProbeData::__Unknown(ptr)) => {
(*info).data = ptr as *mut libc::c_void;
} }
None => { None => {
assert_ne!(data_type, Some(Query::static_type())); assert_ne!(data_type, Some(Query::static_type()));
if !(*info).data.is_null() {
ffi::gst_mini_object_unref((*info).data as *mut _);
(*info).data = ptr::null_mut();
}
} }
_ => (),
} }
ret ret