From patchwork Thu Sep 23 14:56:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vedant Paranjape X-Patchwork-Id: 13913 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 3A5A9BF01C for ; Thu, 23 Sep 2021 14:56:55 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9B11B6918C; Thu, 23 Sep 2021 16:56:54 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="QmBqQoWL"; dkim-atps=neutral Received: from mail-pl1-x636.google.com (mail-pl1-x636.google.com [IPv6:2607:f8b0:4864:20::636]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id CDDD569189 for ; Thu, 23 Sep 2021 16:56:52 +0200 (CEST) Received: by mail-pl1-x636.google.com with SMTP id 5so4195960plo.5 for ; Thu, 23 Sep 2021 07:56:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=Zv2QKM+bd2JcPVAgGx74D5pp7oLenyWLiXxjkDy8Avo=; b=QmBqQoWLR0MS81t0xIMWoYwJblMSDSMpDQ3CbIBgo6OD6Z3aTowAvxRikK4AHxi8Rk 5Ye1+GRswNxkOmuG5Uqo9eTn8HsUM1xysGetrnjSl4+CsbT8PcebUemJLiVybLk/n86J kV5BYk71n22akhOs4iZQ2P+eCNaYLqHFOjewYXWKQJ3kam9DUG1b9l7v4u76JlVepBY5 qTEUg1MY2gU7skld7Wvz7u2sOPVJ6bGzmMFHP2Ki4J0DXM5eDYqZhw6z7kc2PyRKKAh8 AqcVWtJuDL2ftApcpW2F62pa+s4hkqzH2MtSFaneYLjL1IB7VQkL5jgF6cUMXm7zJsjs 9eww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=Zv2QKM+bd2JcPVAgGx74D5pp7oLenyWLiXxjkDy8Avo=; b=07XVeLIropuzgMkPnk9mBZP6gpOhXrJYlIj3WfKAC8lYE0jZIkzk/MckhJ0dFKonHn 8XSt5ZaZON5GhmjU0PQTagHxRuR/Ik37rkSnvAJ1UQ5L4gA0OhSgAg9pm0Ep39mS67Tb okHkineDW+Uj5/7pepW8kKzfwnjyYgQPMSdIvsOQn85Fyx9O/9PEsvD8xUujMly1nL6v 76XAx6Ln4JPM89NL9qXPcEXjWsPV/FiI/2f/k1PEPdhUUhmERch4d3jk5MW/9VqnuK2w BE1jis933b8EK3XflsIQ03QKkuM2ViDxZFSoLo9wNQVi+oIwndBSE0UQT8G2rPeNdrP/ DLtA== X-Gm-Message-State: AOAM532Hg/1/eVLH71iXA4lvKXjP6Cpamn+BX4IsE0s4/bWB+LNuPGor Duhm2yAztKgqh0Xit5kE7ZUcbx5dw49f0D6M X-Google-Smtp-Source: ABdhPJzN8mtc5D2wZLC4aoY5iZT1UPm5D4gMv8XI9s8acZ2i773d2Vm0FTYcMA8ucKzGdNULHHsNZw== X-Received: by 2002:a17:90b:3b4f:: with SMTP id ot15mr18608389pjb.243.1632409010956; Thu, 23 Sep 2021 07:56:50 -0700 (PDT) Received: from localhost.localdomain ([1.186.166.66]) by smtp.googlemail.com with ESMTPSA id q3sm6886039pgf.18.2021.09.23.07.56.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Sep 2021 07:56:50 -0700 (PDT) From: Vedant Paranjape To: libcamera-devel@lists.libcamera.org Date: Thu, 23 Sep 2021 20:26:37 +0530 Message-Id: <20210923145637.1685366-1-vedantparanjape160201@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3] test: gstreamer: Add a test for gstreamer multi stream X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nicolas Dufresne , Vedant Paranjape Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" This patch adds a test to test if multi stream using libcamera's gstreamer element works. Test will run only on devices that support multistream output, i.e., devices that use IPU3 and raspberrypi pipeline. This was tested on a Raspberry Pi 4B+. Signed-off-by: Vedant Paranjape Reviewed-by: Nicolas Dufresne --- .../gstreamer/gstreamer_multi_stream_test.cpp | 128 ++++++++++++++++++ test/gstreamer/meson.build | 1 + 2 files changed, 129 insertions(+) create mode 100644 test/gstreamer/gstreamer_multi_stream_test.cpp diff --git a/test/gstreamer/gstreamer_multi_stream_test.cpp b/test/gstreamer/gstreamer_multi_stream_test.cpp new file mode 100644 index 000000000000..6f63f1e748e2 --- /dev/null +++ b/test/gstreamer/gstreamer_multi_stream_test.cpp @@ -0,0 +1,128 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2021, Vedant Paranjape + * + * gstreamer_multi_stream_test.cpp - GStreamer multi stream capture test + */ + +#include +#include + +#include + +#include + +#include "libcamera/internal/source_paths.h" + +#include + +#include "gstreamer_test.h" +#include "test.h" + +using namespace std; + +class GstreamerMultiStreamTest : public GstreamerTest, public Test +{ +public: + GstreamerMultiStreamTest() + : GstreamerTest() + { + } + +protected: + int init() override + { + if (status_ != TestPass) + return status_; + + /* Check if platform support multistream output */ + libcamera::CameraManager cm; + cm.start(); + bool cameraFound = false; + for (auto &camera : cm.cameras()) { + if (camera->streams().size() > 1) { + cameraName = camera->id(); + cameraFound = true; + cm.stop(); + break; + } + } + + if (!cameraFound) { + cm.stop(); + return TestSkip; + } + + const gchar *streamDescription = "queue ! fakesink"; + g_autoptr(GError) error = NULL; + + stream0_ = gst_parse_bin_from_description_full(streamDescription, TRUE, + NULL, + GST_PARSE_FLAG_FATAL_ERRORS, + &error); + if (!stream0_) { + g_printerr("Stream0 could not be created (%s)\n", error->message); + return TestFail; + } + g_object_ref_sink(stream0_); + + stream1_ = gst_parse_bin_from_description_full(streamDescription, TRUE, + NULL, + GST_PARSE_FLAG_FATAL_ERRORS, + &error); + if (!stream1_) { + g_printerr("Stream1 could not be created (%s)\n", error->message); + return TestFail; + } + g_object_ref_sink(stream1_); + + if (createPipeline() != TestPass) + return TestFail; + + return TestPass; + } + + int run() override + { + g_object_set(libcameraSrc_, "camera-name", cameraName.c_str(), NULL); + + /* Build the pipeline */ + gst_bin_add_many(GST_BIN(pipeline_), libcameraSrc_, + stream0_, stream1_, NULL); + + g_autoptr(GstPad) src_pad = gst_element_get_static_pad(libcameraSrc_, "src"); + g_autoptr(GstPad) request_pad = gst_element_get_request_pad(libcameraSrc_, "src_%u"); + + { + g_autoptr(GstPad) queue0_sink_pad = gst_element_get_static_pad(stream0_, "sink"); + g_autoptr(GstPad) queue1_sink_pad = gst_element_get_static_pad(stream1_, "sink"); + + if (gst_pad_link(src_pad, queue0_sink_pad) != GST_PAD_LINK_OK + || gst_pad_link(request_pad, queue1_sink_pad) != GST_PAD_LINK_OK) { + g_printerr("Pads could not be linked.\n"); + return TestFail; + } + } + + if (startPipeline() != TestPass) + return TestFail; + + if (processEvent() != TestPass) + return TestFail; + + return TestPass; + } + + void cleanup() override + { + g_clear_object(&stream0_); + g_clear_object(&stream1_); + } + +private: + std::string cameraName; + GstElement *stream0_; + GstElement *stream1_; +}; + +TEST_REGISTER(GstreamerMultiStreamTest) diff --git a/test/gstreamer/meson.build b/test/gstreamer/meson.build index aca53b920365..13652e87d05c 100644 --- a/test/gstreamer/meson.build +++ b/test/gstreamer/meson.build @@ -6,6 +6,7 @@ endif gstreamer_tests = [ ['single_stream_test', 'gstreamer_single_stream_test.cpp'], + ['multi_stream_test', 'gstreamer_multi_stream_test.cpp'], ] gstreamer_dep = dependency('gstreamer-1.0', required: true)