[{"id":1648,"web_url":"https://patchwork.libcamera.org/comment/1648/","msgid":"<20190521195041.g6qainh2hvc67alj@uno.localdomain>","date":"2019-05-21T19:50:50","subject":"Re: [libcamera-devel] [PATCH v3 2/6] libcamera: Use stream roles\n\tdirectly instead of StreamUsage","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Laurent,\n   just one minor thing\n\nOn Tue, May 21, 2019 at 10:27:36PM +0300, Laurent Pinchart wrote:\n\n[snip]\n\n> @@ -275,15 +273,13 @@ PipelineHandlerIPU3::generateConfiguration(Camera *camera,\n>  \t\t\tstream = &data->vfStream_;\n>\n>  \t\t\t/*\n> -\t\t\t * Align the requested viewfinder size to the\n> -\t\t\t * maximum available sensor resolution and to the\n> -\t\t\t * IPU3 alignment constraints.\n> +\t\t\t * Align the default viewfinder size to the maximum\n> +\t\t\t * available sensor resolution and to the IPU3\n> +\t\t\t * alignment constraints.\n>  \t\t\t */\n>  \t\t\tconst Size &res = data->cio2_.sensor_->resolution();\n> -\t\t\tunsigned int width = std::min(usage.size().width,\n> -\t\t\t\t\t\t      res.width);\n> -\t\t\tunsigned int height = std::min(usage.size().height,\n> -\t\t\t\t\t\t       res.height);\n> +\t\t\tunsigned int width = std::min(1280U, res.width);\n> +\t\t\tunsigned int height = std::min(720U, res.height);\n\nFrom my testing it's safe to use IPU3 at 2560x1920, just tested on\nSoraka though\n\nI think you've lost my form v2\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n  j\n\n>  \t\t\tcfg.size = { width & ~7, height & ~3 };\n>\n>  \t\t\tbreak;\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 4d02f9604ad9..4bd8c5101a96 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -35,7 +35,7 @@ public:\n>  \t~PipelineHandlerRkISP1();\n>\n>  \tCameraConfiguration generateConfiguration(Camera *camera,\n> -\t\tconst std::vector<StreamUsage> &usages) override;\n> +\t\tconst StreamRoles &roles) override;\n>  \tint configure(Camera *camera,\n>  \t\tconst CameraConfiguration &config) override;\n>\n> @@ -107,7 +107,7 @@ PipelineHandlerRkISP1::~PipelineHandlerRkISP1()\n>   */\n>\n>  CameraConfiguration PipelineHandlerRkISP1::generateConfiguration(Camera *camera,\n> -\tconst std::vector<StreamUsage> &usages)\n> +\tconst StreamRoles &roles)\n>  {\n>  \tRkISP1CameraData *data = cameraData(camera);\n>  \tCameraConfiguration config;\n> diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp\n> index 118b97457d2a..d2e1f7d4e5b2 100644\n> --- a/src/libcamera/pipeline/uvcvideo.cpp\n> +++ b/src/libcamera/pipeline/uvcvideo.cpp\n> @@ -26,8 +26,7 @@ public:\n>  \tPipelineHandlerUVC(CameraManager *manager);\n>\n>  \tCameraConfiguration\n> -\tgenerateConfiguration(Camera *camera,\n> -\t\t\t      const std::vector<StreamUsage> &usages) override;\n> +\tgenerateConfiguration(Camera *camera, const StreamRoles &roles) override;\n>  \tint configure(Camera *camera,\n>  \t\t      const CameraConfiguration &config) override;\n>\n> @@ -77,7 +76,7 @@ PipelineHandlerUVC::PipelineHandlerUVC(CameraManager *manager)\n>\n>  CameraConfiguration\n>  PipelineHandlerUVC::generateConfiguration(Camera *camera,\n> -\t\t\t\t\t  const std::vector<StreamUsage> &usages)\n> +\t\t\t\t\t  const StreamRoles &roles)\n>  {\n>  \tUVCCameraData *data = cameraData(camera);\n>  \tCameraConfiguration config;\n> diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp\n> index 74959581a7ef..17e2491e5c27 100644\n> --- a/src/libcamera/pipeline/vimc.cpp\n> +++ b/src/libcamera/pipeline/vimc.cpp\n> @@ -26,8 +26,7 @@ public:\n>  \tPipelineHandlerVimc(CameraManager *manager);\n>\n>  \tCameraConfiguration\n> -\tgenerateConfiguration(Camera *camera,\n> -\t\t\t      const std::vector<StreamUsage> &usages) override;\n> +\tgenerateConfiguration(Camera *camera, const StreamRoles &roles) override;\n>  \tint configure(Camera *camera,\n>  \t\t      const CameraConfiguration &config) override;\n>\n> @@ -77,7 +76,7 @@ PipelineHandlerVimc::PipelineHandlerVimc(CameraManager *manager)\n>\n>  CameraConfiguration\n>  PipelineHandlerVimc::generateConfiguration(Camera *camera,\n> -\t\t\t\t\t   const std::vector<StreamUsage> &usages)\n> +\t\t\t\t\t   const StreamRoles &roles)\n>  {\n>  \tVimcCameraData *data = cameraData(camera);\n>  \tCameraConfiguration config;\n> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\n> index b9ac64328f1d..81c11149c9fe 100644\n> --- a/src/libcamera/pipeline_handler.cpp\n> +++ b/src/libcamera/pipeline_handler.cpp\n> @@ -221,18 +221,18 @@ void PipelineHandler::unlock()\n>   * \\fn PipelineHandler::generateConfiguration()\n>   * \\brief Generate a camera configuration for a specified camera\n>   * \\param[in] camera The camera to generate a default configuration for\n> - * \\param[in] usages A list of stream usages\n> + * \\param[in] roles A list of stream roles\n>   *\n> - * Generate a default configuration for the \\a camera for a specified group of\n> - * use-cases. The caller shall populate the \\a usages array with the use-cases\n> - * it wishes to fetch the default configuration for. The returned configuration\n> + * Generate a default configuration for the \\a camera for a specified list of\n> + * stream roles. The caller shall populate the \\a roles with the use-cases it\n> + * wishes to fetch the default configuration for. The returned configuration\n>   * can then be examined by the caller to learn about the selected streams and\n>   * their default parameters.\n>   *\n>   * The intended companion to this is \\a configure() which can be used to change\n>   * the group of streams parameters.\n>   *\n> - * \\return A valid CameraConfiguration if the requested usages can be satisfied,\n> + * \\return A valid CameraConfiguration if the requested roles can be satisfied,\n>   * or a invalid configuration otherwise\n>   */\n>\n> diff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp\n> index af259510b19c..fe4c4ecf4150 100644\n> --- a/src/libcamera/stream.cpp\n> +++ b/src/libcamera/stream.cpp\n> @@ -75,61 +75,31 @@ std::string StreamConfiguration::toString() const\n>  }\n>\n>  /**\n> - * \\class StreamUsage\n> - * \\brief Stream usage information\n> - *\n> - * The StreamUsage class describes how an application intends to use a stream.\n> - * Usages are specified by applications and passed to cameras, that then select\n> - * the most appropriate streams and their default configurations.\n> - */\n> -\n> -/**\n> - * \\enum StreamUsage::Role\n> + * \\enum StreamRole\n>   * \\brief Identify the role a stream is intended to play\n> - * \\var StreamUsage::StillCapture\n> + *\n> + * The StreamRole describes how an application intends to use a stream. Roles\n> + * are specified by applications and passed to cameras, that then select the\n> + * most appropriate streams and their default configurations.\n> + *\n> + * \\var StillCapture\n>   * The stream is intended to capture high-resolution, high-quality still images\n>   * with low frame rate. The captured frames may be exposed with flash.\n> - * \\var StreamUsage::VideoRecording\n> + * \\var VideoRecording\n>   * The stream is intended to capture video for the purpose of recording or\n>   * streaming. The video stream may produce a high frame rate and may be\n>   * enhanced with video stabilization.\n> - * \\var StreamUsage::Viewfinder\n> + * \\var Viewfinder\n>   * The stream is intended to capture video for the purpose of display on the\n> - * local screen. The StreamUsage includes the desired resolution. Trade-offs\n> - * between quality and usage of system resources are acceptable.\n> + * local screen. Trade-offs between quality and usage of system resources are\n> + * acceptable.\n>   */\n>\n>  /**\n> - * \\fn StreamUsage::role()\n> - * \\brief Retrieve the stream role\n> - * \\return The stream role\n> + * \\typedef StreamRoles\n> + * \\brief A vector of StreamRole\n>   */\n>\n> -/**\n> - * \\fn StreamUsage::size()\n> - * \\brief Retrieve desired size\n> - * \\return The desired size\n> - */\n> -\n> -/**\n> - * \\brief Create a stream usage\n> - * \\param[in] role Stream role\n> - */\n> -StreamUsage::StreamUsage(Role role)\n> -\t: role_(role)\n> -{\n> -}\n> -\n> -/**\n> - * \\brief Create a stream usage with a desired size\n> - * \\param[in] role Stream role\n> - * \\param[in] size The desired size\n> - */\n> -StreamUsage::StreamUsage(Role role, const Size &size)\n> -\t: role_(role), size_(size)\n> -{\n> -}\n> -\n>  /**\n>   * \\class Stream\n>   * \\brief Video stream for a camera\n> @@ -148,39 +118,6 @@ StreamUsage::StreamUsage(Role role, const Size &size)\n>   * optimal stream for the task.\n>   */\n>\n> -/**\n> - * \\class Stream::StillCapture\n> - * \\brief Describe a still capture usage\n> - */\n> -Stream::StillCapture::StillCapture()\n> -\t: StreamUsage(Role::StillCapture)\n> -{\n> -}\n> -\n> -/**\n> - * \\class Stream::VideoRecording\n> - * \\brief Describe a video recording usage\n> - */\n> -Stream::VideoRecording::VideoRecording()\n> -\t: StreamUsage(Role::VideoRecording)\n> -{\n> -}\n> -\n> -/**\n> - * \\class Stream::Viewfinder\n> - * \\brief Describe a viewfinder usage\n> - */\n> -\n> -/**\n> - * \\brief Create a viewfinder usage with a desired dimension\n> - * \\param[in] width The desired viewfinder width\n> - * \\param[in] height The desired viewfinder height\n> - */\n> -Stream::Viewfinder::Viewfinder(int width, int height)\n> -\t: StreamUsage(Role::Viewfinder, Size(width, height))\n> -{\n> -}\n> -\n>  /**\n>   * \\brief Construct a stream with default parameters\n>   */\n> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\n> index c91b82727ec6..a984aaca764f 100644\n> --- a/src/qcam/main_window.cpp\n> +++ b/src/qcam/main_window.cpp\n> @@ -97,7 +97,7 @@ int MainWindow::startCapture()\n>  {\n>  \tint ret;\n>\n> -\tconfig_ = camera_->generateConfiguration({ Stream::VideoRecording() });\n> +\tconfig_ = camera_->generateConfiguration({ StreamRole::VideoRecording });\n>  \tStream *stream = config_.front();\n>  \tret = camera_->configure(config_);\n>  \tif (ret < 0) {\n> diff --git a/test/camera/capture.cpp b/test/camera/capture.cpp\n> index bc3a4d6cb9f2..e7e6438203b9 100644\n> --- a/test/camera/capture.cpp\n> +++ b/test/camera/capture.cpp\n> @@ -43,7 +43,7 @@ protected:\n>  \tint run()\n>  \t{\n>  \t\tCameraConfiguration config =\n> -\t\t\tcamera_->generateConfiguration({ Stream::VideoRecording() });\n> +\t\t\tcamera_->generateConfiguration({ StreamRole::VideoRecording });\n>  \t\tStream *stream = config.front();\n>  \t\tStreamConfiguration *cfg = &config[stream];\n>\n> diff --git a/test/camera/configuration_default.cpp b/test/camera/configuration_default.cpp\n> index 340b5f58f04c..8c4a03db498a 100644\n> --- a/test/camera/configuration_default.cpp\n> +++ b/test/camera/configuration_default.cpp\n> @@ -21,7 +21,7 @@ protected:\n>  \t\tCameraConfiguration config;\n>\n>  \t\t/* Test asking for configuration for a video stream. */\n> -\t\tconfig = camera_->generateConfiguration({ Stream::VideoRecording() });\n> +\t\tconfig = camera_->generateConfiguration({ StreamRole::VideoRecording });\n>  \t\tif (!config.isValid()) {\n>  \t\t\tcout << \"Default configuration invalid\" << endl;\n>  \t\t\treturn TestFail;\n> @@ -29,11 +29,11 @@ protected:\n>\n>  \t\t/*\n>  \t\t * Test that asking for configuration for an empty array of\n> -\t\t * stream usages returns an empty list of configurations.\n> +\t\t * stream roles returns an empty list of configurations.\n>  \t\t */\n>  \t\tconfig = camera_->generateConfiguration({});\n>  \t\tif (config.isValid()) {\n> -\t\t\tcout << \"Failed to retrieve configuration for empty usage list\"\n> +\t\t\tcout << \"Failed to retrieve configuration for empty roles list\"\n>  \t\t\t     << endl;\n>  \t\t\treturn TestFail;\n>  \t\t}\n> diff --git a/test/camera/configuration_set.cpp b/test/camera/configuration_set.cpp\n> index 24d5ca6690b7..76d8bc3e40a4 100644\n> --- a/test/camera/configuration_set.cpp\n> +++ b/test/camera/configuration_set.cpp\n> @@ -19,7 +19,7 @@ protected:\n>  \tint run()\n>  \t{\n>  \t\tCameraConfiguration config =\n> -\t\t\tcamera_->generateConfiguration({ Stream::VideoRecording() });\n> +\t\t\tcamera_->generateConfiguration({ StreamRole::VideoRecording });\n>  \t\tStreamConfiguration *cfg = &config[config.front()];\n>\n>  \t\tif (!config.isValid()) {\n> diff --git a/test/camera/statemachine.cpp b/test/camera/statemachine.cpp\n> index bd2e61ff2939..7a74cd85a37a 100644\n> --- a/test/camera/statemachine.cpp\n> +++ b/test/camera/statemachine.cpp\n> @@ -235,7 +235,7 @@ protected:\n>\n>  \tint run()\n>  \t{\n> -\t\tdefconf_ = camera_->generateConfiguration({ Stream::VideoRecording() });\n> +\t\tdefconf_ = camera_->generateConfiguration({ StreamRole::VideoRecording });\n>\n>  \t\tif (testAvailable() != TestPass) {\n>  \t\t\tcout << \"State machine in Available state failed\" << endl;\n> --\n> Regards,\n>\n> Laurent Pinchart\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<jacopo@jmondi.org>","Received":["from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net\n\t[217.70.183.195])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7115460C40\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 21 May 2019 21:49:49 +0200 (CEST)","from uno.localdomain (2-224-242-101.ip172.fastwebnet.it\n\t[2.224.242.101]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay3-d.mail.gandi.net (Postfix) with ESMTPSA id D94B360008;\n\tTue, 21 May 2019 19:49:48 +0000 (UTC)"],"X-Originating-IP":"2.224.242.101","Date":"Tue, 21 May 2019 21:50:50 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190521195041.g6qainh2hvc67alj@uno.localdomain>","References":"<20190521192740.28112-1-laurent.pinchart@ideasonboard.com>\n\t<20190521192740.28112-3-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"qyxoztzyi7ooqt3k\"","Content-Disposition":"inline","In-Reply-To":"<20190521192740.28112-3-laurent.pinchart@ideasonboard.com>","User-Agent":"NeoMutt/20180716","Subject":"Re: [libcamera-devel] [PATCH v3 2/6] libcamera: Use stream roles\n\tdirectly instead of StreamUsage","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":"Tue, 21 May 2019 19:49:49 -0000"}}]