diff options
author | Caolán McNamara <caolanm@redhat.com> | 2019-05-23 17:09:51 +0100 |
---|---|---|
committer | Michael Stahl <Michael.Stahl@cib.de> | 2019-05-28 15:07:02 +0200 |
commit | 86ffd1e60c98f4f39f45507e852c428551c9db54 (patch) | |
tree | ce6fb12d5ba415c951fbfae309c23483b72c1444 /avmedia | |
parent | 0d657498080aad86f4b97309fff9bf589c57dc2e (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.cxx | 57 | ||||
-rw-r--r-- | avmedia/source/gstreamer/gstplayer.hxx | 1 |
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; |