diff options
author | Wim Taymans <wim.taymans@collabora.co.uk> | 2013-03-31 12:55:33 +0200 |
---|---|---|
committer | Wim Taymans <wim.taymans@collabora.co.uk> | 2013-03-31 12:57:35 +0200 |
commit | 34eea4d5f27f430b475bd04de5ed90bee9fceb68 (patch) | |
tree | a39da7a20a3ee624b6d950c9f3d4e72f6ed5dad9 | |
parent | b3d94bd0e4ce735c3529a20068689a1113a85639 (diff) |
streamsynchronizer: update position for reverse
When doing reverse playback the positino advances from timestamp_end to
timestamp.
-rw-r--r-- | gst/playback/gststreamsynchronizer.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/gst/playback/gststreamsynchronizer.c b/gst/playback/gststreamsynchronizer.c index 0f1c98260..442963b9b 100644 --- a/gst/playback/gststreamsynchronizer.c +++ b/gst/playback/gststreamsynchronizer.c @@ -502,6 +502,7 @@ gst_stream_synchronizer_sink_chain (GstPad * pad, GstObject * parent, GstPad *opad; GstFlowReturn ret = GST_FLOW_ERROR; GstStream *stream; + GstClockTime duration = GST_CLOCK_TIME_NONE; GstClockTime timestamp = GST_CLOCK_TIME_NONE; GstClockTime timestamp_end = GST_CLOCK_TIME_NONE; @@ -514,9 +515,10 @@ gst_stream_synchronizer_sink_chain (GstPad * pad, GstObject * parent, GST_BUFFER_OFFSET (buffer), GST_BUFFER_OFFSET_END (buffer)); timestamp = GST_BUFFER_TIMESTAMP (buffer); - if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) - && GST_BUFFER_DURATION_IS_VALID (buffer)) - timestamp_end = timestamp + GST_BUFFER_DURATION (buffer); + duration = GST_BUFFER_DURATION (buffer); + if (GST_CLOCK_TIME_IS_VALID (timestamp) + && GST_CLOCK_TIME_IS_VALID (duration)) + timestamp_end = timestamp + duration; GST_STREAM_SYNCHRONIZER_LOCK (self); stream = gst_pad_get_element_private (pad); @@ -537,7 +539,10 @@ gst_stream_synchronizer_sink_chain (GstPad * pad, GstObject * parent, GST_LOG_OBJECT (pad, "Updating position from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT, GST_TIME_ARGS (stream->segment.position), GST_TIME_ARGS (timestamp)); - stream->segment.position = timestamp; + if (stream->segment.rate > 0.0) + stream->segment.position = timestamp; + else + stream->segment.position = timestamp_end; } } GST_STREAM_SYNCHRONIZER_UNLOCK (self); @@ -554,13 +559,20 @@ gst_stream_synchronizer_sink_chain (GstPad * pad, GstObject * parent, GST_STREAM_SYNCHRONIZER_LOCK (self); stream = gst_pad_get_element_private (pad); - if (stream && stream->segment.format == GST_FORMAT_TIME - && GST_CLOCK_TIME_IS_VALID (timestamp_end)) { - GST_LOG_OBJECT (pad, - "Updating position from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT, - GST_TIME_ARGS (stream->segment.position), - GST_TIME_ARGS (timestamp_end)); - stream->segment.position = timestamp_end; + if (stream && stream->segment.format == GST_FORMAT_TIME) { + GstClockTime position; + + if (stream->segment.rate > 0.0) + position = timestamp_end; + else + position = timestamp; + + if (GST_CLOCK_TIME_IS_VALID (position)) { + GST_LOG_OBJECT (pad, + "Updating position from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT, + GST_TIME_ARGS (stream->segment.position), GST_TIME_ARGS (position)); + stream->segment.position = position; + } } /* Advance EOS streams if necessary. For non-EOS |