[v3,4/4] gstreamer: Track RequestWrap's GstBuffer using GstPad
diff mbox series

Message ID 20251025142300.64480-5-uajain@igalia.com
State Superseded
Headers show
Series
  • gstreamer: Assorted fixes
Related show

Commit Message

Umang Jain Oct. 25, 2025, 2:23 p.m. UTC
GstPad is the link point where the buffers are pushed/pulled in the
gstreamer pipeline hence, it makes more sense to associate and
track GstBuffer(s) using GstPad rather than libcamera::Stream in
RequestWrap.

No functional changes intended as there is only one stream per pad
configuration followed in libcamerasrc.

Signed-off-by: Umang Jain <uajain@igalia.com>
---
 src/gstreamer/gstlibcamerasrc.cpp | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

Comments

Nicolas Dufresne Oct. 28, 2025, 4:18 p.m. UTC | #1
Le samedi 25 octobre 2025 à 15:23 +0100, Umang Jain a écrit :
> GstPad is the link point where the buffers are pushed/pulled in the
> gstreamer pipeline hence, it makes more sense to associate and
> track GstBuffer(s) using GstPad rather than libcamera::Stream in
> RequestWrap.
> 
> No functional changes intended as there is only one stream per pad
> configuration followed in libcamerasrc.
> 
> Signed-off-by: Umang Jain <uajain@igalia.com>

Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>

