From patchwork Thu Nov 18 16:42:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 14635 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 DEE58BDB1C for ; Thu, 18 Nov 2021 16:43:18 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9A6BD60231; Thu, 18 Nov 2021 17:43:18 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="LS22uVRC"; dkim-atps=neutral Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E469D60231 for ; Thu, 18 Nov 2021 17:43:16 +0100 (CET) Received: by mail-wm1-x32b.google.com with SMTP id r9-20020a7bc089000000b00332f4abf43fso6178159wmh.0 for ; Thu, 18 Nov 2021 08:43:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=xASTrRlxATWNruYLPbJ8vWIhjvUUsiGBYeSYgllvUWY=; b=LS22uVRCVSXjUWCDBqToExFDod3gE7Z5DD5O+0TT2K2XxscI6md7898zf8fuTKGYrB 4UQ95DAgSyRJtsJVcmoNiNFiLvCZv67y/dvPY2FZWjmaEvJxluAqkopSW3li/5DrVJAd VU8xrTMdMEur1aXmUoGGjQ4hrx62nbSFN4GjIB5RMBZb5OXZw3jTaOmSTAVbpRvxyhS3 uJuXMIdKyDXnFb4Z2YZV55B0L3wnbDFSew6+ucQ6++osZY1QHV6pp45dbwRUnlWS+qgP k9pCMQflOLhZMez3S2d2kM4Lp7/3lW0ujDz81+480mKiQE2u20XxbTy7BudfKcy1VVaw I5nQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=xASTrRlxATWNruYLPbJ8vWIhjvUUsiGBYeSYgllvUWY=; b=st9aMm/TWeS7FZFIKvkBxmgBOcvm+7+LQX1RsVt6dBAoBhw2QmBf+iBOty+YzaBgOc tWjakueqDee09GwXtAl6PSFW1L1wSLFpUQIY6yL+8oYVK/Se3rN7xHkwPUdBKRonbtd2 Q2HF3sndyJUUzVcUfvvIkVYOzuBAISJUhDHPbNwRzhHpNXolXsjr7KtLlkRWlRlfpklz iv+0bu4bSaDi5rsL0gCCo6GZQgCc7V0o8aw5H5dzqyRj7sEycd4smV7GEAjYXAjPdFoj S1iDbSeEJy2wFmmGc6q3qQqCgOx9XK/C82DLwCN+8sUvLC7qCuCm93G4px9w8xlJZrv2 ex9Q== X-Gm-Message-State: AOAM531kjHmmbgnSFLvfo9CQxVFRoS7iKcx6ZuxcvCIyE8vq1UvYz3e7 aAKtKSOm5Ix8SM1q9QG8eO19m4DEh6eENZqa X-Google-Smtp-Source: ABdhPJwzhZp7+qUybkZUqtrEmFhrPXbSOZGAJn2nnWAyFSHOeXIepCqGKgenPKo6fhkQl+TUazk91A== X-Received: by 2002:a05:600c:4982:: with SMTP id h2mr11710505wmp.4.1637253796433; Thu, 18 Nov 2021 08:43:16 -0800 (PST) Received: from naush-laptop.pitowers.org ([2a00:1098:3142:14:328d:499d:f54a:e461]) by smtp.gmail.com with ESMTPSA id a1sm496246wri.89.2021.11.18.08.43.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Nov 2021 08:43:11 -0800 (PST) From: Naushir Patuck To: libcamera-devel@lists.libcamera.org Date: Thu, 18 Nov 2021 16:42:14 +0000 Message-Id: <20211118164216.2669449-3-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211118164216.2669449-1-naush@raspberrypi.com> References: <20211118164216.2669449-1-naush@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 2/4] pipeline: raspberrypi: Rework the internal buffer allocation scheme 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" For simplicity, the pipeline handler currently look at the maximum number of buffers set in the StreamConfiguration by the user and allocate the same number of internal buffers for all device nodes. This would likely overallocate buffers for some nodes. Rework this logic to try and minimise overallcations without compromising performance. The key change is to mostly decouple the number of internal buffers allocated from number of buffers requested by the user through the StreamConfiguration. For ISP nodes, we only ever need 1 set of internal buffers, as the hardware runs synchronous with the requests and IPA. For Unicam nodes, allocate a minimum for 4 buffers (exported + internal), but also require at least 2 internal buffers to minimise frame drops. Signed-off-by: Naushir Patuck Reviewed-by: Kieran Bingham Reviewed-by: Umang Jain Reviewed-by: Laurent Pinchart --- .../pipeline/raspberrypi/raspberrypi.cpp | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index 11d3c2b120dd..4f6c699a4379 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -1211,21 +1211,42 @@ int PipelineHandlerRPi::queueAllBuffers(Camera *camera) int PipelineHandlerRPi::prepareBuffers(Camera *camera) { RPiCameraData *data = cameraData(camera); + unsigned int numRawBuffers = 0; int ret; - /* - * Decide how many internal buffers to allocate. For now, simply look - * at how many external buffers will be provided. We'll need to improve - * this logic. However, we really must have all streams allocate the same - * number of buffers to simplify error handling in queueRequestDevice(). - */ - unsigned int maxBuffers = 0; - for (const Stream *s : camera->streams()) - if (static_cast(s)->isExternal()) - maxBuffers = std::max(maxBuffers, s->configuration().bufferCount); + for (Stream *s : camera->streams()) { + if (isRaw(s->configuration().pixelFormat)) { + numRawBuffers = s->configuration().bufferCount; + break; + } + } + /* Decide how many internal buffers to allocate. */ for (auto const stream : data->streams_) { - ret = stream->prepareBuffers(maxBuffers); + unsigned int numBuffers; + + if (stream == &data->unicam_[Unicam::Image] || + stream == &data->unicam_[Unicam::Embedded]) { + /* + * For Unicam, allocate a minimum of 4 buffers as we want + * to avoid any frame drops. If an application has configured + * a RAW stream, allocate additional buffers to make up the + * minimum, but ensure we have at least 2 sets of internal + * buffers to use to minimise frame drops. + */ + constexpr unsigned int minBuffers = 4; + numBuffers = std::max(2, minBuffers - numRawBuffers); + } else { + /* + * Since the ISP runs synchronous with the IPA and requests, + * we only ever need one set of internal buffers. Any buffers + * the application wants to hold onto will already be exported + * through PipelineHandlerRPi::exportFrameBuffers(). + */ + numBuffers = 1; + } + + ret = stream->prepareBuffers(numBuffers); if (ret < 0) return ret; }