mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-08 18:39:54 +00:00
pad-monitor: Update checks for MISSING_DISCONT
* Some SEGMENT might be updates caused by calling gst_pad_set_offset(), which will send the same segment but with an updated offset and/or based field. For those segments, we don't require a DISCONT on the following buffer. * Ignore differences in flags, they aren't relevant for now to figure out whether the segment is an update or not * Ignore difference in 'position', it's only meant for internal usage by elements. * Changes in the end position (stop in forward playback and start in reverse playback) are considering updates Furthermore, also expect a DISCONT flag on the first buffer following a STREAM_START.
This commit is contained in:
parent
0711d4e163
commit
843578835f
1 changed files with 33 additions and 2 deletions
|
@ -1703,6 +1703,31 @@ gst_validate_monitor_find_next_buffer (GstValidatePadMonitor * pad_monitor)
|
|||
pad_monitor->current_buf = tmp;
|
||||
}
|
||||
|
||||
/* Checks whether a segment is just an update of another,
|
||||
* That is to say that only the base and offset field differ and all
|
||||
* other fields are identical */
|
||||
static gboolean
|
||||
is_segment_update (GstSegment * a, const GstSegment * b)
|
||||
{
|
||||
/* Note : We never care about the position field, it is only
|
||||
* used for internal usage by elements */
|
||||
if (a->rate == b->rate &&
|
||||
a->applied_rate == b->applied_rate &&
|
||||
a->format == b->format && a->time == b->time) {
|
||||
/* Changes in base/offset are considered updates */
|
||||
/* Updating the end position of a segment is an update */
|
||||
/* Updating the duration of a segment is an update */
|
||||
if (a->rate > 0.0) {
|
||||
if (a->start == b->start)
|
||||
return TRUE;
|
||||
} else {
|
||||
if (a->stop == b->stop)
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static GstFlowReturn
|
||||
gst_validate_pad_monitor_downstream_event_check (GstValidatePadMonitor *
|
||||
pad_monitor, GstObject * parent, GstEvent * event,
|
||||
|
@ -1717,6 +1742,10 @@ gst_validate_pad_monitor_downstream_event_check (GstValidatePadMonitor *
|
|||
|
||||
/* pre checks */
|
||||
switch (GST_EVENT_TYPE (event)) {
|
||||
case GST_EVENT_STREAM_START:
|
||||
/* Buffers following a STREAM_START should have the DISCONT flag set */
|
||||
pad_monitor->pending_buffer_discont = TRUE;
|
||||
break;
|
||||
case GST_EVENT_SEGMENT:
|
||||
/* parse segment data to be used if event is handled */
|
||||
gst_event_parse_segment (event, &segment);
|
||||
|
@ -1744,8 +1773,6 @@ gst_validate_pad_monitor_downstream_event_check (GstValidatePadMonitor *
|
|||
}
|
||||
|
||||
pad_monitor->pending_eos_seqnum = seqnum;
|
||||
/* Buffers following a SEGMENT should have the DISCONT flag set */
|
||||
pad_monitor->pending_buffer_discont = TRUE;
|
||||
|
||||
if (GST_PAD_DIRECTION (pad) == GST_PAD_SINK) {
|
||||
gst_validate_pad_monitor_add_expected_newsegment (pad_monitor, event);
|
||||
|
@ -1839,6 +1866,10 @@ gst_validate_pad_monitor_downstream_event_check (GstValidatePadMonitor *
|
|||
switch (GST_EVENT_TYPE (event)) {
|
||||
case GST_EVENT_SEGMENT:
|
||||
if (ret == GST_FLOW_OK) {
|
||||
/* If the new segment is not an update of the previous one, then
|
||||
* the following buffer should have the DISCONT flag set */
|
||||
if (!is_segment_update (&pad_monitor->segment, segment))
|
||||
pad_monitor->pending_buffer_discont = TRUE;
|
||||
if (!pad_monitor->has_segment
|
||||
&& pad_monitor->segment.format != segment->format) {
|
||||
gst_segment_init (&pad_monitor->segment, segment->format);
|
||||
|
|
Loading…
Reference in a new issue