diff --git a/sys/v4l2/gstv4l2bufferpool.c b/sys/v4l2/gstv4l2bufferpool.c index c3c9be7ff5..d7fa9fa2e3 100644 --- a/sys/v4l2/gstv4l2bufferpool.c +++ b/sys/v4l2/gstv4l2bufferpool.c @@ -932,6 +932,22 @@ cannot_import: } } +static gboolean +gst_v4l2_buffer_pool_vallocator_stop (GstV4l2BufferPool * pool) +{ + GstV4l2Return vret; + + if (!pool->vallocator) + return TRUE; + + vret = gst_v4l2_allocator_stop (pool->vallocator); + + if (vret == GST_V4L2_BUSY) + GST_WARNING_OBJECT (pool, "some buffers are still outstanding"); + + return (vret == GST_V4L2_OK); +} + static gboolean gst_v4l2_buffer_pool_stop (GstBufferPool * bpool) { @@ -939,7 +955,7 @@ gst_v4l2_buffer_pool_stop (GstBufferPool * bpool) gboolean ret; if (pool->orphaned) - return TRUE; + return gst_v4l2_buffer_pool_vallocator_stop (pool); GST_DEBUG_OBJECT (pool, "stopping pool"); @@ -959,16 +975,8 @@ gst_v4l2_buffer_pool_stop (GstBufferPool * bpool) ret = GST_BUFFER_POOL_CLASS (parent_class)->stop (bpool); - if (ret && pool->vallocator) { - GstV4l2Return vret; - - vret = gst_v4l2_allocator_stop (pool->vallocator); - - if (vret == GST_V4L2_BUSY) - GST_WARNING_OBJECT (pool, "some buffers are still outstanding"); - - ret = (vret == GST_V4L2_OK); - } + if (ret) + ret = gst_v4l2_buffer_pool_vallocator_stop (pool); return ret; } @@ -1452,6 +1460,14 @@ gst_v4l2_buffer_pool_release_buffer (GstBufferPool * bpool, GstBuffer * buffer) GST_DEBUG_OBJECT (pool, "release buffer %p", buffer); + /* If the buffer's pool has been orphaned, dispose of it so that + * the pool resources can be freed */ + if (pool->orphaned) { + GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_TAG_MEMORY); + pclass->release_buffer (bpool, buffer); + return; + } + switch (obj->type) { case V4L2_BUF_TYPE_VIDEO_CAPTURE: case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: