test: gstreamer: Add a test for gstreamer multi stream
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 <vedantparanjape160201@gmail.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
This commit is contained in:
parent
2cc4303b17
commit
d1713de60a
2 changed files with 125 additions and 0 deletions
124
test/gstreamer/gstreamer_multi_stream_test.cpp
Normal file
124
test/gstreamer/gstreamer_multi_stream_test.cpp
Normal file
|
@ -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 <iostream>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <libcamera/libcamera.h>
|
||||
|
||||
#include <gst/gst.h>
|
||||
|
||||
#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 supports multistream capture */
|
||||
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)
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue