summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorDavid Schleef <ds@schleef.org>2012-03-17 11:41:04 -0700
committerDavid Schleef <ds@schleef.org>2012-03-17 14:24:51 -0700
commitc13e4eacc247b72721182abae4c9773dcb1896ec (patch)
treecc29b520ea393fc71c7c413001e3b7ec3b76ed00 /sys
parent83e2ca791c1747fade969b6ac286ae094cab6cba (diff)
downloadgstreamer-plugins-bad-c13e4eacc247b72721182abae4c9773dcb1896ec.tar.gz
decklinksrc: Implement latency query
Implement latency query. Fix memleak releasing resources.
Diffstat (limited to 'sys')
-rw-r--r--sys/decklink/gstdecklinksrc.cpp53
1 files changed, 49 insertions, 4 deletions
diff --git a/sys/decklink/gstdecklinksrc.cpp b/sys/decklink/gstdecklinksrc.cpp
index 7d33729a2..b2d67f05c 100644
--- a/sys/decklink/gstdecklinksrc.cpp
+++ b/sys/decklink/gstdecklinksrc.cpp
@@ -695,6 +695,9 @@ gst_decklink_src_stop (GstElement * element)
decklinksrc->input->Release ();
decklinksrc->input = NULL;
+ decklinksrc->decklink->Release ();
+ decklinksrc->decklink = NULL;
+
return TRUE;
}
@@ -782,8 +785,18 @@ gst_decklink_src_send_event (GstElement * element, GstEvent * event)
static gboolean
gst_decklink_src_query (GstElement * element, GstQuery * query)
{
+ GstDecklinkSrc *decklinksrc = GST_DECKLINK_SRC (element);
+ gboolean ret;
- return FALSE;
+ GST_DEBUG_OBJECT (decklinksrc, "query");
+
+ switch (GST_QUERY_TYPE (query)) {
+ default:
+ ret = GST_ELEMENT_CLASS (parent_class)->query (element, query);
+ break;
+ }
+
+ return ret;
}
static GstCaps *
@@ -1138,7 +1151,7 @@ gst_decklink_src_video_src_event (GstPad * pad, GstEvent * event)
static gboolean
gst_decklink_src_video_src_query (GstPad * pad, GstQuery * query)
{
- gboolean res;
+ gboolean ret;
GstDecklinkSrc *decklinksrc;
decklinksrc = GST_DECKLINK_SRC (gst_pad_get_parent (pad));
@@ -1146,13 +1159,45 @@ gst_decklink_src_video_src_query (GstPad * pad, GstQuery * query)
GST_DEBUG_OBJECT (decklinksrc, "query");
switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_LATENCY:{
+ GstClockTime min_latency, max_latency;
+ const GstDecklinkMode *mode;
+
+ /* device must be open */
+ if (decklinksrc->decklink == NULL) {
+ GST_WARNING_OBJECT (decklinksrc,
+ "Can't give latency since device isn't open !");
+ goto done;
+ }
+
+ mode = gst_decklink_get_mode (decklinksrc->mode);
+
+ /* min latency is the time to capture one frame */
+ min_latency =
+ gst_util_uint64_scale_int (GST_SECOND, mode->fps_d, mode->fps_n);
+
+ /* max latency is total duration of the frame buffer */
+ max_latency = 2 * min_latency;
+
+ GST_DEBUG_OBJECT (decklinksrc,
+ "report latency min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency));
+
+ /* we are always live, the min latency is 1 frame and the max latency is
+ * the complete buffer of frames. */
+ gst_query_set_latency (query, TRUE, min_latency, max_latency);
+
+ ret = TRUE;
+ break;
+ }
default:
- res = gst_pad_query_default (pad, query);
+ ret = gst_pad_query_default (pad, query);
break;
}
+done:
gst_object_unref (decklinksrc);
- return res;
+ return ret;
}
static GstIterator *