mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-26 11:41:09 +00:00
basesink: handle -1 step amounts
Define a 0 and -1 step amount. They used to almost do the same thing but now, 0 cancels/stops the current step and -1 keeps on stepping until the end of the segment. See https://bugzilla.gnome.org/show_bug.cgi?id=679378
This commit is contained in:
parent
8e946d5d16
commit
5360ba56f7
3 changed files with 27 additions and 11 deletions
|
@ -101,8 +101,10 @@ The step event is created with the following fields in the structure:
|
|||
The format of the step units
|
||||
|
||||
"amount", G_TYPE_UINT64
|
||||
The amount of units to step. -1 resumes normal non-stepping behaviour to
|
||||
the end of the segment.
|
||||
The amount of units to step. A 0 amount immediately completes and can be
|
||||
used to cancel the current step and resume normal non-stepping behaviour
|
||||
to the end of the segment.
|
||||
A -1 amount steps until the end of the segment.
|
||||
|
||||
"rate", G_TYPE_DOUBLE
|
||||
The rate at which the frames should be stepped in PLAYING mode. 1.0 is
|
||||
|
|
|
@ -440,8 +440,7 @@ gst_segment_to_stream_time (const GstSegment * segment, GstFormat format,
|
|||
* @position: the position in the segment
|
||||
*
|
||||
* Translate @position to the total running time using the currently configured
|
||||
* and previously accumulated segments. Position is a value between @segment
|
||||
* start and stop time.
|
||||
* segment. Position is a value between @segment start and stop time.
|
||||
*
|
||||
* This function is typically used by elements that need to synchronize to the
|
||||
* global clock in a pipeline. The runnning time is a constantly increasing value
|
||||
|
|
|
@ -1496,16 +1496,30 @@ start_stepping (GstBaseSink * sink, GstSegment * segment,
|
|||
current->start_start = segment->start;
|
||||
|
||||
if (current->format == GST_FORMAT_TIME) {
|
||||
end = current->start + current->amount;
|
||||
/* calculate the running-time when the step operation should stop */
|
||||
if (current->amount != -1)
|
||||
end = current->start + current->amount;
|
||||
else
|
||||
end = -1;
|
||||
|
||||
if (!current->flush) {
|
||||
gint64 position;
|
||||
|
||||
/* update the segment clipping regions for non-flushing seeks */
|
||||
if (segment->rate > 0.0) {
|
||||
segment->stop = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
|
||||
segment->position = segment->stop;
|
||||
} else {
|
||||
gint64 position;
|
||||
if (end != -1)
|
||||
position = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
|
||||
else
|
||||
position = segment->stop;
|
||||
|
||||
segment->stop = position;
|
||||
segment->position = position;
|
||||
} else {
|
||||
if (end != -1)
|
||||
position = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
|
||||
else
|
||||
position = segment->start;
|
||||
|
||||
position = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
|
||||
segment->time = position;
|
||||
segment->start = position;
|
||||
segment->position = position;
|
||||
|
@ -1590,8 +1604,9 @@ handle_stepping (GstBaseSink * sink, GstSegment * segment,
|
|||
{
|
||||
gboolean step_end = FALSE;
|
||||
|
||||
/* stepping never stops */
|
||||
if (current->amount == -1)
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
|
||||
/* see if we need to skip this buffer because of stepping */
|
||||
switch (current->format) {
|
||||
|
|
Loading…
Reference in a new issue