[PATCH v5] ipa: rkisp1: Add a helper to convert floating-point to fixed-point
Barnabás Pőcze
pobrn at protonmail.com
Sun Jun 2 02:10:17 CEST 2024
Hi
2024. június 2., vasárnap 2:05 keltezéssel, Laurent Pinchart <laurent.pinchart at ideasonboard.com> írta:
> Hi Paul,
>
> Thank you for the patch, and sorry for the late review.
>
> On Fri, May 31, 2024 at 03:51:21PM +0900, Paul Elder wrote:
> > Add helper functions for converting between floating point and fixed
> > point numbers. Also add tests for them.
> >
> > Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> > Reviewed-by: Stefan Klug <stefan.klug at ideasonboard.com>
> > Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> >
> > ---
> > Changes in v5:
> > - fix test comments
> > - add documentation for the actual parameters (only template parameters
> > were documented previously)
> >
> > Changes in v4:
> > - relax the test case floating point precision
> > - optimize the fixed -> floating point converter
> >
> > Changes in v3:
> > - (used to be "libcamera: utils: Add a helper to convert floating-point to fixed-point")
> > - move the everything from libcamera global utils to the rkisp1 ipa
> >
> > Changes in v2:
> > - added the reverse conversion function (fixed -> floating)
> > - added tests
> > - make the conversion code cleaner
> > ---
> [...]
> > + int testFixedPoint()
> > + {
> > + /*
> > + * The second 7.992 test is to test that unused bits don't
> > + * affect the result.
> > + */
> > + std::map<double, uint16_t> testCases = {
> > + { 7.992, 0x3FF },
> > + { 7.992, 0xBFF },
>
> I had a bit of a WTF moment, not understanding how the same double could
> convert to two different fixed point values. Then I realized you're
> using a std::map here, which doesn't support multiple items with the
> same key.
>
> What you need is a
>
> std::vector<std::pair<double, uint16_t>> testCases = {
>
> (don't forget to include vector and utility instead of map). With that,
> the test will fail.
>
> As this patch has been merged already, could you send patches to fix
> those issues ?
I think
static const std::pair<double, uint16_t> testCases[] = { ... };
is more than sufficient here.
Regards,
Barnabás Pőcze
>
> > + { 0.2, 0x01A },
> > + { -0.2, 0x7E6 },
> > + { -0.8, 0x79A },
> > + { -0.4, 0x7CD },
> > + { -1.4, 0x74D },
> > + { -8, 0x400 },
> > + { 0, 0 },
> > + };
> > +
> > + int ret;
> > + for (const auto &testCase : testCases) {
> > + ret = testSingleFixedPoint<4, 7, uint16_t>(testCase.first,
> > + testCase.second);
> > + if (ret != TestPass)
> > + return ret;
> > + }
> > +
> > + return TestPass;
> > + }
> > +
> > + int run()
> > + {
> > + /* fixed point conversion test */
> > + if (testFixedPoint() != TestPass)
> > + return TestFail;
> > +
> > + return TestPass;
> > + }
> > +};
> > +
> > +TEST_REGISTER(RkISP1UtilsTest)
>
> --
> Regards,
>
> Laurent Pinchart
>
More information about the libcamera-devel
mailing list