update_time_level (queue);
}
+static void
+apply_gap (GstQueue * queue, GstEvent * event,
+ GstSegment * segment, gboolean is_sink)
+{
+ GstClockTime timestamp;
+ GstClockTime duration;
+
+ gst_event_parse_gap (event, ×tamp, &duration);
+
+ if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
+
+ if (GST_CLOCK_TIME_IS_VALID (duration)) {
+ timestamp += duration;
+ }
+
+ segment->position = timestamp;
+
+ if (is_sink)
+ queue->sink_tainted = TRUE;
+ else
+ queue->src_tainted = TRUE;
+
+ /* calc diff with other end */
+ update_time_level (queue);
+ }
+}
+
+
/* take a buffer and update segment, updating the time level of the queue. */
static void
apply_buffer (GstQueue * queue, GstBuffer * buffer, GstSegment * segment,
/* a new segment allows us to accept more buffers if we got EOS
* from downstream */
queue->unexpected = FALSE;
+ case GST_EVENT_GAP:
+ apply_gap (queue, event, &queue->sink_segment, TRUE);
break;
default:
break;
queue->newseg_applied_to_src = FALSE;
}
break;
+ case GST_EVENT_GAP:
+ apply_gap (queue, event, &queue->src_segment, FALSE);
+ break;
default:
break;
}