diff options
author | Caolán McNamara <caolanm@redhat.com> | 2022-02-21 10:01:42 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2022-03-01 18:38:27 +0100 |
commit | 05db887bc226b85befe2c2b9e84b796020a6ca05 (patch) | |
tree | cdb86937b266212f6fae5f7d6e596f30350a49ad /svx | |
parent | ae071f7d680545e284e5947d26cbea30e59bdfb5 (diff) |
gtk4: media dimensions are only reliably available async
this is also the case for the direct gstreamer use in gtk3 but
more egregious when abstracted away from it in gtk4
Change-Id: If90069308d67929585722c079c482cd4ad196e1f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130468
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'svx')
-rw-r--r-- | svx/source/svdraw/svdomedia.cxx | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/svx/source/svdraw/svdomedia.cxx b/svx/source/svdraw/svdomedia.cxx index b40a0644aa15..62b2f9e8213f 100644 --- a/svx/source/svdraw/svdomedia.cxx +++ b/svx/source/svdraw/svdomedia.cxx @@ -51,6 +51,7 @@ struct SdrMediaObj::Impl std::shared_ptr< ::avmedia::MediaTempFile > m_pTempFile; #endif uno::Reference< graphic::XGraphic > m_xCachedSnapshot; + rtl::Reference<avmedia::PlayerListener> m_xPlayerListener; OUString m_LastFailedPkgURL; }; @@ -150,7 +151,18 @@ uno::Reference< graphic::XGraphic > const & SdrMediaObj::getSnapshot() const OUString aRealURL = m_xImpl->m_MediaProperties.getTempURL(); if( aRealURL.isEmpty() ) aRealURL = m_xImpl->m_MediaProperties.getURL(); - m_xImpl->m_xCachedSnapshot = avmedia::MediaWindow::grabFrame( aRealURL, m_xImpl->m_MediaProperties.getReferer(), m_xImpl->m_MediaProperties.getMimeType()); + OUString sReferer = m_xImpl->m_MediaProperties.getReferer(); + OUString sMimeType = m_xImpl->m_MediaProperties.getMimeType(); + uno::Reference<graphic::XGraphic> xCachedSnapshot = m_xImpl->m_xCachedSnapshot; + + m_xImpl->m_xPlayerListener.set(new avmedia::PlayerListener( + [this, xCachedSnapshot, aRealURL, sReferer, sMimeType](const css::uno::Reference<css::media::XPlayer>& rPlayer){ + SolarMutexGuard g; + m_xImpl->m_xCachedSnapshot = avmedia::MediaWindow::grabFrame(rPlayer); + ActionChanged(); + })); + + avmedia::MediaWindow::grabFrame(aRealURL, sReferer, sMimeType, m_xImpl->m_xPlayerListener); } #endif return m_xImpl->m_xCachedSnapshot; @@ -341,6 +353,7 @@ void SdrMediaObj::mediaPropertiesChanged( const ::avmedia::MediaItem& rNewProper ( rNewProperties.getURL() != getURL() )) { m_xImpl->m_xCachedSnapshot.clear(); + m_xImpl->m_xPlayerListener.clear(); OUString const& url(rNewProperties.getURL()); if (url.startsWithIgnoreAsciiCase("vnd.sun.star.Package:")) { |