944f104
From 3902c13d2cfcf903c8475fb9f72bccf6f604d2f5 Mon Sep 17 00:00:00 2001
944f104
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
944f104
Date: Sun, 20 Dec 2015 10:57:12 +0200
944f104
Subject: [PATCH 5/5] gtk3+wayland: play video via gtksink gstreamer element
944f104
944f104
(cherry picked from commit 8543fbc72fafc0d71a8760752ca2ef5b7119cb5c)
944f104
944f104
Change-Id: Ib371fa06eda73962cbe94739e69a68b46c26e4bf
944f104
---
944f104
 avmedia/Library_avmediagst.mk          |  16 ++-
944f104
 avmedia/source/gstreamer/gstplayer.cxx | 226 ++++++++++++++++++---------------
944f104
 avmedia/source/gstreamer/gstplayer.hxx |   8 ++
944f104
 include/vcl/sysdata.hxx                |   2 +
944f104
 vcl/unx/gtk/gtkobject.cxx              |   1 +
944f104
 vcl/unx/gtk/gtksalframe.cxx            |   1 +
944f104
 vcl/unx/gtk3/gtk3gtkframe.cxx          |   1 +
944f104
 vcl/unx/gtk3/gtk3gtkobject.cxx         |   7 +-
944f104
 8 files changed, 157 insertions(+), 105 deletions(-)
944f104
944f104
diff --git a/avmedia/Library_avmediagst.mk b/avmedia/Library_avmediagst.mk
944f104
index a20a32b..35a56ac 100644
944f104
--- a/avmedia/Library_avmediagst.mk
944f104
+++ b/avmedia/Library_avmediagst.mk
944f104
@@ -16,7 +16,21 @@ $(eval $(call gb_Library_set_include,avmediagst,\
944f104
 	-I$(SRCDIR)/avmedia/source/inc \
944f104
 	$(GSTREAMER_1_0_CFLAGS) \
944f104
 ))
944f104
-$(eval $(call gb_Library_add_libs,avmediagst,$(GSTREAMER_1_0_LIBS)))
944f104
+
944f104
+$(eval $(call gb_Library_add_libs,avmediagst,\
944f104
+    $(GSTREAMER_1_0_LIBS) \
944f104
+))
944f104
+
944f104
+ifneq ($(ENABLE_GTK3),)
944f104
+$(eval $(call gb_Library_add_cxxflags,avmediagst,\
944f104
+    $$(GTK3_CFLAGS) \
944f104
+    -DENABLE_GTKSINK \
944f104
+))
944f104
+
944f104
+$(eval $(call gb_Library_add_libs,avmediagst,\
944f104
+    $(GTK3_LIBS) \
944f104
+))
944f104
+endif
944f104
 
944f104
 $(eval $(call gb_Library_use_external,avmediagst,boost_headers))
944f104
 
944f104
diff --git a/avmedia/source/gstreamer/gstplayer.cxx b/avmedia/source/gstreamer/gstplayer.cxx
944f104
index 6dd0f5c..0a97c14 100644
944f104
--- a/avmedia/source/gstreamer/gstplayer.cxx
944f104
+++ b/avmedia/source/gstreamer/gstplayer.cxx
944f104
@@ -53,18 +53,11 @@
944f104
 #include <gst/pbutils/missing-plugins.h>
944f104
 #include <gst/pbutils/pbutils.h>
944f104
 
944f104
-#if !defined DBG
944f104
-# if OSL_DEBUG_LEVEL > 2
944f104
 #ifdef AVMEDIA_GST_0_10
944f104
 #  define AVVERSION "gst 0.10: "
944f104
 #else
944f104
 #  define AVVERSION "gst 1.0: "
944f104
 #endif
944f104
-#define DBG(...) do { fprintf (stderr, "%s", AVVERSION); fprintf (stderr, __VA_ARGS__); fprintf (stderr, "\n"); } while (0);
944f104
-# else
944f104
-#define DBG(...)
944f104
-# endif
944f104
-#endif
944f104
 
944f104
 using namespace ::com::sun::star;
944f104
 
944f104
@@ -289,6 +282,10 @@ Player::Player( const uno::Reference< lang::XMultiServiceFactory >& rxMgr ) :
944f104
     GstPlayer_BASE( m_aMutex ),
944f104
     mxMgr( rxMgr ),
944f104
     mpPlaybin( nullptr ),
944f104
+#if defined(ENABLE_GTKSINK)
944f104
+    mpGtkWidget( nullptr ),
944f104
+#endif
944f104
+    mbUseGtkSink( false ),
944f104
     mbFakeVideo (false ),
944f104
     mnUnmutedVolume( 0 ),
944f104
     mbPlayPending ( false ),
944f104
@@ -312,12 +309,12 @@ Player::Player( const uno::Reference< lang::XMultiServiceFactory >& rxMgr ) :
944f104
 
