{"id":19525,"url":"https://patchwork.libcamera.org/api/patches/19525/?format=json","web_url":"https://patchwork.libcamera.org/patch/19525/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20240221174015.52958-4-jacopo.mondi@ideasonboard.com>","date":"2024-02-21T17:40:11","name":"[3/5] libcamera: rkisp1: Replace usage of RkISP1FrameInfo","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"f5800607d1c74d418af89f722eb495003d6f7684","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/?format=json","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/19525/mbox/","series":[{"id":4176,"url":"https://patchwork.libcamera.org/api/series/4176/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=4176","date":"2024-02-21T17:40:08","name":"libcamera: Replace IPU3/RkISP1FrameInfo","version":1,"mbox":"https://patchwork.libcamera.org/series/4176/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/19525/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/19525/checks/","tags":{},"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 E9096C0F1B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 21 Feb 2024 17:40:34 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5EE0F62813;\n\tWed, 21 Feb 2024 18:40:32 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6596E62819\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 21 Feb 2024 18:40:28 +0100 (CET)","from localhost.localdomain (unknown\n\t[IPv6:2001:b07:5d2e:52c9:cc1e:e404:491f:e6ea])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 52560720;\n\tWed, 21 Feb 2024 18:40:20 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"PZC7h+c6\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1708537220;\n\tbh=U7bG37XpJKu3HPF5MsigoAx1N4BONFkpnY9U0KaM2nc=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=PZC7h+c625e0y24bIqahWZsahZTYS4+k3A3O6CqZwaYZ1Q1CZ06SGMMx57WH+p9IB\n\tDSs1S1xrYAi+OZ2NJPIOVqZCiHz4utwdOkhY0184uqYlRa5qYCm7MM8kOttHLKUy0y\n\tqXcHe+5F53NhMo4w2B2DVCI09lWSH2SodQZ7QzXQ=","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Subject":"[PATCH 3/5] libcamera: rkisp1: Replace usage of RkISP1FrameInfo","Date":"Wed, 21 Feb 2024 18:40:11 +0100","Message-ID":"<20240221174015.52958-4-jacopo.mondi@ideasonboard.com>","X-Mailer":"git-send-email 2.43.0","In-Reply-To":"<20240221174015.52958-1-jacopo.mondi@ideasonboard.com>","References":"<20240221174015.52958-1-jacopo.mondi@ideasonboard.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","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":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"Now that the pipeline handler can create a private derived class of\nRequest::Private, use it to store the pipeline specific data.\n\nIn the case of RkISP1 we associate the statistic and paramters buffers\nwith a Request.\n\nAs the IPA sends notifications for paramters and statistics buffer by\nidentifying them by frame id, associate the frame ids and the Request\nin the RkISP1CameraData class.\n\nThis replaces the functionalities of RkISP1FrameInfo which can now be\nremoved.\n\nSigned-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n---\n src/libcamera/pipeline/rkisp1/rkisp1.cpp | 358 ++++++++---------------\n 1 file changed, 128 insertions(+), 230 deletions(-)","diff":"diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex e981e60758f7..f2163f528251 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -49,76 +49,63 @@ namespace libcamera {\n \n LOG_DEFINE_CATEGORY(RkISP1)\n \n-class PipelineHandlerRkISP1;\n-class RkISP1CameraData;\n+class RkISP1Request : public Request::Private\n+{\n+public:\n+\tRkISP1Request(Camera *camera)\n+\t\t: Request::Private(camera)\n+\t{\n+\t}\n \n-struct RkISP1FrameInfo {\n-\tunsigned int frame;\n-\tRequest *request;\n+\tbool hasPendingBuffers(bool isRaw) const;\n \n-\tFrameBuffer *paramBuffer;\n \tFrameBuffer *statBuffer;\n-\tFrameBuffer *mainPathBuffer;\n-\tFrameBuffer *selfPathBuffer;\n+\tFrameBuffer *paramBuffer;\n+\n+\t/* The frame number this request is associated with. */\n+\tunsigned int frame;\n \n \tbool paramDequeued;\n \tbool metadataProcessed;\n };\n \n-class RkISP1Frames\n-{\n-public:\n-\tRkISP1Frames(PipelineHandler *pipe);\n-\n-\tRkISP1FrameInfo *create(const RkISP1CameraData *data, Request *request,\n-\t\t\t\tbool isRaw);\n-\tint destroy(unsigned int frame);\n-\tvoid clear();\n-\n-\tRkISP1FrameInfo *find(unsigned int frame);\n-\tRkISP1FrameInfo *find(FrameBuffer *buffer);\n-\tRkISP1FrameInfo *find(Request *request);\n-\n-private:\n-\tPipelineHandlerRkISP1 *pipe_;\n-\tstd::map<unsigned int, RkISP1FrameInfo *> frameInfo_;\n-};\n-\n-class RkISP1Request : public Request::Private\n+bool RkISP1Request::hasPendingBuffers(bool isRaw) const\n {\n-public:\n-\tRkISP1Request(Camera *camera)\n-\t\t: Request::Private(camera)\n-\t{\n-\t}\n-};\n+\treturn Request::Private::hasPendingBuffers() ||\n+\t       !metadataProcessed || (!isRaw && !paramDequeued);\n+}\n \n+class PipelineHandlerRkISP1;\n class RkISP1CameraData : public Camera::Private\n {\n public:\n \tRkISP1CameraData(PipelineHandler *pipe, RkISP1MainPath *mainPath,\n \t\t\t RkISP1SelfPath *selfPath)\n-\t\t: Camera::Private(pipe), frame_(0), frameInfo_(pipe),\n-\t\t  mainPath_(mainPath), selfPath_(selfPath)\n+\t\t: Camera::Private(pipe), frame_(0), mainPath_(mainPath),\n+\t\t  selfPath_(selfPath)\n \t{\n \t}\n \n \tPipelineHandlerRkISP1 *pipe();\n \tint loadIPA(unsigned int hwRevision);\n \n+\tvoid addRequest(RkISP1Request *request);\n+\n \tStream mainPathStream_;\n \tStream selfPathStream_;\n \tstd::unique_ptr<CameraSensor> sensor_;\n \tstd::unique_ptr<DelayedControls> delayedCtrls_;\n \tunsigned int frame_;\n \tstd::vector<IPABuffer> ipaBuffers_;\n-\tRkISP1Frames frameInfo_;\n \n \tRkISP1MainPath *mainPath_;\n \tRkISP1SelfPath *selfPath_;\n \n \tstd::unique_ptr<ipa::rkisp1::IPAProxyRkISP1> ipa_;\n \n+\t/* Associate a frame id with a Request. */\n+\tstd::map<unsigned int, RkISP1Request *> requestMap_;\n+\n private:\n \tvoid paramFilled(unsigned int frame);\n \tvoid setSensorControls(unsigned int frame,\n@@ -181,13 +168,17 @@ private:\n \t\treturn static_cast<RkISP1CameraData *>(camera->_d());\n \t}\n \n+\tRkISP1Request *cameraRequest(Request *request)\n+\t{\n+\t\treturn static_cast<RkISP1Request *>(request->_d());\n+\t}\n+\n \tfriend RkISP1CameraData;\n-\tfriend RkISP1Frames;\n \n \tint initLinks(Camera *camera, const CameraSensor *sensor,\n \t\t      const RkISP1CameraConfiguration &config);\n \tint createCamera(MediaEntity *sensor);\n-\tvoid tryCompleteRequest(RkISP1FrameInfo *info);\n+\tvoid tryCompleteRequest(RkISP1Request *request);\n \tvoid bufferReady(FrameBuffer *buffer);\n \tvoid paramReady(FrameBuffer *buffer);\n \tvoid statReady(FrameBuffer *buffer);\n@@ -218,129 +209,6 @@ private:\n \tconst MediaPad *ispSink_;\n };\n \n-RkISP1Frames::RkISP1Frames(PipelineHandler *pipe)\n-\t: pipe_(static_cast<PipelineHandlerRkISP1 *>(pipe))\n-{\n-}\n-\n-RkISP1FrameInfo *RkISP1Frames::create(const RkISP1CameraData *data, Request *request,\n-\t\t\t\t      bool isRaw)\n-{\n-\tunsigned int frame = data->frame_;\n-\n-\tFrameBuffer *paramBuffer = nullptr;\n-\tFrameBuffer *statBuffer = nullptr;\n-\n-\tif (!isRaw) {\n-\t\tif (pipe_->availableParamBuffers_.empty()) {\n-\t\t\tLOG(RkISP1, Error) << \"Parameters buffer underrun\";\n-\t\t\treturn nullptr;\n-\t\t}\n-\n-\t\tif (pipe_->availableStatBuffers_.empty()) {\n-\t\t\tLOG(RkISP1, Error) << \"Statistic buffer underrun\";\n-\t\t\treturn nullptr;\n-\t\t}\n-\n-\t\tparamBuffer = pipe_->availableParamBuffers_.front();\n-\t\tpipe_->availableParamBuffers_.pop();\n-\n-\t\tstatBuffer = pipe_->availableStatBuffers_.front();\n-\t\tpipe_->availableStatBuffers_.pop();\n-\t}\n-\n-\tFrameBuffer *mainPathBuffer = request->findBuffer(&data->mainPathStream_);\n-\tFrameBuffer *selfPathBuffer = request->findBuffer(&data->selfPathStream_);\n-\n-\tRkISP1FrameInfo *info = new RkISP1FrameInfo;\n-\n-\tinfo->frame = frame;\n-\tinfo->request = request;\n-\tinfo->paramBuffer = paramBuffer;\n-\tinfo->mainPathBuffer = mainPathBuffer;\n-\tinfo->selfPathBuffer = selfPathBuffer;\n-\tinfo->statBuffer = statBuffer;\n-\tinfo->paramDequeued = false;\n-\tinfo->metadataProcessed = false;\n-\n-\tframeInfo_[frame] = info;\n-\n-\treturn info;\n-}\n-\n-int RkISP1Frames::destroy(unsigned int frame)\n-{\n-\tRkISP1FrameInfo *info = find(frame);\n-\tif (!info)\n-\t\treturn -ENOENT;\n-\n-\tpipe_->availableParamBuffers_.push(info->paramBuffer);\n-\tpipe_->availableStatBuffers_.push(info->statBuffer);\n-\n-\tframeInfo_.erase(info->frame);\n-\n-\tdelete info;\n-\n-\treturn 0;\n-}\n-\n-void RkISP1Frames::clear()\n-{\n-\tfor (const auto &entry : frameInfo_) {\n-\t\tRkISP1FrameInfo *info = entry.second;\n-\n-\t\tpipe_->availableParamBuffers_.push(info->paramBuffer);\n-\t\tpipe_->availableStatBuffers_.push(info->statBuffer);\n-\n-\t\tdelete info;\n-\t}\n-\n-\tframeInfo_.clear();\n-}\n-\n-RkISP1FrameInfo *RkISP1Frames::find(unsigned int frame)\n-{\n-\tauto itInfo = frameInfo_.find(frame);\n-\n-\tif (itInfo != frameInfo_.end())\n-\t\treturn itInfo->second;\n-\n-\tLOG(RkISP1, Fatal) << \"Can't locate info from frame\";\n-\n-\treturn nullptr;\n-}\n-\n-RkISP1FrameInfo *RkISP1Frames::find(FrameBuffer *buffer)\n-{\n-\tfor (auto &itInfo : frameInfo_) {\n-\t\tRkISP1FrameInfo *info = itInfo.second;\n-\n-\t\tif (info->paramBuffer == buffer ||\n-\t\t    info->statBuffer == buffer ||\n-\t\t    info->mainPathBuffer == buffer ||\n-\t\t    info->selfPathBuffer == buffer)\n-\t\t\treturn info;\n-\t}\n-\n-\tLOG(RkISP1, Fatal) << \"Can't locate info from buffer\";\n-\n-\treturn nullptr;\n-}\n-\n-RkISP1FrameInfo *RkISP1Frames::find(Request *request)\n-{\n-\tfor (auto &itInfo : frameInfo_) {\n-\t\tRkISP1FrameInfo *info = itInfo.second;\n-\n-\t\tif (info->request == request)\n-\t\t\treturn info;\n-\t}\n-\n-\tLOG(RkISP1, Fatal) << \"Can't locate info from request\";\n-\n-\treturn nullptr;\n-}\n-\n PipelineHandlerRkISP1 *RkISP1CameraData::pipe()\n {\n \treturn static_cast<PipelineHandlerRkISP1 *>(Camera::Private::pipe());\n@@ -391,23 +259,34 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision)\n \treturn 0;\n }\n \n+void RkISP1CameraData::addRequest(RkISP1Request *request)\n+{\n+\t/* Associate the request and the frame number. */\n+\trequest->frame = frame_;\n+\trequestMap_[frame_] = request;\n+\tframe_++;\n+}\n+\n void RkISP1CameraData::paramFilled(unsigned int frame)\n {\n \tPipelineHandlerRkISP1 *pipe = RkISP1CameraData::pipe();\n-\tRkISP1FrameInfo *info = frameInfo_.find(frame);\n-\tif (!info)\n-\t\treturn;\n+\tRkISP1Request *request = requestMap_.at(frame);\n+\tASSERT(request);\n \n-\tinfo->paramBuffer->_d()->metadata().planes()[0].bytesused =\n+\trequest->paramBuffer->_d()->metadata().planes()[0].bytesused =\n \t\tsizeof(struct rkisp1_params_cfg);\n-\tpipe->param_->queueBuffer(info->paramBuffer);\n-\tpipe->stat_->queueBuffer(info->statBuffer);\n-\n-\tif (info->mainPathBuffer)\n-\t\tmainPath_->queueBuffer(info->mainPathBuffer);\n-\n-\tif (selfPath_ && info->selfPathBuffer)\n-\t\tselfPath_->queueBuffer(info->selfPathBuffer);\n+\tpipe->param_->queueBuffer(request->paramBuffer);\n+\tpipe->stat_->queueBuffer(request->statBuffer);\n+\n+\tFrameBuffer *mainPathBuffer =\n+\t\trequest->_o<Request>()->findBuffer(&mainPathStream_);\n+\tif (mainPathBuffer)\n+\t\tmainPath_->queueBuffer(mainPathBuffer);\n+\n+\tFrameBuffer *selfPathBuffer =\n+\t\trequest->_o<Request>()->findBuffer(&selfPathStream_);\n+\tif (selfPath_ && selfPathBuffer)\n+\t\tselfPath_->queueBuffer(selfPathBuffer);\n }\n \n void RkISP1CameraData::setSensorControls([[maybe_unused]] unsigned int frame,\n@@ -418,14 +297,13 @@ void RkISP1CameraData::setSensorControls([[maybe_unused]] unsigned int frame,\n \n void RkISP1CameraData::metadataReady(unsigned int frame, const ControlList &metadata)\n {\n-\tRkISP1FrameInfo *info = frameInfo_.find(frame);\n-\tif (!info)\n-\t\treturn;\n+\tRkISP1Request *request = requestMap_.at(frame);\n+\tASSERT(request);\n \n-\tinfo->request->metadata().merge(metadata);\n-\tinfo->metadataProcessed = true;\n+\trequest->_o<Request>()->metadata().merge(metadata);\n+\trequest->metadataProcessed = true;\n \n-\tpipe()->tryCompleteRequest(info);\n+\tpipe()->tryCompleteRequest(request);\n }\n \n /* -----------------------------------------------------------------------------\n@@ -1025,7 +903,7 @@ void PipelineHandlerRkISP1::stopDevice(Camera *camera)\n \t}\n \n \tASSERT(data->queuedRequests_.empty());\n-\tdata->frameInfo_.clear();\n+\tdata->requestMap_.clear();\n \n \tfreeBuffers(camera);\n \n@@ -1042,24 +920,60 @@ std::unique_ptr<Request> PipelineHandlerRkISP1::createRequestDevice(Camera *came\n int PipelineHandlerRkISP1::queueRequestDevice(Camera *camera, Request *request)\n {\n \tRkISP1CameraData *data = cameraData(camera);\n+\tRkISP1Request *rkisp1Request = cameraRequest(request);\n \n-\tRkISP1FrameInfo *info = data->frameInfo_.create(data, request, isRaw_);\n-\tif (!info)\n-\t\treturn -ENOENT;\n+\tdata->addRequest(rkisp1Request);\n \n-\tdata->ipa_->queueRequest(data->frame_, request->controls());\n+\t/*\n+\t * If we're operating in RAW mode (only one RAW stream is captured)\n+\t * then we simply queue buffers to the video devices as we don't\n+\t * need to run the IPA.\n+\t */\n \tif (isRaw_) {\n-\t\tif (info->mainPathBuffer)\n-\t\t\tdata->mainPath_->queueBuffer(info->mainPathBuffer);\n+\t\tFrameBuffer *mainPathBuffer =\n+\t\t\trequest->findBuffer(&data->mainPathStream_);\n+\t\tif (mainPathBuffer)\n+\t\t\tdata->mainPath_->queueBuffer(mainPathBuffer);\n \n-\t\tif (data->selfPath_ && info->selfPathBuffer)\n-\t\t\tdata->selfPath_->queueBuffer(info->selfPathBuffer);\n-\t} else {\n-\t\tdata->ipa_->fillParamsBuffer(data->frame_,\n-\t\t\t\t\t     info->paramBuffer->cookie());\n+\t\tFrameBuffer *selfPathBuffer =\n+\t\t\trequest->findBuffer(&data->selfPathStream_);\n+\t\tif (data->selfPath_ && selfPathBuffer)\n+\t\t\tdata->selfPath_->queueBuffer(selfPathBuffer);\n+\n+\t\treturn 0;\n+\t}\n+\n+\t/*\n+\t * If we run the IPA we need to associate a parameters and a statistics\n+\t * buffer with the Request and associate the request with the current\n+\t * frame number.\n+\t *\n+\t * Associate the stat and frame buffers to a Request (if available)\n+\t * and then run the IPA.\n+\t */\n+\tif (availableParamBuffers_.empty()) {\n+\t\tLOG(RkISP1, Error) << \"Parameters buffer underrun\";\n+\t\treturn -ENOENT;\n \t}\n \n-\tdata->frame_++;\n+\tif (availableStatBuffers_.empty()) {\n+\t\tLOG(RkISP1, Error) << \"Statistic buffer underrun\";\n+\t\treturn -ENOENT;\n+\t}\n+\n+\trkisp1Request->paramBuffer = availableParamBuffers_.front();\n+\trkisp1Request->paramDequeued = false;\n+\trkisp1Request->paramBuffer->_d()->setRequest(request);\n+\tavailableParamBuffers_.pop();\n+\n+\trkisp1Request->statBuffer = availableStatBuffers_.front();\n+\trkisp1Request->metadataProcessed = false;\n+\trkisp1Request->statBuffer->_d()->setRequest(request);\n+\tavailableStatBuffers_.pop();\n+\n+\tdata->ipa_->queueRequest(rkisp1Request->frame, request->controls());\n+\tdata->ipa_->fillParamsBuffer(rkisp1Request->frame,\n+\t\t\t\t     rkisp1Request->paramBuffer->cookie());\n \n \treturn 0;\n }\n@@ -1251,37 +1165,28 @@ bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)\n  * Buffer Handling\n  */\n \n-void PipelineHandlerRkISP1::tryCompleteRequest(RkISP1FrameInfo *info)\n+void PipelineHandlerRkISP1::tryCompleteRequest(RkISP1Request *request)\n {\n \tRkISP1CameraData *data = cameraData(activeCamera_);\n-\tRequest *request = info->request;\n-\n-\tif (request->hasPendingBuffers())\n-\t\treturn;\n-\n-\tif (!info->metadataProcessed)\n-\t\treturn;\n \n-\tif (!isRaw_ && !info->paramDequeued)\n+\tif (request->hasPendingBuffers(isRaw_))\n \t\treturn;\n \n-\tdata->frameInfo_.destroy(info->frame);\n+\t/* Return the stat and param buffers to the pipeline. */\n+\tavailableParamBuffers_.push(request->paramBuffer);\n+\tavailableStatBuffers_.push(request->statBuffer);\n+\tdata->requestMap_.erase(request->frame);\n \n-\tcompleteRequest(request);\n+\tcompleteRequest(request->_o<Request>());\n }\n \n void PipelineHandlerRkISP1::bufferReady(FrameBuffer *buffer)\n {\n \tASSERT(activeCamera_);\n \tRkISP1CameraData *data = cameraData(activeCamera_);\n-\n-\tRkISP1FrameInfo *info = data->frameInfo_.find(buffer);\n-\tif (!info)\n-\t\treturn;\n+\tRkISP1Request *request = cameraRequest(buffer->request());\n \n \tconst FrameMetadata &metadata = buffer->metadata();\n-\tRequest *request = buffer->request();\n-\n \tif (metadata.status != FrameMetadata::FrameCancelled) {\n \t\t/*\n \t\t * Record the sensor's timestamp in the request metadata.\n@@ -1289,55 +1194,48 @@ void PipelineHandlerRkISP1::bufferReady(FrameBuffer *buffer)\n \t\t * \\todo The sensor timestamp should be better estimated by connecting\n \t\t * to the V4L2Device::frameStart signal.\n \t\t */\n-\t\trequest->metadata().set(controls::SensorTimestamp,\n-\t\t\t\t\tmetadata.timestamp);\n+\t\trequest->_o<Request>()->metadata().set(controls::SensorTimestamp,\n+\t\t\t\t\t\t       metadata.timestamp);\n \n \t\tif (isRaw_) {\n \t\t\tconst ControlList &ctrls =\n \t\t\t\tdata->delayedCtrls_->get(metadata.sequence);\n-\t\t\tdata->ipa_->processStatsBuffer(info->frame, 0, ctrls);\n+\t\t\tdata->ipa_->processStatsBuffer(request->frame, 0, ctrls);\n \t\t}\n \t} else {\n \t\tif (isRaw_)\n-\t\t\tinfo->metadataProcessed = true;\n+\t\t\trequest->metadataProcessed = true;\n \t}\n \n-\tcompleteBuffer(request, buffer);\n-\ttryCompleteRequest(info);\n+\tcompleteBuffer(request->_o<Request>(), buffer);\n+\ttryCompleteRequest(request);\n }\n \n void PipelineHandlerRkISP1::paramReady(FrameBuffer *buffer)\n {\n \tASSERT(activeCamera_);\n-\tRkISP1CameraData *data = cameraData(activeCamera_);\n+\tRkISP1Request *request = cameraRequest(buffer->request());\n \n-\tRkISP1FrameInfo *info = data->frameInfo_.find(buffer);\n-\tif (!info)\n-\t\treturn;\n-\n-\tinfo->paramDequeued = true;\n-\ttryCompleteRequest(info);\n+\trequest->paramDequeued = true;\n+\ttryCompleteRequest(request);\n }\n \n void PipelineHandlerRkISP1::statReady(FrameBuffer *buffer)\n {\n \tASSERT(activeCamera_);\n \tRkISP1CameraData *data = cameraData(activeCamera_);\n-\n-\tRkISP1FrameInfo *info = data->frameInfo_.find(buffer);\n-\tif (!info)\n-\t\treturn;\n+\tRkISP1Request *request = cameraRequest(buffer->request());\n \n \tif (buffer->metadata().status == FrameMetadata::FrameCancelled) {\n-\t\tinfo->metadataProcessed = true;\n-\t\ttryCompleteRequest(info);\n+\t\trequest->metadataProcessed = true;\n+\t\ttryCompleteRequest(request);\n \t\treturn;\n \t}\n \n \tif (data->frame_ <= buffer->metadata().sequence)\n \t\tdata->frame_ = buffer->metadata().sequence + 1;\n \n-\tdata->ipa_->processStatsBuffer(info->frame, info->statBuffer->cookie(),\n+\tdata->ipa_->processStatsBuffer(request->frame, request->statBuffer->cookie(),\n \t\t\t\t       data->delayedCtrls_->get(buffer->metadata().sequence));\n }\n \n","prefixes":["3/5"]}