[{"id":19818,"web_url":"https://patchwork.libcamera.org/comment/19818/","msgid":"<b4469d63c9eb7ad341bf9be009c82e03d00e61ef.camel@collabora.com>","date":"2021-09-23T14:05:01","subject":"Re: [libcamera-devel] [PATCH v2] test: gstreamer: Add a test for\n\tgstreamer multi stream","submitter":{"id":31,"url":"https://patchwork.libcamera.org/api/people/31/","name":"Nicolas Dufresne","email":"nicolas.dufresne@collabora.com"},"content":"Le jeudi 23 septembre 2021 à 19:16 +0530, Vedant Paranjape a écrit :\n> This patch adds a test to test if multi stream using libcamera's\n> gstreamer element works.\n> \n> Test will run only on devices that support multistream output, i.e.,\n> devices that use IPU3 and raspberrypi pipeline. This was tested on\n> a Raspberry Pi 4B+.\n> \n> Signed-off-by: Vedant Paranjape <vedantparanjape160201@gmail.com>\n> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n> ---\n>  .../gstreamer/gstreamer_multi_stream_test.cpp | 121 ++++++++++++++++++\n>  test/gstreamer/meson.build                    |   1 +\n>  2 files changed, 122 insertions(+)\n>  create mode 100644 test/gstreamer/gstreamer_multi_stream_test.cpp\n> \n> diff --git a/test/gstreamer/gstreamer_multi_stream_test.cpp b/test/gstreamer/gstreamer_multi_stream_test.cpp\n> new file mode 100644\n> index 000000000000..5df1dd40388a\n> --- /dev/null\n> +++ b/test/gstreamer/gstreamer_multi_stream_test.cpp\n> @@ -0,0 +1,121 @@\n> +/* SPDX-License-Identifier: GPL-2.0-or-later */\n> +/*\n> + * Copyright (C) 2021, Vedant Paranjape\n> + *\n> + * gstreamer_multi_stream_test.cpp - GStreamer multi stream capture test\n> + */\n> +\n> +#include <iostream>\n> +#include <unistd.h>\n> +\n> +#include <libcamera/base/utils.h>\n> +\n> +#include <libcamera/libcamera.h>\n> +\n> +#include \"libcamera/internal/source_paths.h\"\n> +\n> +#include <gst/gst.h>\n> +\n> +#include \"gstreamer_test.h\"\n> +#include \"test.h\"\n> +\n> +using namespace std;\n> +\n> +class GstreamerMultiStreamTest : public GstreamerTest, public Test\n> +{\n> +public:\n> +\tGstreamerMultiStreamTest()\n> +\t\t: GstreamerTest()\n> +\t{\n> +\t}\n> +\n> +protected:\n> +\tint init() override\n> +\t{\n> +\t\tif (status_ != TestPass)\n> +\t\t\treturn status_;\n> +\n> +\t\t/* Check if platform support multistream output */\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) error0 = NULL;\n> +\t\tg_autoptr(GError) error1 = NULL;\n> +\t\tstream0_ = gst_parse_bin_from_description_full(streamDescription, TRUE, NULL, GST_PARSE_FLAG_FATAL_ERRORS, &error0);\n> +\t\tstream1_ = gst_parse_bin_from_description_full(streamDescription, TRUE, NULL, GST_PARSE_FLAG_FATAL_ERRORS, &error1);\n> +\n> +\t\tif (!stream0_) {\n> +\t\t\tg_printerr(\"Bin 0 could not be created (%s)\\n\", error0->message);\n> +\t\t\treturn TestFail;\n> +\t\t}\n> +\t\tif (!stream1_) {\n> +\t\t\tg_printerr(\"Bin 1 could not be created (%s)\\n\", error1->message);\n> +\t\t\treturn TestFail;\n> +\t\t}\n> +\t\tg_object_ref_sink(stream0_);\n> +\t\tg_object_ref_sink(stream1_);\n\nIn general, I refer when things are slightly more grouped together, what do you\nthink of:\n\n+\t\tg_autoptr(GError) error = NULL;\n+\n+\t\tstream0_ = gst_parse_bin_from_description_full(streamDescription, TRUE, NULL, GST_PARSE_FLAG_FATAL_ERRORS, &error);\n+\t\tif (!stream0_) {\n+\t\t\tg_printerr(\"Stream 0 could not be created (%s)\\n\", error->message);\n+\t\t\treturn TestFail;\n+\t\t}\n+\t\tg_object_ref_sink(stream0_);\n+\n+\t\tstream1_ = gst_parse_bin_from_description_full(streamDescription, TRUE, NULL, GST_PARSE_FLAG_FATAL_ERRORS, &error);\n+\t\tif (!stream1_) {\n+\t\t\tg_printerr(\"Stream 1 could not be created (%s)\\n\", error->message);\n+\t\t\treturn TestFail;\n+\t\t}\n+\t\tg_object_ref_sink(stream1_);\n\np.s. Changed Bin into Stream, I would not get what that means if I saw an error\nabout bin0/1, as the member is named streamX.\n\n> +\n> +\t\tif (createPipeline() != TestPass)\n> +\t\t\treturn TestFail;\n> +\n> +\t\treturn TestPass;\n> +\t}\n> +\n> +\tint run() override\n> +\t{\n> +\t\tg_object_set(libcameraSrc_, \"camera-name\", cameraName.c_str(), NULL);\n> +\n> +\t\t/* Build the pipeline */\n> +\t\tgst_bin_add_many(GST_BIN(pipeline_), libcameraSrc_,\n> +\t\t\t\t\t\t\tstream0_, stream1_, NULL);\n> +\n> +\t\tg_autoptr(GstPad) src_pad = gst_element_get_static_pad(libcameraSrc_, \"src\");\n> +\t\tg_autoptr(GstPad) request_pad = gst_element_get_request_pad(libcameraSrc_, \"src_%u\");\n> +\n> +\t\t{\n> +\t\t\tg_autoptr(GstPad) queue0_sink_pad = gst_element_get_static_pad(stream0_, \"sink\");\n> +\t\t\tg_autoptr(GstPad) queue1_sink_pad = gst_element_get_static_pad(stream1_, \"sink\");\n> +\n> +\t\t\tif (gst_pad_link(src_pad, queue0_sink_pad) != GST_PAD_LINK_OK\n> +\t\t\t\t|| gst_pad_link(request_pad, queue1_sink_pad) != GST_PAD_LINK_OK) {\n> +\t\t\t\tg_printerr(\"Pads could not be linked.\\n\");\n> +\t\t\t\treturn TestFail;\n> +\t\t\t}\n> +\t\t}\n> +\n> +\t\tif (startPipeline() != TestPass)\n> +\t\t\treturn TestFail;\n> +\n> +\t\tif (processEvent() != TestPass)\n> +\t\t\treturn TestFail;\n> +\n> +\t\treturn TestPass;\n> +\t}\n> +\n> +\tvoid cleanup() override\n> +\t{\n> +\t\tg_clear_object(&stream0_);\n> +\t\tg_clear_object(&stream1_);\n> +\t}\n> +private:\n> +\tstd::string cameraName;\n> +\tGstElement *stream0_;\n> +\tGstElement *stream1_;\n> +};\n> +\n> +TEST_REGISTER(GstreamerMultiStreamTest)\n> diff --git a/test/gstreamer/meson.build b/test/gstreamer/meson.build\n> index aca53b920365..13652e87d05c 100644\n> --- a/test/gstreamer/meson.build\n> +++ b/test/gstreamer/meson.build\n> @@ -6,6 +6,7 @@ endif\n>  \n>  gstreamer_tests = [\n>      ['single_stream_test',   'gstreamer_single_stream_test.cpp'],\n> +    ['multi_stream_test',   'gstreamer_multi_stream_test.cpp'],\n>  ]\n>  gstreamer_dep = dependency('gstreamer-1.0', required: true)\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 A000ABF01C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 23 Sep 2021 14:05:14 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0E6806918C;\n\tThu, 23 Sep 2021 16:05:14 +0200 (CEST)","from bhuna.collabora.co.uk (bhuna.collabora.co.uk\n\t[IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7FB4069189\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 23 Sep 2021 16:05:12 +0200 (CEST)","from [127.0.0.1] (localhost [127.0.0.1])\n\t(Authenticated sender: nicolas) with ESMTPSA id ADDA61F4428D"],"Message-ID":"<b4469d63c9eb7ad341bf9be009c82e03d00e61ef.camel@collabora.com>","From":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","To":"Vedant Paranjape <vedantparanjape160201@gmail.com>, \n\tlibcamera-devel@lists.libcamera.org","Date":"Thu, 23 Sep 2021 10:05:01 -0400","In-Reply-To":"<20210923134653.1612991-1-vedantparanjape160201@gmail.com>","References":"<20210923134653.1612991-1-vedantparanjape160201@gmail.com>","Content-Type":"text/plain; charset=\"UTF-8\"","User-Agent":"Evolution 3.40.4 (3.40.4-1.fc34) ","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Subject":"Re: [libcamera-devel] [PATCH v2] test: gstreamer: Add a test for\n\tgstreamer multi stream","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":19819,"web_url":"https://patchwork.libcamera.org/comment/19819/","msgid":"<CACGrz-Oc6wR-OtfMSZFnLOUE8FaNjGPEqvBbafczLZ9RqLBAeA@mail.gmail.com>","date":"2021-09-23T14:50:25","subject":"Re: [libcamera-devel] [PATCH v2] test: gstreamer: Add a test for\n\tgstreamer multi stream","submitter":{"id":85,"url":"https://patchwork.libcamera.org/api/people/85/","name":"Vedant Paranjape","email":"vedantparanjape160201@gmail.com"},"content":"On Thu, Sep 23, 2021 at 7:35 PM Nicolas Dufresne <\nnicolas.dufresne@collabora.com> wrote:\n\n> Le jeudi 23 septembre 2021 à 19:16 +0530, Vedant Paranjape a écrit :\n> > This patch adds a test to test if multi stream using libcamera's\n> > gstreamer element works.\n> >\n> > Test will run only on devices that support multistream output, i.e.,\n> > devices that use IPU3 and raspberrypi pipeline. This was tested on\n> > a Raspberry Pi 4B+.\n> >\n> > Signed-off-by: Vedant Paranjape <vedantparanjape160201@gmail.com>\n> > Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n> > ---\n> >  .../gstreamer/gstreamer_multi_stream_test.cpp | 121 ++++++++++++++++++\n> >  test/gstreamer/meson.build                    |   1 +\n> >  2 files changed, 122 insertions(+)\n> >  create mode 100644 test/gstreamer/gstreamer_multi_stream_test.cpp\n> >\n> > diff --git a/test/gstreamer/gstreamer_multi_stream_test.cpp\n> b/test/gstreamer/gstreamer_multi_stream_test.cpp\n> > new file mode 100644\n> > index 000000000000..5df1dd40388a\n> > --- /dev/null\n> > +++ b/test/gstreamer/gstreamer_multi_stream_test.cpp\n> > @@ -0,0 +1,121 @@\n> > +/* SPDX-License-Identifier: GPL-2.0-or-later */\n> > +/*\n> > + * Copyright (C) 2021, Vedant Paranjape\n> > + *\n> > + * gstreamer_multi_stream_test.cpp - GStreamer multi stream capture test\n> > + */\n> > +\n> > +#include <iostream>\n> > +#include <unistd.h>\n> > +\n> > +#include <libcamera/base/utils.h>\n> > +\n> > +#include <libcamera/libcamera.h>\n> > +\n> > +#include \"libcamera/internal/source_paths.h\"\n> > +\n> > +#include <gst/gst.h>\n> > +\n> > +#include \"gstreamer_test.h\"\n> > +#include \"test.h\"\n> > +\n> > +using namespace std;\n> > +\n> > +class GstreamerMultiStreamTest : public GstreamerTest, public Test\n> > +{\n> > +public:\n> > +     GstreamerMultiStreamTest()\n> > +             : GstreamerTest()\n> > +     {\n> > +     }\n> > +\n> > +protected:\n> > +     int init() override\n> > +     {\n> > +             if (status_ != TestPass)\n> > +                     return status_;\n> > +\n> > +             /* Check if platform support multistream output */\n> > +             libcamera::CameraManager cm;\n> > +             cm.start();\n> > +             bool cameraFound = false;\n> > +             for (auto &camera : cm.cameras()) {\n> > +                     if (camera->streams().size() > 1) {\n> > +                             cameraName = camera->id();\n> > +                             cameraFound = true;\n> > +                             cm.stop();\n> > +                             break;\n> > +                     }\n> > +             }\n> > +\n> > +             if (!cameraFound) {\n> > +                     cm.stop();\n> > +                     return TestSkip;\n> > +             }\n> > +\n> > +             const gchar *streamDescription = \"queue ! fakesink\";\n> > +             g_autoptr(GError) error0 = NULL;\n> > +             g_autoptr(GError) error1 = NULL;\n> > +             stream0_ =\n> gst_parse_bin_from_description_full(streamDescription, TRUE, NULL,\n> GST_PARSE_FLAG_FATAL_ERRORS, &error0);\n> > +             stream1_ =\n> gst_parse_bin_from_description_full(streamDescription, TRUE, NULL,\n> GST_PARSE_FLAG_FATAL_ERRORS, &error1);\n> > +\n> > +             if (!stream0_) {\n> > +                     g_printerr(\"Bin 0 could not be created (%s)\\n\",\n> error0->message);\n> > +                     return TestFail;\n> > +             }\n> > +             if (!stream1_) {\n> > +                     g_printerr(\"Bin 1 could not be created (%s)\\n\",\n> error1->message);\n> > +                     return TestFail;\n> > +             }\n> > +             g_object_ref_sink(stream0_);\n> > +             g_object_ref_sink(stream1_);\n>\n> In general, I refer when things are slightly more grouped together, what\n> do you\n> think of:\n>\n> +               g_autoptr(GError) error = NULL;\n> +\n> +               stream0_ =\n> gst_parse_bin_from_description_full(streamDescription, TRUE, NULL,\n> GST_PARSE_FLAG_FATAL_ERRORS, &error);\n> +               if (!stream0_) {\n> +                       g_printerr(\"Stream 0 could not be created (%s)\\n\",\n> error->message);\n> +                       return TestFail;\n> +               }\n> +               g_object_ref_sink(stream0_);\n> +\n> +               stream1_ =\n> gst_parse_bin_from_description_full(streamDescription, TRUE, NULL,\n> GST_PARSE_FLAG_FATAL_ERRORS, &error);\n> +               if (!stream1_) {\n> +                       g_printerr(\"Stream 1 could not be created (%s)\\n\",\n> error->message);\n> +                       return TestFail;\n> +               }\n> +               g_object_ref_sink(stream1_);\n>\n> p.s. Changed Bin into Stream, I would not get what that means if I saw an\n> error\n> about bin0/1, as the member is named streamX.\n>\n\nThis looks much better. Sending a v3.\n\n> +\n> > +             if (createPipeline() != TestPass)\n> > +                     return TestFail;\n> > +\n> > +             return TestPass;\n> > +     }\n> > +\n> > +     int run() override\n> > +     {\n> > +             g_object_set(libcameraSrc_, \"camera-name\",\n> cameraName.c_str(), NULL);\n> > +\n> > +             /* Build the pipeline */\n> > +             gst_bin_add_many(GST_BIN(pipeline_), libcameraSrc_,\n> > +                                                     stream0_,\n> stream1_, NULL);\n> > +\n> > +             g_autoptr(GstPad) src_pad =\n> gst_element_get_static_pad(libcameraSrc_, \"src\");\n> > +             g_autoptr(GstPad) request_pad =\n> gst_element_get_request_pad(libcameraSrc_, \"src_%u\");\n> > +\n> > +             {\n> > +                     g_autoptr(GstPad) queue0_sink_pad =\n> gst_element_get_static_pad(stream0_, \"sink\");\n> > +                     g_autoptr(GstPad) queue1_sink_pad =\n> gst_element_get_static_pad(stream1_, \"sink\");\n> > +\n> > +                     if (gst_pad_link(src_pad, queue0_sink_pad) !=\n> GST_PAD_LINK_OK\n> > +                             || gst_pad_link(request_pad,\n> queue1_sink_pad) != GST_PAD_LINK_OK) {\n> > +                             g_printerr(\"Pads could not be linked.\\n\");\n> > +                             return TestFail;\n> > +                     }\n> > +             }\n> > +\n> > +             if (startPipeline() != TestPass)\n> > +                     return TestFail;\n> > +\n> > +             if (processEvent() != TestPass)\n> > +                     return TestFail;\n> > +\n> > +             return TestPass;\n> > +     }\n> > +\n> > +     void cleanup() override\n> > +     {\n> > +             g_clear_object(&stream0_);\n> > +             g_clear_object(&stream1_);\n> > +     }\n> > +private:\n> > +     std::string cameraName;\n> > +     GstElement *stream0_;\n> > +     GstElement *stream1_;\n> > +};\n> > +\n> > +TEST_REGISTER(GstreamerMultiStreamTest)\n> > diff --git a/test/gstreamer/meson.build b/test/gstreamer/meson.build\n> > index aca53b920365..13652e87d05c 100644\n> > --- a/test/gstreamer/meson.build\n> > +++ b/test/gstreamer/meson.build\n> > @@ -6,6 +6,7 @@ endif\n> >\n> >  gstreamer_tests = [\n> >      ['single_stream_test',   'gstreamer_single_stream_test.cpp'],\n> > +    ['multi_stream_test',   'gstreamer_multi_stream_test.cpp'],\n> >  ]\n> >  gstreamer_dep = dependency('gstreamer-1.0', required: true)\n> >\n>\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 44C16BDC71\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 23 Sep 2021 14:50:42 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 08A636918E;\n\tThu, 23 Sep 2021 16:50:41 +0200 (CEST)","from mail-qk1-x735.google.com (mail-qk1-x735.google.com\n\t[IPv6:2607:f8b0:4864:20::735])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8EE4169189\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 23 Sep 2021 16:50:39 +0200 (CEST)","by mail-qk1-x735.google.com with SMTP id p4so23085502qki.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 23 Sep 2021 07:50:39 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"ZIDqqUAp\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=SDc7pXa4wggR3iSCoy6NM/+R590qiEPYBnJqTXJEwZo=;\n\tb=ZIDqqUApiKowQTH6Ns09G3H2mtgBCJWrR1hqsL7mDJxDyTSjV4EbQj80k9T5syKuNj\n\t80gcmDPSQ+/J0Lz6CbBcIQ3+XjE3IdMyoxaXoe2VEaxrpSHQR8JOJPSsVfeVcZqi+82D\n\tmdgcIWGGPSWa1kLS+qbCdAVlNqSmUkrMHXxZKouiZEuGAAwMKmhtlWtXIAlJwtyhvyJP\n\tChrSHlk3nMBQdos30fICBNmYnAQcMbV9hEUXjFhG6GPvuRRk+BTH03N/bNZxgA4dPpWG\n\txix59bHXbU7DkPUDP15eJHX4RYIBO45jyn/CaY3iO56JhFbFqKObDk42vFunciINnz3g\n\tP30Q==","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=SDc7pXa4wggR3iSCoy6NM/+R590qiEPYBnJqTXJEwZo=;\n\tb=J09Zq+CLqHSZdbFu9GcK9QOZPrlmDehnIJsYZjfewuHAWRpwnPTSJbunhXawe2jOJ8\n\teEnd3MCKwPWjwewMAKrwEHXaqKPmcAK4dFUX2cyWuCowM0Dc0DH/2R5SV3uIpA+1bTwG\n\t9/j3h4yaVLBvtNlE9BLyeJpu85ZqJhV7U+NKY7+bWBSMICa/muRseNnOZs+C0DIhbNdN\n\tQtmqZQIomTPBz4R1/7uJcUi9ZKDr1by599tHtEySy/F7KNcFBoH4ph6vheA9Y9FBCu5W\n\t8lgAciN5EAj9025Y6+BvPaTYHFhkO8ELPQAcaummvfhdsO26vkLzLrXAFhcM6rE8voup\n\tEWIQ==","X-Gm-Message-State":"AOAM532mfcyIyoAD2zx6FSY+RkZ+Fq+fU6/lrtDHHqQLGAyy0k2O10w0\n\t8MoEkPK9fKoMIINEodocStvLzxsGxbrxl76CfVs=","X-Google-Smtp-Source":"ABdhPJxobcLy7QyFPnvCw7MYwtiUKQYp8suNLqweXu0ZSGJPtOcStZILo5R06CiXggCV6WGJgtGClMajVv/o1lqqJBQ=","X-Received":"by 2002:a25:4507:: with SMTP id s7mr5969030yba.4.1632408637940; \n\tThu, 23 Sep 2021 07:50:37 -0700 (PDT)","MIME-Version":"1.0","References":"<20210923134653.1612991-1-vedantparanjape160201@gmail.com>\n\t<b4469d63c9eb7ad341bf9be009c82e03d00e61ef.camel@collabora.com>","In-Reply-To":"<b4469d63c9eb7ad341bf9be009c82e03d00e61ef.camel@collabora.com>","From":"Vedant Paranjape <vedantparanjape160201@gmail.com>","Date":"Thu, 23 Sep 2021 20:20:25 +0530","Message-ID":"<CACGrz-Oc6wR-OtfMSZFnLOUE8FaNjGPEqvBbafczLZ9RqLBAeA@mail.gmail.com>","To":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","Content-Type":"multipart/alternative; boundary=\"000000000000fe27c405ccaac070\"","Subject":"Re: [libcamera-devel] [PATCH v2] test: gstreamer: Add a test for\n\tgstreamer multi stream","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>","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>"}}]