From c6800e8a26e323904a88de8e522d4c6976028e5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 9 Dec 2017 19:41:54 +0200 Subject: [PATCH] Fixes/simplifications for GStreamer API changes --- gst-plugin-simple/src/demuxer.rs | 8 +- gst-plugin-simple/src/source.rs | 11 +- .../examples/gtk_recording.rs | 18 +-- gst-plugin-togglerecord/src/togglerecord.rs | 125 ++++++------------ gst-plugin-togglerecord/tests/tests.rs | 65 ++++----- 5 files changed, 82 insertions(+), 145 deletions(-) diff --git a/gst-plugin-simple/src/demuxer.rs b/gst-plugin-simple/src/demuxer.rs index 75c87b29..250748c8 100644 --- a/gst-plugin-simple/src/demuxer.rs +++ b/gst-plugin-simple/src/demuxer.rs @@ -205,8 +205,7 @@ impl Demuxer { ); pad.push_event(gst::Event::new_caps(&caps).build()); - let mut segment = gst::Segment::default(); - segment.init(gst::Format::Time); + let segment = gst::FormattedSegment::::default(); pad.push_event(gst::Event::new_segment(&segment).build()); self.flow_combiner.lock().unwrap().add_pad(&pad); @@ -351,9 +350,8 @@ impl Demuxer { if active { let upstream_size = demuxer .sinkpad - .peer_query_duration(gst::Format::Bytes) - .and_then(|d| d.try_to_bytes()) - .and_then(|d| d); + .peer_query_duration::() + .and_then(|v| v.0); if !demuxer.start(&element, upstream_size, mode == gst::PadMode::Pull) { return false; diff --git a/gst-plugin-simple/src/source.rs b/gst-plugin-simple/src/source.rs index eef5f101..facfffca 100644 --- a/gst-plugin-simple/src/source.rs +++ b/gst-plugin-simple/src/source.rs @@ -277,15 +277,16 @@ impl BaseSrcImpl for Source { fn do_seek(&self, src: &BaseSrc, segment: &mut gst::Segment) -> bool { let source_impl = &mut self.imp.lock().unwrap(); - if segment.get_format() != gst::Format::Bytes { - return false; - } + let segment = match segment.downcast_ref::() { + None => return false, + Some(segment) => segment, + }; - let start = match segment.get_start().try_to_bytes().unwrap() { + let start = match segment.get_start().0 { None => return false, Some(start) => start, }; - let stop = segment.get_stop().try_to_bytes().unwrap(); + let stop = segment.get_stop().0; gst_debug!(self.cat, obj: src, "Seeking to {:?}-{:?}", start, stop); diff --git a/gst-plugin-togglerecord/examples/gtk_recording.rs b/gst-plugin-togglerecord/examples/gtk_recording.rs index 5368f889..d1137418 100644 --- a/gst-plugin-togglerecord/examples/gtk_recording.rs +++ b/gst-plugin-togglerecord/examples/gtk_recording.rs @@ -225,25 +225,13 @@ fn create_ui(app: >k::Application) { let video_sink = &video_sink_clone; let togglerecord = &togglerecord_clone; - let position = if let Some(gst::FormatValue::Time(position)) = - video_sink.query_position(gst::Format::Time) - { - position - } else { - 0.into() - }; + let position = video_sink.query_position::().unwrap_or(0.into()); position_label.set_text(&format!("Position: {:.0}", position)); - let recording_duration = if let Some(gst::FormatValue::Time(recording_duration)) = - togglerecord + let recording_duration = togglerecord .get_static_pad("src") .unwrap() - .query_position(gst::Format::Time) - { - recording_duration - } else { - 0.into() - }; + .query_position::().unwrap_or(0.into()); recorded_duration_label.set_text(&format!("Recorded: {:.0}", recording_duration)); glib::Continue(true) diff --git a/gst-plugin-togglerecord/src/togglerecord.rs b/gst-plugin-togglerecord/src/togglerecord.rs index 4f36d2d8..8479c2dd 100644 --- a/gst-plugin-togglerecord/src/togglerecord.rs +++ b/gst-plugin-togglerecord/src/togglerecord.rs @@ -88,8 +88,8 @@ impl Stream { } struct StreamState { - in_segment: gst::Segment, - out_segment: gst::Segment, + in_segment: gst::FormattedSegment, + out_segment: gst::FormattedSegment, segment_seqnum: gst::Seqnum, current_running_time: gst::ClockTime, eos: bool, @@ -101,8 +101,8 @@ struct StreamState { impl Default for StreamState { fn default() -> Self { Self { - in_segment: gst::Segment::new(), - out_segment: gst::Segment::new(), + in_segment: gst::FormattedSegment::new(), + out_segment: gst::FormattedSegment::new(), segment_seqnum: gst::util_seqnum_next(), current_running_time: gst::CLOCK_TIME_NONE, eos: false, @@ -343,30 +343,14 @@ impl ToggleRecord { dts_or_pts }; - dts_or_pts = cmp::max( - state.in_segment.get_start().try_to_time().unwrap(), - dts_or_pts, - ); - dts_or_pts_end = cmp::max( - state.in_segment.get_start().try_to_time().unwrap(), - dts_or_pts_end, - ); - if state.in_segment.get_stop().try_to_time().unwrap().is_some() { - dts_or_pts = cmp::min( - state.in_segment.get_stop().try_to_time().unwrap(), - dts_or_pts, - ); - dts_or_pts_end = cmp::min( - state.in_segment.get_stop().try_to_time().unwrap(), - dts_or_pts_end, - ); + dts_or_pts = cmp::max(state.in_segment.get_start(), dts_or_pts); + dts_or_pts_end = cmp::max(state.in_segment.get_start(), dts_or_pts_end); + if state.in_segment.get_stop().is_some() { + dts_or_pts = cmp::min(state.in_segment.get_stop(), dts_or_pts); + dts_or_pts_end = cmp::min(state.in_segment.get_stop(), dts_or_pts_end); } - let mut current_running_time = state - .in_segment - .to_running_time(dts_or_pts) - .try_to_time() - .unwrap(); + let mut current_running_time = state.in_segment.to_running_time(dts_or_pts); current_running_time = cmp::max(current_running_time, state.current_running_time); state.current_running_time = current_running_time; @@ -376,11 +360,7 @@ impl ToggleRecord { // get the wrong state self.main_stream_cond.notify_all(); - let current_running_time_end = state - .in_segment - .to_running_time(dts_or_pts_end) - .try_to_time() - .unwrap(); + let current_running_time_end = state.in_segment.to_running_time(dts_or_pts_end); gst_log!( self.cat, @@ -552,40 +532,32 @@ impl ToggleRecord { pts }; - pts = cmp::max(state.in_segment.get_start().try_to_time().unwrap(), pts); - if state.in_segment.get_stop().try_to_time().unwrap().is_some() - && pts >= state.in_segment.get_stop().try_to_time().unwrap() - { + pts = cmp::max(state.in_segment.get_start(), pts); + if state.in_segment.get_stop().is_some() && pts >= state.in_segment.get_stop() { state.current_running_time = state .in_segment - .to_running_time(state.in_segment.get_stop()) - .try_to_time() - .unwrap(); + .to_running_time(state.in_segment.get_stop()); state.eos = true; gst_debug!( self.cat, obj: pad, "After segment end {} >= {}, EOS", pts, - state.in_segment.get_stop().try_to_time().unwrap() + state.in_segment.get_stop() ); return HandleResult::Eos; } - pts_end = cmp::max(state.in_segment.get_start().try_to_time().unwrap(), pts_end); - if state.in_segment.get_stop().try_to_time().unwrap().is_some() { - pts_end = cmp::min(state.in_segment.get_stop().try_to_time().unwrap(), pts_end); + pts_end = cmp::max(state.in_segment.get_start(), pts_end); + if state.in_segment.get_stop().is_some() { + pts_end = cmp::min(state.in_segment.get_stop(), pts_end); } - let mut current_running_time = state.in_segment.to_running_time(pts).try_to_time().unwrap(); + let mut current_running_time = state.in_segment.to_running_time(pts); current_running_time = cmp::max(current_running_time, state.current_running_time); state.current_running_time = current_running_time; - let current_running_time_end = state - .in_segment - .to_running_time(pts_end) - .try_to_time() - .unwrap(); + let current_running_time_end = state.in_segment.to_running_time(pts_end); gst_log!( self.cat, obj: pad, @@ -762,18 +734,6 @@ impl ToggleRecord { { let state = stream.state.lock().unwrap(); - if state.in_segment.get_format() != gst::Format::Time { - gst_element_error!( - element, - gst::StreamError::Format, - [ - "Only Time segments supported, got {:?}", - state.in_segment.get_format() - ] - ); - return gst::FlowReturn::Error; - } - if state.eos { return gst::FlowReturn::Eos; } @@ -856,10 +816,8 @@ impl ToggleRecord { // recording_duration state.out_segment = state.in_segment.clone(); - let offset: u64 = rec_state.running_time_offset.into(); - let res = state - .out_segment - .offset_running_time(gst::Format::Time, -(offset as i64)); + let offset = rec_state.running_time_offset.unwrap_or(0); + let res = state.out_segment.offset_running_time(-(offset as i64)); assert!(res); events.push( gst::Event::new_segment(&state.out_segment) @@ -881,11 +839,7 @@ impl ToggleRecord { events.append(&mut state.pending_events); - let out_running_time = state - .out_segment - .to_running_time(buffer.get_pts()) - .try_to_time() - .unwrap(); + let out_running_time = state.out_segment.to_running_time(buffer.get_pts()); // Unlock before pushing drop(state); @@ -950,18 +904,21 @@ impl ToggleRecord { EventView::Segment(e) => { let mut state = stream.state.lock().unwrap(); - let segment = e.get_segment(); - if segment.get_format() != gst::Format::Time { - gst_element_error!( - element, - gst::StreamError::Format, - [ - "Only Time segments supported, got {:?}", - segment.get_format() - ] - ); - return false; - } + let segment = match e.get_segment().downcast::() { + Err(segment) => { + gst_element_error!( + element, + gst::StreamError::Format, + [ + "Only Time segments supported, got {:?}", + segment.get_format() + ] + ); + return false; + } + Ok(segment) => segment, + }; + if (segment.get_rate() - 1.0).abs() > f64::EPSILON { gst_element_error!( element, @@ -974,7 +931,7 @@ impl ToggleRecord { return false; } - state.in_segment = e.get_segment(); + state.in_segment = segment; state.segment_seqnum = event.get_seqnum(); state.segment_pending = true; state.current_running_time = gst::CLOCK_TIME_NONE; @@ -1165,8 +1122,8 @@ impl ToggleRecord { let format = q.get_format(); q.set( false, - gst::FormatValue::new(format, -1), - gst::FormatValue::new(format, -1), + gst::GenericFormattedValue::new(format, -1), + gst::GenericFormattedValue::new(format, -1), ); gst_log!(self.cat, obj: pad, "Returning {:?}", q.get_mut_query()); diff --git a/gst-plugin-togglerecord/tests/tests.rs b/gst-plugin-togglerecord/tests/tests.rs index ad90e3b6..b9a21754 100644 --- a/gst-plugin-togglerecord/tests/tests.rs +++ b/gst-plugin-togglerecord/tests/tests.rs @@ -132,8 +132,7 @@ fn setup_sender_receiver( while let Ok(send_data) = receiver_input.recv() { if first { assert!(sinkpad.send_event(gst::Event::new_stream_start("test").build())); - let mut segment = gst::Segment::new(); - segment.init(gst::Format::Time); + let segment = gst::FormattedSegment::::new(); assert!(sinkpad.send_event(gst::Event::new_segment(&segment).build())); let mut tags = gst::TagList::new(); @@ -195,7 +194,7 @@ fn setup_sender_receiver( fn recv_buffers( receiver_output: &mpsc::Receiver>, - segment: &mut gst::Segment, + segment: &mut gst::FormattedSegment, wait_buffers: usize, ) -> Vec<(gst::ClockTime, gst::ClockTime)> { let mut res = Vec::new(); @@ -204,10 +203,7 @@ fn recv_buffers( match val { Left(buffer) => { res.push(( - segment - .to_running_time(buffer.get_pts()) - .try_to_time() - .unwrap(), + segment.to_running_time(buffer.get_pts()), buffer.get_pts(), )); n_buffers += 1; @@ -222,10 +218,7 @@ fn recv_buffers( EventView::Gap(ref e) => { let (ts, _) = e.get(); - res.push(( - segment.to_running_time(ts).try_to_time().unwrap(), - ts.into(), - )); + res.push((segment.to_running_time(ts), ts.into())); n_buffers += 1; if wait_buffers > 0 && n_buffers == wait_buffers { return res; @@ -235,7 +228,7 @@ fn recv_buffers( return res; } EventView::Segment(ref e) => { - *segment = e.get_segment(); + *segment = e.get_segment().downcast().unwrap(); } _ => (), } @@ -288,7 +281,7 @@ fn test_one_stream_open() { sender_input.send(SendData::Buffers(10)).unwrap(); drop(sender_input); - let mut segment = gst::Segment::new(); + let mut segment = gst::FormattedSegment::::new(); let buffers = recv_buffers(&receiver_output, &mut segment, 0); assert_eq!(buffers.len(), 10); for (index, &(running_time, pts)) in buffers.iter().enumerate() { @@ -323,7 +316,7 @@ fn test_one_stream_gaps_open() { sender_input.send(SendData::Gaps(5)).unwrap(); drop(sender_input); - let mut segment = gst::Segment::new(); + let mut segment = gst::FormattedSegment::::new(); let buffers = recv_buffers(&receiver_output, &mut segment, 0); assert_eq!(buffers.len(), 10); for (index, &(running_time, pts)) in buffers.iter().enumerate() { @@ -359,7 +352,7 @@ fn test_one_stream_close_open() { sender_input.send(SendData::Buffers(10)).unwrap(); drop(sender_input); - let mut segment = gst::Segment::new(); + let mut segment = gst::FormattedSegment::::new(); let buffers = recv_buffers(&receiver_output, &mut segment, 0); assert_eq!(buffers.len(), 10); for (index, &(running_time, pts)) in buffers.iter().enumerate() { @@ -396,7 +389,7 @@ fn test_one_stream_open_close() { sender_input.send(SendData::Buffers(10)).unwrap(); drop(sender_input); - let mut segment = gst::Segment::new(); + let mut segment = gst::FormattedSegment::::new(); let buffers = recv_buffers(&receiver_output, &mut segment, 0); assert_eq!(buffers.len(), 10); for (index, &(running_time, pts)) in buffers.iter().enumerate() { @@ -436,7 +429,7 @@ fn test_one_stream_open_close_open() { sender_input.send(SendData::Buffers(10)).unwrap(); drop(sender_input); - let mut segment = gst::Segment::new(); + let mut segment = gst::FormattedSegment::::new(); let buffers = recv_buffers(&receiver_output, &mut segment, 0); assert_eq!(buffers.len(), 20); for (index, &(running_time, pts)) in buffers.iter().enumerate() { @@ -485,7 +478,7 @@ fn test_two_stream_open() { receiver_input_done_2.recv().unwrap(); receiver_input_done_2.recv().unwrap(); - let mut segment_1 = gst::Segment::new(); + let mut segment_1 = gst::FormattedSegment::::new(); let buffers_1 = recv_buffers(&receiver_output_1, &mut segment_1, 0); for (index, &(running_time, pts)) in buffers_1.iter().enumerate() { let index = index as u64; @@ -495,7 +488,7 @@ fn test_two_stream_open() { assert_eq!(buffers_1.len(), 10); // Last buffer should be dropped from second stream - let mut segment_2 = gst::Segment::new(); + let mut segment_2 = gst::FormattedSegment::::new(); let buffers_2 = recv_buffers(&receiver_output_2, &mut segment_2, 0); for (index, &(running_time, pts)) in buffers_2.iter().enumerate() { let index = index as u64; @@ -539,7 +532,7 @@ fn test_two_stream_open_shift() { receiver_input_done_2.recv().unwrap(); receiver_input_done_2.recv().unwrap(); - let mut segment_1 = gst::Segment::new(); + let mut segment_1 = gst::FormattedSegment::::new(); let buffers_1 = recv_buffers(&receiver_output_1, &mut segment_1, 0); for (index, &(running_time, pts)) in buffers_1.iter().enumerate() { let index = index as u64; @@ -549,7 +542,7 @@ fn test_two_stream_open_shift() { assert_eq!(buffers_1.len(), 10); // Last buffer should be dropped from second stream - let mut segment_2 = gst::Segment::new(); + let mut segment_2 = gst::FormattedSegment::::new(); let buffers_2 = recv_buffers(&receiver_output_2, &mut segment_2, 0); for (index, &(running_time, pts)) in buffers_2.iter().enumerate() { let index = index as u64; @@ -594,7 +587,7 @@ fn test_two_stream_open_shift_main() { receiver_input_done_2.recv().unwrap(); // PTS 5 maps to running time 0 now - let mut segment_1 = gst::Segment::new(); + let mut segment_1 = gst::FormattedSegment::::new(); let buffers_1 = recv_buffers(&receiver_output_1, &mut segment_1, 0); for (index, &(running_time, pts)) in buffers_1.iter().enumerate() { let index = index as u64; @@ -604,7 +597,7 @@ fn test_two_stream_open_shift_main() { assert_eq!(buffers_1.len(), 10); // First and last buffer should be dropped from second stream - let mut segment_2 = gst::Segment::new(); + let mut segment_2 = gst::FormattedSegment::::new(); let buffers_2 = recv_buffers(&receiver_output_2, &mut segment_2, 0); for (index, &(running_time, pts)) in buffers_2.iter().enumerate() { let index = index as u64; @@ -664,7 +657,7 @@ fn test_two_stream_open_close() { receiver_input_done_1.recv().unwrap(); receiver_input_done_2.recv().unwrap(); - let mut segment_1 = gst::Segment::new(); + let mut segment_1 = gst::FormattedSegment::::new(); let buffers_1 = recv_buffers(&receiver_output_1, &mut segment_1, 0); for (index, &(running_time, pts)) in buffers_1.iter().enumerate() { let index = index as u64; @@ -674,7 +667,7 @@ fn test_two_stream_open_close() { assert_eq!(buffers_1.len(), 10); // Last buffer should be dropped from second stream - let mut segment_2 = gst::Segment::new(); + let mut segment_2 = gst::FormattedSegment::::new(); let buffers_2 = recv_buffers(&receiver_output_2, &mut segment_2, 0); for (index, &(running_time, pts)) in buffers_2.iter().enumerate() { let index = index as u64; @@ -734,7 +727,7 @@ fn test_two_stream_close_open() { receiver_input_done_1.recv().unwrap(); receiver_input_done_2.recv().unwrap(); - let mut segment_1 = gst::Segment::new(); + let mut segment_1 = gst::FormattedSegment::::new(); let buffers_1 = recv_buffers(&receiver_output_1, &mut segment_1, 0); for (index, &(running_time, pts)) in buffers_1.iter().enumerate() { let index = index as u64; @@ -744,7 +737,7 @@ fn test_two_stream_close_open() { assert_eq!(buffers_1.len(), 10); // Last buffer should be dropped from second stream - let mut segment_2 = gst::Segment::new(); + let mut segment_2 = gst::FormattedSegment::::new(); let buffers_2 = recv_buffers(&receiver_output_2, &mut segment_2, 0); for (index, &(running_time, pts)) in buffers_2.iter().enumerate() { let index = index as u64; @@ -817,7 +810,7 @@ fn test_two_stream_open_close_open() { receiver_input_done_2.recv().unwrap(); receiver_input_done_2.recv().unwrap(); - let mut segment_1 = gst::Segment::new(); + let mut segment_1 = gst::FormattedSegment::::new(); let buffers_1 = recv_buffers(&receiver_output_1, &mut segment_1, 0); for (index, &(running_time, pts)) in buffers_1.iter().enumerate() { let pts_off = if index >= 10 { @@ -833,7 +826,7 @@ fn test_two_stream_open_close_open() { assert_eq!(buffers_1.len(), 20); // Last buffer should be dropped from second stream - let mut segment_2 = gst::Segment::new(); + let mut segment_2 = gst::FormattedSegment::::new(); let buffers_2 = recv_buffers(&receiver_output_2, &mut segment_2, 0); for (index, &(running_time, pts)) in buffers_2.iter().enumerate() { let pts_off = if index >= 10 { @@ -918,7 +911,7 @@ fn test_two_stream_open_close_open_gaps() { receiver_input_done_2.recv().unwrap(); receiver_input_done_2.recv().unwrap(); - let mut segment_1 = gst::Segment::new(); + let mut segment_1 = gst::FormattedSegment::::new(); let buffers_1 = recv_buffers(&receiver_output_1, &mut segment_1, 0); for (index, &(running_time, pts)) in buffers_1.iter().enumerate() { let pts_off = if index >= 10 { @@ -934,7 +927,7 @@ fn test_two_stream_open_close_open_gaps() { assert_eq!(buffers_1.len(), 20); // Last buffer should be dropped from second stream - let mut segment_2 = gst::Segment::new(); + let mut segment_2 = gst::FormattedSegment::::new(); let buffers_2 = recv_buffers(&receiver_output_2, &mut segment_2, 0); for (index, &(running_time, pts)) in buffers_2.iter().enumerate() { let pts_off = if index >= 10 { @@ -1020,7 +1013,7 @@ fn test_two_stream_close_open_close_delta() { receiver_input_done_2.recv().unwrap(); receiver_input_done_2.recv().unwrap(); - let mut segment_1 = gst::Segment::new(); + let mut segment_1 = gst::FormattedSegment::::new(); let buffers_1 = recv_buffers(&receiver_output_1, &mut segment_1, 0); for (index, &(running_time, pts)) in buffers_1.iter().enumerate() { let index = index as u64; @@ -1030,7 +1023,7 @@ fn test_two_stream_close_open_close_delta() { assert_eq!(buffers_1.len(), 10); // Last buffer should be dropped from second stream - let mut segment_2 = gst::Segment::new(); + let mut segment_2 = gst::FormattedSegment::::new(); let buffers_2 = recv_buffers(&receiver_output_2, &mut segment_2, 0); for (index, &(running_time, pts)) in buffers_2.iter().enumerate() { let index = index as u64; @@ -1117,7 +1110,7 @@ fn test_three_stream_open_close_open() { receiver_input_done_2.recv().unwrap(); receiver_input_done_3.recv().unwrap(); - let mut segment_1 = gst::Segment::new(); + let mut segment_1 = gst::FormattedSegment::::new(); let buffers_1 = recv_buffers(&receiver_output_1, &mut segment_1, 0); for (index, &(running_time, pts)) in buffers_1.iter().enumerate() { let pts_off = if index >= 10 { @@ -1133,7 +1126,7 @@ fn test_three_stream_open_close_open() { assert_eq!(buffers_1.len(), 20); // Last buffer should be dropped from second stream - let mut segment_2 = gst::Segment::new(); + let mut segment_2 = gst::FormattedSegment::::new(); let buffers_2 = recv_buffers(&receiver_output_2, &mut segment_2, 0); for (index, &(running_time, pts)) in buffers_2.iter().enumerate() { let pts_off = if index >= 10 { @@ -1148,7 +1141,7 @@ fn test_three_stream_open_close_open() { } assert_eq!(buffers_2.len(), 20); - let mut segment_3 = gst::Segment::new(); + let mut segment_3 = gst::FormattedSegment::::new(); let buffers_3 = recv_buffers(&receiver_output_3, &mut segment_3, 0); for (index, &(running_time, pts)) in buffers_3.iter().enumerate() { let pts_off = if index >= 10 {