<div dir="ltr"><div><div>I'm trying to use the qmlglsink together with the GstGLVideoItem to display video from an IP camera.  My target is an imx6q system using EGLFS and I've based my code on the example from here:<br><br>    <a href="https://github.com/GStreamer/gst-plugins-bad/tree/master/tests/examples/qt/qmlsink">https://github.com/GStreamer/gst-plugins-bad/tree/master/tests/examples/qt/qmlsink</a><br><br></div>I am creating a gstreamer pipeline like so:<br><br></div><div style="margin-left:40px"><span style="font-family:monospace,monospace">VideoPlayerImpl::VideoPlayerImpl(const QString& uri)</span><br><span style="font-family:monospace,monospace">{</span><br><span style="font-family:monospace,monospace"></span><span style="font-family:monospace,monospace">    GError* error = nullptr;</span><br><span style="font-family:monospace,monospace">    m_pipeline = gst_element_factory_make("playbin", "playbin");</span><br><span style="font-family:monospace,monospace">    if (error || !m_pipeline)</span><br><span style="font-family:monospace,monospace">    {</span><br><span style="font-family:monospace,monospace">        CleanUp();</span><br><span style="font-family:monospace,monospace">        throw std::runtime_error(error->message);</span><br><span style="font-family:monospace,monospace">    }</span><br><span style="font-family:monospace,monospace"></span><br><span style="font-family:monospace,monospace">    m_bus = gst_element_get_bus(m_pipeline);</span><br><span style="font-family:monospace,monospace">    gst_bus_add_signal_watch(m_bus);</span><br><span style="font-family:monospace,monospace">    g_signal_connect(m_bus,      "message",      G_CALLBACK(VideoPlayerImpl::OnBusMessage),         this);</span><br><span style="font-family:monospace,monospace">    g_signal_connect(m_pipeline, "source-setup", G_CALLBACK(VideoPlayerImpl::OnSourceSetupWrapper), this);</span><br><span style="font-family:monospace,monospace"></span><br><span style="font-family:monospace,monospace">    m_sink = gst_element_factory_make("qmlglsink", "qmlglsink");</span><br><span style="font-family:monospace,monospace">    if (m_sink)</span><br><span style="font-family:monospace,monospace">    {</span><br><span style="font-family:monospace,monospace">        g_object_set(m_sink, "sync", false, nullptr);</span><br><span style="font-family:monospace,monospace">    }</span><br><span style="font-family:monospace,monospace">    else</span><br><span style="font-family:monospace,monospace">    {</span><br><span style="font-family:monospace,monospace">        qDebug() << "Failed to create video sink";</span><br><span style="font-family:monospace,monospace">    }</span><br><span style="font-family:monospace,monospace"></span><br><span style="font-family:monospace,monospace">    g_object_set(m_pipeline,</span><br><span style="font-family:monospace,monospace">                 "flags",               GST_PLAY_FLAG_VIDEO,      // play only the video (no audio or subtitles)</span><br><span style="font-family:monospace,monospace">                 "force-aspect-ratio",  false,</span><br><span style="font-family:monospace,monospace">                 "uri",                 uri.toStdString().c_str(),</span><br><span style="font-family:monospace,monospace">                 "video-sink",          m_sink, </span><br><span style="font-family:monospace,monospace">                 nullptr);</span><br><span style="font-family:monospace,monospace">}<br><br>void VideoPlayer::SetVideoItem(QQuickItem* videoItem) { g_object_set(m_impl->m_sink, "widget", videoItem, nullptr); }<br></span></div><div><br></div><div>and then in my main program I create the QML side of things and attempt to set the pipeline playing.  The problem is that the pipeline never starts playing.  A call to gst_element_get_state shows that the state is GST_STATE_CHANGE_ASYNC with the pending state GST_STATE_PLAYING but it seems to be stuck in the pending state.  The main code is as follows:<br><br><div style="margin-left:40px"><span style="font-family:monospace,monospace">int main(int argc, char* argv[])</span><br><span style="font-family:monospace,monospace">{</span><br><span style="font-family:monospace,monospace">    gst_init(&argc, &argv);</span><br><span style="font-family:monospace,monospace">    // the plugin must be loaded before loading the qml file to register the GstGLVideoItem qml item</span><br><span style="font-family:monospace,monospace">    GstElement* sink = gst_element_factory_make ("qmlglsink", nullptr);</span><br><span style="font-family:monospace,monospace"></span><br><span style="font-family:monospace,monospace">    MyApp app(argc, argv);</span><br><span style="font-family:monospace,monospace">    int ret = app.exec();</span><br><span style="font-family:monospace,monospace">    return 0;</span><br><span style="font-family:monospace,monospace">}</span><br><span style="font-family:monospace,monospace"></span><br><span style="font-family:monospace,monospace">//--------------------------------------------------------------------------------------------------</span><br><span style="font-family:monospace,monospace"></span><br><span style="font-family:monospace,monospace">class MyApp : public QGuiApplication</span><br><span style="font-family:monospace,monospace">{</span><br><span style="font-family:monospace,monospace">public:</span><br><span style="font-family:monospace,monospace">    MyApp(int argc, char* argv[]);</span><br><span style="font-family:monospace,monospace">public slots:</span><br><span style="font-family:monospace,monospace">    void OnTimer();</span><br><span style="font-family:monospace,monospace">private:</span><br><span style="font-family:monospace,monospace">    void CreatePlayer(const char* url);</span><br><span style="font-family:monospace,monospace"></span><br><span style="font-family:monospace,monospace">    QQmlApplicationEngine m_engine;</span><br><span style="font-family:monospace,monospace">    QQuickWindow*   m_rootObject;</span><br><span style="font-family:monospace,monospace">    QQuickItem*     m_videoItem;</span><br><span style="font-family:monospace,monospace">    VideoPlayer*    m_player;</span><br><span style="font-family:monospace,monospace">};</span><br><span style="font-family:monospace,monospace"></span><br><span style="font-family:monospace,monospace">//--------------------------------------------------------------------------------------------------</span><br><span style="font-family:monospace,monospace"></span><br><span style="font-family:monospace,monospace">MyApp::MyApp(int argc, char* argv[]) </span><span style="font-family:monospace,monospace">: QGuiApplication(argc, argv)</span><br><span style="font-family:monospace,monospace">{</span><br><span style="font-family:monospace,monospace">    m_engine.load(QUrl(QStringLiteral("qrc:/main.qml")));</span><br><span style="font-family:monospace,monospace"></span><br><span style="font-family:monospace,monospace">    // find and set the videoItem on the sink</span><br><span style="font-family:monospace,monospace">    m_rootObject = static_cast<QQuickWindow *> (m_engine.rootObjects().first());</span><br><span style="font-family:monospace,monospace">    m_videoItem = m_rootObject->findChild<QQuickItem *>("videoItem");</span><br><span style="font-family:monospace,monospace">    g_assert(m_videoItem);</span><br><span style="font-family:monospace,monospace"></span><br><span style="font-family:monospace,monospace">    CreatePlayer("rtsp://<a href="http://username:password@172.16.17.11/ch1/main">username:password@172.16.17.11/ch1/main</a>");</span><br><span style="font-family:monospace,monospace"></span><br><span style="font-family:monospace,monospace">//    m_rootObject->scheduleRenderJob (new SetPlaying (pipeline), QQuickWindow::BeforeSynchronizingStage);</span><br><span style="font-family:monospace,monospace">}</span><br><span style="font-family:monospace,monospace"></span><br><span style="font-family:monospace,monospace">//--------------------------------------------------------------------------------------------------</span><br><span style="font-family:monospace,monospace"></span><br><span style="font-family:monospace,monospace">void MyApp::CreatePlayer(const char* url)</span><br><span style="font-family:monospace,monospace">{</span><br><span style="font-family:monospace,monospace">    m_player = new VideoPlayer (url);</span><br><span style="font-family:monospace,monospace">    m_player->SetVideoItem(m_videoItem);</span><br><span style="font-family:monospace,monospace">    m_player->Play();</span><br><span style="font-family:monospace,monospace">    int maxLoops = 3;</span><br><span style="font-family:monospace,monospace">    while (maxLoops != 0 && !m_player->IsPlaying())</span><br><span style="font-family:monospace,monospace">    {</span><br><span style="font-family:monospace,monospace">        qDebug() << "   not playing yet, sleeping 3 seconds";</span><br><span style="font-family:monospace,monospace">        sleep(3);</span><br><span style="font-family:monospace,monospace">        maxLoops--;</span><br><span style="font-family:monospace,monospace">    }</span><br><span style="font-family:monospace,monospace">    qDebug() << (m_player->IsPlaying() ? "Stream is now playing" : "Failed to set stream state to playing");</span><br><span style="font-family:monospace,monospace">}<br><br></span><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace">//--------------------------------------------------------------------------------------------------</span><br></span></div><div style="margin-left:40px"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"></span>// main.qml<br></span></div><div style="margin-left:40px"><span style="font-family:monospace,monospace"><span style="font-family:monospace,monospace"></span>import QtQuick 2.4<br>import QtQuick.Controls 1.1<br>import QtQuick.Controls.Styles 1.3<br>import QtQuick.Dialogs 1.2<br>import QtQuick.Window 2.1<br><br>import org.freedesktop.gstreamer.GLVideoItem 1.0<br><br>ApplicationWindow<br>{<br>    id: window<br>    visible: true<br>    width: 640<br>    height: 480<br>    x: 30<br>    y: 30<br>    color: "blue"<br><br>    Item<br>    {<br>        anchors.fill: parent<br>        opacity: 0.5<br><br>        GstGLVideoItem<br>        {<br>            id: video<br>            objectName: "videoItem"<br>            anchors.centerIn: parent<br>            width: parent.width<br>            height: parent.height<br>        }<br>    }<br>}<br></span></div><br></div><div>I've tried using a different sink without the QML side of things and that displays okay so the problem seems to be related to the qmlglsink/GstGLVideoItem side of things.  Any ideas on why the pipeline never transitions to the playing state ?  <br><br>--<br></div><div>Glenn<br><br></div></div>