diff options
Diffstat (limited to 'sys/v4l2/gstv4l2sink.c')
-rw-r--r-- | sys/v4l2/gstv4l2sink.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/sys/v4l2/gstv4l2sink.c b/sys/v4l2/gstv4l2sink.c index 42b4260d..b0dff5e6 100644 --- a/sys/v4l2/gstv4l2sink.c +++ b/sys/v4l2/gstv4l2sink.c @@ -641,18 +641,17 @@ gst_v4l2sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, } } - v4l2buf = gst_v4l2_buffer_pool_get (v4l2sink->pool, TRUE); + v4l2buf = gst_v4l2_buffer_pool_get (v4l2sink->pool); - GST_DEBUG_OBJECT (v4l2sink, "allocated buffer: %p\n", v4l2buf); - - if (G_UNLIKELY (!v4l2buf)) { + if (G_LIKELY (v4l2buf)) { + GST_DEBUG_OBJECT (v4l2sink, "allocated buffer: %p", v4l2buf); + *buf = GST_BUFFER (v4l2buf); + return GST_FLOW_OK; + } else { + GST_DEBUG_OBJECT (v4l2sink, "failed to allocate buffer"); return GST_FLOW_ERROR; } - *buf = GST_BUFFER (v4l2buf); - - return GST_FLOW_OK; - } else { GST_ERROR_OBJECT (v4l2sink, "only supporting streaming mode for now..."); return GST_FLOW_ERROR; @@ -666,7 +665,7 @@ gst_v4l2sink_show_frame (GstBaseSink * bsink, GstBuffer * buf) GstV4l2Sink *v4l2sink = GST_V4L2SINK (bsink); GstBuffer *newbuf = NULL; - GST_DEBUG_OBJECT (v4l2sink, "render buffer: %p\n", buf); + GST_DEBUG_OBJECT (v4l2sink, "render buffer: %p", buf); if (!GST_IS_V4L2_BUFFER (buf)) { GstFlowReturn ret; @@ -686,7 +685,7 @@ gst_v4l2sink_show_frame (GstBaseSink * bsink, GstBuffer * buf) GST_BUFFER_DATA (buf), MIN (GST_BUFFER_SIZE (newbuf), GST_BUFFER_SIZE (buf))); - GST_DEBUG_OBJECT (v4l2sink, "render copied buffer: %p\n", newbuf); + GST_DEBUG_OBJECT (v4l2sink, "render copied buffer: %p", newbuf); buf = newbuf; } @@ -707,5 +706,22 @@ gst_v4l2sink_show_frame (GstBaseSink * bsink, GstBuffer * buf) gst_buffer_ref (buf); } + /* if the driver has more than one buffer, ie. more than just the one we + * just queued, then dequeue one immediately to make it available via + * _buffer_alloc(): + */ + if (gst_v4l2_buffer_pool_available_buffers (v4l2sink->pool) > 1) { + GstV4l2Buffer *v4l2buf = gst_v4l2_buffer_pool_dqbuf (v4l2sink->pool); + + /* note: if we get a buf, we don't want to use it directly (because + * someone else could still hold a ref).. but instead we release our + * reference to it, and if no one else holds a ref it will be returned + * to the pool of available buffers.. and if not, we keep looping. + */ + if (v4l2buf) { + gst_buffer_unref (GST_BUFFER (v4l2buf)); + } + } + return GST_FLOW_OK; } |