From patchwork Sat Jun 27 03:00:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 8454 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 87EBAC2E67 for ; Sat, 27 Jun 2020 03:01:03 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 35B9A60B08; Sat, 27 Jun 2020 05:01:03 +0200 (CEST) Received: from bin-mail-out-05.binero.net (bin-mail-out-05.binero.net [195.74.38.228]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 85F5C60B08 for ; Sat, 27 Jun 2020 05:00:58 +0200 (CEST) X-Halon-ID: 58ed2642-b822-11ea-86ee-0050569116f7 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (p4fca2eca.dip0.t-ipconnect.de [79.202.46.202]) by bin-vsp-out-03.atm.binero.net (Halon) with ESMTPA id 58ed2642-b822-11ea-86ee-0050569116f7; Sat, 27 Jun 2020 05:00:25 +0200 (CEST) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Sat, 27 Jun 2020 05:00:42 +0200 Message-Id: <20200627030043.2088585-13-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200627030043.2088585-1-niklas.soderlund@ragnatech.se> References: <20200627030043.2088585-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 12/13] libcamera: ipu3: Align how CIO2 and ImgU are stored in CameraData X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" One is a pointer and the other is not. It is unintuitive to interact with and with our current design of one ImgU for each camera there is no advantage of having it as a pointer. Our current design is unlikely to change as the system really only has one ImgU. Align the two to make the pipeline more consistent. Signed-off-by: Niklas Söderlund --- src/libcamera/pipeline/ipu3/ipu3.cpp | 48 ++++++++++++---------------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 0ebd762982142471..6ae4728b470f9487 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -43,7 +43,7 @@ public: void cio2BufferReady(FrameBuffer *buffer); CIO2Device cio2_; - ImgUDevice *imgu_; + ImgUDevice imgu_; Stream outStream_; Stream vfStream_; @@ -117,8 +117,6 @@ private: int allocateBuffers(Camera *camera); int freeBuffers(Camera *camera); - ImgUDevice imgu0_; - ImgUDevice imgu1_; MediaDevice *cio2MediaDev_; MediaDevice *imguMediaDev_; }; @@ -414,7 +412,7 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c) Stream *outStream = &data->outStream_; Stream *vfStream = &data->vfStream_; CIO2Device *cio2 = &data->cio2_; - ImgUDevice *imgu = data->imgu_; + ImgUDevice *imgu = &data->imgu_; V4L2DeviceFormat outputFormat; int ret; @@ -456,7 +454,7 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c) * stream which is for raw capture, in which case no buffers will * ever be queued to the ImgU. */ - ret = data->imgu_->enableLinks(true); + ret = data->imgu_.enableLinks(true); if (ret) return ret; @@ -563,9 +561,9 @@ int PipelineHandlerIPU3::exportFrameBuffers(Camera *camera, Stream *stream, unsigned int count = stream->configuration().bufferCount; if (stream == &data->outStream_) - return data->imgu_->output_.dev->exportBuffers(count, buffers); + return data->imgu_.output_.dev->exportBuffers(count, buffers); else if (stream == &data->vfStream_) - return data->imgu_->viewfinder_.dev->exportBuffers(count, buffers); + return data->imgu_.viewfinder_.dev->exportBuffers(count, buffers); else if (stream == &data->rawStream_) return data->cio2_.exportBuffers(count, buffers); @@ -583,7 +581,7 @@ int PipelineHandlerIPU3::exportFrameBuffers(Camera *camera, Stream *stream, int PipelineHandlerIPU3::allocateBuffers(Camera *camera) { IPU3CameraData *data = cameraData(camera); - ImgUDevice *imgu = data->imgu_; + ImgUDevice *imgu = &data->imgu_; unsigned int bufferCount; int ret; @@ -604,7 +602,7 @@ int PipelineHandlerIPU3::freeBuffers(Camera *camera) { IPU3CameraData *data = cameraData(camera); - data->imgu_->freeBuffers(); + data->imgu_.freeBuffers(); return 0; } @@ -613,7 +611,7 @@ int PipelineHandlerIPU3::start(Camera *camera) { IPU3CameraData *data = cameraData(camera); CIO2Device *cio2 = &data->cio2_; - ImgUDevice *imgu = data->imgu_; + ImgUDevice *imgu = &data->imgu_; int ret; /* Allocate buffers for internal pipeline usage. */ @@ -650,7 +648,7 @@ void PipelineHandlerIPU3::stop(Camera *camera) IPU3CameraData *data = cameraData(camera); int ret = 0; - ret |= data->imgu_->stop(); + ret |= data->imgu_.stop(); ret |= data->cio2_.stop(); if (ret) LOG(IPU3, Warning) << "Failed to stop camera " @@ -680,9 +678,9 @@ int PipelineHandlerIPU3::queueRequestDevice(Camera *camera, Request *request) int ret; if (stream == &data->outStream_) - ret = data->imgu_->output_.dev->queueBuffer(buffer); + ret = data->imgu_.output_.dev->queueBuffer(buffer); else if (stream == &data->vfStream_) - ret = data->imgu_->viewfinder_.dev->queueBuffer(buffer); + ret = data->imgu_.viewfinder_.dev->queueBuffer(buffer); else continue; @@ -757,16 +755,6 @@ bool PipelineHandlerIPU3::match(DeviceEnumerator *enumerator) */ int PipelineHandlerIPU3::registerCameras() { - int ret; - - ret = imgu0_.init(imguMediaDev_, 0); - if (ret) - return ret; - - ret = imgu1_.init(imguMediaDev_, 1); - if (ret) - return ret; - /* * For each CSI-2 receiver on the IPU3, create a Camera if an * image sensor is connected to it and the sensor can produce images @@ -774,6 +762,8 @@ int PipelineHandlerIPU3::registerCameras() */ unsigned int numCameras = 0; for (unsigned int id = 0; id < 4 && numCameras < 2; ++id) { + int ret; + std::unique_ptr data = std::make_unique(this); std::set streams = { @@ -796,7 +786,9 @@ int PipelineHandlerIPU3::registerCameras() * only, and assign imgu0 to the first one and imgu1 to the * second. */ - data->imgu_ = numCameras ? &imgu1_ : &imgu0_; + ret = data->imgu_.init(imguMediaDev_, numCameras); + if (ret) + return ret; /* * Connect video devices' 'bufferReady' signals to their @@ -808,11 +800,11 @@ int PipelineHandlerIPU3::registerCameras() */ data->cio2_.bufferReady.connect(data.get(), &IPU3CameraData::cio2BufferReady); - data->imgu_->input_->bufferReady.connect(&data->cio2_, + data->imgu_.input_->bufferReady.connect(&data->cio2_, &CIO2Device::tryReturnBuffer); - data->imgu_->output_.dev->bufferReady.connect(data.get(), + data->imgu_.output_.dev->bufferReady.connect(data.get(), &IPU3CameraData::imguOutputBufferReady); - data->imgu_->viewfinder_.dev->bufferReady.connect(data.get(), + data->imgu_.viewfinder_.dev->bufferReady.connect(data.get(), &IPU3CameraData::imguOutputBufferReady); /* Create and register the Camera instance. */ @@ -881,7 +873,7 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer) return; } - imgu_->input_->queueBuffer(buffer); + imgu_.input_->queueBuffer(buffer); } REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3);