944f104
     mbInitialized = gst_init_check( &argc, &argv, &pError );
944f104
 
944f104
-    DBG( "%p Player::Player", this );
944f104
+    SAL_INFO( "avmedia.gstreamer", AVVERSION << this << " Player::Player" );
944f104
 
944f104
     if (pError != nullptr)
944f104
     {
944f104
         // TODO: throw an exception?
944f104
-        DBG( "%p Player::Player error '%s'", this, pError->message );
944f104
+        SAL_INFO( "avmedia.gstreamer", AVVERSION << this << " Player::Player error '" << pError->message << "'" );
944f104
         g_error_free (pError);
944f104
     }
944f104
 }
944f104
@@ -326,7 +323,7 @@ Player::Player( const uno::Reference< lang::XMultiServiceFactory >& rxMgr ) :
944f104
 
944f104
 Player::~Player()
944f104
 {
944f104
-    DBG( "%p Player::~Player", this );
944f104
+    SAL_INFO( "avmedia.gstreamer", AVVERSION << this << " Player::~Player" );
944f104
     if( mbInitialized )
944f104
         disposing();
944f104
 }
944f104
@@ -339,11 +336,19 @@ void SAL_CALL Player::disposing()
944f104
 
944f104
     stop();
944f104
 
944f104
-    DBG( "%p Player::disposing", this );
944f104
+    SAL_INFO( "avmedia.gstreamer", AVVERSION << this << " Player::disposing" );
944f104
 
944f104
     // Release the elements and pipeline
944f104
     if( mbInitialized )
