From patchwork Tue Oct 22 16:01:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 2208 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 4E5EF6137A for ; Tue, 22 Oct 2019 18:01:14 +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 D006D595; Tue, 22 Oct 2019 18:01:13 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1571760074; bh=iGjHsSQILInB1Lr4jbGr7cHTBftSYWBb7q1by3kEtuY=; h=From:To:Cc:Subject:Date:From; b=W/aU2yW/U9Vs5r9t9RZerrDmwmqBWnLhvoc2E6UFZ9Ntv4DPRPVQJnhAo6ZIDrAxE s9o7jgZThsOs0VkjAWwzRzbhHhGaK56UoozXNmZvarz+C/LdFPlzukjqXDd68vTpwW JUNefljnN0In389azGT0FMNaUI71aGp0SOiH6OQc= From: Kieran Bingham To: LibCamera Devel Date: Tue, 22 Oct 2019 17:01:10 +0100 Message-Id: <20191022160110.19419-1-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH] libcamera: v4l2_videodevice: Track streaming state 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: , X-List-Received-Date: Tue, 22 Oct 2019 16:01:14 -0000 Track the state of streamon/streamoff calls to simplify error paths. Ensuring that streamOff() can be called on non-streaming streams facilitates simpler error code paths, where a set of devices can all call streamOff regardless of their initialisation state. Signed-off-by: Kieran Bingham Acked-by: Laurent Pinchart --- This is a patch I have while developing the RPi ISP handler. It means I can do the following for error paths: data->isp_.stats_->streamOff(); data->isp_.capture1_->streamOff(); data->isp_.capture0_->streamOff(); data->isp_.output_->streamOff(); data->unicam_->streamOff(); which essentially means I can just call stop(camera) for cleanup, without having to track which ones were successfully started or not. So - Reasonable or not ? Patch will not apply directly to master, as it's currently based on my dev branch, hence RFC src/libcamera/include/v4l2_videodevice.h | 2 ++ src/libcamera/v4l2_videodevice.cpp | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/libcamera/include/v4l2_videodevice.h b/src/libcamera/include/v4l2_videodevice.h index 60fca01670c6..d6e0c0e7bf02 100644 --- a/src/libcamera/include/v4l2_videodevice.h +++ b/src/libcamera/include/v4l2_videodevice.h @@ -188,6 +188,8 @@ private: std::map queuedBuffers_; EventNotifier *fdEvent_; + + bool streaming_; }; class V4L2M2MDevice diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp index 71c32766fc2d..01e11597cfb0 100644 --- a/src/libcamera/v4l2_videodevice.cpp +++ b/src/libcamera/v4l2_videodevice.cpp @@ -273,7 +273,7 @@ const std::string V4L2DeviceFormat::toString() const */ V4L2VideoDevice::V4L2VideoDevice(const std::string &deviceNode) : V4L2Device(deviceNode), multiPlanar_(false), bufferPool_(nullptr), - fdEvent_(nullptr) + fdEvent_(nullptr), streaming_(false) { /* * We default to an MMAP based CAPTURE video device, however this will @@ -1197,6 +1197,8 @@ int V4L2VideoDevice::streamOn() return ret; } + streaming_ = true; + return 0; } @@ -1214,6 +1216,9 @@ int V4L2VideoDevice::streamOff() { int ret; + if (!streaming_) + return 0; + ret = ioctl(VIDIOC_STREAMOFF, &bufferType_); if (ret < 0) { LOG(V4L2, Error) @@ -1234,6 +1239,8 @@ int V4L2VideoDevice::streamOff() queuedBuffers_.clear(); fdEvent_->setEnabled(false); + streaming_ = false; + return 0; }