[{"id":1301,"web_url":"https://patchwork.libcamera.org/comment/1301/","msgid":"<20190406170824.GD4817@pendragon.ideasonboard.com>","date":"2019-04-06T17:08:24","subject":"Re: [libcamera-devel] [PATCH v3 8/8] libcamera: Switch to\n\tCameraConfiguration","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Niklas,\n\nThank you for the patch.\n\nOn Sat, Apr 06, 2019 at 01:58:42AM +0200, Niklas Söderlund wrote:\n> Implement the camera configuration thru out the library, tests, cam and\n> qcam tools.\n> \n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n>  include/libcamera/camera.h               |  4 ++--\n>  src/cam/main.cpp                         |  8 ++++----\n>  src/libcamera/camera.cpp                 | 25 ++++++++++++------------\n>  src/libcamera/include/pipeline_handler.h |  6 +++---\n>  src/libcamera/pipeline/ipu3/ipu3.cpp     | 10 +++++-----\n>  src/libcamera/pipeline/uvcvideo.cpp      | 12 ++++++------\n>  src/libcamera/pipeline/vimc.cpp          | 12 ++++++------\n>  src/libcamera/pipeline_handler.cpp       |  6 +++---\n>  src/qcam/main_window.cpp                 |  2 +-\n>  src/qcam/main_window.h                   |  2 +-\n>  test/camera/camera_test.cpp              | 18 -----------------\n>  test/camera/camera_test.h                |  2 --\n>  test/camera/capture.cpp                  |  8 ++++----\n>  test/camera/configuration_default.cpp    | 12 +++---------\n>  test/camera/configuration_set.cpp        |  6 +++---\n>  test/camera/statemachine.cpp             |  2 +-\n>  16 files changed, 54 insertions(+), 81 deletions(-)\n> \n> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> index 8455049151d5c5a2..06c7d2e6ae63fa70 100644\n> --- a/include/libcamera/camera.h\n> +++ b/include/libcamera/camera.h\n> @@ -72,9 +72,9 @@ public:\n>  \tint release();\n>  \n>  \tconst std::set<Stream *> &streams() const;\n> -\tstd::map<Stream *, StreamConfiguration>\n> +\tCameraConfiguration\n>  \tstreamConfiguration(const std::vector<StreamUsage> &usage);\n> -\tint configureStreams(std::map<Stream *, StreamConfiguration> &config);\n> +\tint configureStreams(const CameraConfiguration &config);\n>  \n>  \tint allocateBuffers();\n>  \tint freeBuffers();\n> diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n> index d45ffd372d932d76..99ce564afd695b07 100644\n> --- a/src/cam/main.cpp\n> +++ b/src/cam/main.cpp\n> @@ -78,10 +78,10 @@ static int parseOptions(int argc, char *argv[])\n>  \treturn 0;\n>  }\n>  \n> -static int prepareCameraConfig(std::map<Stream *, StreamConfiguration> *config)\n> +static int prepareCameraConfig(CameraConfiguration *config)\n>  {\n>  \t*config = camera->streamConfiguration({ Stream::VideoRecording() });\n> -\tStream *stream = config->begin()->first;\n> +\tStream *stream = config->front();\n>  \n>  \tif (options.isSet(OptFormat)) {\n>  \t\tKeyValueParser::Options format = options[OptFormat];\n> @@ -135,7 +135,7 @@ static void requestComplete(Request *request, const std::map<Stream *, Buffer *>\n>  \n>  static int capture()\n>  {\n> -\tstd::map<Stream *, StreamConfiguration> config;\n> +\tCameraConfiguration config;\n>  \tstd::vector<Request *> requests;\n>  \tint ret;\n>  \n> @@ -151,7 +151,7 @@ static int capture()\n>  \t\treturn ret;\n>  \t}\n>  \n> -\tStream *stream = config.begin()->first;\n> +\tStream *stream = config.front();\n>  \n>  \tret = camera->allocateBuffers();\n>  \tif (ret) {\n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index 98145edea1ac9c91..e357bca11214969a 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -525,21 +525,21 @@ const std::set<Stream *> &Camera::streams() const\n>   * list of stream usages and the camera returns a map of suitable streams and\n>   * their suggested default configurations.\n>   *\n> - * \\return A map of streams to configurations if the requested usages can be\n> - * satisfied, or an empty map otherwise\n> + * \\return A valid CameraConfiguration if the requested usages can be satisfied,\n> + * or a invalid one otherwise\n>   */\n> -std::map<Stream *, StreamConfiguration>\n> +CameraConfiguration\n>  Camera::streamConfiguration(const std::vector<StreamUsage> &usages)\n>  {\n>  \tif (disconnected_ || !usages.size() || usages.size() > streams_.size())\n> -\t\treturn std::map<Stream *, StreamConfiguration>{};\n> +\t\treturn CameraConfiguration();\n>  \n>  \treturn pipe_->streamConfiguration(this, usages);\n>  }\n>  \n>  /**\n>   * \\brief Configure the camera's streams prior to capture\n> - * \\param[in] config A map of stream IDs and configurations to setup\n> + * \\param[in] config The camera configurations to setup\n>   *\n>   * Prior to starting capture, the camera must be configured to select a\n>   * group of streams to be involved in the capture and their configuration.\n> @@ -561,7 +561,7 @@ Camera::streamConfiguration(const std::vector<StreamUsage> &usages)\n>   * \\retval -EACCES The camera is not in a state where it can be configured\n>   * \\retval -EINVAL The configuration is not valid\n>   */\n> -int Camera::configureStreams(std::map<Stream *, StreamConfiguration> &config)\n> +int Camera::configureStreams(const CameraConfiguration &config)\n>  {\n>  \tint ret;\n>  \n> @@ -571,14 +571,14 @@ int Camera::configureStreams(std::map<Stream *, StreamConfiguration> &config)\n>  \tif (!stateBetween(CameraAcquired, CameraConfigured))\n>  \t\treturn -EACCES;\n>  \n> -\tif (!config.size()) {\n> +\tif (!config.valid()) {\n>  \t\tLOG(Camera, Error)\n> -\t\t\t<< \"Can't configure streams without a configuration\";\n> +\t\t\t<< \"Can't configure camera with invalid configuration\";\n>  \t\treturn -EINVAL;\n>  \t}\n>  \n> -\tfor (auto const &iter : config) {\n> -\t\tif (streams_.find(iter.first) == streams_.end())\n> +\tfor (Stream *stream : config) {\n> +\t\tif (streams_.find(stream) == streams_.end())\n>  \t\t\treturn -EINVAL;\n>  \t}\n>  \n> @@ -587,9 +587,8 @@ int Camera::configureStreams(std::map<Stream *, StreamConfiguration> &config)\n>  \t\treturn ret;\n>  \n>  \tactiveStreams_.clear();\n> -\tfor (auto const &iter : config) {\n> -\t\tStream *stream = iter.first;\n> -\t\tconst StreamConfiguration &cfg = iter.second;\n> +\tfor (Stream *stream : config) {\n> +\t\tconst StreamConfiguration &cfg = config[stream];\n>  \n>  \t\tstream->configuration_ = cfg;\n>  \t\tactiveStreams_.insert(stream);\n> diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h\n> index 8a1706fad5377bf4..b6cbd3bae51b08dc 100644\n> --- a/src/libcamera/include/pipeline_handler.h\n> +++ b/src/libcamera/include/pipeline_handler.h\n> @@ -18,6 +18,7 @@ namespace libcamera {\n>  class Buffer;\n>  class BufferPool;\n>  class Camera;\n> +class CameraConfiguration;\n>  class CameraManager;\n>  class DeviceEnumerator;\n>  class MediaDevice;\n> @@ -52,10 +53,9 @@ public:\n>  \n>  \tvirtual bool match(DeviceEnumerator *enumerator) = 0;\n>  \n> -\tvirtual std::map<Stream *, StreamConfiguration>\n> +\tvirtual CameraConfiguration\n>  \tstreamConfiguration(Camera *camera, const std::vector<StreamUsage> &usages) = 0;\n> -\tvirtual int configureStreams(Camera *camera,\n> -\t\t\t\t     std::map<Stream *, StreamConfiguration> &config) = 0;\n> +\tvirtual int configureStreams(Camera *camera, const CameraConfiguration &config) = 0;\n>  \n>  \tvirtual int allocateBuffers(Camera *camera, Stream *stream) = 0;\n>  \tvirtual int freeBuffers(Camera *camera, Stream *stream) = 0;\n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index 5d01504e24471bcf..ca09da753b908448 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -139,11 +139,11 @@ public:\n>  \tPipelineHandlerIPU3(CameraManager *manager);\n>  \t~PipelineHandlerIPU3();\n>  \n> -\tstd::map<Stream *, StreamConfiguration>\n> +\tCameraConfiguration\n>  \tstreamConfiguration(Camera *camera,\n>  \t\t\t    const std::vector<StreamUsage> &usages) override;\n>  \tint configureStreams(Camera *camera,\n> -\t\t\t     std::map<Stream *, StreamConfiguration> &config) override;\n> +\t\t\t     const CameraConfiguration &config) override;\n>  \n>  \tint allocateBuffers(Camera *camera, Stream *stream) override;\n>  \tint freeBuffers(Camera *camera, Stream *stream) override;\n> @@ -204,11 +204,11 @@ PipelineHandlerIPU3::~PipelineHandlerIPU3()\n>  \t\timguMediaDev_->release();\n>  }\n>  \n> -std::map<Stream *, StreamConfiguration>\n> +CameraConfiguration\n>  PipelineHandlerIPU3::streamConfiguration(Camera *camera,\n>  \t\t\t\t\t const std::vector<StreamUsage> &usages)\n>  {\n> -\tstd::map<Stream *, StreamConfiguration> configs;\n> +\tCameraConfiguration configs;\n>  \tIPU3CameraData *data = cameraData(camera);\n>  \tStreamConfiguration *config = &configs[&data->stream_];\n>  \n> @@ -234,7 +234,7 @@ PipelineHandlerIPU3::streamConfiguration(Camera *camera,\n>  }\n>  \n>  int PipelineHandlerIPU3::configureStreams(Camera *camera,\n> -\t\t\t\t\t  std::map<Stream *, StreamConfiguration> &config)\n> +\t\t\t\t\t  const CameraConfiguration &config)\n>  {\n>  \tIPU3CameraData *data = cameraData(camera);\n>  \tconst StreamConfiguration &cfg = config[&data->stream_];\n> diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp\n> index dfff7116bc2aa5d3..cd472cfadd86b7ba 100644\n> --- a/src/libcamera/pipeline/uvcvideo.cpp\n> +++ b/src/libcamera/pipeline/uvcvideo.cpp\n> @@ -26,11 +26,11 @@ public:\n>  \tPipelineHandlerUVC(CameraManager *manager);\n>  \t~PipelineHandlerUVC();\n>  \n> -\tstd::map<Stream *, StreamConfiguration>\n> +\tCameraConfiguration\n>  \tstreamConfiguration(Camera *camera,\n>  \t\t\t    const std::vector<StreamUsage> &usages) override;\n>  \tint configureStreams(Camera *camera,\n> -\t\t\t     std::map<Stream *, StreamConfiguration> &config) override;\n> +\t\t\t     const CameraConfiguration &config) override;\n>  \n>  \tint allocateBuffers(Camera *camera, Stream *stream) override;\n>  \tint freeBuffers(Camera *camera, Stream *stream) override;\n> @@ -82,12 +82,12 @@ PipelineHandlerUVC::~PipelineHandlerUVC()\n>  \t\tmedia_->release();\n>  }\n>  \n> -std::map<Stream *, StreamConfiguration>\n> +CameraConfiguration\n>  PipelineHandlerUVC::streamConfiguration(Camera *camera,\n>  \t\t\t\t\tconst std::vector<StreamUsage> &usages)\n>  {\n>  \tUVCCameraData *data = cameraData(camera);\n> -\tstd::map<Stream *, StreamConfiguration> configs;\n> +\tCameraConfiguration configs;\n>  \tStreamConfiguration config{};\n>  \n>  \tconfig.width = 640;\n> @@ -101,10 +101,10 @@ PipelineHandlerUVC::streamConfiguration(Camera *camera,\n>  }\n>  \n>  int PipelineHandlerUVC::configureStreams(Camera *camera,\n> -\t\t\t\t\t std::map<Stream *, StreamConfiguration> &config)\n> +\t\t\t\t\t const CameraConfiguration &config)\n>  {\n>  \tUVCCameraData *data = cameraData(camera);\n> -\tStreamConfiguration *cfg = &config[&data->stream_];\n> +\tconst StreamConfiguration *cfg = &config[&data->stream_];\n>  \tint ret;\n>  \n>  \tLOG(UVC, Debug) << \"Configure the camera for resolution \"\n> diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp\n> index 4da4ca018d4b942a..c8bbe2a19847ba1e 100644\n> --- a/src/libcamera/pipeline/vimc.cpp\n> +++ b/src/libcamera/pipeline/vimc.cpp\n> @@ -26,11 +26,11 @@ public:\n>  \tPipelineHandlerVimc(CameraManager *manager);\n>  \t~PipelineHandlerVimc();\n>  \n> -\tstd::map<Stream *, StreamConfiguration>\n> +\tCameraConfiguration\n>  \tstreamConfiguration(Camera *camera,\n>  \t\t\t    const std::vector<StreamUsage> &usages) override;\n>  \tint configureStreams(Camera *camera,\n> -\t\t\t     std::map<Stream *, StreamConfiguration> &config) override;\n> +\t\t\t     const CameraConfiguration &config) override;\n>  \n>  \tint allocateBuffers(Camera *camera, Stream *stream) override;\n>  \tint freeBuffers(Camera *camera, Stream *stream) override;\n> @@ -82,12 +82,12 @@ PipelineHandlerVimc::~PipelineHandlerVimc()\n>  \t\tmedia_->release();\n>  }\n>  \n> -std::map<Stream *, StreamConfiguration>\n> +CameraConfiguration\n>  PipelineHandlerVimc::streamConfiguration(Camera *camera,\n>  \t\t\t\t\t const std::vector<StreamUsage> &usages)\n>  {\n>  \tVimcCameraData *data = cameraData(camera);\n> -\tstd::map<Stream *, StreamConfiguration> configs;\n> +\tCameraConfiguration configs;\n>  \tStreamConfiguration config{};\n>  \n>  \tconfig.width = 640;\n> @@ -101,10 +101,10 @@ PipelineHandlerVimc::streamConfiguration(Camera *camera,\n>  }\n>  \n>  int PipelineHandlerVimc::configureStreams(Camera *camera,\n> -\t\t\t\t      std::map<Stream *, StreamConfiguration> &config)\n> +\t\t\t\t\t  const CameraConfiguration &config)\n>  {\n>  \tVimcCameraData *data = cameraData(camera);\n> -\tStreamConfiguration *cfg = &config[&data->stream_];\n> +\tconst StreamConfiguration *cfg = &config[&data->stream_];\n>  \tint ret;\n>  \n>  \tLOG(VIMC, Debug) << \"Configure the camera for resolution \"\n> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\n> index 0574f9904367605c..09d86b11e2a39d9b 100644\n> --- a/src/libcamera/pipeline_handler.cpp\n> +++ b/src/libcamera/pipeline_handler.cpp\n> @@ -163,15 +163,15 @@ PipelineHandler::~PipelineHandler()\n>   * The intended companion to this is \\a configureStreams() which can be used to\n>   * change the group of streams parameters.\n>   *\n> - * \\return A map of successfully retrieved streams and configurations or an\n> - * empty map on error.\n> + * \\return A valid CameraConfiguration if the requested usages can be satisfied,\n> + * or a invalid one otherwise\n\ns/invalid one/invalid configuration/\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n>   */\n>  \n>  /**\n>   * \\fn PipelineHandler::configureStreams()\n>   * \\brief Configure a group of streams for capture\n>   * \\param[in] camera The camera to configure\n> - * \\param[in] config A map of stream configurations to apply\n> + * \\param[in] config The camera configurations to setup\n>   *\n>   * Configure the specified group of streams for \\a camera according to the\n>   * configuration specified in \\a configs. The intended caller of this interface\n> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\n> index faa3bc5739dd8453..4bc0440370410525 100644\n> --- a/src/qcam/main_window.cpp\n> +++ b/src/qcam/main_window.cpp\n> @@ -98,7 +98,7 @@ int MainWindow::startCapture()\n>  \tint ret;\n>  \n>  \tconfig_ = camera_->streamConfiguration({ Stream::VideoRecording() });\n> -\tStream *stream = config_.begin()->first;\n> +\tStream *stream = config_.front();\n>  \tret = camera_->configureStreams(config_);\n>  \tif (ret < 0) {\n>  \t\tstd::cout << \"Failed to configure camera\" << std::endl;\n> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h\n> index 5e27a8fd6b4eb8f3..9b31da2bf4b75a03 100644\n> --- a/src/qcam/main_window.h\n> +++ b/src/qcam/main_window.h\n> @@ -46,7 +46,7 @@ private:\n>  \n>  \tstd::shared_ptr<Camera> camera_;\n>  \tbool isCapturing_;\n> -\tstd::map<Stream *, StreamConfiguration> config_;\n> +\tCameraConfiguration config_;\n>  \n>  \tViewFinder *viewfinder_;\n>  };\n> diff --git a/test/camera/camera_test.cpp b/test/camera/camera_test.cpp\n> index 1609c4b02842186a..24ff5fe0c64d331e 100644\n> --- a/test/camera/camera_test.cpp\n> +++ b/test/camera/camera_test.cpp\n> @@ -45,21 +45,3 @@ void CameraTest::cleanup()\n>  \n>  \tcm_->stop();\n>  };\n> -\n> -bool CameraTest::configurationValid(const std::map<Stream *, StreamConfiguration> &config) const\n> -{\n> -\t/* Test that the configuration is not empty. */\n> -\tif (config.empty())\n> -\t\treturn false;\n> -\n> -\t/* Test that configuration is valid. */\n> -\tfor (auto const &it : config) {\n> -\t\tconst StreamConfiguration &conf = it.second;\n> -\n> -\t\tif (conf.width == 0 || conf.height == 0 ||\n> -\t\t    conf.pixelFormat == 0 || conf.bufferCount == 0)\n> -\t\t\treturn false;\n> -\t}\n> -\n> -\treturn true;\n> -}\n> diff --git a/test/camera/camera_test.h b/test/camera/camera_test.h\n> index 5801fad3281e1653..ffc8a485bfaff836 100644\n> --- a/test/camera/camera_test.h\n> +++ b/test/camera/camera_test.h\n> @@ -23,8 +23,6 @@ protected:\n>  \tint init();\n>  \tvoid cleanup();\n>  \n> -\tbool configurationValid(const std::map<Stream *, StreamConfiguration> &config) const;\n> -\n>  \tstd::shared_ptr<Camera> camera_;\n>  \n>  private:\n> diff --git a/test/camera/capture.cpp b/test/camera/capture.cpp\n> index b8dbdb62f9a50a33..95b2202738d2b73b 100644\n> --- a/test/camera/capture.cpp\n> +++ b/test/camera/capture.cpp\n> @@ -42,12 +42,12 @@ protected:\n>  \n>  \tint run()\n>  \t{\n> -\t\tstd::map<Stream *, StreamConfiguration> conf =\n> +\t\tCameraConfiguration conf =\n>  \t\t\tcamera_->streamConfiguration({ Stream::VideoRecording() });\n> -\t\tStream *stream = conf.begin()->first;\n> -\t\tStreamConfiguration *sconf = &conf.begin()->second;\n> +\t\tStream *stream = conf.front();\n> +\t\tStreamConfiguration *sconf = &conf[stream];\n>  \n> -\t\tif (!configurationValid(conf)) {\n> +\t\tif (!conf.valid()) {\n>  \t\t\tcout << \"Failed to read default configuration\" << endl;\n>  \t\t\treturn TestFail;\n>  \t\t}\n> diff --git a/test/camera/configuration_default.cpp b/test/camera/configuration_default.cpp\n> index 09861716973d752c..a0295a3ed82663d0 100644\n> --- a/test/camera/configuration_default.cpp\n> +++ b/test/camera/configuration_default.cpp\n> @@ -18,17 +18,11 @@ class ConfigurationDefault : public CameraTest\n>  protected:\n>  \tint run()\n>  \t{\n> -\t\tstd::map<Stream *, StreamConfiguration> conf;\n> +\t\tCameraConfiguration conf;\n>  \n>  \t\t/* Test asking for configuration for a video stream. */\n>  \t\tconf = camera_->streamConfiguration({ Stream::VideoRecording() });\n> -\t\tif (conf.empty()) {\n> -\t\t\tcout << \"Failed to retrieve configuration for video streams\"\n> -\t\t\t     << endl;\n> -\t\t\treturn TestFail;\n> -\t\t}\n> -\n> -\t\tif (!configurationValid(conf)) {\n> +\t\tif (!conf.valid()) {\n>  \t\t\tcout << \"Default configuration invalid\" << endl;\n>  \t\t\treturn TestFail;\n>  \t\t}\n> @@ -38,7 +32,7 @@ protected:\n>  \t\t * stream usages returns an empty list of configurations.\n>  \t\t */\n>  \t\tconf = camera_->streamConfiguration({});\n> -\t\tif (!conf.empty()) {\n> +\t\tif (conf.valid()) {\n>  \t\t\tcout << \"Failed to retrieve configuration for empty usage list\"\n>  \t\t\t     << endl;\n>  \t\t\treturn TestFail;\n> diff --git a/test/camera/configuration_set.cpp b/test/camera/configuration_set.cpp\n> index 1bc01e66625eedf0..48d1b2ee98d76f5c 100644\n> --- a/test/camera/configuration_set.cpp\n> +++ b/test/camera/configuration_set.cpp\n> @@ -18,11 +18,11 @@ class ConfigurationSet : public CameraTest\n>  protected:\n>  \tint run()\n>  \t{\n> -\t\tstd::map<Stream *, StreamConfiguration> conf =\n> +\t\tCameraConfiguration conf =\n>  \t\t\tcamera_->streamConfiguration({ Stream::VideoRecording() });\n> -\t\tStreamConfiguration *sconf = &conf.begin()->second;\n> +\t\tStreamConfiguration *sconf = &conf[conf.front()];\n>  \n> -\t\tif (!configurationValid(conf)) {\n> +\t\tif (!conf.valid()) {\n>  \t\t\tcout << \"Failed to read default configuration\" << endl;\n>  \t\t\treturn TestFail;\n>  \t\t}\n> diff --git a/test/camera/statemachine.cpp b/test/camera/statemachine.cpp\n> index ab3c6fb5bea38c36..8ae93bee7ca178d4 100644\n> --- a/test/camera/statemachine.cpp\n> +++ b/test/camera/statemachine.cpp\n> @@ -265,7 +265,7 @@ protected:\n>  \t\treturn TestPass;\n>  \t}\n>  \n> -\tstd::map<Stream *, StreamConfiguration> defconf_;\n> +\tCameraConfiguration defconf_;\n>  };\n>  \n>  } /* namespace */","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AA91E60B1B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat,  6 Apr 2019 19:08:39 +0200 (CEST)","from pendragon.ideasonboard.com (unknown [91.183.39.81])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 2878E99F;\n\tSat,  6 Apr 2019 19:08:39 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1554570519;\n\tbh=kdau1pLL2SjVeI5wUIAAd1l4V+DRT6wb+ZB4BTzOcP0=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=QZ4im13t6q0vltptuNI4MwhRjBxJNWGdQoBafdWffCOewN5KCgKjAlgFFFBIHXHYB\n\tDEHIK+kJk8wq+eRizN7e8o+CS5g+ttv1nXtl4kjshvZNkaNmfJ9d5NMuzwW6RwYTES\n\t23KSqqatU30Zy/9S1r8qBZRdc1BCKCYaIU4tCPzw=","Date":"Sat, 6 Apr 2019 20:08:24 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190406170824.GD4817@pendragon.ideasonboard.com>","References":"<20190405235842.27884-1-niklas.soderlund@ragnatech.se>\n\t<20190405235842.27884-9-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190405235842.27884-9-niklas.soderlund@ragnatech.se>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v3 8/8] libcamera: Switch to\n\tCameraConfiguration","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Sat, 06 Apr 2019 17:08:39 -0000"}}]