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:
Nicolas Dufresne
2020-01-27 17:44:08 -05:00
committed by Laurent Pinchart
parent db50b1072a
commit 5d6db0936f
2 changed files with 31 additions and 0 deletions

View File

@@ -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);
}

View File

@@ -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__ */