From c39b52c1840545bf89ff048764a4b550db465624 Mon Sep 17 00:00:00 2001 From: Naushir Patuck Date: Thu, 5 May 2022 09:48:24 +0100 Subject: 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 Tested-by: David Plowman Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart Signed-off-by: Kieran Bingham --- src/libcamera/v4l2_videodevice.cpp | 22 +++++++++++++++------- 1 file 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(watchdogDuration_)); + } queuedBuffers_[buf.index] = buffer; @@ -1742,16 +1745,21 @@ FrameBuffer *V4L2VideoDevice::dequeueBuffer() return nullptr; } - if (watchdogDuration_.count()) - watchdog_.start(std::chrono::duration_cast(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(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(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(timeout)); } -- cgit v1.2.1