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

Naushir Patuck naush at raspberrypi.com
Thu Dec 8 11:35:04 CET 2022


Hi,

I should note that  PipelineHandler::configurationFile() is not actually
used in
this series any more since we now only optionally load a config file if one
is
set in the environment variable.  So this commit could possibly be dropped
if we
prefer.  However, I do think it has benefits to leave it in if the config
file
was mandatory for other pipeline handlers.

Thanks,
Naush

On Tue, 6 Dec 2022 at 13:55, Naushir Patuck <naush at raspberrypi.com> wrote:

> 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)
> +                       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() << "'";
> +
> +       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/20221208/edf2a8ba/attachment.htm>


More information about the libcamera-devel mailing list