mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-11-29 06:50:59 +00:00
Move from imp.instance()
to imp.obj()
It's doing the same thing and is shorter.
This commit is contained in:
parent
86776be58c
commit
9a68f6e221
91 changed files with 507 additions and 572 deletions
|
@ -1655,7 +1655,7 @@ impl AudioLoudNorm {
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::single_match)]
|
#[allow(clippy::single_match)]
|
||||||
|
@ -1678,7 +1678,7 @@ impl AudioLoudNorm {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => gst::Pad::query_default(pad, Some(&*self.instance()), query),
|
_ => gst::Pad::query_default(pad, Some(&*self.obj()), query),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1767,7 +1767,7 @@ impl ObjectImpl for AudioLoudNorm {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -154,7 +154,7 @@ impl AudioRNNoise {
|
||||||
state.process(in_data, out_data);
|
state.process(in_data, out_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.instance().src_pad().push(buffer)
|
self.obj().src_pad().push(buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generate_output(&self, state: &mut State) -> Result<GenerateOutputSuccess, gst::FlowError> {
|
fn generate_output(&self, state: &mut State) -> Result<GenerateOutputSuccess, gst::FlowError> {
|
||||||
|
@ -329,7 +329,7 @@ impl BaseTransformImpl for AudioRNNoise {
|
||||||
if direction == gst::PadDirection::Src {
|
if direction == gst::PadDirection::Src {
|
||||||
if let gst::QueryViewMut::Latency(q) = query.view_mut() {
|
if let gst::QueryViewMut::Latency(q) = query.view_mut() {
|
||||||
let mut upstream_query = gst::query::Latency::new();
|
let mut upstream_query = gst::query::Latency::new();
|
||||||
if self.instance().sink_pad().peer_query(&mut upstream_query) {
|
if self.obj().sink_pad().peer_query(&mut upstream_query) {
|
||||||
let (live, mut min, mut max) = upstream_query.result();
|
let (live, mut min, mut max) = upstream_query.result();
|
||||||
gst::debug!(
|
gst::debug!(
|
||||||
CAT,
|
CAT,
|
||||||
|
|
|
@ -412,7 +412,7 @@ impl BaseTransformImpl for EbuR128Level {
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let mut timestamp = buf.pts();
|
let mut timestamp = buf.pts();
|
||||||
let segment = self.instance().segment().downcast::<gst::ClockTime>().ok();
|
let segment = self.obj().segment().downcast::<gst::ClockTime>().ok();
|
||||||
|
|
||||||
let buf = gst_audio::AudioBufferRef::from_buffer_ref_readable(buf, &state.info).map_err(
|
let buf = gst_audio::AudioBufferRef::from_buffer_ref_readable(buf, &state.info).map_err(
|
||||||
|_| {
|
|_| {
|
||||||
|
@ -563,14 +563,12 @@ impl BaseTransformImpl for EbuR128Level {
|
||||||
|
|
||||||
gst::debug!(CAT, imp: self, "Posting message {}", s);
|
gst::debug!(CAT, imp: self, "Posting message {}", s);
|
||||||
|
|
||||||
let msg = gst::message::Element::builder(s)
|
let msg = gst::message::Element::builder(s).src(&*self.obj()).build();
|
||||||
.src(&*self.instance())
|
|
||||||
.build();
|
|
||||||
|
|
||||||
// Release lock while posting the message to avoid deadlocks
|
// Release lock while posting the message to avoid deadlocks
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
|
|
||||||
let _ = self.instance().post_message(msg);
|
let _ = self.obj().post_message(msg);
|
||||||
|
|
||||||
state_guard = self.state.borrow_mut();
|
state_guard = self.state.borrow_mut();
|
||||||
state = state_guard.as_mut().ok_or_else(|| {
|
state = state_guard.as_mut().ok_or_else(|| {
|
||||||
|
|
|
@ -394,7 +394,7 @@ impl HrtfRender {
|
||||||
state.reset_processors();
|
state.reset_processors();
|
||||||
|
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
self.instance().src_pad().push(outbuf)
|
self.obj().src_pad().push(outbuf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -136,7 +136,7 @@ impl AudioDecoderImpl for ClaxonDec {
|
||||||
} else if let Ok(tstreaminfo) = claxon_streaminfo(&inmap[13..]) {
|
} else if let Ok(tstreaminfo) = claxon_streaminfo(&inmap[13..]) {
|
||||||
if let Ok(taudio_info) = gstaudioinfo(&tstreaminfo) {
|
if let Ok(taudio_info) = gstaudioinfo(&tstreaminfo) {
|
||||||
// To speed up negotiation
|
// To speed up negotiation
|
||||||
let element = self.instance();
|
let element = self.obj();
|
||||||
if element.set_output_format(&taudio_info).is_err()
|
if element.set_output_format(&taudio_info).is_err()
|
||||||
|| element.negotiate().is_err()
|
|| element.negotiate().is_err()
|
||||||
{
|
{
|
||||||
|
@ -198,7 +198,7 @@ impl AudioDecoderImpl for ClaxonDec {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.instance().finish_frame(None, 1)
|
self.obj().finish_frame(None, 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,7 +225,7 @@ impl ClaxonDec {
|
||||||
audio_info
|
audio_info
|
||||||
);
|
);
|
||||||
|
|
||||||
let element = self.instance();
|
let element = self.obj();
|
||||||
element.set_output_format(&audio_info)?;
|
element.set_output_format(&audio_info)?;
|
||||||
element.negotiate()?;
|
element.negotiate()?;
|
||||||
|
|
||||||
|
@ -260,10 +260,10 @@ impl ClaxonDec {
|
||||||
let mut reader = claxon::frame::FrameReader::new(&mut cursor);
|
let mut reader = claxon::frame::FrameReader::new(&mut cursor);
|
||||||
let result = match reader.read_next_or_eof(buffer) {
|
let result = match reader.read_next_or_eof(buffer) {
|
||||||
Ok(Some(result)) => result,
|
Ok(Some(result)) => result,
|
||||||
Ok(None) => return self.instance().finish_frame(None, 1),
|
Ok(None) => return self.obj().finish_frame(None, 1),
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
return gst_audio::audio_decoder_error!(
|
return gst_audio::audio_decoder_error!(
|
||||||
self.instance(),
|
self.obj(),
|
||||||
1,
|
1,
|
||||||
gst::StreamError::Decode,
|
gst::StreamError::Decode,
|
||||||
["Failed to decode packet: {:?}", err]
|
["Failed to decode packet: {:?}", err]
|
||||||
|
@ -288,7 +288,7 @@ impl ClaxonDec {
|
||||||
|
|
||||||
let depth_adjusted = depth.adjust_samples(v);
|
let depth_adjusted = depth.adjust_samples(v);
|
||||||
let outbuf = gst::Buffer::from_mut_slice(depth_adjusted);
|
let outbuf = gst::Buffer::from_mut_slice(depth_adjusted);
|
||||||
self.instance().finish_frame(Some(outbuf), 1)
|
self.obj().finish_frame(Some(outbuf), 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -230,7 +230,7 @@ impl CsoundFilter {
|
||||||
drop(state_lock);
|
drop(state_lock);
|
||||||
drop(csound);
|
drop(csound);
|
||||||
|
|
||||||
self.instance().src_pad().push(buffer)
|
self.obj().src_pad().push(buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generate_output(&self, state: &mut State) -> Result<GenerateOutputSuccess, gst::FlowError> {
|
fn generate_output(&self, state: &mut State) -> Result<GenerateOutputSuccess, gst::FlowError> {
|
||||||
|
|
|
@ -186,7 +186,7 @@ impl AudioDecoderImpl for LewtonDec {
|
||||||
|
|
||||||
// Ignore empty packets unless we have no headers yet
|
// Ignore empty packets unless we have no headers yet
|
||||||
if inmap.len() == 0 {
|
if inmap.len() == 0 {
|
||||||
self.instance().finish_frame(None, 1)?;
|
self.obj().finish_frame(None, 1)?;
|
||||||
|
|
||||||
if state.headerset.is_some() {
|
if state.headerset.is_some() {
|
||||||
return Ok(gst::FlowSuccess::Ok);
|
return Ok(gst::FlowSuccess::Ok);
|
||||||
|
@ -243,7 +243,7 @@ impl LewtonDec {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.instance().finish_frame(None, 1)
|
self.obj().finish_frame(None, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn initialize(&self, state: &mut State) -> Result<(), gst::FlowError> {
|
fn initialize(&self, state: &mut State) -> Result<(), gst::FlowError> {
|
||||||
|
@ -351,8 +351,8 @@ impl LewtonDec {
|
||||||
state.audio_info = Some(audio_info.clone());
|
state.audio_info = Some(audio_info.clone());
|
||||||
state.reorder_map = reorder_map;
|
state.reorder_map = reorder_map;
|
||||||
|
|
||||||
self.instance().set_output_format(&audio_info)?;
|
self.obj().set_output_format(&audio_info)?;
|
||||||
self.instance().negotiate()?;
|
self.obj().negotiate()?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -374,7 +374,7 @@ impl LewtonDec {
|
||||||
Ok(decoded) => decoded,
|
Ok(decoded) => decoded,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
return audio_decoder_error!(
|
return audio_decoder_error!(
|
||||||
self.instance(),
|
self.obj(),
|
||||||
1,
|
1,
|
||||||
gst::StreamError::Decode,
|
gst::StreamError::Decode,
|
||||||
["Failed to decode packet: {:?}", err]
|
["Failed to decode packet: {:?}", err]
|
||||||
|
@ -384,7 +384,7 @@ impl LewtonDec {
|
||||||
|
|
||||||
if decoded.channel_count != audio_info.channels() as usize {
|
if decoded.channel_count != audio_info.channels() as usize {
|
||||||
return audio_decoder_error!(
|
return audio_decoder_error!(
|
||||||
self.instance(),
|
self.obj(),
|
||||||
1,
|
1,
|
||||||
gst::StreamError::Decode,
|
gst::StreamError::Decode,
|
||||||
[
|
[
|
||||||
|
@ -399,12 +399,12 @@ impl LewtonDec {
|
||||||
gst::debug!(CAT, imp: self, "Got {} decoded samples", sample_count);
|
gst::debug!(CAT, imp: self, "Got {} decoded samples", sample_count);
|
||||||
|
|
||||||
if sample_count == 0 {
|
if sample_count == 0 {
|
||||||
return self.instance().finish_frame(None, 1);
|
return self.obj().finish_frame(None, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
let outbuf = if let Some(ref reorder_map) = state.reorder_map {
|
let outbuf = if let Some(ref reorder_map) = state.reorder_map {
|
||||||
let mut outbuf = self
|
let mut outbuf = self
|
||||||
.instance()
|
.obj()
|
||||||
.allocate_output_buffer(sample_count as usize * audio_info.bpf() as usize);
|
.allocate_output_buffer(sample_count as usize * audio_info.bpf() as usize);
|
||||||
{
|
{
|
||||||
// And copy the decoded data into our output buffer while reordering the channels to the
|
// And copy the decoded data into our output buffer while reordering the channels to the
|
||||||
|
@ -451,7 +451,7 @@ impl LewtonDec {
|
||||||
gst::Buffer::from_mut_slice(CastVec(decoded.samples))
|
gst::Buffer::from_mut_slice(CastVec(decoded.samples))
|
||||||
};
|
};
|
||||||
|
|
||||||
self.instance().finish_frame(Some(outbuf), 1)
|
self.obj().finish_frame(Some(outbuf), 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -442,7 +442,7 @@ impl URIHandlerImpl for SpotifyAudioSrc {
|
||||||
for (key, value) in url.query_pairs() {
|
for (key, value) in url.query_pairs() {
|
||||||
match key.as_ref() {
|
match key.as_ref() {
|
||||||
"username" | "password" | "cache-credentials" | "cache-files" => {
|
"username" | "password" | "cache-credentials" | "cache-files" => {
|
||||||
self.instance().set_property(&key, value.as_ref());
|
self.obj().set_property(&key, value.as_ref());
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
gst::warning!(CAT, imp: self, "unsupported query: {}={}", key, value);
|
gst::warning!(CAT, imp: self, "unsupported query: {}={}", key, value);
|
||||||
|
@ -450,7 +450,7 @@ impl URIHandlerImpl for SpotifyAudioSrc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.instance()
|
self.obj()
|
||||||
.set_property("track", format!("{}:{}", url.scheme(), url.path()));
|
.set_property("track", format!("{}:{}", url.scheme(), url.path()));
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -174,7 +174,7 @@ impl ObjectImpl for FileSrc {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
self.instance().set_format(gst::Format::Bytes);
|
self.obj().set_format(gst::Format::Bytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -300,7 +300,7 @@ impl Decrypter {
|
||||||
}
|
}
|
||||||
QueryViewMut::Duration(q) => {
|
QueryViewMut::Duration(q) => {
|
||||||
if q.format() != gst::Format::Bytes {
|
if q.format() != gst::Format::Bytes {
|
||||||
return gst::Pad::query_default(pad, Some(&*self.instance()), query);
|
return gst::Pad::query_default(pad, Some(&*self.obj()), query);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* First let's query the bytes duration upstream */
|
/* First let's query the bytes duration upstream */
|
||||||
|
@ -341,7 +341,7 @@ impl Decrypter {
|
||||||
|
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
_ => gst::Pad::query_default(pad, Some(&*self.instance()), query),
|
_ => gst::Pad::query_default(pad, Some(&*self.obj()), query),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -594,7 +594,7 @@ impl ObjectImpl for Decrypter {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -243,9 +243,9 @@ impl Encrypter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -256,7 +256,7 @@ impl Encrypter {
|
||||||
|
|
||||||
match event.view() {
|
match event.view() {
|
||||||
EventView::Seek(_) => false,
|
EventView::Seek(_) => false,
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -278,7 +278,7 @@ impl Encrypter {
|
||||||
}
|
}
|
||||||
QueryViewMut::Duration(q) => {
|
QueryViewMut::Duration(q) => {
|
||||||
if q.format() != gst::Format::Bytes {
|
if q.format() != gst::Format::Bytes {
|
||||||
return gst::Pad::query_default(pad, Some(&*self.instance()), query);
|
return gst::Pad::query_default(pad, Some(&*self.obj()), query);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* First let's query the bytes duration upstream */
|
/* First let's query the bytes duration upstream */
|
||||||
|
@ -318,7 +318,7 @@ impl Encrypter {
|
||||||
|
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
_ => gst::Pad::query_default(pad, Some(&*self.instance()), query),
|
_ => gst::Pad::query_default(pad, Some(&*self.obj()), query),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -406,7 +406,7 @@ impl ObjectImpl for Encrypter {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -610,7 +610,7 @@ impl TestSink {
|
||||||
|
|
||||||
// Enable backpressure for items
|
// Enable backpressure for items
|
||||||
let (item_sender, item_receiver) = flume::bounded(0);
|
let (item_sender, item_receiver) = flume::bounded(0);
|
||||||
let task_impl = TestSinkTask::new(&*self.instance(), item_receiver);
|
let task_impl = TestSinkTask::new(&*self.obj(), item_receiver);
|
||||||
self.task.prepare(task_impl, context).block_on()?;
|
self.task.prepare(task_impl, context).block_on()?;
|
||||||
|
|
||||||
*self.item_sender.lock().unwrap() = Some(item_sender);
|
*self.item_sender.lock().unwrap() = Some(item_sender);
|
||||||
|
@ -794,7 +794,7 @@ impl ObjectImpl for TestSink {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(self.sink_pad.gst_pad()).unwrap();
|
obj.add_pad(self.sink_pad.gst_pad()).unwrap();
|
||||||
obj.set_element_flags(gst::ElementFlags::SINK);
|
obj.set_element_flags(gst::ElementFlags::SINK);
|
||||||
}
|
}
|
||||||
|
|
|
@ -337,7 +337,7 @@ impl TestSrc {
|
||||||
drop(settings);
|
drop(settings);
|
||||||
|
|
||||||
self.task
|
self.task
|
||||||
.prepare(SrcTask::new(self.instance().clone()), context)
|
.prepare(SrcTask::new(self.obj().clone()), context)
|
||||||
.block_on()?;
|
.block_on()?;
|
||||||
|
|
||||||
if raise_log_level {
|
if raise_log_level {
|
||||||
|
@ -528,7 +528,7 @@ impl ObjectImpl for TestSrc {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
||||||
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -315,7 +315,7 @@ impl AppSrc {
|
||||||
|
|
||||||
let do_timestamp = self.settings.lock().unwrap().do_timestamp;
|
let do_timestamp = self.settings.lock().unwrap().do_timestamp;
|
||||||
if do_timestamp {
|
if do_timestamp {
|
||||||
let elem = self.instance();
|
let elem = self.obj();
|
||||||
if let Some(clock) = elem.clock() {
|
if let Some(clock) = elem.clock() {
|
||||||
let base_time = elem.base_time();
|
let base_time = elem.base_time();
|
||||||
let now = clock.time();
|
let now = clock.time();
|
||||||
|
@ -384,7 +384,7 @@ impl AppSrc {
|
||||||
*self.sender.lock().unwrap() = Some(sender);
|
*self.sender.lock().unwrap() = Some(sender);
|
||||||
|
|
||||||
self.task
|
self.task
|
||||||
.prepare(AppSrcTask::new(self.instance().clone(), receiver), context)
|
.prepare(AppSrcTask::new(self.obj().clone(), receiver), context)
|
||||||
.block_on()?;
|
.block_on()?;
|
||||||
|
|
||||||
gst::debug!(CAT, imp: self, "Prepared");
|
gst::debug!(CAT, imp: self, "Prepared");
|
||||||
|
@ -556,7 +556,7 @@ impl ObjectImpl for AppSrc {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
||||||
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -470,7 +470,7 @@ impl ObjectImpl for InputSelector {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
||||||
obj.set_element_flags(gst::ElementFlags::PROVIDE_CLOCK | gst::ElementFlags::REQUIRE_CLOCK);
|
obj.set_element_flags(gst::ElementFlags::PROVIDE_CLOCK | gst::ElementFlags::REQUIRE_CLOCK);
|
||||||
}
|
}
|
||||||
|
@ -554,7 +554,7 @@ impl ElementImpl for InputSelector {
|
||||||
gst::Pad::from_template(templ, Some(format!("sink_{}", pads.pad_serial).as_str()));
|
gst::Pad::from_template(templ, Some(format!("sink_{}", pads.pad_serial).as_str()));
|
||||||
pads.pad_serial += 1;
|
pads.pad_serial += 1;
|
||||||
sink_pad.set_active(true).unwrap();
|
sink_pad.set_active(true).unwrap();
|
||||||
self.instance().add_pad(&sink_pad).unwrap();
|
self.obj().add_pad(&sink_pad).unwrap();
|
||||||
let sink_pad = PadSink::new(sink_pad, InputSelectorPadSinkHandler::default());
|
let sink_pad = PadSink::new(sink_pad, InputSelectorPadSinkHandler::default());
|
||||||
let ret = sink_pad.gst_pad().clone();
|
let ret = sink_pad.gst_pad().clone();
|
||||||
|
|
||||||
|
@ -567,11 +567,9 @@ impl ElementImpl for InputSelector {
|
||||||
drop(pads);
|
drop(pads);
|
||||||
drop(state);
|
drop(state);
|
||||||
|
|
||||||
let _ = self.instance().post_message(
|
let _ = self
|
||||||
gst::message::Latency::builder()
|
.obj()
|
||||||
.src(&*self.instance())
|
.post_message(gst::message::Latency::builder().src(&*self.obj()).build());
|
||||||
.build(),
|
|
||||||
);
|
|
||||||
|
|
||||||
Some(ret)
|
Some(ret)
|
||||||
}
|
}
|
||||||
|
@ -580,14 +578,12 @@ impl ElementImpl for InputSelector {
|
||||||
let mut pads = self.pads.lock().unwrap();
|
let mut pads = self.pads.lock().unwrap();
|
||||||
let sink_pad = pads.sink_pads.remove(pad).unwrap();
|
let sink_pad = pads.sink_pads.remove(pad).unwrap();
|
||||||
drop(sink_pad);
|
drop(sink_pad);
|
||||||
self.instance().remove_pad(pad).unwrap();
|
self.obj().remove_pad(pad).unwrap();
|
||||||
drop(pads);
|
drop(pads);
|
||||||
|
|
||||||
let _ = self.instance().post_message(
|
let _ = self
|
||||||
gst::message::Latency::builder()
|
.obj()
|
||||||
.src(&*self.instance())
|
.post_message(gst::message::Latency::builder().src(&*self.obj()).build());
|
||||||
.build(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn provide_clock(&self) -> Option<gst::Clock> {
|
fn provide_clock(&self) -> Option<gst::Clock> {
|
||||||
|
|
|
@ -341,7 +341,7 @@ impl SinkHandler {
|
||||||
pt
|
pt
|
||||||
);
|
);
|
||||||
|
|
||||||
let element = jb.instance();
|
let element = jb.obj();
|
||||||
|
|
||||||
if dts.is_none() {
|
if dts.is_none() {
|
||||||
dts = pts;
|
dts = pts;
|
||||||
|
@ -523,7 +523,7 @@ impl SinkHandler {
|
||||||
// Reschedule if needed
|
// Reschedule if needed
|
||||||
let (_, next_wakeup) =
|
let (_, next_wakeup) =
|
||||||
jb.src_pad_handler
|
jb.src_pad_handler
|
||||||
.next_wakeup(&jb.instance(), &state, latency, context_wait);
|
.next_wakeup(&jb.obj(), &state, latency, context_wait);
|
||||||
if let Some((next_wakeup, _)) = next_wakeup {
|
if let Some((next_wakeup, _)) = next_wakeup {
|
||||||
if let Some((previous_next_wakeup, ref abort_handle)) = state.wait_handle {
|
if let Some((previous_next_wakeup, ref abort_handle)) = state.wait_handle {
|
||||||
if previous_next_wakeup.is_none()
|
if previous_next_wakeup.is_none()
|
||||||
|
@ -1262,11 +1262,7 @@ impl JitterBuffer {
|
||||||
|
|
||||||
self.task
|
self.task
|
||||||
.prepare(
|
.prepare(
|
||||||
JitterBufferTask::new(
|
JitterBufferTask::new(&*self.obj(), &self.src_pad_handler, &self.sink_pad_handler),
|
||||||
&*self.instance(),
|
|
||||||
&self.src_pad_handler,
|
|
||||||
&self.sink_pad_handler,
|
|
||||||
),
|
|
||||||
context,
|
context,
|
||||||
)
|
)
|
||||||
.block_on()?;
|
.block_on()?;
|
||||||
|
@ -1407,11 +1403,9 @@ impl ObjectImpl for JitterBuffer {
|
||||||
let state = self.state.lock().unwrap();
|
let state = self.state.lock().unwrap();
|
||||||
state.jbuf.set_delay(latency);
|
state.jbuf.set_delay(latency);
|
||||||
|
|
||||||
let _ = self.instance().post_message(
|
let _ = self
|
||||||
gst::message::Latency::builder()
|
.obj()
|
||||||
.src(&*self.instance())
|
.post_message(gst::message::Latency::builder().src(&*self.obj()).build());
|
||||||
.build(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
"do-lost" => {
|
"do-lost" => {
|
||||||
let mut settings = self.settings.lock().unwrap();
|
let mut settings = self.settings.lock().unwrap();
|
||||||
|
@ -1484,7 +1478,7 @@ impl ObjectImpl for JitterBuffer {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(self.sink_pad.gst_pad()).unwrap();
|
obj.add_pad(self.sink_pad.gst_pad()).unwrap();
|
||||||
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
||||||
obj.set_element_flags(gst::ElementFlags::PROVIDE_CLOCK | gst::ElementFlags::REQUIRE_CLOCK);
|
obj.set_element_flags(gst::ElementFlags::PROVIDE_CLOCK | gst::ElementFlags::REQUIRE_CLOCK);
|
||||||
|
|
|
@ -588,7 +588,7 @@ impl ObjectImpl for ProxySink {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(self.sink_pad.gst_pad()).unwrap();
|
obj.add_pad(self.sink_pad.gst_pad()).unwrap();
|
||||||
obj.set_element_flags(gst::ElementFlags::SINK);
|
obj.set_element_flags(gst::ElementFlags::SINK);
|
||||||
}
|
}
|
||||||
|
@ -957,7 +957,7 @@ impl ProxySrc {
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let dataqueue = DataQueue::new(
|
let dataqueue = DataQueue::new(
|
||||||
&self.instance().clone().upcast(),
|
&self.obj().clone().upcast(),
|
||||||
self.src_pad.gst_pad(),
|
self.src_pad.gst_pad(),
|
||||||
if settings.max_size_buffers == 0 {
|
if settings.max_size_buffers == 0 {
|
||||||
None
|
None
|
||||||
|
@ -989,10 +989,7 @@ impl ProxySrc {
|
||||||
*self.dataqueue.lock().unwrap() = Some(dataqueue.clone());
|
*self.dataqueue.lock().unwrap() = Some(dataqueue.clone());
|
||||||
|
|
||||||
self.task
|
self.task
|
||||||
.prepare(
|
.prepare(ProxySrcTask::new(self.obj().clone(), dataqueue), ts_ctx)
|
||||||
ProxySrcTask::new(self.instance().clone(), dataqueue),
|
|
||||||
ts_ctx,
|
|
||||||
)
|
|
||||||
.block_on()?;
|
.block_on()?;
|
||||||
|
|
||||||
gst::debug!(SRC_CAT, imp: self, "Prepared");
|
gst::debug!(SRC_CAT, imp: self, "Prepared");
|
||||||
|
@ -1150,7 +1147,7 @@ impl ObjectImpl for ProxySrc {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
||||||
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -559,7 +559,7 @@ impl Queue {
|
||||||
let settings = self.settings.lock().unwrap().clone();
|
let settings = self.settings.lock().unwrap().clone();
|
||||||
|
|
||||||
let dataqueue = DataQueue::new(
|
let dataqueue = DataQueue::new(
|
||||||
&self.instance().clone().upcast(),
|
&self.obj().clone().upcast(),
|
||||||
self.src_pad.gst_pad(),
|
self.src_pad.gst_pad(),
|
||||||
if settings.max_size_buffers == 0 {
|
if settings.max_size_buffers == 0 {
|
||||||
None
|
None
|
||||||
|
@ -589,7 +589,7 @@ impl Queue {
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
self.task
|
self.task
|
||||||
.prepare(QueueTask::new(self.instance().clone(), dataqueue), context)
|
.prepare(QueueTask::new(self.obj().clone(), dataqueue), context)
|
||||||
.block_on()?;
|
.block_on()?;
|
||||||
|
|
||||||
gst::debug!(CAT, imp: self, "Prepared");
|
gst::debug!(CAT, imp: self, "Prepared");
|
||||||
|
@ -729,7 +729,7 @@ impl ObjectImpl for Queue {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(self.sink_pad.gst_pad()).unwrap();
|
obj.add_pad(self.sink_pad.gst_pad()).unwrap();
|
||||||
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,7 +163,7 @@ pub trait PadSrcHandler: Clone + Send + Sync + 'static {
|
||||||
fn src_event(&self, pad: &PadSrcRef, imp: &Self::ElementImpl, event: gst::Event) -> bool {
|
fn src_event(&self, pad: &PadSrcRef, imp: &Self::ElementImpl, event: gst::Event) -> bool {
|
||||||
gst::log!(RUNTIME_CAT, obj: pad.gst_pad(), "Handling {:?}", event);
|
gst::log!(RUNTIME_CAT, obj: pad.gst_pad(), "Handling {:?}", event);
|
||||||
|
|
||||||
let elem = imp.instance();
|
let elem = imp.obj();
|
||||||
// FIXME with GAT on `Self::ElementImpl`, we should be able to
|
// FIXME with GAT on `Self::ElementImpl`, we should be able to
|
||||||
// use `.upcast::<gst::Element>()`
|
// use `.upcast::<gst::Element>()`
|
||||||
//
|
//
|
||||||
|
@ -199,7 +199,7 @@ pub trait PadSrcHandler: Clone + Send + Sync + 'static {
|
||||||
} else {
|
} else {
|
||||||
gst::log!(RUNTIME_CAT, obj: pad.gst_pad(), "Handling {:?}", query);
|
gst::log!(RUNTIME_CAT, obj: pad.gst_pad(), "Handling {:?}", query);
|
||||||
|
|
||||||
let elem = imp.instance();
|
let elem = imp.obj();
|
||||||
// FIXME with GAT on `Self::ElementImpl`, we should be able to
|
// FIXME with GAT on `Self::ElementImpl`, we should be able to
|
||||||
// use `.upcast::<gst::Element>()`
|
// use `.upcast::<gst::Element>()`
|
||||||
//
|
//
|
||||||
|
@ -571,7 +571,7 @@ pub trait PadSinkHandler: Clone + Send + Sync + 'static {
|
||||||
assert!(!event.is_serialized());
|
assert!(!event.is_serialized());
|
||||||
gst::log!(RUNTIME_CAT, obj: pad.gst_pad(), "Handling {:?}", event);
|
gst::log!(RUNTIME_CAT, obj: pad.gst_pad(), "Handling {:?}", event);
|
||||||
|
|
||||||
let elem = imp.instance();
|
let elem = imp.obj();
|
||||||
// FIXME with GAT on `Self::ElementImpl`, we should be able to
|
// FIXME with GAT on `Self::ElementImpl`, we should be able to
|
||||||
// use `.upcast::<gst::Element>()`
|
// use `.upcast::<gst::Element>()`
|
||||||
//
|
//
|
||||||
|
@ -646,7 +646,7 @@ pub trait PadSinkHandler: Clone + Send + Sync + 'static {
|
||||||
} else {
|
} else {
|
||||||
gst::log!(RUNTIME_CAT, obj: pad.gst_pad(), "Handling {:?}", query);
|
gst::log!(RUNTIME_CAT, obj: pad.gst_pad(), "Handling {:?}", query);
|
||||||
|
|
||||||
let elem = imp.instance();
|
let elem = imp.obj();
|
||||||
// FIXME with GAT on `Self::ElementImpl`, we should be able to
|
// FIXME with GAT on `Self::ElementImpl`, we should be able to
|
||||||
// use `.upcast::<gst::Element>()`
|
// use `.upcast::<gst::Element>()`
|
||||||
//
|
//
|
||||||
|
@ -845,7 +845,7 @@ impl PadSink {
|
||||||
|| Err(FlowError::Error),
|
|| Err(FlowError::Error),
|
||||||
move |imp| {
|
move |imp| {
|
||||||
let this_weak = PadSinkWeak(Arc::downgrade(&inner_arc));
|
let this_weak = PadSinkWeak(Arc::downgrade(&inner_arc));
|
||||||
let elem = imp.instance().clone();
|
let elem = imp.obj().clone();
|
||||||
|
|
||||||
if let Some((ctx, task_id)) = Context::current_task() {
|
if let Some((ctx, task_id)) = Context::current_task() {
|
||||||
let delayed_fut = async move {
|
let delayed_fut = async move {
|
||||||
|
@ -874,7 +874,7 @@ impl PadSink {
|
||||||
|| Err(FlowError::Error),
|
|| Err(FlowError::Error),
|
||||||
move |imp| {
|
move |imp| {
|
||||||
let this_weak = PadSinkWeak(Arc::downgrade(&inner_arc));
|
let this_weak = PadSinkWeak(Arc::downgrade(&inner_arc));
|
||||||
let elem = imp.instance().clone();
|
let elem = imp.obj().clone();
|
||||||
|
|
||||||
if let Some((ctx, task_id)) = Context::current_task() {
|
if let Some((ctx, task_id)) = Context::current_task() {
|
||||||
let delayed_fut = async move {
|
let delayed_fut = async move {
|
||||||
|
@ -907,7 +907,7 @@ impl PadSink {
|
||||||
move |imp| {
|
move |imp| {
|
||||||
if event.is_serialized() {
|
if event.is_serialized() {
|
||||||
let this_weak = PadSinkWeak(Arc::downgrade(&inner_arc));
|
let this_weak = PadSinkWeak(Arc::downgrade(&inner_arc));
|
||||||
let elem = imp.instance().clone();
|
let elem = imp.obj().clone();
|
||||||
|
|
||||||
if let Some((ctx, task_id)) = Context::current_task() {
|
if let Some((ctx, task_id)) = Context::current_task() {
|
||||||
let delayed_fut = async move {
|
let delayed_fut = async move {
|
||||||
|
|
|
@ -437,7 +437,7 @@ impl TcpClientSrc {
|
||||||
let _ = self
|
let _ = self
|
||||||
.task
|
.task
|
||||||
.prepare(
|
.prepare(
|
||||||
TcpClientSrcTask::new(self.instance().clone(), saddr, buffer_pool),
|
TcpClientSrcTask::new(self.obj().clone(), saddr, buffer_pool),
|
||||||
context,
|
context,
|
||||||
)
|
)
|
||||||
.check()?;
|
.check()?;
|
||||||
|
@ -582,7 +582,7 @@ impl ObjectImpl for TcpClientSrc {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
||||||
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -840,7 +840,7 @@ impl UdpSink {
|
||||||
// Enable backpressure for items
|
// Enable backpressure for items
|
||||||
let (item_sender, item_receiver) = flume::bounded(0);
|
let (item_sender, item_receiver) = flume::bounded(0);
|
||||||
let (cmd_sender, cmd_receiver) = flume::unbounded();
|
let (cmd_sender, cmd_receiver) = flume::unbounded();
|
||||||
let task_impl = UdpSinkTask::new(&*self.instance(), item_receiver, cmd_receiver);
|
let task_impl = UdpSinkTask::new(&*self.obj(), item_receiver, cmd_receiver);
|
||||||
self.task.prepare(task_impl, context).block_on()?;
|
self.task.prepare(task_impl, context).block_on()?;
|
||||||
|
|
||||||
*self.item_sender.lock().unwrap() = Some(item_sender);
|
*self.item_sender.lock().unwrap() = Some(item_sender);
|
||||||
|
@ -1248,7 +1248,7 @@ impl ObjectImpl for UdpSink {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(self.sink_pad.gst_pad()).unwrap();
|
obj.add_pad(self.sink_pad.gst_pad()).unwrap();
|
||||||
obj.set_element_flags(gst::ElementFlags::SINK);
|
obj.set_element_flags(gst::ElementFlags::SINK);
|
||||||
}
|
}
|
||||||
|
|
|
@ -575,7 +575,7 @@ impl UdpSrc {
|
||||||
|
|
||||||
*self.configured_caps.lock().unwrap() = None;
|
*self.configured_caps.lock().unwrap() = None;
|
||||||
self.task
|
self.task
|
||||||
.prepare(UdpSrcTask::new(self.instance().clone()), context)
|
.prepare(UdpSrcTask::new(self.obj().clone()), context)
|
||||||
.block_on()?;
|
.block_on()?;
|
||||||
|
|
||||||
gst::debug!(CAT, imp: self, "Prepared");
|
gst::debug!(CAT, imp: self, "Prepared");
|
||||||
|
@ -775,7 +775,7 @@ impl ObjectImpl for UdpSrc {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
||||||
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -237,7 +237,7 @@ mod imp_src {
|
||||||
|
|
||||||
self.task
|
self.task
|
||||||
.prepare(
|
.prepare(
|
||||||
ElementSrcTestTask::new(self.instance().clone(), receiver),
|
ElementSrcTestTask::new(self.obj().clone(), receiver),
|
||||||
context,
|
context,
|
||||||
)
|
)
|
||||||
.block_on()?;
|
.block_on()?;
|
||||||
|
@ -325,7 +325,7 @@ mod imp_src {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
obj.add_pad(self.src_pad.gst_pad()).unwrap();
|
||||||
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
||||||
}
|
}
|
||||||
|
@ -617,7 +617,7 @@ mod imp_sink {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(self.sink_pad.gst_pad()).unwrap();
|
obj.add_pad(self.sink_pad.gst_pad()).unwrap();
|
||||||
obj.set_element_flags(gst::ElementFlags::SINK);
|
obj.set_element_flags(gst::ElementFlags::SINK);
|
||||||
}
|
}
|
||||||
|
|
|
@ -183,7 +183,7 @@ impl ObjectImpl for FlvDemux {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
self.instance().add_pad(&self.sinkpad).unwrap();
|
self.obj().add_pad(&self.sinkpad).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,12 +351,12 @@ impl FlvDemux {
|
||||||
|
|
||||||
let mut flow_combiner = self.flow_combiner.lock().unwrap();
|
let mut flow_combiner = self.flow_combiner.lock().unwrap();
|
||||||
if let Some(pad) = self.audio_srcpad.lock().unwrap().take() {
|
if let Some(pad) = self.audio_srcpad.lock().unwrap().take() {
|
||||||
self.instance().remove_pad(&pad).unwrap();
|
self.obj().remove_pad(&pad).unwrap();
|
||||||
flow_combiner.remove_pad(&pad);
|
flow_combiner.remove_pad(&pad);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(pad) = self.video_srcpad.lock().unwrap().take() {
|
if let Some(pad) = self.video_srcpad.lock().unwrap().take() {
|
||||||
self.instance().remove_pad(&pad).unwrap();
|
self.obj().remove_pad(&pad).unwrap();
|
||||||
flow_combiner.remove_pad(&pad);
|
flow_combiner.remove_pad(&pad);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -370,21 +370,21 @@ impl FlvDemux {
|
||||||
match event.view() {
|
match event.view() {
|
||||||
EventView::Eos(..) => {
|
EventView::Eos(..) => {
|
||||||
// TODO implement
|
// TODO implement
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
EventView::Segment(..) => {
|
EventView::Segment(..) => {
|
||||||
// TODO implement
|
// TODO implement
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
EventView::FlushStart(..) => {
|
EventView::FlushStart(..) => {
|
||||||
// TODO implement
|
// TODO implement
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
EventView::FlushStop(..) => {
|
EventView::FlushStop(..) => {
|
||||||
// TODO implement
|
// TODO implement
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -432,7 +432,7 @@ impl FlvDemux {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => gst::Pad::query_default(pad, Some(&*self.instance()), query),
|
_ => gst::Pad::query_default(pad, Some(&*self.obj()), query),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -444,7 +444,7 @@ impl FlvDemux {
|
||||||
// TODO: Implement
|
// TODO: Implement
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -610,7 +610,7 @@ impl FlvDemux {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Event::HaveAllStreams => {
|
Event::HaveAllStreams => {
|
||||||
self.instance().no_more_pads();
|
self.obj().no_more_pads();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -619,7 +619,7 @@ impl FlvDemux {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_srcpad(&self, name: &str, caps: &gst::Caps) -> gst::Pad {
|
fn create_srcpad(&self, name: &str, caps: &gst::Caps) -> gst::Pad {
|
||||||
let templ = self.instance().element_class().pad_template(name).unwrap();
|
let templ = self.obj().element_class().pad_template(name).unwrap();
|
||||||
let srcpad = gst::Pad::builder_with_template(&templ, Some(name))
|
let srcpad = gst::Pad::builder_with_template(&templ, Some(name))
|
||||||
.event_function(|pad, parent, event| {
|
.event_function(|pad, parent, event| {
|
||||||
FlvDemux::catch_panic_pad_function(
|
FlvDemux::catch_panic_pad_function(
|
||||||
|
@ -639,7 +639,7 @@ impl FlvDemux {
|
||||||
|
|
||||||
srcpad.set_active(true).unwrap();
|
srcpad.set_active(true).unwrap();
|
||||||
|
|
||||||
let full_stream_id = srcpad.create_stream_id(&*self.instance(), Some(name));
|
let full_stream_id = srcpad.create_stream_id(&*self.obj(), Some(name));
|
||||||
// FIXME group id
|
// FIXME group id
|
||||||
srcpad.push_event(gst::event::StreamStart::new(&full_stream_id));
|
srcpad.push_event(gst::event::StreamStart::new(&full_stream_id));
|
||||||
srcpad.push_event(gst::event::Caps::new(caps));
|
srcpad.push_event(gst::event::Caps::new(caps));
|
||||||
|
@ -650,7 +650,7 @@ impl FlvDemux {
|
||||||
|
|
||||||
self.flow_combiner.lock().unwrap().add_pad(&srcpad);
|
self.flow_combiner.lock().unwrap().add_pad(&srcpad);
|
||||||
|
|
||||||
self.instance().add_pad(&srcpad).unwrap();
|
self.obj().add_pad(&srcpad).unwrap();
|
||||||
|
|
||||||
srcpad
|
srcpad
|
||||||
}
|
}
|
||||||
|
|
|
@ -436,7 +436,7 @@ impl FMP4Mux {
|
||||||
// If this is a multi-stream element then we need to update the PTS/DTS positions according
|
// If this is a multi-stream element then we need to update the PTS/DTS positions according
|
||||||
// to the output segment, specifically to re-timestamp them with the running time and
|
// to the output segment, specifically to re-timestamp them with the running time and
|
||||||
// adjust for the segment shift to compensate for negative DTS.
|
// adjust for the segment shift to compensate for negative DTS.
|
||||||
let aggregator = self.instance();
|
let aggregator = self.obj();
|
||||||
let class = aggregator.class();
|
let class = aggregator.class();
|
||||||
let (pts_position, dts_position) = if class.as_ref().variant.is_single_stream() {
|
let (pts_position, dts_position) = if class.as_ref().variant.is_single_stream() {
|
||||||
(pts_position, dts_position)
|
(pts_position, dts_position)
|
||||||
|
@ -898,7 +898,7 @@ impl FMP4Mux {
|
||||||
VecDeque<Buffer>,
|
VecDeque<Buffer>,
|
||||||
)],
|
)],
|
||||||
) -> Result<Option<gst::ClockTime>, gst::FlowError> {
|
) -> Result<Option<gst::ClockTime>, gst::FlowError> {
|
||||||
let aggregator = self.instance();
|
let aggregator = self.obj();
|
||||||
if aggregator.class().as_ref().variant != super::Variant::ONVIF {
|
if aggregator.class().as_ref().variant != super::Variant::ONVIF {
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
}
|
}
|
||||||
|
@ -1297,7 +1297,7 @@ impl FMP4Mux {
|
||||||
state.sequence_number += 1;
|
state.sequence_number += 1;
|
||||||
let (mut fmp4_fragment_header, moof_offset) =
|
let (mut fmp4_fragment_header, moof_offset) =
|
||||||
boxes::create_fmp4_fragment_header(super::FragmentHeaderConfiguration {
|
boxes::create_fmp4_fragment_header(super::FragmentHeaderConfiguration {
|
||||||
variant: self.instance().class().as_ref().variant,
|
variant: self.obj().class().as_ref().variant,
|
||||||
sequence_number,
|
sequence_number,
|
||||||
streams: streams.as_slice(),
|
streams: streams.as_slice(),
|
||||||
buffers: interleaved_buffers.as_slice(),
|
buffers: interleaved_buffers.as_slice(),
|
||||||
|
@ -1429,7 +1429,7 @@ impl FMP4Mux {
|
||||||
|
|
||||||
fn create_streams(&self, state: &mut State) -> Result<(), gst::FlowError> {
|
fn create_streams(&self, state: &mut State) -> Result<(), gst::FlowError> {
|
||||||
for pad in self
|
for pad in self
|
||||||
.instance()
|
.obj()
|
||||||
.sink_pads()
|
.sink_pads()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|pad| pad.downcast::<gst_base::AggregatorPad>().unwrap())
|
.map(|pad| pad.downcast::<gst_base::AggregatorPad>().unwrap())
|
||||||
|
@ -1528,7 +1528,7 @@ impl FMP4Mux {
|
||||||
settings: &Settings,
|
settings: &Settings,
|
||||||
at_eos: bool,
|
at_eos: bool,
|
||||||
) -> Result<Option<(gst::BufferList, gst::Caps)>, gst::FlowError> {
|
) -> Result<Option<(gst::BufferList, gst::Caps)>, gst::FlowError> {
|
||||||
let aggregator = self.instance();
|
let aggregator = self.obj();
|
||||||
let class = aggregator.class();
|
let class = aggregator.class();
|
||||||
let variant = class.as_ref().variant;
|
let variant = class.as_ref().variant;
|
||||||
|
|
||||||
|
@ -1666,7 +1666,7 @@ impl ObjectImpl for FMP4Mux {
|
||||||
if settings.fragment_duration != fragment_duration {
|
if settings.fragment_duration != fragment_duration {
|
||||||
settings.fragment_duration = fragment_duration;
|
settings.fragment_duration = fragment_duration;
|
||||||
drop(settings);
|
drop(settings);
|
||||||
self.instance().set_latency(fragment_duration, None);
|
self.obj().set_latency(fragment_duration, None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1744,7 +1744,7 @@ impl ObjectImpl for FMP4Mux {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
let class = obj.class();
|
let class = obj.class();
|
||||||
for templ in class.pad_template_list().filter(|templ| {
|
for templ in class.pad_template_list().filter(|templ| {
|
||||||
templ.presence() == gst::PadPresence::Always
|
templ.presence() == gst::PadPresence::Always
|
||||||
|
@ -1866,7 +1866,7 @@ impl AggregatorImpl for FMP4Mux {
|
||||||
// Only forward the segment event verbatim if this is a single stream variant.
|
// Only forward the segment event verbatim if this is a single stream variant.
|
||||||
// Otherwise we have to produce a default segment and re-timestamp all buffers
|
// Otherwise we have to produce a default segment and re-timestamp all buffers
|
||||||
// with their running time.
|
// with their running time.
|
||||||
let aggregator = self.instance();
|
let aggregator = self.obj();
|
||||||
let class = aggregator.class();
|
let class = aggregator.class();
|
||||||
if class.as_ref().variant.is_single_stream() {
|
if class.as_ref().variant.is_single_stream() {
|
||||||
aggregator.update_segment(&segment);
|
aggregator.update_segment(&segment);
|
||||||
|
@ -1945,7 +1945,7 @@ impl AggregatorImpl for FMP4Mux {
|
||||||
|
|
||||||
// For non-single-stream variants configure a default segment that allows for negative
|
// For non-single-stream variants configure a default segment that allows for negative
|
||||||
// DTS so that we can correctly re-timestamp buffers with their running times.
|
// DTS so that we can correctly re-timestamp buffers with their running times.
|
||||||
let aggregator = self.instance();
|
let aggregator = self.obj();
|
||||||
let class = aggregator.class();
|
let class = aggregator.class();
|
||||||
if !class.as_ref().variant.is_single_stream() {
|
if !class.as_ref().variant.is_single_stream() {
|
||||||
let mut segment = gst::FormattedSegment::<gst::ClockTime>::new();
|
let mut segment = gst::FormattedSegment::<gst::ClockTime>::new();
|
||||||
|
@ -2127,12 +2127,12 @@ impl AggregatorImpl for FMP4Mux {
|
||||||
|
|
||||||
if let Some(caps) = caps {
|
if let Some(caps) = caps {
|
||||||
gst::debug!(CAT, imp: self, "Setting caps on source pad: {:?}", caps);
|
gst::debug!(CAT, imp: self, "Setting caps on source pad: {:?}", caps);
|
||||||
self.instance().set_src_caps(&caps);
|
self.obj().set_src_caps(&caps);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(buffers) = buffers {
|
if let Some(buffers) = buffers {
|
||||||
gst::trace!(CAT, imp: self, "Pushing buffer list {:?}", buffers);
|
gst::trace!(CAT, imp: self, "Pushing buffer list {:?}", buffers);
|
||||||
self.instance().finish_buffer_list(buffers)?;
|
self.obj().finish_buffer_list(buffers)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if all_eos {
|
if all_eos {
|
||||||
|
@ -2147,8 +2147,8 @@ impl AggregatorImpl for FMP4Mux {
|
||||||
super::HeaderUpdateMode::None => unreachable!(),
|
super::HeaderUpdateMode::None => unreachable!(),
|
||||||
super::HeaderUpdateMode::Rewrite => {
|
super::HeaderUpdateMode::Rewrite => {
|
||||||
let mut q = gst::query::Seeking::new(gst::Format::Bytes);
|
let mut q = gst::query::Seeking::new(gst::Format::Bytes);
|
||||||
if self.instance().src_pad().peer_query(&mut q) && q.result().0 {
|
if self.obj().src_pad().peer_query(&mut q) && q.result().0 {
|
||||||
let aggregator = self.instance();
|
let aggregator = self.obj();
|
||||||
|
|
||||||
aggregator.set_src_caps(&caps);
|
aggregator.set_src_caps(&caps);
|
||||||
|
|
||||||
|
@ -2175,7 +2175,7 @@ impl AggregatorImpl for FMP4Mux {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
super::HeaderUpdateMode::Update => {
|
super::HeaderUpdateMode::Update => {
|
||||||
let aggregator = self.instance();
|
let aggregator = self.obj();
|
||||||
|
|
||||||
aggregator.set_src_caps(&caps);
|
aggregator.set_src_caps(&caps);
|
||||||
if let Err(err) = aggregator.finish_buffer_list(buffer_list) {
|
if let Err(err) = aggregator.finish_buffer_list(buffer_list) {
|
||||||
|
|
|
@ -223,10 +223,10 @@ impl TranscribeParse {
|
||||||
EventView::FlushStop(..) => {
|
EventView::FlushStop(..) => {
|
||||||
let mut state = self.state.lock().unwrap();
|
let mut state = self.state.lock().unwrap();
|
||||||
*state = State::default();
|
*state = State::default();
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
EventView::Eos(..) => match self.drain() {
|
EventView::Eos(..) => match self.drain() {
|
||||||
Ok(()) => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
Ok(()) => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
gst::error!(CAT, imp: self, "failed to drain on EOS: {}", err);
|
gst::error!(CAT, imp: self, "failed to drain on EOS: {}", err);
|
||||||
element_imp_error!(
|
element_imp_error!(
|
||||||
|
@ -239,7 +239,7 @@ impl TranscribeParse {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
EventView::Segment(..) | EventView::Caps(..) => true,
|
EventView::Segment(..) | EventView::Caps(..) => true,
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -284,7 +284,7 @@ impl ObjectImpl for TranscribeParse {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -223,7 +223,7 @@ impl Transcriber {
|
||||||
/* First, check our pending buffers */
|
/* First, check our pending buffers */
|
||||||
let mut items = vec![];
|
let mut items = vec![];
|
||||||
|
|
||||||
let now = match self.instance().current_running_time() {
|
let now = match self.obj().current_running_time() {
|
||||||
Some(now) => now,
|
Some(now) => now,
|
||||||
None => {
|
None => {
|
||||||
return true;
|
return true;
|
||||||
|
@ -645,7 +645,7 @@ impl Transcriber {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => gst::Pad::query_default(pad, Some(&*self.instance()), query),
|
_ => gst::Pad::query_default(pad, Some(&*self.obj()), query),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -664,7 +664,7 @@ impl Transcriber {
|
||||||
},
|
},
|
||||||
EventView::FlushStart(_) => {
|
EventView::FlushStart(_) => {
|
||||||
gst::info!(CAT, imp: self, "Received flush start, disconnecting");
|
gst::info!(CAT, imp: self, "Received flush start, disconnecting");
|
||||||
let mut ret = gst::Pad::event_default(pad, Some(&*self.instance()), event);
|
let mut ret = gst::Pad::event_default(pad, Some(&*self.obj()), event);
|
||||||
|
|
||||||
match self.srcpad.stop_task() {
|
match self.srcpad.stop_task() {
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
|
@ -684,7 +684,7 @@ impl Transcriber {
|
||||||
EventView::FlushStop(_) => {
|
EventView::FlushStop(_) => {
|
||||||
gst::info!(CAT, imp: self, "Received flush stop, restarting task");
|
gst::info!(CAT, imp: self, "Received flush stop, restarting task");
|
||||||
|
|
||||||
if gst::Pad::event_default(pad, Some(&*self.instance()), event) {
|
if gst::Pad::event_default(pad, Some(&*self.obj()), event) {
|
||||||
match self.start_task() {
|
match self.start_task() {
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
gst::error!(CAT, imp: self, "Failed to start srcpad task: {}", err);
|
gst::error!(CAT, imp: self, "Failed to start srcpad task: {}", err);
|
||||||
|
@ -722,7 +722,7 @@ impl Transcriber {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
EventView::StreamStart(_) => true,
|
EventView::StreamStart(_) => true,
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -737,7 +737,7 @@ impl Transcriber {
|
||||||
|
|
||||||
if let Some(buffer) = &buffer {
|
if let Some(buffer) = &buffer {
|
||||||
let running_time = state.in_segment.to_running_time(buffer.pts());
|
let running_time = state.in_segment.to_running_time(buffer.pts());
|
||||||
let now = self.instance().current_running_time();
|
let now = self.obj().current_running_time();
|
||||||
|
|
||||||
delay = running_time.opt_checked_sub(now).ok().flatten();
|
delay = running_time.opt_checked_sub(now).ok().flatten();
|
||||||
}
|
}
|
||||||
|
@ -1202,7 +1202,7 @@ impl ObjectImpl for Transcriber {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
obj.set_element_flags(gst::ElementFlags::PROVIDE_CLOCK | gst::ElementFlags::REQUIRE_CLOCK);
|
obj.set_element_flags(gst::ElementFlags::PROVIDE_CLOCK | gst::ElementFlags::REQUIRE_CLOCK);
|
||||||
|
|
|
@ -576,7 +576,7 @@ impl ObjectImpl for S3HlsSink {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
self.instance().add(&self.hlssink).unwrap();
|
self.obj().add(&self.hlssink).unwrap();
|
||||||
|
|
||||||
let mut settings = self.settings.lock().unwrap();
|
let mut settings = self.settings.lock().unwrap();
|
||||||
|
|
||||||
|
@ -830,7 +830,7 @@ impl ElementImpl for S3HlsSink {
|
||||||
let sink_pad =
|
let sink_pad =
|
||||||
gst::GhostPad::from_template_with_target(templ, Some("audio"), &audio_pad)
|
gst::GhostPad::from_template_with_target(templ, Some("audio"), &audio_pad)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
self.instance().add_pad(&sink_pad).unwrap();
|
self.obj().add_pad(&sink_pad).unwrap();
|
||||||
sink_pad.set_active(true).unwrap();
|
sink_pad.set_active(true).unwrap();
|
||||||
settings.audio_sink = true;
|
settings.audio_sink = true;
|
||||||
|
|
||||||
|
@ -850,7 +850,7 @@ impl ElementImpl for S3HlsSink {
|
||||||
let sink_pad =
|
let sink_pad =
|
||||||
gst::GhostPad::from_template_with_target(templ, Some("video"), &video_pad)
|
gst::GhostPad::from_template_with_target(templ, Some("video"), &video_pad)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
self.instance().add_pad(&sink_pad).unwrap();
|
self.obj().add_pad(&sink_pad).unwrap();
|
||||||
sink_pad.set_active(true).unwrap();
|
sink_pad.set_active(true).unwrap();
|
||||||
settings.video_sink = true;
|
settings.video_sink = true;
|
||||||
|
|
||||||
|
|
|
@ -412,7 +412,7 @@ impl ObjectImpl for S3Src {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.set_format(gst::Format::Bytes);
|
obj.set_format(gst::Format::Bytes);
|
||||||
/* Set a larger default blocksize to make read more efficient */
|
/* Set a larger default blocksize to make read more efficient */
|
||||||
obj.set_blocksize(256 * 1024);
|
obj.set_blocksize(256 * 1024);
|
||||||
|
|
|
@ -189,7 +189,7 @@ impl HlsSink3 {
|
||||||
state.current_segment_location = Some(segment_file_location.clone());
|
state.current_segment_location = Some(segment_file_location.clone());
|
||||||
|
|
||||||
let fragment_stream = self
|
let fragment_stream = self
|
||||||
.instance()
|
.obj()
|
||||||
.emit_by_name::<Option<gio::OutputStream>>(
|
.emit_by_name::<Option<gio::OutputStream>>(
|
||||||
SIGNAL_GET_FRAGMENT_STREAM,
|
SIGNAL_GET_FRAGMENT_STREAM,
|
||||||
&[&segment_file_location],
|
&[&segment_file_location],
|
||||||
|
@ -280,7 +280,7 @@ impl HlsSink3 {
|
||||||
// Acquires the playlist file handle so we can update it with new content. By default, this
|
// Acquires the playlist file handle so we can update it with new content. By default, this
|
||||||
// is expected to be the same file every time.
|
// is expected to be the same file every time.
|
||||||
let mut playlist_stream = self
|
let mut playlist_stream = self
|
||||||
.instance()
|
.obj()
|
||||||
.emit_by_name::<Option<gio::OutputStream>>(
|
.emit_by_name::<Option<gio::OutputStream>>(
|
||||||
SIGNAL_GET_PLAYLIST_STREAM,
|
SIGNAL_GET_PLAYLIST_STREAM,
|
||||||
&[&playlist_location],
|
&[&playlist_location],
|
||||||
|
@ -323,7 +323,7 @@ impl HlsSink3 {
|
||||||
for _ in 0..state.old_segment_locations.len() - max_num_segments {
|
for _ in 0..state.old_segment_locations.len() - max_num_segments {
|
||||||
let old_segment_location = state.old_segment_locations.remove(0);
|
let old_segment_location = state.old_segment_locations.remove(0);
|
||||||
if !self
|
if !self
|
||||||
.instance()
|
.obj()
|
||||||
.emit_by_name::<bool>(SIGNAL_DELETE_FRAGMENT, &[&old_segment_location])
|
.emit_by_name::<bool>(SIGNAL_DELETE_FRAGMENT, &[&old_segment_location])
|
||||||
{
|
{
|
||||||
gst::error!(CAT, imp: self, "Could not delete fragment");
|
gst::error!(CAT, imp: self, "Could not delete fragment");
|
||||||
|
@ -617,7 +617,7 @@ impl ObjectImpl for HlsSink3 {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.set_element_flags(gst::ElementFlags::SINK);
|
obj.set_element_flags(gst::ElementFlags::SINK);
|
||||||
obj.set_suppressed_flags(gst::ElementFlags::SINK | gst::ElementFlags::SOURCE);
|
obj.set_suppressed_flags(gst::ElementFlags::SINK | gst::ElementFlags::SOURCE);
|
||||||
|
|
||||||
|
@ -772,7 +772,7 @@ impl ElementImpl for HlsSink3 {
|
||||||
let sink_pad =
|
let sink_pad =
|
||||||
gst::GhostPad::from_template_with_target(templ, Some("audio"), &peer_pad)
|
gst::GhostPad::from_template_with_target(templ, Some("audio"), &peer_pad)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
self.instance().add_pad(&sink_pad).unwrap();
|
self.obj().add_pad(&sink_pad).unwrap();
|
||||||
sink_pad.set_active(true).unwrap();
|
sink_pad.set_active(true).unwrap();
|
||||||
settings.audio_sink = true;
|
settings.audio_sink = true;
|
||||||
|
|
||||||
|
@ -792,7 +792,7 @@ impl ElementImpl for HlsSink3 {
|
||||||
let sink_pad =
|
let sink_pad =
|
||||||
gst::GhostPad::from_template_with_target(templ, Some("video"), &peer_pad)
|
gst::GhostPad::from_template_with_target(templ, Some("video"), &peer_pad)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
self.instance().add_pad(&sink_pad).unwrap();
|
self.obj().add_pad(&sink_pad).unwrap();
|
||||||
sink_pad.set_active(true).unwrap();
|
sink_pad.set_active(true).unwrap();
|
||||||
settings.video_sink = true;
|
settings.video_sink = true;
|
||||||
|
|
||||||
|
@ -823,7 +823,7 @@ impl ElementImpl for HlsSink3 {
|
||||||
}
|
}
|
||||||
|
|
||||||
pad.set_active(false).unwrap();
|
pad.set_active(false).unwrap();
|
||||||
self.instance().remove_pad(pad).unwrap();
|
self.obj().remove_pad(pad).unwrap();
|
||||||
|
|
||||||
if "audio" == ghost_pad.name() {
|
if "audio" == ghost_pad.name() {
|
||||||
settings.audio_sink = false;
|
settings.audio_sink = false;
|
||||||
|
|
|
@ -177,14 +177,14 @@ impl DeviceProvider {
|
||||||
current_devices_guard.retain(|d| !expired_devices.contains(d));
|
current_devices_guard.retain(|d| !expired_devices.contains(d));
|
||||||
// And also notify the device provider of them having disappeared
|
// And also notify the device provider of them having disappeared
|
||||||
for old_device in expired_devices {
|
for old_device in expired_devices {
|
||||||
self.instance().device_remove(&old_device);
|
self.obj().device_remove(&old_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now go through all new devices and announce them
|
// Now go through all new devices and announce them
|
||||||
for source in sources {
|
for source in sources {
|
||||||
gst::log!(CAT, imp: self, "Source {:?} appeared", source);
|
gst::log!(CAT, imp: self, "Source {:?} appeared", source);
|
||||||
let device = super::Device::new(&source);
|
let device = super::Device::new(&source);
|
||||||
self.instance().device_add(&device);
|
self.obj().device_add(&device);
|
||||||
current_devices_guard.push(device);
|
current_devices_guard.push(device);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -290,14 +290,14 @@ impl BaseSinkImpl for NdiSink {
|
||||||
// Skip empty/gap buffers from ndisinkcombiner
|
// Skip empty/gap buffers from ndisinkcombiner
|
||||||
if buffer.size() != 0 {
|
if buffer.size() != 0 {
|
||||||
let timecode = self
|
let timecode = self
|
||||||
.instance()
|
.obj()
|
||||||
.segment()
|
.segment()
|
||||||
.downcast::<gst::ClockTime>()
|
.downcast::<gst::ClockTime>()
|
||||||
.ok()
|
.ok()
|
||||||
.and_then(|segment| {
|
.and_then(|segment| {
|
||||||
segment
|
segment
|
||||||
.to_running_time(buffer.pts())
|
.to_running_time(buffer.pts())
|
||||||
.zip(self.instance().base_time())
|
.zip(self.obj().base_time())
|
||||||
})
|
})
|
||||||
.and_then(|(running_time, base_time)| running_time.checked_add(base_time))
|
.and_then(|(running_time, base_time)| running_time.checked_add(base_time))
|
||||||
.map(|time| (time.nseconds() / 100) as i64)
|
.map(|time| (time.nseconds() / 100) as i64)
|
||||||
|
@ -331,14 +331,14 @@ impl BaseSinkImpl for NdiSink {
|
||||||
}
|
}
|
||||||
} else if let Some(ref info) = state.audio_info {
|
} else if let Some(ref info) = state.audio_info {
|
||||||
let timecode = self
|
let timecode = self
|
||||||
.instance()
|
.obj()
|
||||||
.segment()
|
.segment()
|
||||||
.downcast::<gst::ClockTime>()
|
.downcast::<gst::ClockTime>()
|
||||||
.ok()
|
.ok()
|
||||||
.and_then(|segment| {
|
.and_then(|segment| {
|
||||||
segment
|
segment
|
||||||
.to_running_time(buffer.pts())
|
.to_running_time(buffer.pts())
|
||||||
.zip(self.instance().base_time())
|
.zip(self.obj().base_time())
|
||||||
})
|
})
|
||||||
.and_then(|(running_time, base_time)| running_time.checked_add(base_time))
|
.and_then(|(running_time, base_time)| running_time.checked_add(base_time))
|
||||||
.map(|time| (time.nseconds() / 100) as i64)
|
.map(|time| (time.nseconds() / 100) as i64)
|
||||||
|
|
|
@ -59,7 +59,7 @@ impl ObjectImpl for NdiSinkCombiner {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.video_pad).unwrap();
|
obj.add_pad(&self.video_pad).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -161,7 +161,7 @@ impl AggregatorImpl for NdiSinkCombiner {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let sink_templ = self.instance().pad_template("audio").unwrap();
|
let sink_templ = self.obj().pad_template("audio").unwrap();
|
||||||
if templ != &sink_templ {
|
if templ != &sink_templ {
|
||||||
gst::error!(CAT, imp: self, "Wrong pad template");
|
gst::error!(CAT, imp: self, "Wrong pad template");
|
||||||
return None;
|
return None;
|
||||||
|
@ -467,7 +467,7 @@ impl AggregatorImpl for NdiSinkCombiner {
|
||||||
.unwrap_or(true)
|
.unwrap_or(true)
|
||||||
{
|
{
|
||||||
let timecode = self
|
let timecode = self
|
||||||
.instance()
|
.obj()
|
||||||
.base_time()
|
.base_time()
|
||||||
.zip(audio_running_time)
|
.zip(audio_running_time)
|
||||||
.map(|(base_time, audio_running_time)| {
|
.map(|(base_time, audio_running_time)| {
|
||||||
|
@ -522,7 +522,7 @@ impl AggregatorImpl for NdiSinkCombiner {
|
||||||
"Finishing video buffer {:?}",
|
"Finishing video buffer {:?}",
|
||||||
current_video_buffer
|
current_video_buffer
|
||||||
);
|
);
|
||||||
self.instance().finish_buffer(current_video_buffer)
|
self.obj().finish_buffer(current_video_buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sink_event(&self, pad: &gst_base::AggregatorPad, event: gst::Event) -> bool {
|
fn sink_event(&self, pad: &gst_base::AggregatorPad, event: gst::Event) -> bool {
|
||||||
|
@ -562,10 +562,10 @@ impl AggregatorImpl for NdiSinkCombiner {
|
||||||
|
|
||||||
drop(state_storage);
|
drop(state_storage);
|
||||||
|
|
||||||
self.instance().set_latency(latency, gst::ClockTime::NONE);
|
self.obj().set_latency(latency, gst::ClockTime::NONE);
|
||||||
|
|
||||||
// The video caps are passed through as the audio is included only in a meta
|
// The video caps are passed through as the audio is included only in a meta
|
||||||
self.instance().set_src_caps(&caps);
|
self.obj().set_src_caps(&caps);
|
||||||
} else {
|
} else {
|
||||||
let info = match gst_audio::AudioInfo::from_caps(&caps) {
|
let info = match gst_audio::AudioInfo::from_caps(&caps) {
|
||||||
Ok(info) => info,
|
Ok(info) => info,
|
||||||
|
@ -582,7 +582,7 @@ impl AggregatorImpl for NdiSinkCombiner {
|
||||||
EventView::Segment(segment) if pad == &self.video_pad => {
|
EventView::Segment(segment) if pad == &self.video_pad => {
|
||||||
let segment = segment.segment();
|
let segment = segment.segment();
|
||||||
gst::debug!(CAT, obj: pad, "Updating segment {:?}", segment);
|
gst::debug!(CAT, obj: pad, "Updating segment {:?}", segment);
|
||||||
self.instance().update_segment(segment);
|
self.obj().update_segment(segment);
|
||||||
}
|
}
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
|
@ -596,7 +596,7 @@ impl AggregatorImpl for NdiSinkCombiner {
|
||||||
match query.view_mut() {
|
match query.view_mut() {
|
||||||
QueryViewMut::Caps(_) if pad == &self.video_pad => {
|
QueryViewMut::Caps(_) if pad == &self.video_pad => {
|
||||||
// Directly forward caps queries
|
// Directly forward caps queries
|
||||||
let srcpad = self.instance().static_pad("src").unwrap();
|
let srcpad = self.obj().static_pad("src").unwrap();
|
||||||
return srcpad.peer_query(query);
|
return srcpad.peer_query(query);
|
||||||
}
|
}
|
||||||
_ => (),
|
_ => (),
|
||||||
|
|
|
@ -170,7 +170,7 @@ impl ObjectImpl for NdiSrc {
|
||||||
|
|
||||||
// Initialize live-ness and notify the base class that
|
// Initialize live-ness and notify the base class that
|
||||||
// we'd like to operate in Time format
|
// we'd like to operate in Time format
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.set_live(true);
|
obj.set_live(true);
|
||||||
obj.set_format(gst::Format::Time);
|
obj.set_format(gst::Format::Time);
|
||||||
}
|
}
|
||||||
|
@ -285,11 +285,9 @@ impl ObjectImpl for NdiSrc {
|
||||||
timestamp_mode
|
timestamp_mode
|
||||||
);
|
);
|
||||||
if settings.timestamp_mode != timestamp_mode {
|
if settings.timestamp_mode != timestamp_mode {
|
||||||
let _ = self.instance().post_message(
|
let _ = self
|
||||||
gst::message::Latency::builder()
|
.obj()
|
||||||
.src(&*self.instance())
|
.post_message(gst::message::Latency::builder().src(&*self.obj()).build());
|
||||||
.build(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
settings.timestamp_mode = timestamp_mode;
|
settings.timestamp_mode = timestamp_mode;
|
||||||
}
|
}
|
||||||
|
@ -407,7 +405,7 @@ impl ElementImpl for NdiSrc {
|
||||||
|
|
||||||
impl BaseSrcImpl for NdiSrc {
|
impl BaseSrcImpl for NdiSrc {
|
||||||
fn negotiate(&self) -> Result<(), gst::LoggableError> {
|
fn negotiate(&self) -> Result<(), gst::LoggableError> {
|
||||||
self.instance()
|
self.obj()
|
||||||
.set_caps(&gst::Caps::builder("application/x-ndi").build())
|
.set_caps(&gst::Caps::builder("application/x-ndi").build())
|
||||||
.map_err(|_| gst::loggable_error!(CAT, "Failed to negotiate caps",))
|
.map_err(|_| gst::loggable_error!(CAT, "Failed to negotiate caps",))
|
||||||
}
|
}
|
||||||
|
@ -440,7 +438,7 @@ impl BaseSrcImpl for NdiSrc {
|
||||||
}
|
}
|
||||||
|
|
||||||
let receiver = Receiver::connect(
|
let receiver = Receiver::connect(
|
||||||
self.instance().upcast_ref(),
|
self.obj().upcast_ref(),
|
||||||
settings.ndi_name.as_deref(),
|
settings.ndi_name.as_deref(),
|
||||||
settings.url_address.as_deref(),
|
settings.url_address.as_deref(),
|
||||||
&settings.receiver_ndi_name,
|
&settings.receiver_ndi_name,
|
||||||
|
@ -593,10 +591,8 @@ impl BaseSrcImpl for NdiSrc {
|
||||||
|
|
||||||
drop(state);
|
drop(state);
|
||||||
if latency_changed {
|
if latency_changed {
|
||||||
let _ = self.instance().post_message(
|
let _ = self.obj().post_message(
|
||||||
gst::message::Latency::builder()
|
gst::message::Latency::builder().src(&*self.obj()).build(),
|
||||||
.src(&*self.instance())
|
|
||||||
.build(),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,7 @@ impl ObjectImpl for NdiSrcDemux {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
self.instance().add_pad(&self.sinkpad).unwrap();
|
self.obj().add_pad(&self.sinkpad).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ impl ElementImpl for NdiSrcDemux {
|
||||||
.iter()
|
.iter()
|
||||||
.flatten()
|
.flatten()
|
||||||
{
|
{
|
||||||
self.instance().remove_pad(pad).unwrap();
|
self.obj().remove_pad(pad).unwrap();
|
||||||
}
|
}
|
||||||
*state = State::default();
|
*state = State::default();
|
||||||
}
|
}
|
||||||
|
@ -179,11 +179,7 @@ impl NdiSrcDemux {
|
||||||
} else {
|
} else {
|
||||||
gst::debug!(CAT, imp: self, "Adding audio pad with caps {}", caps);
|
gst::debug!(CAT, imp: self, "Adding audio pad with caps {}", caps);
|
||||||
|
|
||||||
let templ = self
|
let templ = self.obj().element_class().pad_template("audio").unwrap();
|
||||||
.instance()
|
|
||||||
.element_class()
|
|
||||||
.pad_template("audio")
|
|
||||||
.unwrap();
|
|
||||||
let pad = gst::Pad::builder_with_template(&templ, Some("audio"))
|
let pad = gst::Pad::builder_with_template(&templ, Some("audio"))
|
||||||
.flags(gst::PadFlags::FIXED_CAPS)
|
.flags(gst::PadFlags::FIXED_CAPS)
|
||||||
.build();
|
.build();
|
||||||
|
@ -232,11 +228,7 @@ impl NdiSrcDemux {
|
||||||
} else {
|
} else {
|
||||||
gst::debug!(CAT, imp: self, "Adding video pad with caps {}", caps);
|
gst::debug!(CAT, imp: self, "Adding video pad with caps {}", caps);
|
||||||
|
|
||||||
let templ = self
|
let templ = self.obj().element_class().pad_template("video").unwrap();
|
||||||
.instance()
|
|
||||||
.element_class()
|
|
||||||
.pad_template("video")
|
|
||||||
.unwrap();
|
|
||||||
let pad = gst::Pad::builder_with_template(&templ, Some("video"))
|
let pad = gst::Pad::builder_with_template(&templ, Some("video"))
|
||||||
.flags(gst::PadFlags::FIXED_CAPS)
|
.flags(gst::PadFlags::FIXED_CAPS)
|
||||||
.build();
|
.build();
|
||||||
|
@ -284,9 +276,9 @@ impl NdiSrcDemux {
|
||||||
meta.remove().unwrap();
|
meta.remove().unwrap();
|
||||||
|
|
||||||
if add_pad {
|
if add_pad {
|
||||||
self.instance().add_pad(&srcpad).unwrap();
|
self.obj().add_pad(&srcpad).unwrap();
|
||||||
if self.instance().num_src_pads() == 2 {
|
if self.obj().num_src_pads() == 2 {
|
||||||
self.instance().no_more_pads();
|
self.obj().no_more_pads();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -305,7 +297,7 @@ impl NdiSrcDemux {
|
||||||
|
|
||||||
gst::log!(CAT, imp: self, "Handling event {:?}", event);
|
gst::log!(CAT, imp: self, "Handling event {:?}", event);
|
||||||
if let EventView::Eos(_) = event.view() {
|
if let EventView::Eos(_) = event.view() {
|
||||||
if self.instance().num_src_pads() == 0 {
|
if self.obj().num_src_pads() == 0 {
|
||||||
// error out on EOS if no src pad are available
|
// error out on EOS if no src pad are available
|
||||||
gst::element_imp_error!(
|
gst::element_imp_error!(
|
||||||
self,
|
self,
|
||||||
|
@ -314,6 +306,6 @@ impl NdiSrcDemux {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ impl ObjectImpl for OnvifMetadataCombiner {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.media_sink_pad).unwrap();
|
obj.add_pad(&self.media_sink_pad).unwrap();
|
||||||
obj.add_pad(&self.meta_sink_pad).unwrap();
|
obj.add_pad(&self.meta_sink_pad).unwrap();
|
||||||
}
|
}
|
||||||
|
@ -381,7 +381,7 @@ impl AggregatorImpl for OnvifMetadataCombiner {
|
||||||
|
|
||||||
gst::log!(CAT, imp: self, "Updating position: {:?}", position);
|
gst::log!(CAT, imp: self, "Updating position: {:?}", position);
|
||||||
|
|
||||||
self.instance().set_position(position);
|
self.obj().set_position(position);
|
||||||
|
|
||||||
self.finish_buffer(buffer)
|
self.finish_buffer(buffer)
|
||||||
} else if self.media_sink_pad.is_eos() {
|
} else if self.media_sink_pad.is_eos() {
|
||||||
|
@ -404,7 +404,7 @@ impl AggregatorImpl for OnvifMetadataCombiner {
|
||||||
| QueryViewMut::Allocation(..) => self.media_sink_pad.peer_query(query),
|
| QueryViewMut::Allocation(..) => self.media_sink_pad.peer_query(query),
|
||||||
QueryViewMut::AcceptCaps(q) => {
|
QueryViewMut::AcceptCaps(q) => {
|
||||||
let caps = q.caps_owned();
|
let caps = q.caps_owned();
|
||||||
let aggregator = self.instance();
|
let aggregator = self.obj();
|
||||||
let class = aggregator.class();
|
let class = aggregator.class();
|
||||||
let templ = class.pad_template("media").unwrap();
|
let templ = class.pad_template("media").unwrap();
|
||||||
let templ_caps = templ.caps();
|
let templ_caps = templ.caps();
|
||||||
|
@ -424,14 +424,14 @@ impl AggregatorImpl for OnvifMetadataCombiner {
|
||||||
EventView::Caps(e) => {
|
EventView::Caps(e) => {
|
||||||
if aggregator_pad.upcast_ref::<gst::Pad>() == &self.media_sink_pad {
|
if aggregator_pad.upcast_ref::<gst::Pad>() == &self.media_sink_pad {
|
||||||
gst::info!(CAT, imp: self, "Pushing caps {}", e.caps());
|
gst::info!(CAT, imp: self, "Pushing caps {}", e.caps());
|
||||||
self.instance().set_src_caps(&e.caps_owned());
|
self.obj().set_src_caps(&e.caps_owned());
|
||||||
}
|
}
|
||||||
|
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
EventView::Segment(e) => {
|
EventView::Segment(e) => {
|
||||||
if aggregator_pad.upcast_ref::<gst::Pad>() == &self.media_sink_pad {
|
if aggregator_pad.upcast_ref::<gst::Pad>() == &self.media_sink_pad {
|
||||||
self.instance().update_segment(e.segment());
|
self.obj().update_segment(e.segment());
|
||||||
}
|
}
|
||||||
self.parent_sink_event(aggregator_pad, event)
|
self.parent_sink_event(aggregator_pad, event)
|
||||||
}
|
}
|
||||||
|
@ -452,17 +452,17 @@ impl AggregatorImpl for OnvifMetadataCombiner {
|
||||||
| QueryViewMut::Uri(..)
|
| QueryViewMut::Uri(..)
|
||||||
| QueryViewMut::Allocation(..) => {
|
| QueryViewMut::Allocation(..) => {
|
||||||
if aggregator_pad == &self.media_sink_pad {
|
if aggregator_pad == &self.media_sink_pad {
|
||||||
self.instance().src_pad().peer_query(query)
|
self.obj().src_pad().peer_query(query)
|
||||||
} else {
|
} else {
|
||||||
self.parent_sink_query(aggregator_pad, query)
|
self.parent_sink_query(aggregator_pad, query)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
QueryViewMut::Caps(q) => {
|
QueryViewMut::Caps(q) => {
|
||||||
if aggregator_pad == &self.media_sink_pad {
|
if aggregator_pad == &self.media_sink_pad {
|
||||||
self.instance().src_pad().peer_query(query)
|
self.obj().src_pad().peer_query(query)
|
||||||
} else {
|
} else {
|
||||||
let filter = q.filter_owned();
|
let filter = q.filter_owned();
|
||||||
let aggregator = self.instance();
|
let aggregator = self.obj();
|
||||||
let class = aggregator.class();
|
let class = aggregator.class();
|
||||||
let templ = class.pad_template("meta").unwrap();
|
let templ = class.pad_template("meta").unwrap();
|
||||||
let templ_caps = templ.caps();
|
let templ_caps = templ.caps();
|
||||||
|
@ -480,10 +480,10 @@ impl AggregatorImpl for OnvifMetadataCombiner {
|
||||||
}
|
}
|
||||||
QueryViewMut::AcceptCaps(q) => {
|
QueryViewMut::AcceptCaps(q) => {
|
||||||
if aggregator_pad.upcast_ref::<gst::Pad>() == &self.media_sink_pad {
|
if aggregator_pad.upcast_ref::<gst::Pad>() == &self.media_sink_pad {
|
||||||
self.instance().src_pad().peer_query(query);
|
self.obj().src_pad().peer_query(query);
|
||||||
} else {
|
} else {
|
||||||
let caps = q.caps_owned();
|
let caps = q.caps_owned();
|
||||||
let aggregator = self.instance();
|
let aggregator = self.obj();
|
||||||
let class = aggregator.class();
|
let class = aggregator.class();
|
||||||
let templ = class.pad_template("meta").unwrap();
|
let templ = class.pad_template("meta").unwrap();
|
||||||
let templ_caps = templ.caps();
|
let templ_caps = templ.caps();
|
||||||
|
@ -498,7 +498,7 @@ impl AggregatorImpl for OnvifMetadataCombiner {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn next_time(&self) -> Option<gst::ClockTime> {
|
fn next_time(&self) -> Option<gst::ClockTime> {
|
||||||
self.instance().simple_get_next_time()
|
self.obj().simple_get_next_time()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn negotiate(&self) -> bool {
|
fn negotiate(&self) -> bool {
|
||||||
|
|
|
@ -83,7 +83,7 @@ impl ElementImpl for OnvifMetadataDepay {
|
||||||
|
|
||||||
impl RTPBaseDepayloadImpl for OnvifMetadataDepay {
|
impl RTPBaseDepayloadImpl for OnvifMetadataDepay {
|
||||||
fn set_caps(&self, _caps: &gst::Caps) -> Result<(), gst::LoggableError> {
|
fn set_caps(&self, _caps: &gst::Caps) -> Result<(), gst::LoggableError> {
|
||||||
let element = self.instance();
|
let element = self.obj();
|
||||||
let src_pad = element.src_pad();
|
let src_pad = element.src_pad();
|
||||||
let src_caps = src_pad.pad_template_caps();
|
let src_caps = src_pad.pad_template_caps();
|
||||||
src_pad.push_event(gst::event::Caps::builder(&src_caps).build());
|
src_pad.push_event(gst::event::Caps::builder(&src_caps).build());
|
||||||
|
|
|
@ -700,9 +700,9 @@ impl OnvifMetadataOverlay {
|
||||||
EventView::FlushStop(..) => {
|
EventView::FlushStop(..) => {
|
||||||
let mut state = self.state.lock().unwrap();
|
let mut state = self.state.lock().unwrap();
|
||||||
state.composition = None;
|
state.composition = None;
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -785,7 +785,7 @@ impl ObjectImpl for OnvifMetadataOverlay {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -522,7 +522,7 @@ impl OnvifMetadataParse {
|
||||||
earliest_utc_time,
|
earliest_utc_time,
|
||||||
);
|
);
|
||||||
|
|
||||||
let (clock, base_time) = match (self.instance().clock(), self.instance().base_time()) {
|
let (clock, base_time) = match (self.obj().clock(), self.obj().base_time()) {
|
||||||
(Some(clock), Some(base_time)) => (clock, base_time),
|
(Some(clock), Some(base_time)) => (clock, base_time),
|
||||||
_ => {
|
_ => {
|
||||||
gst::warning!(
|
gst::warning!(
|
||||||
|
@ -840,7 +840,7 @@ impl OnvifMetadataParse {
|
||||||
drop(state);
|
drop(state);
|
||||||
self.cond.notify_all();
|
self.cond.notify_all();
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
gst::EventView::FlushStop(_) => {
|
gst::EventView::FlushStop(_) => {
|
||||||
let _ = self.srcpad.stop_task();
|
let _ = self.srcpad.stop_task();
|
||||||
|
@ -854,7 +854,7 @@ impl OnvifMetadataParse {
|
||||||
state.out_segment.set_position(gst::ClockTime::NONE);
|
state.out_segment.set_position(gst::ClockTime::NONE);
|
||||||
state.last_flow_ret = Ok(gst::FlowSuccess::Ok);
|
state.last_flow_ret = Ok(gst::FlowSuccess::Ok);
|
||||||
drop(state);
|
drop(state);
|
||||||
let mut res = gst::Pad::event_default(pad, Some(&*self.instance()), event);
|
let mut res = gst::Pad::event_default(pad, Some(&*self.obj()), event);
|
||||||
if res {
|
if res {
|
||||||
res = self.src_start_task().is_ok();
|
res = self.src_start_task().is_ok();
|
||||||
}
|
}
|
||||||
|
@ -917,7 +917,7 @@ impl OnvifMetadataParse {
|
||||||
|
|
||||||
gst::debug!(CAT, obj: pad, "Configuring latency of {}", latency);
|
gst::debug!(CAT, obj: pad, "Configuring latency of {}", latency);
|
||||||
if previous_latency != latency {
|
if previous_latency != latency {
|
||||||
let element = self.instance();
|
let element = self.obj();
|
||||||
let _ = element.post_message(
|
let _ = element.post_message(
|
||||||
gst::message::Latency::builder().src(&*element).build(),
|
gst::message::Latency::builder().src(&*element).build(),
|
||||||
);
|
);
|
||||||
|
@ -1010,7 +1010,7 @@ impl OnvifMetadataParse {
|
||||||
gst::StreamError::Failed,
|
gst::StreamError::Failed,
|
||||||
["Got EOS event before creating UTC/running time mapping"]
|
["Got EOS event before creating UTC/running time mapping"]
|
||||||
);
|
);
|
||||||
return gst::Pad::event_default(pad, Some(&*self.instance()), event);
|
return gst::Pad::event_default(pad, Some(&*self.obj()), event);
|
||||||
}
|
}
|
||||||
|
|
||||||
let current_running_time = in_segment
|
let current_running_time = in_segment
|
||||||
|
@ -1028,7 +1028,7 @@ impl OnvifMetadataParse {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1059,7 +1059,7 @@ impl OnvifMetadataParse {
|
||||||
gst::fixme!(CAT, obj: pad, "Dropping allocation query");
|
gst::fixme!(CAT, obj: pad, "Dropping allocation query");
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
_ => gst::Pad::query_default(pad, Some(&*self.instance()), query),
|
_ => gst::Pad::query_default(pad, Some(&*self.obj()), query),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1076,7 +1076,7 @@ impl OnvifMetadataParse {
|
||||||
drop(state);
|
drop(state);
|
||||||
self.cond.notify_all();
|
self.cond.notify_all();
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
gst::EventView::FlushStop(_) => {
|
gst::EventView::FlushStop(_) => {
|
||||||
let _ = self.srcpad.stop_task();
|
let _ = self.srcpad.stop_task();
|
||||||
|
@ -1090,13 +1090,13 @@ impl OnvifMetadataParse {
|
||||||
state.out_segment.set_position(gst::ClockTime::NONE);
|
state.out_segment.set_position(gst::ClockTime::NONE);
|
||||||
state.last_flow_ret = Ok(gst::FlowSuccess::Ok);
|
state.last_flow_ret = Ok(gst::FlowSuccess::Ok);
|
||||||
drop(state);
|
drop(state);
|
||||||
let mut res = gst::Pad::event_default(pad, Some(&*self.instance()), event);
|
let mut res = gst::Pad::event_default(pad, Some(&*self.obj()), event);
|
||||||
if res {
|
if res {
|
||||||
res = self.src_start_task().is_ok();
|
res = self.src_start_task().is_ok();
|
||||||
}
|
}
|
||||||
res
|
res
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1151,7 +1151,7 @@ impl OnvifMetadataParse {
|
||||||
|
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
_ => gst::Pad::query_default(pad, Some(&*self.instance()), query),
|
_ => gst::Pad::query_default(pad, Some(&*self.obj()), query),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1255,8 +1255,8 @@ impl OnvifMetadataParse {
|
||||||
// Drain until the current clock running time minus the configured latency when
|
// Drain until the current clock running time minus the configured latency when
|
||||||
// live
|
// live
|
||||||
if let Some((now, base_time)) = Option::zip(
|
if let Some((now, base_time)) = Option::zip(
|
||||||
self.instance().clock().and_then(|clock| clock.time()),
|
self.obj().clock().and_then(|clock| clock.time()),
|
||||||
self.instance().base_time(),
|
self.obj().base_time(),
|
||||||
) {
|
) {
|
||||||
gst::trace!(
|
gst::trace!(
|
||||||
CAT,
|
CAT,
|
||||||
|
@ -1505,11 +1505,9 @@ impl ObjectImpl for OnvifMetadataParse {
|
||||||
"latency" => {
|
"latency" => {
|
||||||
self.settings.lock().unwrap().latency = value.get().expect("type checked upstream");
|
self.settings.lock().unwrap().latency = value.get().expect("type checked upstream");
|
||||||
|
|
||||||
let _ = self.instance().post_message(
|
let _ = self
|
||||||
gst::message::Latency::builder()
|
.obj()
|
||||||
.src(&*self.instance())
|
.post_message(gst::message::Latency::builder().src(&*self.obj()).build());
|
||||||
.build(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
"max-lateness" => {
|
"max-lateness" => {
|
||||||
self.settings.lock().unwrap().max_lateness =
|
self.settings.lock().unwrap().max_lateness =
|
||||||
|
@ -1530,7 +1528,7 @@ impl ObjectImpl for OnvifMetadataParse {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,7 +140,7 @@ impl RTPBasePayloadImpl for OnvifMetadataPay {
|
||||||
return Err(gst::FlowError::Error);
|
return Err(gst::FlowError::Error);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mtu = self.instance().mtu();
|
let mtu = self.obj().mtu();
|
||||||
let payload_size = gst_rtp::calc_payload_len(mtu, 0, 0) as usize;
|
let payload_size = gst_rtp::calc_payload_len(mtu, 0, 0) as usize;
|
||||||
|
|
||||||
let mut chunks = utf8.as_bytes().chunks(payload_size).peekable();
|
let mut chunks = utf8.as_bytes().chunks(payload_size).peekable();
|
||||||
|
@ -180,11 +180,11 @@ impl RTPBasePayloadImpl for OnvifMetadataPay {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.instance().push_list(buflist)
|
self.obj().push_list(buflist)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_caps(&self, _caps: &gst::Caps) -> Result<(), gst::LoggableError> {
|
fn set_caps(&self, _caps: &gst::Caps) -> Result<(), gst::LoggableError> {
|
||||||
self.instance()
|
self.obj()
|
||||||
.set_options("application", true, "VND.ONVIF.METADATA", 90000);
|
.set_options("application", true, "VND.ONVIF.METADATA", 90000);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -497,7 +497,7 @@ impl RaptorqDec {
|
||||||
self.reset();
|
self.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fec_sink_event(&self, pad: &gst::Pad, event: gst::Event) -> bool {
|
fn fec_sink_event(&self, pad: &gst::Pad, event: gst::Event) -> bool {
|
||||||
|
@ -516,7 +516,7 @@ impl RaptorqDec {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn iterate_internal_links(&self, pad: &gst::Pad) -> gst::Iterator<gst::Pad> {
|
fn iterate_internal_links(&self, pad: &gst::Pad) -> gst::Iterator<gst::Pad> {
|
||||||
|
@ -719,7 +719,7 @@ impl ObjectImpl for RaptorqDec {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
@ -850,7 +850,7 @@ impl ElementImpl for RaptorqDec {
|
||||||
|
|
||||||
drop(sinkpad_fec_guard);
|
drop(sinkpad_fec_guard);
|
||||||
|
|
||||||
self.instance().add_pad(&sinkpad_fec).unwrap();
|
self.obj().add_pad(&sinkpad_fec).unwrap();
|
||||||
|
|
||||||
Some(sinkpad_fec)
|
Some(sinkpad_fec)
|
||||||
}
|
}
|
||||||
|
@ -861,7 +861,7 @@ impl ElementImpl for RaptorqDec {
|
||||||
if let Some(pad) = pad_guard.take() {
|
if let Some(pad) = pad_guard.take() {
|
||||||
drop(pad_guard);
|
drop(pad_guard);
|
||||||
pad.set_active(false).unwrap();
|
pad.set_active(false).unwrap();
|
||||||
self.instance().remove_pad(&pad).unwrap();
|
self.obj().remove_pad(&pad).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,7 +180,7 @@ impl RaptorqEnc {
|
||||||
.map(|n| ((n * delay_step) as u64).mseconds())
|
.map(|n| ((n * delay_step) as u64).mseconds())
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
let base_time = self.instance().base_time();
|
let base_time = self.obj().base_time();
|
||||||
let running_time = state.segment.to_running_time(now_pts);
|
let running_time = state.segment.to_running_time(now_pts);
|
||||||
|
|
||||||
for (target_time, repair_packet) in Iterator::zip(
|
for (target_time, repair_packet) in Iterator::zip(
|
||||||
|
@ -313,7 +313,7 @@ impl RaptorqEnc {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let clock = match self_.instance().clock() {
|
let clock = match self_.obj().clock() {
|
||||||
Some(clock) => clock,
|
Some(clock) => clock,
|
||||||
None => {
|
None => {
|
||||||
// No clock provided, push buffer immediately
|
// No clock provided, push buffer immediately
|
||||||
|
@ -505,7 +505,7 @@ impl RaptorqEnc {
|
||||||
// Push stream events on FEC srcpad as well
|
// Push stream events on FEC srcpad as well
|
||||||
let stream_id = self
|
let stream_id = self
|
||||||
.srcpad_fec
|
.srcpad_fec
|
||||||
.create_stream_id(&*self.instance(), Some("fec"))
|
.create_stream_id(&*self.obj(), Some("fec"))
|
||||||
.to_string();
|
.to_string();
|
||||||
|
|
||||||
let kmax = extended_source_block_symbols(state.symbols_per_block as u32);
|
let kmax = extended_source_block_symbols(state.symbols_per_block as u32);
|
||||||
|
@ -543,7 +543,7 @@ impl RaptorqEnc {
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn iterate_internal_links(&self, pad: &gst::Pad) -> gst::Iterator<gst::Pad> {
|
fn iterate_internal_links(&self, pad: &gst::Pad) -> gst::Iterator<gst::Pad> {
|
||||||
|
@ -846,7 +846,7 @@ impl ObjectImpl for RaptorqEnc {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad_fec).unwrap();
|
obj.add_pad(&self.srcpad_fec).unwrap();
|
||||||
|
|
|
@ -261,14 +261,14 @@ impl ReqwestHttpSrc {
|
||||||
// unless using proxy, because proxy is client specific.
|
// unless using proxy, because proxy is client specific.
|
||||||
if proxy.is_none() {
|
if proxy.is_none() {
|
||||||
let mut q = gst::query::Context::new(REQWEST_CLIENT_CONTEXT);
|
let mut q = gst::query::Context::new(REQWEST_CLIENT_CONTEXT);
|
||||||
if self.instance().src_pad().peer_query(&mut q) {
|
if self.obj().src_pad().peer_query(&mut q) {
|
||||||
if let Some(context) = q.context_owned() {
|
if let Some(context) = q.context_owned() {
|
||||||
self.instance().set_context(&context);
|
self.obj().set_context(&context);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let _ = self.instance().post_message(
|
let _ = self.obj().post_message(
|
||||||
gst::message::NeedContext::builder(REQWEST_CLIENT_CONTEXT)
|
gst::message::NeedContext::builder(REQWEST_CLIENT_CONTEXT)
|
||||||
.src(&*self.instance())
|
.src(&*self.obj())
|
||||||
.build(),
|
.build(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -317,10 +317,10 @@ impl ReqwestHttpSrc {
|
||||||
let s = context.structure_mut();
|
let s = context.structure_mut();
|
||||||
s.set("client", &client);
|
s.set("client", &client);
|
||||||
}
|
}
|
||||||
self.instance().set_context(&context);
|
self.obj().set_context(&context);
|
||||||
let _ = self.instance().post_message(
|
let _ = self.obj().post_message(
|
||||||
gst::message::HaveContext::builder(context)
|
gst::message::HaveContext::builder(context)
|
||||||
.src(&*self.instance())
|
.src(&*self.obj())
|
||||||
.build(),
|
.build(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -793,7 +793,7 @@ impl ObjectImpl for ReqwestHttpSrc {
|
||||||
}
|
}
|
||||||
"is-live" => {
|
"is-live" => {
|
||||||
let is_live = value.get().expect("type checked upstream");
|
let is_live = value.get().expect("type checked upstream");
|
||||||
self.instance().set_live(is_live);
|
self.obj().set_live(is_live);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
"user-id" => {
|
"user-id" => {
|
||||||
|
@ -897,7 +897,7 @@ impl ObjectImpl for ReqwestHttpSrc {
|
||||||
let settings = self.settings.lock().unwrap();
|
let settings = self.settings.lock().unwrap();
|
||||||
settings.user_agent.to_value()
|
settings.user_agent.to_value()
|
||||||
}
|
}
|
||||||
"is-live" => self.instance().is_live().to_value(),
|
"is-live" => self.obj().is_live().to_value(),
|
||||||
"user-id" => {
|
"user-id" => {
|
||||||
let settings = self.settings.lock().unwrap();
|
let settings = self.settings.lock().unwrap();
|
||||||
settings.user_id.to_value()
|
settings.user_id.to_value()
|
||||||
|
@ -948,7 +948,7 @@ impl ObjectImpl for ReqwestHttpSrc {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.set_automatic_eos(false);
|
obj.set_automatic_eos(false);
|
||||||
obj.set_format(gst::Format::Bytes);
|
obj.set_format(gst::Format::Bytes);
|
||||||
}
|
}
|
||||||
|
@ -1173,16 +1173,14 @@ impl PushSrcImpl for ReqwestHttpSrc {
|
||||||
|
|
||||||
if let Some(caps) = caps {
|
if let Some(caps) = caps {
|
||||||
gst::debug!(CAT, imp: self, "Setting caps {:?}", caps);
|
gst::debug!(CAT, imp: self, "Setting caps {:?}", caps);
|
||||||
self.instance()
|
self.obj()
|
||||||
.set_caps(&caps)
|
.set_caps(&caps)
|
||||||
.map_err(|_| gst::FlowError::NotNegotiated)?;
|
.map_err(|_| gst::FlowError::NotNegotiated)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(tags) = tags {
|
if let Some(tags) = tags {
|
||||||
gst::debug!(CAT, imp: self, "Sending iradio tags {:?}", tags);
|
gst::debug!(CAT, imp: self, "Sending iradio tags {:?}", tags);
|
||||||
self.instance()
|
self.obj().src_pad().push_event(gst::event::Tag::new(tags));
|
||||||
.src_pad()
|
|
||||||
.push_event(gst::event::Tag::new(tags));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let future = async {
|
let future = async {
|
||||||
|
|
|
@ -217,7 +217,7 @@ impl RTPAv1Pay {
|
||||||
state.obus.len()
|
state.obus.len()
|
||||||
);
|
);
|
||||||
|
|
||||||
let payload_limit = gst_rtp::calc_payload_len(self.instance().mtu(), 0, 0);
|
let payload_limit = gst_rtp::calc_payload_len(self.obj().mtu(), 0, 0);
|
||||||
|
|
||||||
// Create information about the packet that can be created now while iterating over the
|
// Create information about the packet that can be created now while iterating over the
|
||||||
// OBUs and return this if a full packet can indeed be created now.
|
// OBUs and return this if a full packet can indeed be created now.
|
||||||
|
@ -601,8 +601,7 @@ impl ElementImpl for RTPAv1Pay {
|
||||||
|
|
||||||
impl RTPBasePayloadImpl for RTPAv1Pay {
|
impl RTPBasePayloadImpl for RTPAv1Pay {
|
||||||
fn set_caps(&self, _caps: &gst::Caps) -> Result<(), gst::LoggableError> {
|
fn set_caps(&self, _caps: &gst::Caps) -> Result<(), gst::LoggableError> {
|
||||||
self.instance()
|
self.obj().set_options("video", true, "AV1", CLOCK_RATE);
|
||||||
.set_options("video", true, "AV1", CLOCK_RATE);
|
|
||||||
|
|
||||||
gst::debug!(CAT, imp: self, "setting caps");
|
gst::debug!(CAT, imp: self, "setting caps");
|
||||||
|
|
||||||
|
@ -636,7 +635,7 @@ impl RTPBasePayloadImpl for RTPAv1Pay {
|
||||||
drop(state);
|
drop(state);
|
||||||
|
|
||||||
if !list.is_empty() {
|
if !list.is_empty() {
|
||||||
self.instance().push_list(list)
|
self.obj().push_list(list)
|
||||||
} else {
|
} else {
|
||||||
Ok(gst::FlowSuccess::Ok)
|
Ok(gst::FlowSuccess::Ok)
|
||||||
}
|
}
|
||||||
|
@ -663,7 +662,7 @@ impl RTPBasePayloadImpl for RTPAv1Pay {
|
||||||
self.reset(&mut state);
|
self.reset(&mut state);
|
||||||
}
|
}
|
||||||
if !list.is_empty() {
|
if !list.is_empty() {
|
||||||
let _ = self.instance().push_list(list);
|
let _ = self.obj().push_list(list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gst::EventView::FlushStop(_) => {
|
gst::EventView::FlushStop(_) => {
|
||||||
|
|
|
@ -1178,7 +1178,7 @@ impl ObjectSubclass for BandwidthEstimator {
|
||||||
parent,
|
parent,
|
||||||
|| false,
|
|| false,
|
||||||
|this| {
|
|this| {
|
||||||
let bwe = this.instance();
|
let bwe = this.obj();
|
||||||
|
|
||||||
if let Some(structure) = event.structure() {
|
if let Some(structure) = event.structure() {
|
||||||
if structure.name() == "RTPTWCCPackets" {
|
if structure.name() == "RTPTWCCPackets" {
|
||||||
|
@ -1220,7 +1220,7 @@ impl ObjectSubclass for BandwidthEstimator {
|
||||||
"Panic activating src pad with mode"
|
"Panic activating src pad with mode"
|
||||||
))
|
))
|
||||||
},
|
},
|
||||||
|this| this.src_activatemode(pad, &this.instance(), mode, active),
|
|this| this.src_activatemode(pad, &this.obj(), mode, active),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.flags(gst::PadFlags::PROXY_CAPS | gst::PadFlags::PROXY_ALLOCATION)
|
.flags(gst::PadFlags::PROXY_CAPS | gst::PadFlags::PROXY_ALLOCATION)
|
||||||
|
@ -1238,7 +1238,7 @@ impl ObjectImpl for BandwidthEstimator {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -248,10 +248,10 @@ impl Signaller {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn start(&self, element: &WebRTCSink) {
|
pub fn start(&self, element: &WebRTCSink) {
|
||||||
let this = self.instance().clone();
|
let this = self.obj().clone();
|
||||||
let element_clone = element.clone();
|
let element_clone = element.clone();
|
||||||
task::spawn(async move {
|
task::spawn(async move {
|
||||||
let this = Self::from_instance(&this);
|
let this = this.imp();
|
||||||
if let Err(err) = this.connect(&element_clone).await {
|
if let Err(err) = this.connect(&element_clone).await {
|
||||||
element_clone.handle_signalling_error(err.into());
|
element_clone.handle_signalling_error(err.into());
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
use crate::webrtcsink::{Signallable, WebRTCSink};
|
use crate::webrtcsink::{Signallable, WebRTCSink};
|
||||||
use gst::glib;
|
use gst::glib;
|
||||||
use gst::subclass::prelude::ObjectSubclassExt;
|
use gst::subclass::prelude::*;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
mod imp;
|
mod imp;
|
||||||
|
@ -16,7 +16,7 @@ unsafe impl Sync for Signaller {}
|
||||||
|
|
||||||
impl Signallable for Signaller {
|
impl Signallable for Signaller {
|
||||||
fn start(&mut self, element: &WebRTCSink) -> Result<(), Box<dyn Error>> {
|
fn start(&mut self, element: &WebRTCSink) -> Result<(), Box<dyn Error>> {
|
||||||
let signaller = imp::Signaller::from_instance(self);
|
let signaller = self.imp();
|
||||||
signaller.start(element);
|
signaller.start(element);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -28,7 +28,7 @@ impl Signallable for Signaller {
|
||||||
peer_id: &str,
|
peer_id: &str,
|
||||||
sdp: &gst_webrtc::WebRTCSessionDescription,
|
sdp: &gst_webrtc::WebRTCSessionDescription,
|
||||||
) -> Result<(), Box<dyn Error>> {
|
) -> Result<(), Box<dyn Error>> {
|
||||||
let signaller = imp::Signaller::from_instance(self);
|
let signaller = self.imp();
|
||||||
signaller.handle_sdp(element, peer_id, sdp);
|
signaller.handle_sdp(element, peer_id, sdp);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -41,18 +41,18 @@ impl Signallable for Signaller {
|
||||||
sdp_mline_index: Option<u32>,
|
sdp_mline_index: Option<u32>,
|
||||||
sdp_mid: Option<String>,
|
sdp_mid: Option<String>,
|
||||||
) -> Result<(), Box<dyn Error>> {
|
) -> Result<(), Box<dyn Error>> {
|
||||||
let signaller = imp::Signaller::from_instance(self);
|
let signaller = self.imp();
|
||||||
signaller.handle_ice(element, session_id, candidate, sdp_mline_index, sdp_mid);
|
signaller.handle_ice(element, session_id, candidate, sdp_mline_index, sdp_mid);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn stop(&mut self, element: &WebRTCSink) {
|
fn stop(&mut self, element: &WebRTCSink) {
|
||||||
let signaller = imp::Signaller::from_instance(self);
|
let signaller = self.imp();
|
||||||
signaller.stop(element);
|
signaller.stop(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn session_ended(&mut self, element: &WebRTCSink, session_id: &str) {
|
fn session_ended(&mut self, element: &WebRTCSink, session_id: &str) {
|
||||||
let signaller = imp::Signaller::from_instance(self);
|
let signaller = self.imp();
|
||||||
signaller.end_session(element, session_id);
|
signaller.end_session(element, session_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,7 +200,7 @@ fn create_navigation_event(sink: &super::WebRTCSink, msg: &str) {
|
||||||
gst::log!(CAT, obj: sink, "Processing navigation event: {:?}", event);
|
gst::log!(CAT, obj: sink, "Processing navigation event: {:?}", event);
|
||||||
|
|
||||||
if let Some(mid) = event.mid {
|
if let Some(mid) = event.mid {
|
||||||
let this = WebRTCSink::from_instance(sink);
|
let this = sink.imp();
|
||||||
|
|
||||||
let state = this.state.lock().unwrap();
|
let state = this.state.lock().unwrap();
|
||||||
if let Some(stream_name) = state.mids.get(&mid) {
|
if let Some(stream_name) = state.mids.get(&mid) {
|
||||||
|
@ -213,7 +213,7 @@ fn create_navigation_event(sink: &super::WebRTCSink, msg: &str) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let this = WebRTCSink::from_instance(sink);
|
let this = sink.imp();
|
||||||
|
|
||||||
let state = this.state.lock().unwrap();
|
let state = this.state.lock().unwrap();
|
||||||
let event = gst::event::Navigation::new(event.event.structure());
|
let event = gst::event::Navigation::new(event.event.structure());
|
||||||
|
@ -1296,7 +1296,7 @@ impl WebRTCSink {
|
||||||
gst::debug!(CAT, "Created offer for session {}", session_id);
|
gst::debug!(CAT, "Created offer for session {}", session_id);
|
||||||
|
|
||||||
if let Some(element) = element.upgrade() {
|
if let Some(element) = element.upgrade() {
|
||||||
let this = Self::from_instance(&element);
|
let this = element.imp();
|
||||||
let reply = match reply {
|
let reply = match reply {
|
||||||
Ok(Some(reply)) => reply,
|
Ok(Some(reply)) => reply,
|
||||||
Ok(None) => {
|
Ok(None) => {
|
||||||
|
@ -1496,7 +1496,7 @@ impl WebRTCSink {
|
||||||
let session_id_clone = session_id.clone();
|
let session_id_clone = session_id.clone();
|
||||||
webrtcbin.connect("on-ice-candidate", false, move |values| {
|
webrtcbin.connect("on-ice-candidate", false, move |values| {
|
||||||
if let Some(element) = element_clone.upgrade() {
|
if let Some(element) = element_clone.upgrade() {
|
||||||
let this = Self::from_instance(&element);
|
let this = element.imp();
|
||||||
let sdp_m_line_index = values[1].get::<u32>().expect("Invalid argument");
|
let sdp_m_line_index = values[1].get::<u32>().expect("Invalid argument");
|
||||||
let candidate = values[2].get::<String>().expect("Invalid argument");
|
let candidate = values[2].get::<String>().expect("Invalid argument");
|
||||||
this.on_ice_candidate(
|
this.on_ice_candidate(
|
||||||
|
@ -1519,7 +1519,7 @@ impl WebRTCSink {
|
||||||
|
|
||||||
match state {
|
match state {
|
||||||
gst_webrtc::WebRTCPeerConnectionState::Failed => {
|
gst_webrtc::WebRTCPeerConnectionState::Failed => {
|
||||||
let this = Self::from_instance(&element);
|
let this = element.imp();
|
||||||
gst::warning!(
|
gst::warning!(
|
||||||
CAT,
|
CAT,
|
||||||
obj: element,
|
obj: element,
|
||||||
|
@ -1550,7 +1550,7 @@ impl WebRTCSink {
|
||||||
if let Some(element) = element_clone.upgrade() {
|
if let Some(element) = element_clone.upgrade() {
|
||||||
let state = webrtcbin
|
let state = webrtcbin
|
||||||
.property::<gst_webrtc::WebRTCICEConnectionState>("ice-connection-state");
|
.property::<gst_webrtc::WebRTCICEConnectionState>("ice-connection-state");
|
||||||
let this = Self::from_instance(&element);
|
let this = element.imp();
|
||||||
|
|
||||||
match state {
|
match state {
|
||||||
gst_webrtc::WebRTCICEConnectionState::Failed => {
|
gst_webrtc::WebRTCICEConnectionState::Failed => {
|
||||||
|
@ -1679,7 +1679,7 @@ impl WebRTCSink {
|
||||||
task::spawn(async move {
|
task::spawn(async move {
|
||||||
while let Some(msg) = bus_stream.next().await {
|
while let Some(msg) = bus_stream.next().await {
|
||||||
if let Some(element) = element_clone.upgrade() {
|
if let Some(element) = element_clone.upgrade() {
|
||||||
let this = Self::from_instance(&element);
|
let this = element.imp();
|
||||||
match msg.view() {
|
match msg.view() {
|
||||||
gst::MessageView::Error(err) => {
|
gst::MessageView::Error(err) => {
|
||||||
gst::error!(
|
gst::error!(
|
||||||
|
@ -2049,7 +2049,7 @@ impl WebRTCSink {
|
||||||
let promise = gst::Promise::with_change_func(move |reply| {
|
let promise = gst::Promise::with_change_func(move |reply| {
|
||||||
gst::debug!(CAT, "received reply {:?}", reply);
|
gst::debug!(CAT, "received reply {:?}", reply);
|
||||||
if let Some(element) = element.upgrade() {
|
if let Some(element) = element.upgrade() {
|
||||||
let this = Self::from_instance(&element);
|
let this = element.imp();
|
||||||
|
|
||||||
this.on_remote_description_set(&element, session_id);
|
this.on_remote_description_set(&element, session_id);
|
||||||
}
|
}
|
||||||
|
@ -2278,7 +2278,7 @@ impl WebRTCSink {
|
||||||
let element_clone = element.downgrade();
|
let element_clone = element.downgrade();
|
||||||
task::spawn(async move {
|
task::spawn(async move {
|
||||||
if let Some(element) = element_clone.upgrade() {
|
if let Some(element) = element_clone.upgrade() {
|
||||||
let this = Self::from_instance(&element);
|
let this = element.imp();
|
||||||
let (fut, handle) =
|
let (fut, handle) =
|
||||||
futures::future::abortable(this.lookup_streams_caps(&element));
|
futures::future::abortable(this.lookup_streams_caps(&element));
|
||||||
|
|
||||||
|
@ -2660,7 +2660,7 @@ impl ObjectImpl for WebRTCSink {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.set_suppressed_flags(gst::ElementFlags::SINK | gst::ElementFlags::SOURCE);
|
obj.set_suppressed_flags(gst::ElementFlags::SINK | gst::ElementFlags::SOURCE);
|
||||||
obj.set_element_flags(gst::ElementFlags::SINK);
|
obj.set_element_flags(gst::ElementFlags::SINK);
|
||||||
}
|
}
|
||||||
|
@ -2728,7 +2728,7 @@ impl ElementImpl for WebRTCSink {
|
||||||
_name: Option<&str>,
|
_name: Option<&str>,
|
||||||
_caps: Option<&gst::Caps>,
|
_caps: Option<&gst::Caps>,
|
||||||
) -> Option<gst::Pad> {
|
) -> Option<gst::Pad> {
|
||||||
let element = self.instance();
|
let element = self.obj();
|
||||||
if element.current_state() > gst::State::Ready {
|
if element.current_state() > gst::State::Ready {
|
||||||
gst::error!(CAT, "element pads can only be requested before starting");
|
gst::error!(CAT, "element pads can only be requested before starting");
|
||||||
return None;
|
return None;
|
||||||
|
@ -2751,7 +2751,7 @@ impl ElementImpl for WebRTCSink {
|
||||||
WebRTCSink::catch_panic_pad_function(
|
WebRTCSink::catch_panic_pad_function(
|
||||||
parent,
|
parent,
|
||||||
|| false,
|
|| false,
|
||||||
|this| this.sink_event(pad.upcast_ref(), &*this.instance(), event),
|
|this| this.sink_event(pad.upcast_ref(), &*this.obj(), event),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.build();
|
.build();
|
||||||
|
@ -2778,7 +2778,7 @@ impl ElementImpl for WebRTCSink {
|
||||||
&self,
|
&self,
|
||||||
transition: gst::StateChange,
|
transition: gst::StateChange,
|
||||||
) -> Result<gst::StateChangeSuccess, gst::StateChangeError> {
|
) -> Result<gst::StateChangeSuccess, gst::StateChangeError> {
|
||||||
let element = self.instance();
|
let element = self.obj();
|
||||||
if let gst::StateChange::ReadyToPaused = transition {
|
if let gst::StateChange::ReadyToPaused = transition {
|
||||||
if let Err(err) = self.prepare(&*element) {
|
if let Err(err) = self.prepare(&*element) {
|
||||||
gst::element_error!(
|
gst::element_error!(
|
||||||
|
|
|
@ -89,8 +89,7 @@ impl WebRTCSink {
|
||||||
pub fn with_signaller(signaller: Box<dyn SignallableObject>) -> Self {
|
pub fn with_signaller(signaller: Box<dyn SignallableObject>) -> Self {
|
||||||
let ret: WebRTCSink = glib::Object::new(&[]);
|
let ret: WebRTCSink = glib::Object::new(&[]);
|
||||||
|
|
||||||
let ws = imp::WebRTCSink::from_instance(&ret);
|
let ws = ret.imp();
|
||||||
|
|
||||||
ws.set_signaller(signaller).unwrap();
|
ws.set_signaller(signaller).unwrap();
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
@ -101,8 +100,7 @@ impl WebRTCSink {
|
||||||
session_id: &str,
|
session_id: &str,
|
||||||
sdp: &gst_webrtc::WebRTCSessionDescription,
|
sdp: &gst_webrtc::WebRTCSessionDescription,
|
||||||
) -> Result<(), WebRTCSinkError> {
|
) -> Result<(), WebRTCSinkError> {
|
||||||
let ws = imp::WebRTCSink::from_instance(self);
|
let ws = self.imp();
|
||||||
|
|
||||||
ws.handle_sdp(self, session_id, sdp)
|
ws.handle_sdp(self, session_id, sdp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,26 +114,22 @@ impl WebRTCSink {
|
||||||
sdp_mid: Option<String>,
|
sdp_mid: Option<String>,
|
||||||
candidate: &str,
|
candidate: &str,
|
||||||
) -> Result<(), WebRTCSinkError> {
|
) -> Result<(), WebRTCSinkError> {
|
||||||
let ws = imp::WebRTCSink::from_instance(self);
|
let ws = self.imp();
|
||||||
|
|
||||||
ws.handle_ice(self, session_id, sdp_m_line_index, sdp_mid, candidate)
|
ws.handle_ice(self, session_id, sdp_m_line_index, sdp_mid, candidate)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle_signalling_error(&self, error: Box<dyn Error + Send + Sync>) {
|
pub fn handle_signalling_error(&self, error: Box<dyn Error + Send + Sync>) {
|
||||||
let ws = imp::WebRTCSink::from_instance(self);
|
let ws = self.imp();
|
||||||
|
|
||||||
ws.handle_signalling_error(self, anyhow::anyhow!(error));
|
ws.handle_signalling_error(self, anyhow::anyhow!(error));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn start_session(&self, session_id: &str, peer_id: &str) -> Result<(), WebRTCSinkError> {
|
pub fn start_session(&self, session_id: &str, peer_id: &str) -> Result<(), WebRTCSinkError> {
|
||||||
let ws = imp::WebRTCSink::from_instance(self);
|
let ws = self.imp();
|
||||||
|
|
||||||
ws.start_session(self, session_id, peer_id)
|
ws.start_session(self, session_id, peer_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn end_session(&self, session_id: &str) -> Result<(), WebRTCSinkError> {
|
pub fn end_session(&self, session_id: &str) -> Result<(), WebRTCSinkError> {
|
||||||
let ws = imp::WebRTCSink::from_instance(self);
|
let ws = self.imp();
|
||||||
|
|
||||||
ws.remove_session(self, session_id, false)
|
ws.remove_session(self, session_id, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,7 +137,7 @@ impl ElementImpl for WhipSink {
|
||||||
let sink_pad = gst::GhostPad::new(Some(&wb_sink_pad.name()), gst::PadDirection::Sink);
|
let sink_pad = gst::GhostPad::new(Some(&wb_sink_pad.name()), gst::PadDirection::Sink);
|
||||||
|
|
||||||
sink_pad.set_target(Some(&wb_sink_pad)).unwrap();
|
sink_pad.set_target(Some(&wb_sink_pad)).unwrap();
|
||||||
self.instance().add_pad(&sink_pad).unwrap();
|
self.obj().add_pad(&sink_pad).unwrap();
|
||||||
|
|
||||||
Some(sink_pad.upcast())
|
Some(sink_pad.upcast())
|
||||||
}
|
}
|
||||||
|
@ -234,7 +234,7 @@ impl ObjectImpl for WhipSink {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.set_suppressed_flags(gst::ElementFlags::SINK | gst::ElementFlags::SOURCE);
|
obj.set_suppressed_flags(gst::ElementFlags::SINK | gst::ElementFlags::SOURCE);
|
||||||
obj.set_element_flags(gst::ElementFlags::SINK);
|
obj.set_element_flags(gst::ElementFlags::SINK);
|
||||||
obj.add(&self.webrtcbin).unwrap();
|
obj.add(&self.webrtcbin).unwrap();
|
||||||
|
|
|
@ -183,7 +183,7 @@ impl ObjectImpl for TextAhead {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sink_pad).unwrap();
|
obj.add_pad(&self.sink_pad).unwrap();
|
||||||
obj.add_pad(&self.src_pad).unwrap();
|
obj.add_pad(&self.src_pad).unwrap();
|
||||||
}
|
}
|
||||||
|
@ -304,11 +304,11 @@ impl TextAhead {
|
||||||
while !state.pending.is_empty() {
|
while !state.pending.is_empty() {
|
||||||
let _ = self.push_pending(&mut state);
|
let _ = self.push_pending(&mut state);
|
||||||
}
|
}
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
gst::EventView::Caps(_caps) => {
|
gst::EventView::Caps(_caps) => {
|
||||||
// set caps on src pad
|
// set caps on src pad
|
||||||
let element = self.instance();
|
let element = self.obj();
|
||||||
let templ = element.class().pad_template("src").unwrap();
|
let templ = element.class().pad_template("src").unwrap();
|
||||||
let _ = self.src_pad.push_event(gst::event::Caps::new(templ.caps()));
|
let _ = self.src_pad.push_event(gst::event::Caps::new(templ.caps()));
|
||||||
true
|
true
|
||||||
|
@ -326,9 +326,9 @@ impl TextAhead {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -169,8 +169,8 @@ impl JsonGstEnc {
|
||||||
let caps = gst::Caps::builder("application/x-json").build();
|
let caps = gst::Caps::builder("application/x-json").build();
|
||||||
self.srcpad.push_event(gst::event::Caps::new(&caps))
|
self.srcpad.push_event(gst::event::Caps::new(&caps))
|
||||||
}
|
}
|
||||||
EventView::Eos(_) => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
EventView::Eos(_) => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -215,7 +215,7 @@ impl ObjectImpl for JsonGstEnc {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,9 +39,7 @@ impl PullState {
|
||||||
fn new(imp: &JsonGstParse, pad: &gst::Pad) -> Self {
|
fn new(imp: &JsonGstParse, pad: &gst::Pad) -> Self {
|
||||||
Self {
|
Self {
|
||||||
need_stream_start: true,
|
need_stream_start: true,
|
||||||
stream_id: pad
|
stream_id: pad.create_stream_id(&*imp.obj(), Some("src")).to_string(),
|
||||||
.create_stream_id(&*imp.instance(), Some("src"))
|
|
||||||
.to_string(),
|
|
||||||
offset: 0,
|
offset: 0,
|
||||||
duration: None,
|
duration: None,
|
||||||
}
|
}
|
||||||
|
@ -633,14 +631,14 @@ impl JsonGstParse {
|
||||||
self.flush(&mut state);
|
self.flush(&mut state);
|
||||||
drop(state);
|
drop(state);
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
EventView::Eos(_) => {
|
EventView::Eos(_) => {
|
||||||
gst::log!(CAT, obj: pad, "Draining");
|
gst::log!(CAT, obj: pad, "Draining");
|
||||||
if let Err(err) = self.handle_buffer(None) {
|
if let Err(err) = self.handle_buffer(None) {
|
||||||
gst::error!(CAT, obj: pad, "Failed to drain parser: {:?}", err);
|
gst::error!(CAT, obj: pad, "Failed to drain parser: {:?}", err);
|
||||||
}
|
}
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
if event.is_sticky()
|
if event.is_sticky()
|
||||||
|
@ -652,7 +650,7 @@ impl JsonGstParse {
|
||||||
state.pending_events.push(event);
|
state.pending_events.push(event);
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -757,7 +755,7 @@ impl JsonGstParse {
|
||||||
gst::log!(CAT, obj: pad, "Handling event {:?}", event);
|
gst::log!(CAT, obj: pad, "Handling event {:?}", event);
|
||||||
match event.view() {
|
match event.view() {
|
||||||
EventView::Seek(e) => self.perform_seek(e),
|
EventView::Seek(e) => self.perform_seek(e),
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -811,7 +809,7 @@ impl JsonGstParse {
|
||||||
self.sinkpad.peer_query(query)
|
self.sinkpad.peer_query(query)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => gst::Pad::query_default(pad, Some(&*self.instance()), query),
|
_ => gst::Pad::query_default(pad, Some(&*self.obj()), query),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -890,7 +888,7 @@ impl ObjectImpl for JsonGstParse {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -159,7 +159,7 @@ impl ObjectImpl for RegEx {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -324,7 +324,7 @@ impl TextWrap {
|
||||||
if state.start_ts.is_some() {
|
if state.start_ts.is_some() {
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EventView::FlushStart(_) => {
|
EventView::FlushStart(_) => {
|
||||||
|
@ -333,7 +333,7 @@ impl TextWrap {
|
||||||
*state = State::default();
|
*state = State::default();
|
||||||
state.options = options;
|
state.options = options;
|
||||||
drop(state);
|
drop(state);
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
EventView::Eos(_) => {
|
EventView::Eos(_) => {
|
||||||
let mut state = self.state.lock().unwrap();
|
let mut state = self.state.lock().unwrap();
|
||||||
|
@ -357,9 +357,9 @@ impl TextWrap {
|
||||||
} else {
|
} else {
|
||||||
drop(state);
|
drop(state);
|
||||||
}
|
}
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -388,7 +388,7 @@ impl TextWrap {
|
||||||
}
|
}
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
_ => gst::Pad::query_default(pad, Some(&*self.instance()), query),
|
_ => gst::Pad::query_default(pad, Some(&*self.obj()), query),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -483,7 +483,7 @@ impl ObjectImpl for TextWrap {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
@ -518,11 +518,9 @@ impl ObjectImpl for TextWrap {
|
||||||
settings.accumulate_time.display(),
|
settings.accumulate_time.display(),
|
||||||
);
|
);
|
||||||
drop(settings);
|
drop(settings);
|
||||||
let _ = self.instance().post_message(
|
let _ = self
|
||||||
gst::message::Latency::builder()
|
.obj()
|
||||||
.src(&*self.instance())
|
.post_message(gst::message::Latency::builder().src(&*self.obj()).build());
|
||||||
.build(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
|
|
|
@ -181,7 +181,7 @@ impl ObjectImpl for Identity {
|
||||||
|
|
||||||
// Here we actually add the pads we created in Identity::new() to the
|
// Here we actually add the pads we created in Identity::new() to the
|
||||||
// element so that GStreamer is aware of their existence.
|
// element so that GStreamer is aware of their existence.
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,7 +139,7 @@ impl ObjectImpl for ProgressBin {
|
||||||
// Here we actually add the pads we created in ProgressBin::new() to the
|
// Here we actually add the pads we created in ProgressBin::new() to the
|
||||||
// element so that GStreamer is aware of their existence.
|
// element so that GStreamer is aware of their existence.
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
|
|
||||||
// Add the progressreport element to the bin.
|
// Add the progressreport element to the bin.
|
||||||
obj.add(&self.progress).unwrap();
|
obj.add(&self.progress).unwrap();
|
||||||
|
|
|
@ -212,7 +212,7 @@ impl ObjectImpl for SineSrc {
|
||||||
// Call the parent class' ::constructed() implementation first
|
// Call the parent class' ::constructed() implementation first
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
// Initialize live-ness and notify the base class that
|
// Initialize live-ness and notify the base class that
|
||||||
// we'd like to operate in Time format
|
// we'd like to operate in Time format
|
||||||
obj.set_live(DEFAULT_IS_LIVE);
|
obj.set_live(DEFAULT_IS_LIVE);
|
||||||
|
@ -236,11 +236,9 @@ impl ObjectImpl for SineSrc {
|
||||||
settings.samples_per_buffer = samples_per_buffer;
|
settings.samples_per_buffer = samples_per_buffer;
|
||||||
drop(settings);
|
drop(settings);
|
||||||
|
|
||||||
let _ = self.instance().post_message(
|
let _ = self
|
||||||
gst::message::Latency::builder()
|
.obj()
|
||||||
.src(&*self.instance())
|
.post_message(gst::message::Latency::builder().src(&*self.obj()).build());
|
||||||
.build(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
"freq" => {
|
"freq" => {
|
||||||
let mut settings = self.settings.lock().unwrap();
|
let mut settings = self.settings.lock().unwrap();
|
||||||
|
@ -380,8 +378,7 @@ impl ElementImpl for SineSrc {
|
||||||
) -> Result<gst::StateChangeSuccess, gst::StateChangeError> {
|
) -> Result<gst::StateChangeSuccess, gst::StateChangeError> {
|
||||||
// Configure live'ness once here just before starting the source
|
// Configure live'ness once here just before starting the source
|
||||||
if let gst::StateChange::ReadyToPaused = transition {
|
if let gst::StateChange::ReadyToPaused = transition {
|
||||||
self.instance()
|
self.obj().set_live(self.settings.lock().unwrap().is_live);
|
||||||
.set_live(self.settings.lock().unwrap().is_live);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the parent class' implementation of ::change_state()
|
// Call the parent class' implementation of ::change_state()
|
||||||
|
@ -406,7 +403,7 @@ impl BaseSrcImpl for SineSrc {
|
||||||
|
|
||||||
gst::debug!(CAT, imp: self, "Configuring for caps {}", caps);
|
gst::debug!(CAT, imp: self, "Configuring for caps {}", caps);
|
||||||
|
|
||||||
self.instance()
|
self.obj()
|
||||||
.set_blocksize(info.bpf() * (*self.settings.lock().unwrap()).samples_per_buffer);
|
.set_blocksize(info.bpf() * (*self.settings.lock().unwrap()).samples_per_buffer);
|
||||||
|
|
||||||
let settings = *self.settings.lock().unwrap();
|
let settings = *self.settings.lock().unwrap();
|
||||||
|
@ -442,11 +439,9 @@ impl BaseSrcImpl for SineSrc {
|
||||||
|
|
||||||
drop(state);
|
drop(state);
|
||||||
|
|
||||||
let _ = self.instance().post_message(
|
let _ = self
|
||||||
gst::message::Latency::builder()
|
.obj()
|
||||||
.src(&*self.instance())
|
.post_message(gst::message::Latency::builder().src(&*self.obj()).build());
|
||||||
.build(),
|
|
||||||
);
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -748,15 +743,14 @@ impl PushSrcImpl for SineSrc {
|
||||||
// Waiting happens based on the pipeline clock, which means that a real live source
|
// Waiting happens based on the pipeline clock, which means that a real live source
|
||||||
// with its own clock would require various translations between the two clocks.
|
// with its own clock would require various translations between the two clocks.
|
||||||
// This is out of scope for the tutorial though.
|
// This is out of scope for the tutorial though.
|
||||||
if self.instance().is_live() {
|
if self.obj().is_live() {
|
||||||
let (clock, base_time) =
|
let (clock, base_time) = match Option::zip(self.obj().clock(), self.obj().base_time()) {
|
||||||
match Option::zip(self.instance().clock(), self.instance().base_time()) {
|
None => return Ok(CreateSuccess::NewBuffer(buffer)),
|
||||||
None => return Ok(CreateSuccess::NewBuffer(buffer)),
|
Some(res) => res,
|
||||||
Some(res) => res,
|
};
|
||||||
};
|
|
||||||
|
|
||||||
let segment = self
|
let segment = self
|
||||||
.instance()
|
.obj()
|
||||||
.segment()
|
.segment()
|
||||||
.downcast::<gst::format::Time>()
|
.downcast::<gst::format::Time>()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
|
@ -73,7 +73,7 @@ impl ObjectImpl for CustomSource {
|
||||||
"source" => {
|
"source" => {
|
||||||
let source = value.get::<gst::Element>().unwrap();
|
let source = value.get::<gst::Element>().unwrap();
|
||||||
self.source.set(source.clone()).unwrap();
|
self.source.set(source.clone()).unwrap();
|
||||||
self.instance().add(&source).unwrap();
|
self.obj().add(&source).unwrap();
|
||||||
}
|
}
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ impl ObjectImpl for CustomSource {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.set_suppressed_flags(gst::ElementFlags::SOURCE | gst::ElementFlags::SINK);
|
obj.set_suppressed_flags(gst::ElementFlags::SOURCE | gst::ElementFlags::SINK);
|
||||||
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
||||||
obj.set_bin_flags(gst::BinFlags::STREAMS_AWARE);
|
obj.set_bin_flags(gst::BinFlags::STREAMS_AWARE);
|
||||||
|
@ -285,11 +285,11 @@ impl CustomSource {
|
||||||
let (templ, name) = if stream_type.contains(gst::StreamType::AUDIO) {
|
let (templ, name) = if stream_type.contains(gst::StreamType::AUDIO) {
|
||||||
let name = format!("audio_{}", state.num_audio);
|
let name = format!("audio_{}", state.num_audio);
|
||||||
state.num_audio += 1;
|
state.num_audio += 1;
|
||||||
(self.instance().pad_template("audio_%u").unwrap(), name)
|
(self.obj().pad_template("audio_%u").unwrap(), name)
|
||||||
} else {
|
} else {
|
||||||
let name = format!("video_{}", state.num_video);
|
let name = format!("video_{}", state.num_video);
|
||||||
state.num_video += 1;
|
state.num_video += 1;
|
||||||
(self.instance().pad_template("video_%u").unwrap(), name)
|
(self.obj().pad_template("video_%u").unwrap(), name)
|
||||||
};
|
};
|
||||||
|
|
||||||
let ghost_pad = gst::GhostPad::builder_with_template(&templ, Some(&name))
|
let ghost_pad = gst::GhostPad::builder_with_template(&templ, Some(&name))
|
||||||
|
@ -306,7 +306,7 @@ impl CustomSource {
|
||||||
drop(state);
|
drop(state);
|
||||||
|
|
||||||
ghost_pad.set_active(true).unwrap();
|
ghost_pad.set_active(true).unwrap();
|
||||||
self.instance().add_pad(&ghost_pad).unwrap();
|
self.obj().add_pad(&ghost_pad).unwrap();
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -331,7 +331,7 @@ impl CustomSource {
|
||||||
|
|
||||||
ghost_pad.set_active(false).unwrap();
|
ghost_pad.set_active(false).unwrap();
|
||||||
let _ = ghost_pad.set_target(None::<&gst::Pad>);
|
let _ = ghost_pad.set_target(None::<&gst::Pad>);
|
||||||
let _ = self.instance().remove_pad(&ghost_pad);
|
let _ = self.obj().remove_pad(&ghost_pad);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_source_no_more_pads(&self) {
|
fn handle_source_no_more_pads(&self) {
|
||||||
|
@ -348,11 +348,11 @@ impl CustomSource {
|
||||||
.build();
|
.build();
|
||||||
drop(state);
|
drop(state);
|
||||||
|
|
||||||
self.instance().no_more_pads();
|
self.obj().no_more_pads();
|
||||||
|
|
||||||
let _ = self.instance().post_message(
|
let _ = self.obj().post_message(
|
||||||
gst::message::StreamsSelected::builder(&collection)
|
gst::message::StreamsSelected::builder(&collection)
|
||||||
.src(&*self.instance())
|
.src(&*self.obj())
|
||||||
.build(),
|
.build(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -381,7 +381,7 @@ impl CustomSource {
|
||||||
|
|
||||||
for pad in pads {
|
for pad in pads {
|
||||||
let _ = pad.ghost_pad.set_target(None::<&gst::Pad>);
|
let _ = pad.ghost_pad.set_target(None::<&gst::Pad>);
|
||||||
let _ = self.instance().remove_pad(&pad.ghost_pad);
|
let _ = self.obj().remove_pad(&pad.ghost_pad);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -705,7 +705,7 @@ impl ObjectImpl for FallbackSrc {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.set_suppressed_flags(gst::ElementFlags::SOURCE | gst::ElementFlags::SINK);
|
obj.set_suppressed_flags(gst::ElementFlags::SOURCE | gst::ElementFlags::SINK);
|
||||||
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
||||||
obj.set_bin_flags(gst::BinFlags::STREAMS_AWARE);
|
obj.set_bin_flags(gst::BinFlags::STREAMS_AWARE);
|
||||||
|
@ -1016,7 +1016,7 @@ impl FallbackSrc {
|
||||||
let source = match source {
|
let source = match source {
|
||||||
Source::Uri(ref uri) => {
|
Source::Uri(ref uri) => {
|
||||||
let uri = self
|
let uri = self
|
||||||
.instance()
|
.obj()
|
||||||
.emit_by_name::<glib::GString>("update-uri", &[uri]);
|
.emit_by_name::<glib::GString>("update-uri", &[uri]);
|
||||||
|
|
||||||
let source = gst::ElementFactory::make("uridecodebin3")
|
let source = gst::ElementFactory::make("uridecodebin3")
|
||||||
|
@ -1070,7 +1070,7 @@ impl FallbackSrc {
|
||||||
imp.handle_source_pad_removed(pad, false);
|
imp.handle_source_pad_removed(pad, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
self.instance().add(&bin).unwrap();
|
self.obj().add(&bin).unwrap();
|
||||||
|
|
||||||
SourceBin {
|
SourceBin {
|
||||||
source: bin,
|
source: bin,
|
||||||
|
@ -1132,8 +1132,7 @@ impl FallbackSrc {
|
||||||
None => return,
|
None => return,
|
||||||
Some(element) => element,
|
Some(element) => element,
|
||||||
};
|
};
|
||||||
let src = FallbackSrc::from_instance(&element);
|
let src = element.imp();
|
||||||
|
|
||||||
src.handle_source_pad_removed(pad, true);
|
src.handle_source_pad_removed(pad, true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1144,7 +1143,7 @@ impl FallbackSrc {
|
||||||
// possible errors and retry, without causing the whole bin state change to fail
|
// possible errors and retry, without causing the whole bin state change to fail
|
||||||
bin.set_locked_state(true);
|
bin.set_locked_state(true);
|
||||||
|
|
||||||
self.instance().add(&bin).unwrap();
|
self.obj().add(&bin).unwrap();
|
||||||
|
|
||||||
Some(SourceBin {
|
Some(SourceBin {
|
||||||
source: bin,
|
source: bin,
|
||||||
|
@ -1175,7 +1174,7 @@ impl FallbackSrc {
|
||||||
.build()
|
.build()
|
||||||
.expect("No fallbackswitch found");
|
.expect("No fallbackswitch found");
|
||||||
|
|
||||||
self.instance().add(&switch).unwrap();
|
self.obj().add(&switch).unwrap();
|
||||||
|
|
||||||
let dummy_srcpad = dummy_source.static_pad("src").unwrap();
|
let dummy_srcpad = dummy_source.static_pad("src").unwrap();
|
||||||
let dummy_sinkpad = switch.request_pad_simple("sink_%u").unwrap();
|
let dummy_sinkpad = switch.request_pad_simple("sink_%u").unwrap();
|
||||||
|
@ -1197,7 +1196,7 @@ impl FallbackSrc {
|
||||||
|
|
||||||
let srcpad = switch.static_pad("src").unwrap();
|
let srcpad = switch.static_pad("src").unwrap();
|
||||||
let templ = self
|
let templ = self
|
||||||
.instance()
|
.obj()
|
||||||
.pad_template(if is_audio { "audio" } else { "video" })
|
.pad_template(if is_audio { "audio" } else { "video" })
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let ghostpad = gst::GhostPad::builder_with_template(&templ, Some(&templ.name()))
|
let ghostpad = gst::GhostPad::builder_with_template(&templ, Some(&templ.name()))
|
||||||
|
@ -1216,7 +1215,7 @@ impl FallbackSrc {
|
||||||
|
|
||||||
let _ = ghostpad.set_active(true);
|
let _ = ghostpad.set_active(true);
|
||||||
|
|
||||||
self.instance().add_pad(&ghostpad).unwrap();
|
self.obj().add_pad(&ghostpad).unwrap();
|
||||||
|
|
||||||
Stream {
|
Stream {
|
||||||
main_branch: None,
|
main_branch: None,
|
||||||
|
@ -1271,7 +1270,7 @@ impl FallbackSrc {
|
||||||
&settings.fallback_video_caps,
|
&settings.fallback_video_caps,
|
||||||
settings.min_latency,
|
settings.min_latency,
|
||||||
);
|
);
|
||||||
self.instance().add(&video_dummy_source).unwrap();
|
self.obj().add(&video_dummy_source).unwrap();
|
||||||
|
|
||||||
let stream = self.create_stream(
|
let stream = self.create_stream(
|
||||||
settings.timeout,
|
settings.timeout,
|
||||||
|
@ -1294,7 +1293,7 @@ impl FallbackSrc {
|
||||||
&settings.fallback_audio_caps,
|
&settings.fallback_audio_caps,
|
||||||
settings.min_latency,
|
settings.min_latency,
|
||||||
);
|
);
|
||||||
self.instance().add(&audio_dummy_source).unwrap();
|
self.obj().add(&audio_dummy_source).unwrap();
|
||||||
|
|
||||||
let stream = self.create_stream(
|
let stream = self.create_stream(
|
||||||
settings.timeout,
|
settings.timeout,
|
||||||
|
@ -1332,9 +1331,9 @@ impl FallbackSrc {
|
||||||
|
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
|
|
||||||
self.instance().no_more_pads();
|
self.obj().no_more_pads();
|
||||||
|
|
||||||
self.instance().notify("status");
|
self.obj().notify("status");
|
||||||
|
|
||||||
gst::debug!(CAT, imp: self, "Started");
|
gst::debug!(CAT, imp: self, "Started");
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -1349,7 +1348,7 @@ impl FallbackSrc {
|
||||||
};
|
};
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
|
|
||||||
self.instance().notify("status");
|
self.obj().notify("status");
|
||||||
|
|
||||||
// In theory all streams should've been removed from the source's pad-removed signal
|
// In theory all streams should've been removed from the source's pad-removed signal
|
||||||
// handler when going from Paused to Ready but better safe than sorry here
|
// handler when going from Paused to Ready but better safe than sorry here
|
||||||
|
@ -1357,7 +1356,7 @@ impl FallbackSrc {
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|v| v.as_ref())
|
.filter_map(|v| v.as_ref())
|
||||||
{
|
{
|
||||||
let element = self.instance();
|
let element = self.obj();
|
||||||
|
|
||||||
for branch in [&stream.main_branch, &stream.fallback_branch]
|
for branch in [&stream.main_branch, &stream.fallback_branch]
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -1395,7 +1394,7 @@ impl FallbackSrc {
|
||||||
.iter_mut()
|
.iter_mut()
|
||||||
.flatten()
|
.flatten()
|
||||||
{
|
{
|
||||||
self.instance().remove(&source.source).unwrap();
|
self.obj().remove(&source.source).unwrap();
|
||||||
|
|
||||||
if let Some(timeout) = source.pending_restart_timeout.take() {
|
if let Some(timeout) = source.pending_restart_timeout.take() {
|
||||||
timeout.unschedule();
|
timeout.unschedule();
|
||||||
|
@ -1418,7 +1417,7 @@ impl FallbackSrc {
|
||||||
.flatten()
|
.flatten()
|
||||||
{
|
{
|
||||||
let _ = source.set_state(gst::State::Null);
|
let _ = source.set_state(gst::State::Null);
|
||||||
self.instance().remove(source).unwrap();
|
self.obj().remove(source).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
gst::debug!(CAT, imp: self, "Stopped");
|
gst::debug!(CAT, imp: self, "Stopped");
|
||||||
|
@ -1471,7 +1470,7 @@ impl FallbackSrc {
|
||||||
let source = source.source.clone();
|
let source = source.source.clone();
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
|
|
||||||
self.instance().notify("status");
|
self.obj().notify("status");
|
||||||
|
|
||||||
let res = source.set_state(transition.next());
|
let res = source.set_state(transition.next());
|
||||||
match res {
|
match res {
|
||||||
|
@ -1493,7 +1492,7 @@ impl FallbackSrc {
|
||||||
fallback_source,
|
fallback_source,
|
||||||
);
|
);
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
self.instance().notify("statistics");
|
self.obj().notify("statistics");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(res) => {
|
Ok(res) => {
|
||||||
|
@ -1560,7 +1559,7 @@ impl FallbackSrc {
|
||||||
pad: &gst::ProxyPad,
|
pad: &gst::ProxyPad,
|
||||||
buffer: gst::Buffer,
|
buffer: gst::Buffer,
|
||||||
) -> Result<gst::FlowSuccess, gst::FlowError> {
|
) -> Result<gst::FlowSuccess, gst::FlowError> {
|
||||||
let res = gst::ProxyPad::chain_default(pad, Some(&*self.instance()), buffer);
|
let res = gst::ProxyPad::chain_default(pad, Some(&*self.obj()), buffer);
|
||||||
|
|
||||||
let mut state_guard = self.state.lock();
|
let mut state_guard = self.state.lock();
|
||||||
let state = match &mut *state_guard {
|
let state = match &mut *state_guard {
|
||||||
|
@ -1998,7 +1997,7 @@ impl FallbackSrc {
|
||||||
});
|
});
|
||||||
|
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
self.instance().notify("status");
|
self.obj().notify("status");
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -2189,7 +2188,7 @@ impl FallbackSrc {
|
||||||
gst::debug!(CAT, imp: self, "Live source, unblocking directly");
|
gst::debug!(CAT, imp: self, "Live source, unblocking directly");
|
||||||
|
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
self.instance().notify("status");
|
self.obj().notify("status");
|
||||||
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
@ -2236,13 +2235,13 @@ impl FallbackSrc {
|
||||||
self.unblock_pads(state, fallback_source);
|
self.unblock_pads(state, fallback_source);
|
||||||
|
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
self.instance().notify("status");
|
self.obj().notify("status");
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn unblock_pads(&self, state: &mut State, fallback_source: bool) {
|
fn unblock_pads(&self, state: &mut State, fallback_source: bool) {
|
||||||
let current_running_time = match self.instance().current_running_time() {
|
let current_running_time = match self.obj().current_running_time() {
|
||||||
Some(current_running_time) => current_running_time,
|
Some(current_running_time) => current_running_time,
|
||||||
None => {
|
None => {
|
||||||
gst::debug!(CAT, imp: self, "Waiting for current_running_time");
|
gst::debug!(CAT, imp: self, "Waiting for current_running_time");
|
||||||
|
@ -2590,7 +2589,7 @@ impl FallbackSrc {
|
||||||
self.unblock_pads(state, fallback_source);
|
self.unblock_pads(state, fallback_source);
|
||||||
|
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
self.instance().notify("status");
|
self.obj().notify("status");
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_buffering(&self, m: &gst::message::Buffering) {
|
fn handle_buffering(&self, m: &gst::message::Buffering) {
|
||||||
|
@ -2683,8 +2682,8 @@ impl FallbackSrc {
|
||||||
}
|
}
|
||||||
|
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
self.instance().notify("status");
|
self.obj().notify("status");
|
||||||
self.instance().notify("statistics");
|
self.obj().notify("statistics");
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_streams_selected(&self, m: &gst::message::StreamsSelected) {
|
fn handle_streams_selected(&self, m: &gst::message::StreamsSelected) {
|
||||||
|
@ -2767,7 +2766,7 @@ impl FallbackSrc {
|
||||||
self.unblock_pads(state, fallback_source);
|
self.unblock_pads(state, fallback_source);
|
||||||
|
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
self.instance().notify("status");
|
self.obj().notify("status");
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_error(&self, m: &gst::message::Error) -> bool {
|
fn handle_error(&self, m: &gst::message::Error) -> bool {
|
||||||
|
@ -2794,8 +2793,8 @@ impl FallbackSrc {
|
||||||
if src == state.source.source || src.has_as_ancestor(&state.source.source) {
|
if src == state.source.source || src.has_as_ancestor(&state.source.source) {
|
||||||
self.handle_source_error(state, RetryReason::Error, false);
|
self.handle_source_error(state, RetryReason::Error, false);
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
self.instance().notify("status");
|
self.obj().notify("status");
|
||||||
self.instance().notify("statistics");
|
self.obj().notify("statistics");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2804,8 +2803,8 @@ impl FallbackSrc {
|
||||||
if src == source.source || src.has_as_ancestor(&source.source) {
|
if src == source.source || src.has_as_ancestor(&source.source) {
|
||||||
self.handle_source_error(state, RetryReason::Error, true);
|
self.handle_source_error(state, RetryReason::Error, true);
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
self.instance().notify("status");
|
self.obj().notify("status");
|
||||||
self.instance().notify("statistics");
|
self.obj().notify("statistics");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2887,7 +2886,7 @@ impl FallbackSrc {
|
||||||
}
|
}
|
||||||
|
|
||||||
let source_weak = source.source.downgrade();
|
let source_weak = source.source.downgrade();
|
||||||
self.instance().call_async(move |element| {
|
self.obj().call_async(move |element| {
|
||||||
let imp = element.imp();
|
let imp = element.imp();
|
||||||
|
|
||||||
let source = match source_weak.upgrade() {
|
let source = match source_weak.upgrade() {
|
||||||
|
@ -3299,7 +3298,7 @@ impl FallbackSrc {
|
||||||
);
|
);
|
||||||
|
|
||||||
let timeout = clock.new_single_shot_id(wait_time);
|
let timeout = clock.new_single_shot_id(wait_time);
|
||||||
let element_weak = self.instance().downgrade();
|
let element_weak = self.obj().downgrade();
|
||||||
timeout
|
timeout
|
||||||
.wait_async(move |_clock, _time, _id| {
|
.wait_async(move |_clock, _time, _id| {
|
||||||
let element = match element_weak.upgrade() {
|
let element = match element_weak.upgrade() {
|
||||||
|
@ -3469,7 +3468,7 @@ impl FallbackSrc {
|
||||||
}
|
}
|
||||||
|
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
self.instance().notify("status");
|
self.obj().notify("status");
|
||||||
}
|
}
|
||||||
|
|
||||||
fn stats(&self) -> gst::Structure {
|
fn stats(&self) -> gst::Structure {
|
||||||
|
|
|
@ -318,8 +318,8 @@ impl SinkState {
|
||||||
extra_time: gst::ClockTime,
|
extra_time: gst::ClockTime,
|
||||||
) -> Option<gst::SingleShotClockId> {
|
) -> Option<gst::SingleShotClockId> {
|
||||||
let running_time = running_time?;
|
let running_time = running_time?;
|
||||||
let clock = imp.instance().clock()?;
|
let clock = imp.obj().clock()?;
|
||||||
let base_time = imp.instance().base_time()?;
|
let base_time = imp.obj().base_time()?;
|
||||||
|
|
||||||
let wait_until = running_time + base_time;
|
let wait_until = running_time + base_time;
|
||||||
let wait_until = wait_until.saturating_add(extra_time);
|
let wait_until = wait_until.saturating_add(extra_time);
|
||||||
|
@ -412,7 +412,7 @@ impl FallbackSwitch {
|
||||||
let mut best_priority = 0u32;
|
let mut best_priority = 0u32;
|
||||||
let mut best_pad = None;
|
let mut best_pad = None;
|
||||||
|
|
||||||
for pad in self.instance().sink_pads() {
|
for pad in self.obj().sink_pads() {
|
||||||
/* Don't consider the active sinkpad */
|
/* Don't consider the active sinkpad */
|
||||||
let pad = pad.downcast_ref::<super::FallbackSwitchSinkPad>().unwrap();
|
let pad = pad.downcast_ref::<super::FallbackSwitchSinkPad>().unwrap();
|
||||||
let pad_imp = pad.imp();
|
let pad_imp = pad.imp();
|
||||||
|
@ -461,7 +461,7 @@ impl FallbackSwitch {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cancel_waits(&self) {
|
fn cancel_waits(&self) {
|
||||||
for pad in self.instance().sink_pads() {
|
for pad in self.obj().sink_pads() {
|
||||||
let pad = pad.downcast_ref::<super::FallbackSwitchSinkPad>().unwrap();
|
let pad = pad.downcast_ref::<super::FallbackSwitchSinkPad>().unwrap();
|
||||||
let pad_imp = pad.imp();
|
let pad_imp = pad.imp();
|
||||||
let mut pad_state = pad_imp.state.lock();
|
let mut pad_state = pad_imp.state.lock();
|
||||||
|
@ -477,12 +477,12 @@ impl FallbackSwitch {
|
||||||
) {
|
) {
|
||||||
state.cancel_timeout();
|
state.cancel_timeout();
|
||||||
|
|
||||||
let clock = match self.instance().clock() {
|
let clock = match self.obj().clock() {
|
||||||
None => return,
|
None => return,
|
||||||
Some(clock) => clock,
|
Some(clock) => clock,
|
||||||
};
|
};
|
||||||
|
|
||||||
let base_time = match self.instance().base_time() {
|
let base_time = match self.obj().base_time() {
|
||||||
Some(base_time) => base_time,
|
Some(base_time) => base_time,
|
||||||
None => return,
|
None => return,
|
||||||
};
|
};
|
||||||
|
@ -777,7 +777,7 @@ impl FallbackSwitch {
|
||||||
std::ops::ControlFlow::Continue(gst::EventForeachAction::Keep)
|
std::ops::ControlFlow::Continue(gst::EventForeachAction::Keep)
|
||||||
});
|
});
|
||||||
|
|
||||||
self.instance().notify(PROP_ACTIVE_PAD);
|
self.obj().notify(PROP_ACTIVE_PAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
if discont_pending && !buffer.flags().contains(gst::BufferFlags::DISCONT) {
|
if discont_pending && !buffer.flags().contains(gst::BufferFlags::DISCONT) {
|
||||||
|
@ -931,7 +931,7 @@ impl FallbackSwitch {
|
||||||
std::ops::ControlFlow::Continue(gst::EventForeachAction::Keep)
|
std::ops::ControlFlow::Continue(gst::EventForeachAction::Keep)
|
||||||
});
|
});
|
||||||
|
|
||||||
self.instance().notify(PROP_ACTIVE_PAD);
|
self.obj().notify(PROP_ACTIVE_PAD);
|
||||||
}
|
}
|
||||||
self.src_pad.push_event(event)
|
self.src_pad.push_event(event)
|
||||||
}
|
}
|
||||||
|
@ -953,7 +953,7 @@ impl FallbackSwitch {
|
||||||
self.active_sinkpad.lock().as_ref() == Some(pad)
|
self.active_sinkpad.lock().as_ref() == Some(pad)
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
gst::Pad::query_default(pad, Some(&*self.instance()), query);
|
gst::Pad::query_default(pad, Some(&*self.obj()), query);
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -983,7 +983,7 @@ impl FallbackSwitch {
|
||||||
let mut min_latency = gst::ClockTime::ZERO;
|
let mut min_latency = gst::ClockTime::ZERO;
|
||||||
let mut max_latency = gst::ClockTime::NONE;
|
let mut max_latency = gst::ClockTime::NONE;
|
||||||
|
|
||||||
for pad in self.instance().sink_pads() {
|
for pad in self.obj().sink_pads() {
|
||||||
let mut peer_query = gst::query::Latency::new();
|
let mut peer_query = gst::query::Latency::new();
|
||||||
|
|
||||||
ret = pad.peer_query(&mut peer_query);
|
ret = pad.peer_query(&mut peer_query);
|
||||||
|
@ -1017,7 +1017,7 @@ impl FallbackSwitch {
|
||||||
if let Some(sinkpad) = sinkpad {
|
if let Some(sinkpad) = sinkpad {
|
||||||
sinkpad.peer_query(query)
|
sinkpad.peer_query(query)
|
||||||
} else {
|
} else {
|
||||||
gst::Pad::query_default(pad, Some(&*self.instance()), query)
|
gst::Pad::query_default(pad, Some(&*self.obj()), query)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
|
@ -1144,11 +1144,9 @@ impl ObjectImpl for FallbackSwitch {
|
||||||
settings.timeout = new_value;
|
settings.timeout = new_value;
|
||||||
debug!(CAT, imp: self, "Timeout now {}", settings.timeout);
|
debug!(CAT, imp: self, "Timeout now {}", settings.timeout);
|
||||||
drop(settings);
|
drop(settings);
|
||||||
let _ = self.instance().post_message(
|
let _ = self
|
||||||
gst::message::Latency::builder()
|
.obj()
|
||||||
.src(&*self.instance())
|
.post_message(gst::message::Latency::builder().src(&*self.obj()).build());
|
||||||
.build(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
PROP_LATENCY => {
|
PROP_LATENCY => {
|
||||||
let mut settings = self.settings.lock();
|
let mut settings = self.settings.lock();
|
||||||
|
@ -1156,11 +1154,9 @@ impl ObjectImpl for FallbackSwitch {
|
||||||
|
|
||||||
settings.latency = new_value;
|
settings.latency = new_value;
|
||||||
drop(settings);
|
drop(settings);
|
||||||
let _ = self.instance().post_message(
|
let _ = self
|
||||||
gst::message::Latency::builder()
|
.obj()
|
||||||
.src(&*self.instance())
|
.post_message(gst::message::Latency::builder().src(&*self.obj()).build());
|
||||||
.build(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
PROP_MIN_UPSTREAM_LATENCY => {
|
PROP_MIN_UPSTREAM_LATENCY => {
|
||||||
let mut settings = self.settings.lock();
|
let mut settings = self.settings.lock();
|
||||||
|
@ -1168,11 +1164,9 @@ impl ObjectImpl for FallbackSwitch {
|
||||||
|
|
||||||
settings.min_upstream_latency = new_value;
|
settings.min_upstream_latency = new_value;
|
||||||
drop(settings);
|
drop(settings);
|
||||||
let _ = self.instance().post_message(
|
let _ = self
|
||||||
gst::message::Latency::builder()
|
.obj()
|
||||||
.src(&*self.instance())
|
.post_message(gst::message::Latency::builder().src(&*self.obj()).build());
|
||||||
.build(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
PROP_IMMEDIATE_FALLBACK => {
|
PROP_IMMEDIATE_FALLBACK => {
|
||||||
let mut settings = self.settings.lock();
|
let mut settings = self.settings.lock();
|
||||||
|
@ -1221,7 +1215,7 @@ impl ObjectImpl for FallbackSwitch {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.src_pad).unwrap();
|
obj.add_pad(&self.src_pad).unwrap();
|
||||||
obj.set_element_flags(gst::ElementFlags::REQUIRE_CLOCK);
|
obj.set_element_flags(gst::ElementFlags::REQUIRE_CLOCK);
|
||||||
}
|
}
|
||||||
|
@ -1284,7 +1278,7 @@ impl ElementImpl for FallbackSwitch {
|
||||||
let mut state = self.state.lock();
|
let mut state = self.state.lock();
|
||||||
let prev_active_pad = self.active_sinkpad.lock().take();
|
let prev_active_pad = self.active_sinkpad.lock().take();
|
||||||
*state = State::default();
|
*state = State::default();
|
||||||
let pads = self.instance().sink_pads();
|
let pads = self.obj().sink_pads();
|
||||||
|
|
||||||
if let Some(pad) = pads.first() {
|
if let Some(pad) = pads.first() {
|
||||||
let pad = pad.downcast_ref::<super::FallbackSwitchSinkPad>().unwrap();
|
let pad = pad.downcast_ref::<super::FallbackSwitchSinkPad>().unwrap();
|
||||||
|
@ -1295,7 +1289,7 @@ impl ElementImpl for FallbackSwitch {
|
||||||
drop(state);
|
drop(state);
|
||||||
|
|
||||||
if prev_active_pad.as_ref() != Some(pad) {
|
if prev_active_pad.as_ref() != Some(pad) {
|
||||||
self.instance().notify(PROP_ACTIVE_PAD);
|
self.obj().notify(PROP_ACTIVE_PAD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for pad in pads {
|
for pad in pads {
|
||||||
|
@ -1318,7 +1312,7 @@ impl ElementImpl for FallbackSwitch {
|
||||||
}
|
}
|
||||||
gst::StateChange::PausedToReady => {
|
gst::StateChange::PausedToReady => {
|
||||||
*self.state.lock() = State::default();
|
*self.state.lock() = State::default();
|
||||||
for pad in self.instance().sink_pads() {
|
for pad in self.obj().sink_pads() {
|
||||||
let pad = pad.downcast_ref::<super::FallbackSwitchSinkPad>().unwrap();
|
let pad = pad.downcast_ref::<super::FallbackSwitchSinkPad>().unwrap();
|
||||||
let pad_imp = pad.imp();
|
let pad_imp = pad.imp();
|
||||||
*pad_imp.state.lock() = SinkState::default();
|
*pad_imp.state.lock() = SinkState::default();
|
||||||
|
@ -1378,7 +1372,7 @@ impl ElementImpl for FallbackSwitch {
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
pad.set_active(true).unwrap();
|
pad.set_active(true).unwrap();
|
||||||
self.instance().add_pad(&pad).unwrap();
|
self.obj().add_pad(&pad).unwrap();
|
||||||
|
|
||||||
let notify_active_pad = match &mut *self.active_sinkpad.lock() {
|
let notify_active_pad = match &mut *self.active_sinkpad.lock() {
|
||||||
active_sinkpad @ None => {
|
active_sinkpad @ None => {
|
||||||
|
@ -1396,16 +1390,14 @@ impl ElementImpl for FallbackSwitch {
|
||||||
drop(state);
|
drop(state);
|
||||||
|
|
||||||
if notify_active_pad {
|
if notify_active_pad {
|
||||||
self.instance().notify(PROP_ACTIVE_PAD);
|
self.obj().notify(PROP_ACTIVE_PAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
let _ = self.instance().post_message(
|
let _ = self
|
||||||
gst::message::Latency::builder()
|
.obj()
|
||||||
.src(&*self.instance())
|
.post_message(gst::message::Latency::builder().src(&*self.obj()).build());
|
||||||
.build(),
|
|
||||||
);
|
|
||||||
|
|
||||||
self.instance().child_added(&pad, &pad.name());
|
self.obj().child_added(&pad, &pad.name());
|
||||||
Some(pad.upcast())
|
Some(pad.upcast())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1416,14 +1408,12 @@ impl ElementImpl for FallbackSwitch {
|
||||||
drop(pad_state);
|
drop(pad_state);
|
||||||
|
|
||||||
let _ = pad.set_active(false);
|
let _ = pad.set_active(false);
|
||||||
self.instance().remove_pad(pad).unwrap();
|
self.obj().remove_pad(pad).unwrap();
|
||||||
|
|
||||||
self.instance().child_removed(pad, &pad.name());
|
self.obj().child_removed(pad, &pad.name());
|
||||||
let _ = self.instance().post_message(
|
let _ = self
|
||||||
gst::message::Latency::builder()
|
.obj()
|
||||||
.src(&*self.instance())
|
.post_message(gst::message::Latency::builder().src(&*self.obj()).build());
|
||||||
.build(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1432,12 +1422,12 @@ impl ElementImpl for FallbackSwitch {
|
||||||
// This allows accessing the pads and their properties from e.g. gst-launch.
|
// This allows accessing the pads and their properties from e.g. gst-launch.
|
||||||
impl ChildProxyImpl for FallbackSwitch {
|
impl ChildProxyImpl for FallbackSwitch {
|
||||||
fn children_count(&self) -> u32 {
|
fn children_count(&self) -> u32 {
|
||||||
let object = self.instance();
|
let object = self.obj();
|
||||||
object.num_pads() as u32
|
object.num_pads() as u32
|
||||||
}
|
}
|
||||||
|
|
||||||
fn child_by_name(&self, name: &str) -> Option<glib::Object> {
|
fn child_by_name(&self, name: &str) -> Option<glib::Object> {
|
||||||
let object = self.instance();
|
let object = self.obj();
|
||||||
object
|
object
|
||||||
.pads()
|
.pads()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
@ -1446,7 +1436,7 @@ impl ChildProxyImpl for FallbackSwitch {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn child_by_index(&self, index: u32) -> Option<glib::Object> {
|
fn child_by_index(&self, index: u32) -> Option<glib::Object> {
|
||||||
let object = self.instance();
|
let object = self.obj();
|
||||||
object
|
object
|
||||||
.pads()
|
.pads()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
|
|
@ -497,7 +497,7 @@ impl ToggleRecord {
|
||||||
|
|
||||||
drop(rec_state);
|
drop(rec_state);
|
||||||
drop(state);
|
drop(state);
|
||||||
self.instance().notify("recording");
|
self.obj().notify("recording");
|
||||||
|
|
||||||
Ok(HandleResult::Drop)
|
Ok(HandleResult::Drop)
|
||||||
}
|
}
|
||||||
|
@ -583,7 +583,7 @@ impl ToggleRecord {
|
||||||
|
|
||||||
drop(rec_state);
|
drop(rec_state);
|
||||||
drop(state);
|
drop(state);
|
||||||
self.instance().notify("recording");
|
self.obj().notify("recording");
|
||||||
|
|
||||||
Ok(HandleResult::Pass(data))
|
Ok(HandleResult::Pass(data))
|
||||||
}
|
}
|
||||||
|
@ -1187,7 +1187,7 @@ impl ToggleRecord {
|
||||||
);
|
);
|
||||||
|
|
||||||
if recording_state_updated {
|
if recording_state_updated {
|
||||||
self.instance().notify("recording");
|
self.obj().notify("recording");
|
||||||
}
|
}
|
||||||
|
|
||||||
return Err(gst::FlowError::Eos);
|
return Err(gst::FlowError::Eos);
|
||||||
|
@ -1444,7 +1444,7 @@ impl ToggleRecord {
|
||||||
};
|
};
|
||||||
|
|
||||||
if recording_state_changed {
|
if recording_state_changed {
|
||||||
self.instance().notify("recording");
|
self.obj().notify("recording");
|
||||||
}
|
}
|
||||||
|
|
||||||
// If a serialized event and coming after Segment and a new Segment is pending,
|
// If a serialized event and coming after Segment and a new Segment is pending,
|
||||||
|
@ -1859,7 +1859,7 @@ impl ObjectImpl for ToggleRecord {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.main_stream.sinkpad).unwrap();
|
obj.add_pad(&self.main_stream.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.main_stream.srcpad).unwrap();
|
obj.add_pad(&self.main_stream.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
@ -1982,7 +1982,7 @@ impl ElementImpl for ToggleRecord {
|
||||||
let mut rec_state = self.state.lock();
|
let mut rec_state = self.state.lock();
|
||||||
*rec_state = State::default();
|
*rec_state = State::default();
|
||||||
drop(rec_state);
|
drop(rec_state);
|
||||||
self.instance().notify("recording");
|
self.obj().notify("recording");
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(success)
|
Ok(success)
|
||||||
|
@ -2001,7 +2001,7 @@ impl ElementImpl for ToggleRecord {
|
||||||
let id = *pad_count;
|
let id = *pad_count;
|
||||||
*pad_count += 1;
|
*pad_count += 1;
|
||||||
|
|
||||||
let templ = self.instance().pad_template("sink_%u").unwrap();
|
let templ = self.obj().pad_template("sink_%u").unwrap();
|
||||||
let sinkpad =
|
let sinkpad =
|
||||||
gst::Pad::builder_with_template(&templ, Some(format!("sink_{}", id).as_str()))
|
gst::Pad::builder_with_template(&templ, Some(format!("sink_{}", id).as_str()))
|
||||||
.chain_function(|pad, parent, buffer| {
|
.chain_function(|pad, parent, buffer| {
|
||||||
|
@ -2034,7 +2034,7 @@ impl ElementImpl for ToggleRecord {
|
||||||
})
|
})
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
let templ = self.instance().pad_template("src_%u").unwrap();
|
let templ = self.obj().pad_template("src_%u").unwrap();
|
||||||
let srcpad = gst::Pad::builder_with_template(&templ, Some(format!("src_{}", id).as_str()))
|
let srcpad = gst::Pad::builder_with_template(&templ, Some(format!("src_{}", id).as_str()))
|
||||||
.event_function(|pad, parent, event| {
|
.event_function(|pad, parent, event| {
|
||||||
ToggleRecord::catch_panic_pad_function(
|
ToggleRecord::catch_panic_pad_function(
|
||||||
|
@ -2072,8 +2072,8 @@ impl ElementImpl for ToggleRecord {
|
||||||
drop(pads);
|
drop(pads);
|
||||||
drop(other_streams_guard);
|
drop(other_streams_guard);
|
||||||
|
|
||||||
self.instance().add_pad(&sinkpad).unwrap();
|
self.obj().add_pad(&sinkpad).unwrap();
|
||||||
self.instance().add_pad(&srcpad).unwrap();
|
self.obj().add_pad(&srcpad).unwrap();
|
||||||
|
|
||||||
Some(sinkpad)
|
Some(sinkpad)
|
||||||
}
|
}
|
||||||
|
@ -2105,7 +2105,7 @@ impl ElementImpl for ToggleRecord {
|
||||||
stream.srcpad.set_active(false).unwrap();
|
stream.srcpad.set_active(false).unwrap();
|
||||||
stream.sinkpad.set_active(false).unwrap();
|
stream.sinkpad.set_active(false).unwrap();
|
||||||
|
|
||||||
self.instance().remove_pad(&stream.sinkpad).unwrap();
|
self.obj().remove_pad(&stream.sinkpad).unwrap();
|
||||||
self.instance().remove_pad(&stream.srcpad).unwrap();
|
self.obj().remove_pad(&stream.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -174,7 +174,7 @@ impl ObjectImpl for BufferLateness {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
if let Some(params) = self.instance().property::<Option<String>>("params") {
|
if let Some(params) = self.obj().property::<Option<String>>("params") {
|
||||||
let mut state = self.state.lock().unwrap();
|
let mut state = self.state.lock().unwrap();
|
||||||
state.settings.update_from_params(self, params);
|
state.settings.update_from_params(self, params);
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,7 +134,7 @@ impl ObjectImpl for PipelineSnapshot {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let mut settings = Settings::default();
|
let mut settings = Settings::default();
|
||||||
if let Some(params) = self.instance().property::<Option<String>>("params") {
|
if let Some(params) = self.obj().property::<Option<String>>("params") {
|
||||||
settings.update_from_params(self, params);
|
settings.update_from_params(self, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ impl PipelineSnapshot {
|
||||||
let mut signals = Signals::new(&[SIGUSR1])?;
|
let mut signals = Signals::new(&[SIGUSR1])?;
|
||||||
let signal_handle = signals.handle();
|
let signal_handle = signals.handle();
|
||||||
|
|
||||||
let tracer_weak = self.instance().downgrade();
|
let tracer_weak = self.obj().downgrade();
|
||||||
let pipelines = self.pipelines.clone();
|
let pipelines = self.pipelines.clone();
|
||||||
|
|
||||||
let thread_handle = std::thread::spawn(move || {
|
let thread_handle = std::thread::spawn(move || {
|
||||||
|
|
|
@ -201,7 +201,7 @@ impl ObjectImpl for QueueLevels {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
if let Some(params) = self.instance().property::<Option<String>>("params") {
|
if let Some(params) = self.obj().property::<Option<String>>("params") {
|
||||||
let mut state = self.state.lock().unwrap();
|
let mut state = self.state.lock().unwrap();
|
||||||
state.settings.update_from_params(self, params);
|
state.settings.update_from_params(self, params);
|
||||||
}
|
}
|
||||||
|
|
|
@ -205,7 +205,7 @@ impl State {
|
||||||
|
|
||||||
// send pending messages then unblock pads
|
// send pending messages then unblock pads
|
||||||
for msg in messages {
|
for msg in messages {
|
||||||
let _ = imp.instance().post_message(msg);
|
let _ = imp.obj().post_message(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
channels.send(true);
|
channels.send(true);
|
||||||
|
@ -826,7 +826,7 @@ impl ObjectImpl for UriPlaylistBin {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.set_suppressed_flags(gst::ElementFlags::SOURCE | gst::ElementFlags::SINK);
|
obj.set_suppressed_flags(gst::ElementFlags::SOURCE | gst::ElementFlags::SINK);
|
||||||
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
obj.set_element_flags(gst::ElementFlags::SOURCE);
|
||||||
}
|
}
|
||||||
|
@ -978,7 +978,7 @@ impl UriPlaylistBin {
|
||||||
.build()
|
.build()
|
||||||
.map_err(|e| PlaylistError::PluginMissing { error: e.into() })?;
|
.map_err(|e| PlaylistError::PluginMissing { error: e.into() })?;
|
||||||
|
|
||||||
self.instance().add(&streamsynchronizer).unwrap();
|
self.obj().add(&streamsynchronizer).unwrap();
|
||||||
|
|
||||||
let settings = self.settings.lock().unwrap();
|
let settings = self.settings.lock().unwrap();
|
||||||
|
|
||||||
|
@ -1015,7 +1015,7 @@ impl UriPlaylistBin {
|
||||||
let _ = uridecodebin.set_state(gst::State::Null);
|
let _ = uridecodebin.set_state(gst::State::Null);
|
||||||
});
|
});
|
||||||
|
|
||||||
self.instance().remove(&uridecodebin).unwrap();
|
self.obj().remove(&uridecodebin).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
if state.waiting_for_stream_collection.is_some()
|
if state.waiting_for_stream_collection.is_some()
|
||||||
|
@ -1062,7 +1062,7 @@ impl UriPlaylistBin {
|
||||||
|
|
||||||
let uridecodebin = item.uridecodebin();
|
let uridecodebin = item.uridecodebin();
|
||||||
|
|
||||||
self.instance().add(&uridecodebin).unwrap();
|
self.obj().add(&uridecodebin).unwrap();
|
||||||
|
|
||||||
let item_clone = item.clone();
|
let item_clone = item.clone();
|
||||||
assert!(state.waiting_for_stream_collection.is_none());
|
assert!(state.waiting_for_stream_collection.is_none());
|
||||||
|
@ -1217,7 +1217,7 @@ impl UriPlaylistBin {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn process_decodebin_pad(&self, src_pad: &gst::Pad) {
|
fn process_decodebin_pad(&self, src_pad: &gst::Pad) {
|
||||||
let element = self.instance();
|
let element = self.obj();
|
||||||
|
|
||||||
let start_next = {
|
let start_next = {
|
||||||
let mut state_guard = self.state.lock().unwrap();
|
let mut state_guard = self.state.lock().unwrap();
|
||||||
|
@ -1561,7 +1561,7 @@ impl UriPlaylistBin {
|
||||||
streamsynchronizer.release_request_pad(&ss_sink);
|
streamsynchronizer.release_request_pad(&ss_sink);
|
||||||
|
|
||||||
// remove associated ghost pad
|
// remove associated ghost pad
|
||||||
let src_pads = imp.instance().src_pads();
|
let src_pads = imp.obj().src_pads();
|
||||||
let ghost = src_pads
|
let ghost = src_pads
|
||||||
.iter()
|
.iter()
|
||||||
.find(|pad| {
|
.find(|pad| {
|
||||||
|
@ -1569,9 +1569,9 @@ impl UriPlaylistBin {
|
||||||
ghost.target().is_none()
|
ghost.target().is_none()
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
imp.instance().remove_pad(ghost).unwrap();
|
imp.obj().remove_pad(ghost).unwrap();
|
||||||
|
|
||||||
imp.instance().remove(&concat).unwrap();
|
imp.obj().remove(&concat).unwrap();
|
||||||
let _ = concat.set_state(gst::State::Null);
|
let _ = concat.set_state(gst::State::Null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1636,7 +1636,7 @@ impl UriPlaylistBin {
|
||||||
uridecodebin.call_async(move |uridecodebin| {
|
uridecodebin.call_async(move |uridecodebin| {
|
||||||
let _ = uridecodebin.set_state(gst::State::Null);
|
let _ = uridecodebin.set_state(gst::State::Null);
|
||||||
});
|
});
|
||||||
let _ = self.instance().remove(&uridecodebin);
|
let _ = self.obj().remove(&uridecodebin);
|
||||||
|
|
||||||
let details = gst::Structure::builder("details");
|
let details = gst::Structure::builder("details");
|
||||||
let details = details.field("uri", item.uri());
|
let details = details.field("uri", item.uri());
|
||||||
|
@ -1672,7 +1672,7 @@ impl UriPlaylistBin {
|
||||||
current_iteration = 0;
|
current_iteration = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
let element = self.instance();
|
let element = self.obj();
|
||||||
if current_iteration != state.current_iteration {
|
if current_iteration != state.current_iteration {
|
||||||
state.current_iteration = current_iteration;
|
state.current_iteration = current_iteration;
|
||||||
element.notify("current-iteration");
|
element.notify("current-iteration");
|
||||||
|
|
|
@ -110,7 +110,7 @@ impl VideoDecoderImpl for CdgDec {
|
||||||
{
|
{
|
||||||
let mut out_info = self.output_info.lock().unwrap();
|
let mut out_info = self.output_info.lock().unwrap();
|
||||||
if out_info.is_none() {
|
if out_info.is_none() {
|
||||||
let instance = self.instance();
|
let instance = self.obj();
|
||||||
let output_state = instance.set_output_state(
|
let output_state = instance.set_output_state(
|
||||||
gst_video::VideoFormat::Rgba,
|
gst_video::VideoFormat::Rgba,
|
||||||
CDG_WIDTH,
|
CDG_WIDTH,
|
||||||
|
@ -144,7 +144,7 @@ impl VideoDecoderImpl for CdgDec {
|
||||||
Some(cmd) => cmd,
|
Some(cmd) => cmd,
|
||||||
None => {
|
None => {
|
||||||
// Not a CDG command
|
// Not a CDG command
|
||||||
self.instance().release_frame(frame);
|
self.obj().release_frame(frame);
|
||||||
return Ok(gst::FlowSuccess::Ok);
|
return Ok(gst::FlowSuccess::Ok);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -152,7 +152,7 @@ impl VideoDecoderImpl for CdgDec {
|
||||||
let mut cdg_inter = self.cdg_inter.lock().unwrap();
|
let mut cdg_inter = self.cdg_inter.lock().unwrap();
|
||||||
cdg_inter.handle_cmd(cmd);
|
cdg_inter.handle_cmd(cmd);
|
||||||
|
|
||||||
self.instance().allocate_output_frame(&mut frame, None)?;
|
self.obj().allocate_output_frame(&mut frame, None)?;
|
||||||
{
|
{
|
||||||
let output = frame.output_buffer_mut().unwrap();
|
let output = frame.output_buffer_mut().unwrap();
|
||||||
let info = self.output_info.lock().unwrap();
|
let info = self.output_info.lock().unwrap();
|
||||||
|
@ -190,7 +190,7 @@ impl VideoDecoderImpl for CdgDec {
|
||||||
|
|
||||||
gst::debug!(CAT, imp: self, "Finish frame pts={}", frame.pts().display());
|
gst::debug!(CAT, imp: self, "Finish frame pts={}", frame.pts().display());
|
||||||
|
|
||||||
self.instance().finish_frame(frame)
|
self.obj().finish_frame(frame)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn decide_allocation(
|
fn decide_allocation(
|
||||||
|
|
|
@ -110,14 +110,14 @@ fn time_to_bytes(time: gst::ClockTime) -> Bytes {
|
||||||
|
|
||||||
impl BaseParseImpl for CdgParse {
|
impl BaseParseImpl for CdgParse {
|
||||||
fn start(&self) -> Result<(), gst::ErrorMessage> {
|
fn start(&self) -> Result<(), gst::ErrorMessage> {
|
||||||
self.instance().set_min_frame_size(CDG_PACKET_SIZE as u32);
|
self.obj().set_min_frame_size(CDG_PACKET_SIZE as u32);
|
||||||
|
|
||||||
/* Set duration */
|
/* Set duration */
|
||||||
let mut query = gst::query::Duration::new(gst::Format::Bytes);
|
let mut query = gst::query::Duration::new(gst::Format::Bytes);
|
||||||
if self.instance().src_pad().query(&mut query) {
|
if self.obj().src_pad().query(&mut query) {
|
||||||
let size = query.result();
|
let size = query.result();
|
||||||
let bytes: Option<Bytes> = size.try_into().unwrap();
|
let bytes: Option<Bytes> = size.try_into().unwrap();
|
||||||
self.instance().set_duration(bytes.map(bytes_to_time), 0);
|
self.obj().set_duration(bytes.map(bytes_to_time), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -127,7 +127,7 @@ impl BaseParseImpl for CdgParse {
|
||||||
&self,
|
&self,
|
||||||
mut frame: gst_base::BaseParseFrame,
|
mut frame: gst_base::BaseParseFrame,
|
||||||
) -> Result<(gst::FlowSuccess, u32), gst::FlowError> {
|
) -> Result<(gst::FlowSuccess, u32), gst::FlowError> {
|
||||||
if self.instance().src_pad().current_caps().is_none() {
|
if self.obj().src_pad().current_caps().is_none() {
|
||||||
// Set src pad caps
|
// Set src pad caps
|
||||||
let src_caps = gst::Caps::builder("video/x-cdg")
|
let src_caps = gst::Caps::builder("video/x-cdg")
|
||||||
.field("width", CDG_WIDTH as i32)
|
.field("width", CDG_WIDTH as i32)
|
||||||
|
@ -136,7 +136,7 @@ impl BaseParseImpl for CdgParse {
|
||||||
.field("parsed", true)
|
.field("parsed", true)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
self.instance()
|
self.obj()
|
||||||
.src_pad()
|
.src_pad()
|
||||||
.push_event(gst::event::Caps::new(&src_caps));
|
.push_event(gst::event::Caps::new(&src_caps));
|
||||||
}
|
}
|
||||||
|
@ -202,8 +202,7 @@ impl BaseParseImpl for CdgParse {
|
||||||
|
|
||||||
gst::debug!(CAT, imp: self, "Found frame pts={}", pts);
|
gst::debug!(CAT, imp: self, "Found frame pts={}", pts);
|
||||||
|
|
||||||
self.instance()
|
self.obj().finish_frame(frame, CDG_PACKET_SIZE as u32)?;
|
||||||
.finish_frame(frame, CDG_PACKET_SIZE as u32)?;
|
|
||||||
|
|
||||||
Ok((gst::FlowSuccess::Ok, skip))
|
Ok((gst::FlowSuccess::Ok, skip))
|
||||||
}
|
}
|
||||||
|
|
|
@ -208,10 +208,10 @@ impl CCDetect {
|
||||||
}
|
}
|
||||||
|
|
||||||
if notify_cc608 {
|
if notify_cc608 {
|
||||||
self.instance().notify("cc608");
|
self.obj().notify("cc608");
|
||||||
}
|
}
|
||||||
if notify_cc708 {
|
if notify_cc708 {
|
||||||
self.instance().notify("cc708");
|
self.obj().notify("cc708");
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -507,9 +507,9 @@ impl Cea608Overlay {
|
||||||
let mut state = self.state.lock().unwrap();
|
let mut state = self.state.lock().unwrap();
|
||||||
state.caption_frame = CaptionFrame::default();
|
state.caption_frame = CaptionFrame::default();
|
||||||
state.composition = None;
|
state.composition = None;
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -644,7 +644,7 @@ impl ObjectImpl for Cea608Overlay {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -932,7 +932,7 @@ impl Cea608ToJson {
|
||||||
*state = State::default();
|
*state = State::default();
|
||||||
state.settings = old_settings;
|
state.settings = old_settings;
|
||||||
drop(state);
|
drop(state);
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
EventView::Eos(..) => {
|
EventView::Eos(..) => {
|
||||||
if let Some(lines) = self.state.borrow_mut().drain_pending(self) {
|
if let Some(lines) = self.state.borrow_mut().drain_pending(self) {
|
||||||
|
@ -942,9 +942,9 @@ impl Cea608ToJson {
|
||||||
let _ = self.output(lines);
|
let _ = self.output(lines);
|
||||||
}
|
}
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -993,7 +993,7 @@ impl ObjectImpl for Cea608ToJson {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -367,7 +367,7 @@ impl Cea608ToTt {
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,7 +414,7 @@ impl ObjectImpl for Cea608ToTt {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -435,10 +435,10 @@ impl JsonToVtt {
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event);
|
gst::Pad::event_default(pad, Some(&*self.obj()), event);
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -453,7 +453,7 @@ impl JsonToVtt {
|
||||||
let buffers = state.handle_eos(self);
|
let buffers = state.handle_eos(self);
|
||||||
drop(state);
|
drop(state);
|
||||||
let _ = self.output(buffers);
|
let _ = self.output(buffers);
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
EventView::Caps(..) => {
|
EventView::Caps(..) => {
|
||||||
let mut downstream_caps = match self.srcpad.allowed_caps() {
|
let mut downstream_caps = match self.srcpad.allowed_caps() {
|
||||||
|
@ -506,7 +506,7 @@ impl JsonToVtt {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* FIXME: Handle segment updates by draining? */
|
/* FIXME: Handle segment updates by draining? */
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
EventView::Gap(ev) => {
|
EventView::Gap(ev) => {
|
||||||
gst::log!(CAT, obj: pad, "Handling gap {:?}", ev);
|
gst::log!(CAT, obj: pad, "Handling gap {:?}", ev);
|
||||||
|
@ -516,7 +516,7 @@ impl JsonToVtt {
|
||||||
let _ = self.output(buffers);
|
let _ = self.output(buffers);
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -626,7 +626,7 @@ impl ObjectImpl for JsonToVtt {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -375,7 +375,7 @@ impl MccEnc {
|
||||||
.build();
|
.build();
|
||||||
self.srcpad.push_event(gst::event::Caps::new(&caps))
|
self.srcpad.push_event(gst::event::Caps::new(&caps))
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -388,7 +388,7 @@ impl MccEnc {
|
||||||
gst::log!(CAT, obj: pad, "Dropping seek event");
|
gst::log!(CAT, obj: pad, "Dropping seek event");
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -408,7 +408,7 @@ impl MccEnc {
|
||||||
);
|
);
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
_ => gst::Pad::query_default(pad, Some(&*self.instance()), query),
|
_ => gst::Pad::query_default(pad, Some(&*self.obj()), query),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -504,7 +504,7 @@ impl ObjectImpl for MccEnc {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,9 +46,7 @@ impl PullState {
|
||||||
fn new(imp: &MccParse, pad: &gst::Pad) -> Self {
|
fn new(imp: &MccParse, pad: &gst::Pad) -> Self {
|
||||||
Self {
|
Self {
|
||||||
need_stream_start: true,
|
need_stream_start: true,
|
||||||
stream_id: pad
|
stream_id: pad.create_stream_id(&*imp.obj(), Some("src")).to_string(),
|
||||||
.create_stream_id(&*imp.instance(), Some("src"))
|
|
||||||
.to_string(),
|
|
||||||
offset: 0,
|
offset: 0,
|
||||||
duration: gst::ClockTime::NONE,
|
duration: gst::ClockTime::NONE,
|
||||||
}
|
}
|
||||||
|
@ -883,14 +881,14 @@ impl MccParse {
|
||||||
let state = self.flush(state);
|
let state = self.flush(state);
|
||||||
drop(state);
|
drop(state);
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
EventView::Eos(_) => {
|
EventView::Eos(_) => {
|
||||||
gst::log!(CAT, obj: pad, "Draining");
|
gst::log!(CAT, obj: pad, "Draining");
|
||||||
if let Err(err) = self.handle_buffer(None, false) {
|
if let Err(err) = self.handle_buffer(None, false) {
|
||||||
gst::error!(CAT, obj: pad, "Failed to drain parser: {:?}", err);
|
gst::error!(CAT, obj: pad, "Failed to drain parser: {:?}", err);
|
||||||
}
|
}
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
if event.is_sticky()
|
if event.is_sticky()
|
||||||
|
@ -902,7 +900,7 @@ impl MccParse {
|
||||||
state.pending_events.push(event);
|
state.pending_events.push(event);
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1007,7 +1005,7 @@ impl MccParse {
|
||||||
gst::log!(CAT, obj: pad, "Handling event {:?}", event);
|
gst::log!(CAT, obj: pad, "Handling event {:?}", event);
|
||||||
match event.view() {
|
match event.view() {
|
||||||
EventView::Seek(e) => self.perform_seek(e),
|
EventView::Seek(e) => self.perform_seek(e),
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1061,7 +1059,7 @@ impl MccParse {
|
||||||
self.sinkpad.peer_query(query)
|
self.sinkpad.peer_query(query)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => gst::Pad::query_default(pad, Some(&*self.instance()), query),
|
_ => gst::Pad::query_default(pad, Some(&*self.obj()), query),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1140,7 +1138,7 @@ impl ObjectImpl for MccParse {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -307,9 +307,9 @@ impl SccEnc {
|
||||||
gst::error!(CAT, obj: pad, "Failed to write a line after EOS: {:?}", err);
|
gst::error!(CAT, obj: pad, "Failed to write a line after EOS: {:?}", err);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,7 +322,7 @@ impl SccEnc {
|
||||||
gst::log!(CAT, obj: pad, "Dropping seek event");
|
gst::log!(CAT, obj: pad, "Dropping seek event");
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,7 +342,7 @@ impl SccEnc {
|
||||||
);
|
);
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
_ => gst::Pad::query_default(pad, Some(&*self.instance()), query),
|
_ => gst::Pad::query_default(pad, Some(&*self.obj()), query),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -391,7 +391,7 @@ impl ObjectImpl for SccEnc {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,9 +40,7 @@ impl PullState {
|
||||||
fn new(imp: &SccParse, pad: &gst::Pad) -> Self {
|
fn new(imp: &SccParse, pad: &gst::Pad) -> Self {
|
||||||
Self {
|
Self {
|
||||||
need_stream_start: true,
|
need_stream_start: true,
|
||||||
stream_id: pad
|
stream_id: pad.create_stream_id(&*imp.obj(), Some("src")).to_string(),
|
||||||
.create_stream_id(&*imp.instance(), Some("src"))
|
|
||||||
.to_string(),
|
|
||||||
offset: 0,
|
offset: 0,
|
||||||
duration: gst::ClockTime::NONE,
|
duration: gst::ClockTime::NONE,
|
||||||
}
|
}
|
||||||
|
@ -762,14 +760,14 @@ impl SccParse {
|
||||||
let state = self.flush(state);
|
let state = self.flush(state);
|
||||||
drop(state);
|
drop(state);
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
EventView::Eos(_) => {
|
EventView::Eos(_) => {
|
||||||
gst::log!(CAT, obj: pad, "Draining");
|
gst::log!(CAT, obj: pad, "Draining");
|
||||||
if let Err(err) = self.handle_buffer(None) {
|
if let Err(err) = self.handle_buffer(None) {
|
||||||
gst::error!(CAT, obj: pad, "Failed to drain parser: {:?}", err);
|
gst::error!(CAT, obj: pad, "Failed to drain parser: {:?}", err);
|
||||||
}
|
}
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
if event.is_sticky()
|
if event.is_sticky()
|
||||||
|
@ -781,7 +779,7 @@ impl SccParse {
|
||||||
state.pending_events.push(event);
|
state.pending_events.push(event);
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -886,7 +884,7 @@ impl SccParse {
|
||||||
gst::log!(CAT, obj: pad, "Handling event {:?}", event);
|
gst::log!(CAT, obj: pad, "Handling event {:?}", event);
|
||||||
match event.view() {
|
match event.view() {
|
||||||
EventView::Seek(e) => self.perform_seek(e),
|
EventView::Seek(e) => self.perform_seek(e),
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -940,7 +938,7 @@ impl SccParse {
|
||||||
self.sinkpad.peer_query(query)
|
self.sinkpad.peer_query(query)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => gst::Pad::query_default(pad, Some(&*self.instance()), query),
|
_ => gst::Pad::query_default(pad, Some(&*self.obj()), query),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1019,7 +1017,7 @@ impl ObjectImpl for SccParse {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -220,7 +220,7 @@ impl TranscriberBin {
|
||||||
gst::PadProbeReturn::Ok
|
gst::PadProbeReturn::Ok
|
||||||
});
|
});
|
||||||
|
|
||||||
self.instance().add(&state.internal_bin)?;
|
self.obj().add(&state.internal_bin)?;
|
||||||
|
|
||||||
state.cccombiner.set_property("latency", 100.mseconds());
|
state.cccombiner.set_property("latency", 100.mseconds());
|
||||||
|
|
||||||
|
@ -411,8 +411,7 @@ impl TranscriberBin {
|
||||||
QueryViewMut::Latency(q) => {
|
QueryViewMut::Latency(q) => {
|
||||||
let mut upstream_query = gst::query::Latency::new();
|
let mut upstream_query = gst::query::Latency::new();
|
||||||
|
|
||||||
let ret =
|
let ret = gst::Pad::query_default(pad, Some(&*self.obj()), &mut upstream_query);
|
||||||
gst::Pad::query_default(pad, Some(&*self.instance()), &mut upstream_query);
|
|
||||||
|
|
||||||
if ret {
|
if ret {
|
||||||
let (_, mut min, _) = upstream_query.result();
|
let (_, mut min, _) = upstream_query.result();
|
||||||
|
@ -437,7 +436,7 @@ impl TranscriberBin {
|
||||||
|
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
_ => gst::Pad::query_default(pad, Some(&*self.instance()), query),
|
_ => gst::Pad::query_default(pad, Some(&*self.obj()), query),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -520,9 +519,9 @@ impl TranscriberBin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -750,7 +749,7 @@ impl ObjectImpl for TranscriberBin {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.audio_srcpad).unwrap();
|
obj.add_pad(&self.audio_srcpad).unwrap();
|
||||||
obj.add_pad(&self.audio_sinkpad).unwrap();
|
obj.add_pad(&self.audio_sinkpad).unwrap();
|
||||||
obj.add_pad(&self.video_srcpad).unwrap();
|
obj.add_pad(&self.video_srcpad).unwrap();
|
||||||
|
@ -890,8 +889,8 @@ impl BinImpl for TranscriberBin {
|
||||||
let mut settings = self.settings.lock().unwrap();
|
let mut settings = self.settings.lock().unwrap();
|
||||||
settings.passthrough = true;
|
settings.passthrough = true;
|
||||||
drop(settings);
|
drop(settings);
|
||||||
self.instance().notify("passthrough");
|
self.obj().notify("passthrough");
|
||||||
self.instance().call_async(move |bin| {
|
self.obj().call_async(move |bin| {
|
||||||
let thiz = bin.imp();
|
let thiz = bin.imp();
|
||||||
thiz.block_and_update(true);
|
thiz.block_and_update(true);
|
||||||
});
|
});
|
||||||
|
|
|
@ -933,7 +933,7 @@ impl TtToCea608 {
|
||||||
drop(state);
|
drop(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
EventView::FlushStop(_) => {
|
EventView::FlushStop(_) => {
|
||||||
let mut state = self.state.lock().unwrap();
|
let mut state = self.state.lock().unwrap();
|
||||||
|
@ -950,9 +950,9 @@ impl TtToCea608 {
|
||||||
drop(settings);
|
drop(settings);
|
||||||
drop(state);
|
drop(state);
|
||||||
|
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1036,7 +1036,7 @@ impl ObjectImpl for TtToCea608 {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,8 +132,8 @@ impl TtToJson {
|
||||||
.build();
|
.build();
|
||||||
self.srcpad.push_event(gst::event::Caps::new(&caps))
|
self.srcpad.push_event(gst::event::Caps::new(&caps))
|
||||||
}
|
}
|
||||||
EventView::Eos(_) => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
EventView::Eos(_) => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -237,7 +237,7 @@ impl ObjectImpl for TtToJson {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -157,7 +157,7 @@ impl Dav1dDec {
|
||||||
let input_state = state.input_state.clone();
|
let input_state = state.input_state.clone();
|
||||||
drop(state_guard);
|
drop(state_guard);
|
||||||
|
|
||||||
let instance = self.instance();
|
let instance = self.obj();
|
||||||
let output_state =
|
let output_state =
|
||||||
instance.set_output_state(format, pic.width(), pic.height(), Some(&input_state))?;
|
instance.set_output_state(format, pic.width(), pic.height(), Some(&input_state))?;
|
||||||
instance.negotiate(output_state)?;
|
instance.negotiate(output_state)?;
|
||||||
|
@ -214,9 +214,9 @@ impl Dav1dDec {
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
gst::error!(CAT, "Sending data failed (error code: {})", err);
|
gst::error!(CAT, "Sending data failed (error code: {})", err);
|
||||||
self.instance().release_frame(frame);
|
self.obj().release_frame(frame);
|
||||||
gst_video::video_decoder_error!(
|
gst_video::video_decoder_error!(
|
||||||
&*self.instance(),
|
&*self.obj(),
|
||||||
1,
|
1,
|
||||||
gst::StreamError::Decode,
|
gst::StreamError::Decode,
|
||||||
["Sending data failed (error code {})", err]
|
["Sending data failed (error code {})", err]
|
||||||
|
@ -246,7 +246,7 @@ impl Dav1dDec {
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
gst::error!(CAT, "Sending data failed (error code: {})", err);
|
gst::error!(CAT, "Sending data failed (error code: {})", err);
|
||||||
gst_video::video_decoder_error!(
|
gst_video::video_decoder_error!(
|
||||||
&*self.instance(),
|
&*self.obj(),
|
||||||
1,
|
1,
|
||||||
gst::StreamError::Decode,
|
gst::StreamError::Decode,
|
||||||
["Sending data failed (error code {})", err]
|
["Sending data failed (error code {})", err]
|
||||||
|
@ -359,7 +359,7 @@ impl Dav1dDec {
|
||||||
|
|
||||||
state_guard = self.handle_resolution_change(state_guard, pic)?;
|
state_guard = self.handle_resolution_change(state_guard, pic)?;
|
||||||
|
|
||||||
let instance = self.instance();
|
let instance = self.obj();
|
||||||
let output_state = instance
|
let output_state = instance
|
||||||
.output_state()
|
.output_state()
|
||||||
.expect("Output state not set. Shouldn't happen!");
|
.expect("Output state not set. Shouldn't happen!");
|
||||||
|
@ -412,7 +412,7 @@ impl Dav1dDec {
|
||||||
);
|
);
|
||||||
|
|
||||||
gst_video::video_decoder_error!(
|
gst_video::video_decoder_error!(
|
||||||
&*self.instance(),
|
&*self.obj(),
|
||||||
1,
|
1,
|
||||||
gst::StreamError::Decode,
|
gst::StreamError::Decode,
|
||||||
["Retrieving decoded picture failed (error code {})", err]
|
["Retrieving decoded picture failed (error code {})", err]
|
||||||
|
@ -596,7 +596,7 @@ impl VideoDecoderImpl for Dav1dDec {
|
||||||
Some(ref info) => {
|
Some(ref info) => {
|
||||||
let mut upstream_latency = gst::query::Latency::new();
|
let mut upstream_latency = gst::query::Latency::new();
|
||||||
|
|
||||||
if self.instance().sink_pad().peer_query(&mut upstream_latency) {
|
if self.obj().sink_pad().peer_query(&mut upstream_latency) {
|
||||||
let (live, mut min, mut max) = upstream_latency.result();
|
let (live, mut min, mut max) = upstream_latency.result();
|
||||||
// For autodetection: 1 if live, else whatever dav1d gives us
|
// For autodetection: 1 if live, else whatever dav1d gives us
|
||||||
let frame_latency: u64 = if max_frame_delay < 0 && live {
|
let frame_latency: u64 = if max_frame_delay < 0 && live {
|
||||||
|
@ -665,7 +665,7 @@ impl VideoDecoderImpl for Dav1dDec {
|
||||||
let mut latency_query = gst::query::Latency::new();
|
let mut latency_query = gst::query::Latency::new();
|
||||||
let mut is_live = false;
|
let mut is_live = false;
|
||||||
|
|
||||||
if self.instance().sink_pad().peer_query(&mut latency_query) {
|
if self.obj().sink_pad().peer_query(&mut latency_query) {
|
||||||
is_live = latency_query.result().0;
|
is_live = latency_query.result().0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -371,7 +371,7 @@ impl VideoDecoderImpl for Ffv1Dec {
|
||||||
let format = get_output_format(decoder.config_record())
|
let format = get_output_format(decoder.config_record())
|
||||||
.ok_or_else(|| gst::loggable_error!(CAT, "Unsupported format"))?;
|
.ok_or_else(|| gst::loggable_error!(CAT, "Unsupported format"))?;
|
||||||
|
|
||||||
let instance = self.instance();
|
let instance = self.obj();
|
||||||
let output_state = instance
|
let output_state = instance
|
||||||
.set_output_state(format, info.width(), info.height(), Some(state))
|
.set_output_state(format, info.width(), info.height(), Some(state))
|
||||||
.map_err(|err| gst::loggable_error!(CAT, "Failed to set output params: {}", err))?;
|
.map_err(|err| gst::loggable_error!(CAT, "Failed to set output params: {}", err))?;
|
||||||
|
@ -437,7 +437,7 @@ impl VideoDecoderImpl for Ffv1Dec {
|
||||||
drop(state);
|
drop(state);
|
||||||
|
|
||||||
frame.set_output_buffer(buf);
|
frame.set_output_buffer(buf);
|
||||||
self.instance().finish_frame(frame)?;
|
self.obj().finish_frame(frame)?;
|
||||||
|
|
||||||
Ok(gst::FlowSuccess::Ok)
|
Ok(gst::FlowSuccess::Ok)
|
||||||
}
|
}
|
||||||
|
|
|
@ -275,7 +275,7 @@ impl VideoEncoderImpl for GifEnc {
|
||||||
*self.state.borrow_mut() = Some(state);
|
*self.state.borrow_mut() = Some(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
let instance = self.instance();
|
let instance = self.obj();
|
||||||
let output_state = instance
|
let output_state = instance
|
||||||
.set_output_state(gst::Caps::builder("image/gif").build(), Some(state))
|
.set_output_state(gst::Caps::builder("image/gif").build(), Some(state))
|
||||||
.map_err(|_| gst::loggable_error!(CAT, "Failed to set output state"))?;
|
.map_err(|_| gst::loggable_error!(CAT, "Failed to set output state"))?;
|
||||||
|
@ -397,7 +397,7 @@ impl VideoEncoderImpl for GifEnc {
|
||||||
// Currently not using incremental frames -> every frame is a keyframe
|
// Currently not using incremental frames -> every frame is a keyframe
|
||||||
frame.set_flags(gst_video::VideoCodecFrameFlags::SYNC_POINT);
|
frame.set_flags(gst_video::VideoCodecFrameFlags::SYNC_POINT);
|
||||||
frame.set_output_buffer(output_buffer);
|
frame.set_output_buffer(output_buffer);
|
||||||
self.instance().finish_frame(Some(frame))
|
self.obj().finish_frame(Some(frame))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -425,7 +425,7 @@ impl GifEnc {
|
||||||
});
|
});
|
||||||
if let Some(trailer_buffer) = trailer_buffer {
|
if let Some(trailer_buffer) = trailer_buffer {
|
||||||
// manually push GIF trailer to the encoder's src pad
|
// manually push GIF trailer to the encoder's src pad
|
||||||
self.instance().src_pad().push(trailer_buffer)?;
|
self.obj().src_pad().push(trailer_buffer)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(gst::FlowSuccess::Ok)
|
Ok(gst::FlowSuccess::Ok)
|
||||||
|
|
|
@ -85,7 +85,7 @@ impl ObjectImpl for PaintableSink {
|
||||||
"paintable" => {
|
"paintable" => {
|
||||||
let mut paintable = self.paintable.lock().unwrap();
|
let mut paintable = self.paintable.lock().unwrap();
|
||||||
if paintable.is_none() {
|
if paintable.is_none() {
|
||||||
self.instance().initialize_paintable(&mut paintable);
|
self.obj().initialize_paintable(&mut paintable);
|
||||||
}
|
}
|
||||||
|
|
||||||
let paintable = match &*paintable {
|
let paintable = match &*paintable {
|
||||||
|
@ -183,7 +183,7 @@ impl ElementImpl for PaintableSink {
|
||||||
gst::StateChange::NullToReady => {
|
gst::StateChange::NullToReady => {
|
||||||
let mut paintable = self.paintable.lock().unwrap();
|
let mut paintable = self.paintable.lock().unwrap();
|
||||||
if paintable.is_none() {
|
if paintable.is_none() {
|
||||||
self.instance().initialize_paintable(&mut paintable);
|
self.obj().initialize_paintable(&mut paintable);
|
||||||
}
|
}
|
||||||
|
|
||||||
if paintable.is_none() {
|
if paintable.is_none() {
|
||||||
|
|
|
@ -158,10 +158,10 @@ impl SinkPaintable {
|
||||||
old_size,
|
old_size,
|
||||||
new_size,
|
new_size,
|
||||||
);
|
);
|
||||||
self.instance().invalidate_size();
|
self.obj().invalidate_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
self.instance().invalidate_contents();
|
self.obj().invalidate_contents();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -295,7 +295,7 @@ impl VideoEncoderImpl for PngEncoder {
|
||||||
*self.state.lock() = Some(state);
|
*self.state.lock() = Some(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
let instance = self.instance();
|
let instance = self.obj();
|
||||||
let output_state = instance
|
let output_state = instance
|
||||||
.set_output_state(gst::Caps::builder("image/png").build(), Some(state))
|
.set_output_state(gst::Caps::builder("image/png").build(), Some(state))
|
||||||
.map_err(|_| gst::loggable_error!(CAT, "Failed to set output state"))?;
|
.map_err(|_| gst::loggable_error!(CAT, "Failed to set output state"))?;
|
||||||
|
@ -335,6 +335,6 @@ impl VideoEncoderImpl for PngEncoder {
|
||||||
// There are no such incremental frames in the png format
|
// There are no such incremental frames in the png format
|
||||||
frame.set_flags(gst_video::VideoCodecFrameFlags::SYNC_POINT);
|
frame.set_flags(gst_video::VideoCodecFrameFlags::SYNC_POINT);
|
||||||
frame.set_output_buffer(output_buffer);
|
frame.set_output_buffer(output_buffer);
|
||||||
self.instance().finish_frame(Some(frame))
|
self.obj().finish_frame(Some(frame))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -805,7 +805,7 @@ impl VideoEncoderImpl for Rav1Enc {
|
||||||
video_info,
|
video_info,
|
||||||
});
|
});
|
||||||
|
|
||||||
let instance = self.instance();
|
let instance = self.obj();
|
||||||
let output_state = instance
|
let output_state = instance
|
||||||
.set_output_state(
|
.set_output_state(
|
||||||
gst::Caps::builder("video/x-av1")
|
gst::Caps::builder("video/x-av1")
|
||||||
|
@ -913,7 +913,7 @@ impl Rav1Enc {
|
||||||
packet_type
|
packet_type
|
||||||
);
|
);
|
||||||
|
|
||||||
let instance = self.instance();
|
let instance = self.obj();
|
||||||
let mut frame = instance
|
let mut frame = instance
|
||||||
.frame(frame_number as i32)
|
.frame(frame_number as i32)
|
||||||
.expect("frame not found");
|
.expect("frame not found");
|
||||||
|
|
|
@ -304,7 +304,7 @@ impl ObjectImpl for RoundedCorners {
|
||||||
border_radius
|
border_radius
|
||||||
);
|
);
|
||||||
settings.border_radius_px = border_radius;
|
settings.border_radius_px = border_radius;
|
||||||
self.instance().reconfigure_src();
|
self.obj().reconfigure_src();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
|
@ -462,10 +462,10 @@ impl BaseTransformImpl for RoundedCorners {
|
||||||
);
|
);
|
||||||
|
|
||||||
if out_info.format() == VideoFormat::I420 {
|
if out_info.format() == VideoFormat::I420 {
|
||||||
self.instance().set_passthrough(true);
|
self.obj().set_passthrough(true);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
} else {
|
} else {
|
||||||
self.instance().set_passthrough(false);
|
self.obj().set_passthrough(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// See "A420" planar 4:4:2:0 AYUV section
|
// See "A420" planar 4:4:2:0 AYUV section
|
||||||
|
@ -487,7 +487,7 @@ impl BaseTransformImpl for RoundedCorners {
|
||||||
&self,
|
&self,
|
||||||
inbuf: InputBuffer,
|
inbuf: InputBuffer,
|
||||||
) -> Result<PrepareOutputBufferSuccess, gst::FlowError> {
|
) -> Result<PrepareOutputBufferSuccess, gst::FlowError> {
|
||||||
if self.instance().is_passthrough() {
|
if self.obj().is_passthrough() {
|
||||||
return Ok(PrepareOutputBufferSuccess::InputBuffer);
|
return Ok(PrepareOutputBufferSuccess::InputBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -105,7 +105,7 @@ impl ColorDetect {
|
||||||
.map(|c| ((c.r as u32) << 16) | ((c.g as u32) << 8) | (c.b as u32)),
|
.map(|c| ((c.r as u32) << 16) | ((c.g as u32) << 8) | (c.b as u32)),
|
||||||
);
|
);
|
||||||
|
|
||||||
self.instance()
|
self.obj()
|
||||||
.post_message(
|
.post_message(
|
||||||
gst::message::Element::builder(
|
gst::message::Element::builder(
|
||||||
gst::structure::Structure::builder("colordetect")
|
gst::structure::Structure::builder("colordetect")
|
||||||
|
|
|
@ -196,7 +196,7 @@ impl ElementImpl for VideoCompare {
|
||||||
// Since we are releasing the reference pad, we need to select a new pad for the
|
// Since we are releasing the reference pad, we need to select a new pad for the
|
||||||
// comparisons. At the moment we have no defined criteria to select the next
|
// comparisons. At the moment we have no defined criteria to select the next
|
||||||
// reference sink pad, so we choose the first that comes.
|
// reference sink pad, so we choose the first that comes.
|
||||||
for sink_pad in self.instance().sink_pads() {
|
for sink_pad in self.obj().sink_pads() {
|
||||||
if current_reference_pad != sink_pad {
|
if current_reference_pad != sink_pad {
|
||||||
// Choose the first available left sink pad
|
// Choose the first available left sink pad
|
||||||
*reference_pad = Some(sink_pad);
|
*reference_pad = Some(sink_pad);
|
||||||
|
@ -317,7 +317,7 @@ impl VideoAggregatorImpl for VideoCompare {
|
||||||
|
|
||||||
// Loop through all remaining sink pads and compare the latest available buffer
|
// Loop through all remaining sink pads and compare the latest available buffer
|
||||||
for pad in self
|
for pad in self
|
||||||
.instance()
|
.obj()
|
||||||
.sink_pads()
|
.sink_pads()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|pad| pad.downcast::<gst_video::VideoAggregatorPad>().unwrap())
|
.map(|pad| pad.downcast::<gst_video::VideoAggregatorPad>().unwrap())
|
||||||
|
@ -369,7 +369,7 @@ impl VideoAggregatorImpl for VideoCompare {
|
||||||
"Image detected {}",
|
"Image detected {}",
|
||||||
message.running_time.unwrap().display()
|
message.running_time.unwrap().display()
|
||||||
);
|
);
|
||||||
let element = self.instance();
|
let element = self.obj();
|
||||||
let _ = element.post_message(
|
let _ = element.post_message(
|
||||||
gst::message::Element::builder(message.into())
|
gst::message::Element::builder(message.into())
|
||||||
.src(element.as_ref())
|
.src(element.as_ref())
|
||||||
|
|
|
@ -241,16 +241,16 @@ impl WebPDec {
|
||||||
EventView::FlushStop(..) => {
|
EventView::FlushStop(..) => {
|
||||||
let mut state = self.state.lock().unwrap();
|
let mut state = self.state.lock().unwrap();
|
||||||
*state = State::default();
|
*state = State::default();
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
EventView::Eos(..) => {
|
EventView::Eos(..) => {
|
||||||
if let Err(err) = self.decode() {
|
if let Err(err) = self.decode() {
|
||||||
self.post_error_message(err);
|
self.post_error_message(err);
|
||||||
}
|
}
|
||||||
gst::Pad::event_default(pad, Some(&*self.instance()), event)
|
gst::Pad::event_default(pad, Some(&*self.obj()), event)
|
||||||
}
|
}
|
||||||
EventView::Segment(..) => true,
|
EventView::Segment(..) => true,
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -260,7 +260,7 @@ impl WebPDec {
|
||||||
gst::log!(CAT, obj: pad, "Handling event {:?}", event);
|
gst::log!(CAT, obj: pad, "Handling event {:?}", event);
|
||||||
match event.view() {
|
match event.view() {
|
||||||
EventView::Seek(..) => false,
|
EventView::Seek(..) => false,
|
||||||
_ => gst::Pad::event_default(pad, Some(&*self.instance()), event),
|
_ => gst::Pad::event_default(pad, Some(&*self.obj()), event),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -309,7 +309,7 @@ impl ObjectImpl for WebPDec {
|
||||||
fn constructed(&self) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
let obj = self.instance();
|
let obj = self.obj();
|
||||||
obj.add_pad(&self.sinkpad).unwrap();
|
obj.add_pad(&self.sinkpad).unwrap();
|
||||||
obj.add_pad(&self.srcpad).unwrap();
|
obj.add_pad(&self.srcpad).unwrap();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue