[libcamera-devel] [PATCH 08/13] gstreamer: Combine the two pad loops in the task run handler
Nicolas Dufresne
nicolas.dufresne at collabora.com
Mon Jun 27 23:13:30 CEST 2022
Hi Laurent,
Le vendredi 24 juin 2022 à 02:22 +0300, Laurent Pinchart a écrit :
> This simplifies the code, and allows removing the internal queue in the
> GstLibcameraPad object.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Thanks for your patch.
Reviewed-by: Nicolas Dufresne <nicolas.dufresne at collabora.com>
> ---
> src/gstreamer/gstlibcamerapad.cpp | 35 -------------------------------
> src/gstreamer/gstlibcamerapad.h | 6 ------
> src/gstreamer/gstlibcamerasrc.cpp | 11 ++++------
> 3 files changed, 4 insertions(+), 48 deletions(-)
>
> diff --git a/src/gstreamer/gstlibcamerapad.cpp b/src/gstreamer/gstlibcamerapad.cpp
> index c00e81c8966e..87b4057ac101 100644
> --- a/src/gstreamer/gstlibcamerapad.cpp
> +++ b/src/gstreamer/gstlibcamerapad.cpp
> @@ -18,7 +18,6 @@ struct _GstLibcameraPad {
> GstPad parent;
> StreamRole role;
> GstLibcameraPool *pool;
> - GQueue pending_buffers;
> GstClockTime latency;
> };
>
> @@ -155,40 +154,6 @@ gst_libcamera_pad_get_stream(GstPad *pad)
> return nullptr;
> }
>
> -void
> -gst_libcamera_pad_queue_buffer(GstPad *pad, GstBuffer *buffer)
> -{
> - auto *self = GST_LIBCAMERA_PAD(pad);
> - GLibLocker lock(GST_OBJECT(self));
> -
> - g_queue_push_head(&self->pending_buffers, buffer);
> -}
> -
> -GstFlowReturn
> -gst_libcamera_pad_push_pending(GstPad *pad)
> -{
> - auto *self = GST_LIBCAMERA_PAD(pad);
> - GstBuffer *buffer;
> -
> - {
> - GLibLocker lock(GST_OBJECT(self));
> - buffer = GST_BUFFER(g_queue_pop_tail(&self->pending_buffers));
> - }
> -
> - if (!buffer)
> - return GST_FLOW_OK;
> -
> - return gst_pad_push(pad, buffer);
> -}
> -
> -bool
> -gst_libcamera_pad_has_pending(GstPad *pad)
> -{
> - auto *self = GST_LIBCAMERA_PAD(pad);
> - GLibLocker lock(GST_OBJECT(self));
> - return self->pending_buffers.length > 0;
> -}
> -
> void
> gst_libcamera_pad_set_latency(GstPad *pad, GstClockTime latency)
> {
> diff --git a/src/gstreamer/gstlibcamerapad.h b/src/gstreamer/gstlibcamerapad.h
> index 207695173313..103ee57ab384 100644
> --- a/src/gstreamer/gstlibcamerapad.h
> +++ b/src/gstreamer/gstlibcamerapad.h
> @@ -25,10 +25,4 @@ void gst_libcamera_pad_set_pool(GstPad *pad, GstLibcameraPool *pool);
>
> libcamera::Stream *gst_libcamera_pad_get_stream(GstPad *pad);
>
> -void gst_libcamera_pad_queue_buffer(GstPad *pad, GstBuffer *buffer);
> -
> -GstFlowReturn gst_libcamera_pad_push_pending(GstPad *pad);
> -
> -bool gst_libcamera_pad_has_pending(GstPad *pad);
> -
> void gst_libcamera_pad_set_latency(GstPad *pad, GstClockTime latency);
> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
> index ee9c83fde777..e30d45fa2223 100644
> --- a/src/gstreamer/gstlibcamerasrc.cpp
> +++ b/src/gstreamer/gstlibcamerasrc.cpp
> @@ -311,6 +311,9 @@ gst_libcamera_src_task_run(gpointer user_data)
> return;
> }
>
> + GstFlowReturn ret = GST_FLOW_OK;
> + gst_flow_combiner_reset(self->flow_combiner);
> +
> for (GstPad *srcpad : state->srcpads_) {
> Stream *stream = gst_libcamera_pad_get_stream(srcpad);
> GstBuffer *buffer = wrap->detachBuffer(stream);
> @@ -327,13 +330,7 @@ gst_libcamera_src_task_run(gpointer user_data)
> GST_BUFFER_OFFSET(buffer) = fb->metadata().sequence;
> GST_BUFFER_OFFSET_END(buffer) = fb->metadata().sequence;
>
> - gst_libcamera_pad_queue_buffer(srcpad, buffer);
> - }
> -
> - GstFlowReturn ret = GST_FLOW_OK;
> - gst_flow_combiner_reset(self->flow_combiner);
> - for (GstPad *srcpad : state->srcpads_) {
> - ret = gst_libcamera_pad_push_pending(srcpad);
> + ret = gst_pad_push(srcpad, buffer);
> ret = gst_flow_combiner_update_pad_flow(self->flow_combiner,
> srcpad, ret);
> }
More information about the libcamera-devel
mailing list