[{"id":20127,"web_url":"https://patchwork.libcamera.org/comment/20127/","msgid":"<YWUDi6ebRszaddZN@pendragon.ideasonboard.com>","date":"2021-10-12T03:39:55","subject":"Re: [libcamera-devel] [PATCH v4 4/7] android: camera_stream: Drop\n\treturn value for process()","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Umang,\n\nThank you for the patch.\n\nOn Mon, Oct 11, 2021 at 01:05:02PM +0530, Umang Jain wrote:\n> CameraStream::process() is invoked by CameraDevice::requestComplete()\n> in case any post-processing is required for the camera stream. The\n> failure or success is checked via the value returned by\n> CameraStream::process().\n> \n> Now that the post-processor notifies about the post-processing\n> completion operation, we can drop the return value of\n> CameraStream::process(). The status of post-processing is passed\n> to CameraDevice::streamProcessingComplete() by the\n> PostProcessor::processComplete slot.\n> \n> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>\n> ---\n>  src/android/camera_device.cpp            |  2 +-\n>  src/android/camera_stream.cpp            | 14 +++++++-------\n>  src/android/camera_stream.h              |  6 +++---\n>  src/android/jpeg/post_processor_jpeg.cpp | 12 +++++-------\n>  src/android/jpeg/post_processor_jpeg.h   |  6 +++---\n>  src/android/post_processor.h             |  6 +++---\n>  src/android/yuv/post_processor_yuv.cpp   | 14 ++++++--------\n>  src/android/yuv/post_processor_yuv.h     |  6 +++---\n>  8 files changed, 31 insertions(+), 35 deletions(-)\n> \n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index 9f26c36d..eba370ea 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -1228,7 +1228,7 @@ void CameraDevice::requestComplete(Request *request)\n>  \t\tif (cameraStream->type() == CameraStream::Type::Internal)\n>  \t\t\tdescriptor->internalBuffer_ = src;\n>  \n> -\t\tint ret = cameraStream->process(*src, buffer, descriptor);\n> +\t\tcameraStream->process(*src, buffer, descriptor);\n>  \n>  \t\treturn;\n\nI forgot to comment in the previous patch that you should only return\nearly if no stream requires post-processing, not after the first one.\n\n>  \t}\n> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp\n> index d91e7dee..cec07269 100644\n> --- a/src/android/camera_stream.cpp\n> +++ b/src/android/camera_stream.cpp\n> @@ -147,9 +147,9 @@ int CameraStream::waitFence(int fence)\n>  \treturn -errno;\n>  }\n>  \n> -int CameraStream::process(const FrameBuffer &source,\n> -\t\t\t  camera3_stream_buffer_t &camera3Dest,\n> -\t\t\t  Camera3RequestDescriptor *request)\n> +void CameraStream::process(const FrameBuffer &source,\n> +\t\t\t   camera3_stream_buffer_t &camera3Dest,\n> +\t\t\t   Camera3RequestDescriptor *request)\n>  {\n>  \t/* Handle waiting on fences on the destination buffer. */\n>  \tint fence = camera3Dest.acquire_fence;\n> @@ -160,12 +160,12 @@ int CameraStream::process(const FrameBuffer &source,\n>  \t\tif (ret < 0) {\n>  \t\t\tLOG(HAL, Error) << \"Failed waiting for fence: \"\n>  \t\t\t\t\t<< fence << \": \" << strerror(-ret);\n> -\t\t\treturn ret;\n> +\t\t\treturn;\n>  \t\t}\n>  \t}\n>  \n>  \tif (!postProcessor_)\n> -\t\treturn 0;\n> +\t\treturn;\n\nCan this happen btw ?\n\n>  \n>  \t/*\n>  \t * \\todo Buffer mapping and processing should be moved to a\n> @@ -176,10 +176,10 @@ int CameraStream::process(const FrameBuffer &source,\n>  \t\t\t  PROT_READ | PROT_WRITE);\n>  \tif (!dest.isValid()) {\n>  \t\tLOG(HAL, Error) << \"Failed to create destination buffer\";\n> -\t\treturn -EINVAL;\n> +\t\treturn;\n>  \t}\n\nWe have a set of failure conditions here that don't result in any\nnotification to the CameraDevice, the request will be lost. You could\ncall CameraDevice::streamProcessingComplete() in those locations, but it\nmay be easier to keep returning an int from this function (not the ones\nbelow) and handle errors in the caller.\n\n>  \n> -\treturn postProcessor_->process(source, &dest, request);\n> +\tpostProcessor_->process(source, &dest, request);\n>  }\n>  \n>  FrameBuffer *CameraStream::getBuffer()\n> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h\n> index 04cfd111..a0c5f166 100644\n> --- a/src/android/camera_stream.h\n> +++ b/src/android/camera_stream.h\n> @@ -120,9 +120,9 @@ public:\n>  \tlibcamera::Stream *stream() const;\n>  \n>  \tint configure();\n> -\tint process(const libcamera::FrameBuffer &source,\n> -\t\t    camera3_stream_buffer_t &camera3Buffer,\n> -\t\t    Camera3RequestDescriptor *request);\n> +\tvoid process(const libcamera::FrameBuffer &source,\n> +\t\t     camera3_stream_buffer_t &camera3Buffer,\n> +\t\t     Camera3RequestDescriptor *request);\n>  \tlibcamera::FrameBuffer *getBuffer();\n>  \tvoid putBuffer(libcamera::FrameBuffer *buffer);\n>  \n> diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp\n> index 81d1efe6..eb87931b 100644\n> --- a/src/android/jpeg/post_processor_jpeg.cpp\n> +++ b/src/android/jpeg/post_processor_jpeg.cpp\n> @@ -97,12 +97,12 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,\n>  \t}\n>  }\n>  \n> -int PostProcessorJpeg::process(const FrameBuffer &source,\n> -\t\t\t       CameraBuffer *destination,\n> -\t\t\t       Camera3RequestDescriptor *request)\n> +void PostProcessorJpeg::process(const FrameBuffer &source,\n> +\t\t\t\tCameraBuffer *destination,\n> +\t\t\t\tCamera3RequestDescriptor *request)\n>  {\n>  \tif (!encoder_)\n> -\t\treturn 0;\n> +\t\treturn;\n\nSame here, if this can happen, we'll lose the request, if it can't\nhappen, it should be dropped, or replaced with an ASSERT() if you're not\nsure.\n\n>  \n>  \tASSERT(destination->numPlanes() == 1);\n>  \n> @@ -198,7 +198,7 @@ int PostProcessorJpeg::process(const FrameBuffer &source,\n>  \tif (jpeg_size < 0) {\n>  \t\tLOG(JPEG, Error) << \"Failed to encode stream image\";\n>  \t\tprocessComplete.emit(request, PostProcessor::Status::Error);\n> -\t\treturn jpeg_size;\n> +\t\treturn;\n>  \t}\n>  \n>  \t/* Fill in the JPEG blob header. */\n> @@ -212,6 +212,4 @@ int PostProcessorJpeg::process(const FrameBuffer &source,\n>  \t/* Update the JPEG result Metadata. */\n>  \tresultMetadata->addEntry(ANDROID_JPEG_SIZE, jpeg_size);\n>  \tprocessComplete.emit(request, PostProcessor::Status::Success);\n> -\n> -\treturn 0;\n>  }\n> diff --git a/src/android/jpeg/post_processor_jpeg.h b/src/android/jpeg/post_processor_jpeg.h\n> index 0184d77e..5dab14e1 100644\n> --- a/src/android/jpeg/post_processor_jpeg.h\n> +++ b/src/android/jpeg/post_processor_jpeg.h\n> @@ -22,9 +22,9 @@ public:\n>  \n>  \tint configure(const libcamera::StreamConfiguration &incfg,\n>  \t\t      const libcamera::StreamConfiguration &outcfg) override;\n> -\tint process(const libcamera::FrameBuffer &source,\n> -\t\t    CameraBuffer *destination,\n> -\t\t    Camera3RequestDescriptor *request) override;\n> +\tvoid process(const libcamera::FrameBuffer &source,\n> +\t\t     CameraBuffer *destination,\n> +\t\t     Camera3RequestDescriptor *request) override;\n>  \n>  private:\n>  \tvoid generateThumbnail(const libcamera::FrameBuffer &source,\n> diff --git a/src/android/post_processor.h b/src/android/post_processor.h\n> index 6e67bcba..88a5f985 100644\n> --- a/src/android/post_processor.h\n> +++ b/src/android/post_processor.h\n> @@ -30,9 +30,9 @@ public:\n>  \n>  \tvirtual int configure(const libcamera::StreamConfiguration &inCfg,\n>  \t\t\t      const libcamera::StreamConfiguration &outCfg) = 0;\n> -\tvirtual int process(const libcamera::FrameBuffer &source,\n> -\t\t\t    CameraBuffer *destination,\n> -\t\t\t    Camera3RequestDescriptor *request) = 0;\n> +\tvirtual void process(const libcamera::FrameBuffer &source,\n> +\t\t\t     CameraBuffer *destination,\n> +\t\t\t     Camera3RequestDescriptor *request) = 0;\n>  \n>  \tlibcamera::Signal<Camera3RequestDescriptor *, Status> processComplete;\n>  };\n> diff --git a/src/android/yuv/post_processor_yuv.cpp b/src/android/yuv/post_processor_yuv.cpp\n> index b34b389d..860a1a7f 100644\n> --- a/src/android/yuv/post_processor_yuv.cpp\n> +++ b/src/android/yuv/post_processor_yuv.cpp\n> @@ -51,20 +51,20 @@ int PostProcessorYuv::configure(const StreamConfiguration &inCfg,\n>  \treturn 0;\n>  }\n>  \n> -int PostProcessorYuv::process(const FrameBuffer &source,\n> -\t\t\t      CameraBuffer *destination,\n> -\t\t\t      Camera3RequestDescriptor *request)\n> +void PostProcessorYuv::process(const FrameBuffer &source,\n> +\t\t\t       CameraBuffer *destination,\n> +\t\t\t       Camera3RequestDescriptor *request)\n>  {\n>  \tif (!isValidBuffers(source, *destination)) {\n>  \t\tprocessComplete.emit(request, PostProcessor::Status::Error);\n> -\t\treturn -EINVAL;\n> +\t\treturn;\n>  \t}\n>  \n>  \tconst MappedFrameBuffer sourceMapped(&source, MappedFrameBuffer::MapFlag::Read);\n>  \tif (!sourceMapped.isValid()) {\n>  \t\tLOG(YUV, Error) << \"Failed to mmap camera frame buffer\";\n>  \t\tprocessComplete.emit(request, PostProcessor::Status::Error);\n> -\t\treturn -EINVAL;\n> +\t\treturn;\n>  \t}\n>  \n>  \tint ret = libyuv::NV12Scale(sourceMapped.planes()[0].data(),\n> @@ -82,12 +82,10 @@ int PostProcessorYuv::process(const FrameBuffer &source,\n>  \tif (ret) {\n>  \t\tLOG(YUV, Error) << \"Failed NV12 scaling: \" << ret;\n>  \t\tprocessComplete.emit(request, PostProcessor::Status::Error);\n> -\t\treturn -EINVAL;\n> +\t\treturn;\n>  \t}\n>  \n>  \tprocessComplete.emit(request, PostProcessor::Status::Success);\n> -\n> -\treturn 0;\n>  }\n>  \n>  bool PostProcessorYuv::isValidBuffers(const FrameBuffer &source,\n> diff --git a/src/android/yuv/post_processor_yuv.h b/src/android/yuv/post_processor_yuv.h\n> index a4e0ff5d..1278843b 100644\n> --- a/src/android/yuv/post_processor_yuv.h\n> +++ b/src/android/yuv/post_processor_yuv.h\n> @@ -18,9 +18,9 @@ public:\n>  \n>  \tint configure(const libcamera::StreamConfiguration &incfg,\n>  \t\t      const libcamera::StreamConfiguration &outcfg) override;\n> -\tint process(const libcamera::FrameBuffer &source,\n> -\t\t    CameraBuffer *destination,\n> -\t\t    Camera3RequestDescriptor *request) override;\n> +\tvoid process(const libcamera::FrameBuffer &source,\n> +\t\t     CameraBuffer *destination,\n> +\t\t     Camera3RequestDescriptor *request) override;\n>  \n>  private:\n>  \tbool isValidBuffers(const libcamera::FrameBuffer &source,","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 4E7DBBDC71\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 12 Oct 2021 03:40:10 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B46E468F4C;\n\tTue, 12 Oct 2021 05:40:09 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EB1186023A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 12 Oct 2021 05:40:08 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 60D20F1;\n\tTue, 12 Oct 2021 05:40:08 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"s4DQ7bIe\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1634010008;\n\tbh=YoecdrdJ8H8IdbcBSTYOMB9rStyGXS/2lR4XetAS92o=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=s4DQ7bIe3QTGLDs3JBp+6eYrxvv4mZFh6od4OUneo4TGUw2KQGoJLpvY2LedaIW1r\n\tOypIyXQ044e2H0jrDled6sYNzoPsX0JQaLTeReZjvRtiTVWpgFQJL1QiPwu6QUOVj+\n\tGDk97ytYT2jb1BvGzlh+y0jpFofptpOwxOEo04kM=","Date":"Tue, 12 Oct 2021 06:39:55 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Umang Jain <umang.jain@ideasonboard.com>","Message-ID":"<YWUDi6ebRszaddZN@pendragon.ideasonboard.com>","References":"<20211011073505.243864-1-umang.jain@ideasonboard.com>\n\t<20211011073505.243864-5-umang.jain@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20211011073505.243864-5-umang.jain@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v4 4/7] android: camera_stream: Drop\n\treturn value for process()","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@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":20172,"web_url":"https://patchwork.libcamera.org/comment/20172/","msgid":"<e1fb02cf-924d-7c11-e6b5-e3b381ef430f@ideasonboard.com>","date":"2021-10-13T10:03:00","subject":"Re: [libcamera-devel] [PATCH v4 4/7] android: camera_stream: Drop\n\treturn value for process()","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hi Laurent,\n\nOn 10/12/21 9:09 AM, Laurent Pinchart wrote:\n> Hi Umang,\n>\n> Thank you for the patch.\n>\n> On Mon, Oct 11, 2021 at 01:05:02PM +0530, Umang Jain wrote:\n>> CameraStream::process() is invoked by CameraDevice::requestComplete()\n>> in case any post-processing is required for the camera stream. The\n>> failure or success is checked via the value returned by\n>> CameraStream::process().\n>>\n>> Now that the post-processor notifies about the post-processing\n>> completion operation, we can drop the return value of\n>> CameraStream::process(). The status of post-processing is passed\n>> to CameraDevice::streamProcessingComplete() by the\n>> PostProcessor::processComplete slot.\n>>\n>> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>\n>> ---\n>>   src/android/camera_device.cpp            |  2 +-\n>>   src/android/camera_stream.cpp            | 14 +++++++-------\n>>   src/android/camera_stream.h              |  6 +++---\n>>   src/android/jpeg/post_processor_jpeg.cpp | 12 +++++-------\n>>   src/android/jpeg/post_processor_jpeg.h   |  6 +++---\n>>   src/android/post_processor.h             |  6 +++---\n>>   src/android/yuv/post_processor_yuv.cpp   | 14 ++++++--------\n>>   src/android/yuv/post_processor_yuv.h     |  6 +++---\n>>   8 files changed, 31 insertions(+), 35 deletions(-)\n>>\n>> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n>> index 9f26c36d..eba370ea 100644\n>> --- a/src/android/camera_device.cpp\n>> +++ b/src/android/camera_device.cpp\n>> @@ -1228,7 +1228,7 @@ void CameraDevice::requestComplete(Request *request)\n>>   \t\tif (cameraStream->type() == CameraStream::Type::Internal)\n>>   \t\t\tdescriptor->internalBuffer_ = src;\n>>   \n>> -\t\tint ret = cameraStream->process(*src, buffer, descriptor);\n>> +\t\tcameraStream->process(*src, buffer, descriptor);\n>>   \n>>   \t\treturn;\n> I forgot to comment in the previous patch that you should only return\n> early if no stream requires post-processing, not after the first one.\n\n\nWe can only know that by iterating over the descriptor->buffers_ right? \nWe return early here since, we don't want to trigger \nsendCaptureResults() below, outside the loop.\n\nSince we are now discussing multiple post-processing requests even for \nsingle requestComplete(), this loop becomes crucial as it will queue up \nall the post-processing requests to relevant cameraStreams\n\nI'll think how should we return in that case.\n\n>\n>>   \t}\n>> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp\n>> index d91e7dee..cec07269 100644\n>> --- a/src/android/camera_stream.cpp\n>> +++ b/src/android/camera_stream.cpp\n>> @@ -147,9 +147,9 @@ int CameraStream::waitFence(int fence)\n>>   \treturn -errno;\n>>   }\n>>   \n>> -int CameraStream::process(const FrameBuffer &source,\n>> -\t\t\t  camera3_stream_buffer_t &camera3Dest,\n>> -\t\t\t  Camera3RequestDescriptor *request)\n>> +void CameraStream::process(const FrameBuffer &source,\n>> +\t\t\t   camera3_stream_buffer_t &camera3Dest,\n>> +\t\t\t   Camera3RequestDescriptor *request)\n>>   {\n>>   \t/* Handle waiting on fences on the destination buffer. */\n>>   \tint fence = camera3Dest.acquire_fence;\n>> @@ -160,12 +160,12 @@ int CameraStream::process(const FrameBuffer &source,\n>>   \t\tif (ret < 0) {\n>>   \t\t\tLOG(HAL, Error) << \"Failed waiting for fence: \"\n>>   \t\t\t\t\t<< fence << \": \" << strerror(-ret);\n>> -\t\t\treturn ret;\n>> +\t\t\treturn;\n>>   \t\t}\n>>   \t}\n>>   \n>>   \tif (!postProcessor_)\n>> -\t\treturn 0;\n>> +\t\treturn;\n> Can this happen btw ?\n\n\nIf it happens, it'll be the caller's error for triggering it.\n\nA CameraStream Type::Direct and you call a ->process() on it. Doesn't \nmake sense right? Should be up the intensity and put an assert instead?\n\n     ASSERT (type_ != Type::Direct)\n\n>\n>>   \n>>   \t/*\n>>   \t * \\todo Buffer mapping and processing should be moved to a\n>> @@ -176,10 +176,10 @@ int CameraStream::process(const FrameBuffer &source,\n>>   \t\t\t  PROT_READ | PROT_WRITE);\n>>   \tif (!dest.isValid()) {\n>>   \t\tLOG(HAL, Error) << \"Failed to create destination buffer\";\n>> -\t\treturn -EINVAL;\n>> +\t\treturn;\n>>   \t}\n> We have a set of failure conditions here that don't result in any\n> notification to the CameraDevice, the request will be lost. You could\n> call CameraDevice::streamProcessingComplete() in those locations, but it\n> may be easier to keep returning an int from this function (not the ones\n> below) and handle errors in the caller.\n\n\nEvery error handle patch should call\n\n     cameraDevice_->streamProcessingComplete(this, request, \nCamera3RequestDescriptor::Status::Error)\n\nThis is my mistake not to closely follow the error handling paths in \nthis patch\n\n>\n>>   \n>> -\treturn postProcessor_->process(source, &dest, request);\n>> +\tpostProcessor_->process(source, &dest, request);\n>>   }\n>>   \n>>   FrameBuffer *CameraStream::getBuffer()\n>> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h\n>> index 04cfd111..a0c5f166 100644\n>> --- a/src/android/camera_stream.h\n>> +++ b/src/android/camera_stream.h\n>> @@ -120,9 +120,9 @@ public:\n>>   \tlibcamera::Stream *stream() const;\n>>   \n>>   \tint configure();\n>> -\tint process(const libcamera::FrameBuffer &source,\n>> -\t\t    camera3_stream_buffer_t &camera3Buffer,\n>> -\t\t    Camera3RequestDescriptor *request);\n>> +\tvoid process(const libcamera::FrameBuffer &source,\n>> +\t\t     camera3_stream_buffer_t &camera3Buffer,\n>> +\t\t     Camera3RequestDescriptor *request);\n>>   \tlibcamera::FrameBuffer *getBuffer();\n>>   \tvoid putBuffer(libcamera::FrameBuffer *buffer);\n>>   \n>> diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp\n>> index 81d1efe6..eb87931b 100644\n>> --- a/src/android/jpeg/post_processor_jpeg.cpp\n>> +++ b/src/android/jpeg/post_processor_jpeg.cpp\n>> @@ -97,12 +97,12 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,\n>>   \t}\n>>   }\n>>   \n>> -int PostProcessorJpeg::process(const FrameBuffer &source,\n>> -\t\t\t       CameraBuffer *destination,\n>> -\t\t\t       Camera3RequestDescriptor *request)\n>> +void PostProcessorJpeg::process(const FrameBuffer &source,\n>> +\t\t\t\tCameraBuffer *destination,\n>> +\t\t\t\tCamera3RequestDescriptor *request)\n>>   {\n>>   \tif (!encoder_)\n>> -\t\treturn 0;\n>> +\t\treturn;\n> Same here, if this can happen, we'll lose the request, if it can't\n> happen, it should be dropped, or replaced with an ASSERT() if you're not\n> sure.\n>\n>>   \n>>   \tASSERT(destination->numPlanes() == 1);\n>>   \n>> @@ -198,7 +198,7 @@ int PostProcessorJpeg::process(const FrameBuffer &source,\n>>   \tif (jpeg_size < 0) {\n>>   \t\tLOG(JPEG, Error) << \"Failed to encode stream image\";\n>>   \t\tprocessComplete.emit(request, PostProcessor::Status::Error);\n>> -\t\treturn jpeg_size;\n>> +\t\treturn;\n>>   \t}\n>>   \n>>   \t/* Fill in the JPEG blob header. */\n>> @@ -212,6 +212,4 @@ int PostProcessorJpeg::process(const FrameBuffer &source,\n>>   \t/* Update the JPEG result Metadata. */\n>>   \tresultMetadata->addEntry(ANDROID_JPEG_SIZE, jpeg_size);\n>>   \tprocessComplete.emit(request, PostProcessor::Status::Success);\n>> -\n>> -\treturn 0;\n>>   }\n>> diff --git a/src/android/jpeg/post_processor_jpeg.h b/src/android/jpeg/post_processor_jpeg.h\n>> index 0184d77e..5dab14e1 100644\n>> --- a/src/android/jpeg/post_processor_jpeg.h\n>> +++ b/src/android/jpeg/post_processor_jpeg.h\n>> @@ -22,9 +22,9 @@ public:\n>>   \n>>   \tint configure(const libcamera::StreamConfiguration &incfg,\n>>   \t\t      const libcamera::StreamConfiguration &outcfg) override;\n>> -\tint process(const libcamera::FrameBuffer &source,\n>> -\t\t    CameraBuffer *destination,\n>> -\t\t    Camera3RequestDescriptor *request) override;\n>> +\tvoid process(const libcamera::FrameBuffer &source,\n>> +\t\t     CameraBuffer *destination,\n>> +\t\t     Camera3RequestDescriptor *request) override;\n>>   \n>>   private:\n>>   \tvoid generateThumbnail(const libcamera::FrameBuffer &source,\n>> diff --git a/src/android/post_processor.h b/src/android/post_processor.h\n>> index 6e67bcba..88a5f985 100644\n>> --- a/src/android/post_processor.h\n>> +++ b/src/android/post_processor.h\n>> @@ -30,9 +30,9 @@ public:\n>>   \n>>   \tvirtual int configure(const libcamera::StreamConfiguration &inCfg,\n>>   \t\t\t      const libcamera::StreamConfiguration &outCfg) = 0;\n>> -\tvirtual int process(const libcamera::FrameBuffer &source,\n>> -\t\t\t    CameraBuffer *destination,\n>> -\t\t\t    Camera3RequestDescriptor *request) = 0;\n>> +\tvirtual void process(const libcamera::FrameBuffer &source,\n>> +\t\t\t     CameraBuffer *destination,\n>> +\t\t\t     Camera3RequestDescriptor *request) = 0;\n>>   \n>>   \tlibcamera::Signal<Camera3RequestDescriptor *, Status> processComplete;\n>>   };\n>> diff --git a/src/android/yuv/post_processor_yuv.cpp b/src/android/yuv/post_processor_yuv.cpp\n>> index b34b389d..860a1a7f 100644\n>> --- a/src/android/yuv/post_processor_yuv.cpp\n>> +++ b/src/android/yuv/post_processor_yuv.cpp\n>> @@ -51,20 +51,20 @@ int PostProcessorYuv::configure(const StreamConfiguration &inCfg,\n>>   \treturn 0;\n>>   }\n>>   \n>> -int PostProcessorYuv::process(const FrameBuffer &source,\n>> -\t\t\t      CameraBuffer *destination,\n>> -\t\t\t      Camera3RequestDescriptor *request)\n>> +void PostProcessorYuv::process(const FrameBuffer &source,\n>> +\t\t\t       CameraBuffer *destination,\n>> +\t\t\t       Camera3RequestDescriptor *request)\n>>   {\n>>   \tif (!isValidBuffers(source, *destination)) {\n>>   \t\tprocessComplete.emit(request, PostProcessor::Status::Error);\n>> -\t\treturn -EINVAL;\n>> +\t\treturn;\n>>   \t}\n>>   \n>>   \tconst MappedFrameBuffer sourceMapped(&source, MappedFrameBuffer::MapFlag::Read);\n>>   \tif (!sourceMapped.isValid()) {\n>>   \t\tLOG(YUV, Error) << \"Failed to mmap camera frame buffer\";\n>>   \t\tprocessComplete.emit(request, PostProcessor::Status::Error);\n>> -\t\treturn -EINVAL;\n>> +\t\treturn;\n>>   \t}\n>>   \n>>   \tint ret = libyuv::NV12Scale(sourceMapped.planes()[0].data(),\n>> @@ -82,12 +82,10 @@ int PostProcessorYuv::process(const FrameBuffer &source,\n>>   \tif (ret) {\n>>   \t\tLOG(YUV, Error) << \"Failed NV12 scaling: \" << ret;\n>>   \t\tprocessComplete.emit(request, PostProcessor::Status::Error);\n>> -\t\treturn -EINVAL;\n>> +\t\treturn;\n>>   \t}\n>>   \n>>   \tprocessComplete.emit(request, PostProcessor::Status::Success);\n>> -\n>> -\treturn 0;\n>>   }\n>>   \n>>   bool PostProcessorYuv::isValidBuffers(const FrameBuffer &source,\n>> diff --git a/src/android/yuv/post_processor_yuv.h b/src/android/yuv/post_processor_yuv.h\n>> index a4e0ff5d..1278843b 100644\n>> --- a/src/android/yuv/post_processor_yuv.h\n>> +++ b/src/android/yuv/post_processor_yuv.h\n>> @@ -18,9 +18,9 @@ public:\n>>   \n>>   \tint configure(const libcamera::StreamConfiguration &incfg,\n>>   \t\t      const libcamera::StreamConfiguration &outcfg) override;\n>> -\tint process(const libcamera::FrameBuffer &source,\n>> -\t\t    CameraBuffer *destination,\n>> -\t\t    Camera3RequestDescriptor *request) override;\n>> +\tvoid process(const libcamera::FrameBuffer &source,\n>> +\t\t     CameraBuffer *destination,\n>> +\t\t     Camera3RequestDescriptor *request) override;\n>>   \n>>   private:\n>>   \tbool isValidBuffers(const libcamera::FrameBuffer &source,","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 6D27FC323E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 13 Oct 2021 10:03:07 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 99A5268F4F;\n\tWed, 13 Oct 2021 12:03:06 +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 77A2C60501\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 13 Oct 2021 12:03:05 +0200 (CEST)","from [192.168.1.106] (unknown [103.251.226.115])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 66D6F18FF;\n\tWed, 13 Oct 2021 12:03:04 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"kX2Q48zf\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1634119385;\n\tbh=a5L3XwSfnQAkesZeuOVdXzc/ioksegOnmOuCMI4nM5I=;\n\th=Subject:To:Cc:References:From:Date:In-Reply-To:From;\n\tb=kX2Q48zfnCcThu18I3TV+4TiTGP7Dj348EaBUHzL2UBLQdNBcbE14gxukG1yg3Mxn\n\tNAeivpVacdyDf3T8xN0WeDr7fFTFkURyM5zZdA3LLs7KRA3Y/bAoHT39M5PBvsSs9Y\n\t+3djk5wKFgXIqscFl2iOYgRhrjZdZoP9wiONg9fk=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","References":"<20211011073505.243864-1-umang.jain@ideasonboard.com>\n\t<20211011073505.243864-5-umang.jain@ideasonboard.com>\n\t<YWUDi6ebRszaddZN@pendragon.ideasonboard.com>","From":"Umang Jain <umang.jain@ideasonboard.com>","Message-ID":"<e1fb02cf-924d-7c11-e6b5-e3b381ef430f@ideasonboard.com>","Date":"Wed, 13 Oct 2021 15:33:00 +0530","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101\n\tThunderbird/78.10.2","MIME-Version":"1.0","In-Reply-To":"<YWUDi6ebRszaddZN@pendragon.ideasonboard.com>","Content-Type":"text/plain; charset=utf-8; format=flowed","Content-Transfer-Encoding":"8bit","Content-Language":"en-US","Subject":"Re: [libcamera-devel] [PATCH v4 4/7] android: camera_stream: Drop\n\treturn value for process()","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@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":20175,"web_url":"https://patchwork.libcamera.org/comment/20175/","msgid":"<YWaxaNQBXcfYBWE1@pendragon.ideasonboard.com>","date":"2021-10-13T10:14:00","subject":"Re: [libcamera-devel] [PATCH v4 4/7] android: camera_stream: Drop\n\treturn value for process()","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Umang,\n\nOn Wed, Oct 13, 2021 at 03:33:00PM +0530, Umang Jain wrote:\n> On 10/12/21 9:09 AM, Laurent Pinchart wrote:\n> > On Mon, Oct 11, 2021 at 01:05:02PM +0530, Umang Jain wrote:\n> >> CameraStream::process() is invoked by CameraDevice::requestComplete()\n> >> in case any post-processing is required for the camera stream. The\n> >> failure or success is checked via the value returned by\n> >> CameraStream::process().\n> >>\n> >> Now that the post-processor notifies about the post-processing\n> >> completion operation, we can drop the return value of\n> >> CameraStream::process(). The status of post-processing is passed\n> >> to CameraDevice::streamProcessingComplete() by the\n> >> PostProcessor::processComplete slot.\n> >>\n> >> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>\n> >> ---\n> >>   src/android/camera_device.cpp            |  2 +-\n> >>   src/android/camera_stream.cpp            | 14 +++++++-------\n> >>   src/android/camera_stream.h              |  6 +++---\n> >>   src/android/jpeg/post_processor_jpeg.cpp | 12 +++++-------\n> >>   src/android/jpeg/post_processor_jpeg.h   |  6 +++---\n> >>   src/android/post_processor.h             |  6 +++---\n> >>   src/android/yuv/post_processor_yuv.cpp   | 14 ++++++--------\n> >>   src/android/yuv/post_processor_yuv.h     |  6 +++---\n> >>   8 files changed, 31 insertions(+), 35 deletions(-)\n> >>\n> >> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> >> index 9f26c36d..eba370ea 100644\n> >> --- a/src/android/camera_device.cpp\n> >> +++ b/src/android/camera_device.cpp\n> >> @@ -1228,7 +1228,7 @@ void CameraDevice::requestComplete(Request *request)\n> >>   \t\tif (cameraStream->type() == CameraStream::Type::Internal)\n> >>   \t\t\tdescriptor->internalBuffer_ = src;\n> >>   \n> >> -\t\tint ret = cameraStream->process(*src, buffer, descriptor);\n> >> +\t\tcameraStream->process(*src, buffer, descriptor);\n> >>   \n> >>   \t\treturn;\n> >\n> > I forgot to comment in the previous patch that you should only return\n> > early if no stream requires post-processing, not after the first one.\n> \n> We can only know that by iterating over the descriptor->buffers_ right? \n> We return early here since, we don't want to trigger \n> sendCaptureResults() below, outside the loop.\n> \n> Since we are now discussing multiple post-processing requests even for \n> single requestComplete(), this loop becomes crucial as it will queue up \n> all the post-processing requests to relevant cameraStreams\n> \n> I'll think how should we return in that case.\n\nYou can have a local variable that indicates if at least one stream\nrequired post-processing, and return after this loop in that case.\n\n> >>   \t}\n> >> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp\n> >> index d91e7dee..cec07269 100644\n> >> --- a/src/android/camera_stream.cpp\n> >> +++ b/src/android/camera_stream.cpp\n> >> @@ -147,9 +147,9 @@ int CameraStream::waitFence(int fence)\n> >>   \treturn -errno;\n> >>   }\n> >>   \n> >> -int CameraStream::process(const FrameBuffer &source,\n> >> -\t\t\t  camera3_stream_buffer_t &camera3Dest,\n> >> -\t\t\t  Camera3RequestDescriptor *request)\n> >> +void CameraStream::process(const FrameBuffer &source,\n> >> +\t\t\t   camera3_stream_buffer_t &camera3Dest,\n> >> +\t\t\t   Camera3RequestDescriptor *request)\n> >>   {\n> >>   \t/* Handle waiting on fences on the destination buffer. */\n> >>   \tint fence = camera3Dest.acquire_fence;\n> >> @@ -160,12 +160,12 @@ int CameraStream::process(const FrameBuffer &source,\n> >>   \t\tif (ret < 0) {\n> >>   \t\t\tLOG(HAL, Error) << \"Failed waiting for fence: \"\n> >>   \t\t\t\t\t<< fence << \": \" << strerror(-ret);\n> >> -\t\t\treturn ret;\n> >> +\t\t\treturn;\n> >>   \t\t}\n> >>   \t}\n> >>   \n> >>   \tif (!postProcessor_)\n> >> -\t\treturn 0;\n> >> +\t\treturn;\n> >\n> > Can this happen btw ?\n> \n> If it happens, it'll be the caller's error for triggering it.\n> \n> A CameraStream Type::Direct and you call a ->process() on it. Doesn't \n> make sense right? Should be up the intensity and put an assert instead?\n> \n>      ASSERT (type_ != Type::Direct)\n\nIf it can't happen unless there's a bug in the HAL, ASSERT() will likely\nbe easier, yes. Otherwise you need to notify an error to the caller or\nthe request will be lost silently.\n\n> >>   \n> >>   \t/*\n> >>   \t * \\todo Buffer mapping and processing should be moved to a\n> >> @@ -176,10 +176,10 @@ int CameraStream::process(const FrameBuffer &source,\n> >>   \t\t\t  PROT_READ | PROT_WRITE);\n> >>   \tif (!dest.isValid()) {\n> >>   \t\tLOG(HAL, Error) << \"Failed to create destination buffer\";\n> >> -\t\treturn -EINVAL;\n> >> +\t\treturn;\n> >>   \t}\n> >\n> > We have a set of failure conditions here that don't result in any\n> > notification to the CameraDevice, the request will be lost. You could\n> > call CameraDevice::streamProcessingComplete() in those locations, but it\n> > may be easier to keep returning an int from this function (not the ones\n> > below) and handle errors in the caller.\n> \n> Every error handle patch should call\n> \n>      cameraDevice_->streamProcessingComplete(this, request, \n> Camera3RequestDescriptor::Status::Error)\n\nTo avoid calling that in every single location here, I think\nCameraStream::process() should return an error status. The caller can\nthen handle it. It's like queuing a request, errors can be returned\nsynchronously, but if the call succeeds, then asynchronous errors are\nnotified through a different mechanism.\n\n> This is my mistake not to closely follow the error handling paths in \n> this patch\n> \n> >> -\treturn postProcessor_->process(source, &dest, request);\n> >> +\tpostProcessor_->process(source, &dest, request);\n> >>   }\n> >>   \n> >>   FrameBuffer *CameraStream::getBuffer()\n> >> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h\n> >> index 04cfd111..a0c5f166 100644\n> >> --- a/src/android/camera_stream.h\n> >> +++ b/src/android/camera_stream.h\n> >> @@ -120,9 +120,9 @@ public:\n> >>   \tlibcamera::Stream *stream() const;\n> >>   \n> >>   \tint configure();\n> >> -\tint process(const libcamera::FrameBuffer &source,\n> >> -\t\t    camera3_stream_buffer_t &camera3Buffer,\n> >> -\t\t    Camera3RequestDescriptor *request);\n> >> +\tvoid process(const libcamera::FrameBuffer &source,\n> >> +\t\t     camera3_stream_buffer_t &camera3Buffer,\n> >> +\t\t     Camera3RequestDescriptor *request);\n> >>   \tlibcamera::FrameBuffer *getBuffer();\n> >>   \tvoid putBuffer(libcamera::FrameBuffer *buffer);\n> >>   \n> >> diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp\n> >> index 81d1efe6..eb87931b 100644\n> >> --- a/src/android/jpeg/post_processor_jpeg.cpp\n> >> +++ b/src/android/jpeg/post_processor_jpeg.cpp\n> >> @@ -97,12 +97,12 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,\n> >>   \t}\n> >>   }\n> >>   \n> >> -int PostProcessorJpeg::process(const FrameBuffer &source,\n> >> -\t\t\t       CameraBuffer *destination,\n> >> -\t\t\t       Camera3RequestDescriptor *request)\n> >> +void PostProcessorJpeg::process(const FrameBuffer &source,\n> >> +\t\t\t\tCameraBuffer *destination,\n> >> +\t\t\t\tCamera3RequestDescriptor *request)\n> >>   {\n> >>   \tif (!encoder_)\n> >> -\t\treturn 0;\n> >> +\t\treturn;\n> >\n> > Same here, if this can happen, we'll lose the request, if it can't\n> > happen, it should be dropped, or replaced with an ASSERT() if you're not\n> > sure.\n> >\n> >>   \tASSERT(destination->numPlanes() == 1);\n> >>   \n> >> @@ -198,7 +198,7 @@ int PostProcessorJpeg::process(const FrameBuffer &source,\n> >>   \tif (jpeg_size < 0) {\n> >>   \t\tLOG(JPEG, Error) << \"Failed to encode stream image\";\n> >>   \t\tprocessComplete.emit(request, PostProcessor::Status::Error);\n> >> -\t\treturn jpeg_size;\n> >> +\t\treturn;\n> >>   \t}\n> >>   \n> >>   \t/* Fill in the JPEG blob header. */\n> >> @@ -212,6 +212,4 @@ int PostProcessorJpeg::process(const FrameBuffer &source,\n> >>   \t/* Update the JPEG result Metadata. */\n> >>   \tresultMetadata->addEntry(ANDROID_JPEG_SIZE, jpeg_size);\n> >>   \tprocessComplete.emit(request, PostProcessor::Status::Success);\n> >> -\n> >> -\treturn 0;\n> >>   }\n> >> diff --git a/src/android/jpeg/post_processor_jpeg.h b/src/android/jpeg/post_processor_jpeg.h\n> >> index 0184d77e..5dab14e1 100644\n> >> --- a/src/android/jpeg/post_processor_jpeg.h\n> >> +++ b/src/android/jpeg/post_processor_jpeg.h\n> >> @@ -22,9 +22,9 @@ public:\n> >>   \n> >>   \tint configure(const libcamera::StreamConfiguration &incfg,\n> >>   \t\t      const libcamera::StreamConfiguration &outcfg) override;\n> >> -\tint process(const libcamera::FrameBuffer &source,\n> >> -\t\t    CameraBuffer *destination,\n> >> -\t\t    Camera3RequestDescriptor *request) override;\n> >> +\tvoid process(const libcamera::FrameBuffer &source,\n> >> +\t\t     CameraBuffer *destination,\n> >> +\t\t     Camera3RequestDescriptor *request) override;\n> >>   \n> >>   private:\n> >>   \tvoid generateThumbnail(const libcamera::FrameBuffer &source,\n> >> diff --git a/src/android/post_processor.h b/src/android/post_processor.h\n> >> index 6e67bcba..88a5f985 100644\n> >> --- a/src/android/post_processor.h\n> >> +++ b/src/android/post_processor.h\n> >> @@ -30,9 +30,9 @@ public:\n> >>   \n> >>   \tvirtual int configure(const libcamera::StreamConfiguration &inCfg,\n> >>   \t\t\t      const libcamera::StreamConfiguration &outCfg) = 0;\n> >> -\tvirtual int process(const libcamera::FrameBuffer &source,\n> >> -\t\t\t    CameraBuffer *destination,\n> >> -\t\t\t    Camera3RequestDescriptor *request) = 0;\n> >> +\tvirtual void process(const libcamera::FrameBuffer &source,\n> >> +\t\t\t     CameraBuffer *destination,\n> >> +\t\t\t     Camera3RequestDescriptor *request) = 0;\n> >>   \n> >>   \tlibcamera::Signal<Camera3RequestDescriptor *, Status> processComplete;\n> >>   };\n> >> diff --git a/src/android/yuv/post_processor_yuv.cpp b/src/android/yuv/post_processor_yuv.cpp\n> >> index b34b389d..860a1a7f 100644\n> >> --- a/src/android/yuv/post_processor_yuv.cpp\n> >> +++ b/src/android/yuv/post_processor_yuv.cpp\n> >> @@ -51,20 +51,20 @@ int PostProcessorYuv::configure(const StreamConfiguration &inCfg,\n> >>   \treturn 0;\n> >>   }\n> >>   \n> >> -int PostProcessorYuv::process(const FrameBuffer &source,\n> >> -\t\t\t      CameraBuffer *destination,\n> >> -\t\t\t      Camera3RequestDescriptor *request)\n> >> +void PostProcessorYuv::process(const FrameBuffer &source,\n> >> +\t\t\t       CameraBuffer *destination,\n> >> +\t\t\t       Camera3RequestDescriptor *request)\n> >>   {\n> >>   \tif (!isValidBuffers(source, *destination)) {\n> >>   \t\tprocessComplete.emit(request, PostProcessor::Status::Error);\n> >> -\t\treturn -EINVAL;\n> >> +\t\treturn;\n> >>   \t}\n> >>   \n> >>   \tconst MappedFrameBuffer sourceMapped(&source, MappedFrameBuffer::MapFlag::Read);\n> >>   \tif (!sourceMapped.isValid()) {\n> >>   \t\tLOG(YUV, Error) << \"Failed to mmap camera frame buffer\";\n> >>   \t\tprocessComplete.emit(request, PostProcessor::Status::Error);\n> >> -\t\treturn -EINVAL;\n> >> +\t\treturn;\n> >>   \t}\n> >>   \n> >>   \tint ret = libyuv::NV12Scale(sourceMapped.planes()[0].data(),\n> >> @@ -82,12 +82,10 @@ int PostProcessorYuv::process(const FrameBuffer &source,\n> >>   \tif (ret) {\n> >>   \t\tLOG(YUV, Error) << \"Failed NV12 scaling: \" << ret;\n> >>   \t\tprocessComplete.emit(request, PostProcessor::Status::Error);\n> >> -\t\treturn -EINVAL;\n> >> +\t\treturn;\n> >>   \t}\n> >>   \n> >>   \tprocessComplete.emit(request, PostProcessor::Status::Success);\n> >> -\n> >> -\treturn 0;\n> >>   }\n> >>   \n> >>   bool PostProcessorYuv::isValidBuffers(const FrameBuffer &source,\n> >> diff --git a/src/android/yuv/post_processor_yuv.h b/src/android/yuv/post_processor_yuv.h\n> >> index a4e0ff5d..1278843b 100644\n> >> --- a/src/android/yuv/post_processor_yuv.h\n> >> +++ b/src/android/yuv/post_processor_yuv.h\n> >> @@ -18,9 +18,9 @@ public:\n> >>   \n> >>   \tint configure(const libcamera::StreamConfiguration &incfg,\n> >>   \t\t      const libcamera::StreamConfiguration &outcfg) override;\n> >> -\tint process(const libcamera::FrameBuffer &source,\n> >> -\t\t    CameraBuffer *destination,\n> >> -\t\t    Camera3RequestDescriptor *request) override;\n> >> +\tvoid process(const libcamera::FrameBuffer &source,\n> >> +\t\t     CameraBuffer *destination,\n> >> +\t\t     Camera3RequestDescriptor *request) override;\n> >>   \n> >>   private:\n> >>   \tbool isValidBuffers(const libcamera::FrameBuffer &source,","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 00061C323E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 13 Oct 2021 10:14:15 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C86E868F4F;\n\tWed, 13 Oct 2021 12:14:15 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C62AE60501\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 13 Oct 2021 12:14:14 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 5FDD718FF;\n\tWed, 13 Oct 2021 12:14:14 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Q/OZYqYd\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1634120054;\n\tbh=OtZZdJLC8AUORQseCFki7HH2lZXEuaUTd1wFkF57BMI=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Q/OZYqYdUr08oKhW9/Zn548QVvvnrl9/bQu4uKvRKAIJ0D21q1GdDwWkKc/s4G6bb\n\ticOmVBFJI5bRzMQ8Z+EMBaBOd80gn5FyVgG+ENIAI2ZqHDtxQNltBuNiV9X3qm/mE2\n\tZDtUENYLDwumzbTqMcg06qgnx6BRgTJJIUOekujk=","Date":"Wed, 13 Oct 2021 13:14:00 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Umang Jain <umang.jain@ideasonboard.com>","Message-ID":"<YWaxaNQBXcfYBWE1@pendragon.ideasonboard.com>","References":"<20211011073505.243864-1-umang.jain@ideasonboard.com>\n\t<20211011073505.243864-5-umang.jain@ideasonboard.com>\n\t<YWUDi6ebRszaddZN@pendragon.ideasonboard.com>\n\t<e1fb02cf-924d-7c11-e6b5-e3b381ef430f@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<e1fb02cf-924d-7c11-e6b5-e3b381ef430f@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v4 4/7] android: camera_stream: Drop\n\treturn value for process()","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@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]