4#include <QtMultimedia/qvideosink.h>
6#include <QtCore/qloggingcategory.h>
7#include <QtCore/qthread.h>
23 gst_element_factory_find(
"videoconvertscale"),
41 videoSink.
set(
"sync",
true);
56 videoSink.set(
"sync",
true);
57 videoSink.set(
"async",
false);
60 gstVideoOutput.add(videoQueue, videoConvert, videoScale, videoSink);
63 gstVideoOutput.add(videoQueue, videoConvert, videoSink);
67 gstVideoOutput.addGhostPad(videoQueue,
"sink");
78 if (gstVideoSink == m_videoSink)
84 m_videoSink = gstVideoSink;
92 gstSink = m_videoSink->
gstSink();
96 gstSink.
set(
"sync",
true);
97 gstSink.
set(
"async",
false);
100 if (videoSink == gstSink)
108 gstVideoOutput.
add(videoSink);
115 GstEvent *
event = gst_event_new_reconfigure();
119 doLinkSubtitleStream();
122 qCDebug(qLcMediaVideoOutput) <<
"sinkChanged" << gstSink.
name();
124 GST_DEBUG_BIN_TO_DOT_FILE(gstPipeline.
bin(),
125 GstDebugGraphDetails( GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE |
126 GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS | GST_DEBUG_GRAPH_SHOW_STATES),
133 gstPipeline = pipeline;
140 qCDebug(qLcMediaVideoOutput) <<
"link subtitle stream" <<
src.isNull();
141 if (
src == subtitleSrc)
146 doLinkSubtitleStream();
154 qCDebug(qLcMediaVideoOutput) <<
"unlink subtitle stream";
156 if (!subtitleSink.
isNull()) {
167void QGstreamerVideoOutput::doLinkSubtitleStream()
169 if (!subtitleSink.
isNull()) {
173 if (!m_videoSink || subtitleSrc.
isNull())
175 if (subtitleSink.
isNull()) {
177 gstPipeline.
add(subtitleSink);
182void QGstreamerVideoOutput::updateNativeSize()
194 videoQueue.
set(
"leaky", 2 );
195 videoQueue.
set(
"silent",
true);
196 videoQueue.
set(
"max-size-buffers",
uint(1));
197 videoQueue.
set(
"max-size-bytes",
uint(0));
203 if (!subtitleSink.
isNull()) {
204 auto pad = subtitleSink.
staticPad(
"sink");
205 auto *
event = gst_event_new_flush_start();
206 pad.sendEvent(
event);
207 event = gst_event_new_flush_stop(
false);
208 pad.sendEvent(
event);
226#include "moc_qgstreamervideooutput_p.cpp"
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void add)(const Ts &...ts)
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void stopAndRemoveElements)(Ts... ts)
GstElement * element() const
bool setStateSync(GstState state, std::chrono::nanoseconds timeout=std::chrono::seconds(1))
bool syncStateWithParent()
QGstPad staticPad(const char *name) const
static QGstElement createFromFactory(const char *factory, const char *name=nullptr)
const char * name() const
void set(const char *property, const char *str)
void modifyPipelineWhileNotRunning(Functor &&fn)
void setPipeline(const QGstPipeline &pipeline)
void setNativeSize(QSize)
void linkSubtitleStream(QGstElement subtitleSrc)
void setVideoSink(QVideoSink *sink)
void setRotation(QtVideo::Rotation)
void unlinkSubtitleStream()
void setPipeline(QGstPipeline pipeline)
QGstElement subtitleSink() const
constexpr bool isValid() const noexcept
Returns true if both the width and height is equal to or greater than 0; otherwise returns false.
The QVideoSink class represents a generic sink for video data.
Combined button and popup list for selecting options.
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void qLinkGstElements)(const Ts &...ts)
QString errorMessageCannotFindElement(std::string_view element)
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)
GLsizei GLenum GLboolean sink
GLenum GLenum GLenum GLenum GLenum scale
unsigned long long quint64
QItemEditorFactory * factory