Patch Detail
Show a patch.
GET /api/patches/19658/?format=api
{ "id": 19658, "url": "https://patchwork.libcamera.org/api/patches/19658/?format=api", "web_url": "https://patchwork.libcamera.org/patch/19658/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20240311123234.32925-3-jacopo.mondi@ideasonboard.com>", "date": "2024-03-11T12:32:30", "name": "[v2,2/4] libcamera: rkisp1: Replace usage of RkISP1FrameInfo", "commit_ref": null, "pull_url": null, "state": "not-applicable", "archived": false, "hash": "07beaa3dc0789a1deaef2550da4ab59773f3c7b1", "submitter": { "id": 143, "url": "https://patchwork.libcamera.org/api/people/143/?format=api", "name": "Jacopo Mondi", "email": "jacopo.mondi@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/19658/mbox/", "series": [ { "id": 4211, "url": "https://patchwork.libcamera.org/api/series/4211/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=4211", "date": "2024-03-11T12:32:28", "name": "libcamera: Replace IPU3/RkISP1FrameInfo", "version": 2, "mbox": "https://patchwork.libcamera.org/series/4211/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/19658/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/19658/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 E1C31C32A3\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 11 Mar 2024 12:32:50 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0B0CC62C89;\n\tMon, 11 Mar 2024 13:32:48 +0100 (CET)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 285B76286F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 11 Mar 2024 13:32:45 +0100 (CET)", "from localhost.localdomain (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id DA4DDC85;\n\tMon, 11 Mar 2024 13:32:23 +0100 (CET)" ], "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"ojFxlMA0\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1710160344;\n\tbh=hMSBLGSj2sGGPKdpA0Ln0LMOtcUanFa0GBH/0ec3ZFI=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=ojFxlMA042u5lcbX+Y6m4otsJwjj7497fifZecJViI/edeacOMtqg7+T01oj/rTH9\n\tiL971FkVveQhWgVF2oua8PBFjZPG6zYLtssJQKws28HtMac88YCC/ln9m9xorfgue9\n\tdOm6Rv10JJEspM1WMPN7PG/yECJEH46EydxTF3pE=", "From": "Jacopo Mondi <jacopo.mondi@ideasonboard.com>", "To": "libcamera-devel@lists.libcamera.org", "Subject": "[PATCH v2 2/4] libcamera: rkisp1: Replace usage of RkISP1FrameInfo", "Date": "Mon, 11 Mar 2024 13:32:30 +0100", "Message-ID": "<20240311123234.32925-3-jacopo.mondi@ideasonboard.com>", "X-Mailer": "git-send-email 2.43.2", "In-Reply-To": "<20240311123234.32925-1-jacopo.mondi@ideasonboard.com>", "References": "<20240311123234.32925-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>\nReviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>\nReviewed-by: Daniel Scally <dan.scally@ideasonboard.com>\nTested-by: Daniel Scally <dan.scally@ideasonboard.com>\n---\n src/libcamera/pipeline/rkisp1/rkisp1.cpp | 359 +++++++++--------------\n 1 file changed, 138 insertions(+), 221 deletions(-)", "diff": "diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex 586b46d64630..0479e243d392 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -39,6 +39,7 @@\n #include \"libcamera/internal/ipa_manager.h\"\n #include \"libcamera/internal/media_device.h\"\n #include \"libcamera/internal/pipeline_handler.h\"\n+#include \"libcamera/internal/request.h\"\n #include \"libcamera/internal/v4l2_subdevice.h\"\n #include \"libcamera/internal/v4l2_videodevice.h\"\n \n@@ -48,67 +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+bool RkISP1Request::hasPendingBuffers(bool isRaw) const\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+\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@@ -157,6 +154,8 @@ public:\n \tint start(Camera *camera, const ControlList *controls) override;\n \tvoid stopDevice(Camera *camera) override;\n \n+\tstd::unique_ptr<Request> createRequestDevice(Camera *camera,\n+\t\t\t\t\t\t uint64_t cookie) override;\n \tint queueRequestDevice(Camera *camera, Request *request) override;\n \n \tbool match(DeviceEnumerator *enumerator) override;\n@@ -169,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@@ -206,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@@ -379,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@@ -406,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@@ -1013,34 +903,77 @@ 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 \tactiveCamera_ = nullptr;\n }\n \n+std::unique_ptr<Request> PipelineHandlerRkISP1::createRequestDevice(Camera *camera,\n+\t\t\t\t\t\t\t\t uint64_t cookie)\n+{\n+\tauto request = std::make_unique<RkISP1Request>(camera);\n+\treturn Request::create(std::move(request), cookie);\n+}\n+\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+\tdata->ipa_->queueRequest(rkisp1Request->frame, request->controls());\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+\tif (availableStatBuffers_.empty()) {\n+\t\tLOG(RkISP1, Error) << \"Statistic buffer underrun\";\n+\t\treturn -ENOENT;\n \t}\n \n-\tdata->frame_++;\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_->fillParamsBuffer(rkisp1Request->frame,\n+\t\t\t\t rkisp1Request->paramBuffer->cookie());\n \n \treturn 0;\n }\n@@ -1232,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+\tif (request->hasPendingBuffers(isRaw_))\n \t\treturn;\n \n-\tif (!info->metadataProcessed)\n-\t\treturn;\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-\tif (!isRaw_ && !info->paramDequeued)\n-\t\treturn;\n-\n-\tdata->frameInfo_.destroy(info->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@@ -1270,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": [ "v2", "2/4" ] }