[{"id":34954,"web_url":"https://patchwork.libcamera.org/comment/34954/","msgid":"<dtmikle5ycpmwnrbuets46ufhgrat7v4lewxgx3ue263je3z4e@vabts4kr6om4>","date":"2025-07-21T05:33:55","subject":"Re: [PATCH v10 8/8] libcamera: simple: Make raw streams working","submitter":{"id":232,"url":"https://patchwork.libcamera.org/api/people/232/","name":"Umang Jain","email":"uajain@igalia.com"},"content":"Hi Milan,\n\nOn Fri, Jul 11, 2025 at 07:53:41PM +0200, Milan Zamazal wrote:\n> When a raw stream is requested, whether alone or together with a\n> processed stream, its buffers must be handled outside the software ISP\n> machinery.  They serve as output buffers, even when a processed stream\n> is produced.\n> \n> At most one raw stream and at most one processed stream are supported\n> and can be combined.  An example of producing both raw and processed\n> files using `cam' application:\n> \n>   cam -c1 -C100 -Ffile# \\\n>     -s role=viewfinder,width=1920,height=1080,pixelformat=RGB888 \\\n>     -s role=raw,width=3280,height=2464,pixelformat=SRGGB8 \\\n> \n> Note the difference in viewfinder and raw stream sizes due to the fact\n> that debayering requires enlarging the image width, which enforces\n> selecting a larger sensor resolution in this case.\n> \n> In order to distinguish between different cases, processedRequested_ and\n> rawRequested_ flags are copied from SimpleCameraConfiguration to\n> SimpleCameraData after successful configure(), similarly to\n> useConversion_ flag.\n> \n> This is the final step to make raw streams working.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>  src/libcamera/pipeline/simple/simple.cpp | 41 +++++++++++++++++-------\n>  1 file changed, 30 insertions(+), 11 deletions(-)\n> \n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index 01b25fb20..c3db5c068 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -351,6 +351,8 @@ public:\n>  \t};\n>  \tstd::queue<RequestOutputs> conversionQueue_;\n>  \tbool useConversion_;\n> +\tbool processedRequested_;\n> +\tbool rawRequested_;\n>  \n>  \tstd::unique_ptr<Converter> converter_;\n>  \tstd::unique_ptr<SoftwareIsp> swIsp_;\n> @@ -384,6 +386,9 @@ public:\n>  \tbool needConversion() const { return needConversion_; }\n>  \tconst Transform &combinedTransform() const { return combinedTransform_; }\n>  \n> +\tbool processedRequested_;\n> +\tbool rawRequested_;\n\nSo in my opinion you can simply track the RAW stream(s), if it is\nrequested, to get rid of these flags.\n\n($) git grep -ni rawstream | grep -i 'pipeline/'\n\nIn my approach, I simply track a raw stream using Stream *rawStream_.\nIt is set to nullptr, if no raw stream is required/requested. Otherwise,\nit tracks the raw-stream configured (whether standalone or in\ncombination with processed stream).\n\nTo check if raw is requested, I simply:\n\tif (data->rawStream_) {\n\t\t...\n\t}\n\nHence, I do not need to track any flags for these.\n\n> +\n>  private:\n>  \t/*\n>  \t * The SimpleCameraData instance is guaranteed to be valid as long as\n> @@ -867,10 +872,13 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n>  \t * point converting an erroneous buffer.\n>  \t */\n>  \tif (buffer->metadata().status != FrameMetadata::FrameSuccess) {\n> -\t\tif (!useConversion_) {\n> +\t\tif (rawRequested_) {\n>  \t\t\t/* No conversion, just complete the request. */\n>  \t\t\tRequest *request = buffer->request();\n>  \t\t\tpipe->completeBuffer(request, buffer);\n> +\t\t\tSimpleFrameInfo *info = frameInfo_.find(request->sequence());\n> +\t\t\tif (info)\n> +\t\t\t\tinfo->metadataRequired = false;\n>  \t\t\ttryCompleteRequest(request);\n>  \t\t\treturn;\n>  \t\t}\n> @@ -880,7 +888,8 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n>  \t\t * buffer for capture (unless the stream is being stopped), and\n>  \t\t * complete the request with all the user-facing buffers.\n>  \t\t */\n> -\t\tif (buffer->metadata().status != FrameMetadata::FrameCancelled)\n> +\t\tif (buffer->metadata().status != FrameMetadata::FrameCancelled &&\n> +\t\t    !rawRequested_)\n>  \t\t\tvideo_->queueBuffer(buffer);\n>  \n>  \t\tif (conversionQueue_.empty())\n> @@ -929,13 +938,14 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n>  \t */\n>  \tif (useConversion_) {\n>  \t\tif (conversionQueue_.empty()) {\n> -\t\t\tvideo_->queueBuffer(buffer);\n> +\t\t\tif (!rawRequested_)\n> +\t\t\t\tvideo_->queueBuffer(buffer);\n>  \t\t\treturn;\n>  \t\t}\n>  \n>  \t\tif (converter_)\n>  \t\t\tconverter_->queueBuffers(buffer, conversionQueue_.front().outputs);\n> -\t\telse\n> +\t\telse if (processedRequested_)\n>  \t\t\t/*\n>  \t\t\t * request->sequence() cannot be retrieved from `buffer' inside\n>  \t\t\t * queueBuffers because unique_ptr's make buffer->request() invalid\n> @@ -945,6 +955,8 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n>  \t\t\t\t\t     conversionQueue_.front().outputs);\n>  \n>  \t\tconversionQueue_.pop();\n> +\t\tif (rawRequested_)\n> +\t\t\tpipe->completeBuffer(request, buffer);\n>  \t\treturn;\n>  \t}\n>  \n> @@ -982,7 +994,8 @@ void SimpleCameraData::tryCompleteRequest(Request *request)\n>  void SimpleCameraData::conversionInputDone(FrameBuffer *buffer)\n>  {\n>  \t/* Queue the input buffer back for capture. */\n> -\tvideo_->queueBuffer(buffer);\n> +\tif (!rawRequested_)\n> +\t\tvideo_->queueBuffer(buffer);\n>  }\n>  \n>  void SimpleCameraData::conversionOutputDone(FrameBuffer *buffer)\n> @@ -1201,6 +1214,9 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n>  \t\t\tprocessedRequested = true;\n>  \t\t}\n>  \n> +\trawRequested_ = rawRequested;\n> +\tprocessedRequested_ = processedRequested;\n> +\n>  \t/*\n>  \t * Adjust the requested streams.\n>  \t *\n> @@ -1510,6 +1526,8 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)\n>  \t/* Configure the converter if needed. */\n>  \tstd::vector<std::reference_wrapper<StreamConfiguration>> outputCfgs;\n>  \tdata->useConversion_ = config->needConversion();\n> +\tdata->processedRequested_ = config->processedRequested_;\n> +\tdata->rawRequested_ = config->rawRequested_;\n>  \n>  \tfor (unsigned int i = 0; i < config->size(); ++i) {\n>  \t\tStreamConfiguration &cfg = config->at(i);\n> @@ -1548,7 +1566,7 @@ int SimplePipelineHandler::exportFrameBuffers(Camera *camera, Stream *stream,\n>  \t * Export buffers on the converter or capture video node, depending on\n>  \t * whether the converter is used or not.\n>  \t */\n> -\tif (data->useConversion_)\n> +\tif (data->useConversion_ && !isFormatRaw(stream->configuration().pixelFormat))\n>  \t\treturn data->converter_\n>  \t\t\t       ? data->converter_->exportBuffers(stream, count, buffers)\n>  \t\t\t       : data->swIsp_->exportBuffers(stream, count, buffers);\n> @@ -1571,7 +1589,7 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL\n>  \t\treturn -EBUSY;\n>  \t}\n>  \n> -\tif (data->useConversion_) {\n> +\tif (data->useConversion_ && !data->rawRequested_) {\n>  \t\t/*\n>  \t\t * When using the converter allocate a fixed number of internal\n>  \t\t * buffers.\n> @@ -1579,7 +1597,7 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL\n>  \t\tret = video->allocateBuffers(kNumInternalBuffers,\n>  \t\t\t\t\t     &data->conversionBuffers_);\n>  \t} else {\n> -\t\t/* Otherwise, prepare for using buffers from the only stream. */\n> +\t\t/* Otherwise, prepare for using buffers from the only or raw stream. */\n>  \t\tStream *stream = &data->streams_[0];\n>  \t\tret = video->importBuffers(stream->configuration().bufferCount);\n>  \t}\n> @@ -1621,8 +1639,9 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL\n>  \t\t}\n>  \n>  \t\t/* Queue all internal buffers for capture. */\n> -\t\tfor (std::unique_ptr<FrameBuffer> &buffer : data->conversionBuffers_)\n> -\t\t\tvideo->queueBuffer(buffer.get());\n> +\t\tif (!data->rawRequested_)\n> +\t\t\tfor (std::unique_ptr<FrameBuffer> &buffer : data->conversionBuffers_)\n> +\t\t\t\tvideo->queueBuffer(buffer.get());\n>  \t}\n>  \n>  \treturn 0;\n> @@ -1673,7 +1692,7 @@ int SimplePipelineHandler::queueRequestDevice(Camera *camera, Request *request)\n>  \t\t * queue, it will be handed to the converter in the capture\n>  \t\t * completion handler.\n>  \t\t */\n> -\t\tif (data->useConversion_) {\n> +\t\tif (data->useConversion_ && !isFormatRaw(stream->configuration().pixelFormat)) {\n>  \t\t\tbuffers.emplace(stream, buffer);\n>  \t\t\tmetadataRequired = !!data->swIsp_;\n>  \t\t} else {\n> -- \n> 2.50.1\n>","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 E75C0C3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 21 Jul 2025 05:33:54 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C529268FC0;\n\tMon, 21 Jul 2025 07:33:53 +0200 (CEST)","from fanzine2.igalia.com (fanzine2.igalia.com [213.97.179.56])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A3347614F6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 21 Jul 2025 07:33:52 +0200 (CEST)","from [49.36.71.87] (helo=uajain) by fanzine2.igalia.com with\n\tesmtpsa \n\t(Cipher TLS1.3:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256)\n\t(Exim) id 1udj9r-001Zm5-5b; Mon, 21 Jul 2025 07:33:51 +0200"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=igalia.com header.i=@igalia.com\n\theader.b=\"UETv4r1U\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com;\n\ts=20170329;\n\th=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:\n\tSubject:Cc:To:From:Date:Sender:Reply-To:Content-Transfer-Encoding:Content-ID:\n\tContent-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc\n\t:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe:\n\tList-Post:List-Owner:List-Archive;\n\tbh=BGIM0H+f/tvK0ThdJBextJUUEB1YdLgIN6X757+EgKQ=;\n\tb=UETv4r1UNGHJJJ3NcNQOoozxB+\n\tUZ/E4Yic+hqwvKWs6CHLzAfFI22q3GlGcQebmDXXOjIFSAUCjX3xpkXdcnpHFREs4CTJmAb4M36Yj\n\tB/qOhTQjJhd7EUZgNgP5+Fn89rKUdsSUSjqRw8UPz81UZKWFyLbgBOKmUYlxHpGrVGMiI632gXScn\n\tO35kH7TwJHm+L9PHpObhh1Rt6c1EJKuxt32Sq9digXJ2y07cPIIRqzfsPhPUyTBVLxMuoFMZDd2nF\n\t4c51dTVCKEqD56Fx864Jb2oRDl5BcPdyLVQfRlxz00/3O/2bPOcZTizbUhOEH+xx6RyJCv5Aw2lIx\n\tJAy913FA==;","Date":"Mon, 21 Jul 2025 11:03:55 +0530","From":"Umang Jain <uajain@igalia.com>","To":"Milan Zamazal <mzamazal@redhat.com>","Cc":"libcamera-devel@lists.libcamera.org, Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>, Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>, =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?=\n\t<barnabas.pocze@ideasonboard.com>, Paul Elder\n\t<paul.elder@ideasonboard.com>","Subject":"Re: [PATCH v10 8/8] libcamera: simple: Make raw streams working","Message-ID":"<dtmikle5ycpmwnrbuets46ufhgrat7v4lewxgx3ue263je3z4e@vabts4kr6om4>","References":"<20250711175345.90318-1-mzamazal@redhat.com>\n\t<20250711175345.90318-9-mzamazal@redhat.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<20250711175345.90318-9-mzamazal@redhat.com>","User-Agent":"NeoMutt/20250510-dirty","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":35015,"web_url":"https://patchwork.libcamera.org/comment/35015/","msgid":"<85wm80pjmi.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-07-22T11:09:25","subject":"Re: [PATCH v10 8/8] libcamera: simple: Make raw streams working","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Umang,\n\nUmang Jain <uajain@igalia.com> writes:\n\n> Hi Milan,\n>\n> On Fri, Jul 11, 2025 at 07:53:41PM +0200, Milan Zamazal wrote:\n>> When a raw stream is requested, whether alone or together with a\n>> processed stream, its buffers must be handled outside the software ISP\n>> machinery.  They serve as output buffers, even when a processed stream\n>> is produced.\n>> \n>> At most one raw stream and at most one processed stream are supported\n>> and can be combined.  An example of producing both raw and processed\n>> files using `cam' application:\n>> \n>>   cam -c1 -C100 -Ffile# \\\n>>     -s role=viewfinder,width=1920,height=1080,pixelformat=RGB888 \\\n>>     -s role=raw,width=3280,height=2464,pixelformat=SRGGB8 \\\n>> \n>> Note the difference in viewfinder and raw stream sizes due to the fact\n>> that debayering requires enlarging the image width, which enforces\n>> selecting a larger sensor resolution in this case.\n>> \n>> In order to distinguish between different cases, processedRequested_ and\n>> rawRequested_ flags are copied from SimpleCameraConfiguration to\n>> SimpleCameraData after successful configure(), similarly to\n>> useConversion_ flag.\n>> \n>> This is the final step to make raw streams working.\n>> \n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>  src/libcamera/pipeline/simple/simple.cpp | 41 +++++++++++++++++-------\n>>  1 file changed, 30 insertions(+), 11 deletions(-)\n>> \n>> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n>> index 01b25fb20..c3db5c068 100644\n>> --- a/src/libcamera/pipeline/simple/simple.cpp\n>> +++ b/src/libcamera/pipeline/simple/simple.cpp\n>> @@ -351,6 +351,8 @@ public:\n>>  \t};\n>>  \tstd::queue<RequestOutputs> conversionQueue_;\n>>  \tbool useConversion_;\n>> +\tbool processedRequested_;\n>> +\tbool rawRequested_;\n>>  \n>>  \tstd::unique_ptr<Converter> converter_;\n>>  \tstd::unique_ptr<SoftwareIsp> swIsp_;\n>> @@ -384,6 +386,9 @@ public:\n>>  \tbool needConversion() const { return needConversion_; }\n>>  \tconst Transform &combinedTransform() const { return combinedTransform_; }\n>>  \n>> +\tbool processedRequested_;\n>> +\tbool rawRequested_;\n>\n> So in my opinion you can simply track the RAW stream(s), if it is\n> requested, to get rid of these flags.\n>\n> ($) git grep -ni rawstream | grep -i 'pipeline/'\n>\n> In my approach, I simply track a raw stream using Stream *rawStream_.\n> It is set to nullptr, if no raw stream is required/requested. Otherwise,\n> it tracks the raw-stream configured (whether standalone or in\n> combination with processed stream).\n>\n> To check if raw is requested, I simply:\n> \tif (data->rawStream_) {\n> \t\t...\n> \t}\n>\n> Hence, I do not need to track any flags for these.\n\nThis looks like a good idea to me.  And also more correct than examining\nthe formats in some places.  I'll try to integrate it in v11.\n\n>> +\n>>  private:\n>>  \t/*\n>>  \t * The SimpleCameraData instance is guaranteed to be valid as long as\n>> @@ -867,10 +872,13 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n>>  \t * point converting an erroneous buffer.\n>>  \t */\n>>  \tif (buffer->metadata().status != FrameMetadata::FrameSuccess) {\n>> -\t\tif (!useConversion_) {\n>> +\t\tif (rawRequested_) {\n>>  \t\t\t/* No conversion, just complete the request. */\n>>  \t\t\tRequest *request = buffer->request();\n>>  \t\t\tpipe->completeBuffer(request, buffer);\n>> +\t\t\tSimpleFrameInfo *info = frameInfo_.find(request->sequence());\n>> +\t\t\tif (info)\n>> +\t\t\t\tinfo->metadataRequired = false;\n>>  \t\t\ttryCompleteRequest(request);\n>>  \t\t\treturn;\n>>  \t\t}\n>> @@ -880,7 +888,8 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n>>  \t\t * buffer for capture (unless the stream is being stopped), and\n>>  \t\t * complete the request with all the user-facing buffers.\n>>  \t\t */\n>> -\t\tif (buffer->metadata().status != FrameMetadata::FrameCancelled)\n>> +\t\tif (buffer->metadata().status != FrameMetadata::FrameCancelled &&\n>> +\t\t    !rawRequested_)\n>>  \t\t\tvideo_->queueBuffer(buffer);\n>>  \n>>  \t\tif (conversionQueue_.empty())\n>> @@ -929,13 +938,14 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n>>  \t */\n>>  \tif (useConversion_) {\n>>  \t\tif (conversionQueue_.empty()) {\n>> -\t\t\tvideo_->queueBuffer(buffer);\n>> +\t\t\tif (!rawRequested_)\n>> +\t\t\t\tvideo_->queueBuffer(buffer);\n>>  \t\t\treturn;\n>>  \t\t}\n>>  \n>>  \t\tif (converter_)\n>>  \t\t\tconverter_->queueBuffers(buffer, conversionQueue_.front().outputs);\n>> -\t\telse\n>> +\t\telse if (processedRequested_)\n>>  \t\t\t/*\n>>  \t\t\t * request->sequence() cannot be retrieved from `buffer' inside\n>>  \t\t\t * queueBuffers because unique_ptr's make buffer->request() invalid\n>> @@ -945,6 +955,8 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)\n>>  \t\t\t\t\t     conversionQueue_.front().outputs);\n>>  \n>>  \t\tconversionQueue_.pop();\n>> +\t\tif (rawRequested_)\n>> +\t\t\tpipe->completeBuffer(request, buffer);\n>>  \t\treturn;\n>>  \t}\n>>  \n>> @@ -982,7 +994,8 @@ void SimpleCameraData::tryCompleteRequest(Request *request)\n>>  void SimpleCameraData::conversionInputDone(FrameBuffer *buffer)\n>>  {\n>>  \t/* Queue the input buffer back for capture. */\n>> -\tvideo_->queueBuffer(buffer);\n>> +\tif (!rawRequested_)\n>> +\t\tvideo_->queueBuffer(buffer);\n>>  }\n>>  \n>>  void SimpleCameraData::conversionOutputDone(FrameBuffer *buffer)\n>> @@ -1201,6 +1214,9 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n>>  \t\t\tprocessedRequested = true;\n>>  \t\t}\n>>  \n>> +\trawRequested_ = rawRequested;\n>> +\tprocessedRequested_ = processedRequested;\n>> +\n>>  \t/*\n>>  \t * Adjust the requested streams.\n>>  \t *\n>> @@ -1510,6 +1526,8 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)\n>>  \t/* Configure the converter if needed. */\n>>  \tstd::vector<std::reference_wrapper<StreamConfiguration>> outputCfgs;\n>>  \tdata->useConversion_ = config->needConversion();\n>> +\tdata->processedRequested_ = config->processedRequested_;\n>> +\tdata->rawRequested_ = config->rawRequested_;\n>>  \n>>  \tfor (unsigned int i = 0; i < config->size(); ++i) {\n>>  \t\tStreamConfiguration &cfg = config->at(i);\n>> @@ -1548,7 +1566,7 @@ int SimplePipelineHandler::exportFrameBuffers(Camera *camera, Stream *stream,\n>>  \t * Export buffers on the converter or capture video node, depending on\n>>  \t * whether the converter is used or not.\n>>  \t */\n>> -\tif (data->useConversion_)\n>> +\tif (data->useConversion_ && !isFormatRaw(stream->configuration().pixelFormat))\n>>  \t\treturn data->converter_\n>>  \t\t\t       ? data->converter_->exportBuffers(stream, count, buffers)\n>>  \t\t\t       : data->swIsp_->exportBuffers(stream, count, buffers);\n>> @@ -1571,7 +1589,7 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL\n>>  \t\treturn -EBUSY;\n>>  \t}\n>>  \n>> -\tif (data->useConversion_) {\n>> +\tif (data->useConversion_ && !data->rawRequested_) {\n>>  \t\t/*\n>>  \t\t * When using the converter allocate a fixed number of internal\n>>  \t\t * buffers.\n>> @@ -1579,7 +1597,7 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL\n>>  \t\tret = video->allocateBuffers(kNumInternalBuffers,\n>>  \t\t\t\t\t     &data->conversionBuffers_);\n>>  \t} else {\n>> -\t\t/* Otherwise, prepare for using buffers from the only stream. */\n>> +\t\t/* Otherwise, prepare for using buffers from the only or raw stream. */\n>>  \t\tStream *stream = &data->streams_[0];\n>>  \t\tret = video->importBuffers(stream->configuration().bufferCount);\n>>  \t}\n>> @@ -1621,8 +1639,9 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL\n>>  \t\t}\n>>  \n>>  \t\t/* Queue all internal buffers for capture. */\n>> -\t\tfor (std::unique_ptr<FrameBuffer> &buffer : data->conversionBuffers_)\n>> -\t\t\tvideo->queueBuffer(buffer.get());\n>> +\t\tif (!data->rawRequested_)\n>> +\t\t\tfor (std::unique_ptr<FrameBuffer> &buffer : data->conversionBuffers_)\n>> +\t\t\t\tvideo->queueBuffer(buffer.get());\n>>  \t}\n>>  \n>>  \treturn 0;\n>> @@ -1673,7 +1692,7 @@ int SimplePipelineHandler::queueRequestDevice(Camera *camera, Request *request)\n>>  \t\t * queue, it will be handed to the converter in the capture\n>>  \t\t * completion handler.\n>>  \t\t */\n>> -\t\tif (data->useConversion_) {\n>> +\t\tif (data->useConversion_ && !isFormatRaw(stream->configuration().pixelFormat)) {\n>>  \t\t\tbuffers.emplace(stream, buffer);\n>>  \t\t\tmetadataRequired = !!data->swIsp_;\n>>  \t\t} else {\n>> -- \n>> 2.50.1\n>>","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 CACE7BDCC1\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 22 Jul 2025 11:09:33 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id F087E68F93;\n\tTue, 22 Jul 2025 13:09:32 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 44DD268F93\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 22 Jul 2025 13:09:31 +0200 (CEST)","from mail-wm1-f70.google.com (mail-wm1-f70.google.com\n\t[209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-449-217xqOzoM5SU4i6dkiqxYQ-1; Tue, 22 Jul 2025 07:09:28 -0400","by mail-wm1-f70.google.com with SMTP id\n\t5b1f17b1804b1-4562985ac6aso55001265e9.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 22 Jul 2025 04:09:28 -0700 (PDT)","from mzamazal-thinkpadp1gen7.tpbc.csb ([85.93.96.130])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-4562e57200csm187884935e9.0.2025.07.22.04.09.26\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 22 Jul 2025 04:09:26 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"evLrGbsN\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1753182570;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=islj5POuS1lFZfA5iDknZ+I8nEQu1MRY7bCFjp80d7Q=;\n\tb=evLrGbsNnf7cSCuch3szC2tYVFleRCYaPcFj1tlzjKEUE/k0aiYKXkX8rjdl1wMeQxCI+K\n\twlV/PtoR7++oVL83khAbEZ4sG+RAD899J/ln9PcbPtS/3xRaBj9pzzdj2bcwb53kWFSWf9\n\tkSESJZUXlnoBdp2EKS+itzQ/WXuTI1k=","X-MC-Unique":"217xqOzoM5SU4i6dkiqxYQ-1","X-Mimecast-MFC-AGG-ID":"217xqOzoM5SU4i6dkiqxYQ_1753182568","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1753182567; x=1753787367;\n\th=mime-version:user-agent:message-id:date:references:in-reply-to\n\t:subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=islj5POuS1lFZfA5iDknZ+I8nEQu1MRY7bCFjp80d7Q=;\n\tb=N6JiATSxoK3DXuT36tnOnSAtEi8cM24WUKKAIDqrBHwsoYq7uGpWW03FWYpJy1IezU\n\tR80wE41ROZ/L3g1NkxguWgdZG7NTIgxT9aowRKCeRQU2fIfiOI2y5ZLqu4ry1V7ALldy\n\tSyRkshOEFatBJosj7ex0Tq5e2qa9hE3u0kz8v5Sdj5XequpFHeqUlZ57Qx4wii9l0WJ5\n\tiLkLBqlhnuB/B2EkmvJb2dSKcEz01fu3mj62PhW+OTThyME7tUZfrIFyEgYFiPDcWk+K\n\tKCApd0qMlV+FRDmyJW5P73IlZuG0F1fRJIdH4Wc+cTWoKoNlaScEbG9Xm9fued6/ece6\n\twSVQ==","X-Gm-Message-State":"AOJu0YyE9Q7aKyniz6KE/ET0WThK1TIkHJTJUEBr+rs5hUtcKuU+pHwd\n\tb7zbDtN+Mb6LMxrxQIVxHPNZW8I89t+aa6m0N5gQ9F8oCJ9EieIi4cFXoc53BUTZ3wq2c47brJa\n\tZRGbxvZSEdCcODmxNCExLE41MpF6y+qbXnSL80hfZ129vdMPGrUbTf4P385cNlCOTgBdXDYyA/J\n\tY=","X-Gm-Gg":"ASbGncvBUVWXn1od0yK6+6qeIsKFpu0HMp28Fj1hYefvfNTZcN6f5nVRJ5+yYFHRo6a\n\teU2DUvEYsZ5eVF7Smw1OoWR9N8U9pKPo44Zlp1PP4jxdKTu/udiYWQ3mheawzX+H9O/OHpBIwdP\n\tPoBqNWTBdAbenlPbmlm2kGDr6J+CqfQLzPBZQMTj8d/GiEQCG/DEiuFwQ/7azpsSP/qGi9Fs2PX\n\tEWmG6n7XtnsscZSu5c2kbR/pFfk9jPv36aMJz9AHVVutDXOJT6YsdDuKbR33VPXRUtzAbt0AdhE\n\tcxGur2cEtrEojA8YuSX/RsRpMgAzAQWs8rNvjotsW20YsERJTiuW5b44Li6kj4qh","X-Received":["by 2002:a05:600d:10f:b0:456:1611:ce85 with SMTP id\n\t5b1f17b1804b1-4562e4f7a45mr113924675e9.21.1753182567402; \n\tTue, 22 Jul 2025 04:09:27 -0700 (PDT)","by 2002:a05:600d:10f:b0:456:1611:ce85 with SMTP id\n\t5b1f17b1804b1-4562e4f7a45mr113924525e9.21.1753182566880; \n\tTue, 22 Jul 2025 04:09:26 -0700 (PDT)"],"X-Google-Smtp-Source":"AGHT+IGRDpFDYne1lazxndTsA8lRgEnT3QmozkTJ4+wu/29RY2u1Xku/fOkJGjivmfyjzHvEUx+3SA==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Umang Jain <uajain@igalia.com>","Cc":"libcamera-devel@lists.libcamera.org,  Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>, =?utf-8?q?Barnab?=\n\t=?utf-8?b?w6FzIFDFkWN6ZQ==?=\n\t<barnabas.pocze@ideasonboard.com>, Paul Elder\n\t<paul.elder@ideasonboard.com>","Subject":"Re: [PATCH v10 8/8] libcamera: simple: Make raw streams working","In-Reply-To":"<dtmikle5ycpmwnrbuets46ufhgrat7v4lewxgx3ue263je3z4e@vabts4kr6om4>\n\t(Umang Jain's message of \"Mon, 21 Jul 2025 11:03:55 +0530\")","References":"<20250711175345.90318-1-mzamazal@redhat.com>\n\t<20250711175345.90318-9-mzamazal@redhat.com>\n\t<dtmikle5ycpmwnrbuets46ufhgrat7v4lewxgx3ue263je3z4e@vabts4kr6om4>","Date":"Tue, 22 Jul 2025 13:09:25 +0200","Message-ID":"<85wm80pjmi.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"hgG-jseUNk0F6DHfz_h_sr7_ZT1KzExCX7gLaeEq0h0_1753182568","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]