[libcamera-devel] [PATCH] libcamera: ipu3: Fix compilation issues with gcc5
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Aug 3 16:47:45 CEST 2020
Hi Jacopo,
On Mon, Aug 03, 2020 at 04:43:26PM +0200, Jacopo Mondi wrote:
> On Mon, Aug 03, 2020 at 05:25:47PM +0300, Laurent Pinchart wrote:
> > On Mon, Aug 03, 2020 at 04:18:37PM +0200, Jacopo Mondi wrote:
> > > GCC5 does not provide prototypes for the math library functions in
> > > the std:: namespace.
> > >
> > > Remove the namespace specifier to fix build errors reported by
> > > that compiler version.
> > >
> > > Fixes: 968ab9bad0ed ("libcamera: ipu3: imgu: Calculate ImgU pipe configuration")
> > > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> > > ---
> > >
> > > Laurent, can you test with gcc and confirm this fixes the issue ?
> >
> > It does fix the compilation issue, but... see below.
> >
> > > ---
> > > src/libcamera/pipeline/ipu3/imgu.cpp | 14 +++++++-------
> > > 1 file changed, 7 insertions(+), 7 deletions(-)
> > >
> > > diff --git a/src/libcamera/pipeline/ipu3/imgu.cpp b/src/libcamera/pipeline/ipu3/imgu.cpp
> > > index b7593ceb3672..671a798e69d0 100644
> > > --- a/src/libcamera/pipeline/ipu3/imgu.cpp
> > > +++ b/src/libcamera/pipeline/ipu3/imgu.cpp
> > > @@ -94,7 +94,7 @@ float findScaleFactor(float sf, const std::vector<float> &range,
> > > float bestDiff = std::numeric_limits<float>::max();
> > > unsigned int index = 0;
> > > for (unsigned int i = 0; i < range.size(); ++i) {
> > > - float diff = std::abs(sf - range[i]);
> > > + float diff = abs(sf - range[i]);
> >
> > The abs() function in the global namespace is, according to
> > https://en.cppreference.com/w/c/numeric/math/abs,
> >
> > int abs( int n );
> >
> > This will thus cast the argument to int, which is likely not what you
> > want. You need to use
> >
> > float fabsf( float arg );
> >
> > instead (https://en.cppreference.com/w/c/numeric/math/fabs).
> >
> > Same below.
> >
> > The math functions in the std:: namespace don't suffer for this, as
> > multiple overloads are defined:
> >
> > int abs( int n );
> > long abs( long n );
> > long long abs( long long n );
> >
> > (https://en.cppreference.com/w/cpp/numeric/math/abs)
> >
> > float abs( float arg );
> > double abs( double arg );
> > long double abs( long double arg );
> >
> > (https://en.cppreference.com/w/cpp/numeric/math/fabs)
> >
> > but they require <cmath>, not <math.h>.
> >
> > It's up to you, but if you keep using math.h, you need fabsf() when the
> > argument and result are floats. Similarly, fmod() should become fmodf(),
> > otherwise you'll cast the argument to double and cast the result back to
> > float.
>
> We had a rule, to use <foo.h> and not <cfoo>
>
> All the rest of the code uses <math.h> but I don't want to try&shoot
> and introduce implicit casting errors in this rather fragile code.
>
> With an ack, I'll use for this module <cmath>, contrary to the rest of
> the codebase.
Ack on either option, as I said, pick the one you like best :-)
> > > if (diff < bestDiff) {
> > > bestDiff = diff;
> > > index = i;
> > > @@ -112,7 +112,7 @@ bool isSameRatio(const Size &in, const Size &out)
> > > float inRatio = static_cast<float>(in.width) / in.height;
> > > float outRatio = static_cast<float>(out.width) / out.height;
> > >
> > > - if (std::abs(inRatio - outRatio) > 0.1)
> > > + if (abs(inRatio - outRatio) > 0.1)
> > > return false;
> > >
> > > return true;
> > > @@ -136,7 +136,7 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
> > > while (ifHeight >= minIFHeight && ifHeight / bdsSF >= minBDSHeight) {
> > >
> > > bdsHeight = ifHeight / bdsSF;
> > > - if (std::fmod(bdsHeight, 1.0) == 0) {
> > > + if (fmod(bdsHeight, 1.0) == 0) {
> > > unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
> > >
> > > if (!(bdsIntHeight % BDS_ALIGN_H)) {
> > > @@ -152,7 +152,7 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
> > > while (ifHeight <= iif.height && ifHeight / bdsSF >= minBDSHeight) {
> > >
> > > bdsHeight = ifHeight / bdsSF;
> > > - if (std::fmod(bdsHeight, 1.0) == 0) {
> > > + if (fmod(bdsHeight, 1.0) == 0) {
> > > unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
> > >
> > > if (!(bdsIntHeight % BDS_ALIGN_H)) {
> > > @@ -176,7 +176,7 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
> > > while (ifHeight > minIFHeight && ifHeight / bdsSF >= minBDSHeight) {
> > >
> > > bdsHeight = ifHeight / bdsSF;
> > > - if (std::fmod(ifHeight, 1.0) == 0 && std::fmod(bdsHeight, 1.0) == 0) {
> > > + if (fmod(ifHeight, 1.0) == 0 && fmod(bdsHeight, 1.0) == 0) {
> > > unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
> > >
> > > if (!(ifHeight % IF_ALIGN_H) &&
> > > @@ -199,7 +199,7 @@ void calculateBDS(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc, floa
> > > while (sf <= BDS_SF_MAX && sf >= BDS_SF_MIN) {
> > > float bdsWidth = static_cast<float>(iif.width) / sf;
> > >
> > > - if (std::fmod(bdsWidth, 1.0) == 0) {
> > > + if (fmod(bdsWidth, 1.0) == 0) {
> > > unsigned int bdsIntWidth = static_cast<unsigned int>(bdsWidth);
> > > if (!(bdsIntWidth % BDS_ALIGN_W) && bdsWidth >= minBDSWidth)
> > > calculateBDSHeight(pipe, iif, gdc, bdsIntWidth, sf);
> > > @@ -212,7 +212,7 @@ void calculateBDS(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc, floa
> > > while (sf <= BDS_SF_MAX && sf >= BDS_SF_MIN) {
> > > float bdsWidth = static_cast<float>(iif.width) / sf;
> > >
> > > - if (std::fmod(bdsWidth, 1.0) == 0) {
> > > + if (fmod(bdsWidth, 1.0) == 0) {
> > > unsigned int bdsIntWidth = static_cast<unsigned int>(bdsWidth);
> > > if (!(bdsIntWidth % BDS_ALIGN_W) && bdsWidth >= minBDSWidth)
> > > calculateBDSHeight(pipe, iif, gdc, bdsIntWidth, sf);
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list