Hi,
The source code of nvarguscamerasrc is open source in
https://developer.nvidia.com/embedded/linux-tegra
L4T Driver Package (BSP) Sources
Please apply the patch, rebuild/replace libgstnvarguscamerasrc.so and try again:
@@ -519,6 +519,8 @@ bool StreamConsumer::threadExecute(GstNvArgusCameraSrc *src)
g_mutex_unlock (&src->argus_buffer_consumed_lock);
}
+ if (src->frameInfo->fd)
+ NvBufferDestroy(src->frameInfo->fd);
g_slice_free (NvArgusFrameInfo, src->frameInfo);
if (!src->argus_in_error)
{
@@ -1220,6 +1222,10 @@ static gboolean gst_nv_argus_camera_set_caps (GstBaseSrc *base, GstCaps *caps)
gst_caps_unref (old);
}
+ if (src->pool) {
+ gst_object_unref (src->pool);
+ src->pool = NULL;
+ }
if (src->bufApi == FALSE){
src->pool = gst_buffer_pool_new ();
GstNVArgusMemoryAllocator *allocator =
@@ -1235,6 +1241,7 @@ static gboolean gst_nv_argus_camera_set_caps (GstBaseSrc *base, GstCaps *caps)
src->nvmm_buffers = g_queue_new ();
gst_buffer_pool_set_active (src->pool, TRUE);
+ gst_object_unref (allocator);
}
else {
src->pool = gst_nvds_buffer_pool_new();
@@ -1292,6 +1299,7 @@ static gboolean gst_nv_argus_camera_unlock_stop (GstBaseSrc *src)
static gboolean gst_nv_argus_camera_stop (GstBaseSrc * src_base)
{
GstNvArgusCameraSrc *src = (GstNvArgusCameraSrc *) src_base;
+ GstBuffer *buf;
src->stop_requested = TRUE;
if(!src->timeout)
{
@@ -1306,8 +1314,21 @@ static gboolean gst_nv_argus_camera_stop (GstBaseSrc * src_base)
g_mutex_lock (&src->eos_lock);
g_cond_signal (&src->eos_cond);
g_mutex_unlock (&src->eos_lock);
- gst_buffer_pool_set_active (src->pool, false);
g_thread_join(src->argus_thread);
+ g_thread_join(src->consumer_thread);
+ while (!g_queue_is_empty (src->nvmm_buffers)) {
+ buf = (GstBuffer *) g_queue_pop_head (src->nvmm_buffers);
+ gst_buffer_unref (buf);
+ }
+ if (src->pool) {
+ if (gst_buffer_pool_is_active (src->pool))
+ gst_buffer_pool_set_active (src->pool, false);
+
+ gst_object_unref (src->pool);
+ src->pool = NULL;
+ }
+ g_queue_free(src->argus_buffers);
+ g_queue_free(src->nvmm_buffers);
return TRUE;
}
@@ -1361,6 +1382,11 @@ consumer_thread (gpointer src_base)
while (g_queue_is_empty (src->argus_buffers))
{
g_cond_wait (&src->argus_buffers_queue_cond, &src->argus_buffers_queue_lock);
+ if (src->stop_requested)
+ {
+ g_mutex_unlock (&src->argus_buffers_queue_lock);
+ goto done;
+ }
}
consumerFrameInfo = (NvArgusFrameInfo *) g_queue_pop_head (src->argus_buffers);