[{"id":13760,"web_url":"https://patchwork.libcamera.org/comment/13760/","msgid":"<CAHW6GY+WNPspTUavzQMXHDb_faiNR6o8nV9o_v1Y1SqNQnp=zQ@mail.gmail.com>","date":"2020-11-17T16:33:46","subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: pipeline: Pass\n\tlibcamera controls into pipeline_handler::start()","submitter":{"id":42,"url":"https://patchwork.libcamera.org/api/people/42/","name":"David Plowman","email":"david.plowman@raspberrypi.com"},"content":"Hi Naush\n\nThanks for the patch - no particular comments on these first code\nchanges. I've been running with these for a while now and everything\nstill builds and runs fine. (Obviously I'm only testing the Raspberry\nPi platform, though I do build them all.)\n\nReviewed-by: David Plowman <david.plowman@raspberrypi.com>\nTested-by: David Plowman <david.plowman@raspberrypi.com>\n\nBest regards\nDavid\n\nOn Thu, 12 Nov 2020 at 08:59, Naushir Patuck <naush@raspberrypi.com> wrote:\n>\n> Applications now have the ability to pass in controls that need to be\n> applied on startup, rather than doing it through Request where there might\n> be some frames of delay in getting the controls applied.\n>\n> This commit adds the ability to pass in a set of libcamera controls into\n> the pipeline handlers through the pipeline_handler::start() method. These\n> controls are provided by the application through the camera::start()\n> public API.\n>\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> ---\n>  Documentation/guides/pipeline-handler.rst          |  4 ++--\n>  include/libcamera/camera.h                         |  2 +-\n>  include/libcamera/internal/pipeline_handler.h      |  2 +-\n>  src/libcamera/camera.cpp                           | 11 ++++++-----\n>  src/libcamera/pipeline/ipu3/ipu3.cpp               |  4 ++--\n>  src/libcamera/pipeline/raspberrypi/raspberrypi.cpp |  4 ++--\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp           |  4 ++--\n>  src/libcamera/pipeline/simple/simple.cpp           |  4 ++--\n>  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp       |  4 ++--\n>  src/libcamera/pipeline/vimc/vimc.cpp               |  4 ++--\n>  src/libcamera/pipeline_handler.cpp                 |  1 +\n>  11 files changed, 23 insertions(+), 21 deletions(-)\n>\n> diff --git a/Documentation/guides/pipeline-handler.rst b/Documentation/guides/pipeline-handler.rst\n> index 57aee455..63275a12 100644\n> --- a/Documentation/guides/pipeline-handler.rst\n> +++ b/Documentation/guides/pipeline-handler.rst\n> @@ -209,7 +209,7 @@ methods for the overridden class members.\n>            int exportFrameBuffers(Camera *camera, Stream *stream,\n>            std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>\n> -          int start(Camera *camera) override;\n> +          int start(Camera *camera, ControlList *controls) override;\n>            void stop(Camera *camera) override;\n>\n>            int queueRequestDevice(Camera *camera, Request *request) override;\n> @@ -239,7 +239,7 @@ methods for the overridden class members.\n>            return -1;\n>     }\n>\n> -   int PipelineHandlerVivid::start(Camera *camera)\n> +   int PipelineHandlerVivid::start(Camera *camera, ControlList *controls)\n>     {\n>            return -1;\n>     }\n> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> index 5c5f1a05..f94f8599 100644\n> --- a/include/libcamera/camera.h\n> +++ b/include/libcamera/camera.h\n> @@ -103,7 +103,7 @@ public:\n>         std::unique_ptr<Request> createRequest(uint64_t cookie = 0);\n>         int queueRequest(Request *request);\n>\n> -       int start();\n> +       int start(ControlList *controls = nullptr);\n>         int stop();\n>\n>  private:\n> diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h\n> index c12c8904..bd3c4a81 100644\n> --- a/include/libcamera/internal/pipeline_handler.h\n> +++ b/include/libcamera/internal/pipeline_handler.h\n> @@ -78,7 +78,7 @@ public:\n>         virtual int exportFrameBuffers(Camera *camera, Stream *stream,\n>                                        std::vector<std::unique_ptr<FrameBuffer>> *buffers) = 0;\n>\n> -       virtual int start(Camera *camera) = 0;\n> +       virtual int start(Camera *camera, ControlList *controls) = 0;\n>         virtual void stop(Camera *camera) = 0;\n>\n>         int queueRequest(Camera *camera, Request *request);\n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index dffbd6bd..de9c6c86 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -943,9 +943,10 @@ int Camera::queueRequest(Request *request)\n>  /**\n>   * \\brief Start capture from camera\n>   *\n> - * Start the camera capture session. Once the camera is started the application\n> - * can queue requests to the camera to process and return to the application\n> - * until the capture session is terminated with \\a stop().\n> + * Start the camera capture session, optionally providing a list of controls to\n> + * action before starting. Once the camera is started the application can queue\n> + * requests to the camera to process and return to the application until the\n> + * capture session is terminated with \\a stop().\n>   *\n>   * \\context This function may only be called when the camera is in the\n>   * Configured state as defined in \\ref camera_operation, and shall be\n> @@ -956,7 +957,7 @@ int Camera::queueRequest(Request *request)\n>   * \\retval -ENODEV The camera has been disconnected from the system\n>   * \\retval -EACCES The camera is not in a state where it can be started\n>   */\n> -int Camera::start()\n> +int Camera::start(ControlList *controls)\n>  {\n>         Private *const d = LIBCAMERA_D_PTR();\n>\n> @@ -967,7 +968,7 @@ int Camera::start()\n>         LOG(Camera, Debug) << \"Starting capture\";\n>\n>         ret = d->pipe_->invokeMethod(&PipelineHandler::start,\n> -                                    ConnectionTypeBlocking, this);\n> +                                    ConnectionTypeBlocking, this, controls);\n>         if (ret)\n>                 return ret;\n>\n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index 4cedb32b..8a1918d5 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -105,7 +105,7 @@ public:\n>         int exportFrameBuffers(Camera *camera, Stream *stream,\n>                                std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>\n> -       int start(Camera *camera) override;\n> +       int start(Camera *camera, ControlList *controls) override;\n>         void stop(Camera *camera) override;\n>\n>         int queueRequestDevice(Camera *camera, Request *request) override;\n> @@ -596,7 +596,7 @@ int PipelineHandlerIPU3::freeBuffers(Camera *camera)\n>         return 0;\n>  }\n>\n> -int PipelineHandlerIPU3::start(Camera *camera)\n> +int PipelineHandlerIPU3::start(Camera *camera, [[maybe_unused]] ControlList *controls)\n>  {\n>         IPU3CameraData *data = cameraData(camera);\n>         CIO2Device *cio2 = &data->cio2_;\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index 7ad66f21..ddb30e49 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -237,7 +237,7 @@ public:\n>         int exportFrameBuffers(Camera *camera, Stream *stream,\n>                                std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>\n> -       int start(Camera *camera) override;\n> +       int start(Camera *camera, ControlList *controls) override;\n>         void stop(Camera *camera) override;\n>\n>         int queueRequestDevice(Camera *camera, Request *request) override;\n> @@ -726,7 +726,7 @@ int PipelineHandlerRPi::exportFrameBuffers([[maybe_unused]] Camera *camera, Stre\n>         return ret;\n>  }\n>\n> -int PipelineHandlerRPi::start(Camera *camera)\n> +int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]] ControlList *controls)\n>  {\n>         RPiCameraData *data = cameraData(camera);\n>         int ret;\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 1b1922a9..2e8d2930 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -187,7 +187,7 @@ public:\n>         int exportFrameBuffers(Camera *camera, Stream *stream,\n>                                std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>\n> -       int start(Camera *camera) override;\n> +       int start(Camera *camera, ControlList *controls) override;\n>         void stop(Camera *camera) override;\n>\n>         int queueRequestDevice(Camera *camera, Request *request) override;\n> @@ -822,7 +822,7 @@ int PipelineHandlerRkISP1::freeBuffers(Camera *camera)\n>         return 0;\n>  }\n>\n> -int PipelineHandlerRkISP1::start(Camera *camera)\n> +int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] ControlList *controls)\n>  {\n>         RkISP1CameraData *data = cameraData(camera);\n>         int ret;\n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index 0d3078f7..b047aeb9 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -126,7 +126,7 @@ public:\n>         int exportFrameBuffers(Camera *camera, Stream *stream,\n>                                std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>\n> -       int start(Camera *camera) override;\n> +       int start(Camera *camera, ControlList *controls) override;\n>         void stop(Camera *camera) override;\n>\n>         bool match(DeviceEnumerator *enumerator) override;\n> @@ -646,7 +646,7 @@ int SimplePipelineHandler::exportFrameBuffers(Camera *camera, Stream *stream,\n>                 return data->video_->exportBuffers(count, buffers);\n>  }\n>\n> -int SimplePipelineHandler::start(Camera *camera)\n> +int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] ControlList *controls)\n>  {\n>         SimpleCameraData *data = cameraData(camera);\n>         V4L2VideoDevice *video = data->video_;\n> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> index 0f3241cc..87b0f03d 100644\n> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> @@ -76,7 +76,7 @@ public:\n>         int exportFrameBuffers(Camera *camera, Stream *stream,\n>                                std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>\n> -       int start(Camera *camera) override;\n> +       int start(Camera *camera, ControlList *controls) override;\n>         void stop(Camera *camera) override;\n>\n>         int queueRequestDevice(Camera *camera, Request *request) override;\n> @@ -236,7 +236,7 @@ int PipelineHandlerUVC::exportFrameBuffers(Camera *camera, Stream *stream,\n>         return data->video_->exportBuffers(count, buffers);\n>  }\n>\n> -int PipelineHandlerUVC::start(Camera *camera)\n> +int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] ControlList *controls)\n>  {\n>         UVCCameraData *data = cameraData(camera);\n>         unsigned int count = data->stream_.configuration().bufferCount;\n> diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\n> index 914b6b54..d81b8598 100644\n> --- a/src/libcamera/pipeline/vimc/vimc.cpp\n> +++ b/src/libcamera/pipeline/vimc/vimc.cpp\n> @@ -92,7 +92,7 @@ public:\n>         int exportFrameBuffers(Camera *camera, Stream *stream,\n>                                std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>\n> -       int start(Camera *camera) override;\n> +       int start(Camera *camera, ControlList *controls) override;\n>         void stop(Camera *camera) override;\n>\n>         int queueRequestDevice(Camera *camera, Request *request) override;\n> @@ -313,7 +313,7 @@ int PipelineHandlerVimc::exportFrameBuffers(Camera *camera, Stream *stream,\n>         return data->video_->exportBuffers(count, buffers);\n>  }\n>\n> -int PipelineHandlerVimc::start(Camera *camera)\n> +int PipelineHandlerVimc::start(Camera *camera, [[maybe_unused]] ControlList *controls)\n>  {\n>         VimcCameraData *data = cameraData(camera);\n>         unsigned int count = data->stream_.configuration().bufferCount;\n> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\n> index 894200ee..bafcf21b 100644\n> --- a/src/libcamera/pipeline_handler.cpp\n> +++ b/src/libcamera/pipeline_handler.cpp\n> @@ -351,6 +351,7 @@ const ControlList &PipelineHandler::properties(const Camera *camera) const\n>   * \\fn PipelineHandler::start()\n>   * \\brief Start capturing from a group of streams\n>   * \\param[in] camera The camera to start\n> + * \\param[in] controls Controls for the IPA to action before starting the camera\n>   *\n>   * Start the group of streams that have been configured for capture by\n>   * \\a configure(). The intended caller of this method is the Camera class which\n> --\n> 2.25.1\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 8D522BE082\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 17 Nov 2020 16:34:00 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id F3D1A63325;\n\tTue, 17 Nov 2020 17:33:59 +0100 (CET)","from mail-oi1-x233.google.com (mail-oi1-x233.google.com\n\t[IPv6:2607:f8b0:4864:20::233])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 65C446033B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 17 Nov 2020 17:33:58 +0100 (CET)","by mail-oi1-x233.google.com with SMTP id m13so23202236oih.8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 17 Nov 2020 08:33:58 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"iTXc3/qi\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=wE3mIelathmUDhY9ikCvN4szKqBG3ThBolNVuypLJkI=;\n\tb=iTXc3/qiE4flsWVJk/pXjFK2awWyUEQHw8Nqj5ohfTAdCtUMv0jxY3mBhjSqDFaLXy\n\tovxVwYZQi74ynWFgH0eb2wx2NpE+DZnP71OSW20Wc1o+vkTJco4GxL4qrYsmo6mpULAZ\n\tIgInW9UHUQKP3BNdsfq/ZWeHWRkYDDbZrmhvAafHlJEEu2tgOOSEnW2S5/Fuk+iRQd7B\n\tDm8H1v0FYuiewSXAycTm9fqrMukI/ymXKhCExo92p8fnLYHHZDHu3705eDRGhixEPV7s\n\tQqkTAK4SOVkNGzGZ10ObgpQgzvvEpjtGJ1GnOjZbGG0LYxztlEHkMuNfgfsJWLjuRSnP\n\tvCAQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=wE3mIelathmUDhY9ikCvN4szKqBG3ThBolNVuypLJkI=;\n\tb=quc4yHtN/EvGPG17THdRSJMXXO5OBgeYmqXj+9s+R72VE7/1vS3qmXbTN2ILVh+6wf\n\thkUrC0SzO/xhrgPeZjZRQQxvO1bZP8G/TwdpcAiJK1EAUlVuVTpsX82/nesnR+3y9bjT\n\tusYzI9r0+VY5kUte3eybxmOQRY4OgFOLODifWfWWjvSu4NN2+yoBr9wpUUwZbIHN+mr8\n\tjBabzUTQUga1qIQWfJHu6pbJHMJYTBCrfb6AQrn816IE6RSAlQcwAJv39nuJpYhxVExs\n\tNEt9UP9XDrrwwHeKqQX1mfxi2CD7VBePO/bcKoL2orbl1MZp51Z+eixyBervJMmT94lP\n\t0ljA==","X-Gm-Message-State":"AOAM531z1IRmU9RtPMeZgTDLNgeT+VNI2ndlzPWF772NPM8VANgV+N8L\n\tRamyRY1b3MxRujXVqpk606QiZQoD3yxroTDgRg9k6w==","X-Google-Smtp-Source":"ABdhPJxPJFNSguVVo+4r+Ul/1VUoFr81yeeQDvBTvtepNWJ42MN5b16zjfh1E7wg2LLj8Dwnlm0NUQcA6ySYzo1EuqE=","X-Received":"by 2002:aca:c589:: with SMTP id\n\tv131mr2693025oif.55.1605630836877; \n\tTue, 17 Nov 2020 08:33:56 -0800 (PST)","MIME-Version":"1.0","References":"<20201112085915.3053-1-naush@raspberrypi.com>\n\t<20201112085915.3053-2-naush@raspberrypi.com>","In-Reply-To":"<20201112085915.3053-2-naush@raspberrypi.com>","From":"David Plowman <david.plowman@raspberrypi.com>","Date":"Tue, 17 Nov 2020 16:33:46 +0000","Message-ID":"<CAHW6GY+WNPspTUavzQMXHDb_faiNR6o8nV9o_v1Y1SqNQnp=zQ@mail.gmail.com>","To":"Naushir Patuck <naush@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: pipeline: Pass\n\tlibcamera controls into pipeline_handler::start()","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","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>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13777,"web_url":"https://patchwork.libcamera.org/comment/13777/","msgid":"<5c1409d0-789d-5fec-d0cb-f44faec2dccf@uajain.com>","date":"2020-11-18T13:16:07","subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: pipeline: Pass\n\tlibcamera controls into pipeline_handler::start()","submitter":{"id":1,"url":"https://patchwork.libcamera.org/api/people/1/","name":"Umang Jain","email":"email@uajain.com"},"content":"Hi Naush,\n\nOn 11/12/20 2:29 PM, Naushir Patuck wrote:\n> Applications now have the ability to pass in controls that need to be\n> applied on startup, rather than doing it through Request where there might\n> be some frames of delay in getting the controls applied.\n>\n> This commit adds the ability to pass in a set of libcamera controls into\n> the pipeline handlers through the pipeline_handler::start() method. These\n> controls are provided by the application through the camera::start()\n> public API.\nIs there a possiblity that the controls are passed in through \nCamera::configure() that will subsequently call \nPipeHandler::configure()? Looking at the way Requests use ControlList, \nit seems there is also a 'validator' that can(/should?) be used with \nthis API. *IF* we take that into account, then it feels like \nCamera::configure() is a good place for passing in ControlsList, rather \nthan Camera::start()\n\nThis is just a quick comment / line of thought. I haven't actually dug \ndeep into the Request/ControlsList code at this very moment.\n\nThanks!\n>\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> ---\n>   Documentation/guides/pipeline-handler.rst          |  4 ++--\n>   include/libcamera/camera.h                         |  2 +-\n>   include/libcamera/internal/pipeline_handler.h      |  2 +-\n>   src/libcamera/camera.cpp                           | 11 ++++++-----\n>   src/libcamera/pipeline/ipu3/ipu3.cpp               |  4 ++--\n>   src/libcamera/pipeline/raspberrypi/raspberrypi.cpp |  4 ++--\n>   src/libcamera/pipeline/rkisp1/rkisp1.cpp           |  4 ++--\n>   src/libcamera/pipeline/simple/simple.cpp           |  4 ++--\n>   src/libcamera/pipeline/uvcvideo/uvcvideo.cpp       |  4 ++--\n>   src/libcamera/pipeline/vimc/vimc.cpp               |  4 ++--\n>   src/libcamera/pipeline_handler.cpp                 |  1 +\n>   11 files changed, 23 insertions(+), 21 deletions(-)\n>\n> diff --git a/Documentation/guides/pipeline-handler.rst b/Documentation/guides/pipeline-handler.rst\n> index 57aee455..63275a12 100644\n> --- a/Documentation/guides/pipeline-handler.rst\n> +++ b/Documentation/guides/pipeline-handler.rst\n> @@ -209,7 +209,7 @@ methods for the overridden class members.\n>             int exportFrameBuffers(Camera *camera, Stream *stream,\n>             std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>   \n> -          int start(Camera *camera) override;\n> +          int start(Camera *camera, ControlList *controls) override;\n>             void stop(Camera *camera) override;\n>   \n>             int queueRequestDevice(Camera *camera, Request *request) override;\n> @@ -239,7 +239,7 @@ methods for the overridden class members.\n>             return -1;\n>      }\n>   \n> -   int PipelineHandlerVivid::start(Camera *camera)\n> +   int PipelineHandlerVivid::start(Camera *camera, ControlList *controls)\n>      {\n>             return -1;\n>      }\n> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> index 5c5f1a05..f94f8599 100644\n> --- a/include/libcamera/camera.h\n> +++ b/include/libcamera/camera.h\n> @@ -103,7 +103,7 @@ public:\n>   \tstd::unique_ptr<Request> createRequest(uint64_t cookie = 0);\n>   \tint queueRequest(Request *request);\n>   \n> -\tint start();\n> +\tint start(ControlList *controls = nullptr);\n>   \tint stop();\n>   \n>   private:\n> diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h\n> index c12c8904..bd3c4a81 100644\n> --- a/include/libcamera/internal/pipeline_handler.h\n> +++ b/include/libcamera/internal/pipeline_handler.h\n> @@ -78,7 +78,7 @@ public:\n>   \tvirtual int exportFrameBuffers(Camera *camera, Stream *stream,\n>   \t\t\t\t       std::vector<std::unique_ptr<FrameBuffer>> *buffers) = 0;\n>   \n> -\tvirtual int start(Camera *camera) = 0;\n> +\tvirtual int start(Camera *camera, ControlList *controls) = 0;\n>   \tvirtual void stop(Camera *camera) = 0;\n>   \n>   \tint queueRequest(Camera *camera, Request *request);\n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index dffbd6bd..de9c6c86 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -943,9 +943,10 @@ int Camera::queueRequest(Request *request)\n>   /**\n>    * \\brief Start capture from camera\n>    *\n> - * Start the camera capture session. Once the camera is started the application\n> - * can queue requests to the camera to process and return to the application\n> - * until the capture session is terminated with \\a stop().\n> + * Start the camera capture session, optionally providing a list of controls to\n> + * action before starting. Once the camera is started the application can queue\n> + * requests to the camera to process and return to the application until the\n> + * capture session is terminated with \\a stop().\n>    *\n>    * \\context This function may only be called when the camera is in the\n>    * Configured state as defined in \\ref camera_operation, and shall be\n> @@ -956,7 +957,7 @@ int Camera::queueRequest(Request *request)\n>    * \\retval -ENODEV The camera has been disconnected from the system\n>    * \\retval -EACCES The camera is not in a state where it can be started\n>    */\n> -int Camera::start()\n> +int Camera::start(ControlList *controls)\n>   {\n>   \tPrivate *const d = LIBCAMERA_D_PTR();\n>   \n> @@ -967,7 +968,7 @@ int Camera::start()\n>   \tLOG(Camera, Debug) << \"Starting capture\";\n>   \n>   \tret = d->pipe_->invokeMethod(&PipelineHandler::start,\n> -\t\t\t\t     ConnectionTypeBlocking, this);\n> +\t\t\t\t     ConnectionTypeBlocking, this, controls);\n>   \tif (ret)\n>   \t\treturn ret;\n>   \n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index 4cedb32b..8a1918d5 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -105,7 +105,7 @@ public:\n>   \tint exportFrameBuffers(Camera *camera, Stream *stream,\n>   \t\t\t       std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>   \n> -\tint start(Camera *camera) override;\n> +\tint start(Camera *camera, ControlList *controls) override;\n>   \tvoid stop(Camera *camera) override;\n>   \n>   \tint queueRequestDevice(Camera *camera, Request *request) override;\n> @@ -596,7 +596,7 @@ int PipelineHandlerIPU3::freeBuffers(Camera *camera)\n>   \treturn 0;\n>   }\n>   \n> -int PipelineHandlerIPU3::start(Camera *camera)\n> +int PipelineHandlerIPU3::start(Camera *camera, [[maybe_unused]] ControlList *controls)\n>   {\n>   \tIPU3CameraData *data = cameraData(camera);\n>   \tCIO2Device *cio2 = &data->cio2_;\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index 7ad66f21..ddb30e49 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -237,7 +237,7 @@ public:\n>   \tint exportFrameBuffers(Camera *camera, Stream *stream,\n>   \t\t\t       std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>   \n> -\tint start(Camera *camera) override;\n> +\tint start(Camera *camera, ControlList *controls) override;\n>   \tvoid stop(Camera *camera) override;\n>   \n>   \tint queueRequestDevice(Camera *camera, Request *request) override;\n> @@ -726,7 +726,7 @@ int PipelineHandlerRPi::exportFrameBuffers([[maybe_unused]] Camera *camera, Stre\n>   \treturn ret;\n>   }\n>   \n> -int PipelineHandlerRPi::start(Camera *camera)\n> +int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]] ControlList *controls)\n>   {\n>   \tRPiCameraData *data = cameraData(camera);\n>   \tint ret;\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 1b1922a9..2e8d2930 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -187,7 +187,7 @@ public:\n>   \tint exportFrameBuffers(Camera *camera, Stream *stream,\n>   \t\t\t       std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>   \n> -\tint start(Camera *camera) override;\n> +\tint start(Camera *camera, ControlList *controls) override;\n>   \tvoid stop(Camera *camera) override;\n>   \n>   \tint queueRequestDevice(Camera *camera, Request *request) override;\n> @@ -822,7 +822,7 @@ int PipelineHandlerRkISP1::freeBuffers(Camera *camera)\n>   \treturn 0;\n>   }\n>   \n> -int PipelineHandlerRkISP1::start(Camera *camera)\n> +int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] ControlList *controls)\n>   {\n>   \tRkISP1CameraData *data = cameraData(camera);\n>   \tint ret;\n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index 0d3078f7..b047aeb9 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -126,7 +126,7 @@ public:\n>   \tint exportFrameBuffers(Camera *camera, Stream *stream,\n>   \t\t\t       std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>   \n> -\tint start(Camera *camera) override;\n> +\tint start(Camera *camera, ControlList *controls) override;\n>   \tvoid stop(Camera *camera) override;\n>   \n>   \tbool match(DeviceEnumerator *enumerator) override;\n> @@ -646,7 +646,7 @@ int SimplePipelineHandler::exportFrameBuffers(Camera *camera, Stream *stream,\n>   \t\treturn data->video_->exportBuffers(count, buffers);\n>   }\n>   \n> -int SimplePipelineHandler::start(Camera *camera)\n> +int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] ControlList *controls)\n>   {\n>   \tSimpleCameraData *data = cameraData(camera);\n>   \tV4L2VideoDevice *video = data->video_;\n> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> index 0f3241cc..87b0f03d 100644\n> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> @@ -76,7 +76,7 @@ public:\n>   \tint exportFrameBuffers(Camera *camera, Stream *stream,\n>   \t\t\t       std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>   \n> -\tint start(Camera *camera) override;\n> +\tint start(Camera *camera, ControlList *controls) override;\n>   \tvoid stop(Camera *camera) override;\n>   \n>   \tint queueRequestDevice(Camera *camera, Request *request) override;\n> @@ -236,7 +236,7 @@ int PipelineHandlerUVC::exportFrameBuffers(Camera *camera, Stream *stream,\n>   \treturn data->video_->exportBuffers(count, buffers);\n>   }\n>   \n> -int PipelineHandlerUVC::start(Camera *camera)\n> +int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] ControlList *controls)\n>   {\n>   \tUVCCameraData *data = cameraData(camera);\n>   \tunsigned int count = data->stream_.configuration().bufferCount;\n> diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\n> index 914b6b54..d81b8598 100644\n> --- a/src/libcamera/pipeline/vimc/vimc.cpp\n> +++ b/src/libcamera/pipeline/vimc/vimc.cpp\n> @@ -92,7 +92,7 @@ public:\n>   \tint exportFrameBuffers(Camera *camera, Stream *stream,\n>   \t\t\t       std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>   \n> -\tint start(Camera *camera) override;\n> +\tint start(Camera *camera, ControlList *controls) override;\n>   \tvoid stop(Camera *camera) override;\n>   \n>   \tint queueRequestDevice(Camera *camera, Request *request) override;\n> @@ -313,7 +313,7 @@ int PipelineHandlerVimc::exportFrameBuffers(Camera *camera, Stream *stream,\n>   \treturn data->video_->exportBuffers(count, buffers);\n>   }\n>   \n> -int PipelineHandlerVimc::start(Camera *camera)\n> +int PipelineHandlerVimc::start(Camera *camera, [[maybe_unused]] ControlList *controls)\n>   {\n>   \tVimcCameraData *data = cameraData(camera);\n>   \tunsigned int count = data->stream_.configuration().bufferCount;\n> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\n> index 894200ee..bafcf21b 100644\n> --- a/src/libcamera/pipeline_handler.cpp\n> +++ b/src/libcamera/pipeline_handler.cpp\n> @@ -351,6 +351,7 @@ const ControlList &PipelineHandler::properties(const Camera *camera) const\n>    * \\fn PipelineHandler::start()\n>    * \\brief Start capturing from a group of streams\n>    * \\param[in] camera The camera to start\n> + * \\param[in] controls Controls for the IPA to action before starting the camera\n>    *\n>    * Start the group of streams that have been configured for capture by\n>    * \\a configure(). The intended caller of this method is the Camera class which","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 85CCBBE176\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 18 Nov 2020 13:16:13 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 517F86156B;\n\tWed, 18 Nov 2020 14:16:13 +0100 (CET)","from mail.uajain.com (static.126.159.217.95.clients.your-server.de\n\t[95.217.159.126])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7A35661565\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 18 Nov 2020 14:16:11 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=uajain.com header.i=@uajain.com\n\theader.b=\"De+owrn7\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=uajain.com; s=mail;\n\tt=1605705371; bh=tD7IZ9EAm4vbGt0uZojTQv0WIi5llP7HdFU+PaM6hrU=;\n\th=Subject:To:References:From:In-Reply-To;\n\tb=De+owrn7HB5GqFIDiMF3BRBNkKLDANNcbHcMey7uPaJ+Gy37nB+V1sM4keHgTAkOp\n\tH+3mO3/yi/qbU7ThJ+cJOS2OUcRsyjIsbUYgg+M680GcxXSDmzvkiarPpaeTKUDMfA\n\tIpE0xqXsFpbj7KnI+kLU/0yxtDhN1c5on6+OU15+GpmcOntVn9oRAvFxHA0VRTxw09\n\tBeXCIvJVUOGpDujTf4wIVETG4ZYnzfyIgpLy6XcKxPAEfMLyOcHlYnQ4QlZycA+vIF\n\tydQuI+V+AE1ZNthsVAjS4+X98rtE0d7YaGNGK/zsGpeP8dWQtBA4UcfWprmjgeZ67j\n\tFsqPV6kjOQdKw==","To":"libcamera-devel@lists.libcamera.org","References":"<20201112085915.3053-1-naush@raspberrypi.com>\n\t<20201112085915.3053-2-naush@raspberrypi.com>","From":"Umang Jain <email@uajain.com>","Message-ID":"<5c1409d0-789d-5fec-d0cb-f44faec2dccf@uajain.com>","Date":"Wed, 18 Nov 2020 18:46:07 +0530","Mime-Version":"1.0","In-Reply-To":"<20201112085915.3053-2-naush@raspberrypi.com>","Content-Language":"en-US","Subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: pipeline: Pass\n\tlibcamera controls into pipeline_handler::start()","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","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>","Content-Transfer-Encoding":"7bit","Content-Type":"text/plain; charset=\"us-ascii\"; Format=\"flowed\"","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13782,"web_url":"https://patchwork.libcamera.org/comment/13782/","msgid":"<CAEmqJPpdDTLaJY=0puwLLUF2anzRiT2mkzWzbdJoWnLRXKb7dQ@mail.gmail.com>","date":"2020-11-18T13:26:26","subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: pipeline: Pass\n\tlibcamera controls into pipeline_handler::start()","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Umang,\n\n\nOn Wed, 18 Nov 2020 at 13:16, Umang Jain <email@uajain.com> wrote:\n\n> Hi Naush,\n>\n> On 11/12/20 2:29 PM, Naushir Patuck wrote:\n> > Applications now have the ability to pass in controls that need to be\n> > applied on startup, rather than doing it through Request where there\n> might\n> > be some frames of delay in getting the controls applied.\n> >\n> > This commit adds the ability to pass in a set of libcamera controls into\n> > the pipeline handlers through the pipeline_handler::start() method. These\n> > controls are provided by the application through the camera::start()\n> > public API.\n> Is there a possiblity that the controls are passed in through\n> Camera::configure() that will subsequently call\n> PipeHandler::configure()? Looking at the way Requests use ControlList,\n> it seems there is also a 'validator' that can(/should?) be used with\n> this API. *IF* we take that into account, then it feels like\n> Camera::configure() is a good place for passing in ControlsList, rather\n> than Camera::start()\n>\n> This is just a quick comment / line of thought. I haven't actually dug\n> deep into the Request/ControlsList code at this very moment.\n>\n\nIndeed this was an option that we considered.  However, there are some\nusage issues with passing in controls on configure().  Below is an extract\nfrom an earlier conversion with Kieran on this topic:\n\nOn Mon, 19 Oct 2020 at 15:01, Kieran Bingham <\nkieran.bingham@ideasonboard.com> wrote:\n\n> Then when a pipeline is called with configure(), it needs to apply any\n> controls in the list at that point. And it looks like the\n> CameraConfiguration is already passed through to:\n>\n> int RPiCameraData::configureIPA(const CameraConfiguration *config)\n>\n> So, then there is the information required at that phase too?\n>\n> I'm wondering if I've missed something obvious that would have prevented\n> you from already using this approach?\n>\n\nIndeed, this was one of the approaches we discussed some time back.\nHowever, as you mentioned, CameraConfiguration gets set in the\ncamera->configure() phase, and this may not necessarily be what we want.\nAn application may want to set startup parameters without doing a\ncamera->configure() in a run.  With this change, we would do a sequence\nlike start(), stop() start(new config parameters).  If we were to do start(),\nstop() configure(new config parameters), start(), it may incur additional\noverheads in calling configure() only to setup some new startup params,\nwhere the configure() might be going to the kernel and calling the sensors\nto set itself up again, even though it is not needed.  Hope that makes\nsense?\n\nRegards,\nNaush\n\n\n\n>\n> Thanks!\n> >\n> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> > ---\n> >   Documentation/guides/pipeline-handler.rst          |  4 ++--\n> >   include/libcamera/camera.h                         |  2 +-\n> >   include/libcamera/internal/pipeline_handler.h      |  2 +-\n> >   src/libcamera/camera.cpp                           | 11 ++++++-----\n> >   src/libcamera/pipeline/ipu3/ipu3.cpp               |  4 ++--\n> >   src/libcamera/pipeline/raspberrypi/raspberrypi.cpp |  4 ++--\n> >   src/libcamera/pipeline/rkisp1/rkisp1.cpp           |  4 ++--\n> >   src/libcamera/pipeline/simple/simple.cpp           |  4 ++--\n> >   src/libcamera/pipeline/uvcvideo/uvcvideo.cpp       |  4 ++--\n> >   src/libcamera/pipeline/vimc/vimc.cpp               |  4 ++--\n> >   src/libcamera/pipeline_handler.cpp                 |  1 +\n> >   11 files changed, 23 insertions(+), 21 deletions(-)\n> >\n> > diff --git a/Documentation/guides/pipeline-handler.rst\n> b/Documentation/guides/pipeline-handler.rst\n> > index 57aee455..63275a12 100644\n> > --- a/Documentation/guides/pipeline-handler.rst\n> > +++ b/Documentation/guides/pipeline-handler.rst\n> > @@ -209,7 +209,7 @@ methods for the overridden class members.\n> >             int exportFrameBuffers(Camera *camera, Stream *stream,\n> >             std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n> >\n> > -          int start(Camera *camera) override;\n> > +          int start(Camera *camera, ControlList *controls) override;\n> >             void stop(Camera *camera) override;\n> >\n> >             int queueRequestDevice(Camera *camera, Request *request)\n> override;\n> > @@ -239,7 +239,7 @@ methods for the overridden class members.\n> >             return -1;\n> >      }\n> >\n> > -   int PipelineHandlerVivid::start(Camera *camera)\n> > +   int PipelineHandlerVivid::start(Camera *camera, ControlList\n> *controls)\n> >      {\n> >             return -1;\n> >      }\n> > diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n> > index 5c5f1a05..f94f8599 100644\n> > --- a/include/libcamera/camera.h\n> > +++ b/include/libcamera/camera.h\n> > @@ -103,7 +103,7 @@ public:\n> >       std::unique_ptr<Request> createRequest(uint64_t cookie = 0);\n> >       int queueRequest(Request *request);\n> >\n> > -     int start();\n> > +     int start(ControlList *controls = nullptr);\n> >       int stop();\n> >\n> >   private:\n> > diff --git a/include/libcamera/internal/pipeline_handler.h\n> b/include/libcamera/internal/pipeline_handler.h\n> > index c12c8904..bd3c4a81 100644\n> > --- a/include/libcamera/internal/pipeline_handler.h\n> > +++ b/include/libcamera/internal/pipeline_handler.h\n> > @@ -78,7 +78,7 @@ public:\n> >       virtual int exportFrameBuffers(Camera *camera, Stream *stream,\n> >\n> std::vector<std::unique_ptr<FrameBuffer>> *buffers) = 0;\n> >\n> > -     virtual int start(Camera *camera) = 0;\n> > +     virtual int start(Camera *camera, ControlList *controls) = 0;\n> >       virtual void stop(Camera *camera) = 0;\n> >\n> >       int queueRequest(Camera *camera, Request *request);\n> > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> > index dffbd6bd..de9c6c86 100644\n> > --- a/src/libcamera/camera.cpp\n> > +++ b/src/libcamera/camera.cpp\n> > @@ -943,9 +943,10 @@ int Camera::queueRequest(Request *request)\n> >   /**\n> >    * \\brief Start capture from camera\n> >    *\n> > - * Start the camera capture session. Once the camera is started the\n> application\n> > - * can queue requests to the camera to process and return to the\n> application\n> > - * until the capture session is terminated with \\a stop().\n> > + * Start the camera capture session, optionally providing a list of\n> controls to\n> > + * action before starting. Once the camera is started the application\n> can queue\n> > + * requests to the camera to process and return to the application\n> until the\n> > + * capture session is terminated with \\a stop().\n> >    *\n> >    * \\context This function may only be called when the camera is in the\n> >    * Configured state as defined in \\ref camera_operation, and shall be\n> > @@ -956,7 +957,7 @@ int Camera::queueRequest(Request *request)\n> >    * \\retval -ENODEV The camera has been disconnected from the system\n> >    * \\retval -EACCES The camera is not in a state where it can be started\n> >    */\n> > -int Camera::start()\n> > +int Camera::start(ControlList *controls)\n> >   {\n> >       Private *const d = LIBCAMERA_D_PTR();\n> >\n> > @@ -967,7 +968,7 @@ int Camera::start()\n> >       LOG(Camera, Debug) << \"Starting capture\";\n> >\n> >       ret = d->pipe_->invokeMethod(&PipelineHandler::start,\n> > -                                  ConnectionTypeBlocking, this);\n> > +                                  ConnectionTypeBlocking, this,\n> controls);\n> >       if (ret)\n> >               return ret;\n> >\n> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > index 4cedb32b..8a1918d5 100644\n> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > @@ -105,7 +105,7 @@ public:\n> >       int exportFrameBuffers(Camera *camera, Stream *stream,\n> >                              std::vector<std::unique_ptr<FrameBuffer>>\n> *buffers) override;\n> >\n> > -     int start(Camera *camera) override;\n> > +     int start(Camera *camera, ControlList *controls) override;\n> >       void stop(Camera *camera) override;\n> >\n> >       int queueRequestDevice(Camera *camera, Request *request) override;\n> > @@ -596,7 +596,7 @@ int PipelineHandlerIPU3::freeBuffers(Camera *camera)\n> >       return 0;\n> >   }\n> >\n> > -int PipelineHandlerIPU3::start(Camera *camera)\n> > +int PipelineHandlerIPU3::start(Camera *camera, [[maybe_unused]]\n> ControlList *controls)\n> >   {\n> >       IPU3CameraData *data = cameraData(camera);\n> >       CIO2Device *cio2 = &data->cio2_;\n> > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > index 7ad66f21..ddb30e49 100644\n> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > @@ -237,7 +237,7 @@ public:\n> >       int exportFrameBuffers(Camera *camera, Stream *stream,\n> >                              std::vector<std::unique_ptr<FrameBuffer>>\n> *buffers) override;\n> >\n> > -     int start(Camera *camera) override;\n> > +     int start(Camera *camera, ControlList *controls) override;\n> >       void stop(Camera *camera) override;\n> >\n> >       int queueRequestDevice(Camera *camera, Request *request) override;\n> > @@ -726,7 +726,7 @@ int\n> PipelineHandlerRPi::exportFrameBuffers([[maybe_unused]] Camera *camera, Stre\n> >       return ret;\n> >   }\n> >\n> > -int PipelineHandlerRPi::start(Camera *camera)\n> > +int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]]\n> ControlList *controls)\n> >   {\n> >       RPiCameraData *data = cameraData(camera);\n> >       int ret;\n> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> > index 1b1922a9..2e8d2930 100644\n> > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> > @@ -187,7 +187,7 @@ public:\n> >       int exportFrameBuffers(Camera *camera, Stream *stream,\n> >                              std::vector<std::unique_ptr<FrameBuffer>>\n> *buffers) override;\n> >\n> > -     int start(Camera *camera) override;\n> > +     int start(Camera *camera, ControlList *controls) override;\n> >       void stop(Camera *camera) override;\n> >\n> >       int queueRequestDevice(Camera *camera, Request *request) override;\n> > @@ -822,7 +822,7 @@ int PipelineHandlerRkISP1::freeBuffers(Camera\n> *camera)\n> >       return 0;\n> >   }\n> >\n> > -int PipelineHandlerRkISP1::start(Camera *camera)\n> > +int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]]\n> ControlList *controls)\n> >   {\n> >       RkISP1CameraData *data = cameraData(camera);\n> >       int ret;\n> > diff --git a/src/libcamera/pipeline/simple/simple.cpp\n> b/src/libcamera/pipeline/simple/simple.cpp\n> > index 0d3078f7..b047aeb9 100644\n> > --- a/src/libcamera/pipeline/simple/simple.cpp\n> > +++ b/src/libcamera/pipeline/simple/simple.cpp\n> > @@ -126,7 +126,7 @@ public:\n> >       int exportFrameBuffers(Camera *camera, Stream *stream,\n> >                              std::vector<std::unique_ptr<FrameBuffer>>\n> *buffers) override;\n> >\n> > -     int start(Camera *camera) override;\n> > +     int start(Camera *camera, ControlList *controls) override;\n> >       void stop(Camera *camera) override;\n> >\n> >       bool match(DeviceEnumerator *enumerator) override;\n> > @@ -646,7 +646,7 @@ int SimplePipelineHandler::exportFrameBuffers(Camera\n> *camera, Stream *stream,\n> >               return data->video_->exportBuffers(count, buffers);\n> >   }\n> >\n> > -int SimplePipelineHandler::start(Camera *camera)\n> > +int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]]\n> ControlList *controls)\n> >   {\n> >       SimpleCameraData *data = cameraData(camera);\n> >       V4L2VideoDevice *video = data->video_;\n> > diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> > index 0f3241cc..87b0f03d 100644\n> > --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> > +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> > @@ -76,7 +76,7 @@ public:\n> >       int exportFrameBuffers(Camera *camera, Stream *stream,\n> >                              std::vector<std::unique_ptr<FrameBuffer>>\n> *buffers) override;\n> >\n> > -     int start(Camera *camera) override;\n> > +     int start(Camera *camera, ControlList *controls) override;\n> >       void stop(Camera *camera) override;\n> >\n> >       int queueRequestDevice(Camera *camera, Request *request) override;\n> > @@ -236,7 +236,7 @@ int PipelineHandlerUVC::exportFrameBuffers(Camera\n> *camera, Stream *stream,\n> >       return data->video_->exportBuffers(count, buffers);\n> >   }\n> >\n> > -int PipelineHandlerUVC::start(Camera *camera)\n> > +int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]]\n> ControlList *controls)\n> >   {\n> >       UVCCameraData *data = cameraData(camera);\n> >       unsigned int count = data->stream_.configuration().bufferCount;\n> > diff --git a/src/libcamera/pipeline/vimc/vimc.cpp\n> b/src/libcamera/pipeline/vimc/vimc.cpp\n> > index 914b6b54..d81b8598 100644\n> > --- a/src/libcamera/pipeline/vimc/vimc.cpp\n> > +++ b/src/libcamera/pipeline/vimc/vimc.cpp\n> > @@ -92,7 +92,7 @@ public:\n> >       int exportFrameBuffers(Camera *camera, Stream *stream,\n> >                              std::vector<std::unique_ptr<FrameBuffer>>\n> *buffers) override;\n> >\n> > -     int start(Camera *camera) override;\n> > +     int start(Camera *camera, ControlList *controls) override;\n> >       void stop(Camera *camera) override;\n> >\n> >       int queueRequestDevice(Camera *camera, Request *request) override;\n> > @@ -313,7 +313,7 @@ int PipelineHandlerVimc::exportFrameBuffers(Camera\n> *camera, Stream *stream,\n> >       return data->video_->exportBuffers(count, buffers);\n> >   }\n> >\n> > -int PipelineHandlerVimc::start(Camera *camera)\n> > +int PipelineHandlerVimc::start(Camera *camera, [[maybe_unused]]\n> ControlList *controls)\n> >   {\n> >       VimcCameraData *data = cameraData(camera);\n> >       unsigned int count = data->stream_.configuration().bufferCount;\n> > diff --git a/src/libcamera/pipeline_handler.cpp\n> b/src/libcamera/pipeline_handler.cpp\n> > index 894200ee..bafcf21b 100644\n> > --- a/src/libcamera/pipeline_handler.cpp\n> > +++ b/src/libcamera/pipeline_handler.cpp\n> > @@ -351,6 +351,7 @@ const ControlList &PipelineHandler::properties(const\n> Camera *camera) const\n> >    * \\fn PipelineHandler::start()\n> >    * \\brief Start capturing from a group of streams\n> >    * \\param[in] camera The camera to start\n> > + * \\param[in] controls Controls for the IPA to action before starting\n> the camera\n> >    *\n> >    * Start the group of streams that have been configured for capture by\n> >    * \\a configure(). The intended caller of this method is the Camera\n> class which\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 17447BE176\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 18 Nov 2020 13:26:45 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D7F6961572;\n\tWed, 18 Nov 2020 14:26:44 +0100 (CET)","from mail-lf1-x134.google.com (mail-lf1-x134.google.com\n\t[IPv6:2a00:1450:4864:20::134])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6020261568\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 18 Nov 2020 14:26:43 +0100 (CET)","by mail-lf1-x134.google.com with SMTP id d17so2906608lfq.10\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 18 Nov 2020 05:26:43 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"D7wUr+QA\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=6EVSvi5Z2KS3pb/QecJ0B7hg8SEkQfZaaOXiZZmb2Kc=;\n\tb=D7wUr+QADhjFtCrMmo9A3RAoUzQR2zL2DfxL4pXBr84L5zj5u8z8O94+QsGRHN61Ks\n\tI4KQ42LOHz6N+eptvDZFsJVUe2YCbITuAl7dpsa+hm7CaVF3KLtwRy9lPDqMsVZeCAs9\n\tPoL26NrZe6+Kur9sVoZTJjOnFgwkVXc4xtjFg3esnLdYrkIe2OI4LGjgiHiBvdKxhs5s\n\tDDX4Ia4JTXpcMI36Jzz8NXbQCNSFOC9Y2ET/ABsJw1pRqz3Y0pYWOrmJtjuzi/hHm4hx\n\tmgSfeQCH923HogQL0v5+/FkBMmd4c32maetj6Fb8kNYsPTn/e/S+N5xGlgH3IfJd3Kcv\n\tC8VA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=6EVSvi5Z2KS3pb/QecJ0B7hg8SEkQfZaaOXiZZmb2Kc=;\n\tb=ARvT2qBEPlSZNhgQTxTA8f99l42xMg8U79T3alS8hl8YRpJqKu1sZJtPMMGGwmrYZ0\n\tqMQVmszkcM6E9WDWvkRcR233Edkvrrj1z1HkJFjLDrkUrEYyLXWVowNuEnX8bTcZvi3T\n\thti7IC6xKfsuaws2zRksqTvdo5jx08kut8mg4oGd0QEloX/RLZfGhNQxN2fAgncoMs3k\n\tTag6vWPq0u5kgfYKvcKdabaYsMHJAmU0whwkRg10ItkNTtuoDC1feu1IOOsrUnsqxYht\n\tD5d++IP6CVCNKuafbgf6wn96MeCkldzVA3C9nqXqxPDf3agog2KtW1+5Pnh7jamEzL7d\n\tmtIw==","X-Gm-Message-State":"AOAM531hlPTemL0oIivjL3Fimk01ZfI/pZrlwxW4CUxJFtncxsSxKos0\n\tqDhwKrsWElLErWCJqN+Hw5w1nlQy/8eBQfMgJfZGVvVtdiOT9A==","X-Google-Smtp-Source":"ABdhPJwYxwVcqOA7ABySUqVOTlIDDNz3/g3jU/gK6FpaqILlGMj89Zm/O+x5+Aubcmtp0LIIzt3wx6plWITFISZLp6o=","X-Received":"by 2002:a19:b46:: with SMTP id 67mr3330492lfl.488.1605706002626; \n\tWed, 18 Nov 2020 05:26:42 -0800 (PST)","MIME-Version":"1.0","References":"<20201112085915.3053-1-naush@raspberrypi.com>\n\t<20201112085915.3053-2-naush@raspberrypi.com>\n\t<5c1409d0-789d-5fec-d0cb-f44faec2dccf@uajain.com>","In-Reply-To":"<5c1409d0-789d-5fec-d0cb-f44faec2dccf@uajain.com>","From":"Naushir Patuck <naush@raspberrypi.com>","Date":"Wed, 18 Nov 2020 13:26:26 +0000","Message-ID":"<CAEmqJPpdDTLaJY=0puwLLUF2anzRiT2mkzWzbdJoWnLRXKb7dQ@mail.gmail.com>","To":"Umang Jain <email@uajain.com>","Subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: pipeline: Pass\n\tlibcamera controls into pipeline_handler::start()","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","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>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"multipart/mixed;\n\tboundary=\"===============2037192107731623651==\"","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13783,"web_url":"https://patchwork.libcamera.org/comment/13783/","msgid":"<e5972d49-41b5-a53f-d582-70ac5dbbd29e@uajain.com>","date":"2020-11-18T13:38:40","subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: pipeline: Pass\n\tlibcamera controls into pipeline_handler::start()","submitter":{"id":1,"url":"https://patchwork.libcamera.org/api/people/1/","name":"Umang Jain","email":"email@uajain.com"},"content":"Hi Naush,\n\nOn 11/18/20 6:56 PM, Naushir Patuck wrote:\n> Hi Umang,\n>\n>\n> On Wed, 18 Nov 2020 at 13:16, Umang Jain <email@uajain.com \n> <mailto:email@uajain.com>> wrote:\n>\n>     Hi Naush,\n>\n>     On 11/12/20 2:29 PM, Naushir Patuck wrote:\n>     > Applications now have the ability to pass in controls that need\n>     to be\n>     > applied on startup, rather than doing it through Request where\n>     there might\n>     > be some frames of delay in getting the controls applied.\n>     >\n>     > This commit adds the ability to pass in a set of libcamera\n>     controls into\n>     > the pipeline handlers through the pipeline_handler::start()\n>     method. These\n>     > controls are provided by the application through the camera::start()\n>     > public API.\n>     Is there a possiblity that the controls are passed in through\n>     Camera::configure() that will subsequently call\n>     PipeHandler::configure()? Looking at the way Requests use\n>     ControlList,\n>     it seems there is also a 'validator' that can(/should?) be used with\n>     this API. *IF* we take that into account, then it feels like\n>     Camera::configure() is a good place for passing in ControlsList,\n>     rather\n>     than Camera::start()\n>\n>     This is just a quick comment / line of thought. I haven't actually\n>     dug\n>     deep into the Request/ControlsList code at this very moment.\n>\n>\n> Indeed this was an option that we considered.  However, there are some \n> usage issues with passing in controls on configure().  Below is an \n> extract from an earlier conversion with Kieran on this topic:\n>\n> On Mon, 19 Oct 2020 at 15:01, Kieran Bingham \n> <kieran.bingham@ideasonboard.com \n> <mailto:kieran.bingham@ideasonboard.com>> wrote:\n>\n>     Then when a pipeline is called with configure(), it needs to apply any\n>     controls in the list at that point. And it looks like the\n>     CameraConfiguration is already passed through to:\n>\n>     int RPiCameraData::configureIPA(const CameraConfiguration *config)\n>\n>     So, then there is the information required at that phase too?\n>\n>     I'm wondering if I've missed something obvious that would have\n>     prevented\n>     you from already using this approach?\n>\n>\n> Indeed, this was one of the approaches we discussed some time back.  \n> However, as you mentioned, CameraConfiguration gets set in the \n> camera->configure() phase, and this may not necessarily be what we \n> want.  An application may want to set startup parameters without doing \n> a camera->configure() in a run.  With this change, we would do a \n> sequence like start(), stop() start(new config parameters).  If we \n> were to do start(), stop() configure(new config parameters), start(), \n> it may incur additional overheads in calling configure() only to setup \n> some new startup params, where the configure() might be going to the \n> kernel and calling the sensors to set itself up again, even though it \n> is not needed.  Hope that makes sense?\nAh okay, so this was already considered and discussed. I didn't see any \nversion tag(`vX`) on the series hence I thought this is brand new. My \napologies.\n\nOkay, I do see the point, in not going through configure(), as you have \ndiscussed and implemented here. However, I am still under the impression \nthat, we might need to stick in a 'validate' before calling \nCamera::start() with new control, i.e.\n\nsequence like start(), stop(), validate(new control params), start(new \ncontrol params)\n\nMaybe it's not needed but it surely feels like, it should be present. \nAnd if the new controls fails the validation, we should prevent starting \nof the Camera again. This is what I think should happen (From \napplication developer point of view).\nAgain, I am not expert here and neither I have looked deep into the code \nas of now.\n\n> Regards,\n> Naush\n>\n>\n>     Thanks!\n>     >\n>     > Signed-off-by: Naushir Patuck <naush@raspberrypi.com\n>     <mailto:naush@raspberrypi.com>>\n>     > ---\n>     >   Documentation/guides/pipeline-handler.rst          | 4 ++--\n>     >   include/libcamera/camera.h                         | 2 +-\n>     >   include/libcamera/internal/pipeline_handler.h      | 2 +-\n>     >   src/libcamera/camera.cpp                           | 11\n>     ++++++-----\n>     >   src/libcamera/pipeline/ipu3/ipu3.cpp               | 4 ++--\n>     >   src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 4 ++--\n>     >   src/libcamera/pipeline/rkisp1/rkisp1.cpp           | 4 ++--\n>     >   src/libcamera/pipeline/simple/simple.cpp           | 4 ++--\n>     >   src/libcamera/pipeline/uvcvideo/uvcvideo.cpp       | 4 ++--\n>     >   src/libcamera/pipeline/vimc/vimc.cpp               | 4 ++--\n>     >   src/libcamera/pipeline_handler.cpp                 | 1 +\n>     >   11 files changed, 23 insertions(+), 21 deletions(-)\n>     >\n>     > diff --git a/Documentation/guides/pipeline-handler.rst\n>     b/Documentation/guides/pipeline-handler.rst\n>     > index 57aee455..63275a12 100644\n>     > --- a/Documentation/guides/pipeline-handler.rst\n>     > +++ b/Documentation/guides/pipeline-handler.rst\n>     > @@ -209,7 +209,7 @@ methods for the overridden class members.\n>     >             int exportFrameBuffers(Camera *camera, Stream *stream,\n>     >  std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>     >\n>     > -          int start(Camera *camera) override;\n>     > +          int start(Camera *camera, ControlList *controls)\n>     override;\n>     >             void stop(Camera *camera) override;\n>     >\n>     >             int queueRequestDevice(Camera *camera, Request\n>     *request) override;\n>     > @@ -239,7 +239,7 @@ methods for the overridden class members.\n>     >             return -1;\n>     >      }\n>     >\n>     > -   int PipelineHandlerVivid::start(Camera *camera)\n>     > +   int PipelineHandlerVivid::start(Camera *camera, ControlList\n>     *controls)\n>     >      {\n>     >             return -1;\n>     >      }\n>     > diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n>     > index 5c5f1a05..f94f8599 100644\n>     > --- a/include/libcamera/camera.h\n>     > +++ b/include/libcamera/camera.h\n>     > @@ -103,7 +103,7 @@ public:\n>     >       std::unique_ptr<Request> createRequest(uint64_t cookie = 0);\n>     >       int queueRequest(Request *request);\n>     >\n>     > -     int start();\n>     > +     int start(ControlList *controls = nullptr);\n>     >       int stop();\n>     >\n>     >   private:\n>     > diff --git a/include/libcamera/internal/pipeline_handler.h\n>     b/include/libcamera/internal/pipeline_handler.h\n>     > index c12c8904..bd3c4a81 100644\n>     > --- a/include/libcamera/internal/pipeline_handler.h\n>     > +++ b/include/libcamera/internal/pipeline_handler.h\n>     > @@ -78,7 +78,7 @@ public:\n>     >       virtual int exportFrameBuffers(Camera *camera, Stream *stream,\n>     > std::vector<std::unique_ptr<FrameBuffer>> *buffers) = 0;\n>     >\n>     > -     virtual int start(Camera *camera) = 0;\n>     > +     virtual int start(Camera *camera, ControlList *controls) = 0;\n>     >       virtual void stop(Camera *camera) = 0;\n>     >\n>     >       int queueRequest(Camera *camera, Request *request);\n>     > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n>     > index dffbd6bd..de9c6c86 100644\n>     > --- a/src/libcamera/camera.cpp\n>     > +++ b/src/libcamera/camera.cpp\n>     > @@ -943,9 +943,10 @@ int Camera::queueRequest(Request *request)\n>     >   /**\n>     >    * \\brief Start capture from camera\n>     >    *\n>     > - * Start the camera capture session. Once the camera is started\n>     the application\n>     > - * can queue requests to the camera to process and return to\n>     the application\n>     > - * until the capture session is terminated with \\a stop().\n>     > + * Start the camera capture session, optionally providing a\n>     list of controls to\n>     > + * action before starting. Once the camera is started the\n>     application can queue\n>     > + * requests to the camera to process and return to the\n>     application until the\n>     > + * capture session is terminated with \\a stop().\n>     >    *\n>     >    * \\context This function may only be called when the camera\n>     is in the\n>     >    * Configured state as defined in \\ref camera_operation, and\n>     shall be\n>     > @@ -956,7 +957,7 @@ int Camera::queueRequest(Request *request)\n>     >    * \\retval -ENODEV The camera has been disconnected from the\n>     system\n>     >    * \\retval -EACCES The camera is not in a state where it can\n>     be started\n>     >    */\n>     > -int Camera::start()\n>     > +int Camera::start(ControlList *controls)\n>     >   {\n>     >       Private *const d = LIBCAMERA_D_PTR();\n>     >\n>     > @@ -967,7 +968,7 @@ int Camera::start()\n>     >       LOG(Camera, Debug) << \"Starting capture\";\n>     >\n>     >       ret = d->pipe_->invokeMethod(&PipelineHandler::start,\n>     > - ConnectionTypeBlocking, this);\n>     > + ConnectionTypeBlocking, this, controls);\n>     >       if (ret)\n>     >               return ret;\n>     >\n>     > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp\n>     b/src/libcamera/pipeline/ipu3/ipu3.cpp\n>     > index 4cedb32b..8a1918d5 100644\n>     > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n>     > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n>     > @@ -105,7 +105,7 @@ public:\n>     >       int exportFrameBuffers(Camera *camera, Stream *stream,\n>     > std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>     >\n>     > -     int start(Camera *camera) override;\n>     > +     int start(Camera *camera, ControlList *controls) override;\n>     >       void stop(Camera *camera) override;\n>     >\n>     >       int queueRequestDevice(Camera *camera, Request *request)\n>     override;\n>     > @@ -596,7 +596,7 @@ int PipelineHandlerIPU3::freeBuffers(Camera\n>     *camera)\n>     >       return 0;\n>     >   }\n>     >\n>     > -int PipelineHandlerIPU3::start(Camera *camera)\n>     > +int PipelineHandlerIPU3::start(Camera *camera, [[maybe_unused]]\n>     ControlList *controls)\n>     >   {\n>     >       IPU3CameraData *data = cameraData(camera);\n>     >       CIO2Device *cio2 = &data->cio2_;\n>     > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n>     b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n>     > index 7ad66f21..ddb30e49 100644\n>     > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n>     > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n>     > @@ -237,7 +237,7 @@ public:\n>     >       int exportFrameBuffers(Camera *camera, Stream *stream,\n>     > std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>     >\n>     > -     int start(Camera *camera) override;\n>     > +     int start(Camera *camera, ControlList *controls) override;\n>     >       void stop(Camera *camera) override;\n>     >\n>     >       int queueRequestDevice(Camera *camera, Request *request)\n>     override;\n>     > @@ -726,7 +726,7 @@ int\n>     PipelineHandlerRPi::exportFrameBuffers([[maybe_unused]] Camera\n>     *camera, Stre\n>     >       return ret;\n>     >   }\n>     >\n>     > -int PipelineHandlerRPi::start(Camera *camera)\n>     > +int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]]\n>     ControlList *controls)\n>     >   {\n>     >       RPiCameraData *data = cameraData(camera);\n>     >       int ret;\n>     > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n>     b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n>     > index 1b1922a9..2e8d2930 100644\n>     > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n>     > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n>     > @@ -187,7 +187,7 @@ public:\n>     >       int exportFrameBuffers(Camera *camera, Stream *stream,\n>     > std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>     >\n>     > -     int start(Camera *camera) override;\n>     > +     int start(Camera *camera, ControlList *controls) override;\n>     >       void stop(Camera *camera) override;\n>     >\n>     >       int queueRequestDevice(Camera *camera, Request *request)\n>     override;\n>     > @@ -822,7 +822,7 @@ int\n>     PipelineHandlerRkISP1::freeBuffers(Camera *camera)\n>     >       return 0;\n>     >   }\n>     >\n>     > -int PipelineHandlerRkISP1::start(Camera *camera)\n>     > +int PipelineHandlerRkISP1::start(Camera *camera,\n>     [[maybe_unused]] ControlList *controls)\n>     >   {\n>     >       RkISP1CameraData *data = cameraData(camera);\n>     >       int ret;\n>     > diff --git a/src/libcamera/pipeline/simple/simple.cpp\n>     b/src/libcamera/pipeline/simple/simple.cpp\n>     > index 0d3078f7..b047aeb9 100644\n>     > --- a/src/libcamera/pipeline/simple/simple.cpp\n>     > +++ b/src/libcamera/pipeline/simple/simple.cpp\n>     > @@ -126,7 +126,7 @@ public:\n>     >       int exportFrameBuffers(Camera *camera, Stream *stream,\n>     > std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>     >\n>     > -     int start(Camera *camera) override;\n>     > +     int start(Camera *camera, ControlList *controls) override;\n>     >       void stop(Camera *camera) override;\n>     >\n>     >       bool match(DeviceEnumerator *enumerator) override;\n>     > @@ -646,7 +646,7 @@ int\n>     SimplePipelineHandler::exportFrameBuffers(Camera *camera, Stream\n>     *stream,\n>     >               return data->video_->exportBuffers(count, buffers);\n>     >   }\n>     >\n>     > -int SimplePipelineHandler::start(Camera *camera)\n>     > +int SimplePipelineHandler::start(Camera *camera,\n>     [[maybe_unused]] ControlList *controls)\n>     >   {\n>     >       SimpleCameraData *data = cameraData(camera);\n>     >       V4L2VideoDevice *video = data->video_;\n>     > diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n>     b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n>     > index 0f3241cc..87b0f03d 100644\n>     > --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n>     > +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n>     > @@ -76,7 +76,7 @@ public:\n>     >       int exportFrameBuffers(Camera *camera, Stream *stream,\n>     > std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>     >\n>     > -     int start(Camera *camera) override;\n>     > +     int start(Camera *camera, ControlList *controls) override;\n>     >       void stop(Camera *camera) override;\n>     >\n>     >       int queueRequestDevice(Camera *camera, Request *request)\n>     override;\n>     > @@ -236,7 +236,7 @@ int\n>     PipelineHandlerUVC::exportFrameBuffers(Camera *camera, Stream *stream,\n>     >       return data->video_->exportBuffers(count, buffers);\n>     >   }\n>     >\n>     > -int PipelineHandlerUVC::start(Camera *camera)\n>     > +int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]]\n>     ControlList *controls)\n>     >   {\n>     >       UVCCameraData *data = cameraData(camera);\n>     >       unsigned int count =\n>     data->stream_.configuration().bufferCount;\n>     > diff --git a/src/libcamera/pipeline/vimc/vimc.cpp\n>     b/src/libcamera/pipeline/vimc/vimc.cpp\n>     > index 914b6b54..d81b8598 100644\n>     > --- a/src/libcamera/pipeline/vimc/vimc.cpp\n>     > +++ b/src/libcamera/pipeline/vimc/vimc.cpp\n>     > @@ -92,7 +92,7 @@ public:\n>     >       int exportFrameBuffers(Camera *camera, Stream *stream,\n>     > std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n>     >\n>     > -     int start(Camera *camera) override;\n>     > +     int start(Camera *camera, ControlList *controls) override;\n>     >       void stop(Camera *camera) override;\n>     >\n>     >       int queueRequestDevice(Camera *camera, Request *request)\n>     override;\n>     > @@ -313,7 +313,7 @@ int\n>     PipelineHandlerVimc::exportFrameBuffers(Camera *camera, Stream\n>     *stream,\n>     >       return data->video_->exportBuffers(count, buffers);\n>     >   }\n>     >\n>     > -int PipelineHandlerVimc::start(Camera *camera)\n>     > +int PipelineHandlerVimc::start(Camera *camera, [[maybe_unused]]\n>     ControlList *controls)\n>     >   {\n>     >       VimcCameraData *data = cameraData(camera);\n>     >       unsigned int count =\n>     data->stream_.configuration().bufferCount;\n>     > diff --git a/src/libcamera/pipeline_handler.cpp\n>     b/src/libcamera/pipeline_handler.cpp\n>     > index 894200ee..bafcf21b 100644\n>     > --- a/src/libcamera/pipeline_handler.cpp\n>     > +++ b/src/libcamera/pipeline_handler.cpp\n>     > @@ -351,6 +351,7 @@ const ControlList\n>     &PipelineHandler::properties(const Camera *camera) const\n>     >    * \\fn PipelineHandler::start()\n>     >    * \\brief Start capturing from a group of streams\n>     >    * \\param[in] camera The camera to start\n>     > + * \\param[in] controls Controls for the IPA to action before\n>     starting the camera\n>     >    *\n>     >    * Start the group of streams that have been configured for\n>     capture by\n>     >    * \\a configure(). The intended caller of this method is the\n>     Camera class which\n>\n>     _______________________________________________\n>     libcamera-devel mailing list\n>     libcamera-devel@lists.libcamera.org\n>     <mailto:libcamera-devel@lists.libcamera.org>\n>     https://lists.libcamera.org/listinfo/libcamera-devel\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id E9C8CBE08A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 18 Nov 2020 13:38:48 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0809361571;\n\tWed, 18 Nov 2020 14:38:48 +0100 (CET)","from mail.uajain.com (static.126.159.217.95.clients.your-server.de\n\t[95.217.159.126])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BB92061568\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 18 Nov 2020 14:38:44 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=uajain.com header.i=@uajain.com\n\theader.b=\"dOovaoZA\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=uajain.com; s=mail;\n\tt=1605706723; bh=fS0OMHShZtnCZu3KKUULQK/8MJmN6tvPnDujYKq2iy0=;\n\th=Subject:To:Cc:References:From:In-Reply-To;\n\tb=dOovaoZAFW6+hMczm4KOEQCzYGkd2jEhQSxGGY0uVFrGv6+GdVfiIMakB3JdzWeHp\n\tddVaafgOWDkmvT+oOcDp7ytm1zKDGh6GKsjowrOo257MDRT5oWmaLXuhayV6svSaor\n\trbC+X//t151EnR+DclrSfL0H4NUFnow5FfrSyziDv7aVJ9gsDTyjesScwVMsIJ2GyU\n\tjmR09Ayqqp0aHwMuRgS1SmOnOQui8CazudgmY7OK+1ZcncI8ESJnvAn4VJV+X1BnjB\n\t7Fw0TDZjSyOoOC37EYcIc6vimUpCgQ1/4/o+l2xfDOio9EqDhfAUGZPOtCp381NiIt\n\tJlOgI87gdNSqA==","To":"Naushir Patuck <naush@raspberrypi.com>","References":"<20201112085915.3053-1-naush@raspberrypi.com>\n\t<20201112085915.3053-2-naush@raspberrypi.com>\n\t<5c1409d0-789d-5fec-d0cb-f44faec2dccf@uajain.com>\n\t<CAEmqJPpdDTLaJY=0puwLLUF2anzRiT2mkzWzbdJoWnLRXKb7dQ@mail.gmail.com>","From":"Umang Jain <email@uajain.com>","Message-ID":"<e5972d49-41b5-a53f-d582-70ac5dbbd29e@uajain.com>","Date":"Wed, 18 Nov 2020 19:08:40 +0530","Mime-Version":"1.0","In-Reply-To":"<CAEmqJPpdDTLaJY=0puwLLUF2anzRiT2mkzWzbdJoWnLRXKb7dQ@mail.gmail.com>","Content-Language":"en-US","Subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: pipeline: Pass\n\tlibcamera controls into pipeline_handler::start()","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","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>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"multipart/mixed;\n\tboundary=\"===============7704173963498112082==\"","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13784,"web_url":"https://patchwork.libcamera.org/comment/13784/","msgid":"<CAEmqJPq-jZEvoLEe0MV+MAjXf8A53K67J2AZEsd0fQYv=NqbSw@mail.gmail.com>","date":"2020-11-18T13:48:18","subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: pipeline: Pass\n\tlibcamera controls into pipeline_handler::start()","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Umang,\n\n\nOn Wed, 18 Nov 2020 at 13:38, Umang Jain <email@uajain.com> wrote:\n\n> Hi Naush,\n>\n> On 11/18/20 6:56 PM, Naushir Patuck wrote:\n>\n> Hi Umang,\n>\n>\n> On Wed, 18 Nov 2020 at 13:16, Umang Jain <email@uajain.com> wrote:\n>\n>> Hi Naush,\n>>\n>> On 11/12/20 2:29 PM, Naushir Patuck wrote:\n>> > Applications now have the ability to pass in controls that need to be\n>> > applied on startup, rather than doing it through Request where there\n>> might\n>> > be some frames of delay in getting the controls applied.\n>> >\n>> > This commit adds the ability to pass in a set of libcamera controls into\n>> > the pipeline handlers through the pipeline_handler::start() method.\n>> These\n>> > controls are provided by the application through the camera::start()\n>> > public API.\n>> Is there a possiblity that the controls are passed in through\n>> Camera::configure() that will subsequently call\n>> PipeHandler::configure()? Looking at the way Requests use ControlList,\n>> it seems there is also a 'validator' that can(/should?) be used with\n>> this API. *IF* we take that into account, then it feels like\n>> Camera::configure() is a good place for passing in ControlsList, rather\n>> than Camera::start()\n>>\n>> This is just a quick comment / line of thought. I haven't actually dug\n>> deep into the Request/ControlsList code at this very moment.\n>>\n>\n> Indeed this was an option that we considered.  However, there are some\n> usage issues with passing in controls on configure().  Below is an extract\n> from an earlier conversion with Kieran on this topic:\n>\n> On Mon, 19 Oct 2020 at 15:01, Kieran Bingham <\n> kieran.bingham@ideasonboard.com> wrote:\n>\n>> Then when a pipeline is called with configure(), it needs to apply any\n>> controls in the list at that point. And it looks like the\n>> CameraConfiguration is already passed through to:\n>>\n>> int RPiCameraData::configureIPA(const CameraConfiguration *config)\n>>\n>> So, then there is the information required at that phase too?\n>>\n>> I'm wondering if I've missed something obvious that would have prevented\n>> you from already using this approach?\n>>\n>\n> Indeed, this was one of the approaches we discussed some time back.\n> However, as you mentioned, CameraConfiguration gets set in the\n> camera->configure() phase, and this may not necessarily be what we want.\n> An application may want to set startup parameters without doing a\n> camera->configure() in a run.  With this change, we would do a sequence\n> like start(), stop() start(new config parameters).  If we were to do start(),\n> stop() configure(new config parameters), start(), it may incur additional\n> overheads in calling configure() only to setup some new startup params,\n> where the configure() might be going to the kernel and calling the sensors\n> to set itself up again, even though it is not needed.  Hope that makes\n> sense?\n>\n> Ah okay, so this was already considered and discussed. I didn't see any\n> version tag(`vX`) on the series hence I thought this is brand new. My\n> apologies.\n>\n> Okay, I do see the point, in not going through configure(), as you have\n> discussed and implemented here. However, I am still under the impression\n> that, we might need to stick in a 'validate' before calling Camera::start()\n> with new control, i.e.\n>\n> sequence like start(), stop(), validate(new control params), start(new\n> control params)\n>\n> Maybe it's not needed but it surely feels like, it should be present. And\n> if the new controls fails the validation, we should prevent starting of the\n> Camera again. This is what I think should happen (From application\n> developer point of view).\n> Again, I am not expert here and neither I have looked deep into the code\n> as of now.\n>\n>\nI am not entirely familiar with the control validator.  Let me look through\nit's usage and get back to you.  So presumably this validator would belong\nto the Camera class in your description above?\n\n\n\n> Regards,\n> Naush\n>\n>\n>\n>>\n>> Thanks!\n>> >\n>> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n>> > ---\n>> >   Documentation/guides/pipeline-handler.rst          |  4 ++--\n>> >   include/libcamera/camera.h                         |  2 +-\n>> >   include/libcamera/internal/pipeline_handler.h      |  2 +-\n>> >   src/libcamera/camera.cpp                           | 11 ++++++-----\n>> >   src/libcamera/pipeline/ipu3/ipu3.cpp               |  4 ++--\n>> >   src/libcamera/pipeline/raspberrypi/raspberrypi.cpp |  4 ++--\n>> >   src/libcamera/pipeline/rkisp1/rkisp1.cpp           |  4 ++--\n>> >   src/libcamera/pipeline/simple/simple.cpp           |  4 ++--\n>> >   src/libcamera/pipeline/uvcvideo/uvcvideo.cpp       |  4 ++--\n>> >   src/libcamera/pipeline/vimc/vimc.cpp               |  4 ++--\n>> >   src/libcamera/pipeline_handler.cpp                 |  1 +\n>> >   11 files changed, 23 insertions(+), 21 deletions(-)\n>> >\n>> > diff --git a/Documentation/guides/pipeline-handler.rst\n>> b/Documentation/guides/pipeline-handler.rst\n>> > index 57aee455..63275a12 100644\n>> > --- a/Documentation/guides/pipeline-handler.rst\n>> > +++ b/Documentation/guides/pipeline-handler.rst\n>> > @@ -209,7 +209,7 @@ methods for the overridden class members.\n>> >             int exportFrameBuffers(Camera *camera, Stream *stream,\n>> >             std::vector<std::unique_ptr<FrameBuffer>> *buffers)\n>> override;\n>> >\n>> > -          int start(Camera *camera) override;\n>> > +          int start(Camera *camera, ControlList *controls) override;\n>> >             void stop(Camera *camera) override;\n>> >\n>> >             int queueRequestDevice(Camera *camera, Request *request)\n>> override;\n>> > @@ -239,7 +239,7 @@ methods for the overridden class members.\n>> >             return -1;\n>> >      }\n>> >\n>> > -   int PipelineHandlerVivid::start(Camera *camera)\n>> > +   int PipelineHandlerVivid::start(Camera *camera, ControlList\n>> *controls)\n>> >      {\n>> >             return -1;\n>> >      }\n>> > diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\n>> > index 5c5f1a05..f94f8599 100644\n>> > --- a/include/libcamera/camera.h\n>> > +++ b/include/libcamera/camera.h\n>> > @@ -103,7 +103,7 @@ public:\n>> >       std::unique_ptr<Request> createRequest(uint64_t cookie = 0);\n>> >       int queueRequest(Request *request);\n>> >\n>> > -     int start();\n>> > +     int start(ControlList *controls = nullptr);\n>> >       int stop();\n>> >\n>> >   private:\n>> > diff --git a/include/libcamera/internal/pipeline_handler.h\n>> b/include/libcamera/internal/pipeline_handler.h\n>> > index c12c8904..bd3c4a81 100644\n>> > --- a/include/libcamera/internal/pipeline_handler.h\n>> > +++ b/include/libcamera/internal/pipeline_handler.h\n>> > @@ -78,7 +78,7 @@ public:\n>> >       virtual int exportFrameBuffers(Camera *camera, Stream *stream,\n>> >\n>> std::vector<std::unique_ptr<FrameBuffer>> *buffers) = 0;\n>> >\n>> > -     virtual int start(Camera *camera) = 0;\n>> > +     virtual int start(Camera *camera, ControlList *controls) = 0;\n>> >       virtual void stop(Camera *camera) = 0;\n>> >\n>> >       int queueRequest(Camera *camera, Request *request);\n>> > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n>> > index dffbd6bd..de9c6c86 100644\n>> > --- a/src/libcamera/camera.cpp\n>> > +++ b/src/libcamera/camera.cpp\n>> > @@ -943,9 +943,10 @@ int Camera::queueRequest(Request *request)\n>> >   /**\n>> >    * \\brief Start capture from camera\n>> >    *\n>> > - * Start the camera capture session. Once the camera is started the\n>> application\n>> > - * can queue requests to the camera to process and return to the\n>> application\n>> > - * until the capture session is terminated with \\a stop().\n>> > + * Start the camera capture session, optionally providing a list of\n>> controls to\n>> > + * action before starting. Once the camera is started the application\n>> can queue\n>> > + * requests to the camera to process and return to the application\n>> until the\n>> > + * capture session is terminated with \\a stop().\n>> >    *\n>> >    * \\context This function may only be called when the camera is in the\n>> >    * Configured state as defined in \\ref camera_operation, and shall be\n>> > @@ -956,7 +957,7 @@ int Camera::queueRequest(Request *request)\n>> >    * \\retval -ENODEV The camera has been disconnected from the system\n>> >    * \\retval -EACCES The camera is not in a state where it can be\n>> started\n>> >    */\n>> > -int Camera::start()\n>> > +int Camera::start(ControlList *controls)\n>> >   {\n>> >       Private *const d = LIBCAMERA_D_PTR();\n>> >\n>> > @@ -967,7 +968,7 @@ int Camera::start()\n>> >       LOG(Camera, Debug) << \"Starting capture\";\n>> >\n>> >       ret = d->pipe_->invokeMethod(&PipelineHandler::start,\n>> > -                                  ConnectionTypeBlocking, this);\n>> > +                                  ConnectionTypeBlocking, this,\n>> controls);\n>> >       if (ret)\n>> >               return ret;\n>> >\n>> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp\n>> b/src/libcamera/pipeline/ipu3/ipu3.cpp\n>> > index 4cedb32b..8a1918d5 100644\n>> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n>> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n>> > @@ -105,7 +105,7 @@ public:\n>> >       int exportFrameBuffers(Camera *camera, Stream *stream,\n>> >                              std::vector<std::unique_ptr<FrameBuffer>>\n>> *buffers) override;\n>> >\n>> > -     int start(Camera *camera) override;\n>> > +     int start(Camera *camera, ControlList *controls) override;\n>> >       void stop(Camera *camera) override;\n>> >\n>> >       int queueRequestDevice(Camera *camera, Request *request) override;\n>> > @@ -596,7 +596,7 @@ int PipelineHandlerIPU3::freeBuffers(Camera *camera)\n>> >       return 0;\n>> >   }\n>> >\n>> > -int PipelineHandlerIPU3::start(Camera *camera)\n>> > +int PipelineHandlerIPU3::start(Camera *camera, [[maybe_unused]]\n>> ControlList *controls)\n>> >   {\n>> >       IPU3CameraData *data = cameraData(camera);\n>> >       CIO2Device *cio2 = &data->cio2_;\n>> > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n>> b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n>> > index 7ad66f21..ddb30e49 100644\n>> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n>> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n>> > @@ -237,7 +237,7 @@ public:\n>> >       int exportFrameBuffers(Camera *camera, Stream *stream,\n>> >                              std::vector<std::unique_ptr<FrameBuffer>>\n>> *buffers) override;\n>> >\n>> > -     int start(Camera *camera) override;\n>> > +     int start(Camera *camera, ControlList *controls) override;\n>> >       void stop(Camera *camera) override;\n>> >\n>> >       int queueRequestDevice(Camera *camera, Request *request) override;\n>> > @@ -726,7 +726,7 @@ int\n>> PipelineHandlerRPi::exportFrameBuffers([[maybe_unused]] Camera *camera, Stre\n>> >       return ret;\n>> >   }\n>> >\n>> > -int PipelineHandlerRPi::start(Camera *camera)\n>> > +int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]]\n>> ControlList *controls)\n>> >   {\n>> >       RPiCameraData *data = cameraData(camera);\n>> >       int ret;\n>> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n>> b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n>> > index 1b1922a9..2e8d2930 100644\n>> > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n>> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n>> > @@ -187,7 +187,7 @@ public:\n>> >       int exportFrameBuffers(Camera *camera, Stream *stream,\n>> >                              std::vector<std::unique_ptr<FrameBuffer>>\n>> *buffers) override;\n>> >\n>> > -     int start(Camera *camera) override;\n>> > +     int start(Camera *camera, ControlList *controls) override;\n>> >       void stop(Camera *camera) override;\n>> >\n>> >       int queueRequestDevice(Camera *camera, Request *request) override;\n>> > @@ -822,7 +822,7 @@ int PipelineHandlerRkISP1::freeBuffers(Camera\n>> *camera)\n>> >       return 0;\n>> >   }\n>> >\n>> > -int PipelineHandlerRkISP1::start(Camera *camera)\n>> > +int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]]\n>> ControlList *controls)\n>> >   {\n>> >       RkISP1CameraData *data = cameraData(camera);\n>> >       int ret;\n>> > diff --git a/src/libcamera/pipeline/simple/simple.cpp\n>> b/src/libcamera/pipeline/simple/simple.cpp\n>> > index 0d3078f7..b047aeb9 100644\n>> > --- a/src/libcamera/pipeline/simple/simple.cpp\n>> > +++ b/src/libcamera/pipeline/simple/simple.cpp\n>> > @@ -126,7 +126,7 @@ public:\n>> >       int exportFrameBuffers(Camera *camera, Stream *stream,\n>> >                              std::vector<std::unique_ptr<FrameBuffer>>\n>> *buffers) override;\n>> >\n>> > -     int start(Camera *camera) override;\n>> > +     int start(Camera *camera, ControlList *controls) override;\n>> >       void stop(Camera *camera) override;\n>> >\n>> >       bool match(DeviceEnumerator *enumerator) override;\n>> > @@ -646,7 +646,7 @@ int\n>> SimplePipelineHandler::exportFrameBuffers(Camera *camera, Stream *stream,\n>> >               return data->video_->exportBuffers(count, buffers);\n>> >   }\n>> >\n>> > -int SimplePipelineHandler::start(Camera *camera)\n>> > +int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]]\n>> ControlList *controls)\n>> >   {\n>> >       SimpleCameraData *data = cameraData(camera);\n>> >       V4L2VideoDevice *video = data->video_;\n>> > diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n>> b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n>> > index 0f3241cc..87b0f03d 100644\n>> > --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n>> > +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n>> > @@ -76,7 +76,7 @@ public:\n>> >       int exportFrameBuffers(Camera *camera, Stream *stream,\n>> >                              std::vector<std::unique_ptr<FrameBuffer>>\n>> *buffers) override;\n>> >\n>> > -     int start(Camera *camera) override;\n>> > +     int start(Camera *camera, ControlList *controls) override;\n>> >       void stop(Camera *camera) override;\n>> >\n>> >       int queueRequestDevice(Camera *camera, Request *request) override;\n>> > @@ -236,7 +236,7 @@ int PipelineHandlerUVC::exportFrameBuffers(Camera\n>> *camera, Stream *stream,\n>> >       return data->video_->exportBuffers(count, buffers);\n>> >   }\n>> >\n>> > -int PipelineHandlerUVC::start(Camera *camera)\n>> > +int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]]\n>> ControlList *controls)\n>> >   {\n>> >       UVCCameraData *data = cameraData(camera);\n>> >       unsigned int count = data->stream_.configuration().bufferCount;\n>> > diff --git a/src/libcamera/pipeline/vimc/vimc.cpp\n>> b/src/libcamera/pipeline/vimc/vimc.cpp\n>> > index 914b6b54..d81b8598 100644\n>> > --- a/src/libcamera/pipeline/vimc/vimc.cpp\n>> > +++ b/src/libcamera/pipeline/vimc/vimc.cpp\n>> > @@ -92,7 +92,7 @@ public:\n>> >       int exportFrameBuffers(Camera *camera, Stream *stream,\n>> >                              std::vector<std::unique_ptr<FrameBuffer>>\n>> *buffers) override;\n>> >\n>> > -     int start(Camera *camera) override;\n>> > +     int start(Camera *camera, ControlList *controls) override;\n>> >       void stop(Camera *camera) override;\n>> >\n>> >       int queueRequestDevice(Camera *camera, Request *request) override;\n>> > @@ -313,7 +313,7 @@ int PipelineHandlerVimc::exportFrameBuffers(Camera\n>> *camera, Stream *stream,\n>> >       return data->video_->exportBuffers(count, buffers);\n>> >   }\n>> >\n>> > -int PipelineHandlerVimc::start(Camera *camera)\n>> > +int PipelineHandlerVimc::start(Camera *camera, [[maybe_unused]]\n>> ControlList *controls)\n>> >   {\n>> >       VimcCameraData *data = cameraData(camera);\n>> >       unsigned int count = data->stream_.configuration().bufferCount;\n>> > diff --git a/src/libcamera/pipeline_handler.cpp\n>> b/src/libcamera/pipeline_handler.cpp\n>> > index 894200ee..bafcf21b 100644\n>> > --- a/src/libcamera/pipeline_handler.cpp\n>> > +++ b/src/libcamera/pipeline_handler.cpp\n>> > @@ -351,6 +351,7 @@ const ControlList\n>> &PipelineHandler::properties(const Camera *camera) const\n>> >    * \\fn PipelineHandler::start()\n>> >    * \\brief Start capturing from a group of streams\n>> >    * \\param[in] camera The camera to start\n>> > + * \\param[in] controls Controls for the IPA to action before starting\n>> the camera\n>> >    *\n>> >    * Start the group of streams that have been configured for capture by\n>> >    * \\a configure(). The intended caller of this method is the Camera\n>> class which\n>>\n>> _______________________________________________\n>> libcamera-devel mailing list\n>> libcamera-devel@lists.libcamera.org\n>> https://lists.libcamera.org/listinfo/libcamera-devel\n>>\n>\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 08CC0BE176\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 18 Nov 2020 13:48:41 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3950161571;\n\tWed, 18 Nov 2020 14:48:40 +0100 (CET)","from mail-lf1-x12d.google.com (mail-lf1-x12d.google.com\n\t[IPv6:2a00:1450:4864:20::12d])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 168AA61568\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 18 Nov 2020 14:48:36 +0100 (CET)","by mail-lf1-x12d.google.com with SMTP id f11so3039132lfs.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 18 Nov 2020 05:48:35 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"X+VEzbjn\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=BId8SJeVJQBuhANT7JDwrD9buEqR+5UkcwNAqhU5z2I=;\n\tb=X+VEzbjnHuPxwf4jJZVq52M3wJiuLzNhCLc7ETG4OMb2kdUxo2D+7YTaSkZzCgL3HW\n\t/XoieEKxAJ+6KBG1whybz2knKXe3UAf4TFJj7QcvcuvLFYkNXT79G5OgaXoezv36OBJl\n\tDiKlW0kN2fNv+m+oA6FPX5kkqWWj1nIjAf1evNvj4MXFlk8CLaGEQdq+GGrCdVCu41Hw\n\tgqI62dVwwW2wulBL17tlAZ2BLjLdbqKw0U659dWsudB2QVrNMsi6VrtKOyt2X7Ka1kDw\n\tRyzcTpatGYCet3jTpMIISs57bypZ5gGovM54Zc6e7I25/LVCofGulYVJKlwN9ItRTBtB\n\tYsDA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=BId8SJeVJQBuhANT7JDwrD9buEqR+5UkcwNAqhU5z2I=;\n\tb=OWCwCTT/vp3AxXedi30QTmmeoH4anmt/tCd1QyVDW5iG6s2l2zy8T5gB9KsG5GkCtC\n\t0R7jALnfGQxBiQOZ48UMWmPkX/I7WXljamOXcNYihV2CC3TFdml/DqbH1RPNEcHJPYl5\n\tY7CtKi9aZCQN3zUjzqJnLrYhoDH8+aGaZs5BLGujpgUtXSepD4BnPXEVNHDd0HXCnIJy\n\tpoE0s0yHwWCvj7ctfqosdO8ZXMhcXvTtVrIC8jgwodr6P6Xs/vmnavzhZaZLq0GxKqpx\n\t1Y3zU3BpMi2fFe7ID35i8Zj0KGoT2cNTr+3VjyDyDBPoUEwcBWzRFLZpsnxtPi6FsvGD\n\tM7TA==","X-Gm-Message-State":"AOAM531mbqAyK5Ki8SubjeBNgkFHgeV9rgsxehuecOtRKNMlRVBePaOW\n\t33cNWsxu+maIg8OHNkVFc2PjD/YXw5byMdi0rIAGpE7szds=","X-Google-Smtp-Source":"ABdhPJx+FP+Gqp48oYxgg2bGNXRwAakFRN5uV4fxCn0L2blAwDLh6GYQcNByK0zJ63IRVOoPU/oj2DkHo7NpX10kYDA=","X-Received":"by 2002:ac2:53ad:: with SMTP id\n\tj13mr3466339lfh.177.1605707315108; \n\tWed, 18 Nov 2020 05:48:35 -0800 (PST)","MIME-Version":"1.0","References":"<20201112085915.3053-1-naush@raspberrypi.com>\n\t<20201112085915.3053-2-naush@raspberrypi.com>\n\t<5c1409d0-789d-5fec-d0cb-f44faec2dccf@uajain.com>\n\t<CAEmqJPpdDTLaJY=0puwLLUF2anzRiT2mkzWzbdJoWnLRXKb7dQ@mail.gmail.com>\n\t<e5972d49-41b5-a53f-d582-70ac5dbbd29e@uajain.com>","In-Reply-To":"<e5972d49-41b5-a53f-d582-70ac5dbbd29e@uajain.com>","From":"Naushir Patuck <naush@raspberrypi.com>","Date":"Wed, 18 Nov 2020 13:48:18 +0000","Message-ID":"<CAEmqJPq-jZEvoLEe0MV+MAjXf8A53K67J2AZEsd0fQYv=NqbSw@mail.gmail.com>","To":"Umang Jain <email@uajain.com>","Subject":"Re: [libcamera-devel] [PATCH 1/3] libcamera: pipeline: Pass\n\tlibcamera controls into pipeline_handler::start()","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","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>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"multipart/mixed;\n\tboundary=\"===============7808836035827491217==\"","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]