Message ID | 20200129033210.278800-22-nicolas@ndufresne.ca |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Nicolas, Thank you for the patch. On Tue, Jan 28, 2020 at 10:32:08PM -0500, Nicolas Dufresne wrote: > From: Nicolas Dufresne <nicolas.dufresne@collabora.com> > > These will be useful for streaming. The requestComplete callback will > store the buffers on each pads so that the _run() can pick them up > and push them through the pads from a streaming thread. > > Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> > --- > src/gstreamer/gstlibcamerapad.cpp | 28 ++++++++++++++++++++++++++++ > src/gstreamer/gstlibcamerapad.h | 4 ++++ > 2 files changed, 32 insertions(+) > > diff --git a/src/gstreamer/gstlibcamerapad.cpp b/src/gstreamer/gstlibcamerapad.cpp > index 6401810..4a775e4 100644 > --- a/src/gstreamer/gstlibcamerapad.cpp > +++ b/src/gstreamer/gstlibcamerapad.cpp > @@ -17,6 +17,7 @@ struct _GstLibcameraPad { > GstPad parent; > StreamRole role; > GstLibcameraPool *pool; > + GQueue pending_buffers; > }; > > enum { > @@ -136,3 +137,30 @@ gst_libcamera_pad_get_stream(GstPad *pad) > > return nullptr; > } > + > +void > +gst_libcamera_pad_queue_buffer(GstPad *pad, GstBuffer *buffer) > +{ > + GST_OBJECT_LOCKER(pad); > + auto *self = GST_LIBCAMERA_PAD(pad); > + > + g_queue_push_head(&self->pending_buffers, buffer); > +} > + > +GstFlowReturn > +gst_libcamera_pad_push_pending(GstPad *pad) > +{ > + auto *self = GST_LIBCAMERA_PAD(pad); > + GstBuffer *buffer; > + GstFlowReturn ret = GST_FLOW_CUSTOM_SUCCESS; > + > + { > + GST_OBJECT_LOCKER(self); > + buffer = (GstBuffer *)g_queue_pop_tail(&self->pending_buffers); > + } > + > + if (buffer) > + ret = gst_pad_push(pad, buffer); > + > + return ret; You could write this if (!buffer) return GST_FLOW_CUSTOM_SUCCESS; return gst_pad_push(pad, buffer); and drop the ret variable. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > +} > diff --git a/src/gstreamer/gstlibcamerapad.h b/src/gstreamer/gstlibcamerapad.h > index 81d0d58..d928570 100644 > --- a/src/gstreamer/gstlibcamerapad.h > +++ b/src/gstreamer/gstlibcamerapad.h > @@ -26,4 +26,8 @@ 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); > + > #endif /* __GST_LIBCAMERA_PAD_H__ */
diff --git a/src/gstreamer/gstlibcamerapad.cpp b/src/gstreamer/gstlibcamerapad.cpp index 6401810..4a775e4 100644 --- a/src/gstreamer/gstlibcamerapad.cpp +++ b/src/gstreamer/gstlibcamerapad.cpp @@ -17,6 +17,7 @@ struct _GstLibcameraPad { GstPad parent; StreamRole role; GstLibcameraPool *pool; + GQueue pending_buffers; }; enum { @@ -136,3 +137,30 @@ gst_libcamera_pad_get_stream(GstPad *pad) return nullptr; } + +void +gst_libcamera_pad_queue_buffer(GstPad *pad, GstBuffer *buffer) +{ + GST_OBJECT_LOCKER(pad); + auto *self = GST_LIBCAMERA_PAD(pad); + + g_queue_push_head(&self->pending_buffers, buffer); +} + +GstFlowReturn +gst_libcamera_pad_push_pending(GstPad *pad) +{ + auto *self = GST_LIBCAMERA_PAD(pad); + GstBuffer *buffer; + GstFlowReturn ret = GST_FLOW_CUSTOM_SUCCESS; + + { + GST_OBJECT_LOCKER(self); + buffer = (GstBuffer *)g_queue_pop_tail(&self->pending_buffers); + } + + if (buffer) + ret = gst_pad_push(pad, buffer); + + return ret; +} diff --git a/src/gstreamer/gstlibcamerapad.h b/src/gstreamer/gstlibcamerapad.h index 81d0d58..d928570 100644 --- a/src/gstreamer/gstlibcamerapad.h +++ b/src/gstreamer/gstlibcamerapad.h @@ -26,4 +26,8 @@ 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); + #endif /* __GST_LIBCAMERA_PAD_H__ */