[vlc-devel] [PATCH 2/7] qt: add API to detach video surface in the Compositor

Pierre Lamot pierre at videolabs.io
Fri Aug 14 18:49:00 CEST 2020


---
 modules/gui/qt/Makefile.am                    |  1 +
 modules/gui/qt/maininterface/compositor.hpp   | 29 ++++++++++++++++++-
 .../gui/qt/maininterface/compositor_dcomp.cpp | 17 +++++++++++
 .../gui/qt/maininterface/compositor_dcomp.hpp |  6 +++-
 .../gui/qt/maininterface/compositor_dummy.cpp | 19 +++++++++++-
 .../gui/qt/maininterface/compositor_dummy.hpp |  6 +++-
 6 files changed, 74 insertions(+), 4 deletions(-)

diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am
index 35f0d34f5e..86add9398b 100644
--- a/modules/gui/qt/Makefile.am
+++ b/modules/gui/qt/Makefile.am
@@ -291,6 +291,7 @@ nodist_libqt_plugin_la_SOURCES = \
 	gui/qt/dialogs/sout/sout.moc.cpp \
 	gui/qt/dialogs/sout/sout_widgets.moc.cpp \
 	gui/qt/dialogs/toolbar/toolbareditor.moc.cpp \
+	gui/qt/maininterface/compositor.moc.cpp \
 	gui/qt/maininterface/compositor_dummy.moc.cpp \
 	gui/qt/maininterface/interface_window_handler.moc.cpp \
 	gui/qt/maininterface/main_interface.moc.cpp \
diff --git a/modules/gui/qt/maininterface/compositor.hpp b/modules/gui/qt/maininterface/compositor.hpp
index aef4e11a32..d5f2494fdd 100644
--- a/modules/gui/qt/maininterface/compositor.hpp
+++ b/modules/gui/qt/maininterface/compositor.hpp
@@ -32,8 +32,21 @@ class MainInterface;
 
 namespace vlc {
 
-class Compositor {
+class Compositor : public QObject {
+    Q_OBJECT
 public:
+    enum VideoSurfaceTarget {
+        UNDEF       = 0x0, //video not embed
+        EMBED       = 0x1, //embed in the main interface
+        WINDOWED    = 0x2, //in a separate window
+        FULLSCREEN  = 0x4, //in a fullscreen window (this is diffenrent than setting the main window fullscreen)
+    };
+    Q_ENUM(VideoSurfaceTarget)
+
+
+    inline Compositor(QObject* parent)
+        : QObject(parent)
+    {}
 
     virtual ~Compositor() = default;
 
@@ -42,8 +55,22 @@ public:
 
     virtual bool setupVoutWindow(vout_window_t *p_wnd) = 0;
 
+    /**
+     * @brief setVideoSurface move the video to a different surface
+     * @param target the destination (embed, windowed, ...)
+     * @param targetParam dependent on @a target
+     */
+    virtual void setVideoSurface(VideoSurfaceTarget target, QVariant targetParam = QVariant()) = 0;
+    virtual VideoSurfaceTarget getVideoSurface(QVariant* param = nullptr) = 0;
+
+    /// returns a bitmask of supported video surface target modes
+    virtual VideoSurfaceTarget getSupportedVideoSurfaceModes() const = 0;
+
     //factory
     static Compositor* createCompositor(intf_thread_t *p_intf);
+
+signals:
+    virtual void videoSurfaceChanged(VideoSurfaceTarget target, QVariant targetParam);
 };
 
 
diff --git a/modules/gui/qt/maininterface/compositor_dcomp.cpp b/modules/gui/qt/maininterface/compositor_dcomp.cpp
index 27d4a9d026..1b0b3d6517 100644
--- a/modules/gui/qt/maininterface/compositor_dcomp.cpp
+++ b/modules/gui/qt/maininterface/compositor_dcomp.cpp
@@ -307,4 +307,21 @@ bool CompositorDirectComposition::setupVoutWindow(vout_window_t *p_wnd)
     return true;
 }
 
+Compositor::VideoSurfaceTarget CompositorDirectComposition::getSupportedVideoSurfaceModes() const
+{
+    return VideoSurfaceTarget::UNDEF;
+}
+
+void CompositorDirectComposition::setVideoSurface(VideoSurfaceTarget target, QVariant targetParam)
+{
+    //N/A
+}
+
+Compositor::VideoSurfaceTarget CompositorDirectComposition::getVideoSurface(QVariant* param)
+{
+    if (param)
+        *param = QVariant();
+    return VideoSurfaceTarget::UNDEF;
+}
+
 }
