From patchwork Thu Feb 28 20:04:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 683 Return-Path: Received: from relay4-d.mail.gandi.net (relay4-d.mail.gandi.net [217.70.183.196]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id AFE91610BB for ; Thu, 28 Feb 2019 21:03:49 +0100 (CET) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id 43B74E0005; Thu, 28 Feb 2019 20:03:49 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Thu, 28 Feb 2019 21:04:05 +0100 Message-Id: <20190228200410.3022-6-jacopo@jmondi.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190228200410.3022-1-jacopo@jmondi.org> References: <20190228200410.3022-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 05/10] libcamera: ipu3: Implement buffer allocation X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Feb 2019 20:03:49 -0000 Implement buffer allocation in IPU3 pipeline handlers. As the pipeline handler supports a single stream, preprare two buffer pools for 'viewfinder' and 'stat' video devices, and export the 'output' video device buffers to the Stream's pool. Share buffers between the CIO2 output and the ImgU input video devices, as the output of the former should immediately be provided to the latter for further processing. Signed-off-by: Jacopo Mondi --- src/libcamera/pipeline/ipu3/ipu3.cpp | 47 ++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 1e89e57f628b..c7b7973952a0 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -47,6 +47,9 @@ struct ImguDevice { V4L2Device *viewfinder; V4L2Device *stat; /* TODO: add param video device for 3A tuning */ + + BufferPool vfPool; + BufferPool statPool; }; struct Cio2Device { @@ -63,6 +66,8 @@ struct Cio2Device { V4L2Device *output; V4L2Subdevice *csi2; V4L2Subdevice *sensor; + + BufferPool pool; }; class IPU3CameraData : public CameraData @@ -319,18 +324,48 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera, Stream *stream) { const StreamConfiguration &cfg = stream->configuration(); IPU3CameraData *data = cameraData(camera); + V4L2Device *viewfinder = data->imgu->viewfinder; + V4L2Device *output = data->imgu->output; + V4L2Device *input = data->imgu->input; V4L2Device *cio2 = data->cio2.output; + V4L2Device *stat = data->imgu->stat; + int ret; - if (!cfg.bufferCount) + if (!cfg.bufferCount) { + LOG(IPU3, Error) + << "Invalid number of buffers: "<< cfg.bufferCount; return -EINVAL; - - int ret = cio2->exportBuffers(&stream->bufferPool()); - if (ret) { - LOG(IPU3, Error) << "Failed to request memory"; - return ret; } + /* Share buffers between CIO2 output and ImgU input. */ + data->cio2.pool.createBuffers(IPU3_BUF_NUM); + ret = cio2->exportBuffers(&data->cio2.pool); + if (ret) + goto error_reserve_memory; + input->importBuffers(&data->cio2.pool); + + /* Prepare the buffer pools for viewfinder and stat. */ + data->imgu->vfPool.createBuffers(IPU3_BUF_NUM); + ret = viewfinder->exportBuffers(&data->imgu->vfPool); + if (ret) + goto error_reserve_memory; + + data->imgu->statPool.createBuffers(IPU3_BUF_NUM); + ret = stat->exportBuffers(&data->imgu->statPool); + if (ret) + goto error_reserve_memory; + + /* Export ImgU output buffers to the stream's pool. */ + ret = output->exportBuffers(&stream->bufferPool()); + if (ret) + goto error_reserve_memory; + return 0; + +error_reserve_memory: + LOG(IPU3, Error) << "Failed to reserve memory"; + + return ret; } int PipelineHandlerIPU3::freeBuffers(Camera *camera, Stream *stream)