{"id":11681,"url":"https://patchwork.libcamera.org/api/patches/11681/?format=json","web_url":"https://patchwork.libcamera.org/patch/11681/","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":"<20210324070757.3530377-7-hiroh@chromium.org>","date":"2021-03-24T07:07:55","name":"[libcamera-devel,v2,6/8] android: Camera3RequestDescriptor: Manage buffers with std::vector","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"b5267cffa1856c8d10e399b863086371ae3affca","submitter":{"id":63,"url":"https://patchwork.libcamera.org/api/people/63/?format=json","name":"Hirokazu Honda","email":"hiroh@chromium.org"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/11681/mbox/","series":[{"id":1825,"url":"https://patchwork.libcamera.org/api/series/1825/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=1825","date":"2021-03-24T07:07:51","name":"Improve pointer types in android HAL adaptation layer","version":2,"mbox":"https://patchwork.libcamera.org/series/1825/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/11681/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/11681/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 D38E0C32E7\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 24 Mar 2021 07:08:21 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8A2CC68D6C;\n\tWed, 24 Mar 2021 08:08:21 +0100 (CET)","from mail-pg1-x52c.google.com (mail-pg1-x52c.google.com\n\t[IPv6:2607:f8b0:4864:20::52c])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B028568D6E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 24 Mar 2021 08:08:19 +0100 (CET)","by mail-pg1-x52c.google.com with SMTP id v186so14007414pgv.7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 24 Mar 2021 00:08:19 -0700 (PDT)","from hiroh2.tok.corp.google.com\n\t([2401:fa00:8f:2:7c07:24cd:c637:7fab])\n\tby smtp.gmail.com with ESMTPSA id\n\te63sm1246860pfe.208.2021.03.24.00.08.12\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tWed, 24 Mar 2021 00:08:13 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=chromium.org header.i=@chromium.org\n\theader.b=\"ECa0aZN9\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org;\n\ts=google; \n\th=from:to:cc:subject:date:message-id:in-reply-to:references\n\t:mime-version:content-transfer-encoding;\n\tbh=DhOuHdYVQ11P/k0rjoAnrIunZytTz8xbjyDa2WLJKeM=;\n\tb=ECa0aZN9HpOxVTDwc2WrfdpbUatj3c46u15U3ZbUAuPVvuq+ZlQd+jKzTcEaf7cWaw\n\tVlY55mvSPkhwjr5PVh9Sgqt62s0Tz+sLXIZfbVmudQ1tPYLVm59q25NqcNn8MKqp/+ZP\n\tqjoyzZwy+so3ylRLpMGZsO3fI9Y6QTRDi7UQY=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references:mime-version:content-transfer-encoding;\n\tbh=DhOuHdYVQ11P/k0rjoAnrIunZytTz8xbjyDa2WLJKeM=;\n\tb=hvsrvou2wheDdgrD5yRlzR1miilb+2ftS+io2JA0rVD9Y2LNFKsXkEkZTTIKGECrb4\n\tXsRl315r7y/PUqvpf5fydbzKjBhqnlP1ZWLfz3fJgPaiPthtBYm7hDWEYfxiBZmPoThp\n\tjKJ5aSmupNh4SDwHtCXeXwoIeO4nUqK2juybHch5AS9hn0hWdlFHaqJut0BC3mTDqS4B\n\t6Xj2LCMPrEPqD6PAuU3kfUOFQLbEgFProa5ZREqEef/jJjV6Gdr+qXZDfV3hFsLkWKLb\n\tJvtZV9V+BGCUZW814tUzJeqG4gDVY3f3FXvi/kZ9T70cFlMqmkQQoXF32sW7RapxfJtp\n\t7hNw==","X-Gm-Message-State":"AOAM530dQEDcPERhPb+PXTHzDUExtMUGppa5S7C6v0jYVcMpyYPi0cBQ\n\tC1NYPnpZ3hScZ5/jBHDkEns2lPWroe4lnA==","X-Google-Smtp-Source":"ABdhPJwm+jpDS4pj3Hccnxt8cesrC6lGk2GPnvv4966XyJDBSlVroCElure8s424NVsrZE9s9bCUqg==","X-Received":"by 2002:a63:d7:: with SMTP id 206mr1879669pga.30.1616569694196; \n\tWed, 24 Mar 2021 00:08:14 -0700 (PDT)","From":"Hirokazu Honda <hiroh@chromium.org>","To":"libcamera-devel@lists.libcamera.org","Date":"Wed, 24 Mar 2021 16:07:55 +0900","Message-Id":"<20210324070757.3530377-7-hiroh@chromium.org>","X-Mailer":"git-send-email 2.31.0.291.g576ba9dcdaf-goog","In-Reply-To":"<20210324070757.3530377-1-hiroh@chromium.org>","References":"<20210324070757.3530377-1-hiroh@chromium.org>","MIME-Version":"1.0","Subject":"[libcamera-devel] [PATCH v2 6/8] android: Camera3RequestDescriptor:\n\tManage buffers with std::vector","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>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"Camera3RequestDescriptor has a length and an allocated buffer\nfor camera_stream_buffer_t array. This replaces the variables\nwith std::vector.\n\nSigned-off-by: Hirokazu Honda <hiroh@chromium.org>\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n src/android/camera_device.cpp | 47 ++++++++++++++++-------------------\n src/android/camera_device.h   |  3 +--\n 2 files changed, 22 insertions(+), 28 deletions(-)\n\n--\n2.31.0.291.g576ba9dcdaf-goog","diff":"diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\nindex c0630e53..e75fd25f 100644\n--- a/src/android/camera_device.cpp\n+++ b/src/android/camera_device.cpp\n@@ -271,16 +271,16 @@ CameraDevice::Camera3RequestDescriptor::Camera3RequestDescriptor(\n \tframeNumber_ = camera3Request->frame_number;\n\n \t/* Copy the camera3 request stream information for later access. */\n-\tnumBuffers_ = camera3Request->num_output_buffers;\n-\tbuffers_ = new camera3_stream_buffer_t[numBuffers_];\n-\tfor (unsigned int i = 0; i < numBuffers_; ++i)\n+\tconst uint32_t numBuffers = camera3Request->num_output_buffers;\n+\tbuffers_.resize(numBuffers);\n+\tfor (uint32_t i = 0; i < numBuffers; i++)\n \t\tbuffers_[i] = camera3Request->output_buffers[i];\n\n \t/*\n \t * FrameBuffer instances created by wrapping a camera3 provided dmabuf\n \t * are emplaced in this vector of unique_ptr<> for lifetime management.\n \t */\n-\tframeBuffers_.reserve(numBuffers_);\n+\tframeBuffers_.reserve(numBuffers);\n\n \t/* Clone the controls associated with the camera3 request. */\n \tsettings_ = CameraMetadata(camera3Request->settings);\n@@ -294,10 +294,7 @@ CameraDevice::Camera3RequestDescriptor::Camera3RequestDescriptor(\n \t\t\t\t\t\t    reinterpret_cast<uint64_t>(this));\n }\n\n-CameraDevice::Camera3RequestDescriptor::~Camera3RequestDescriptor()\n-{\n-\tdelete[] buffers_;\n-}\n+CameraDevice::Camera3RequestDescriptor::~Camera3RequestDescriptor() = default;\n\n /*\n  * \\class CameraDevice\n@@ -1840,10 +1837,10 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n \t\tdescriptor->settings_ = lastSettings_;\n\n \tLOG(HAL, Debug) << \"Queueing request \" << descriptor->request_->cookie()\n-\t\t\t<< \" with \" << descriptor->numBuffers_ << \" streams\";\n-\tfor (unsigned int i = 0; i < descriptor->numBuffers_; ++i) {\n-\t\tconst camera3_stream_buffer_t *camera3Buffer = &descriptor->buffers_[i];\n-\t\tcamera3_stream *camera3Stream = camera3Buffer->stream;\n+\t\t\t<< \" with \" << descriptor->buffers_.size() << \" streams\";\n+\tfor (unsigned int i = 0; i < descriptor->buffers_.size(); ++i) {\n+\t\tconst camera3_stream_buffer_t &camera3Buffer = descriptor->buffers_[i];\n+\t\tcamera3_stream *camera3Stream = camera3Buffer.stream;\n \t\tCameraStream *cameraStream = static_cast<CameraStream *>(camera3Stream->priv);\n\n \t\tstd::stringstream ss;\n@@ -1874,7 +1871,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n \t\t\t * associate it with the Camera3RequestDescriptor for\n \t\t\t * lifetime management only.\n \t\t\t */\n-\t\t\tbuffer = createFrameBuffer(*camera3Buffer->buffer);\n+\t\t\tbuffer = createFrameBuffer(*camera3Buffer.buffer);\n \t\t\tdescriptor->frameBuffers_.emplace_back(buffer);\n \t\t\tLOG(HAL, Debug) << ss.str() << \" (direct)\";\n \t\t\tbreak;\n@@ -1899,7 +1896,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n \t\t}\n\n \t\tdescriptor->request_->addBuffer(cameraStream->stream(), buffer,\n-\t\t\t\t\t\tcamera3Buffer->acquire_fence);\n+\t\t\t\t\t\tcamera3Buffer.acquire_fence);\n \t}\n\n \t/*\n@@ -1930,7 +1927,7 @@ void CameraDevice::requestComplete(Request *request)\n \t}\n\n \tLOG(HAL, Debug) << \"Request \" << request->cookie() << \" completed with \"\n-\t\t\t<< descriptor->numBuffers_ << \" streams\";\n+\t\t\t<< descriptor->buffers_.size() << \" streams\";\n\n \t/*\n \t * \\todo The timestamp used for the metadata is currently always taken\n@@ -1942,9 +1939,9 @@ void CameraDevice::requestComplete(Request *request)\n \tresultMetadata = getResultMetadata(descriptor, timestamp);\n\n \t/* Handle any JPEG compression. */\n-\tfor (unsigned int i = 0; i < descriptor->numBuffers_; ++i) {\n+\tfor (camera3_stream_buffer_t &buffer : descriptor->buffers_) {\n \t\tCameraStream *cameraStream =\n-\t\t\tstatic_cast<CameraStream *>(descriptor->buffers_[i].stream->priv);\n+\t\t\tstatic_cast<CameraStream *>(buffer.stream->priv);\n\n \t\tif (cameraStream->camera3Stream().format != HAL_PIXEL_FORMAT_BLOB)\n \t\t\tcontinue;\n@@ -1956,7 +1953,7 @@ void CameraDevice::requestComplete(Request *request)\n \t\t}\n\n \t\tint ret = cameraStream->process(*src,\n-\t\t\t\t\t\t*descriptor->buffers_[i].buffer,\n+\t\t\t\t\t\t*buffer.buffer,\n \t\t\t\t\t\tdescriptor->settings_,\n \t\t\t\t\t\tresultMetadata.get());\n \t\tif (ret) {\n@@ -1975,15 +1972,13 @@ void CameraDevice::requestComplete(Request *request)\n \t/* Prepare to call back the Android camera stack. */\n \tcamera3_capture_result_t captureResult = {};\n \tcaptureResult.frame_number = descriptor->frameNumber_;\n-\tcaptureResult.num_output_buffers = descriptor->numBuffers_;\n-\tfor (unsigned int i = 0; i < descriptor->numBuffers_; ++i) {\n-\t\tdescriptor->buffers_[i].acquire_fence = -1;\n-\t\tdescriptor->buffers_[i].release_fence = -1;\n-\t\tdescriptor->buffers_[i].status = status;\n+\tcaptureResult.num_output_buffers = descriptor->buffers_.size();\n+\tfor (camera3_stream_buffer_t &buffer : descriptor->buffers_) {\n+\t\tbuffer.acquire_fence = -1;\n+\t\tbuffer.release_fence = -1;\n+\t\tbuffer.status = status;\n \t}\n-\tcaptureResult.output_buffers =\n-\t\tconst_cast<const camera3_stream_buffer_t *>(descriptor->buffers_);\n-\n+\tcaptureResult.output_buffers = descriptor->buffers_.data();\n\n \tif (status == CAMERA3_BUFFER_STATUS_OK) {\n \t\tnotifyShutter(descriptor->frameNumber_, timestamp);\ndiff --git a/src/android/camera_device.h b/src/android/camera_device.h\nindex 14e26b4d..a11cf243 100644\n--- a/src/android/camera_device.h\n+++ b/src/android/camera_device.h\n@@ -74,8 +74,7 @@ private:\n \t\t~Camera3RequestDescriptor();\n\n \t\tuint32_t frameNumber_;\n-\t\tuint32_t numBuffers_;\n-\t\tcamera3_stream_buffer_t *buffers_;\n+\t\tstd::vector<camera3_stream_buffer_t> buffers_;\n \t\tstd::vector<std::unique_ptr<libcamera::FrameBuffer>> frameBuffers_;\n \t\tCameraMetadata settings_;\n \t\tstd::unique_ptr<CaptureRequest> request_;\n","prefixes":["libcamera-devel","v2","6/8"]}