diff options
Diffstat (limited to 'avmedia')
-rw-r--r-- | avmedia/source/framework/mediaitem.cxx | 24 | ||||
-rw-r--r-- | avmedia/source/inc/mediamisc.hxx | 7 | ||||
-rw-r--r-- | avmedia/source/viewer/mediawindow_impl.cxx | 76 | ||||
-rw-r--r-- | avmedia/source/viewer/mediawindow_impl.hxx | 8 |
4 files changed, 83 insertions, 32 deletions
diff --git a/avmedia/source/framework/mediaitem.cxx b/avmedia/source/framework/mediaitem.cxx index 32f6f043ca0e..1c06ebcadf18 100644 --- a/avmedia/source/framework/mediaitem.cxx +++ b/avmedia/source/framework/mediaitem.cxx @@ -36,6 +36,7 @@ #include <comphelper/processfactory.hxx> #include <comphelper/storagehelper.hxx> +#include "mediamisc.hxx" using namespace ::com::sun::star; @@ -50,6 +51,7 @@ struct MediaItem::Impl OUString m_URL; OUString m_TempFileURL; OUString m_Referer; + OUString m_sMimeType; sal_uInt32 m_nMaskSet; MediaState m_eState; double m_fTime; @@ -74,6 +76,7 @@ struct MediaItem::Impl : m_URL( rOther.m_URL ) , m_TempFileURL( rOther.m_TempFileURL ) , m_Referer( rOther.m_Referer ) + , m_sMimeType( rOther.m_sMimeType ) , m_nMaskSet( rOther.m_nMaskSet ) , m_eState( rOther.m_eState ) , m_fTime( rOther.m_fTime ) @@ -109,6 +112,7 @@ bool MediaItem::operator==( const SfxPoolItem& rItem ) const return m_pImpl->m_nMaskSet == rOther.m_pImpl->m_nMaskSet && m_pImpl->m_URL == rOther.m_pImpl->m_URL && m_pImpl->m_Referer == rOther.m_pImpl->m_Referer + && m_pImpl->m_sMimeType == rOther.m_pImpl->m_sMimeType && m_pImpl->m_eState == rOther.m_pImpl->m_eState && m_pImpl->m_fDuration == rOther.m_pImpl->m_fDuration && m_pImpl->m_fTime == rOther.m_pImpl->m_fTime @@ -135,7 +139,7 @@ SfxItemPresentation MediaItem::GetPresentation( SfxItemPresentation, bool MediaItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 ) const { - uno::Sequence< uno::Any > aSeq( 9 ); + uno::Sequence< uno::Any > aSeq( 10 ); aSeq[ 0 ] <<= m_pImpl->m_URL; aSeq[ 1 ] <<= m_pImpl->m_nMaskSet; @@ -146,6 +150,7 @@ bool MediaItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 ) const aSeq[ 6 ] <<= m_pImpl->m_bLoop; aSeq[ 7 ] <<= m_pImpl->m_bMute; aSeq[ 8 ] <<= m_pImpl->m_eZoom; + aSeq[ 9 ] <<= m_pImpl->m_sMimeType; rVal <<= aSeq; @@ -157,7 +162,7 @@ bool MediaItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 ) uno::Sequence< uno::Any > aSeq; bool bRet = false; - if( ( rVal >>= aSeq ) && ( aSeq.getLength() == 9 ) ) + if( ( rVal >>= aSeq ) && ( aSeq.getLength() == 10 ) ) { sal_Int32 nInt32 = 0; @@ -171,6 +176,7 @@ bool MediaItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 ) aSeq[ 6 ] >>= m_pImpl->m_bLoop; aSeq[ 7 ] >>= m_pImpl->m_bMute; aSeq[ 8 ] >>= m_pImpl->m_eZoom; + aSeq[ 9 ] >>= m_pImpl->m_sMimeType; bRet = true; } @@ -185,6 +191,9 @@ void MediaItem::merge( const MediaItem& rMediaItem ) if( AVMEDIA_SETMASK_URL & nMaskSet ) setURL( rMediaItem.getURL(), rMediaItem.getTempURL(), rMediaItem.getReferer() ); + if( AVMEDIA_SETMASK_MIME_TYPE & nMaskSet ) + setMimeType( rMediaItem.getMimeType() ); + if( AVMEDIA_SETMASK_STATE & nMaskSet ) setState( rMediaItem.getState() ); @@ -235,6 +244,17 @@ const OUString& MediaItem::getReferer() const return m_pImpl->m_Referer; } +void MediaItem::setMimeType( const OUString& rMimeType ) +{ + m_pImpl->m_nMaskSet |= AVMEDIA_SETMASK_MIME_TYPE; + m_pImpl->m_sMimeType = rMimeType; +} + +OUString MediaItem::getMimeType() const +{ + return !m_pImpl->m_sMimeType.isEmpty() ? m_pImpl->m_sMimeType : AVMEDIA_MIMETYPE_COMMON; +} + void MediaItem::setState( MediaState eState ) { m_pImpl->m_eState = eState; diff --git a/avmedia/source/inc/mediamisc.hxx b/avmedia/source/inc/mediamisc.hxx index 9d04cd662341..19d5edc7ecac 100644 --- a/avmedia/source/inc/mediamisc.hxx +++ b/avmedia/source/inc/mediamisc.hxx @@ -37,6 +37,13 @@ class ResMgr; #endif #endif +#define AVMEDIA_OPENGL_MANAGER_SERVICE_NAME "com.sun.star.media.Manager_OpenGL" + +// Mime types +#define AVMEDIA_MIMETYPE_COMMON "application/vnd.sun.star.media" +#define AVMEDIA_MIMETYPE_JSON "application/vnd.gltf+json" + + namespace avmedia { ResMgr* GetResMgr(); diff --git a/avmedia/source/viewer/mediawindow_impl.cxx b/avmedia/source/viewer/mediawindow_impl.cxx index 43416d3e760a..f24c6e18c214 100644 --- a/avmedia/source/viewer/mediawindow_impl.cxx +++ b/avmedia/source/viewer/mediawindow_impl.cxx @@ -205,51 +205,67 @@ MediaWindowImpl::~MediaWindowImpl() delete mpMediaWindowControl; } -uno::Reference< media::XPlayer > MediaWindowImpl::createPlayer( const OUString& rURL, const OUString& rReferer ) +uno::Reference< media::XPlayer > MediaWindowImpl::createPlayer( const OUString& rURL, const OUString& rReferer, OUString* pMimeType ) { + uno::Reference< media::XPlayer > xPlayer; if (SvtSecurityOptions().isUntrustedReferer(rReferer)) { return xPlayer; } - uno::Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() ); - static const char * aServiceManagers[] = { - AVMEDIA_MANAGER_SERVICE_PREFERRED, - AVMEDIA_MANAGER_SERVICE_NAME, + if ( !pMimeType || *pMimeType == AVMEDIA_MIMETYPE_COMMON ) + { + + static const char * aServiceManagers[] = { + AVMEDIA_MANAGER_SERVICE_PREFERRED, + AVMEDIA_MANAGER_SERVICE_NAME, // a fallback path just for gstreamer which has // two significant versions deployed at once ... #ifdef AVMEDIA_MANAGER_SERVICE_NAME_OLD - AVMEDIA_MANAGER_SERVICE_NAME_OLD + AVMEDIA_MANAGER_SERVICE_NAME_OLD #endif - }; + }; - for( sal_uInt32 i = 0; !xPlayer.is() && i < SAL_N_ELEMENTS( aServiceManagers ); ++i ) - { - const OUString aServiceName( aServiceManagers[ i ], - strlen( aServiceManagers[ i ] ), - RTL_TEXTENCODING_ASCII_US ); - - try { - uno::Reference< media::XManager > xManager ( - xContext->getServiceManager()->createInstanceWithContext(aServiceName, xContext), - uno::UNO_QUERY ); - if( xManager.is() ) - xPlayer = uno::Reference< media::XPlayer >( xManager->createPlayer( rURL ), - uno::UNO_QUERY ); - else - SAL_WARN( "avmedia", - "failed to create media player service " << aServiceName ); - } catch ( const uno::Exception &e ) { - SAL_WARN( "avmedia", - "couldn't create media player " << aServiceName - << ", exception '" << e.Message << '\''); + for( sal_uInt32 i = 0; !xPlayer.is() && i < SAL_N_ELEMENTS( aServiceManagers ); ++i ) + { + const OUString aServiceName( aServiceManagers[ i ], + strlen( aServiceManagers[ i ] ), + RTL_TEXTENCODING_ASCII_US ); + + xPlayer = createPlayer(rURL, aServiceName, xContext); } } + else if ( *pMimeType == AVMEDIA_MIMETYPE_JSON ) + { + xPlayer = createPlayer(rURL, AVMEDIA_OPENGL_MANAGER_SERVICE_NAME, xContext); + } return xPlayer; } +uno::Reference< media::XPlayer > MediaWindowImpl::createPlayer( + const OUString& rURL, const OUString& rManagerServName, + uno::Reference< uno::XComponentContext > xContext) +{ + uno::Reference< media::XPlayer > xPlayer; + try + { + uno::Reference< media::XManager > xManager ( + xContext->getServiceManager()->createInstanceWithContext(rManagerServName, xContext), + uno::UNO_QUERY ); + if( xManager.is() ) + xPlayer = uno::Reference< media::XPlayer >( xManager->createPlayer( rURL ), uno::UNO_QUERY ); + else + SAL_WARN( "avmedia", "failed to create media player service " << rManagerServName ); + } catch ( const uno::Exception &e ) + { + SAL_WARN( "avmedia", "couldn't create media player " << rManagerServName + << ", exception '" << e.Message << '\''); + } + return xPlayer; +} + void MediaWindowImpl::setURL( const OUString& rURL, OUString const& rTempURL, OUString const& rReferer) { @@ -283,8 +299,7 @@ void MediaWindowImpl::setURL( const OUString& rURL, maFileURL = rURL; } - mxPlayer = createPlayer( - (!mTempFileURL.isEmpty()) ? mTempFileURL : maFileURL, rReferer ); + mxPlayer = createPlayer((!mTempFileURL.isEmpty()) ? mTempFileURL : maFileURL, rReferer, &m_sMimeType ); onURLChanged(); } } @@ -341,7 +356,10 @@ void MediaWindowImpl::executeMediaItem( const MediaItem& rItem ) // set URL first if( nMaskSet & AVMEDIA_SETMASK_URL ) + { + m_sMimeType = rItem.getMimeType(); setURL( rItem.getURL(), rItem.getTempURL(), rItem.getReferer() ); + } // set different states next if( nMaskSet & AVMEDIA_SETMASK_TIME ) diff --git a/avmedia/source/viewer/mediawindow_impl.hxx b/avmedia/source/viewer/mediawindow_impl.hxx index fd8bab7aa653..e0018639fc96 100644 --- a/avmedia/source/viewer/mediawindow_impl.hxx +++ b/avmedia/source/viewer/mediawindow_impl.hxx @@ -29,6 +29,9 @@ namespace com { namespace sun { namespace star { namespace media { class XPlayer; class XPlayerWindow; } } } } +namespace com { namespace sun { namespace star { namespace uno { + class XComponentContext; +} } } } class BitmapEx; namespace avmedia @@ -91,7 +94,7 @@ namespace avmedia MediaWindowImpl( Window* parent, MediaWindow* pMediaWindow, bool bInternalMediaControl ); virtual ~MediaWindowImpl(); - static ::com::sun::star::uno::Reference< ::com::sun::star::media::XPlayer > createPlayer( const OUString& rURL, const OUString& rReferer ); + static ::com::sun::star::uno::Reference< ::com::sun::star::media::XPlayer > createPlayer( const OUString& rURL, const OUString& rReferer, OUString* pMimeType = 0 ); void setURL( const OUString& rURL, OUString const& rTempURL, OUString const& rReferer ); @@ -158,9 +161,12 @@ namespace avmedia void onURLChanged(); + static ::com::sun::star::uno::Reference< ::com::sun::star::media::XPlayer > createPlayer( const OUString& rURL, const OUString& rManagerServName, ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > xContext); + OUString maFileURL; OUString mTempFileURL; OUString maReferer; + OUString m_sMimeType; ::com::sun::star::uno::Reference< ::com::sun::star::media::XPlayer > mxPlayer; ::com::sun::star::uno::Reference< ::com::sun::star::media::XPlayerWindow > mxPlayerWindow; MediaWindow* mpMediaWindow; |