summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gst/liveadder/liveadder.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/gst/liveadder/liveadder.c b/gst/liveadder/liveadder.c
index dd6ffe7c..637dbaeb 100644
--- a/gst/liveadder/liveadder.c
+++ b/gst/liveadder/liveadder.c
@@ -897,11 +897,16 @@ gst_live_live_adder_chain (GstPad *pad, GstBuffer *buffer)
GstFlowReturn ret = GST_FLOW_OK;
GList *item = NULL;
GstClockTime skip = 0;
+ gint64 drift = 0; /* Positive if new buffer after old buffer */
GST_OBJECT_LOCK (adder);
ret = adder->srcresult;
+ GST_DEBUG ("Incoming buffer time:%"GST_TIME_FORMAT" duration:%"GST_TIME_FORMAT,
+ GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)),
+ GST_TIME_ARGS(GST_BUFFER_DURATION(buffer)));
+
if (ret != GST_FLOW_OK)
{
GST_DEBUG_OBJECT (adder, "Passing non-ok result from src: %s",
@@ -942,17 +947,28 @@ gst_live_live_adder_chain (GstPad *pad, GstBuffer *buffer)
if (padprivate->segment.format != GST_FORMAT_TIME)
goto invalid_segment;
+ buffer = gst_buffer_make_metadata_writable (buffer);
+
+ drift = GST_BUFFER_TIMESTAMP (buffer) - padprivate->expected_timestamp;
+
/* Just see if we receive invalid timestamp/durations */
if (GST_CLOCK_TIME_IS_VALID (padprivate->expected_timestamp) &&
!GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DISCONT) &&
- GST_BUFFER_TIMESTAMP(buffer) != padprivate->expected_timestamp)
+ (drift != 0)) {
GST_LOG_OBJECT (adder,
"Timestamp discontinuity without the DISCONT flag set"
- " (expected %" GST_TIME_FORMAT ", got %" GST_TIME_FORMAT")",
+ " (expected %" GST_TIME_FORMAT ", got %" GST_TIME_FORMAT" drift:%ldms)",
GST_TIME_ARGS (padprivate->expected_timestamp),
- GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)));
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
+ drift / GST_MSECOND);
+
+ /* We accept drifts of 10ms*/
+ if (ABS(drift) < (10 * GST_MSECOND)) {
+ GST_DEBUG ("Correcting minor drift");
+ GST_BUFFER_TIMESTAMP (buffer) = padprivate->expected_timestamp;
+ }
+ }
- buffer = gst_buffer_make_metadata_writable (buffer);
/* If there is no duration, lets set one */
if (!GST_BUFFER_DURATION_IS_VALID (buffer)) {
@@ -976,8 +992,10 @@ gst_live_live_adder_chain (GstPad *pad, GstBuffer *buffer)
adder->bps);
/* buffer can be NULL if it's completely outside of the segment */
- if (!buffer)
+ if (!buffer) {
+ GST_DEBUG ("Buffer completely outside of configured segment, dropping it");
goto out;
+ }
/*
* Make sure all incoming buffers share the same timestamping
@@ -1297,6 +1315,10 @@ gst_live_adder_loop (gpointer data)
if (newseg_event)
gst_pad_push_event (adder->srcpad, newseg_event);
+ GST_DEBUG ("About to push buffer time:%"GST_TIME_FORMAT" duration:%"GST_TIME_FORMAT,
+ GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)),
+ GST_TIME_ARGS(GST_BUFFER_DURATION(buffer)));
+
result = gst_pad_push (adder->srcpad, buffer);
if (result != GST_FLOW_OK)
goto pause;