summaryrefslogtreecommitdiff
path: root/avmedia
diff options
context:
space:
mode:
authorZolnai Tamás <tamas.zolnai@collabora.com>2014-04-04 13:14:45 +0200
committerroot <root@linux-3qg3.site>2014-04-04 19:06:11 +0200
commitf470f3c72efb3fad109e62247c4d0abebc359345 (patch)
treef3a7969c13bae5d43ba5bc09935117c78deb5742 /avmedia
parent97b20c9deee46195357896197440cc1cc43d3452 (diff)
Introduce a new media shape property to handle mime type
Default mime-type for all media objects: "application/vnd.sun.star.media" The problem of missing mime-type detection still exists. For now only glTF model has a concrete type. Change-Id: I4dca26c1c47a564579bbed926bffa3aa5eda6c04
Diffstat (limited to 'avmedia')
-rw-r--r--avmedia/source/framework/mediaitem.cxx24
-rw-r--r--avmedia/source/inc/mediamisc.hxx7
-rw-r--r--avmedia/source/viewer/mediawindow_impl.cxx76
-rw-r--r--avmedia/source/viewer/mediawindow_impl.hxx8
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;