From patchwork Fri Sep 24 08:38:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vedant Paranjape X-Patchwork-Id: 13915 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 DEFCCBDC71 for ; Fri, 24 Sep 2021 08:38:43 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 492946918C; Fri, 24 Sep 2021 10:38:43 +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="eFUXLdv7"; dkim-atps=neutral Received: from mail-pg1-x52e.google.com (mail-pg1-x52e.google.com [IPv6:2607:f8b0:4864:20::52e]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C4E1669186 for ; Fri, 24 Sep 2021 10:38:41 +0200 (CEST) Received: by mail-pg1-x52e.google.com with SMTP id h3so9201830pgb.7 for ; Fri, 24 Sep 2021 01:38:41 -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=jeroYbT5KgzVxEr5O9znVCb1/rD84k/duYTn3HfB+oI=; b=eFUXLdv7F0NKs7+1e7aVbTGpzTkiLf9bBXvZJd/TQCYbgHFjeOsmTyC/F2A6hRZ9CY 6i2WHYYmklhCLhfYeSjErD0P6C2azjS2Oq7b/NCjghwg0dv1aVVtEgMQUkmDQxA0zqJY iA9TYfQQBsDjgLgJ8kSQKzqwvIL0Pbmd3RGMHrY3wzaPAk8RzlzDivd1Wr26wUECpvD/ f6SpaDXTxMPFf0XTaeKNW/YdD+i9674R3Z4MhKQsv+myTBVuGQO2kx3jZc1jmsp1NOtR //053cK51CyWIrk4w1PvPxrpxltRcGSmVXIIQ0erxFm+VzXcsE+yF1bwPsgg5JQoh39t LhBw== 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=jeroYbT5KgzVxEr5O9znVCb1/rD84k/duYTn3HfB+oI=; b=RCbB2d50xegmPv+PWmAZ3jaYmHTPjhdgZvJd8s4AiaHyhw30Ute2U8sQVayFhHCtIp PFtJMIn+Sm/evnh/3Y1vUGNs71PyucgxXmqvlUiR+DpUmN3m+pfSjuS+yzre56Tc9uio 2sZRvJ1kFDsmNFm19Y9/IUWBaFPsgvJ05+QQQgPXqNkeIOliUiq2uHefqOsgNZGbXKuu OnVW82lAWjGsDAX39C62bVTn42FUzCHxotEg0i2ZqrMD3pYZOFOOIGQSxyK2UGHa+EDs 3R9fw+G7zspkPRxBmJ7RyHtcO+Rpn7vaYRbblPtyL9Qc9rYd8dmysKEo9yont/SOnQe9 FMLw== X-Gm-Message-State: AOAM533dyZXtFzTcY68CG70k4Kw2MbLp005cfdzVuboP1kw1yPd2bdic WGSZJcOF5L7pBrUXObKZqQBsV6g23YqkUy6r X-Google-Smtp-Source: ABdhPJyhMI+++Old/VWwwFpPOi+DNIz4/67UkjaWTUTR+rITyYzuhkSR8b94o04ouKistnqSmXBk/A== X-Received: by 2002:a63:e516:: with SMTP id r22mr2807036pgh.197.1632472719811; Fri, 24 Sep 2021 01:38:39 -0700 (PDT) Received: from localhost.localdomain ([1.186.166.87]) by smtp.googlemail.com with ESMTPSA id r193sm8031281pfc.197.2021.09.24.01.38.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Sep 2021 01:38:39 -0700 (PDT) From: Vedant Paranjape To: libcamera-devel@lists.libcamera.org Date: Fri, 24 Sep 2021 14:08:21 +0530 Message-Id: <20210924083821.1877829-1-vedantparanjape160201@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4] 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 capture, eg., devices that use IPU3 and raspberrypi pipeline. This was tested on a Raspberry Pi 4B+. Signed-off-by: Vedant Paranjape Reviewed-by: Nicolas Dufresne Reviewed-by: Paul Elder --- .../gstreamer/gstreamer_multi_stream_test.cpp | 124 ++++++++++++++++++ test/gstreamer/meson.build | 1 + 2 files changed, 125 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..6a9a6f2509cb --- /dev/null +++ b/test/gstreamer/gstreamer_multi_stream_test.cpp @@ -0,0 +1,124 @@ +/* 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 "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..10058fc5206f 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)