diff --git a/modules/gui/qt/maininterface/compositor_dcomp.hpp b/modules/gui/qt/maininterface/compositor_dcomp.hpp
index 1c415daf2a..47ab504fb2 100644
--- a/modules/gui/qt/maininterface/compositor_dcomp.hpp
+++ b/modules/gui/qt/maininterface/compositor_dcomp.hpp
@@ -38,7 +38,7 @@ class MainInterface;
 
 namespace vlc {
 
-class CompositorDirectComposition : public QObject, public Compositor
+class CompositorDirectComposition : public Compositor
 {
     Q_OBJECT
 public:
@@ -52,6 +52,10 @@ public:
 
     bool setupVoutWindow(vout_window_t *p_wnd) override;
 
+    void setVideoSurface(VideoSurfaceTarget target, QVariant targetParam = QVariant()) override;
+    VideoSurfaceTarget getVideoSurface(QVariant* param = nullptr) override;
+    virtual VideoSurfaceTarget getSupportedVideoSurfaceModes() const override;
+
 private:
     static int window_enable(struct vout_window_t *, const vout_window_cfg_t *);
     static void window_disable(struct vout_window_t *);
diff --git a/modules/gui/qt/maininterface/compositor_dummy.cpp b/modules/gui/qt/maininterface/compositor_dummy.cpp
index 81e5d3f867..0f21b89a33 100644
--- a/modules/gui/qt/maininterface/compositor_dummy.cpp
+++ b/modules/gui/qt/maininterface/compositor_dummy.cpp
@@ -24,7 +24,7 @@
 namespace vlc {
 
 CompositorDummy::CompositorDummy(intf_thread_t *p_intf, QObject* parent)
-    : QObject(parent)
+    : Compositor(parent)
     , m_intf(p_intf)
 {
 }
@@ -55,6 +55,23 @@ void CompositorDummy::destroyMainInterface()
     }
 }
 
+void CompositorDummy::setVideoSurface(VideoSurfaceTarget, QVariant)
+{
+    //N/A
+}
+
+Compositor::VideoSurfaceTarget CompositorDummy::getSupportedVideoSurfaceModes() const
+{
+    return VideoSurfaceTarget::UNDEF;
+}
+
+Compositor::VideoSurfaceTarget CompositorDummy::getVideoSurface(QVariant* param)
+{
+    if (param)
+        *param = QVariant();
+    return VideoSurfaceTarget::UNDEF;
+}
+
 bool CompositorDummy::setupVoutWindow(vout_window_t*)
 {
     //dummy compositor doesn't handle window intergration
diff --git a/modules/gui/qt/maininterface/compositor_dummy.hpp b/modules/gui/qt/maininterface/compositor_dummy.hpp
index 51647d1ac0..39b033536c 100644
--- a/modules/gui/qt/maininterface/compositor_dummy.hpp
+++ b/modules/gui/qt/maininterface/compositor_dummy.hpp
@@ -29,7 +29,7 @@ class MainInterface;
 
 namespace vlc {
 
-class CompositorDummy : public QObject, public Compositor
+class CompositorDummy : public Compositor
 {
     Q_OBJECT
 public:
@@ -39,6 +39,10 @@ public:
     virtual MainInterface *makeMainInterface() override;
     virtual void destroyMainInterface() override;
 
+    virtual void setVideoSurface(VideoSurfaceTarget target, QVariant targetParam = QVariant()) override;
+    VideoSurfaceTarget getSupportedVideoSurfaceModes() const override;
+    VideoSurfaceTarget getVideoSurface(QVariant* param = nullptr) override;
+
     bool setupVoutWindow(vout_window_t *p_wnd) override;
 
 protected:
-- 
2.25.1



More information about the vlc-devel mailing list