[libcamera-devel,06/20] libcamera: pipeline: simple: converter: Differentiate input and output buffers count
diff mbox series

Message ID 20210131224702.8838-7-laurent.pinchart@ideasonboard.com
State Accepted
Delegated to: Laurent Pinchart
Headers show
Series
  • [libcamera-devel,01/20] libcamera: pipeline: simple: Manage converter with std::unique_ptr<>
Related show

Commit Message

Laurent Pinchart Jan. 31, 2021, 10:46 p.m. UTC
The number of buffers on the input and output of the converter don't
necessarily need to match. Use the buffer count from the input and
output configuration respectively. This removes the need to pass the
buffer count to the start() function, which brings it closer to the
pipeline handler API.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 src/libcamera/pipeline/simple/converter.cpp | 9 ++++++---
 src/libcamera/pipeline/simple/converter.h   | 5 ++++-
 src/libcamera/pipeline/simple/simple.cpp    | 3 ++-
 3 files changed, 12 insertions(+), 5 deletions(-)

Comments

Kieran Bingham Feb. 19, 2021, 5:26 p.m. UTC | #1
On 31/01/2021 22:46, Laurent Pinchart wrote:
> The number of buffers on the input and output of the converter don't
> necessarily need to match. Use the buffer count from the input and
> output configuration respectively. This removes the need to pass the
> buffer count to the start() function, which brings it closer to the
> pipeline handler API.
> 


Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>


> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
>  src/libcamera/pipeline/simple/converter.cpp | 9 ++++++---
>  src/libcamera/pipeline/simple/converter.h   | 5 ++++-
>  src/libcamera/pipeline/simple/simple.cpp    | 3 ++-
>  3 files changed, 12 insertions(+), 5 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/simple/converter.cpp b/src/libcamera/pipeline/simple/converter.cpp
> index 550b2bcfb001..6b3249ea92b0 100644
> --- a/src/libcamera/pipeline/simple/converter.cpp
> +++ b/src/libcamera/pipeline/simple/converter.cpp
> @@ -195,6 +195,9 @@ int SimpleConverter::configure(const StreamConfiguration &inputCfg,
>  		return -EINVAL;
>  	}
>  
> +	inputBufferCount_ = inputCfg.bufferCount;
> +	outputBufferCount_ = outputCfg.bufferCount;
> +
>  	return 0;
>  }
>  
> @@ -204,13 +207,13 @@ int SimpleConverter::exportBuffers(unsigned int count,
>  	return m2m_->capture()->exportBuffers(count, buffers);
>  }
>  
> -int SimpleConverter::start(unsigned int count)
> +int SimpleConverter::start()
>  {
> -	int ret = m2m_->output()->importBuffers(count);
> +	int ret = m2m_->output()->importBuffers(inputBufferCount_);
>  	if (ret < 0)
>  		return ret;
>  
> -	ret = m2m_->capture()->importBuffers(count);
> +	ret = m2m_->capture()->importBuffers(outputBufferCount_);
>  	if (ret < 0) {
>  		stop();
>  		return ret;
> diff --git a/src/libcamera/pipeline/simple/converter.h b/src/libcamera/pipeline/simple/converter.h
> index 47a056e582d6..a1503a6099ff 100644
> --- a/src/libcamera/pipeline/simple/converter.h
> +++ b/src/libcamera/pipeline/simple/converter.h
> @@ -43,7 +43,7 @@ public:
>  	int exportBuffers(unsigned int count,
>  			  std::vector<std::unique_ptr<FrameBuffer>> *buffers);
>  
> -	int start(unsigned int count);
> +	int start();
>  	void stop();
>  
>  	int queueBuffers(FrameBuffer *input, FrameBuffer *output);
> @@ -58,6 +58,9 @@ private:
>  
>  	std::queue<FrameBuffer *> captureDoneQueue_;
>  	std::queue<FrameBuffer *> outputDoneQueue_;
> +
> +	unsigned int inputBufferCount_;
> +	unsigned int outputBufferCount_;
>  };
>  
>  } /* namespace libcamera */
> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
> index 1ed67bcec490..8c0bca36bbfb 100644
> --- a/src/libcamera/pipeline/simple/simple.cpp
> +++ b/src/libcamera/pipeline/simple/simple.cpp
> @@ -607,6 +607,7 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)
>  		inputCfg.pixelFormat = pipeConfig.pixelFormat;
>  		inputCfg.size = pipeConfig.captureSize;
>  		inputCfg.stride = captureFormat.planes[0].bpl;
> +		inputCfg.bufferCount = cfg.bufferCount;
>  
>  		ret = converter_->configure(inputCfg, cfg);
>  		if (ret < 0) {
> @@ -660,7 +661,7 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] ControlList *c
>  	}
>  
>  	if (useConverter_) {
> -		ret = converter_->start(count);
> +		ret = converter_->start();
>  		if (ret < 0) {
>  			stop(camera);
>  			return ret;
>
Paul Elder Feb. 22, 2021, 10:08 a.m. UTC | #2
Hi Laurent,

On Mon, Feb 01, 2021 at 12:46:48AM +0200, Laurent Pinchart wrote:
> The number of buffers on the input and output of the converter don't
> necessarily need to match. Use the buffer count from the input and
> output configuration respectively. This removes the need to pass the
> buffer count to the start() function, which brings it closer to the
> pipeline handler API.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>

> ---
>  src/libcamera/pipeline/simple/converter.cpp | 9 ++++++---
>  src/libcamera/pipeline/simple/converter.h   | 5 ++++-
>  src/libcamera/pipeline/simple/simple.cpp    | 3 ++-
>  3 files changed, 12 insertions(+), 5 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/simple/converter.cpp b/src/libcamera/pipeline/simple/converter.cpp
> index 550b2bcfb001..6b3249ea92b0 100644
> --- a/src/libcamera/pipeline/simple/converter.cpp
> +++ b/src/libcamera/pipeline/simple/converter.cpp
> @@ -195,6 +195,9 @@ int SimpleConverter::configure(const StreamConfiguration &inputCfg,
>  		return -EINVAL;
>  	}
>  
> +	inputBufferCount_ = inputCfg.bufferCount;
> +	outputBufferCount_ = outputCfg.bufferCount;
> +
>  	return 0;
>  }
>  
> @@ -204,13 +207,13 @@ int SimpleConverter::exportBuffers(unsigned int count,
>  	return m2m_->capture()->exportBuffers(count, buffers);
>  }
>  
> -int SimpleConverter::start(unsigned int count)
> +int SimpleConverter::start()
>  {
> -	int ret = m2m_->output()->importBuffers(count);
> +	int ret = m2m_->output()->importBuffers(inputBufferCount_);
>  	if (ret < 0)
>  		return ret;
>  
> -	ret = m2m_->capture()->importBuffers(count);
> +	ret = m2m_->capture()->importBuffers(outputBufferCount_);
>  	if (ret < 0) {
>  		stop();
>  		return ret;
> diff --git a/src/libcamera/pipeline/simple/converter.h b/src/libcamera/pipeline/simple/converter.h
> index 47a056e582d6..a1503a6099ff 100644
> --- a/src/libcamera/pipeline/simple/converter.h
> +++ b/src/libcamera/pipeline/simple/converter.h
> @@ -43,7 +43,7 @@ public:
>  	int exportBuffers(unsigned int count,
>  			  std::vector<std::unique_ptr<FrameBuffer>> *buffers);
>  
> -	int start(unsigned int count);
> +	int start();
>  	void stop();
>  
>  	int queueBuffers(FrameBuffer *input, FrameBuffer *output);
> @@ -58,6 +58,9 @@ private:
>  
>  	std::queue<FrameBuffer *> captureDoneQueue_;
>  	std::queue<FrameBuffer *> outputDoneQueue_;
> +
> +	unsigned int inputBufferCount_;
> +	unsigned int outputBufferCount_;
>  };
>  
>  } /* namespace libcamera */
> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
> index 1ed67bcec490..8c0bca36bbfb 100644
> --- a/src/libcamera/pipeline/simple/simple.cpp
> +++ b/src/libcamera/pipeline/simple/simple.cpp
> @@ -607,6 +607,7 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)
>  		inputCfg.pixelFormat = pipeConfig.pixelFormat;
>  		inputCfg.size = pipeConfig.captureSize;
>  		inputCfg.stride = captureFormat.planes[0].bpl;
> +		inputCfg.bufferCount = cfg.bufferCount;
>  
>  		ret = converter_->configure(inputCfg, cfg);
>  		if (ret < 0) {
> @@ -660,7 +661,7 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] ControlList *c
>  	}
>  
>  	if (useConverter_) {
> -		ret = converter_->start(count);
> +		ret = converter_->start();
>  		if (ret < 0) {
>  			stop(camera);
>  			return ret;
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/simple/converter.cpp b/src/libcamera/pipeline/simple/converter.cpp
index 550b2bcfb001..6b3249ea92b0 100644
--- a/src/libcamera/pipeline/simple/converter.cpp
+++ b/src/libcamera/pipeline/simple/converter.cpp
@@ -195,6 +195,9 @@  int SimpleConverter::configure(const StreamConfiguration &inputCfg,
 		return -EINVAL;
 	}
 
+	inputBufferCount_ = inputCfg.bufferCount;
+	outputBufferCount_ = outputCfg.bufferCount;
+
 	return 0;
 }
 
@@ -204,13 +207,13 @@  int SimpleConverter::exportBuffers(unsigned int count,
 	return m2m_->capture()->exportBuffers(count, buffers);
 }
 
-int SimpleConverter::start(unsigned int count)
+int SimpleConverter::start()
 {
-	int ret = m2m_->output()->importBuffers(count);
+	int ret = m2m_->output()->importBuffers(inputBufferCount_);
 	if (ret < 0)
 		return ret;
 
-	ret = m2m_->capture()->importBuffers(count);
+	ret = m2m_->capture()->importBuffers(outputBufferCount_);
 	if (ret < 0) {
 		stop();
 		return ret;
diff --git a/src/libcamera/pipeline/simple/converter.h b/src/libcamera/pipeline/simple/converter.h
index 47a056e582d6..a1503a6099ff 100644
--- a/src/libcamera/pipeline/simple/converter.h
+++ b/src/libcamera/pipeline/simple/converter.h
@@ -43,7 +43,7 @@  public:
 	int exportBuffers(unsigned int count,
 			  std::vector<std::unique_ptr<FrameBuffer>> *buffers);
 
-	int start(unsigned int count);
+	int start();
 	void stop();
 
 	int queueBuffers(FrameBuffer *input, FrameBuffer *output);
@@ -58,6 +58,9 @@  private:
 
 	std::queue<FrameBuffer *> captureDoneQueue_;
 	std::queue<FrameBuffer *> outputDoneQueue_;
+
+	unsigned int inputBufferCount_;
+	unsigned int outputBufferCount_;
 };
 
 } /* namespace libcamera */
diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index 1ed67bcec490..8c0bca36bbfb 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -607,6 +607,7 @@  int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)
 		inputCfg.pixelFormat = pipeConfig.pixelFormat;
 		inputCfg.size = pipeConfig.captureSize;
 		inputCfg.stride = captureFormat.planes[0].bpl;
+		inputCfg.bufferCount = cfg.bufferCount;
 
 		ret = converter_->configure(inputCfg, cfg);
 		if (ret < 0) {
@@ -660,7 +661,7 @@  int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] ControlList *c
 	}
 
 	if (useConverter_) {
-		ret = converter_->start(count);
+		ret = converter_->start();
 		if (ret < 0) {
 			stop(camera);
 			return ret;