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 if (sink == m_gstVideoSink)
87 m_gstVideoSink = sink;
89 m_gstVideoSink->setActive(m_isActive);
90 if (m_nativeSize.isValid())
91 m_gstVideoSink->setNativeSize(m_nativeSize);
95 videoSink = m_gstVideoSink->gstSink();
99 videoSink.set(
"sync",
true);
102 QObject::disconnect(m_subtitleConnection);
104 m_subtitleConnection = QObject::connect(
this, &QGstreamerVideoOutput::subtitleChanged, sink,
105 [sink](
const QString &subtitle) {
106 sink->setSubtitleText(subtitle);
108 sink->setSubtitleText(m_lastSubtitleString);
111 if (m_videoSink == videoSink)
114 m_videoConvertScale.src().modifyPipelineInIdleProbe([&] {
116 m_outputBin.stopAndRemoveElements(m_videoSink);
118 m_videoSink = std::move(videoSink);
119 m_outputBin.add(m_videoSink);
121 qLinkGstElements(m_videoConvertScale, m_videoSink);
123 GstEvent *event = gst_event_new_reconfigure();
124 gst_element_send_event(m_videoSink.element(), event);
125 m_videoSink.syncStateWithParent();
128 qCDebug(qLcMediaVideoOutput) <<
"sinkChanged" << m_videoSink.name();
129 m_videoConvertScale.dumpPipelineGraph(m_videoSink.name().constData());