gst_element_set_state blocks when setting GST_STATE_NULL when using vaapisink and QWidget

Viljar Hera viljar.hera at gmail.com
Tue Nov 9 10:11:55 UTC 2021


Oops,

switch (gst_element_set_state(pipeline, GST_STATE_PLAYING)) // <-
blocks indefinitely

that comment landed on wrong place, should be:


switch (gst_element_set_state(pipelines[i], GST_STATE_NULL)) // <-
blocks indefinitely


Kontakt meistrimees--- via gstreamer-devel (<
gstreamer-devel at lists.freedesktop.org>) kirjutas kuupäeval T, 9. november
2021 kell 11:55:

>
> I prepared a simple test program that I could reproduce the issue. I have
> tested with latest stable version of GStreamer 1.18.5, using radeonsi
> driver, but it will probably happen with Intel drivers as well.
> Increasing the number of  pipeline-s will increase the chance of getting
> one of them stuck on teardown.
>
> I'm considering opening a bugreport, but I want a second opinion before I
> do. Maybe I'm missing something here.
>
> #include <QApplication>
>
> #include <QDebug>
>
> #include <QWidget>
>
> #include <QGridLayout>
>
>
> #include <gst/gst.h>
>
> #include <gst/video/videooverlay.h>
>
>
> int main(int argc, char *argv[])
>
> {
>
>   gst_init(0, 0);
>
>
>   QApplication app(argc, argv);
>
>   app.connect(&app, &QApplication::lastWindowClosed, &app, &QApplication::quit);
>
>
>   // We will arrenge videoWidgets into the colums and rows
>
>   QWidget mainWidget;
>
>   QGridLayout *layout = new QGridLayout;
>
>   layout->setHorizontalSpacing(0);
>
>   mainWidget.setLayout(layout);
>
>
>   int streamCount = 9;
>
>   int rowCount = 3;
>
>   int colCount = streamCount % rowCount == 0 ? streamCount / rowCount : streamCount / rowCount + 1;
>
>
>   const char *pipelineStr = "videotestsrc ! vaapisink name=\"thesink\"";
>
>   QVector<GstElement *> pipelines;
>
>
>   for (int i = 0; i < streamCount; ++i)
>
>   {
>
>     GError *error = NULL;
>
>     GstElement *pipeline = gst_parse_launch(pipelineStr, &error);
>
>
>     if (error) {
>
>       qInfo() << "Error: " << error->message;
>
>       g_clear_error(&error);
>
>     }
>
>
>     if (!pipeline) {
>
>       qInfo() << "Unable to create pipeline";
>
>       continue;
>
>     }
>
>
>     GstElement *sink = gst_bin_get_by_name(GST_BIN(pipeline), "thesink");
>
>
>     if (!sink)
>
>     {
>
>       qInfo() << "Failed to get vaapisink element";
>
>       continue;
>
>     }
>
>
>     QWidget *videoWidget = new QWidget();
>
>     layout->addWidget(videoWidget, i / colCount, i % colCount);
>
>
>     if (sink)
>
>     {
>
>       gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(sink), videoWidget->winId());
>
>       g_object_unref(sink);
>
>     }
>
>
>     switch (gst_element_set_state(pipeline, GST_STATE_PLAYING)) // <- blocks indefinitely
>
>     {
>
>     case GST_STATE_CHANGE_FAILURE:
>
>       qInfo() << "Failed to start pipeline" << i;
>
>       break;
>
>     case GST_STATE_CHANGE_SUCCESS:
>
>       qInfo() << "Pipeline" << i << "started";
>
>       break;
>
>     case GST_STATE_CHANGE_ASYNC:
>
>       qInfo() << "Pipeline" << i << "is starting";
>
>       break;
>
>     case GST_STATE_CHANGE_NO_PREROLL:
>
>       qInfo() << "Pipeline" << i << "started, but no data yet";
>
>       break;
>
>     default:
>
>        qInfo() << "Unknown value";
>
>       break;
>
>     }
>
>
>     pipelines.append(pipeline);
>
>   }
>
>
>   mainWidget.resize(1280, 720);
>
>   mainWidget.showMaximized();
>
>
>   int ret = app.exec();
>
>
>   qInfo() << "Terminating";
>
>   mainWidget.hide();
>
>
>   for (int i = 0; i < pipelines.size(); ++i) {
>
>     qInfo() << "Stopping pipeline" << i;
>
>     switch (gst_element_set_state(pipelines[i], GST_STATE_NULL))
>
>     {
>
>     case GST_STATE_CHANGE_FAILURE:
>
>       qInfo() << "Failed to stop pipeline" << i;
>
>       break;
>
>     case GST_STATE_CHANGE_SUCCESS:
>
>       qInfo() << "Pipeline" << i << "stopped";
>
>       break;
>
>     case GST_STATE_CHANGE_ASYNC:
>
>       qInfo() << "Pipeline" << i << "is stopping";
>
>       break;
>
>     case GST_STATE_CHANGE_NO_PREROLL:
>
>       qInfo() << "Preroll" << i;
>
>       break;
>
>     default:
>
>        qInfo() << "Unknown value";
>
>       break;
>
>     }
>
>
>     g_object_unref(pipelines[i]);
>
>   }
>
>
>   return ret;
>
> }
>
>
> If someone could confirm the issue I would open a bug report.
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20211109/ccf16a17/attachment-0001.htm>


More information about the gstreamer-devel mailing list