[PATCH v1 1/6] test: camera: Increase timeout for vimc capture tests

Kieran Bingham kieran.bingham at ideasonboard.com
Wed May 29 15:56:23 CEST 2024


Quoting Laurent Pinchart (2024-04-25 00:42:19)
> On slower machines, a 1s timeout to capture frames with vimc can be too
> short and cause test failures. Make the timeout proportional to the
> number of frames expected to be captured, using a conservative low
> estimate of the frame rate at 2fps.
> 
> By itself, that change could increase the test time quite substantially
> on fast platforms, so break from the capture loop as soon as we capture
> enough frames. To do so, interrupt the dispatcher at every request
> completion, or it will only get interrupted after the timer times out.

Sounds good to me.

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

> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  test/camera/buffer_import.cpp | 21 +++++++++++++++------
>  test/camera/capture.cpp       | 22 ++++++++++++++--------
>  2 files changed, 29 insertions(+), 14 deletions(-)
> 
> diff --git a/test/camera/buffer_import.cpp b/test/camera/buffer_import.cpp
> index 9288400474a7..815d1caed9f3 100644
> --- a/test/camera/buffer_import.cpp
> +++ b/test/camera/buffer_import.cpp
> @@ -63,6 +63,8 @@ protected:
>                 request->reuse();
>                 request->addBuffer(stream, buffer);
>                 camera_->queueRequest(request);
> +
> +               dispatcher_->interrupt();
>         }
>  
>         int init() override
> @@ -76,6 +78,8 @@ protected:
>                         return TestFail;
>                 }
>  
> +               dispatcher_ = Thread::current()->eventDispatcher();
> +
>                 return TestPass;
>         }
>  
> @@ -133,17 +137,20 @@ protected:
>                         }
>                 }
>  
> -               EventDispatcher *dispatcher = Thread::current()->eventDispatcher();
> +               const unsigned int nFrames = cfg.bufferCount * 2;
>  
>                 Timer timer;
> -               timer.start(1000ms);
> -               while (timer.isRunning())
> -                       dispatcher->processEvents();
> +               timer.start(500ms * nFrames);
> +               while (timer.isRunning()) {
> +                       dispatcher_->processEvents();
> +                       if (completeRequestsCount_ > nFrames)
> +                               break;
> +               }
>  
> -               if (completeRequestsCount_ < cfg.bufferCount * 2) {
> +               if (completeRequestsCount_ < nFrames) {
>                         std::cout << "Failed to capture enough frames (got "
>                                   << completeRequestsCount_ << " expected at least "
> -                                 << cfg.bufferCount * 2 << ")" << std::endl;
> +                                 << nFrames << ")" << std::endl;
>                         return TestFail;
>                 }
>  
> @@ -161,6 +168,8 @@ protected:
>         }
>  
>  private:
> +       EventDispatcher *dispatcher_;
> +
>         std::vector<std::unique_ptr<Request>> requests_;
>  
>         unsigned int completeBuffersCount_;
> diff --git a/test/camera/capture.cpp b/test/camera/capture.cpp
> index de824083dfed..8766fb194ee5 100644
> --- a/test/camera/capture.cpp
> +++ b/test/camera/capture.cpp
> @@ -59,6 +59,8 @@ protected:
>                 request->reuse();
>                 request->addBuffer(stream, buffer);
>                 camera_->queueRequest(request);
> +
> +               dispatcher_->interrupt();
>         }
>  
>         int init() override
> @@ -73,6 +75,7 @@ protected:
>                 }
>  
>                 allocator_ = new FrameBufferAllocator(camera_);
> +               dispatcher_ = Thread::current()->eventDispatcher();
>  
>                 return TestPass;
>         }
> @@ -135,19 +138,20 @@ protected:
>                         }
>                 }
>  
> -               EventDispatcher *dispatcher = Thread::current()->eventDispatcher();
> +               unsigned int nFrames = allocator_->buffers(stream).size() * 2;
>  
>                 Timer timer;
> -               timer.start(1000ms);
> -               while (timer.isRunning())
> -                       dispatcher->processEvents();
> +               timer.start(500ms * nFrames);
> +               while (timer.isRunning()) {
> +                       dispatcher_->processEvents();
> +                       if (completeRequestsCount_ > nFrames)
> +                               break;
> +               }
>  
> -               unsigned int nbuffers = allocator_->buffers(stream).size();
> -
> -               if (completeRequestsCount_ < nbuffers * 2) {
> +               if (completeRequestsCount_ < nFrames) {
>                         cout << "Failed to capture enough frames (got "
>                              << completeRequestsCount_ << " expected at least "
> -                            << nbuffers * 2 << ")" << endl;
> +                            << nFrames * 2 << ")" << endl;
>                         return TestFail;
>                 }
>  
> @@ -164,6 +168,8 @@ protected:
>                 return TestPass;
>         }
>  
> +       EventDispatcher *dispatcher_;
> +
>         std::vector<std::unique_ptr<Request>> requests_;
>  
>         std::unique_ptr<CameraConfiguration> config_;
> -- 
> Regards,
> 
> Laurent Pinchart
>


More information about the libcamera-devel mailing list