diff options
author | VaL Doroshchuk <valentyn.doroshchuk@qt.io> | 2018-06-26 16:18:35 +0200 |
---|---|---|
committer | VaL Doroshchuk <valentyn.doroshchuk@qt.io> | 2018-08-30 10:13:35 +0000 |
commit | 35ace9e289dcaada5e0828a59ca7dfee78a6342c (patch) | |
tree | 3132cb84abb0df2f347e47edb2b196ec0727d218 /src/gsttools/qgstvideorenderersink.cpp | |
parent | 11b90699d2f355f6223a21a9e8491963903cb635 (diff) | |
download | qtmultimedia-35ace9e289dcaada5e0828a59ca7dfee78a6342c.tar.gz |
Gstreamer: Introduce custom pipeline
Added an ability to define custom pipeline.
Since new pipeline is used, playbin features will not work.
Registered "qtvideosink" gstreamer element to be used in pipelines.
In case if there is a need to render to QML VideoOutput element.
I.e. if a pipeline is "videotestsrc ! qtvideosink" then QGstVideoRendererSink
will be used as a sink and rendering will be done by one of QSGVideoNode's.
In this case there is a need to create a pipeline after video surface is ready.
Also added an ability to override default video sink and define custom one instead.
QGstreamerVideoRendererInterface::setVideoSink() provides functionality to override default one.
QGstreamerPlayerSession::rendererChanged() can be used to check if the renderer is ready
to create a pipeline or set custom video sink.
Task-number: QTBUG-39327
Change-Id: I635d3a07fb9a5dcf30ee63284a849b0ad3438536
Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
Diffstat (limited to 'src/gsttools/qgstvideorenderersink.cpp')
-rw-r--r-- | src/gsttools/qgstvideorenderersink.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/gsttools/qgstvideorenderersink.cpp b/src/gsttools/qgstvideorenderersink.cpp index 4c73c26a3..09fdd42a6 100644 --- a/src/gsttools/qgstvideorenderersink.cpp +++ b/src/gsttools/qgstvideorenderersink.cpp @@ -394,21 +394,27 @@ void QVideoSurfaceGstDelegate::updateSupportedFormats() } static GstVideoSinkClass *sink_parent_class; +static QAbstractVideoSurface *current_surface; #define VO_SINK(s) QGstVideoRendererSink *sink(reinterpret_cast<QGstVideoRendererSink *>(s)) QGstVideoRendererSink *QGstVideoRendererSink::createSink(QAbstractVideoSurface *surface) { + setSurface(surface); QGstVideoRendererSink *sink = reinterpret_cast<QGstVideoRendererSink *>( g_object_new(QGstVideoRendererSink::get_type(), 0)); - sink->delegate = new QVideoSurfaceGstDelegate(surface); - g_signal_connect(G_OBJECT(sink), "notify::show-preroll-frame", G_CALLBACK(handleShowPrerollChange), sink); return sink; } +void QGstVideoRendererSink::setSurface(QAbstractVideoSurface *surface) +{ + current_surface = surface; + get_type(); +} + GType QGstVideoRendererSink::get_type() { static GType type = 0; @@ -430,6 +436,10 @@ GType QGstVideoRendererSink::get_type() type = g_type_register_static( GST_TYPE_VIDEO_SINK, "QGstVideoRendererSink", &info, GTypeFlags(0)); + + // Register the sink type to be used in custom piplines. + // When surface is ready the sink can be used. + gst_element_register(nullptr, "qtvideosink", GST_RANK_PRIMARY, type); } return type; @@ -453,6 +463,11 @@ void QGstVideoRendererSink::class_init(gpointer g_class, gpointer class_data) GstElementClass *element_class = reinterpret_cast<GstElementClass *>(g_class); element_class->change_state = QGstVideoRendererSink::change_state; + gst_element_class_set_metadata(element_class, + "Qt built-in video renderer sink", + "Sink/Video", + "Qt default built-in video renderer sink", + "The Qt Company"); GObjectClass *object_class = reinterpret_cast<GObjectClass *>(g_class); object_class->finalize = QGstVideoRendererSink::finalize; @@ -476,8 +491,8 @@ void QGstVideoRendererSink::instance_init(GTypeInstance *instance, gpointer g_cl VO_SINK(instance); Q_UNUSED(g_class); - - sink->delegate = 0; + sink->delegate = new QVideoSurfaceGstDelegate(current_surface); + sink->delegate->moveToThread(current_surface->thread()); } void QGstVideoRendererSink::finalize(GObject *object) |