From patchwork Mon Jul 13 13:24:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 8767 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 CDA45BD792 for ; Mon, 13 Jul 2020 13:25:02 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 8EB4260741; Mon, 13 Jul 2020 15:25:02 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="EHSK2urg"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9BD1360732 for ; Mon, 13 Jul 2020 15:24:58 +0200 (CEST) Received: from Q.local (cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 2DF009B1; Mon, 13 Jul 2020 15:24:58 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1594646698; bh=UJfH+6DXeF4Uxt8E+xopnFtk0DR0O1a8L+cOjHbVqPk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EHSK2urgu2QKvqi9fDlglw4Zjgsw4V0SvhTFRzkxApD+ozU+UHwoXAfeXo8n2KI1X +kmFJuce91YswkvKdHeuxGvXIaRIWpMMChVGvqbfS/uidbHWD/v0AclA5U1BOW8q+Z 4Pm8DHz/QjOkPFxBjRH3MDSo+fcBfNl5i7a9FJLw= From: Kieran Bingham To: libcamera devel Date: Mon, 13 Jul 2020 14:24:48 +0100 Message-Id: <20200713132451.2944673-7-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200713132451.2944673-1-kieran.bingham@ideasonboard.com> References: <20200713132451.2944673-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 6/9] libcamera: pipeline: vivid: Buffer handling and stream control 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: , Cc: Chris Ward Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" We can now add buffer management, and connect up our bufferReady signal to a callback. Note that we provide the ability to export buffers from our capture device (data->video_) using the exportBuffers() functionality from the V4L2VideoDevice which allows a FrameBufferAllocater to obtain buffers from this device. When buffers are obtained through the exportFrameBuffers API, they are orphaned and left unassociated with the device, and must be reimported at start() time anyway. This allows the same interface to be used whether internal buffers, or external buffers are used for the stream. When a buffer completes, we call the buffer completion handler on the pipeline handler, and because we have only a single stream, we can also immediately complete the request. Signed-off-by: Kieran Bingham --- src/libcamera/pipeline/vivid/vivid.cpp | 35 ++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/libcamera/pipeline/vivid/vivid.cpp b/src/libcamera/pipeline/vivid/vivid.cpp index dbc19424e75a..1a945a744055 100644 --- a/src/libcamera/pipeline/vivid/vivid.cpp +++ b/src/libcamera/pipeline/vivid/vivid.cpp @@ -32,6 +32,7 @@ public: } int init(); + void bufferReady(FrameBuffer *buffer); MediaDevice *media_; V4L2VideoDevice *video_; @@ -175,16 +176,36 @@ int PipelineHandlerVivid::configure(Camera *camera, CameraConfiguration *config) int PipelineHandlerVivid::exportFrameBuffers(Camera *camera, Stream *stream, std::vector> *buffers) { - return -1; + VividCameraData *data = cameraData(camera); + unsigned int count = stream->configuration().bufferCount; + + return data->video_->exportBuffers(count, buffers); } int PipelineHandlerVivid::start(Camera *camera) { - return -1; + VividCameraData *data = cameraData(camera); + unsigned int count = data->stream_.configuration().bufferCount; + + int ret = data->video_->importBuffers(count); + if (ret < 0) + return ret; + + ret = data->video_->streamOn(); + if (ret < 0) { + data->ipa_->stop(); + data->video_->releaseBuffers(); + return ret; + } + + return 0; } void PipelineHandlerVivid::stop(Camera *camera) { + VividCameraData *data = cameraData(camera); + data->video_->streamOff(); + data->video_->releaseBuffers(); } int PipelineHandlerVivid::queueRequestDevice(Camera *camera, Request *request) @@ -221,9 +242,19 @@ int VividCameraData::init() if (video_->open()) return -ENODEV; + video_->bufferReady.connect(this, &VividCameraData::bufferReady); + return 0; } +void VividCameraData::bufferReady(FrameBuffer *buffer) +{ + Request *request = buffer->request(); + + pipe_->completeBuffer(camera_, request, buffer); + pipe_->completeRequest(camera_, request); +} + REGISTER_PIPELINE_HANDLER(PipelineHandlerVivid); } /* namespace libcamera */