[libcamera-devel] [PATCH v5 3/7] tests: delayed_controls: Add cookie tests

Kieran Bingham kieran.bingham at ideasonboard.com
Tue Nov 8 17:49:38 CET 2022


Quoting Naushir Patuck via libcamera-devel (2022-10-31 11:45:18)
> Add a test for passing and returning cookie values in DelayedControls.
> Add a test to simulate frame skips ensuring cookie values are returned
> correctly.
> 
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> Reviewed-by: David Plowman <david.plowman at raspberrypi.com>

Seems reasonable to me!


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


> ---
>  test/delayed_controls.cpp | 97 +++++++++++++++++++++++++++++++++++++++
>  1 file changed, 97 insertions(+)
> 
> diff --git a/test/delayed_controls.cpp b/test/delayed_controls.cpp
> index 26037268f245..387958a339a2 100644
> --- a/test/delayed_controls.cpp
> +++ b/test/delayed_controls.cpp
> @@ -267,6 +267,93 @@ protected:
>                 return TestPass;
>         }
>  
> +       int cookieValue()
> +       {
> +               std::unordered_map<uint32_t, DelayedControls::ControlParams> delays = {
> +                       { V4L2_CID_BRIGHTNESS, { 1, false } },
> +               };
> +               std::unique_ptr<DelayedControls> delayed =
> +                       std::make_unique<DelayedControls>(dev_.get(), delays);
> +               ControlList ctrls;
> +
> +               /* Set a cookie to the reset value. */
> +               const unsigned int startCookie = 0x1234;
> +               ctrls.set(V4L2_CID_BRIGHTNESS, 1);
> +               dev_->setControls(&ctrls);
> +               delayed->reset(startCookie);
> +
> +               /* Trigger the first frame start event */
> +               delayed->applyControls(0);
> +
> +               for (unsigned int i = 1; i < 100; i++) {
> +                       ctrls.set(V4L2_CID_BRIGHTNESS, 1);
> +                       delayed->push(ctrls, startCookie + i);
> +
> +                       delayed->applyControls(i);
> +
> +                       auto [result, cookie] = delayed->get(i);
> +                       unsigned int expected = startCookie + i - 1;
> +                       if (cookie != expected) {
> +                               cerr << "Failed cookie value"
> +                                    << " frame " << i
> +                                    << " expected cookie " << expected
> +                                    << " got cookie " << cookie
> +                                    << endl;
> +                               return TestFail;
> +                       }
> +               }
> +
> +               return TestPass;
> +       }
> +
> +       int cookieSkip()
> +       {
> +               std::unordered_map<uint32_t, DelayedControls::ControlParams> delays = {
> +                       { V4L2_CID_BRIGHTNESS, { 1, false } },
> +               };
> +               std::unique_ptr<DelayedControls> delayed =
> +                       std::make_unique<DelayedControls>(dev_.get(), delays);
> +               ControlList ctrls;
> +
> +               /* Set a cookie to the reset value. */
> +               unsigned int cookie = 0x1234;
> +               ctrls.set(V4L2_CID_BRIGHTNESS, 1);
> +               dev_->setControls(&ctrls);
> +               delayed->reset(cookie);
> +
> +               /* Trigger the first frame start event */
> +               delayed->applyControls(0);
> +
> +               unsigned int expected = cookie++;
> +               for (unsigned int i = 1; i < 100; i++) {
> +                       /*
> +                        * Send a control for 2 out of every 3 frames, simulating
> +                        * some frame skips.
> +                        */
> +                       if (i % 3) {
> +                               ctrls.set(V4L2_CID_BRIGHTNESS, 1);
> +                               delayed->push(ctrls, cookie);
> +                       }
> +
> +                       delayed->applyControls(i);
> +
> +                       auto [result, getCookie] = delayed->get(i);
> +                       if (expected != getCookie) {
> +                               cerr << "Failed cookie value"
> +                                    << " frame " << i
> +                                    << " expected cookie " << expected
> +                                    << " got cookie " << getCookie
> +                                    << endl;
> +                               return TestFail;
> +                       }
> +
> +                       if (i % 3)
> +                               expected = cookie++;
> +               }
> +
> +               return TestPass;
> +       }
> +
>         int run() override
>         {
>                 int ret;
> @@ -291,6 +378,16 @@ protected:
>                 if (ret)
>                         return ret;
>  
> +               /* Test cookie values. */
> +               ret = cookieValue();
> +               if (ret)
> +                       return ret;
> +
> +               /* Test cookie values with frame skips. */
> +               ret = cookieSkip();
> +               if (ret)
> +                       return ret;
> +
>                 return TestPass;
>         }
>  
> -- 
> 2.25.1
>


More information about the libcamera-devel mailing list