From 44b94295161c2433b7f45ac882bc6c85b4c518de Mon Sep 17 00:00:00 2001 From: Todd Agulnick Date: Sat, 14 Dec 2013 18:12:53 -0500 Subject: [PATCH] decklinksrc: Process EOS even when there are no incoming video frames. https://bugzilla.gnome.org/show_bug.cgi?id=680700 --- sys/decklink/gstdecklinksrc.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/sys/decklink/gstdecklinksrc.cpp b/sys/decklink/gstdecklinksrc.cpp index 6e9e6404aa..7c2683afb6 100644 --- a/sys/decklink/gstdecklinksrc.cpp +++ b/sys/decklink/gstdecklinksrc.cpp @@ -362,6 +362,7 @@ gst_decklink_src_send_event (GstElement * element, GstEvent * event) case GST_EVENT_EOS: g_atomic_int_set (&src->pending_eos, TRUE); GST_INFO_OBJECT (src, "EOS pending"); + g_cond_signal (&src->cond); result = TRUE; break; break; @@ -745,7 +746,8 @@ gst_decklink_src_task (void *priv) GST_DEBUG_OBJECT (decklinksrc, "task"); g_mutex_lock (&decklinksrc->mutex); - while (decklinksrc->video_frame == NULL && !decklinksrc->stop) { + while (decklinksrc->video_frame == NULL && !decklinksrc->stop && + !decklinksrc->pending_eos) { g_cond_wait (&decklinksrc->cond, &decklinksrc->mutex); } video_frame = decklinksrc->video_frame; @@ -763,6 +765,13 @@ gst_decklink_src_task (void *priv) return; } + if (g_atomic_int_compare_and_exchange (&decklinksrc->pending_eos, TRUE, + FALSE)) { + GST_INFO_OBJECT (decklinksrc, "EOS pending"); + flow = GST_FLOW_EOS; + goto pause; + } + /* warning on dropped frames */ /* FIXME: post QoS message */ if (decklinksrc->dropped_frames - decklinksrc->dropped_frames_old > 0) { @@ -887,12 +896,6 @@ gst_decklink_src_task (void *priv) else flow = video_flow; - if (g_atomic_int_compare_and_exchange (&decklinksrc->pending_eos, TRUE, - FALSE)) { - GST_INFO_OBJECT (decklinksrc, "EOS pending"); - flow = GST_FLOW_EOS; - } - if (flow != GST_FLOW_OK) goto pause;