> ---
>  src/gstreamer/gstlibcamerasrc.cpp | 24 ++++++++++++------------
>  1 file changed, 12 insertions(+), 12 deletions(-)
> 
> diff --git a/src/gstreamer/gstlibcamerasrc.cpp
> b/src/gstreamer/gstlibcamerasrc.cpp
> index 7bf42be2..5ca9e3b9 100644
> --- a/src/gstreamer/gstlibcamerasrc.cpp
> +++ b/src/gstreamer/gstlibcamerasrc.cpp
> @@ -48,11 +48,11 @@ struct RequestWrap {
>  	RequestWrap(std::unique_ptr<Request> request);
>  	~RequestWrap();
>  
> -	void attachBuffer(Stream *stream, GstBuffer *buffer);
> -	GstBuffer *detachBuffer(Stream *stream);
> +	void attachBuffer(GstPad *srcpad, GstBuffer *buffer);
> +	GstBuffer *detachBuffer(GstPad *srcpad);
>  
>  	std::unique_ptr<Request> request_;
> -	std::map<Stream *, GstBuffer *> buffers_;
> +	std::map<GstPad *, GstBuffer *> buffers_;
>  
>  	GstClockTime latency_;
>  	GstClockTime pts_;
> @@ -65,32 +65,33 @@ RequestWrap::RequestWrap(std::unique_ptr<Request> request)
>  
>  RequestWrap::~RequestWrap()
>  {
> -	for (std::pair<Stream *const, GstBuffer *> &item : buffers_) {
> +	for (std::pair<GstPad *const, GstBuffer *> &item : buffers_) {
>  		if (item.second)
>  			gst_buffer_unref(item.second);
>  	}
>  }
>  
> -void RequestWrap::attachBuffer(Stream *stream, GstBuffer *buffer)
> +void RequestWrap::attachBuffer(GstPad *srcpad, GstBuffer *buffer)
>  {
>  	FrameBuffer *fb = gst_libcamera_buffer_get_frame_buffer(buffer);
> +	Stream *stream = gst_libcamera_pad_get_stream(srcpad);
>  
>  	request_->addBuffer(stream, fb);
>  
> -	auto item = buffers_.find(stream);
> +	auto item = buffers_.find(srcpad);
>  	if (item != buffers_.end()) {
>  		gst_buffer_unref(item->second);
>  		item->second = buffer;
>  	} else {
> -		buffers_[stream] = buffer;
> +		buffers_[srcpad] = buffer;
>  	}
>  }
>  
> -GstBuffer *RequestWrap::detachBuffer(Stream *stream)
> +GstBuffer *RequestWrap::detachBuffer(GstPad *srcpad)
>  {
>  	GstBuffer *buffer = nullptr;
>  
> -	auto item = buffers_.find(stream);
> +	auto item = buffers_.find(srcpad);
>  	if (item != buffers_.end()) {
>  		buffer = item->second;
>  		item->second = nullptr;
> @@ -189,7 +190,6 @@ int GstLibcameraSrcState::queueRequest()
>  		std::make_unique<RequestWrap>(std::move(request));
>  
>  	for (GstPad *srcpad : srcpads_) {
> -		Stream *stream = gst_libcamera_pad_get_stream(srcpad);
>  		GstLibcameraPool *pool = gst_libcamera_pad_get_pool(srcpad);
>  		GstBuffer *buffer;
>  		GstFlowReturn ret;
> @@ -204,7 +204,7 @@ int GstLibcameraSrcState::queueRequest()
>  			return -ENOBUFS;
>  		}
>  
> -		wrap->attachBuffer(stream, buffer);
> +		wrap->attachBuffer(srcpad, buffer);
>  	}
>  
>  	GST_TRACE_OBJECT(src_, "Requesting buffers");
> @@ -354,7 +354,7 @@ int GstLibcameraSrcState::processRequest()
>  	for (gsize i = 0; i < srcpads_.size(); i++) {
>  		GstPad *srcpad = srcpads_[i];
>  		Stream *stream = gst_libcamera_pad_get_stream(srcpad);
> -		GstBuffer *buffer = wrap->detachBuffer(stream);
> +		GstBuffer *buffer = wrap->detachBuffer(srcpad);
>  
>  		FrameBuffer *fb =
> gst_libcamera_buffer_get_frame_buffer(buffer);
>  		const StreamConfiguration &stream_cfg = stream-
> >configuration();

Patch
diff mbox series

diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
index 7bf42be2..5ca9e3b9 100644
--- a/src/gstreamer/gstlibcamerasrc.cpp
+++ b/src/gstreamer/gstlibcamerasrc.cpp
@@ -48,11 +48,11 @@  struct RequestWrap {
 	RequestWrap(std::unique_ptr<Request> request);
 	~RequestWrap();
 
-	void attachBuffer(Stream *stream, GstBuffer *buffer);
-	GstBuffer *detachBuffer(Stream *stream);
+	void attachBuffer(GstPad *srcpad, GstBuffer *buffer);
+	GstBuffer *detachBuffer(GstPad *srcpad);
 
 	std::unique_ptr<Request> request_;
-	std::map<Stream *, GstBuffer *> buffers_;
+	std::map<GstPad *, GstBuffer *> buffers_;
 
 	GstClockTime latency_;
 	GstClockTime pts_;
@@ -65,32 +65,33 @@  RequestWrap::RequestWrap(std::unique_ptr<Request> request)
 
 RequestWrap::~RequestWrap()
 {
-	for (std::pair<Stream *const, GstBuffer *> &item : buffers_) {
+	for (std::pair<GstPad *const, GstBuffer *> &item : buffers_) {
 		if (item.second)
 			gst_buffer_unref(item.second);
 	}
 }
 
-void RequestWrap::attachBuffer(Stream *stream, GstBuffer *buffer)
+void RequestWrap::attachBuffer(GstPad *srcpad, GstBuffer *buffer)
 {
 	FrameBuffer *fb = gst_libcamera_buffer_get_frame_buffer(buffer);
+	Stream *stream = gst_libcamera_pad_get_stream(srcpad);
 
 	request_->addBuffer(stream, fb);
 
-	auto item = buffers_.find(stream);
+	auto item = buffers_.find(srcpad);
 	if (item != buffers_.end()) {
 		gst_buffer_unref(item->second);
 		item->second = buffer;
 	} else {
-		buffers_[stream] = buffer;
+		buffers_[srcpad] = buffer;
 	}
 }
 
-GstBuffer *RequestWrap::detachBuffer(Stream *stream)
+GstBuffer *RequestWrap::detachBuffer(GstPad *srcpad)
 {
 	GstBuffer *buffer = nullptr;
 
-	auto item = buffers_.find(stream);
+	auto item = buffers_.find(srcpad);
 	if (item != buffers_.end()) {
 		buffer = item->second;
 		item->second = nullptr;
@@ -189,7 +190,6 @@  int GstLibcameraSrcState::queueRequest()
 		std::make_unique<RequestWrap>(std::move(request));
 
 	for (GstPad *srcpad : srcpads_) {
-		Stream *stream = gst_libcamera_pad_get_stream(srcpad);
 		GstLibcameraPool *pool = gst_libcamera_pad_get_pool(srcpad);
 		GstBuffer *buffer;
 		GstFlowReturn ret;
@@ -204,7 +204,7 @@  int GstLibcameraSrcState::queueRequest()
 			return -ENOBUFS;
 		}
 
-		wrap->attachBuffer(stream, buffer);
+		wrap->attachBuffer(srcpad, buffer);
 	}
 
 	GST_TRACE_OBJECT(src_, "Requesting buffers");
@@ -354,7 +354,7 @@  int GstLibcameraSrcState::processRequest()
 	for (gsize i = 0; i < srcpads_.size(); i++) {
 		GstPad *srcpad = srcpads_[i];
 		Stream *stream = gst_libcamera_pad_get_stream(srcpad);
-		GstBuffer *buffer = wrap->detachBuffer(stream);
+		GstBuffer *buffer = wrap->detachBuffer(srcpad);
 
 		FrameBuffer *fb = gst_libcamera_buffer_get_frame_buffer(buffer);
 		const StreamConfiguration &stream_cfg = stream->configuration();