17static QGstElement makeVideoConvertScale(
const char *name)
19 QGstElementFactoryHandle factory = QGstElement::findFactory(
"videoconvertscale");
21 return QGstElement::createFromFactory(factory, name);
23 return QGstBin::createFromPipelineDescription(
"videoconvert ! videoscale", name,
29 QGstElementFactoryHandle factory = QGstElement::findFactory(
"videoconvertscale");
31 static std::optional<QString> elementCheck = []() -> std::optional<QString> {
32 std::optional<QString> error = qGstErrorMessageIfElementsNotAvailable(
"fakesink",
"queue");
36 QGstElementFactoryHandle factory = QGstElement::findFactory(
"videoconvertscale");
40 return qGstErrorMessageIfElementsNotAvailable(
"videoconvert",
"videoscale");
44 return q23::unexpected{ *elementCheck };
82 using namespace std::chrono_literals;
84 auto *gstSink = sink ?
static_cast<
QGstreamerVideoSink *>(sink->platformVideoSink()) :
nullptr;
85 if (gstSink == m_platformVideoSink)
88 m_platformVideoSink = gstSink;
89 if (m_platformVideoSink) {
90 m_platformVideoSink->setActive(m_isActive);
91 if (m_nativeSize.isValid())
92 m_platformVideoSink->setNativeSize(m_nativeSize);
95 if (m_platformVideoSink) {
96 videoSink = m_platformVideoSink->gstSink();
100 videoSink.set(
"sync",
true);
103 QObject::disconnect(m_subtitleConnection);
105 m_subtitleConnection = QObject::connect(
this, &QGstreamerVideoOutput::subtitleChanged, sink,
106 [sink](
const QString &subtitle) {
107 sink->setSubtitleText(subtitle);
109 sink->setSubtitleText(m_lastSubtitleString);
112 if (m_videoSink == videoSink)
115 m_videoConvertScale.src().modifyPipelineInIdleProbe([&] {
117 m_outputBin.stopAndRemoveElements(m_videoSink);
119 m_videoSink = std::move(videoSink);
120 m_outputBin.add(m_videoSink);
122 qLinkGstElements(m_videoConvertScale, m_videoSink);
124 GstEvent *event = gst_event_new_reconfigure();
125 gst_element_send_event(m_videoSink.element(), event);
126 m_videoSink.syncStateWithParent();
129 qCDebug(qLcMediaVideoOutput) <<
"sinkChanged" << m_videoSink.name();
130 m_videoConvertScale.dumpPipelineGraph(m_videoSink.name().constData());