944f104
     {
944f104
+#if defined(ENABLE_GTKSINK)
944f104
+        if (mpGtkWidget)
944f104
+        {
944f104
+            gtk_widget_destroy(mpGtkWidget);
944f104
+            mpGtkWidget = nullptr;
944f104
+        }
944f104
+#endif
944f104
+
944f104
         if( mpPlaybin )
944f104
         {
944f104
             gst_element_set_state( mpPlaybin, GST_STATE_NULL );
944f104
@@ -391,18 +396,20 @@ void Player::processMessage( GstMessage *message )
944f104
             start();
944f104
         break;
944f104
     case GST_MESSAGE_STATE_CHANGED:
944f104
-        if( message->src == GST_OBJECT( mpPlaybin ) ) {
944f104
+        if (message->src == GST_OBJECT(mpPlaybin))
944f104
+        {
944f104
             GstState newstate, pendingstate;
944f104
 
944f104
             gst_message_parse_state_changed (message, nullptr, &newstate, &pendingstate);
944f104
 
944f104
-            if( newstate == GST_STATE_PAUSED &&
944f104
-                pendingstate == GST_STATE_VOID_PENDING &&
944f104
-                mpXOverlay )
944f104
-                gst_video_overlay_expose( mpXOverlay );
944f104
+            if (!mbUseGtkSink && newstate == GST_STATE_PAUSED &&
944f104
+                pendingstate == GST_STATE_VOID_PENDING && mpXOverlay)
944f104
+            {
944f104
+                gst_video_overlay_expose(mpXOverlay);
944f104
+            }
944f104
 
944f104
-        if (mbPlayPending)
944f104
-            mbPlayPending = ((newstate == GST_STATE_READY) || (newstate == GST_STATE_PAUSED));
944f104
+            if (mbPlayPending)
944f104
+                mbPlayPending = ((newstate == GST_STATE_READY) || (newstate == GST_STATE_PAUSED));
944f104
         }
944f104
     default:
944f104
         break;
944f104
@@ -431,8 +438,6 @@ static gboolean wrap_element_query_duration (GstElement *element, GstFormat form
944f104
 
944f104
 GstBusSyncReply Player::processSyncMessage( GstMessage *message )
944f104
 {
944f104
-//    DBG( "%p processSyncMessage has handle: %s", this, GST_MESSAGE_TYPE_NAME( message ) );
944f104
-
944f104
 #if OSL_DEBUG_LEVEL > 0
944f104
     if ( GST_MESSAGE_TYPE( message ) == GST_MESSAGE_ERROR )
944f104
     {
944f104
@@ -441,29 +446,32 @@ GstBusSyncReply Player::processSyncMessage( GstMessage *message )
944f104
 
944f104
         gst_message_parse_error( message, &error, &error_debug );
944f104
         SAL_WARN(
944f104
-            "avmedia",
944f104
-            "gstreamer error: '" << error->message << "' debug: '"
944f104
+            "avmedia.gstreamer",
944f104
+            "error: '" << error->message << "' debug: '"
944f104
                 << error_debug << "'");
944f104
     }
944f104
 #endif
944f104
 
944f104
+    if (!mbUseGtkSink)
944f104
+    {
944f104
 #ifdef AVMEDIA_GST_0_10
944f104
-    if (message->structure &&
944f104
-        !strcmp( gst_structure_get_name( message->structure ), "prepare-xwindow-id" ) )
944f104
+        if (message->structure &&
944f104
+            !strcmp( gst_structure_get_name( message->structure ), "prepare-xwindow-id" ) )
944f104
 #else
944f104
-    if (gst_is_video_overlay_prepare_window_handle_message (message) )
944f104
+        if (gst_is_video_overlay_prepare_window_handle_message (message) )
944f104
 #endif
944f104
-    {
944f104
-        DBG( "%p processSyncMessage prepare window id: %s %d", this,
944f104
-             GST_MESSAGE_TYPE_NAME( message ), (int)mnWindowID );
944f104
-        if( mpXOverlay )
944f104
-            g_object_unref( G_OBJECT ( mpXOverlay ) );
944f104
-        g_object_set( GST_MESSAGE_SRC( message ), "force-aspect-ratio", FALSE, NULL );
944f104
-        mpXOverlay = GST_VIDEO_OVERLAY( GST_MESSAGE_SRC( message ) );
944f104
-        g_object_ref( G_OBJECT ( mpXOverlay ) );
944f104
-        if ( mnWindowID != 0 )
944f104
-            gst_video_overlay_set_window_handle( mpXOverlay, mnWindowID );
944f104
-        return GST_BUS_DROP;
944f104
+        {
944f104
+            SAL_INFO( "avmedia.gstreamer", AVVERSION << this << " processSyncMessage prepare window id: " <<
944f104
+                      GST_MESSAGE_TYPE_NAME( message ) << " " << (int)mnWindowID );
944f104
+            if( mpXOverlay )
944f104
+                g_object_unref( G_OBJECT ( mpXOverlay ) );
944f104
+            g_object_set( GST_MESSAGE_SRC( message ), "force-aspect-ratio", FALSE, nullptr );
944f104
+            mpXOverlay = GST_VIDEO_OVERLAY( GST_MESSAGE_SRC( message ) );
944f104
+            g_object_ref( G_OBJECT ( mpXOverlay ) );
944f104
+            if ( mnWindowID != 0 )
944f104
+                gst_video_overlay_set_window_handle( mpXOverlay, mnWindowID );
944f104
+            return GST_BUS_DROP;
944f104
+        }
944f104
     }
944f104
 
944f104
 #ifdef AVMEDIA_GST_0_10
944f104
@@ -473,12 +481,11 @@ GstBusSyncReply Player::processSyncMessage( GstMessage *message )
944f104
 
944f104
             gst_message_parse_state_changed (message, nullptr, &newstate, &pendingstate);
944f104
 
944f104
-            DBG( "%p state change received, new state %d pending %d", this,
944f104
-                 (int)newstate, (int)pendingstate );
944f104
+            SAL_INFO( "avmedia.gstreamer", AVVERSION << this << " state change received, new state " << (int)newState << " pending " << (int)pendingstate );
944f104
             if( newstate == GST_STATE_PAUSED &&
944f104
                 pendingstate == GST_STATE_VOID_PENDING ) {
944f104
 
944f104
-                DBG( "%p change to paused received", this );
944f104
+                SAL_INFO( "avmedia.gstreamer", AVVERSION << this << " change to paused received" );
944f104
 
944f104
                 if( mnDuration == 0) {
944f104
                     gint64 gst_duration = 0L;
944f104
@@ -489,7 +496,7 @@ GstBusSyncReply Player::processSyncMessage( GstMessage *message )
944f104
                 if( mnWidth == 0 ) {
944f104
                     GList *pStreamInfo = nullptr;
944f104
 
944f104
-                    g_object_get( G_OBJECT( mpPlaybin ), "stream-info", &pStreamInfo, NULL );
944f104
+                    g_object_get( G_OBJECT( mpPlaybin ), "stream-info", &pStreamInfo, nullptr );
944f104
 
944f104
                     for ( ; pStreamInfo != nullptr; pStreamInfo = pStreamInfo->next) {
944f104
                         GObject *pInfo = G_OBJECT( pStreamInfo->data );
944f104
@@ -498,7 +505,7 @@ GstBusSyncReply Player::processSyncMessage( GstMessage *message )
944f104
                             continue;
944f104
 
944f104
                         int nType;
944f104
-                        g_object_get( pInfo, "type", &nType, NULL );
944f104
+                        g_object_get( pInfo, "type", &nType, nullptr );
944f104
                         GEnumValue *pValue = g_enum_get_value( G_PARAM_SPEC_ENUM( g_object_class_find_property( G_OBJECT_GET_CLASS( pInfo ), "type" ) )->enum_class,
944f104
                                                                nType );
944f104
 
944f104
@@ -506,12 +513,12 @@ GstBusSyncReply Player::processSyncMessage( GstMessage *message )
944f104
                             GstStructure *pStructure;
944f104
                             GstPad *pPad;
944f104
 
944f104
-                            g_object_get( pInfo, "object", &pPad, NULL );
944f104
+                            g_object_get( pInfo, "object", &pPad, nullptr );
944f104
                             pStructure = gst_caps_get_structure( GST_PAD_CAPS( pPad ), 0 );
944f104
                             if( pStructure ) {
944f104
                                 gst_structure_get_int( pStructure, "width", &mnWidth );
944f104
                                 gst_structure_get_int( pStructure, "height", &mnHeight );
944f104
-                                DBG( "queried size: %d x %d", mnWidth, mnHeight );
944f104
+                                SAL_INFO( "avmedia.gstreamer", AVVERSION "queried size: " << mnWidth << "x" << mnHeight );
944f104
                             }
944f104
                             g_object_unref (pPad);
944f104
                         }
944f104
@@ -542,11 +549,11 @@ GstBusSyncReply Player::processSyncMessage( GstMessage *message )
944f104
                 if( gst_structure_get( gst_caps_get_structure( caps, 0 ),
944f104
                                        "width", G_TYPE_INT, &w,
944f104
                                        "height", G_TYPE_INT, &h,
944f104
-                                       NULL ) ) {
944f104
+                                       nullptr ) ) {
944f104
                     mnWidth = w;
944f104
                     mnHeight = h;
944f104
 
944f104
-                    DBG( "queried size: %d x %d", mnWidth, mnHeight );
944f104
+                    SAL_INFO( "avmedia.gstreamer", AVVERSION "queried size: " << mnWidth << "x" << mnHeight );
944f104
 
944f104
                     maSizeCondition.set();
944f104
                 }
944f104
@@ -562,7 +569,6 @@ GstBusSyncReply Player::processSyncMessage( GstMessage *message )
944f104
             maSizeCondition.set();
944f104
         }
944f104
     } else if( GST_MESSAGE_TYPE( message ) == GST_MESSAGE_ERROR ) {
944f104
-        DBG( "Error !\n" );
944f104
         if( mnWidth == 0 ) {
944f104
             // an error occurred, set condition so that OOo thread doesn't wait for us
944f104
             maSizeCondition.set();
944f104
@@ -574,41 +580,48 @@ GstBusSyncReply Player::processSyncMessage( GstMessage *message )
944f104
 
944f104
 void Player::preparePlaybin( const OUString& rURL, GstElement *pSink )
944f104
 {
944f104
-        GstBus *pBus;
944f104
+#if defined(ENABLE_GTKSINK)
944f104
+    if (mpGtkWidget)
944f104
+    {
944f104
+        gtk_widget_destroy(mpGtkWidget);
944f104
+        mpGtkWidget = nullptr;
944f104
+    }
944f104
+#endif
944f104
 
944f104
-        if( mpPlaybin != nullptr ) {
944f104
-            gst_element_set_state( mpPlaybin, GST_STATE_NULL );
944f104
-            mbPlayPending = false;
944f104
-            g_object_unref( mpPlaybin );
944f104
-        }
944f104
+    if (mpPlaybin != nullptr)
944f104
+    {
944f104
+        gst_element_set_state( mpPlaybin, GST_STATE_NULL );
944f104
+        mbPlayPending = false;
944f104
+        g_object_unref( mpPlaybin );
944f104
+    }
944f104
 
944f104
-        mpPlaybin = gst_element_factory_make( "playbin", nullptr );
944f104
-        if( pSink != nullptr ) // used for getting preferred size etc.
944f104
-        {
944f104
-            g_object_set( G_OBJECT( mpPlaybin ), "video-sink", pSink, NULL );
944f104
-            mbFakeVideo = true;
944f104
-        }
944f104
-        else
944f104
-            mbFakeVideo = false;
944f104
+    mpPlaybin = gst_element_factory_make( "playbin", nullptr );
944f104
+    if( pSink != nullptr ) // used for getting preferred size etc.
944f104
+    {
944f104
+        g_object_set( G_OBJECT( mpPlaybin ), "video-sink", pSink, nullptr );
944f104
+        mbFakeVideo = true;
944f104
+    }
944f104
+    else
944f104
+        mbFakeVideo = false;
944f104
 
944f104
-        OString ascURL = OUStringToOString( rURL, RTL_TEXTENCODING_UTF8 );
944f104
-        g_object_set( G_OBJECT( mpPlaybin ), "uri", ascURL.getStr() , NULL );
944f104
+    OString ascURL = OUStringToOString( rURL, RTL_TEXTENCODING_UTF8 );
944f104
+    g_object_set( G_OBJECT( mpPlaybin ), "uri", ascURL.getStr() , nullptr );
944f104
 
944f104
-        pBus = gst_element_get_bus( mpPlaybin );
944f104
-        if (mbWatchID)
944f104
-        {
944f104
-            g_source_remove(mnWatchID);
944f104
-            mbWatchID = false;
944f104
-        }
944f104
-        mnWatchID = gst_bus_add_watch( pBus, pipeline_bus_callback, this );
944f104
-        mbWatchID = true;
944f104
-        DBG( "%p set sync handler", this );
944f104
+    GstBus *pBus = gst_element_get_bus( mpPlaybin );
944f104
+    if (mbWatchID)
944f104
+    {
944f104
+        g_source_remove(mnWatchID);
944f104
+        mbWatchID = false;
944f104
+    }
944f104
+    mnWatchID = gst_bus_add_watch( pBus, pipeline_bus_callback, this );
944f104
+    mbWatchID = true;
944f104
+    SAL_INFO( "avmedia.gstreamer", AVVERSION << this << " set sync handler" );
944f104
 #ifdef AVMEDIA_GST_0_10
944f104
-        gst_bus_set_sync_handler( pBus, pipeline_bus_sync_handler, this );
944f104
+    gst_bus_set_sync_handler( pBus, pipeline_bus_sync_handler, this );
944f104
 #else
944f104
-        gst_bus_set_sync_handler( pBus, pipeline_bus_sync_handler, this, nullptr );
944f104
+    gst_bus_set_sync_handler( pBus, pipeline_bus_sync_handler, this, nullptr );
944f104
 #endif
944f104
-        g_object_unref( pBus );
944f104
+    g_object_unref( pBus );
944f104
 }
944f104
 
944f104
 bool Player::create( const OUString& rURL )
944f104
@@ -617,7 +630,7 @@ bool Player::create( const OUString& rURL )
944f104
 
944f104
     // create all the elements and link them
944f104
 
944f104
-    DBG("create player, URL: %s", OUStringToOString( rURL, RTL_TEXTENCODING_UTF8 ).getStr());
944f104
+    SAL_INFO( "avmedia.gstreamer", "create player, URL: '" << rURL << "'" );
944f104
 
944f104
     if( mbInitialized && !rURL.isEmpty() )
944f104
     {
944f104
@@ -665,7 +678,7 @@ void SAL_CALL Player::stop()
944f104
         gst_element_set_state( mpPlaybin, GST_STATE_PAUSED );
944f104
 
944f104
     mbPlayPending = false;
944f104
-    DBG( "stop %p", mpPlaybin );
944f104
+    SAL_INFO( "avmedia.gstreamer", AVVERSION "stop " << mpPlaybin );
944f104
 }
944f104
 
944f104
 
944f104
@@ -683,7 +696,7 @@ sal_Bool SAL_CALL Player::isPlaying()
944f104
         bRet = GST_STATE_PLAYING == GST_STATE( mpPlaybin );
944f104
     }
944f104
 
944f104
-    DBG( "isPlaying %d", bRet );
944f104
+    SAL_INFO( "avmedia.gstreamer", AVVERSION "isPlaying " << bRet );
944f104
 
944f104
     return bRet;
944f104
 }
944f104
@@ -723,7 +736,7 @@ void SAL_CALL Player::setMediaTime( double fTime )
944f104
         if( !isPlaying() )
944f104
             gst_element_set_state( mpPlaybin, GST_STATE_PAUSED );
944f104
 
944f104
-        DBG( "seek to: %" SAL_PRIdINT64 " ns original: %lf s", gst_position, fTime );
944f104
+        SAL_INFO( "avmedia.gstreamer", AVVERSION "seek to: " << gst_position << " ns original: " << fTime << " s" );
944f104
     }
944f104
 }
944f104
 
944f104
@@ -771,7 +784,7 @@ void SAL_CALL Player::setMute( sal_Bool bSet )
944f104
 {
944f104
     ::osl::MutexGuard aGuard(m_aMutex);
944f104
 
944f104
-    DBG( "set mute: %d muted: %d unmuted volume: %lf", bSet, mbMuted, mnUnmutedVolume );
944f104
+    SAL_INFO( "avmedia.gstreamer", AVVERSION "set mute: " << bSet << " muted: " << mbMuted << " unmuted volume: " << mnUnmutedVolume );
944f104
 
944f104
     // change the volume to 0 or the unmuted volume
944f104
     if(  mpPlaybin && mbMuted != bool(bSet) )
944f104
@@ -782,7 +795,7 @@ void SAL_CALL Player::setMute( sal_Bool bSet )
944f104
             nVolume = 0.0;
944f104
         }
944f104
 
944f104
-        g_object_set( G_OBJECT( mpPlaybin ), "volume", nVolume, NULL );
944f104
+        g_object_set( G_OBJECT( mpPlaybin ), "volume", nVolume, nullptr );
944f104
 
944f104
         mbMuted = bSet;
944f104
     }
944f104
@@ -807,12 +820,12 @@ void SAL_CALL Player::setVolumeDB( sal_Int16 nVolumeDB )
944f104
 
944f104
     mnUnmutedVolume = pow( 10.0, nVolumeDB / 20.0 );
944f104
 
944f104
-    DBG( "set volume: %d gst volume: %lf", nVolumeDB, mnUnmutedVolume );
944f104
+    SAL_INFO( "avmedia.gstreamer", AVVERSION "set volume: " << nVolumeDB << " gst volume: " << mnUnmutedVolume );
944f104
 
944f104
     // change volume
944f104
      if( !mbMuted && mpPlaybin )
944f104
      {
944f104
-         g_object_set( G_OBJECT( mpPlaybin ), "volume", (gdouble) mnUnmutedVolume, NULL );
944f104
+         g_object_set( G_OBJECT( mpPlaybin ), "volume", (gdouble) mnUnmutedVolume, nullptr );
944f104
      }
944f104
 }
944f104
 
944f104
@@ -828,7 +841,7 @@ sal_Int16 SAL_CALL Player::getVolumeDB()
944f104
     if( mpPlaybin ) {
944f104
         double nGstVolume = 0.0;
944f104
 
944f104
-        g_object_get( G_OBJECT( mpPlaybin ), "volume", &nGstVolume, NULL );
944f104
+        g_object_get( G_OBJECT( mpPlaybin ), "volume", &nGstVolume, nullptr );
944f104
 
944f104
         nVolumeDB = (sal_Int16) ( 20.0*log10 ( nGstVolume ) );
944f104
     }
944f104
@@ -847,18 +860,15 @@ awt::Size SAL_CALL Player::getPreferredPlayerWindowSize()
944f104
 
944f104
     if( maURL.isEmpty() )
944f104
     {
944f104
-        DBG( "%p Player::getPreferredPlayerWindowSize - empty URL => 0x0", this );
944f104
+        SAL_INFO( "avmedia.gstreamer", AVVERSION << this << " Player::getPreferredPlayerWindowSize - empty URL => 0x0" );
944f104
         return aSize;
944f104
     }
944f104
 
944f104
-    DBG( "%p pre-Player::getPreferredPlayerWindowSize, member %d x %d", this, mnWidth, mnHeight );
944f104
+    SAL_INFO( "avmedia.gstreamer", AVVERSION << this << " pre-Player::getPreferredPlayerWindowSize, member " << mnWidth << "x" << mnHeight );
944f104
 
944f104
-#if OSL_DEBUG_LEVEL > 2
944f104
-    osl::Condition::Result aResult =
944f104
-#endif
944f104
-                                 maSizeCondition.wait( std::chrono::seconds(10) );
944f104
+    osl::Condition::Result aResult = maSizeCondition.wait( std::chrono::seconds(10) );
944f104
 
944f104
-    DBG( "%p Player::getPreferredPlayerWindowSize after waitCondition %d, member %d x %d", this, aResult, mnWidth, mnHeight );
944f104
+    SAL_INFO( "avmedia.gstreamer", AVVERSION << this << " Player::getPreferredPlayerWindowSize after waitCondition " << aResult << ", member " << mnWidth << "x" << mnHeight );
944f104
 
944f104
     if( mnWidth != 0 && mnHeight != 0 ) {
944f104
         aSize.Width = mnWidth;
944f104
@@ -881,7 +891,7 @@ uno::Reference< ::media::XPlayerWindow > SAL_CALL Player::createPlayerWindow( co
944f104
     if( mbFakeVideo )
944f104
         preparePlaybin( maURL, nullptr );
944f104
 
944f104
-    DBG( "Player::createPlayerWindow %d %d length: %d", aSize.Width, aSize.Height, rArguments.getLength() );
944f104
+    SAL_INFO( "avmedia.gstreamer", AVVERSION << "Player::createPlayerWindow " << aSize.Width << "x" << aSize.Height << " length: " << rArguments.getLength() );
944f104
 
944f104
     if( aSize.Width > 0 && aSize.Height > 0 )
944f104
     {
944f104
@@ -898,11 +908,31 @@ uno::Reference< ::media::XPlayerWindow > SAL_CALL Player::createPlayerWindow( co
944f104
             OSL_ASSERT(pEnvData);
944f104
             if (pEnvData)
944f104
             {
944f104
-                mnWindowID = pEnvData->aWindow;
944f104
-                DBG( "set window id to %d XOverlay %p\n", (int)mnWindowID, mpXOverlay);
944f104
-                gst_element_set_state( mpPlaybin, GST_STATE_PAUSED );
944f104
-                if ( mpXOverlay != nullptr )
944f104
-                    gst_video_overlay_set_window_handle( mpXOverlay, mnWindowID );
944f104
+#if defined(ENABLE_GTKSINK)
944f104
+                GstElement *pVideosink = g_strcmp0(pEnvData->pToolkit, "gtk3") == 0 ?
944f104
+                                           gst_element_factory_make("gtksink", "gtksink") : nullptr;
944f104
+                if (pVideosink)
944f104
+                {
944f104
+                    mbUseGtkSink = true;
944f104
+                    g_object_get(pVideosink, "widget", &mpGtkWidget, nullptr);
944f104
+                    GtkWidget *pParent = (GtkWidget*)(pEnvData->pWidget);
944f104
+                    gtk_container_add (GTK_CONTAINER(pParent), mpGtkWidget);
944f104
+
944f104
+                    g_object_set( G_OBJECT( mpPlaybin ), "video-sink", pVideosink, nullptr);
944f104
+                    g_object_set( G_OBJECT( mpPlaybin ), "force-aspect-ratio", FALSE, nullptr);
944f104
+
944f104
+                    gtk_widget_show_all (pParent);
944f104
+                }
944f104
+                else
944f104
+#endif
944f104
+                {
944f104
+                    mbUseGtkSink = false;
944f104
+                    mnWindowID = pEnvData->aWindow;
944f104
+                    SAL_INFO( "avmedia.gstreamer", AVVERSION "set window id to " << (int)mnWindowID << " XOverlay " << mpXOverlay);
944f104
+                    gst_element_set_state( mpPlaybin, GST_STATE_PAUSED );
944f104
+                    if ( mpXOverlay != nullptr )
944f104
+                        gst_video_overlay_set_window_handle( mpXOverlay, mnWindowID );
944f104
+                }
944f104
             }
944f104
         }
944f104
     }
944f104
@@ -910,8 +940,6 @@ uno::Reference< ::media::XPlayerWindow > SAL_CALL Player::createPlayerWindow( co
944f104
     return xRet;
944f104
 }
944f104
 
944f104
-
944f104
-
944f104
 uno::Reference< media::XFrameGrabber > SAL_CALL Player::createFrameGrabber()
944f104
     throw (uno::RuntimeException, std::exception)
944f104
 {
944f104
@@ -921,7 +949,7 @@ uno::Reference< media::XFrameGrabber > SAL_CALL Player::createFrameGrabber()
944f104
 
944f104
     if( ( aPrefSize.Width > 0 ) && ( aPrefSize.Height > 0 ) )
944f104
         pFrameGrabber = FrameGrabber::create( maURL );
944f104
-    DBG( "created FrameGrabber %p", pFrameGrabber );
944f104
+    SAL_INFO( "avmedia.gstreamer", AVVERSION << "created FrameGrabber " << pFrameGrabber );
944f104
 
944f104
     return pFrameGrabber;
944f104
 }
944f104
diff --git a/avmedia/source/gstreamer/gstplayer.hxx b/avmedia/source/gstreamer/gstplayer.hxx
944f104
index 52095b0..ffc5133 100644
944f104
--- a/avmedia/source/gstreamer/gstplayer.hxx
944f104
+++ b/avmedia/source/gstreamer/gstplayer.hxx
944f104
@@ -27,6 +27,10 @@
944f104
 #include <cppuhelper/compbase.hxx>
944f104
 #include <cppuhelper/basemutex.hxx>
944f104
 
944f104
+#if defined(ENABLE_GTKSINK)
944f104
+#    include <gtk/gtk.h>
944f104
+#endif
944f104
+
944f104
 typedef struct _GstVideoOverlay GstVideoOverlay;
944f104
 
944f104
 namespace avmedia { namespace gstreamer {
944f104
@@ -83,6 +87,10 @@ protected:
944f104
 
944f104
     // Add elements and pipeline here
944f104
     GstElement*             mpPlaybin;  // the playbin is also a pipeline
944f104
+#if defined(ENABLE_GTKSINK)
944f104
+    GtkWidget*              mpGtkWidget;
944f104
+#endif
944f104
+    bool                    mbUseGtkSink;
944f104
     bool                    mbFakeVideo;
944f104
 
944f104
     gdouble                 mnUnmutedVolume;
944f104
diff --git a/include/vcl/sysdata.hxx b/include/vcl/sysdata.hxx
944f104
index 5ae9947..02e0c1e 100644
944f104
--- a/include/vcl/sysdata.hxx
944f104
+++ b/include/vcl/sysdata.hxx
944f104
@@ -72,6 +72,7 @@ struct SystemEnvData
944f104
     void*               pAppContext;    // the application context in use
944f104
     long                aShellWindow;   // the window of the frame's shell
944f104
     void*               pShellWidget;   // the frame's shell widget
944f104
+    const char*         pToolkit;       // the toolkit in use (gtk2 vs gtk3)
944f104
 #endif
944f104
 
944f104
     SystemEnvData()
944f104
@@ -95,6 +96,7 @@ struct SystemEnvData
944f104
         , pAppContext(nullptr)
944f104
         , aShellWindow(0)
944f104
         , pShellWidget(nullptr)
944f104
+        , pToolkit(nullptr)
944f104
 #endif
944f104
     {
944f104
     }
944f104
diff --git a/vcl/unx/gtk/gtkobject.cxx b/vcl/unx/gtk/gtkobject.cxx
944f104
index cc78ff5..18aa63a 100644
944f104
--- a/vcl/unx/gtk/gtkobject.cxx
944f104
+++ b/vcl/unx/gtk/gtkobject.cxx
944f104
@@ -63,6 +63,7 @@ GtkSalObject::GtkSalObject( GtkSalFrame* pParent, bool bShow )
944f104
         m_aSystemData.nScreen       = pParent->getXScreenNumber().getXScreen();
944f104
         m_aSystemData.pAppContext   = nullptr;
944f104
         m_aSystemData.pShellWidget  = GTK_WIDGET(pParent->getWindow());
944f104
+        m_aSystemData.pToolkit      = "gtk2";
944f104
 
944f104
         g_signal_connect( G_OBJECT(m_pSocket), "button-press-event", G_CALLBACK(signalButton), this );
944f104
         g_signal_connect( G_OBJECT(m_pSocket), "button-release-event", G_CALLBACK(signalButton), this );
944f104
diff --git a/vcl/unx/gtk/gtksalframe.cxx b/vcl/unx/gtk/gtksalframe.cxx
944f104
index d44207e..7a7c293 100644
944f104
--- a/vcl/unx/gtk/gtksalframe.cxx
944f104
+++ b/vcl/unx/gtk/gtksalframe.cxx
944f104
@@ -1022,6 +1022,7 @@ void GtkSalFrame::InitCommon()
944f104
     m_aSystemData.nScreen       = m_nXScreen.getXScreen();
944f104
     m_aSystemData.pAppContext   = nullptr;
944f104
     m_aSystemData.pShellWidget  = m_aSystemData.pWidget;
944f104
+    m_aSystemData.pToolkit      = "gtk2";
944f104
 
944f104
     m_bGraphics = false;
944f104
     m_pGraphics = NULL;
944f104
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx
944f104
index 925b185..3b34385 100644
944f104
--- a/vcl/unx/gtk3/gtk3gtkframe.cxx
944f104
+++ b/vcl/unx/gtk3/gtk3gtkframe.cxx
944f104
@@ -1097,6 +1097,7 @@ void GtkSalFrame::InitCommon()
944f104
     m_aSystemData.nScreen       = m_nXScreen.getXScreen();
944f104
     m_aSystemData.pAppContext   = nullptr;
944f104
     m_aSystemData.pShellWidget  = m_aSystemData.pWidget;
944f104
+    m_aSystemData.pToolkit      = "gtk3";
944f104
 
944f104
     m_bGraphics = false;
944f104
     m_pGraphics = nullptr;
944f104
diff --git a/vcl/unx/gtk3/gtk3gtkobject.cxx b/vcl/unx/gtk3/gtk3gtkobject.cxx
944f104
index 1154033..8f1c032 100644
944f104
--- a/vcl/unx/gtk3/gtk3gtkobject.cxx
944f104
+++ b/vcl/unx/gtk3/gtk3gtkobject.cxx
944f104
@@ -36,7 +36,7 @@ GtkSalObject::GtkSalObject( GtkSalFrame* pParent, bool bShow )
944f104
     if( pParent )
944f104
     {
944f104
         // our plug window
944f104
-        m_pSocket = gtk_drawing_area_new();
944f104
+        m_pSocket = gtk_grid_new();
944f104
         Show( bShow );
944f104
         // insert into container
944f104
         gtk_fixed_put( pParent->getFixedContainer(),
944f104
@@ -45,10 +45,6 @@ GtkSalObject::GtkSalObject( GtkSalFrame* pParent, bool bShow )
944f104
         // realize so we can get a window id
944f104
         gtk_widget_realize( m_pSocket );
944f104
 
944f104
-        // make it transparent; some plugins may not insert
944f104
-        // their own window here but use the socket window itself
944f104
-        gtk_widget_set_app_paintable( m_pSocket, TRUE );
944f104
-
944f104
         // system data
944f104
         m_aSystemData.nSize         = sizeof( SystemEnvData );
944f104
         m_aSystemData.aWindow       = pParent->GetNativeWindowHandle(m_pSocket);
944f104
@@ -58,6 +54,7 @@ GtkSalObject::GtkSalObject( GtkSalFrame* pParent, bool bShow )
944f104
         m_aSystemData.nScreen       = pParent->getXScreenNumber().getXScreen();
944f104
         m_aSystemData.pAppContext   = nullptr;
944f104
         m_aSystemData.pShellWidget  = GTK_WIDGET(pParent->getWindow());
944f104
+        m_aSystemData.pToolkit      = "gtk3";
944f104
 
944f104
         g_signal_connect( G_OBJECT(m_pSocket), "button-press-event", G_CALLBACK(signalButton), this );
944f104
         g_signal_connect( G_OBJECT(m_pSocket), "button-release-event", G_CALLBACK(signalButton), this );
944f104
-- 
944f104
2.7.1
944f104