[{"id":28093,"web_url":"https://patchwork.libcamera.org/comment/28093/","msgid":"<CAEB1ahsC=huDcFW-0Am7vKvrnNDpnPXsCCXUvEqX3cyyHH5mMA@mail.gmail.com>","date":"2023-11-15T08:26:51","subject":"Re: [libcamera-devel] [PATCH v1 1/1] libcamera: Fix ipu3's issue of\n\tfirst black frame","submitter":{"id":117,"url":"https://patchwork.libcamera.org/api/people/117/","name":"Cheng-Hao Yang","email":"chenghaoyang@chromium.org"},"content":"Hi folks,\n\nCould I request a round of review? Thanks!\n\nOn Mon, Sep 18, 2023 at 4:52 PM Harvey Yang <chenghaoyang@chromium.org>\nwrote:\n\n> As ipu3 ISP requires two frames in the pipeline to generate non-delayed\n> output, this CL fixes the problem of the first frame (preview and\n> capture) being black by queueing the first buffer twice.\n>\n> Signed-off-by: Harvey Yang <chenghaoyang@chromium.org>\n> ---\n>  src/libcamera/pipeline/ipu3/ipu3.cpp | 50 ++++++++++++++++++++++++----\n>  1 file changed, 43 insertions(+), 7 deletions(-)\n>\n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index a81c817a..fa4a8a10 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -86,11 +86,15 @@ public:\n>\n>         ControlInfoMap ipaControls_;\n>\n> +       bool firstRequest_ = true;\n> +\n>  private:\n>         void metadataReady(unsigned int id, const ControlList &metadata);\n>         void paramsBufferReady(unsigned int id);\n>         void setSensorControls(unsigned int id, const ControlList\n> &sensorControls,\n>                                const ControlList &lensControls);\n> +\n> +       std::map<FrameBuffer *, int> bufferReturnCounters_;\n>  };\n>\n>  class IPU3CameraConfiguration : public CameraConfiguration\n> @@ -721,6 +725,8 @@ int PipelineHandlerIPU3::start(Camera *camera,\n> [[maybe_unused]] const ControlLis\n>         ImgUDevice *imgu = data->imgu_;\n>         int ret;\n>\n> +       data->firstRequest_ = true;\n> +\n>         /* Disable test pattern mode on the sensor, if any. */\n>         ret = cio2->sensor()->setTestPatternMode(\n>                 controls::draft::TestPatternModeEnum::TestPatternModeOff);\n> @@ -1224,22 +1230,37 @@ void IPU3CameraData::paramsBufferReady(unsigned\n> int id)\n>         if (!info)\n>                 return;\n>\n> +       const int yuvCount = firstRequest_ ? 2 : 1;\n> +       firstRequest_ = false;\n>         /* Queue all buffers from the request aimed for the ImgU. */\n>         for (auto it : info->request->buffers()) {\n>                 const Stream *stream = it.first;\n>                 FrameBuffer *outbuffer = it.second;\n>\n> -               if (stream == &outStream_)\n> -                       imgu_->output_->queueBuffer(outbuffer);\n> -               else if (stream == &vfStream_)\n> -                       imgu_->viewfinder_->queueBuffer(outbuffer);\n> +               if (stream == &outStream_) {\n> +                       for (int i = 0; i < yuvCount; ++i) {\n> +                               bufferReturnCounters_[outbuffer] += 1;\n> +                               imgu_->output_->queueBuffer(outbuffer);\n> +                       }\n> +               } else if (stream == &vfStream_) {\n> +                       for (int i = 0; i < yuvCount; ++i) {\n> +                               bufferReturnCounters_[outbuffer] += 1;\n> +                               imgu_->viewfinder_->queueBuffer(outbuffer);\n> +                       }\n> +               }\n>         }\n>\n>         info->paramBuffer->_d()->metadata().planes()[0].bytesused =\n>                 sizeof(struct ipu3_uapi_params);\n> -       imgu_->param_->queueBuffer(info->paramBuffer);\n> -       imgu_->stat_->queueBuffer(info->statBuffer);\n> -       imgu_->input_->queueBuffer(info->rawBuffer);\n> +       for (int i = 0; i < yuvCount; ++i) {\n> +               bufferReturnCounters_[info->paramBuffer] += 1;\n> +               bufferReturnCounters_[info->statBuffer] += 1;\n> +               bufferReturnCounters_[info->rawBuffer] += 1;\n> +\n> +               imgu_->param_->queueBuffer(info->paramBuffer);\n> +               imgu_->stat_->queueBuffer(info->statBuffer);\n> +               imgu_->input_->queueBuffer(info->rawBuffer);\n> +       }\n>  }\n>\n>  void IPU3CameraData::metadataReady(unsigned int id, const ControlList\n> &metadata)\n> @@ -1268,6 +1289,11 @@ void IPU3CameraData::metadataReady(unsigned int id,\n> const ControlList &metadata)\n>   */\n>  void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer)\n>  {\n> +       if (--bufferReturnCounters_[buffer] > 0)\n> +               return;\n> +\n> +       bufferReturnCounters_.erase(buffer);\n> +\n>         IPU3Frames::Info *info = frameInfos_.find(buffer);\n>         if (!info)\n>                 return;\n> @@ -1334,6 +1360,11 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer\n> *buffer)\n>\n>  void IPU3CameraData::paramBufferReady(FrameBuffer *buffer)\n>  {\n> +       if (--bufferReturnCounters_[buffer] > 0)\n> +               return;\n> +\n> +       bufferReturnCounters_.erase(buffer);\n> +\n>         IPU3Frames::Info *info = frameInfos_.find(buffer);\n>         if (!info)\n>                 return;\n> @@ -1354,6 +1385,11 @@ void IPU3CameraData::paramBufferReady(FrameBuffer\n> *buffer)\n>\n>  void IPU3CameraData::statBufferReady(FrameBuffer *buffer)\n>  {\n> +       if (--bufferReturnCounters_[buffer] > 0)\n> +               return;\n> +\n> +       bufferReturnCounters_.erase(buffer);\n> +\n>         IPU3Frames::Info *info = frameInfos_.find(buffer);\n>         if (!info)\n>                 return;\n> --\n> 2.42.0.459.ge4e396fd5e-goog\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 31CACBDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 15 Nov 2023 08:27:06 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 633CA629BC;\n\tWed, 15 Nov 2023 09:27:05 +0100 (CET)","from mail-lj1-x232.google.com (mail-lj1-x232.google.com\n\t[IPv6:2a00:1450:4864:20::232])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C0A6761DB2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 15 Nov 2023 09:27:03 +0100 (CET)","by mail-lj1-x232.google.com with SMTP id\n\t38308e7fff4ca-2c501bd6ff1so88011491fa.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 15 Nov 2023 00:27:03 -0800 (PST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1700036825;\n\tbh=kaygSOtkHa/S8XU/DZKL8ZQFN7IWwtALySCxAUZg54Y=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=Bp7JLjC3EEwb7HZ/+FwEK/nFOVzhde0IfWxa3SGx3fGduZh2w5xkZEX7BDut+xwUq\n\t7szyb0zVblxNPrYvQQV2JGAiC3dv9FOj+ZE1A7o++tSuXbyw5bIpskjIbt9de/wHNq\n\tkq1+zeDk26REQg9ED1wNBUrw4d5Mg6H+BDunXEZZLbi59lsTKhe7ZmHUhkDVduWshA\n\tYBj5bszkcF9aEcshgvrYztLOBWhsYUyU8ZMtgc0R6FJDb+kWwQwEwJORdcmqPyTWhK\n\tN6YZz6mP4M0A2p8btPHwDykOS+HWxS9NqN/LYhhoMOnnkVMR1tFKvqVXIexa8s3gz/\n\tjCL3L5mAuxUrg==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=chromium.org; s=google; t=1700036822; x=1700641622;\n\tdarn=lists.libcamera.org; \n\th=to:subject:message-id:date:from:in-reply-to:references:mime-version\n\t:from:to:cc:subject:date:message-id:reply-to;\n\tbh=NYZ3pAPW8yBavLw7CGf/LE5M4pJknuxvYkRPnb0Iiyw=;\n\tb=B9o2V8CVAyxt+piDcTq8VHIGR6IUvFffumc1mi6ylwBHVEmI7XN/rWND/iaIgoavmg\n\t+qylskTcTLLtwVih/9wi1h9WW2FX962uRnLnYaxuhpxZiFEZILtQ1oHJ3MTIooTk3NsR\n\tFjv0enK8RtZIwV/k13Vj5PHVKPlvM7JwQOqwE="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=chromium.org\n\theader.i=@chromium.org header.b=\"B9o2V8CV\"; \n\tdkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1700036822; x=1700641622;\n\th=to:subject:message-id:date:from:in-reply-to:references:mime-version\n\t:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n\tbh=NYZ3pAPW8yBavLw7CGf/LE5M4pJknuxvYkRPnb0Iiyw=;\n\tb=CssFK8rl9xbO+qnwZf6jLVGdGDMeWjjTEyzzb2zZJIGu0ZPYmZn0r+Fz/161udj8pu\n\tkrDiME6w15AQWzL9aQiyoySJDGqacQaFv7o+MgFsEQzkfamow3IQaATdRyCV05eVpMbJ\n\tbOFxk2cHUliFYdLx+d/Mq1Enejd4LEGs+BE5qQQTeS3CnqBsaEcZZwmScxBHFr7wWWrr\n\tagcrFUTJjJSbK81n87GpgSWrvvsRRrRr7ZjBXvUpoGXoFORkwivQLj6Z9grg7V2P73el\n\tDwj92SOl/Aa7qH8GyN8xRG/8N+MRKwzixAN2PAiveqL/jTUlIyiJTpo9UapQqV/2Nox9\n\trRYw==","X-Gm-Message-State":"AOJu0YwAX9VKpG/9o/mcBD7a2IzjiXjwCYC58Rt2N4IdxaTxUamzjryq\n\t+71gGvE4U1l1f3RUVF+9hFF2CZ68HnGQbjRHSjkIPCjI5hfWDLZ2","X-Google-Smtp-Source":"AGHT+IGyFe+OeAOb9c0KPOcxSRvpgR/h1gQF8eYo0nuJgFpcvXBp93iz8a8RCWHcx10BEHWL4Y4Gv4QvnXVNPbo1DdM=","X-Received":"by 2002:a2e:9014:0:b0:2c0:52e:eafa with SMTP id\n\th20-20020a2e9014000000b002c0052eeafamr3639407ljg.29.1700036822355;\n\tWed, 15 Nov 2023 00:27:02 -0800 (PST)","MIME-Version":"1.0","References":"<20230918085222.500697-1-chenghaoyang@chromium.org>\n\t<20230918085222.500697-2-chenghaoyang@chromium.org>","In-Reply-To":"<20230918085222.500697-2-chenghaoyang@chromium.org>","Date":"Wed, 15 Nov 2023 16:26:51 +0800","Message-ID":"<CAEB1ahsC=huDcFW-0Am7vKvrnNDpnPXsCCXUvEqX3cyyHH5mMA@mail.gmail.com>","To":"libcamera-devel@lists.libcamera.org","Content-Type":"multipart/alternative; boundary=\"000000000000e6e528060a2caa1c\"","Subject":"Re: [libcamera-devel] [PATCH v1 1/1] libcamera: Fix ipu3's issue of\n\tfirst black frame","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>","From":"Cheng-Hao Yang via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Cheng-Hao Yang <chenghaoyang@chromium.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]