gst: pad: Add method to store retrieve pending buffers
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> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
committed by
Laurent Pinchart
parent
db50b1072a
commit
5d6db0936f
@@ -18,6 +18,7 @@ struct _GstLibcameraPad {
|
||||
GstPad parent;
|
||||
StreamRole role;
|
||||
GstLibcameraPool *pool;
|
||||
GQueue pending_buffers;
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -137,3 +138,29 @@ 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);
|
||||
}
|
||||
|
||||
@@ -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__ */
|
||||
|
||||
Reference in New Issue
Block a user