[{"id":24030,"web_url":"https://patchwork.libcamera.org/comment/24030/","msgid":"<20220721142342.mhcw37slpe2pveur@uno.localdomain>","date":"2022-07-21T14:23:42","subject":"Re: [libcamera-devel] [PATCH 2/2] test: gstreamer: Check\n\tavailability of cameras before running","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Umang,\n\nOn Thu, Jul 21, 2022 at 07:15:31PM +0530, Umang Jain via libcamera-devel wrote:\n> Move the logic for checking the availability of cameras from\n> multi_stream_test to gstreamer test base class. Since\n> single_stream_class always assumes that a camera is available on the\n> system (which is not always the case for e.g. RPi in CI/CD environments)\n> it makes sense to have the availability check in the base class.\n> If no cameras are available, the behaviour should be to skip instead\n> of a failure.\n>\n> We currently have 2 tests for gstreamer differing based on number\n> of streams supported by the camera. Hence, the camera availability\n> is checked in conjunction with the number of the streams required by\n> the derived class.\n>\n> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>\n> ---\n>  .../gstreamer/gstreamer_multi_stream_test.cpp | 20 +----------\n>  test/gstreamer/gstreamer_test.cpp             | 33 ++++++++++++++++++-\n>  test/gstreamer/gstreamer_test.h               |  4 ++-\n>  3 files changed, 36 insertions(+), 21 deletions(-)\n>\n> diff --git a/test/gstreamer/gstreamer_multi_stream_test.cpp b/test/gstreamer/gstreamer_multi_stream_test.cpp\n> index 112f1dee..b8387c10 100644\n> --- a/test/gstreamer/gstreamer_multi_stream_test.cpp\n> +++ b/test/gstreamer/gstreamer_multi_stream_test.cpp\n> @@ -29,7 +29,7 @@ class GstreamerMultiStreamTest : public GstreamerTest, public Test\n>  {\n>  public:\n>  \tGstreamerMultiStreamTest()\n> -\t\t: GstreamerTest()\n> +\t\t: GstreamerTest(2)\n\nAs this is a test, I think it's ok even if it's a tad rough\n\n>  \t{\n>  \t}\n>\n> @@ -39,24 +39,6 @@ protected:\n>  \t\tif (status_ != TestPass)\n>  \t\t\treturn status_;\n>\n> -\t\t/* Check if platform supports multistream capture */\n> -\t\tlibcamera::CameraManager cm;\n> -\t\tcm.start();\n> -\t\tbool cameraFound = false;\n> -\t\tfor (auto &camera : cm.cameras()) {\n> -\t\t\tif (camera->streams().size() > 1) {\n> -\t\t\t\tcameraName_ = camera->id();\n> -\t\t\t\tcameraFound = true;\n> -\t\t\t\tcm.stop();\n> -\t\t\t\tbreak;\n> -\t\t\t}\n> -\t\t}\n> -\n> -\t\tif (!cameraFound) {\n> -\t\t\tcm.stop();\n> -\t\t\treturn TestSkip;\n> -\t\t}\n> -\n>  \t\tconst gchar *streamDescription = \"queue ! fakesink\";\n>  \t\tg_autoptr(GError) error = NULL;\n>\n> diff --git a/test/gstreamer/gstreamer_test.cpp b/test/gstreamer/gstreamer_test.cpp\n> index cfb8afc6..4668aa00 100644\n> --- a/test/gstreamer/gstreamer_test.cpp\n> +++ b/test/gstreamer/gstreamer_test.cpp\n> @@ -5,6 +5,7 @@\n>   * libcamera Gstreamer element API tests\n>   */\n>\n> +#include <libcamera/libcamera.h>\n\nEmpty line ?\n\n>  #include <libcamera/base/utils.h>\n>\n>  #include \"gstreamer_test.h\"\n> @@ -25,9 +26,10 @@ const char *__asan_default_options()\n>  }\n>  }\n>\n> -GstreamerTest::GstreamerTest()\n> +GstreamerTest::GstreamerTest(unsigned int numStreams)\n>  \t: pipeline_(nullptr), libcameraSrc_(nullptr)\n>  {\n> +\n\nNo empty line :)\n\n\n>  \t/*\n>  \t* GStreamer by default spawns a process to run the\n>  \t* gst-plugin-scanner helper. If libcamera is compiled with ASan\n> @@ -67,9 +69,38 @@ GstreamerTest::GstreamerTest()\n>  \t\treturn;\n>  \t}\n>\n> +\t/*\n> +\t * Atleast one camera should be available with numStreams streams\n> +\t * otherwise, skip the test entirely.\n> +\t */\n> +\tif (!satisfyCameraStreams(numStreams)) {\n> +\t\tstatus_ = TestSkip;\n> +\t\treturn;\n> +\t}\n> +\n>  \tstatus_ = TestPass;\n>  }\n>\n> +bool GstreamerTest::satisfyCameraStreams(unsigned int numStreams)\n\nBikeshedding on the function name apart...\nAnd with Nicolas comment clarified\n\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n   j\n> +{\n> +\tlibcamera::CameraManager cm;\n> +\tbool cameraFound = false;\n> +\n> +\tcm.start();\n> +\n> +\tfor (auto &camera : cm.cameras()) {\n> +\t\tif (camera->streams().size() < numStreams)\n> +\t\t\tcontinue;\n> +\n> +\t\tcameraFound = true;\n> +\t\tbreak;\n> +\t}\n> +\n> +\tcm.stop();\n> +\n> +\treturn cameraFound;\n> +}\n> +\n>  GstreamerTest::~GstreamerTest()\n>  {\n>  \tg_clear_object(&pipeline_);\n> diff --git a/test/gstreamer/gstreamer_test.h b/test/gstreamer/gstreamer_test.h\n> index 35adab0e..fa41721f 100644\n> --- a/test/gstreamer/gstreamer_test.h\n> +++ b/test/gstreamer/gstreamer_test.h\n> @@ -15,7 +15,7 @@\n>  class GstreamerTest\n>  {\n>  public:\n> -\tGstreamerTest();\n> +\tGstreamerTest(unsigned int numStreams = 1);\n>  \tvirtual ~GstreamerTest();\n>\n>  protected:\n> @@ -27,4 +27,6 @@ protected:\n>  \tGstElement *pipeline_;\n>  \tGstElement *libcameraSrc_;\n>  \tint status_;\n> +private:\n> +\tbool satisfyCameraStreams(unsigned int numStreams);\n>  };\n> --\n> 2.31.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 1DF82BD1F1\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 21 Jul 2022 14:23:46 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2F4BF6330F;\n\tThu, 21 Jul 2022 16:23:45 +0200 (CEST)","from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net\n\t[217.70.183.197])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6A48C601B8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 21 Jul 2022 16:23:44 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby mail.gandi.net (Postfix) with ESMTPSA id D40EB1C0007;\n\tThu, 21 Jul 2022 14:23:43 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1658413425;\n\tbh=QpgbyUSM34FdFYw/nlyPHqwa0N4o1laHuvHO/F3PQ9w=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=XOikSbmLK5NlJscp5WFzsunSnxiA5xWq7SKAr1YScYmA+tb06CXDY4zgaJ0VWr3sc\n\tNkASNQgn0cv8hMQR4I0mo+TwSGdwp4le0Qw2BpaYpdsNk9O2xxMrkvPaZEmzYc6bVD\n\tYcpN49Hk+934F8SyutvlyCfJAhRSQIhvRdSXzyJ3dye8lm46lVILOasyO3h3W4Tkhf\n\tTqLxnPzKIFhdPYGvdD8uX2B+3aGiQyZRuyPTFDbSisEyQrO71KJbU30dAmR7FLlW1v\n\t+yTyqfOSCCPUi8pGkcrbYA/2vosH9m1reuaPcYz9ZxeAvYtYv7NQkBLOvqw3g5dWsj\n\tNzn/qRgn2MZ0w==","Date":"Thu, 21 Jul 2022 16:23:42 +0200","To":"Umang Jain <umang.jain@ideasonboard.com>","Message-ID":"<20220721142342.mhcw37slpe2pveur@uno.localdomain>","References":"<20220721134531.1091104-1-umang.jain@ideasonboard.com>\n\t<20220721134531.1091104-2-umang.jain@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20220721134531.1091104-2-umang.jain@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 2/2] test: gstreamer: Check\n\tavailability of cameras before running","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":"Jacopo Mondi via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":24033,"web_url":"https://patchwork.libcamera.org/comment/24033/","msgid":"<YtlqiavJks3pltFI@pendragon.ideasonboard.com>","date":"2022-07-21T15:02:33","subject":"Re: [libcamera-devel] [PATCH 2/2] test: gstreamer: Check\n\tavailability of cameras before running","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hello,\n\nOn Thu, Jul 21, 2022 at 04:23:42PM +0200, Jacopo Mondi via libcamera-devel wrote:\n> On Thu, Jul 21, 2022 at 07:15:31PM +0530, Umang Jain via libcamera-devel wrote:\n> > Move the logic for checking the availability of cameras from\n> > multi_stream_test to gstreamer test base class. Since\n> > single_stream_class always assumes that a camera is available on the\n> > system (which is not always the case for e.g. RPi in CI/CD environments)\n> > it makes sense to have the availability check in the base class.\n> > If no cameras are available, the behaviour should be to skip instead\n> > of a failure.\n> >\n> > We currently have 2 tests for gstreamer differing based on number\n> > of streams supported by the camera. Hence, the camera availability\n> > is checked in conjunction with the number of the streams required by\n> > the derived class.\n> >\n> > Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>\n> > ---\n> >  .../gstreamer/gstreamer_multi_stream_test.cpp | 20 +----------\n> >  test/gstreamer/gstreamer_test.cpp             | 33 ++++++++++++++++++-\n> >  test/gstreamer/gstreamer_test.h               |  4 ++-\n> >  3 files changed, 36 insertions(+), 21 deletions(-)\n> >\n> > diff --git a/test/gstreamer/gstreamer_multi_stream_test.cpp b/test/gstreamer/gstreamer_multi_stream_test.cpp\n> > index 112f1dee..b8387c10 100644\n> > --- a/test/gstreamer/gstreamer_multi_stream_test.cpp\n> > +++ b/test/gstreamer/gstreamer_multi_stream_test.cpp\n> > @@ -29,7 +29,7 @@ class GstreamerMultiStreamTest : public GstreamerTest, public Test\n> >  {\n> >  public:\n> >  \tGstreamerMultiStreamTest()\n> > -\t\t: GstreamerTest()\n> > +\t\t: GstreamerTest(2)\n> \n> As this is a test, I think it's ok even if it's a tad rough\n> \n> >  \t{\n> >  \t}\n> >\n> > @@ -39,24 +39,6 @@ protected:\n> >  \t\tif (status_ != TestPass)\n> >  \t\t\treturn status_;\n> >\n> > -\t\t/* Check if platform supports multistream capture */\n> > -\t\tlibcamera::CameraManager cm;\n> > -\t\tcm.start();\n> > -\t\tbool cameraFound = false;\n> > -\t\tfor (auto &camera : cm.cameras()) {\n> > -\t\t\tif (camera->streams().size() > 1) {\n> > -\t\t\t\tcameraName_ = camera->id();\n> > -\t\t\t\tcameraFound = true;\n> > -\t\t\t\tcm.stop();\n> > -\t\t\t\tbreak;\n> > -\t\t\t}\n> > -\t\t}\n> > -\n> > -\t\tif (!cameraFound) {\n> > -\t\t\tcm.stop();\n> > -\t\t\treturn TestSkip;\n> > -\t\t}\n> > -\n> >  \t\tconst gchar *streamDescription = \"queue ! fakesink\";\n> >  \t\tg_autoptr(GError) error = NULL;\n> >\n> > diff --git a/test/gstreamer/gstreamer_test.cpp b/test/gstreamer/gstreamer_test.cpp\n> > index cfb8afc6..4668aa00 100644\n> > --- a/test/gstreamer/gstreamer_test.cpp\n> > +++ b/test/gstreamer/gstreamer_test.cpp\n> > @@ -5,6 +5,7 @@\n> >   * libcamera Gstreamer element API tests\n> >   */\n> >\n> > +#include <libcamera/libcamera.h>\n> \n> Empty line ?\n> \n> >  #include <libcamera/base/utils.h>\n> >\n> >  #include \"gstreamer_test.h\"\n> > @@ -25,9 +26,10 @@ const char *__asan_default_options()\n> >  }\n> >  }\n> >\n> > -GstreamerTest::GstreamerTest()\n> > +GstreamerTest::GstreamerTest(unsigned int numStreams)\n> >  \t: pipeline_(nullptr), libcameraSrc_(nullptr)\n> >  {\n> > +\n> \n> No empty line :)\n> \n> \n> >  \t/*\n> >  \t* GStreamer by default spawns a process to run the\n> >  \t* gst-plugin-scanner helper. If libcamera is compiled with ASan\n> > @@ -67,9 +69,38 @@ GstreamerTest::GstreamerTest()\n> >  \t\treturn;\n> >  \t}\n> >\n> > +\t/*\n> > +\t * Atleast one camera should be available with numStreams streams\n> > +\t * otherwise, skip the test entirely.\n\n\t * Atleast one camera should be available with numStreams streams,\n\t * otherwise skip the test entirely.\n\n> > +\t */\n> > +\tif (!satisfyCameraStreams(numStreams)) {\n> > +\t\tstatus_ = TestSkip;\n> > +\t\treturn;\n> > +\t}\n> > +\n> >  \tstatus_ = TestPass;\n> >  }\n> >\n> > +bool GstreamerTest::satisfyCameraStreams(unsigned int numStreams)\n> \n> Bikeshedding on the function name apart...\n> And with Nicolas comment clarified\n> \n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n> \n> > +{\n> > +\tlibcamera::CameraManager cm;\n> > +\tbool cameraFound = false;\n> > +\n> > +\tcm.start();\n> > +\n> > +\tfor (auto &camera : cm.cameras()) {\n> > +\t\tif (camera->streams().size() < numStreams)\n> > +\t\t\tcontinue;\n> > +\n> > +\t\tcameraFound = true;\n> > +\t\tbreak;\n> > +\t}\n> > +\n> > +\tcm.stop();\n> > +\n> > +\treturn cameraFound;\n> > +}\n> > +\n> >  GstreamerTest::~GstreamerTest()\n> >  {\n> >  \tg_clear_object(&pipeline_);\n> > diff --git a/test/gstreamer/gstreamer_test.h b/test/gstreamer/gstreamer_test.h\n> > index 35adab0e..fa41721f 100644\n> > --- a/test/gstreamer/gstreamer_test.h\n> > +++ b/test/gstreamer/gstreamer_test.h\n> > @@ -15,7 +15,7 @@\n> >  class GstreamerTest\n> >  {\n> >  public:\n> > -\tGstreamerTest();\n> > +\tGstreamerTest(unsigned int numStreams = 1);\n> >  \tvirtual ~GstreamerTest();\n> >\n> >  protected:\n> > @@ -27,4 +27,6 @@ protected:\n> >  \tGstElement *pipeline_;\n> >  \tGstElement *libcameraSrc_;\n> >  \tint status_;\n\nBlank line.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> > +private:\n> > +\tbool satisfyCameraStreams(unsigned int numStreams);\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 C0FEDBD1F1\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 21 Jul 2022 15:02:38 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 19B956330F;\n\tThu, 21 Jul 2022 17:02:38 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 77E4D601B8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 21 Jul 2022 17:02:36 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C2E6F496;\n\tThu, 21 Jul 2022 17:02:35 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1658415758;\n\tbh=1qgj2VmZlqdt7a/hxY0RW5LE4r318FPemE4kxcP0R4o=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=atcEAv6ByEN9DVjI+GHjsGkExAvO/3vBscbQf3a3aC/YwMnfo07JjouGl4lEsWqUP\n\tp5PwD203OWQ2eZBr2M9PH/szziVWg68cKEd3qokqI/VlPAP//vtt+hfibiF1ZXItXQ\n\t/NzD/AdeNA0jhvqBQMTIR4XLJIdMI4w7R4xjcgDo7VC82qdX+vnh50dOoaeOpIJkMn\n\tGCETyQbQt52xGzWlCu3SJbDRK3cuQbB4m005E6S9KSl7oH+rgmXOlrGZyt6mvlgTBC\n\t7XJRMuW86G7hnYezOgmlr5FyayFL4UsrlAm4YDhNIbXlgJVhFjRbkSDtoiX/5Y+13k\n\t5g75eHyX9eHgQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1658415756;\n\tbh=1qgj2VmZlqdt7a/hxY0RW5LE4r318FPemE4kxcP0R4o=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=GkNSv+YkYtBq9mYrc1QmynbI3f0nb/RZMD8aAbgoV5uwxcDQN7s6LfWzzTWJ4opyc\n\t2W2bfvVFOied+7Ely5hDQbRnSBZPIu1C0IdLlL2Ya2Koy4UhbhUEmu7G/ltr5Y5dZT\n\t2TzKZezCthNpNq3L4GpnWkgQhmcirfQiS/vmXQrs="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"GkNSv+Yk\"; dkim-atps=neutral","Date":"Thu, 21 Jul 2022 18:02:33 +0300","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<YtlqiavJks3pltFI@pendragon.ideasonboard.com>","References":"<20220721134531.1091104-1-umang.jain@ideasonboard.com>\n\t<20220721134531.1091104-2-umang.jain@ideasonboard.com>\n\t<20220721142342.mhcw37slpe2pveur@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20220721142342.mhcw37slpe2pveur@uno.localdomain>","Subject":"Re: [libcamera-devel] [PATCH 2/2] test: gstreamer: Check\n\tavailability of cameras before running","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":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":24056,"web_url":"https://patchwork.libcamera.org/comment/24056/","msgid":"<7b9246ea-343b-5d70-3356-8be64c41f71d@ideasonboard.com>","date":"2022-07-22T13:04:35","subject":"Re: [libcamera-devel] [PATCH 2/2] test: gstreamer: Check\n\tavailability of cameras before running","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hi,\n\nOn 7/21/22 19:53, Jacopo Mondi wrote:\n> Hi Umang,\n>\n> On Thu, Jul 21, 2022 at 07:15:31PM +0530, Umang Jain via libcamera-devel wrote:\n>> Move the logic for checking the availability of cameras from\n>> multi_stream_test to gstreamer test base class. Since\n>> single_stream_class always assumes that a camera is available on the\n>> system (which is not always the case for e.g. RPi in CI/CD environments)\n>> it makes sense to have the availability check in the base class.\n>> If no cameras are available, the behaviour should be to skip instead\n>> of a failure.\n>>\n>> We currently have 2 tests for gstreamer differing based on number\n>> of streams supported by the camera. Hence, the camera availability\n>> is checked in conjunction with the number of the streams required by\n>> the derived class.\n>>\n>> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>\n>> ---\n>>   .../gstreamer/gstreamer_multi_stream_test.cpp | 20 +----------\n>>   test/gstreamer/gstreamer_test.cpp             | 33 ++++++++++++++++++-\n>>   test/gstreamer/gstreamer_test.h               |  4 ++-\n>>   3 files changed, 36 insertions(+), 21 deletions(-)\n>>\n>> diff --git a/test/gstreamer/gstreamer_multi_stream_test.cpp b/test/gstreamer/gstreamer_multi_stream_test.cpp\n>> index 112f1dee..b8387c10 100644\n>> --- a/test/gstreamer/gstreamer_multi_stream_test.cpp\n>> +++ b/test/gstreamer/gstreamer_multi_stream_test.cpp\n>> @@ -29,7 +29,7 @@ class GstreamerMultiStreamTest : public GstreamerTest, public Test\n>>   {\n>>   public:\n>>   \tGstreamerMultiStreamTest()\n>> -\t\t: GstreamerTest()\n>> +\t\t: GstreamerTest(2)\n> As this is a test, I think it's ok even if it's a tad rough\n>\n>>   \t{\n>>   \t}\n>>\n>> @@ -39,24 +39,6 @@ protected:\n>>   \t\tif (status_ != TestPass)\n>>   \t\t\treturn status_;\n>>\n>> -\t\t/* Check if platform supports multistream capture */\n>> -\t\tlibcamera::CameraManager cm;\n>> -\t\tcm.start();\n>> -\t\tbool cameraFound = false;\n>> -\t\tfor (auto &camera : cm.cameras()) {\n>> -\t\t\tif (camera->streams().size() > 1) {\n>> -\t\t\t\tcameraName_ = camera->id();\n>> -\t\t\t\tcameraFound = true;\n>> -\t\t\t\tcm.stop();\n>> -\t\t\t\tbreak;\n>> -\t\t\t}\n>> -\t\t}\n>> -\n>> -\t\tif (!cameraFound) {\n>> -\t\t\tcm.stop();\n>> -\t\t\treturn TestSkip;\n>> -\t\t}\n>> -\n>>   \t\tconst gchar *streamDescription = \"queue ! fakesink\";\n>>   \t\tg_autoptr(GError) error = NULL;\n>>\n>> diff --git a/test/gstreamer/gstreamer_test.cpp b/test/gstreamer/gstreamer_test.cpp\n>> index cfb8afc6..4668aa00 100644\n>> --- a/test/gstreamer/gstreamer_test.cpp\n>> +++ b/test/gstreamer/gstreamer_test.cpp\n>> @@ -5,6 +5,7 @@\n>>    * libcamera Gstreamer element API tests\n>>    */\n>>\n>> +#include <libcamera/libcamera.h>\n> Empty line ?\n>\n>>   #include <libcamera/base/utils.h>\n>>\n>>   #include \"gstreamer_test.h\"\n>> @@ -25,9 +26,10 @@ const char *__asan_default_options()\n>>   }\n>>   }\n>>\n>> -GstreamerTest::GstreamerTest()\n>> +GstreamerTest::GstreamerTest(unsigned int numStreams)\n>>   \t: pipeline_(nullptr), libcameraSrc_(nullptr)\n>>   {\n>> +\n> No empty line :)\n>\n>\n>>   \t/*\n>>   \t* GStreamer by default spawns a process to run the\n>>   \t* gst-plugin-scanner helper. If libcamera is compiled with ASan\n>> @@ -67,9 +69,38 @@ GstreamerTest::GstreamerTest()\n>>   \t\treturn;\n>>   \t}\n>>\n>> +\t/*\n>> +\t * Atleast one camera should be available with numStreams streams\n>> +\t * otherwise, skip the test entirely.\n>> +\t */\n>> +\tif (!satisfyCameraStreams(numStreams)) {\n>> +\t\tstatus_ = TestSkip;\n>> +\t\treturn;\n>> +\t}\n>> +\n>>   \tstatus_ = TestPass;\n>>   }\n>>\n>> +bool GstreamerTest::satisfyCameraStreams(unsigned int numStreams)\n> Bikeshedding on the function name apart...\n> And with Nicolas comment clarified\n\n\nFor naming, it's tricky as this function checks for 2 things:\n1) Cameras availability\n2) Numbers of required streams per camera\n\nIt's tricky to combine 1) and 2) in a naming scheme.\n\ncheckForStreams() or simple perCameraStreams() or checkMinCameraStreams() ?\n\nI think I'll go with the last one.\n\nI think Nicolas comment doesn't not apply here since, cameraManager \ninstance is local to a function.\n\n>\n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\n\nThanks\n\n>\n> Thanks\n>     j\n>> +{\n>> +\tlibcamera::CameraManager cm;\n>> +\tbool cameraFound = false;\n>> +\n>> +\tcm.start();\n>> +\n>> +\tfor (auto &camera : cm.cameras()) {\n>> +\t\tif (camera->streams().size() < numStreams)\n>> +\t\t\tcontinue;\n>> +\n>> +\t\tcameraFound = true;\n>> +\t\tbreak;\n>> +\t}\n>> +\n>> +\tcm.stop();\n>> +\n>> +\treturn cameraFound;\n>> +}\n>> +\n>>   GstreamerTest::~GstreamerTest()\n>>   {\n>>   \tg_clear_object(&pipeline_);\n>> diff --git a/test/gstreamer/gstreamer_test.h b/test/gstreamer/gstreamer_test.h\n>> index 35adab0e..fa41721f 100644\n>> --- a/test/gstreamer/gstreamer_test.h\n>> +++ b/test/gstreamer/gstreamer_test.h\n>> @@ -15,7 +15,7 @@\n>>   class GstreamerTest\n>>   {\n>>   public:\n>> -\tGstreamerTest();\n>> +\tGstreamerTest(unsigned int numStreams = 1);\n>>   \tvirtual ~GstreamerTest();\n>>\n>>   protected:\n>> @@ -27,4 +27,6 @@ protected:\n>>   \tGstElement *pipeline_;\n>>   \tGstElement *libcameraSrc_;\n>>   \tint status_;\n>> +private:\n>> +\tbool satisfyCameraStreams(unsigned int numStreams);\n>>   };\n>> --\n>> 2.31.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 75D57BD1F1\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 22 Jul 2022 13:04:43 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id DA0286330F;\n\tFri, 22 Jul 2022 15:04:42 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 00373601B8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 22 Jul 2022 15:04:40 +0200 (CEST)","from [IPV6:2401:4900:1f3f:a2d:c6dd:7a7c:3d3c:dbb9] (unknown\n\t[IPv6:2401:4900:1f3f:a2d:c6dd:7a7c:3d3c:dbb9])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 0A2856D5;\n\tFri, 22 Jul 2022 15:04:39 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1658495082;\n\tbh=CwHMX1oSVdo4jgJE+j/LsZTGnrcdb4UwfxUYZ3Ku1CM=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=Q0XPhHrRkkLNOfzDESa+x6wU/OrUKBFUDsDE8VJAB7ye4N/nYAHrmMw+PxIhOcVni\n\tuJRhrlvzswhwOJ8qOzWOHJVdnM2jECmMRUIcRXFTHvmUuXwBAXKxe7xvJN5jZ/DogW\n\txzKYcl3JAt7kA+Zkw4iLZnyE2jZF5oWcnaVQFXWgekvWHBvBVGHN/yp6b611/9p69t\n\tfP0zdvNUaXvZPr+4zNX0boHl+U7VeY6zanchwIHrkyDdvyxcUUpwycP/JiDEuJDHvU\n\tdv3Bc6sSb5PgGbRDFUE01ab3629jinREaqChoh8Nhmx5WU4b6mcL4rH4ZqjgKSmLT2\n\t1H4gA5rTGt/Tw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1658495080;\n\tbh=CwHMX1oSVdo4jgJE+j/LsZTGnrcdb4UwfxUYZ3Ku1CM=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=eEMBaIMjVBmfgAUsGCy9+RhN9PXX+/lKKlad3WwU3jackHXNTLryMIABnf0c+uAOY\n\tTGFJ7Bu3pCfdUMRSLY+XCi1P6sVBin+0HO2KAxxdbf6MkTAK+JY5yV/4J/h05fKBJK\n\tzavPfRwynTBfjHWSUpPtJDzHw25RA8+5GI2Qb6NI="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"eEMBaIMj\"; dkim-atps=neutral","Message-ID":"<7b9246ea-343b-5d70-3356-8be64c41f71d@ideasonboard.com>","Date":"Fri, 22 Jul 2022 18:34:35 +0530","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101\n\tThunderbird/91.4.1","Content-Language":"en-US","To":"Jacopo Mondi <jacopo@jmondi.org>","References":"<20220721134531.1091104-1-umang.jain@ideasonboard.com>\n\t<20220721134531.1091104-2-umang.jain@ideasonboard.com>\n\t<20220721142342.mhcw37slpe2pveur@uno.localdomain>","In-Reply-To":"<20220721142342.mhcw37slpe2pveur@uno.localdomain>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH 2/2] test: gstreamer: Check\n\tavailability of cameras before running","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":"Umang Jain via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Umang Jain <umang.jain@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":24057,"web_url":"https://patchwork.libcamera.org/comment/24057/","msgid":"<Ytq2M4TL5B1j6ixv@pendragon.ideasonboard.com>","date":"2022-07-22T14:37:39","subject":"Re: [libcamera-devel] [PATCH 2/2] test: gstreamer: Check\n\tavailability of cameras before running","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Umang,\n\nOn Fri, Jul 22, 2022 at 06:34:35PM +0530, Umang Jain via libcamera-devel wrote:\n> On 7/21/22 19:53, Jacopo Mondi wrote:\n> > On Thu, Jul 21, 2022 at 07:15:31PM +0530, Umang Jain via libcamera-devel wrote:\n> >> Move the logic for checking the availability of cameras from\n> >> multi_stream_test to gstreamer test base class. Since\n> >> single_stream_class always assumes that a camera is available on the\n> >> system (which is not always the case for e.g. RPi in CI/CD environments)\n> >> it makes sense to have the availability check in the base class.\n> >> If no cameras are available, the behaviour should be to skip instead\n> >> of a failure.\n> >>\n> >> We currently have 2 tests for gstreamer differing based on number\n> >> of streams supported by the camera. Hence, the camera availability\n> >> is checked in conjunction with the number of the streams required by\n> >> the derived class.\n> >>\n> >> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>\n> >> ---\n> >>   .../gstreamer/gstreamer_multi_stream_test.cpp | 20 +----------\n> >>   test/gstreamer/gstreamer_test.cpp             | 33 ++++++++++++++++++-\n> >>   test/gstreamer/gstreamer_test.h               |  4 ++-\n> >>   3 files changed, 36 insertions(+), 21 deletions(-)\n> >>\n> >> diff --git a/test/gstreamer/gstreamer_multi_stream_test.cpp b/test/gstreamer/gstreamer_multi_stream_test.cpp\n> >> index 112f1dee..b8387c10 100644\n> >> --- a/test/gstreamer/gstreamer_multi_stream_test.cpp\n> >> +++ b/test/gstreamer/gstreamer_multi_stream_test.cpp\n> >> @@ -29,7 +29,7 @@ class GstreamerMultiStreamTest : public GstreamerTest, public Test\n> >>   {\n> >>   public:\n> >>   \tGstreamerMultiStreamTest()\n> >> -\t\t: GstreamerTest()\n> >> +\t\t: GstreamerTest(2)\n> >\n> > As this is a test, I think it's ok even if it's a tad rough\n> >\n> >>   \t{\n> >>   \t}\n> >>\n> >> @@ -39,24 +39,6 @@ protected:\n> >>   \t\tif (status_ != TestPass)\n> >>   \t\t\treturn status_;\n> >>\n> >> -\t\t/* Check if platform supports multistream capture */\n> >> -\t\tlibcamera::CameraManager cm;\n> >> -\t\tcm.start();\n> >> -\t\tbool cameraFound = false;\n> >> -\t\tfor (auto &camera : cm.cameras()) {\n> >> -\t\t\tif (camera->streams().size() > 1) {\n> >> -\t\t\t\tcameraName_ = camera->id();\n> >> -\t\t\t\tcameraFound = true;\n> >> -\t\t\t\tcm.stop();\n> >> -\t\t\t\tbreak;\n> >> -\t\t\t}\n> >> -\t\t}\n> >> -\n> >> -\t\tif (!cameraFound) {\n> >> -\t\t\tcm.stop();\n> >> -\t\t\treturn TestSkip;\n> >> -\t\t}\n> >> -\n> >>   \t\tconst gchar *streamDescription = \"queue ! fakesink\";\n> >>   \t\tg_autoptr(GError) error = NULL;\n> >>\n> >> diff --git a/test/gstreamer/gstreamer_test.cpp b/test/gstreamer/gstreamer_test.cpp\n> >> index cfb8afc6..4668aa00 100644\n> >> --- a/test/gstreamer/gstreamer_test.cpp\n> >> +++ b/test/gstreamer/gstreamer_test.cpp\n> >> @@ -5,6 +5,7 @@\n> >>    * libcamera Gstreamer element API tests\n> >>    */\n> >>\n> >> +#include <libcamera/libcamera.h>\n> >\n> > Empty line ?\n> >\n> >>   #include <libcamera/base/utils.h>\n> >>\n> >>   #include \"gstreamer_test.h\"\n> >> @@ -25,9 +26,10 @@ const char *__asan_default_options()\n> >>   }\n> >>   }\n> >>\n> >> -GstreamerTest::GstreamerTest()\n> >> +GstreamerTest::GstreamerTest(unsigned int numStreams)\n> >>   \t: pipeline_(nullptr), libcameraSrc_(nullptr)\n> >>   {\n> >> +\n> >\n> > No empty line :)\n> >\n> >>   \t/*\n> >>   \t* GStreamer by default spawns a process to run the\n> >>   \t* gst-plugin-scanner helper. If libcamera is compiled with ASan\n> >> @@ -67,9 +69,38 @@ GstreamerTest::GstreamerTest()\n> >>   \t\treturn;\n> >>   \t}\n> >>\n> >> +\t/*\n> >> +\t * Atleast one camera should be available with numStreams streams\n> >> +\t * otherwise, skip the test entirely.\n> >> +\t */\n> >> +\tif (!satisfyCameraStreams(numStreams)) {\n> >> +\t\tstatus_ = TestSkip;\n> >> +\t\treturn;\n> >> +\t}\n> >> +\n> >>   \tstatus_ = TestPass;\n> >>   }\n> >>\n> >> +bool GstreamerTest::satisfyCameraStreams(unsigned int numStreams)\n> > \n> > Bikeshedding on the function name apart...\n> > And with Nicolas comment clarified\n> \n> For naming, it's tricky as this function checks for 2 things:\n> 1) Cameras availability\n> 2) Numbers of required streams per camera\n> \n> It's tricky to combine 1) and 2) in a naming scheme.\n> \n> checkForStreams() or simple perCameraStreams() or checkMinCameraStreams() ?\n> \n> I think I'll go with the last one.\n\nI don't mind much, I'm fine with the existing name too.\n\n> I think Nicolas comment doesn't not apply here since, cameraManager \n> instance is local to a function.\n> \n> > Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n> \n> Thanks\n> \n> >> +{\n> >> +\tlibcamera::CameraManager cm;\n> >> +\tbool cameraFound = false;\n> >> +\n> >> +\tcm.start();\n> >> +\n> >> +\tfor (auto &camera : cm.cameras()) {\n> >> +\t\tif (camera->streams().size() < numStreams)\n> >> +\t\t\tcontinue;\n> >> +\n> >> +\t\tcameraFound = true;\n> >> +\t\tbreak;\n> >> +\t}\n> >> +\n> >> +\tcm.stop();\n> >> +\n> >> +\treturn cameraFound;\n> >> +}\n> >> +\n> >>   GstreamerTest::~GstreamerTest()\n> >>   {\n> >>   \tg_clear_object(&pipeline_);\n> >> diff --git a/test/gstreamer/gstreamer_test.h b/test/gstreamer/gstreamer_test.h\n> >> index 35adab0e..fa41721f 100644\n> >> --- a/test/gstreamer/gstreamer_test.h\n> >> +++ b/test/gstreamer/gstreamer_test.h\n> >> @@ -15,7 +15,7 @@\n> >>   class GstreamerTest\n> >>   {\n> >>   public:\n> >> -\tGstreamerTest();\n> >> +\tGstreamerTest(unsigned int numStreams = 1);\n> >>   \tvirtual ~GstreamerTest();\n> >>\n> >>   protected:\n> >> @@ -27,4 +27,6 @@ protected:\n> >>   \tGstElement *pipeline_;\n> >>   \tGstElement *libcameraSrc_;\n> >>   \tint status_;\n> >> +private:\n> >> +\tbool satisfyCameraStreams(unsigned int numStreams);\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 A66A7BE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 22 Jul 2022 14:37:43 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E2F3F6330F;\n\tFri, 22 Jul 2022 16:37:42 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 75DDB601B8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 22 Jul 2022 16:37:41 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D73ED80A;\n\tFri, 22 Jul 2022 16:37:40 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1658500663;\n\tbh=6qcQc5IiWmRG8PmM1WCcsPZwvPLa7UtGH9paads048o=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=2xQP3fQiNiTtTnpfhONZ9szWvkoLqmrwJ8tp2WgvyG2S3HhB7nhimpJozEmhFz4DS\n\twdmopAkGFdOhkg35DfPD9zdxRp6zOJxFHEmbHHwmgpk3+JdIDkaruwggNdnZJgaNXb\n\tL7bYxQpOqskr6oEJmk+4EzUSxeCgD5DSS3UhPr+m8gzKsNrsTxCeE+/Ymjq1mUi3Bl\n\trywYhZf55ql1RrrOKT4LjTQLJuLQ0c8vGOZI0ToxgcwszCV6RWN1wL1lw+KElWqgvT\n\tNAZHEKaDPg/x+WZBB/DkdjYWdUdH1pAvW9cj20h5Gf7f94Tb+D2fxX18J9TMzJ7yh8\n\tvQdoNG3emrvHw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1658500661;\n\tbh=6qcQc5IiWmRG8PmM1WCcsPZwvPLa7UtGH9paads048o=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=D7WyDmOb+md3vkzwBHIKbGvFy/CotzhHmAejGA3vnq+zca8l1FdL4s6Inj5Vp3GAN\n\t3AdkCO1bknAox2wdhEeIiaEnqaToJ69yGwnvw/BABDrGO4HXBaI4kV6ktqqmZqFtcH\n\tJ4WDP6osJ5Uz0+4NGYmz/PnGWSoCh1C/aGbrOZOU="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"D7WyDmOb\"; dkim-atps=neutral","Date":"Fri, 22 Jul 2022 17:37:39 +0300","To":"Umang Jain <umang.jain@ideasonboard.com>","Message-ID":"<Ytq2M4TL5B1j6ixv@pendragon.ideasonboard.com>","References":"<20220721134531.1091104-1-umang.jain@ideasonboard.com>\n\t<20220721134531.1091104-2-umang.jain@ideasonboard.com>\n\t<20220721142342.mhcw37slpe2pveur@uno.localdomain>\n\t<7b9246ea-343b-5d70-3356-8be64c41f71d@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<7b9246ea-343b-5d70-3356-8be64c41f71d@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 2/2] test: gstreamer: Check\n\tavailability of cameras before running","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":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]