From patchwork Mon Dec 6 23:39:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 15060 X-Patchwork-Delegate: kieran.bingham@ideasonboard.com Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 8727AC3258 for ; Mon, 6 Dec 2021 23:40:01 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id AD6AA608E0; Tue, 7 Dec 2021 00:39:59 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="ln9Xg4L1"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 4A327607DE for ; Tue, 7 Dec 2021 00:39:55 +0100 (CET) Received: from Monstersaurus.local (cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id EFE9F556; Tue, 7 Dec 2021 00:39:54 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1638833995; bh=FuGogmiA11ukCqWdkU6nDMdWFzqyUmYeDshrP/O2gkc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ln9Xg4L1fQzJg0ixGV9wOofibCEqRDuKP6U8EPW2vtzp8dqmaEPb9N2twrGWQ8jmG DFDQ2j7Cto+6hDu9HbbNOWy9aoeWK6xjzCPKOcfJz7z1HpJm+yIEyKsGDY5dvGkUoi JmnZdtrtjCc65WbyZCrao1ylHhSL3YeFdTkpTaOo= From: Kieran Bingham To: libcamera devel Date: Mon, 6 Dec 2021 23:39:44 +0000 Message-Id: <20211206233948.1351206-5-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211206233948.1351206-1-kieran.bingham@ideasonboard.com> References: <20211206233948.1351206-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 4/8] cam: Use Sensor sequence numbers and detect frame drop X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The stream buffer sequence numbers might produce sequential monotonic sequence numbers from an ISP producing a frame for every input. This however, doesn't capture pipeline stalls that cause us to miss or drop frames from the sensor. Use the SensorSequence metadata to report sequence information, and add a warning to the summary line if a frame drop is detected. Signed-off-by: Kieran Bingham Reviewed-by: Umang Jain --- src/cam/camera_session.cpp | 17 +++++++++++++++-- src/cam/camera_session.h | 1 + 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/cam/camera_session.cpp b/src/cam/camera_session.cpp index 50170723c30f..f9495f7f7e42 100644 --- a/src/cam/camera_session.cpp +++ b/src/cam/camera_session.cpp @@ -29,8 +29,8 @@ CameraSession::CameraSession(CameraManager *cm, unsigned int cameraIndex, const OptionsParser::Options &options) : options_(options), cameraIndex_(cameraIndex), last_(0), - queueCount_(0), captureCount_(0), captureLimit_(0), - printMetadata_(false) + sequence_(0), queueCount_(0), captureCount_(0), + captureLimit_(0), printMetadata_(false) { char *endptr; unsigned long index = strtoul(cameraId.c_str(), &endptr, 10); @@ -375,6 +375,11 @@ void CameraSession::processRequest(Request *request) << std::setw(6) << std::setfill('0') << ts / 1000 % 1000000 << " (" << std::fixed << std::setprecision(2) << fps << " fps)"; + uint64_t sequence = request->metadata().get(controls::SensorSequence); + // Report capture sequence number + info << " [" << std::setw(6) << std::setfill('0') + << sequence << "]"; + for (auto it = buffers.begin(); it != buffers.end(); ++it) { const Stream *stream = it->first; FrameBuffer *buffer = it->second; @@ -398,6 +403,14 @@ void CameraSession::processRequest(Request *request) requeue = false; } + /* Handle basic frame drop detection and reporting. */ + if (sequence_ == 0) + sequence_ = sequence - 1; + unsigned int drops = sequence - sequence_ - 1; + if (drops) + info << " *" << drops << " frame drops detected* "; + sequence_ = sequence; + std::cout << info.str() << std::endl; if (printMetadata_) { diff --git a/src/cam/camera_session.h b/src/cam/camera_session.h index bf966bd15ab0..14dc1421da4d 100644 --- a/src/cam/camera_session.h +++ b/src/cam/camera_session.h @@ -65,6 +65,7 @@ private: unsigned int cameraIndex_; uint64_t last_; + uint64_t sequence_; unsigned int queueCount_; unsigned int captureCount_;