[libcamera-devel] [PATCH v4 02/12] libcamera: pipeline: Add a platform configuration file helper

Naushir Patuck naush at raspberrypi.com
Tue Jan 17 09:50:46 CET 2023


Hi Kieran,

Thank you for the feedback!

On Mon, 16 Jan 2023 at 17:18, Kieran Bingham <
kieran.bingham at ideasonboard.com> wrote:

> Quoting Naushir Patuck via libcamera-devel (2022-12-09 09:00:40)
> > Add a new helper function PipelineHandler::configurationFile() that
> returns
> > the full path of a named configuration file. This configuration file may
> be read
> > by pipeline handlers for platform specific configuration parameters on
> > initialisation.
> >
> > The mechanism for searching for the configuration file is similar to the
> IPA
> > configuration file:
> >
> > - In the source tree if libcamera is not installed
> > - Otherwise in standard system locations (etc and share directories).
> >
> > When stored in the source tree, configuration files shall be located in
> a 'data'
> > subdirectory of their respective pipeline handler directory.
> >
> > Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> > Reviewed-by: David Plowman <david.plowman at raspberrypi.com>
> > ---
> >  include/libcamera/internal/pipeline_handler.h |  3 +
> >  src/libcamera/pipeline_handler.cpp            | 60 +++++++++++++++++++
> >  2 files changed, 63 insertions(+)
> >
> > diff --git a/include/libcamera/internal/pipeline_handler.h
> b/include/libcamera/internal/pipeline_handler.h
> > index ec4f662d7399..4c4dfe62a680 100644
> > --- a/include/libcamera/internal/pipeline_handler.h
> > +++ b/include/libcamera/internal/pipeline_handler.h
> > @@ -65,6 +65,9 @@ public:
> >         bool completeBuffer(Request *request, FrameBuffer *buffer);
> >         void completeRequest(Request *request);
> >
> > +       std::string configurationFile(const std::string &subdir,
> > +                                     const std::string &name) const;
> > +
> >         const char *name() const { return name_; }
> >
> >  protected:
> > diff --git a/src/libcamera/pipeline_handler.cpp
> b/src/libcamera/pipeline_handler.cpp
> > index cfade4908118..a515ad5ecffb 100644
> > --- a/src/libcamera/pipeline_handler.cpp
> > +++ b/src/libcamera/pipeline_handler.cpp
> > @@ -8,6 +8,7 @@
> >  #include "libcamera/internal/pipeline_handler.h"
> >
> >  #include <chrono>
> > +#include <sys/stat.h>
> >  #include <sys/sysmacros.h>
> >
> >  #include <libcamera/base/log.h>
> > @@ -534,6 +535,65 @@ void PipelineHandler::completeRequest(Request
> *request)
> >         }
> >  }
> >
> > +/**
> > + * \brief Retrieve the absolute path to a platform configuration file
> > + * \param[in] subdir The pipeline handler specific subdirectory name
> > + * \param[in] name The configuration file name
> > + *
> > + * This function locates a named platform configuration file and returns
> > + * its absolute path to the pipeline handler. It searches the following
> > + * directories, in order:
> > + *
> > + * - If libcamera is not installed, the
> src/libcamera/pipeline/<subdir>/data/
> > + *   directory within the source tree ; otherwise
> > + * - The system data (share/libcamera/pipeline/<subdir>) directory.
> > + *
> > + * The system directories are not searched if libcamera is not
> installed.
> > + *
> > + * \return The full path to the pipeline handler configuration file, or
> an empty
> > + * string if no configuration file can be found
> > + */
> > +std::string PipelineHandler::configurationFile(const std::string
> &subdir,
> > +                                              const std::string &name)
> const
> > +{
> > +       std::string confPath;
> > +       struct stat statbuf;
> > +       int ret;
> > +
> > +       std::string root = utils::libcameraSourcePath();
> > +       if (!root.empty()) {
> > +               /*
> > +                * When libcamera is used before it is installed, load
> > +                * configuration files from the source directory. The
> > +                * configuration files are then located in the 'data'
> > +                * subdirectory of the corresponding pipeline handler.
> > +                */
> > +               std::string confDir = root + "src/libcamera/pipeline/";
> > +               confPath = confDir + subdir + "/data/" + name;
> > +
> > +               LOG(Pipeline, Info)
> > +                       << "libcamera is not installed. Loading platform
> configuration file from '"
> > +                       << confPath << "'";
> > +
> > +               ret = stat(confPath.c_str(), &statbuf);
> > +               if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)
>
> Will this stop configuration files being a symlink to an alternative
> file? (S_IFREG vs S_IFLINK) ? Does that even matter?
>
> We could do:
>
>         if (File::exists(confPath))
>                 return confPath;
>
> That only checks that the 'name' is not a directory... So ... it's
> different again, though I would expect the


I was copying the implementation of IPAProxy::configurationFile()
for this function to retain consistency, but could change if other folks
agree?


>
>
>
> > +                       return confPath;
> > +       } else {
> > +               /* Else look in the system locations. */
> > +               confPath = std::string(LIBCAMERA_DATA_DIR)
> > +                               + "/pipeline/" + subdir + '/' + name;
> > +               ret = stat(confPath.c_str(), &statbuf);
> > +               if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)
> > +                       return confPath;
> > +       }
> > +
> > +       LOG(Pipeline, Error)
> > +               << "Configuration file '" << confPath
> > +               << "' not found for pipeline handler '" <<
> PipelineHandler::name() << "'";
>
> This sounds like it suddenly makes configuration files mandatory for all
> pipelines ?
>
> (or perhaps only if a pipeline looks for one ?)
>

Correct, the config file is only mandatory if a pipeline handler explicitly
looks for one.

Regards,
Naush



>
> > +
> > +       return std::string();
> > +}
> > +
> >  /**
> >   * \brief Register a camera to the camera manager and pipeline handler
> >   * \param[in] camera The camera to be added
> > --
> > 2.25.1
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20230117/7bbd08e7/attachment.htm>


More information about the libcamera-devel mailing list