From patchwork Wed Dec 4 16:36:27 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cheng-Hao Yang X-Patchwork-Id: 22164 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 C5173BDB1C for ; Wed, 4 Dec 2024 16:41:53 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 65461660E4; Wed, 4 Dec 2024 17:41:52 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="EvWqnMN+"; dkim-atps=neutral Received: from mail-pf1-x42b.google.com (mail-pf1-x42b.google.com [IPv6:2607:f8b0:4864:20::42b]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E0246660C5 for ; Wed, 4 Dec 2024 17:41:47 +0100 (CET) Received: by mail-pf1-x42b.google.com with SMTP id d2e1a72fcca58-724f0f6300aso15974b3a.2 for ; Wed, 04 Dec 2024 08:41:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1733330505; x=1733935305; darn=lists.libcamera.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7RSUBsgMlBRQcCiQn/OQffu9bSxAh/8WGY8/nToqTB8=; b=EvWqnMN+SnMlQ87ZHiYzcISvtpseaHXF7X6nZDoj//PCHzg1l+wnBxs6Y9f8uUb0oR lfH3oXrmxmLsYVdHo9YFGvUJnYw6ZVPMS7nX0/Ri8krv7XcwjK01/S6NyJTUKLP0hcP4 6DxJtxpT5p4d0YRSFOyfFXbbRxo8QIyZq4gD4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733330505; x=1733935305; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7RSUBsgMlBRQcCiQn/OQffu9bSxAh/8WGY8/nToqTB8=; b=kIoMdBExMYt83esVqFfK4lyZ3B2YrzNFxdfk1WPifxR9Rz9mSvBij/f8UveOhROclQ woagx547yeck9iYVZQlWJqAbOuRX8HMHwQ/HTduGVtDXNGJ0T58vOk2hOfQXaVR7MKJe ALIzMwThRPEAqab4HATvspnQ2/llkw7fbNjnBd1hhEonRf0Qb+duN3/L6FzBzYRzk3yy tRcFRZw7iB8nDHTFChF5aXovM8/x6oc54BUHfM/KQ3iCAQ9M/rSnv8WI8jzA5Y1nMYXD mm90CDXk68A23Ba7lPJW+eJcKrZ8EQqM+rqPwH2h2Mx/gQMJg+Ol2PbEYDXMZOvdDjL7 py5A== X-Gm-Message-State: AOJu0YyXJAsoyyf5fIiTHX6RLTDv+hkXfjficJ862voDZ+WrGdScODJH aKOc2BF/jYMd89zLNlzFZ3P2aqaLqZmOn5/2ql1by0chPEtuqFH/G8usxplIGBB+DIjVbKBhAZM = X-Gm-Gg: ASbGnctsqz/mPqtlJVeZCX60Dq/hC4xhCDTnmv+MpuqMUJdWbVwoASmqzeXZ81CMM38 +urPwjN9fFMaCk+K8PM2yVavZ7HuKcuIcVEAgJw1zEyh8wFchZdBuAmv7kTsa7Gu8150e06kwpJ D3JjwwWaCUKZ4rEF1VfeveMUUZgKIPpGrYGDSgQjwsjxqYhvnygQrVVDcCW3XpzlD+ImmHEOtEl a5UBcWxfcNmmo7M6XmE/63zG0NbwXZvWeYNzNEUDatGG7EMt2p5T6kTKPlMS+2UyieXQDMMhJ2b nzDUtmxef6l+rYE9arD3xMk2juZyp+75gNdJiKZxRCSLSqQUeefu7GIe X-Google-Smtp-Source: AGHT+IEOsYVPm81SCTxU5wBUXi3YRlYDKu3rvWq6Rzjvp9uKo7xHZjHfcJrSAshsJyzYMAFQHOmQMQ== X-Received: by 2002:a05:6a00:3a16:b0:724:eac3:576a with SMTP id d2e1a72fcca58-7257fcca19fmr9391185b3a.25.1733330504992; Wed, 04 Dec 2024 08:41:44 -0800 (PST) Received: from chenghaoyang-low.c.googlers.com.com (112.212.229.35.bc.googleusercontent.com. [35.229.212.112]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-725417725e9sm12551779b3a.80.2024.12.04.08.41.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Dec 2024 08:41:44 -0800 (PST) From: Harvey Yang To: libcamera-devel@lists.libcamera.org Cc: Harvey Yang , Han-Lin Chen Subject: [PATCH v3 2/7] android: Set StreamBuffer::srcBuffer in CameraDevice::processCaptureRequest Date: Wed, 4 Dec 2024 16:36:27 +0000 Message-ID: <20241204164137.3938891-3-chenghaoyang@chromium.org> X-Mailer: git-send-email 2.47.0.338.g60cca15819-goog In-Reply-To: <20241204164137.3938891-1-chenghaoyang@chromium.org> References: <20241204164137.3938891-1-chenghaoyang@chromium.org> MIME-Version: 1.0 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" StreamBuffer::srcBuffer was set right before being processed, while it was already determined when being constructed. This patch sets the value in CameraDevice::processCaptureRequest. `requestedStreams` is refactored from std::set to std::map to find the correct srcBuffer accordingly. The change also helps cleaning up the post process pipeline's dependency on `Camera3RequestDescriptor::pendingStreamsToProcess_`, which is going to be cleaned up in the following patches. Signed-off-by: Han-Lin Chen Co-developed-by: Harvey Yang Signed-off-by: Harvey Yang --- src/android/camera_device.cpp | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 4e3bdc9cc..f6dadaf22 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -9,7 +9,6 @@ #include #include -#include #include #include #include @@ -967,9 +966,9 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques * to a libcamera stream. Streams of type Mapped will be handled later. * * Collect the CameraStream associated to each requested capture stream. - * Since requestedStreams is an std:set<>, no duplications can happen. + * Since requestedStreams is an std:map<>, no duplications can happen. */ - std::set requestedStreams; + std::map requestedBuffers; for (const auto &[i, buffer] : utils::enumerate(descriptor->buffers_)) { CameraStream *cameraStream = buffer.stream; camera3_stream_t *camera3Stream = cameraStream->camera3Stream(); @@ -1021,6 +1020,8 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques */ frameBuffer = cameraStream->getBuffer(); buffer.internalBuffer = frameBuffer; + buffer.srcBuffer = frameBuffer; + LOG(HAL, Debug) << ss.str() << " (internal)"; descriptor->pendingStreamsToProcess_.insert( @@ -1037,7 +1038,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques descriptor->request_->addBuffer(cameraStream->stream(), frameBuffer, std::move(fence)); - requestedStreams.insert(cameraStream); + requestedBuffers[cameraStream] = frameBuffer; } /* @@ -1067,9 +1068,19 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques * added to the request. */ CameraStream *sourceStream = cameraStream->sourceStream(); - ASSERT(sourceStream); - if (requestedStreams.find(sourceStream) != requestedStreams.end()) + ASSERT(sourceStream && sourceStream->type() == CameraStream::Type::Direct); + + /* + * If the buffer for the source stream has been requested as + * Direct, use its framebuffer as the source buffer for + * post-processing. No need to recycle the buffer since it's + * owned by Android. + */ + auto iterDirectBuffer = requestedBuffers.find(sourceStream); + if (iterDirectBuffer != requestedBuffers.end()) { + buffer.srcBuffer = iterDirectBuffer->second; continue; + } /* * If that's not the case, we need to add a buffer to the request @@ -1077,11 +1088,12 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques */ FrameBuffer *frameBuffer = cameraStream->getBuffer(); buffer.internalBuffer = frameBuffer; + buffer.srcBuffer = frameBuffer; descriptor->request_->addBuffer(sourceStream->stream(), frameBuffer, nullptr); - requestedStreams.insert(sourceStream); + requestedBuffers[sourceStream] = frameBuffer; } /* @@ -1236,8 +1248,6 @@ void CameraDevice::requestComplete(Request *request) continue; } - buffer->srcBuffer = src; - ++iter; int ret = stream->process(buffer); if (ret) {