summaryrefslogtreecommitdiff
path: root/avmedia
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2019-05-23 17:09:51 +0100
committerMichael Stahl <Michael.Stahl@cib.de>2019-05-28 15:07:02 +0200
commit86ffd1e60c98f4f39f45507e852c428551c9db54 (patch)
treece6fb12d5ba415c951fbfae309c23483b72c1444 /avmedia
parent0d657498080aad86f4b97309fff9bf589c57dc2e (diff)
tdf#125271 under wayland without gtksink, try waylandsink
and if there is no videosink then give up Change-Id: I6b60e7be1e77dbf5c4c277ccf47a4d121f3cd6a5 Reviewed-on: https://gerrit.libreoffice.org/72871 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com> Reviewed-on: https://gerrit.libreoffice.org/73087 Reviewed-by: Michael Stahl <Michael.Stahl@cib.de> Tested-by: Jenkins
Diffstat (limited to 'avmedia')
-rw-r--r--avmedia/source/gstreamer/gstplayer.cxx57
-rw-r--r--avmedia/source/gstreamer/gstplayer.hxx1
2 files changed, 53 insertions, 5 deletions
diff --git a/avmedia/source/gstreamer/gstplayer.cxx b/avmedia/source/gstreamer/gstplayer.cxx
index 46432c764698..37c638a6bd01 100644
--- a/avmedia/source/gstreamer/gstplayer.cxx
+++ b/avmedia/source/gstreamer/gstplayer.cxx
@@ -302,6 +302,7 @@ Player::Player() :
mbMuted( false ),
mbLooping( false ),
mbInitialized( false ),
+ mpDisplay( nullptr ),
mnWindowID( 0 ),
mpXOverlay( nullptr ),
mnDuration( 0 ),
@@ -453,6 +454,31 @@ static gboolean wrap_element_query_duration (GstElement *element, GstFormat form
#endif
}
+#ifndef AVMEDIA_GST_0_10
+
+#define LCL_WAYLAND_DISPLAY_HANDLE_CONTEXT_TYPE "GstWaylandDisplayHandleContextType"
+
+static gboolean lcl_is_wayland_display_handle_need_context_message(GstMessage* msg)
+{
+ g_return_val_if_fail(GST_IS_MESSAGE(msg), false);
+
+ if (GST_MESSAGE_TYPE(msg) != GST_MESSAGE_NEED_CONTEXT)
+ return false;
+ const gchar *type = nullptr;
+ if (!gst_message_parse_context_type(msg, &type))
+ return false;
+ return !g_strcmp0(type, LCL_WAYLAND_DISPLAY_HANDLE_CONTEXT_TYPE);
+}
+
+static GstContext* lcl_wayland_display_handle_context_new(void* display)
+{
+ GstContext *context = gst_context_new(LCL_WAYLAND_DISPLAY_HANDLE_CONTEXT_TYPE, TRUE);
+ gst_structure_set (gst_context_writable_structure (context),
+ "handle", G_TYPE_POINTER, display, nullptr);
+ return context;
+}
+
+#endif
GstBusSyncReply Player::processSyncMessage( GstMessage *message )
{
@@ -490,6 +516,15 @@ GstBusSyncReply Player::processSyncMessage( GstMessage *message )
gst_video_overlay_set_window_handle( mpXOverlay, mnWindowID );
return GST_BUS_DROP;
}
+#ifndef AVMEDIA_GST_0_10
+ else if (lcl_is_wayland_display_handle_need_context_message(message))
+ {
+ GstContext *context = lcl_wayland_display_handle_context_new(mpDisplay);
+ gst_element_set_context(GST_ELEMENT(GST_MESSAGE_SRC(message)), context);
+
+ return GST_BUS_DROP;
+ }
+#endif
}
#ifdef AVMEDIA_GST_0_10
@@ -888,7 +923,6 @@ awt::Size SAL_CALL Player::getPreferredPlayerWindowSize()
return aSize;
}
-
uno::Reference< ::media::XPlayerWindow > SAL_CALL Player::createPlayerWindow( const uno::Sequence< uno::Any >& rArguments )
{
::osl::MutexGuard aGuard(m_aMutex);
@@ -916,9 +950,13 @@ uno::Reference< ::media::XPlayerWindow > SAL_CALL Player::createPlayerWindow( co
OSL_ASSERT(pEnvData);
if (pEnvData)
{
+ OUString aToolkit = OUString::createFromAscii(pEnvData->pToolkit);
+ OUString aPlatform = OUString::createFromAscii(pEnvData->pPlatformName);
+
+ GstElement *pVideosink = nullptr;
#if defined(ENABLE_GTKSINK)
- GstElement *pVideosink = g_strcmp0(pEnvData->pToolkit, "gtk3") == 0 ?
- gst_element_factory_make("gtksink", "gtksink") : nullptr;
+ pVideosink = (aToolkit == "gtk3") ?
+ gst_element_factory_make("gtksink", "gtksink") : nullptr;
if (pVideosink)
{
mbUseGtkSink = true;
@@ -936,14 +974,24 @@ uno::Reference< ::media::XPlayerWindow > SAL_CALL Player::createPlayerWindow( co
else
#endif
{
+ if (aPlatform == "wayland")
+ pVideosink = gst_element_factory_make("waylandsink", "video-output");
+ else
+ pVideosink = gst_element_factory_make("autovideosink", "video-output");
+ if (!pVideosink)
+ {
+ xRet.clear();
+ return nullptr;
+ }
+ g_object_set(G_OBJECT(mpPlaybin), "video-sink", pVideosink, nullptr);
mbUseGtkSink = false;
mnWindowID = pEnvData->aWindow;
+ mpDisplay = pEnvData->pDisplay;
SAL_INFO( "avmedia.gstreamer", AVVERSION "set window id to " << static_cast<int>(mnWindowID) << " XOverlay " << mpXOverlay);
gst_element_set_state( mpPlaybin, GST_STATE_PAUSED );
if ( mpXOverlay != nullptr )
gst_video_overlay_set_window_handle( mpXOverlay, mnWindowID );
}
-
}
}
}
@@ -951,7 +999,6 @@ uno::Reference< ::media::XPlayerWindow > SAL_CALL Player::createPlayerWindow( co
return xRet;
}
-
uno::Reference< media::XFrameGrabber > SAL_CALL Player::createFrameGrabber()
{
::osl::MutexGuard aGuard(m_aMutex);
diff --git a/avmedia/source/gstreamer/gstplayer.hxx b/avmedia/source/gstreamer/gstplayer.hxx
index 1af1ae8eb9bf..6db9bc586575 100644
--- a/avmedia/source/gstreamer/gstplayer.hxx
+++ b/avmedia/source/gstreamer/gstplayer.hxx
@@ -95,6 +95,7 @@ private:
bool mbLooping;
bool mbInitialized;
+ void* mpDisplay;
long mnWindowID;
GstVideoOverlay* mpXOverlay;
gint64 mnDuration;