[libcamera-devel,RFCv2,4/7] libcamera: pipeline: rkisp1: Do not try to process cancelled frames

Message ID 20200326160819.4088361-5-niklas.soderlund@ragnatech.se
State Superseded
Headers show
Series
  • libcamera: ipa_manager: Proxy open-source IPAs to a thread
Related show

Commit Message

Niklas Söderlund March 26, 2020, 4:08 p.m. UTC
Their is no need to try and process cancelled frames.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
---
 src/libcamera/pipeline/rkisp1/rkisp1.cpp | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Laurent Pinchart March 26, 2020, 4:52 p.m. UTC | #1
Hi Niklas,

Thank you for the patch.

On Thu, Mar 26, 2020 at 05:08:16PM +0100, Niklas Söderlund wrote:
> Their is no need to try and process cancelled frames.

s/Their/There/

> 
> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
> ---
>  src/libcamera/pipeline/rkisp1/rkisp1.cpp | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index f64807984519779b..f49b3a7f0945ac92 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -1011,6 +1011,9 @@ void PipelineHandlerRkISP1::tryCompleteRequest(Request *request)
>  
>  void PipelineHandlerRkISP1::bufferReady(FrameBuffer *buffer)
>  {
> +	if (buffer->metadata().status == FrameMetadata::FrameCancelled)
> +		return;
> +
>  	ASSERT(activeCamera_);
>  	RkISP1CameraData *data = cameraData(activeCamera_);
>  	Request *request = buffer->request();

For the capture buffer, you actually need to process it in order to
complete the request. You'll need a special case there, as you should
not wait for metadata in that case (we're stopping, metadata may never
arrive).

> @@ -1026,6 +1029,9 @@ void PipelineHandlerRkISP1::bufferReady(FrameBuffer *buffer)
>  
>  void PipelineHandlerRkISP1::paramReady(FrameBuffer *buffer)
>  {
> +	if (buffer->metadata().status == FrameMetadata::FrameCancelled)
> +		return;
> +
>  	ASSERT(activeCamera_);
>  	RkISP1CameraData *data = cameraData(activeCamera_);

For the params buffer, I think it should not take part in request
completion at all, so the logic in this function has to be reworked.

>  
> @@ -1037,6 +1043,9 @@ void PipelineHandlerRkISP1::paramReady(FrameBuffer *buffer)
>  
>  void PipelineHandlerRkISP1::statReady(FrameBuffer *buffer)
>  {
> +	if (buffer->metadata().status == FrameMetadata::FrameCancelled)
> +		return;
> +
>  	ASSERT(activeCamera_);
>  	RkISP1CameraData *data = cameraData(activeCamera_);
>
Niklas Söderlund March 28, 2020, 12:28 a.m. UTC | #2
Hi Laurent,

Thanks for your feedback.

On 2020-03-26 18:52:59 +0200, Laurent Pinchart wrote:
> Hi Niklas,
> 
> Thank you for the patch.
> 
> On Thu, Mar 26, 2020 at 05:08:16PM +0100, Niklas Söderlund wrote:
> > Their is no need to try and process cancelled frames.
> 
> s/Their/There/
> 
> > 
> > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
> > ---
> >  src/libcamera/pipeline/rkisp1/rkisp1.cpp | 9 +++++++++
> >  1 file changed, 9 insertions(+)
> > 
> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > index f64807984519779b..f49b3a7f0945ac92 100644
> > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > @@ -1011,6 +1011,9 @@ void PipelineHandlerRkISP1::tryCompleteRequest(Request *request)
> >  
> >  void PipelineHandlerRkISP1::bufferReady(FrameBuffer *buffer)
> >  {
> > +	if (buffer->metadata().status == FrameMetadata::FrameCancelled)
> > +		return;
> > +
> >  	ASSERT(activeCamera_);
> >  	RkISP1CameraData *data = cameraData(activeCamera_);
> >  	Request *request = buffer->request();
> 
> For the capture buffer, you actually need to process it in order to
> complete the request. You'll need a special case there, as you should
> not wait for metadata in that case (we're stopping, metadata may never
> arrive).

True and then we have a problem :-(

In stop() we stops all video devices and set activeCamera_ to nullptr 
and we need the camera to complete the request. We would then need a way 
to wait for all requests to finish before that don't we ? I will dig 
some and see what is what.

> 
> > @@ -1026,6 +1029,9 @@ void PipelineHandlerRkISP1::bufferReady(FrameBuffer *buffer)
> >  
> >  void PipelineHandlerRkISP1::paramReady(FrameBuffer *buffer)
> >  {
> > +	if (buffer->metadata().status == FrameMetadata::FrameCancelled)
> > +		return;
> > +
> >  	ASSERT(activeCamera_);
> >  	RkISP1CameraData *data = cameraData(activeCamera_);
> 
> For the params buffer, I think it should not take part in request
> completion at all, so the logic in this function has to be reworked.
> 
> >  
> > @@ -1037,6 +1043,9 @@ void PipelineHandlerRkISP1::paramReady(FrameBuffer *buffer)
> >  
> >  void PipelineHandlerRkISP1::statReady(FrameBuffer *buffer)
> >  {
> > +	if (buffer->metadata().status == FrameMetadata::FrameCancelled)
> > +		return;
> > +
> >  	ASSERT(activeCamera_);
> >  	RkISP1CameraData *data = cameraData(activeCamera_);
> >  
> 
> -- 
> Regards,
> 
> Laurent Pinchart

Patch

diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index f64807984519779b..f49b3a7f0945ac92 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -1011,6 +1011,9 @@  void PipelineHandlerRkISP1::tryCompleteRequest(Request *request)
 
 void PipelineHandlerRkISP1::bufferReady(FrameBuffer *buffer)
 {
+	if (buffer->metadata().status == FrameMetadata::FrameCancelled)
+		return;
+
 	ASSERT(activeCamera_);
 	RkISP1CameraData *data = cameraData(activeCamera_);
 	Request *request = buffer->request();
@@ -1026,6 +1029,9 @@  void PipelineHandlerRkISP1::bufferReady(FrameBuffer *buffer)
 
 void PipelineHandlerRkISP1::paramReady(FrameBuffer *buffer)
 {
+	if (buffer->metadata().status == FrameMetadata::FrameCancelled)
+		return;
+
 	ASSERT(activeCamera_);
 	RkISP1CameraData *data = cameraData(activeCamera_);
 
@@ -1037,6 +1043,9 @@  void PipelineHandlerRkISP1::paramReady(FrameBuffer *buffer)
 
 void PipelineHandlerRkISP1::statReady(FrameBuffer *buffer)
 {
+	if (buffer->metadata().status == FrameMetadata::FrameCancelled)
+		return;
+
 	ASSERT(activeCamera_);
 	RkISP1CameraData *data = cameraData(activeCamera_);