From 9e585ffd4653b75ddf35f23fbf9295d40882e86f Mon Sep 17 00:00:00 2001 From: "Joshua M. Doe" Date: Wed, 15 Jan 2014 15:53:26 -0500 Subject: [PATCH] framelinksrc: don't push out an old buffer and report dropped frames --- sys/imperx/gstframelinksrc.c | 20 ++++++++++++++++++-- sys/imperx/gstframelinksrc.h | 1 + 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/sys/imperx/gstframelinksrc.c b/sys/imperx/gstframelinksrc.c index dc2931c..b0e8dd6 100644 --- a/sys/imperx/gstframelinksrc.c +++ b/sys/imperx/gstframelinksrc.c @@ -565,6 +565,7 @@ gst_framelinksrc_create (GstPushSrc * psrc, GstBuffer ** buf) GstFramelinkSrc *src = GST_FRAMELINK_SRC (psrc); VCECLB_Error err; VCECLB_FrameInfoEx pFrameInfo; + gboolean got_new_buffer = FALSE; /* Start acquisition if not already started */ if (!src->acq_started) { @@ -598,14 +599,29 @@ gst_framelinksrc_create (GstPushSrc * psrc, GstBuffer ** buf) } g_mutex_unlock (&src->mutex); #else - pFrameInfo.lpRawBuffer = NULL; - while (pFrameInfo.lpRawBuffer == NULL) { + while (!got_new_buffer) { + guint dropped_frames; err = VCECLB_GetLastBufferData (src->grabber, src->channel, &pFrameInfo); if (err != VCECLB_Err_Success) { GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("Failed to get last buffer (code %d)", err), (NULL)); return GST_FLOW_ERROR; } + + if (pFrameInfo.lpRawBuffer == NULL + || pFrameInfo.number == src->last_buffer_number) + continue; + + got_new_buffer = TRUE; + + dropped_frames = pFrameInfo.number - src->last_buffer_number - 1; + if (dropped_frames > 0) { + src->dropped_frame_count += dropped_frames; + GST_WARNING_OBJECT (src, "Dropped %d frames (%d total)", dropped_frames, + src->dropped_frame_count); + } + src->last_buffer_number = pFrameInfo.number; + } /* TODO: check for missed frames by comparing pFrameInfo.number */ diff --git a/sys/imperx/gstframelinksrc.h b/sys/imperx/gstframelinksrc.h index ad32b4d..321e1a3 100644 --- a/sys/imperx/gstframelinksrc.h +++ b/sys/imperx/gstframelinksrc.h @@ -40,6 +40,7 @@ struct _GstFramelinkSrc { GstPushSrc base_framelinksrc; + guint last_buffer_number; gint dropped_frame_count; gboolean acq_started;