[libcamera-devel] [PATCH v2 19/27] gst: libcamerasrc: Allocate and release buffers

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sat Feb 29 15:31:06 CET 2020


Hi Nicolas,

Thank you for the patch.

On Thu, Feb 27, 2020 at 03:03:59PM -0500, Nicolas Dufresne wrote:
> Setup the allocation and the release of buffers in the
> element. We have one pooling GstAllocator that wraps the
> FrameBufferAllocator and tracks the lifetime of FrameBuffer
> object. Then, for each pads we have a GstBufferPool object

s/object/objects/
s/pads/pad/

> which is only used to avoid re-allocating the GstBuffer
> structure everytime we push a buffer.

s/everytime/every time/

> 
> Signed-off-by: Nicolas Dufresne <nicolas.dufresne at collabora.com>
> ---
>  src/gstreamer/gstlibcamerasrc.cpp | 29 +++++++++++++++++++++++++++++
>  1 file changed, 29 insertions(+)
> 
> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
> index 4003a89..fa9ff5b 100644
> --- a/src/gstreamer/gstlibcamerasrc.cpp
> +++ b/src/gstreamer/gstlibcamerasrc.cpp
> @@ -13,7 +13,9 @@
>   */
>  
>  #include "gstlibcamera-utils.h"
> +#include "gstlibcameraallocator.h"
>  #include "gstlibcamerapad.h"
> +#include "gstlibcamerapool.h"
>  #include "gstlibcamerasrc.h"
>  
>  #include <libcamera/camera.h>
> @@ -42,6 +44,7 @@ struct _GstLibcameraSrc {
>  	gchar *camera_name;
>  
>  	GstLibcameraSrcState *state;
> +	GstLibcameraAllocator *allocator;
>  };
>  
>  enum {
> @@ -218,6 +221,23 @@ gst_libcamera_src_task_enter(GstTask *task, GThread *thread, gpointer user_data)
>  		}
>  	}
>  
> +	self->allocator = gst_libcamera_allocator_new(state->cam);
> +	if (!self->allocator) {
> +		GST_ELEMENT_ERROR(self, RESOURCE, NO_SPACE_LEFT,
> +				  ("Failed to allocate memory"),
> +				  ("gst_libcamera_allocator_new() failed."));
> +		gst_task_stop(task);
> +		return;
> +	}
> +
> +	for (gsize i = 0; i < state->srcpads.size(); i++) {
> +		GstPad *srcpad = state->srcpads[i];
> +		const StreamConfiguration &stream_cfg = state->config->at(i);
> +		GstLibcameraPool *pool = gst_libcamera_pool_new(self->allocator,
> +								stream_cfg.stream());
> +		gst_libcamera_pad_set_pool(srcpad, pool);
> +	}
> +
>  done:
>  	switch (flow_ret) {
>  	case GST_FLOW_NOT_NEGOTIATED:
> @@ -233,8 +253,15 @@ static void
>  gst_libcamera_src_task_leave(GstTask *task, GThread *thread, gpointer user_data)
>  {
>  	GstLibcameraSrc *self = GST_LIBCAMERA_SRC(user_data);
> +	GstLibcameraSrcState *state = self->state;
>  
>  	GST_DEBUG_OBJECT(self, "Streaming thread is about to stop");
> +	state->cam->stop();

As this patch doesn't add cam->start(), doesn't this belong to another
patch ?

> +
> +	for (GstPad *srcpad : state->srcpads)
> +		gst_libcamera_pad_set_pool(srcpad, NULL);
> +
> +	g_clear_object(&self->allocator);
>  }
>  
>  static void
> @@ -243,6 +270,8 @@ gst_libcamera_src_close(GstLibcameraSrc *self)
>  	GstLibcameraSrcState *state = self->state;
>  	gint ret;
>  
> +	GST_DEBUG_OBJECT(self, "Releasing resources");
> +
>  	ret = state->cam->release();
>  	if (ret) {
>  		GST_ELEMENT_WARNING(self, RESOURCE, BUSY,

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list