[{"id":11187,"web_url":"https://patchwork.libcamera.org/comment/11187/","msgid":"<20200706080338.iwx6z7kawaxgm2qf@uno.localdomain>","date":"2020-07-06T08:03:38","subject":"Re: [libcamera-devel] [PATCH v3.1 7/8] android: camera_device: Add\n\tbuffers for each stream to Requests","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Kieran,\n\nOn Fri, Jul 03, 2020 at 03:54:04PM +0100, Kieran Bingham wrote:\n> Construct a FrameBuffer for every buffer given in the camera3Request\n> and add it to the libcamera Request on the appropriate stream.\n>\n> The correct stream is obtained from the private data of the camera3_stream\n> associated with the camera3_buffer.\n>\n> Comments regarding supporting only one buffer are now removed.\n>\n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  src/android/camera_device.cpp | 58 ++++++++++++++++++++---------------\n>  1 file changed, 33 insertions(+), 25 deletions(-)\n>\n> Rather than resend a v4 just for the change in this patch - sending a\n> v3.1 for direct review of this one.\n>\n> Within requestComplete(), the 'first' buffer pointer, which is needed to\n> extract the timestamp is moved to directly before it is used, and a\n> comment added to highlight that this is using a single buffer purely for\n> the timestamp.\n>\n> Then, after calling the process_capture_result callback to the android\n> hal, we iterate all buffers in the request and delete them to prevent\n> leaks.\n>\n>\n>\n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index 28334751a26e..72be4ab86e50 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -991,6 +991,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n>\n>  \t\t/* Maintain internal state of all stream mappings. */\n>  \t\tstreams_[i].index = streamIndex++;\n> +\t\tstream->priv = static_cast<void *>(&streams_[i]);\n>  \t}\n>\n>  \tswitch (config_->validate()) {\n> @@ -1049,9 +1050,6 @@ FrameBuffer *CameraDevice::createFrameBuffer(const buffer_handle_t camera3buffer\n>\n>  int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Request)\n>  {\n> -\tStreamConfiguration *streamConfiguration = &config_->at(0);\n> -\tStream *stream = streamConfiguration->stream();\n> -\n>  \tif (camera3Request->num_output_buffers != 1) {\n>  \t\tLOG(HAL, Error) << \"Invalid number of output buffers: \"\n>  \t\t\t\t<< camera3Request->num_output_buffers;\n> @@ -1089,30 +1087,32 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n>  \t\tcamera_->createRequest(reinterpret_cast<uint64_t>(descriptor));\n>\n>  \tfor (unsigned int i = 0; i < descriptor->numBuffers; ++i) {\n> +\t\tCameraStream *cameraStream = static_cast<CameraStream *>(camera3Buffers[i].stream->priv);\n> +\n>  \t\t/*\n>  \t\t * Keep track of which stream the request belongs to and store\n>  \t\t * the native buffer handles.\n> -\t\t *\n> -\t\t * \\todo Currently we only support one capture buffer. Copy\n> -\t\t * all of them to be ready once we'll support more.\n>  \t\t */\n>  \t\tdescriptor->buffers[i].stream = camera3Buffers[i].stream;\n>  \t\tdescriptor->buffers[i].buffer = camera3Buffers[i].buffer;\n> -\t}\n>\n> -\t/*\n> -\t * Create a libcamera buffer using the dmabuf descriptors of the first\n> -\t * and (currently) only supported request buffer.\n> -\t */\n> -\tFrameBuffer *buffer = createFrameBuffer(*camera3Buffers[0].buffer);\n> -\tif (!buffer) {\n> -\t\tLOG(HAL, Error) << \"Failed to create buffer\";\n> -\t\tdelete request;\n> -\t\tdelete descriptor;\n> -\t\treturn -ENOMEM;\n> -\t}\n> +\t\t/*\n> +\t\t* Create a libcamera buffer using the dmabuf descriptors of the\n> +\t\t* first and (currently) only supported request buffer.\n> +\t\t*/\n> +\t\tFrameBuffer *buffer = createFrameBuffer(*camera3Buffers[0].buffer);\n> +\t\tif (!buffer) {\n> +\t\t\tLOG(HAL, Error) << \"Failed to create buffer\";\n> +\t\t\tdelete request;\n> +\t\t\tdelete descriptor;\n> +\t\t\treturn -ENOMEM;\n> +\t\t}\n>\n> -\trequest->addBuffer(stream, buffer);\n> +\t\tStreamConfiguration *streamConfiguration = &config_->at(cameraStream->index);\n> +\t\tStream *stream = streamConfiguration->stream();\n> +\n> +\t\trequest->addBuffer(stream, buffer);\n> +\t}\n>\n>  \tint ret = camera_->queueRequest(request);\n\nI still don't see the framebuffers added to the request been deleted\nif queuing the request fails. We delete the request, but the class\ndestructor does not destroy the associated buffer. I understand this\nwas already the case, so it might be fixed on top.\n\n>  \tif (ret) {\n> @@ -1128,7 +1128,6 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n>  void CameraDevice::requestComplete(Request *request)\n>  {\n>  \tconst std::map<Stream *, FrameBuffer *> &buffers = request->buffers();\n> -\tFrameBuffer *buffer = buffers.begin()->second;\n>  \tcamera3_buffer_status status = CAMERA3_BUFFER_STATUS_OK;\n>  \tstd::unique_ptr<CameraMetadata> resultMetadata;\n>\n> @@ -1146,10 +1145,6 @@ void CameraDevice::requestComplete(Request *request)\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\t/*\n> -\t\t * \\todo Currently we only support one capture buffer. Prepare\n> -\t\t * all of them to be ready once we'll support more.\n> -\t\t */\n>  \t\tdescriptor->buffers[i].acquire_fence = -1;\n>  \t\tdescriptor->buffers[i].release_fence = -1;\n>  \t\tdescriptor->buffers[i].status = status;\n> @@ -1157,6 +1152,14 @@ void CameraDevice::requestComplete(Request *request)\n>  \tcaptureResult.output_buffers =\n>  \t\tconst_cast<const camera3_stream_buffer_t *>(descriptor->buffers);\n>\n> +\t/*\n> +\t * \\todo The timestamp used for the metadata is currently always taken\n> +\t * from the first buffer (which may be the first stream) in the Request.\n> +\t * It might be appropriate to return a 'correct' (as determined by\n> +\t * pipeline handlers) timestamp in the Request itself.\n> +\t */\n> +\tFrameBuffer *buffer = buffers.begin()->second;\n> +\n>  \tif (status == CAMERA3_BUFFER_STATUS_OK) {\n>  \t\tnotifyShutter(descriptor->frameNumber,\n>  \t\t\t      buffer->metadata().timestamp);\n\nThis shall also be changed soon. We use the buffer timestamp to notify\nthe shutter event. We currently don't have a way to notify the HAL\nlayer that an SOF even has been emitted from the device, and so we use\nthe request complete handler to also notify the shutter event, which\nmight (and should) be sent to the framework as early as possible.\n\nMore to fix on top.\n\nWith the handling of buffers in case of queueRequest failue clarified\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n  j\n\n> @@ -1180,8 +1183,13 @@ void CameraDevice::requestComplete(Request *request)\n>\n>  \tcallbacks_->process_capture_result(callbacks_, &captureResult);\n>\n> +\t/* Release all buffers created with createFrameBuffer(). */\n> +\tfor (auto it : buffers) {\n> +\t\tFrameBuffer *buffer = it.second;\n> +\t\tdelete buffer;\n> +\t}\n> +\n>  \tdelete descriptor;\n> -\tdelete buffer;\n>  }\n>\n>  std::string CameraDevice::logPrefix() const\n> --\n> 2.25.1\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","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 98914BD790\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  6 Jul 2020 08:00:07 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 13A6A60E01;\n\tMon,  6 Jul 2020 10:00:07 +0200 (CEST)","from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net\n\t[217.70.183.198])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B192F603B1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  6 Jul 2020 10:00:06 +0200 (CEST)","from uno.localdomain (host-79-34-235-173.business.telecomitalia.it\n\t[79.34.235.173]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 9AA2DC0007;\n\tMon,  6 Jul 2020 08:00:05 +0000 (UTC)"],"X-Originating-IP":"79.34.235.173","Date":"Mon, 6 Jul 2020 10:03:38 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<20200706080338.iwx6z7kawaxgm2qf@uno.localdomain>","References":"<20200703123919.2223048-8-kieran.bingham@ideasonboard.com>\n\t<20200703145404.2246129-1-kieran.bingham@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20200703145404.2246129-1-kieran.bingham@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v3.1 7/8] android: camera_device: Add\n\tbuffers for each stream to Requests","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":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":11202,"web_url":"https://patchwork.libcamera.org/comment/11202/","msgid":"<900f87ab-ff60-e53e-2c6e-f11d901ffbeb@ideasonboard.com>","date":"2020-07-06T09:30:36","subject":"Re: [libcamera-devel] [PATCH v3.1 7/8] android: camera_device: Add\n\tbuffers for each stream to Requests","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn 06/07/2020 09:03, Jacopo Mondi wrote:\n> Hi Kieran,\n> \n> On Fri, Jul 03, 2020 at 03:54:04PM +0100, Kieran Bingham wrote:\n>> Construct a FrameBuffer for every buffer given in the camera3Request\n>> and add it to the libcamera Request on the appropriate stream.\n>>\n>> The correct stream is obtained from the private data of the camera3_stream\n>> associated with the camera3_buffer.\n>>\n>> Comments regarding supporting only one buffer are now removed.\n>>\n>> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n>> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n>> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n>> ---\n>>  src/android/camera_device.cpp | 58 ++++++++++++++++++++---------------\n>>  1 file changed, 33 insertions(+), 25 deletions(-)\n>>\n>> Rather than resend a v4 just for the change in this patch - sending a\n>> v3.1 for direct review of this one.\n>>\n>> Within requestComplete(), the 'first' buffer pointer, which is needed to\n>> extract the timestamp is moved to directly before it is used, and a\n>> comment added to highlight that this is using a single buffer purely for\n>> the timestamp.\n>>\n>> Then, after calling the process_capture_result callback to the android\n>> hal, we iterate all buffers in the request and delete them to prevent\n>> leaks.\n>>\n>>\n>>\n>> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n>> index 28334751a26e..72be4ab86e50 100644\n>> --- a/src/android/camera_device.cpp\n>> +++ b/src/android/camera_device.cpp\n>> @@ -991,6 +991,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n>>\n>>  \t\t/* Maintain internal state of all stream mappings. */\n>>  \t\tstreams_[i].index = streamIndex++;\n>> +\t\tstream->priv = static_cast<void *>(&streams_[i]);\n>>  \t}\n>>\n>>  \tswitch (config_->validate()) {\n>> @@ -1049,9 +1050,6 @@ FrameBuffer *CameraDevice::createFrameBuffer(const buffer_handle_t camera3buffer\n>>\n>>  int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Request)\n>>  {\n>> -\tStreamConfiguration *streamConfiguration = &config_->at(0);\n>> -\tStream *stream = streamConfiguration->stream();\n>> -\n>>  \tif (camera3Request->num_output_buffers != 1) {\n>>  \t\tLOG(HAL, Error) << \"Invalid number of output buffers: \"\n>>  \t\t\t\t<< camera3Request->num_output_buffers;\n>> @@ -1089,30 +1087,32 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n>>  \t\tcamera_->createRequest(reinterpret_cast<uint64_t>(descriptor));\n>>\n>>  \tfor (unsigned int i = 0; i < descriptor->numBuffers; ++i) {\n>> +\t\tCameraStream *cameraStream = static_cast<CameraStream *>(camera3Buffers[i].stream->priv);\n>> +\n>>  \t\t/*\n>>  \t\t * Keep track of which stream the request belongs to and store\n>>  \t\t * the native buffer handles.\n>> -\t\t *\n>> -\t\t * \\todo Currently we only support one capture buffer. Copy\n>> -\t\t * all of them to be ready once we'll support more.\n>>  \t\t */\n>>  \t\tdescriptor->buffers[i].stream = camera3Buffers[i].stream;\n>>  \t\tdescriptor->buffers[i].buffer = camera3Buffers[i].buffer;\n>> -\t}\n>>\n>> -\t/*\n>> -\t * Create a libcamera buffer using the dmabuf descriptors of the first\n>> -\t * and (currently) only supported request buffer.\n>> -\t */\n>> -\tFrameBuffer *buffer = createFrameBuffer(*camera3Buffers[0].buffer);\n>> -\tif (!buffer) {\n>> -\t\tLOG(HAL, Error) << \"Failed to create buffer\";\n>> -\t\tdelete request;\n>> -\t\tdelete descriptor;\n>> -\t\treturn -ENOMEM;\n>> -\t}\n>> +\t\t/*\n>> +\t\t* Create a libcamera buffer using the dmabuf descriptors of the\n>> +\t\t* first and (currently) only supported request buffer.\n>> +\t\t*/\n>> +\t\tFrameBuffer *buffer = createFrameBuffer(*camera3Buffers[0].buffer);\n>> +\t\tif (!buffer) {\n>> +\t\t\tLOG(HAL, Error) << \"Failed to create buffer\";\n>> +\t\t\tdelete request;\n>> +\t\t\tdelete descriptor;\n>> +\t\t\treturn -ENOMEM;\n>> +\t\t}\n>>\n>> -\trequest->addBuffer(stream, buffer);\n>> +\t\tStreamConfiguration *streamConfiguration = &config_->at(cameraStream->index);\n>> +\t\tStream *stream = streamConfiguration->stream();\n>> +\n>> +\t\trequest->addBuffer(stream, buffer);\n>> +\t}\n>>\n>>  \tint ret = camera_->queueRequest(request);\n> \n> I still don't see the framebuffers added to the request been deleted\n> if queuing the request fails. We delete the request, but the class\n> destructor does not destroy the associated buffer. I understand this\n> was already the case, so it might be fixed on top.\n\nArgh, maybe it could be fixed on top, but now I've seen it I can't unsee it.\n\nHow about we store a vector of the buffers created by createFrameBuffer\nin the  Camera3RequestDescriptor so we can delete them on destruction of\nthat ?\n\nThen it's a bit more automatic and tracked along with the request, which\nis the same lifetime...\n\n\n\n>>  \tif (ret) {\n>> @@ -1128,7 +1128,6 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n>>  void CameraDevice::requestComplete(Request *request)\n>>  {\n>>  \tconst std::map<Stream *, FrameBuffer *> &buffers = request->buffers();\n>> -\tFrameBuffer *buffer = buffers.begin()->second;\n>>  \tcamera3_buffer_status status = CAMERA3_BUFFER_STATUS_OK;\n>>  \tstd::unique_ptr<CameraMetadata> resultMetadata;\n>>\n>> @@ -1146,10 +1145,6 @@ void CameraDevice::requestComplete(Request *request)\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\t/*\n>> -\t\t * \\todo Currently we only support one capture buffer. Prepare\n>> -\t\t * all of them to be ready once we'll support more.\n>> -\t\t */\n>>  \t\tdescriptor->buffers[i].acquire_fence = -1;\n>>  \t\tdescriptor->buffers[i].release_fence = -1;\n>>  \t\tdescriptor->buffers[i].status = status;\n>> @@ -1157,6 +1152,14 @@ void CameraDevice::requestComplete(Request *request)\n>>  \tcaptureResult.output_buffers =\n>>  \t\tconst_cast<const camera3_stream_buffer_t *>(descriptor->buffers);\n>>\n>> +\t/*\n>> +\t * \\todo The timestamp used for the metadata is currently always taken\n>> +\t * from the first buffer (which may be the first stream) in the Request.\n>> +\t * It might be appropriate to return a 'correct' (as determined by\n>> +\t * pipeline handlers) timestamp in the Request itself.\n>> +\t */\n>> +\tFrameBuffer *buffer = buffers.begin()->second;\n>> +\n>>  \tif (status == CAMERA3_BUFFER_STATUS_OK) {\n>>  \t\tnotifyShutter(descriptor->frameNumber,\n>>  \t\t\t      buffer->metadata().timestamp);\n> \n> This shall also be changed soon. We use the buffer timestamp to notify\n> the shutter event. We currently don't have a way to notify the HAL\n> layer that an SOF even has been emitted from the device, and so we use\n> the request complete handler to also notify the shutter event, which\n> might (and should) be sent to the framework as early as possible.\n> \n> More to fix on top.\n> \n> With the handling of buffers in case of queueRequest failue clarified\n\n\nI think the simplest way to handle the failure case as well is to make\nsure the Camera3RequestDescriptor tracks the lifetimes.\n\nI'll make a v4 with that included.\n\n\n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\n\nAnd grab this, but I'll away a final confirmation/check on the v4 before\nintegration anyway.\n\n--\nThanks\n\nKieran\n\n\n> \n> Thanks\n>   j\n> \n>> @@ -1180,8 +1183,13 @@ void CameraDevice::requestComplete(Request *request)\n>>\n>>  \tcallbacks_->process_capture_result(callbacks_, &captureResult);\n>>\n>> +\t/* Release all buffers created with createFrameBuffer(). */\n>> +\tfor (auto it : buffers) {\n>> +\t\tFrameBuffer *buffer = it.second;\n>> +\t\tdelete buffer;\n>> +\t}\n>> +\n>>  \tdelete descriptor;\n>> -\tdelete buffer;\n>>  }\n>>\n>>  std::string CameraDevice::logPrefix() const\n>> --\n>> 2.25.1\n>>\n>> _______________________________________________\n>> libcamera-devel mailing list\n>> libcamera-devel@lists.libcamera.org\n>> https://lists.libcamera.org/listinfo/libcamera-devel","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 C0D0BBD792\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  6 Jul 2020 09:30:41 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 908A360E01;\n\tMon,  6 Jul 2020 11:30:41 +0200 (CEST)","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 7104C603B1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  6 Jul 2020 11:30:40 +0200 (CEST)","from [192.168.0.20]\n\t(cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CE21E97E;\n\tMon,  6 Jul 2020 11:30:39 +0200 (CEST)"],"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=\"gENdPEvA\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1594027840;\n\tbh=Vz5TIYwDcZQOW3+FtFSDOQFKh4C5nw37RCXT0mGwB48=;\n\th=Reply-To:Subject:To:Cc:References:From:Date:In-Reply-To:From;\n\tb=gENdPEvARqMryJVwYxs+w+F853DkFty8ToEb2zJEJa2yDUY4K4dkHCAHYRH0QbSyj\n\tzvnTlRMf/Z+NGYubft4Mdj2ZU6i9SIT6QqrGdDEH6au7ZpBvakCjpbN+tAZqNfHaNd\n\tZ+kNwjdR93/tcn35YQ4MzSTePmtujhJU1R4lkAKk=","To":"Jacopo Mondi <jacopo@jmondi.org>","References":"<20200703123919.2223048-8-kieran.bingham@ideasonboard.com>\n\t<20200703145404.2246129-1-kieran.bingham@ideasonboard.com>\n\t<20200706080338.iwx6z7kawaxgm2qf@uno.localdomain>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tWZw01QYHU/GUV/zHJSFk","Organization":"Ideas on Board","Message-ID":"<900f87ab-ff60-e53e-2c6e-f11d901ffbeb@ideasonboard.com>","Date":"Mon, 6 Jul 2020 10:30:36 +0100","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101\n\tThunderbird/68.8.0","MIME-Version":"1.0","In-Reply-To":"<20200706080338.iwx6z7kawaxgm2qf@uno.localdomain>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH v3.1 7/8] android: camera_device: Add\n\tbuffers for each stream to Requests","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>","Reply-To":"kieran.bingham@ideasonboard.com","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]