summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaushir Patuck <naush@raspberrypi.com>2022-05-05 09:48:24 +0100
committerKieran Bingham <kieran.bingham@ideasonboard.com>2022-05-10 16:49:53 +0100
commitc39b52c1840545bf89ff048764a4b550db465624 (patch)
treeb70ffc8c3dd4be5ff0f68cbc72879e4244c7a2b0
parent065a9e6c050c7b4e922e4ac17a6d36097520e5e8 (diff)
v4l2_videodevice: Disable the watchdog timer when no buffers are queued
Only enable/reset the watchdog timer when there are buffers queued in the V4L2 device. Otherwise, we may trigger spurious warnings when the watchdog times out even if there are no buffers queued in the device. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Tested-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
-rw-r--r--src/libcamera/v4l2_videodevice.cpp22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
index 5b4637b1..430715af 100644
--- a/src/libcamera/v4l2_videodevice.cpp
+++ b/src/libcamera/v4l2_videodevice.cpp
@@ -1662,8 +1662,11 @@ int V4L2VideoDevice::queueBuffer(FrameBuffer *buffer)
return ret;
}
- if (queuedBuffers_.empty())
+ if (queuedBuffers_.empty()) {
fdBufferNotifier_->setEnabled(true);
+ if (watchdogDuration_)
+ watchdog_.start(std::chrono::duration_cast<std::chrono::milliseconds>(watchdogDuration_));
+ }
queuedBuffers_[buf.index] = buffer;
@@ -1742,16 +1745,21 @@ FrameBuffer *V4L2VideoDevice::dequeueBuffer()
return nullptr;
}
- if (watchdogDuration_.count())
- watchdog_.start(std::chrono::duration_cast<std::chrono::milliseconds>(watchdogDuration_));
-
cache_->put(buf.index);
FrameBuffer *buffer = it->second;
queuedBuffers_.erase(it);
- if (queuedBuffers_.empty())
+ if (queuedBuffers_.empty()) {
fdBufferNotifier_->setEnabled(false);
+ watchdog_.stop();
+ } else if (watchdogDuration_) {
+ /*
+ * Restart the watchdog timer if there are buffers still queued
+ * in the device.
+ */
+ watchdog_.start(std::chrono::duration_cast<std::chrono::milliseconds>(watchdogDuration_));
+ }
buffer->metadata_.status = buf.flags & V4L2_BUF_FLAG_ERROR
? FrameMetadata::FrameError
@@ -1847,7 +1855,7 @@ int V4L2VideoDevice::streamOn()
}
state_ = State::Streaming;
- if (watchdogDuration_.count())
+ if (watchdogDuration_ && !queuedBuffers_.empty())
watchdog_.start(std::chrono::duration_cast<std::chrono::milliseconds>(watchdogDuration_));
return 0;
@@ -1924,7 +1932,7 @@ void V4L2VideoDevice::setDequeueTimeout(utils::Duration timeout)
watchdogDuration_ = timeout;
watchdog_.stop();
- if (watchdogDuration_.count() && state_ == State::Streaming)
+ if (watchdogDuration_ && state_ == State::Streaming && !queuedBuffers_.empty())
watchdog_.start(std::chrono::duration_cast<std::chrono::milliseconds>(timeout));
}