Message ID | 20200227200407.490616-21-nicolas.dufresne@collabora.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
Hi Nicolas, Thank you for the patch. On Thu, Feb 27, 2020 at 03:04:00PM -0500, Nicolas Dufresne wrote: > This adds getters on pad/pool/allocator so that we can retrieve the > Stream or FrameBuffer. > > Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > src/gstreamer/gstlibcameraallocator.cpp | 8 ++++++++ > src/gstreamer/gstlibcameraallocator.h | 2 ++ > src/gstreamer/gstlibcamerapad.cpp | 11 +++++++++++ > src/gstreamer/gstlibcamerapad.h | 2 ++ > src/gstreamer/gstlibcamerapool.cpp | 20 ++++++++++++++++++++ > src/gstreamer/gstlibcamerapool.h | 7 +++++++ > src/gstreamer/gstlibcamerasrc.cpp | 1 - > 7 files changed, 50 insertions(+), 1 deletion(-) > > diff --git a/src/gstreamer/gstlibcameraallocator.cpp b/src/gstreamer/gstlibcameraallocator.cpp > index f268561..f87b52c 100644 > --- a/src/gstreamer/gstlibcameraallocator.cpp > +++ b/src/gstreamer/gstlibcameraallocator.cpp > @@ -242,3 +242,11 @@ gst_libcamera_allocator_get_pool_size(GstLibcameraAllocator *self, > > return pool->length; > } > + > +FrameBuffer * > +gst_libcamera_memory_get_frame_buffer(GstMemory *mem) > +{ > + auto *frame = reinterpret_cast<FrameWrap *>(gst_mini_object_get_qdata(GST_MINI_OBJECT_CAST(mem), > + FrameWrap::getQuark())); > + return frame->buffer_; > +} > diff --git a/src/gstreamer/gstlibcameraallocator.h b/src/gstreamer/gstlibcameraallocator.h > index 25cbf85..8839040 100644 > --- a/src/gstreamer/gstlibcameraallocator.h > +++ b/src/gstreamer/gstlibcameraallocator.h > @@ -26,4 +26,6 @@ bool gst_libcamera_allocator_prepare_buffer(GstLibcameraAllocator *self, > gsize gst_libcamera_allocator_get_pool_size(GstLibcameraAllocator *allocator, > libcamera::Stream *stream); > > +libcamera::FrameBuffer *gst_libcamera_memory_get_frame_buffer(GstMemory *mem); > + > #endif /* __GST_LIBCAMERA_ALLOCATOR_H__ */ > diff --git a/src/gstreamer/gstlibcamerapad.cpp b/src/gstreamer/gstlibcamerapad.cpp > index c4c466d..4f96546 100644 > --- a/src/gstreamer/gstlibcamerapad.cpp > +++ b/src/gstreamer/gstlibcamerapad.cpp > @@ -125,3 +125,14 @@ gst_libcamera_pad_set_pool(GstPad *pad, GstLibcameraPool *pool) > g_object_unref(self->pool); > self->pool = pool; > } > + > +Stream * > +gst_libcamera_pad_get_stream(GstPad *pad) > +{ > + auto *self = GST_LIBCAMERA_PAD(pad); > + > + if (self->pool) > + return gst_libcamera_pool_get_stream(self->pool); > + > + return nullptr; > +} > diff --git a/src/gstreamer/gstlibcamerapad.h b/src/gstreamer/gstlibcamerapad.h > index 4570c0c..81d0d58 100644 > --- a/src/gstreamer/gstlibcamerapad.h > +++ b/src/gstreamer/gstlibcamerapad.h > @@ -24,4 +24,6 @@ GstLibcameraPool *gst_libcamera_pad_get_pool(GstPad *pad); > > void gst_libcamera_pad_set_pool(GstPad *pad, GstLibcameraPool *pool); > > +libcamera::Stream *gst_libcamera_pad_get_stream(GstPad *pad); > + > #endif /* __GST_LIBCAMERA_PAD_H__ */ > diff --git a/src/gstreamer/gstlibcamerapool.cpp b/src/gstreamer/gstlibcamerapool.cpp > index ee106a7..f85c3aa 100644 > --- a/src/gstreamer/gstlibcamerapool.cpp > +++ b/src/gstreamer/gstlibcamerapool.cpp > @@ -107,3 +107,23 @@ gst_libcamera_pool_new(GstLibcameraAllocator *allocator, Stream *stream) > > return pool; > } > + > +Stream * > +gst_libcamera_pool_get_stream(GstLibcameraPool *self) > +{ > + return self->stream; > +} > + > +Stream * > +gst_libcamera_buffer_get_stream(GstBuffer *buffer) > +{ > + auto *self = (GstLibcameraPool *)buffer->pool; > + return self->stream; > +} > + > +FrameBuffer * > +gst_libcamera_buffer_get_frame_buffer(GstBuffer *buffer) > +{ > + GstMemory *mem = gst_buffer_peek_memory(buffer, 0); > + return gst_libcamera_memory_get_frame_buffer(mem); > +} > diff --git a/src/gstreamer/gstlibcamerapool.h b/src/gstreamer/gstlibcamerapool.h > index a764c75..6fd2913 100644 > --- a/src/gstreamer/gstlibcamerapool.h > +++ b/src/gstreamer/gstlibcamerapool.h > @@ -23,4 +23,11 @@ G_DECLARE_FINAL_TYPE(GstLibcameraPool, gst_libcamera_pool, GST_LIBCAMERA, POOL, > GstLibcameraPool *gst_libcamera_pool_new(GstLibcameraAllocator *allocator, > libcamera::Stream *stream); > > +libcamera::Stream *gst_libcamera_pool_get_stream(GstLibcameraPool *self); > + > +libcamera::Stream *gst_libcamera_buffer_get_stream(GstBuffer *buffer); > + > +libcamera::FrameBuffer *gst_libcamera_buffer_get_frame_buffer(GstBuffer *buffer); > + > + > #endif /* __GST_LIBCAMERA_POOL_H__ */ > diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp > index fa9ff5b..83f93cc 100644 > --- a/src/gstreamer/gstlibcamerasrc.cpp > +++ b/src/gstreamer/gstlibcamerasrc.cpp > @@ -256,7 +256,6 @@ gst_libcamera_src_task_leave(GstTask *task, GThread *thread, gpointer user_data) > GstLibcameraSrcState *state = self->state; > > GST_DEBUG_OBJECT(self, "Streaming thread is about to stop"); > - state->cam->stop(); Something went wrong in the rebase ? Looks like this belongs to the previous patch. > > for (GstPad *srcpad : state->srcpads) > gst_libcamera_pad_set_pool(srcpad, NULL);
diff --git a/src/gstreamer/gstlibcameraallocator.cpp b/src/gstreamer/gstlibcameraallocator.cpp index f268561..f87b52c 100644 --- a/src/gstreamer/gstlibcameraallocator.cpp +++ b/src/gstreamer/gstlibcameraallocator.cpp @@ -242,3 +242,11 @@ gst_libcamera_allocator_get_pool_size(GstLibcameraAllocator *self, return pool->length; } + +FrameBuffer * +gst_libcamera_memory_get_frame_buffer(GstMemory *mem) +{ + auto *frame = reinterpret_cast<FrameWrap *>(gst_mini_object_get_qdata(GST_MINI_OBJECT_CAST(mem), + FrameWrap::getQuark())); + return frame->buffer_; +} diff --git a/src/gstreamer/gstlibcameraallocator.h b/src/gstreamer/gstlibcameraallocator.h index 25cbf85..8839040 100644 --- a/src/gstreamer/gstlibcameraallocator.h +++ b/src/gstreamer/gstlibcameraallocator.h @@ -26,4 +26,6 @@ bool gst_libcamera_allocator_prepare_buffer(GstLibcameraAllocator *self, gsize gst_libcamera_allocator_get_pool_size(GstLibcameraAllocator *allocator, libcamera::Stream *stream); +libcamera::FrameBuffer *gst_libcamera_memory_get_frame_buffer(GstMemory *mem); + #endif /* __GST_LIBCAMERA_ALLOCATOR_H__ */ diff --git a/src/gstreamer/gstlibcamerapad.cpp b/src/gstreamer/gstlibcamerapad.cpp index c4c466d..4f96546 100644 --- a/src/gstreamer/gstlibcamerapad.cpp +++ b/src/gstreamer/gstlibcamerapad.cpp @@ -125,3 +125,14 @@ gst_libcamera_pad_set_pool(GstPad *pad, GstLibcameraPool *pool) g_object_unref(self->pool); self->pool = pool; } + +Stream * +gst_libcamera_pad_get_stream(GstPad *pad) +{ + auto *self = GST_LIBCAMERA_PAD(pad); + + if (self->pool) + return gst_libcamera_pool_get_stream(self->pool); + + return nullptr; +} diff --git a/src/gstreamer/gstlibcamerapad.h b/src/gstreamer/gstlibcamerapad.h index 4570c0c..81d0d58 100644 --- a/src/gstreamer/gstlibcamerapad.h +++ b/src/gstreamer/gstlibcamerapad.h @@ -24,4 +24,6 @@ GstLibcameraPool *gst_libcamera_pad_get_pool(GstPad *pad); void gst_libcamera_pad_set_pool(GstPad *pad, GstLibcameraPool *pool); +libcamera::Stream *gst_libcamera_pad_get_stream(GstPad *pad); + #endif /* __GST_LIBCAMERA_PAD_H__ */ diff --git a/src/gstreamer/gstlibcamerapool.cpp b/src/gstreamer/gstlibcamerapool.cpp index ee106a7..f85c3aa 100644 --- a/src/gstreamer/gstlibcamerapool.cpp +++ b/src/gstreamer/gstlibcamerapool.cpp @@ -107,3 +107,23 @@ gst_libcamera_pool_new(GstLibcameraAllocator *allocator, Stream *stream) return pool; } + +Stream * +gst_libcamera_pool_get_stream(GstLibcameraPool *self) +{ + return self->stream; +} + +Stream * +gst_libcamera_buffer_get_stream(GstBuffer *buffer) +{ + auto *self = (GstLibcameraPool *)buffer->pool; + return self->stream; +} + +FrameBuffer * +gst_libcamera_buffer_get_frame_buffer(GstBuffer *buffer) +{ + GstMemory *mem = gst_buffer_peek_memory(buffer, 0); + return gst_libcamera_memory_get_frame_buffer(mem); +} diff --git a/src/gstreamer/gstlibcamerapool.h b/src/gstreamer/gstlibcamerapool.h index a764c75..6fd2913 100644 --- a/src/gstreamer/gstlibcamerapool.h +++ b/src/gstreamer/gstlibcamerapool.h @@ -23,4 +23,11 @@ G_DECLARE_FINAL_TYPE(GstLibcameraPool, gst_libcamera_pool, GST_LIBCAMERA, POOL, GstLibcameraPool *gst_libcamera_pool_new(GstLibcameraAllocator *allocator, libcamera::Stream *stream); +libcamera::Stream *gst_libcamera_pool_get_stream(GstLibcameraPool *self); + +libcamera::Stream *gst_libcamera_buffer_get_stream(GstBuffer *buffer); + +libcamera::FrameBuffer *gst_libcamera_buffer_get_frame_buffer(GstBuffer *buffer); + + #endif /* __GST_LIBCAMERA_POOL_H__ */ diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp index fa9ff5b..83f93cc 100644 --- a/src/gstreamer/gstlibcamerasrc.cpp +++ b/src/gstreamer/gstlibcamerasrc.cpp @@ -256,7 +256,6 @@ gst_libcamera_src_task_leave(GstTask *task, GThread *thread, gpointer user_data) GstLibcameraSrcState *state = self->state; GST_DEBUG_OBJECT(self, "Streaming thread is about to stop"); - state->cam->stop(); for (GstPad *srcpad : state->srcpads) gst_libcamera_pad_set_pool(srcpad, NULL);