[{"id":22434,"web_url":"https://patchwork.libcamera.org/comment/22434/","msgid":"<164812642022.1484799.17802060137562075739@Monstersaurus>","date":"2022-03-24T12:53:40","subject":"Re: [libcamera-devel] [PATCH v2 1/2] libcamera: v4l2_videodevice:\n\tAdd a dequeue timer","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Naush,\n\nThanks - this looks pretty good to me.\nBut Doxygen is generating warnings on this:\n\n[7/7] Generating doxygen with a custom command\n/home/kbingham/iob/libcamera/libcamera/include/libcamera/internal/v4l2_videodevice.h:222: warning: Member dequeueTimeout (variable) of class libcamera::V4L2VideoDevice is not documented.\n/home/kbingham/iob/libcamera/libcamera/src/libcamera/v4l2_videodevice.cpp:1864: warning: unable to resolve reference to 'V4L2VideoDevice::dequeueTimeout' for \\ref command\n\nAlso it's missing a unit test. Fortunately I was curious enough to see\nhow it works, so I've just written the test, and I'll post it in reply\nto this.\n\n--\nKieran\n\n\nQuoting Naushir Patuck via libcamera-devel (2022-03-24 09:34:08)\n> Add a timer that gets reset on every buffer dequeue event. If the timeout\n> expires, optionally call a slot in the pipeline handler to handle this\n> condition. This may be useful in detecting and handling stalls in either the\n> hardware or device driver.\n> \n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> ---\n>  include/libcamera/internal/v4l2_videodevice.h | 10 ++++\n>  src/libcamera/v4l2_videodevice.cpp            | 49 +++++++++++++++++++\n>  2 files changed, 59 insertions(+)\n> \n> diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h\n> index 2d2ccc477c91..c34cc6585612 100644\n> --- a/include/libcamera/internal/v4l2_videodevice.h\n> +++ b/include/libcamera/internal/v4l2_videodevice.h\n> @@ -9,6 +9,7 @@\n>  \n>  #include <array>\n>  #include <atomic>\n> +#include <chrono>\n>  #include <memory>\n>  #include <optional>\n>  #include <stdint.h>\n> @@ -20,6 +21,7 @@\n>  #include <libcamera/base/class.h>\n>  #include <libcamera/base/log.h>\n>  #include <libcamera/base/signal.h>\n> +#include <libcamera/base/timer.h>\n>  #include <libcamera/base/unique_fd.h>\n>  \n>  #include <libcamera/color_space.h>\n> @@ -216,6 +218,9 @@ public:\n>         int streamOn();\n>         int streamOff();\n>  \n> +       void setDequeueTimeout(std::chrono::milliseconds msec);\n> +       Signal<> dequeueTimeout;\n> +\n>         static std::unique_ptr<V4L2VideoDevice>\n>         fromEntityName(const MediaDevice *media, const std::string &entity);\n>  \n> @@ -246,6 +251,8 @@ private:\n>         void bufferAvailable();\n>         FrameBuffer *dequeueBuffer();\n>  \n> +       void watchdogExpired();\n> +\n>         V4L2Capability caps_;\n>         V4L2DeviceFormat format_;\n>         const PixelFormatInfo *formatInfo_;\n> @@ -259,6 +266,9 @@ private:\n>         EventNotifier *fdBufferNotifier_;\n>  \n>         bool streaming_;\n> +\n> +       Timer watchdog_;\n> +       std::chrono::milliseconds watchdogDuration_;\n>  };\n>  \n>  class V4L2M2MDevice\n> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp\n> index 5f36ee20710d..29225f3058b0 100644\n> --- a/src/libcamera/v4l2_videodevice.cpp\n> +++ b/src/libcamera/v4l2_videodevice.cpp\n> @@ -526,6 +526,7 @@ V4L2VideoDevice::V4L2VideoDevice(const std::string &deviceNode)\n>  V4L2VideoDevice::V4L2VideoDevice(const MediaEntity *entity)\n>         : V4L2VideoDevice(entity->deviceNode())\n>  {\n> +       watchdog_.timeout.connect(this, &V4L2VideoDevice::watchdogExpired);\n>  }\n>  \n>  V4L2VideoDevice::~V4L2VideoDevice()\n> @@ -1695,6 +1696,9 @@ FrameBuffer *V4L2VideoDevice::dequeueBuffer()\n>                 return nullptr;\n>         }\n>  \n> +       if (watchdogDuration_.count())\n> +               watchdog_.start(watchdogDuration_);\n> +\n>         cache_->put(buf.index);\n>  \n>         FrameBuffer *buffer = it->second;\n> @@ -1797,6 +1801,8 @@ int V4L2VideoDevice::streamOn()\n>         }\n>  \n>         streaming_ = true;\n> +       if (watchdogDuration_.count())\n> +               watchdog_.start(watchdogDuration_);\n>  \n>         return 0;\n>  }\n> @@ -1821,6 +1827,9 @@ int V4L2VideoDevice::streamOff()\n>         if (!streaming_ && queuedBuffers_.empty())\n>                 return 0;\n>  \n> +       if (watchdogDuration_.count())\n> +               watchdog_.stop();\n> +\n>         ret = ioctl(VIDIOC_STREAMOFF, &bufferType_);\n>         if (ret < 0) {\n>                 LOG(V4L2, Error)\n> @@ -1843,6 +1852,46 @@ int V4L2VideoDevice::streamOff()\n>         return 0;\n>  }\n>  \n> +/**\n> + * \\brief Set the dequeue timeout value\n> + * \\param[in] msec The timeout value to be used\n> + *\n> + * Sets a timeout value, given by \\a msec, that will be used by a watchdog timer\n> + * to ensure buffer dequeue events are periodically occurring when the device is\n> + * streaming. The watchdog timer is only active when the device is streaming, so\n> + * it is not necessary to disable it when the device stops streaming. The timeout\n> + * value can be safely updated at any time.\n> + *\n> + * If the timer expires, the \\ref V4L2VideoDevice::dequeueTimeout signal is\n> + * emitted. This can typically be used by pipeline handlers to be notified of\n> + * stalled devices.\n> + *\n> + * Set \\a msec to 0 to disable the watchdog timer.\n> + */\n> +void V4L2VideoDevice::setDequeueTimeout(std::chrono::milliseconds msec)\n> +{\n> +       watchdogDuration_ = msec;\n> +\n> +       watchdog_.stop();\n> +       if (watchdogDuration_.count() && streaming_)\n> +               watchdog_.start(msec);\n> +}\n> +\n> +/**\n> + * \\brief Slot to handle an expired dequeue timer.\n> + *\n> + * When this slot is called, the time between successive dequeue events is over\n> + * the required timeout. Emit the \\ref V4L2VideoDevice::dequeueTimeout signal.\n> + */\n> +void V4L2VideoDevice::watchdogExpired()\n> +{\n> +       LOG(V4L2, Warning)\n> +               << \"Dequeue timer of \" << watchdogDuration_.count()\n> +               << \" ms has expired!\";\n> +\n> +       dequeueTimeout.emit();\n> +}\n> +\n>  /**\n>   * \\brief Create a new video device instance from \\a entity in media device\n>   * \\a media\n> -- \n> 2.25.1\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id E79F3BD80A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 24 Mar 2022 12:53:45 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3944F604C5;\n\tThu, 24 Mar 2022 13:53:45 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 00BE060397\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 24 Mar 2022 13:53:42 +0100 (CET)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 895F61844;\n\tThu, 24 Mar 2022 13:53:42 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1648126425;\n\tbh=182EygcclWVlHmUpSUudhv0xHV+z9zgRak4NMHPsuPA=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=Zg+E4ZKHdxklDodaf90AzV6JgjpRkotqY+j9zBtxJtWrE425RkxUvAMiFaof07tT+\n\tuzSiU/fpwdUB/5bNvY+Oi7BJCrnLkyrDg0xUE0/fzlNMOR4dUhpOqvRqiQIK/nrLs5\n\tFQVWDkagR0TAAUAX5O5nBTEsGJrqwRbR/Tw/VH4RYWI3zA3t9lAjNxXGThm/NZRPvj\n\tpdqjQi8jFJUdaFL42IrEVAZR2+mzobkAakNWAUtnFJMfklLCErsfcMSox//JIDYbSl\n\tpq1r2twB5hCn69AbwCYicFWgDPL90UUU2bHMz9LLh3oidXmkfBpZnjEPPgRQZU2Co8\n\tcIbUL7Hi7OxBw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1648126422;\n\tbh=182EygcclWVlHmUpSUudhv0xHV+z9zgRak4NMHPsuPA=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=TTbObuJy5P3ZnQtspVXWm+/Q79gkaOE8Y9z8p3BFD3JxVaaS8DaYsekh4As1CdpdQ\n\tBDCbjPUlZJ/HANT/5ZMm45A0jQTXInNMs9uJcO3vQi+XFdBLOtYw8m/7qUzOOWuV+z\n\tlD1iuuW6hr80hW7UOlzW50pQX8GHWw/nXQ+ts+x8="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"TTbObuJy\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20220324093409.29247-1-naush@raspberrypi.com>","References":"<20220324093409.29247-1-naush@raspberrypi.com>","To":"Naushir Patuck <naush@raspberrypi.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Thu, 24 Mar 2022 12:53:40 +0000","Message-ID":"<164812642022.1484799.17802060137562075739@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH v2 1/2] libcamera: v4l2_videodevice:\n\tAdd a dequeue timer","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":22435,"web_url":"https://patchwork.libcamera.org/comment/22435/","msgid":"<CAEmqJPou6NFq0s411BCsX6b=w6KvModTxGZ_s6vrn3DALf9nKg@mail.gmail.com>","date":"2022-03-24T13:09:44","subject":"Re: [libcamera-devel] [PATCH v2 1/2] libcamera: v4l2_videodevice:\n\tAdd a dequeue timer","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Kieran,\n\n\nOn Thu, 24 Mar 2022 at 12:53, Kieran Bingham <\nkieran.bingham@ideasonboard.com> wrote:\n\n> Hi Naush,\n>\n> Thanks - this looks pretty good to me.\n> But Doxygen is generating warnings on this:\n>\n> [7/7] Generating doxygen with a custom command\n> /home/kbingham/iob/libcamera/libcamera/include/libcamera/internal/v4l2_videodevice.h:222:\n> warning: Member dequeueTimeout (variable) of class\n> libcamera::V4L2VideoDevice is not documented.\n> /home/kbingham/iob/libcamera/libcamera/src/libcamera/v4l2_videodevice.cpp:1864:\n> warning: unable to resolve reference to 'V4L2VideoDevice::dequeueTimeout'\n> for \\ref command\n>\n\nSorry, I missed those!  Now fixed.\n\n\n>\n> Also it's missing a unit test. Fortunately I was curious enough to see\n> how it works, so I've just written the test, and I'll post it in reply\n> to this.\n>\n\nThanks! I'll add this to the next revision of the patch.\n\nRegards,\nNaush\n\n\n>\n> --\n> Kieran\n>\n>\n> Quoting Naushir Patuck via libcamera-devel (2022-03-24 09:34:08)\n> > Add a timer that gets reset on every buffer dequeue event. If the timeout\n> > expires, optionally call a slot in the pipeline handler to handle this\n> > condition. This may be useful in detecting and handling stalls in either\n> the\n> > hardware or device driver.\n> >\n> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> > ---\n> >  include/libcamera/internal/v4l2_videodevice.h | 10 ++++\n> >  src/libcamera/v4l2_videodevice.cpp            | 49 +++++++++++++++++++\n> >  2 files changed, 59 insertions(+)\n> >\n> > diff --git a/include/libcamera/internal/v4l2_videodevice.h\n> b/include/libcamera/internal/v4l2_videodevice.h\n> > index 2d2ccc477c91..c34cc6585612 100644\n> > --- a/include/libcamera/internal/v4l2_videodevice.h\n> > +++ b/include/libcamera/internal/v4l2_videodevice.h\n> > @@ -9,6 +9,7 @@\n> >\n> >  #include <array>\n> >  #include <atomic>\n> > +#include <chrono>\n> >  #include <memory>\n> >  #include <optional>\n> >  #include <stdint.h>\n> > @@ -20,6 +21,7 @@\n> >  #include <libcamera/base/class.h>\n> >  #include <libcamera/base/log.h>\n> >  #include <libcamera/base/signal.h>\n> > +#include <libcamera/base/timer.h>\n> >  #include <libcamera/base/unique_fd.h>\n> >\n> >  #include <libcamera/color_space.h>\n> > @@ -216,6 +218,9 @@ public:\n> >         int streamOn();\n> >         int streamOff();\n> >\n> > +       void setDequeueTimeout(std::chrono::milliseconds msec);\n> > +       Signal<> dequeueTimeout;\n> > +\n> >         static std::unique_ptr<V4L2VideoDevice>\n> >         fromEntityName(const MediaDevice *media, const std::string\n> &entity);\n> >\n> > @@ -246,6 +251,8 @@ private:\n> >         void bufferAvailable();\n> >         FrameBuffer *dequeueBuffer();\n> >\n> > +       void watchdogExpired();\n> > +\n> >         V4L2Capability caps_;\n> >         V4L2DeviceFormat format_;\n> >         const PixelFormatInfo *formatInfo_;\n> > @@ -259,6 +266,9 @@ private:\n> >         EventNotifier *fdBufferNotifier_;\n> >\n> >         bool streaming_;\n> > +\n> > +       Timer watchdog_;\n> > +       std::chrono::milliseconds watchdogDuration_;\n> >  };\n> >\n> >  class V4L2M2MDevice\n> > diff --git a/src/libcamera/v4l2_videodevice.cpp\n> b/src/libcamera/v4l2_videodevice.cpp\n> > index 5f36ee20710d..29225f3058b0 100644\n> > --- a/src/libcamera/v4l2_videodevice.cpp\n> > +++ b/src/libcamera/v4l2_videodevice.cpp\n> > @@ -526,6 +526,7 @@ V4L2VideoDevice::V4L2VideoDevice(const std::string\n> &deviceNode)\n> >  V4L2VideoDevice::V4L2VideoDevice(const MediaEntity *entity)\n> >         : V4L2VideoDevice(entity->deviceNode())\n> >  {\n> > +       watchdog_.timeout.connect(this,\n> &V4L2VideoDevice::watchdogExpired);\n> >  }\n> >\n> >  V4L2VideoDevice::~V4L2VideoDevice()\n> > @@ -1695,6 +1696,9 @@ FrameBuffer *V4L2VideoDevice::dequeueBuffer()\n> >                 return nullptr;\n> >         }\n> >\n> > +       if (watchdogDuration_.count())\n> > +               watchdog_.start(watchdogDuration_);\n> > +\n> >         cache_->put(buf.index);\n> >\n> >         FrameBuffer *buffer = it->second;\n> > @@ -1797,6 +1801,8 @@ int V4L2VideoDevice::streamOn()\n> >         }\n> >\n> >         streaming_ = true;\n> > +       if (watchdogDuration_.count())\n> > +               watchdog_.start(watchdogDuration_);\n> >\n> >         return 0;\n> >  }\n> > @@ -1821,6 +1827,9 @@ int V4L2VideoDevice::streamOff()\n> >         if (!streaming_ && queuedBuffers_.empty())\n> >                 return 0;\n> >\n> > +       if (watchdogDuration_.count())\n> > +               watchdog_.stop();\n> > +\n> >         ret = ioctl(VIDIOC_STREAMOFF, &bufferType_);\n> >         if (ret < 0) {\n> >                 LOG(V4L2, Error)\n> > @@ -1843,6 +1852,46 @@ int V4L2VideoDevice::streamOff()\n> >         return 0;\n> >  }\n> >\n> > +/**\n> > + * \\brief Set the dequeue timeout value\n> > + * \\param[in] msec The timeout value to be used\n> > + *\n> > + * Sets a timeout value, given by \\a msec, that will be used by a\n> watchdog timer\n> > + * to ensure buffer dequeue events are periodically occurring when the\n> device is\n> > + * streaming. The watchdog timer is only active when the device is\n> streaming, so\n> > + * it is not necessary to disable it when the device stops streaming.\n> The timeout\n> > + * value can be safely updated at any time.\n> > + *\n> > + * If the timer expires, the \\ref V4L2VideoDevice::dequeueTimeout\n> signal is\n> > + * emitted. This can typically be used by pipeline handlers to be\n> notified of\n> > + * stalled devices.\n> > + *\n> > + * Set \\a msec to 0 to disable the watchdog timer.\n> > + */\n> > +void V4L2VideoDevice::setDequeueTimeout(std::chrono::milliseconds msec)\n> > +{\n> > +       watchdogDuration_ = msec;\n> > +\n> > +       watchdog_.stop();\n> > +       if (watchdogDuration_.count() && streaming_)\n> > +               watchdog_.start(msec);\n> > +}\n> > +\n> > +/**\n> > + * \\brief Slot to handle an expired dequeue timer.\n> > + *\n> > + * When this slot is called, the time between successive dequeue events\n> is over\n> > + * the required timeout. Emit the \\ref V4L2VideoDevice::dequeueTimeout\n> signal.\n> > + */\n> > +void V4L2VideoDevice::watchdogExpired()\n> > +{\n> > +       LOG(V4L2, Warning)\n> > +               << \"Dequeue timer of \" << watchdogDuration_.count()\n> > +               << \" ms has expired!\";\n> > +\n> > +       dequeueTimeout.emit();\n> > +}\n> > +\n> >  /**\n> >   * \\brief Create a new video device instance from \\a entity in media\n> device\n> >   * \\a media\n> > --\n> > 2.25.1\n> >\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 8FD07BD80A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 24 Mar 2022 13:10:04 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3CD74604D5;\n\tThu, 24 Mar 2022 14:10:03 +0100 (CET)","from mail-lf1-x12a.google.com (mail-lf1-x12a.google.com\n\t[IPv6:2a00:1450:4864:20::12a])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 316CD60397\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 24 Mar 2022 14:10:01 +0100 (CET)","by mail-lf1-x12a.google.com with SMTP id t25so7945962lfg.7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 24 Mar 2022 06:10:01 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1648127403;\n\tbh=FKeeTY6i/QASPeBI0QJUyj3h0zyXYh7F3UvtQwR4Z2M=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=TjyEfE2mgk62+aB+88aKFhdOP+XN7NP5DlW0w4gAWP1zWWo8ej7eQ6Nq97WVmInhM\n\tVR1J+cWDxCahHQyL34XWfTA10TMN4bTs3FlNUE9wR13SSW4B6r+ZFiveA2JzD1ozo8\n\t6vm1/F9pRP7EVAYlbP/Bh3TvxGZKff7Kz3w84PL/BGi3QQbZ2wvR3HuuBR3KQm6IBx\n\tnTggEpnPBer8Ov1JIibkt+nQRm/hPjF2YWE4QehgFEqEAn2NwhzP2E6RDABz5IdhC+\n\tbXVWvAPRWrM/M8sqJdG5YAYpOI3WuEnKXhxdYHG0U6tjr4BV2rNbx97I8minGF5KIc\n\ty+4VoWTB1zqhw==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=9yUUlpftiFXH2Dmg57TQEbCCIV/ssUgBeLz+HRtcLiE=;\n\tb=cvtHweYnGHk9wfwZw3Z7LXQg3F5Z1UAPjzQeVRRVFhf6JO8uwqcP9cETNx2+Ei1gE7\n\tVA5zCszYqHf5P2ql/Sb0Rd/Wso5IG4o4MAKx1H8HtV4z9iyRlwckee+ufEzJARZe5F1q\n\tarK9V+8KoucogY4lBO5ApRR7PJJmUJDg2tUvCuMEbX1GXap31Qa6Q4oRlziKs6dk7wkf\n\tJ0Fxphew7ObTxJpU7T2wLdRlq84gsbHraTHRNuvKKSv9kZ/DyehSL2gKNBFmQOVOJVrG\n\t/fFu/5Iqyo33OZh88veUeUOAK96/6UERWq61P/UmXSuTOl4L2ZGBx8+NtVQuP2BH9L1x\n\tiWPw=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"cvtHweYn\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=9yUUlpftiFXH2Dmg57TQEbCCIV/ssUgBeLz+HRtcLiE=;\n\tb=rwi5cAvCvhUEMIiWT7/UkV9WJ9NTy+GezTlId5TO/3CIg52ftffUflHNW84UW8e5jd\n\tHIsKFdEI0OWXj68GKjNfs22QgNp/nKWaveXzjxyKrh3phLXkPklmP+iVho1xhGRwrmat\n\tmAnE3y9yTcSsrdKc9D3nF9dDWQvmebSV3y4xt77TqrJVnGNaotuLpBStSGIzJdyVzBjs\n\tFLC2zx8E5SxBY0P9ca9uiItDgd8ZHr55Q91FwlIj8r9PUuXik7swr3ZxzHTMUuirXTP/\n\to6WBIzq+ceepLTSfAbWzFJEhE2MlMP8oZ7J8FaHO0uIh+bS7rD8bwLS85mEDG0Ur5MmP\n\tCPpQ==","X-Gm-Message-State":"AOAM533vWopwqMwmm4RghgSn64AQz2Cd4j+NPUkCXyU2Q2xPyE0Zuvk3\n\tL0Yhcqu86vqmK5cjYbvRjONgNcEoUNrcPQVSq8LnXQ==","X-Google-Smtp-Source":"ABdhPJxdZoIPILJpyDLQ8rgzt57Q5iLgVWmGUedWE4WnrtFQt4ntfcm5BXz8k6ZQvH+yyZdTN1CTryjfhRn88kwXydY=","X-Received":"by 2002:a05:6512:304c:b0:44a:4ad4:4527 with SMTP id\n\tb12-20020a056512304c00b0044a4ad44527mr3793451lfb.161.1648127400258;\n\tThu, 24 Mar 2022 06:10:00 -0700 (PDT)","MIME-Version":"1.0","References":"<20220324093409.29247-1-naush@raspberrypi.com>\n\t<164812642022.1484799.17802060137562075739@Monstersaurus>","In-Reply-To":"<164812642022.1484799.17802060137562075739@Monstersaurus>","Date":"Thu, 24 Mar 2022 13:09:44 +0000","Message-ID":"<CAEmqJPou6NFq0s411BCsX6b=w6KvModTxGZ_s6vrn3DALf9nKg@mail.gmail.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"0000000000003cc24505daf69087\"","Subject":"Re: [libcamera-devel] [PATCH v2 1/2] libcamera: v4l2_videodevice:\n\tAdd a dequeue timer","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Naushir Patuck via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Naushir Patuck <naush@raspberrypi.com>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]