[Libreoffice-commits] core.git: Branch 'aoo/trunk' - avmedia/source

Herbert Dürr hdu at apache.org
Mon May 12 09:08:09 PDT 2014


 avmedia/source/macavf/macavf_common.hxx       |   89 ++++
 avmedia/source/macavf/macavf_framegrabber.cxx |  137 +++++++
 avmedia/source/macavf/macavf_framegrabber.hxx |   65 +++
 avmedia/source/macavf/macavf_macavfcommon.hxx |   89 ++++
 avmedia/source/macavf/macavf_macavfuno.cxx    |   70 +++
 avmedia/source/macavf/macavf_manager.cxx      |   91 ++++
 avmedia/source/macavf/macavf_manager.hxx      |   59 +++
 avmedia/source/macavf/macavf_player.cxx       |  475 ++++++++++++++++++++++++++
 avmedia/source/macavf/macavf_player.hxx       |   97 +++++
 avmedia/source/macavf/macavf_uno.cxx          |   70 +++
 avmedia/source/macavf/macavf_window.cxx       |  341 ++++++++++++++++++
 avmedia/source/macavf/macavf_window.hxx       |  124 ++++++
 avmedia/source/macavf/makefile.mk             |   14 
 avmedia/source/quicktime/makefile.mk          |   14 
 avmedia/source/quicktime/qt_common.hxx        |   65 +++
 avmedia/source/quicktime/qt_framegrabber.cxx  |  142 +++++++
 avmedia/source/quicktime/qt_framegrabber.hxx  |   67 +++
 avmedia/source/quicktime/qt_manager.cxx       |   92 +++++
 avmedia/source/quicktime/qt_manager.hxx       |   60 +++
 avmedia/source/quicktime/qt_player.cxx        |  459 +++++++++++++++++++++++++
 avmedia/source/quicktime/qt_player.hxx        |  107 +++++
 avmedia/source/quicktime/qt_uno.cxx           |   71 +++
 avmedia/source/quicktime/qt_window.cxx        |  348 +++++++++++++++++++
 avmedia/source/quicktime/qt_window.hxx        |  109 +++++
 24 files changed, 3241 insertions(+), 14 deletions(-)

New commits:
commit c8ae4566ddb961775f35952dff52233faa0a0668
Author: Herbert Dürr <hdu at apache.org>
Date:   Mon May 12 15:50:40 2014 +0000

    #i124875# avoid avmedia build problems with multiple active backends
    
    in the dmake build environment active header and source files with the
    same name result in problems when in the same project. The Quicktime and
    MacAVF files have been renamed so that both can be active concurrently.

diff --git a/avmedia/source/macavf/macavf_common.hxx b/avmedia/source/macavf/macavf_common.hxx
new file mode 100644
index 0000000..9b39b9f
--- /dev/null
+++ b/avmedia/source/macavf/macavf_common.hxx
@@ -0,0 +1,89 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+#ifndef MACAVF_COMMON_HXX
+#define MACAVF_COMMON_HXX
+
+#ifdef MACOSX
+#include <premac.h>
+#import <Cocoa/Cocoa.h>
+#import <AVFoundation/AVFoundation.h>
+#include <postmac.h>
+#endif
+#include <osl/mutex.hxx>
+#include <rtl/ustring.hxx>
+#include <tools/debug.hxx>
+#include <tools/stream.hxx>
+#include <tools/string.hxx>
+#include <tools/urlobj.hxx>
+#include <cppuhelper/implbase1.hxx>
+#include <cppuhelper/implbase2.hxx>
+#include <cppuhelper/weak.hxx>
+#include <cppuhelper/factory.hxx>
+
+#include <com/sun/star/uno/Reference.h>
+#include <com/sun/star/uno/RuntimeException.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/registry/XRegistryKey.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/awt/Rectangle.hpp>
+#include <com/sun/star/awt/KeyModifier.hpp>
+#include <com/sun/star/awt/MouseButton.hpp>
+#include <com/sun/star/media/XManager.hpp>
+
+
+#define AVMEDIA_MACAVF_MANAGER_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.Manager_MacAVF"
+#define AVMEDIA_MACAVF_MANAGER_SERVICENAME "com.sun.star.media.Manager_MacAVF"
+
+#define AVMEDIA_MACAVF_PLAYER_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.Player_MacAVF"
+#define AVMEDIA_MACAVF_PLAYER_SERVICENAME "com.sun.star.media.Player_MacAVF"
+
+#define AVMEDIA_MACAVF_WINDOW_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.Window_MacAVF"
+#define AVMEDIA_MACAVF_WINDOW_SERVICENAME "com.sun.star.media.Window_MacAVF"
+
+#define AVMEDIA_MACAVF_FRAMEGRABBER_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.FrameGrabber_MacAVF"
+#define AVMEDIA_MACAVF_FRAMEGRABBER_SERVICENAME "com.sun.star.media.FrameGrabber_MacAVF"
+
+
+// MacAVObserver handles the notifications used in the AVFoundation framework
+
+ at interface MacAVObserverObject : NSObject
+- (void)observeValueForKeyPath:(NSString*)pKeyPath ofObject:(id)pObject change:(NSDictionary*)pChangeDict context:(void*)pContext;
+- (void)onNotification:(NSNotification*)pNotification;
+ at end
+
+namespace avmedia { namespace macavf {
+
+class MacAVObserverHandler
+{
+private:
+    static MacAVObserverObject* mpMacAVObserverObject;
+public:
+    MacAVObserverObject* getObserver( void ) const;
+    virtual bool handleObservation( NSString* pKeyPath ) = 0;
+};
+
+}}
+
+#endif // MACAVF_COMMON_HXX
+
diff --git a/avmedia/source/macavf/macavf_framegrabber.cxx b/avmedia/source/macavf/macavf_framegrabber.cxx
new file mode 100644
index 0000000..1748199
--- /dev/null
+++ b/avmedia/source/macavf/macavf_framegrabber.cxx
@@ -0,0 +1,137 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+#include "macavf_framegrabber.hxx"
+#include "macavf_player.hxx"
+
+#include <tools/stream.hxx>
+#include <vcl/graph.hxx>
+#include <vcl/cvtgrf.hxx>
+#include <unotools/localfilehelper.hxx>
+
+using namespace ::com::sun::star;
+
+namespace avmedia { namespace macavf {
+
+// ----------------
+// - FrameGrabber -
+// ----------------
+
+FrameGrabber::FrameGrabber( const uno::Reference< lang::XMultiServiceFactory >& /*rxMgr*/ )
+:   mpImageGen( NULL )
+{}
+
+// ------------------------------------------------------------------------------
+
+FrameGrabber::~FrameGrabber()
+{
+    if( mpImageGen )
+        CFRelease( mpImageGen );
+}
+
+// ------------------------------------------------------------------------------
+
+bool FrameGrabber::create( const ::rtl::OUString& rURL )
+{
+    // TODO: use AVPlayer's movie directly instead of loading it here?
+
+    NSString* pNSStr = [NSString stringWithCharacters:rURL.getStr() length:rURL.getLength()];
+    NSURL* pNSURL = [NSURL URLWithString: [pNSStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
+    AVAsset* pMovie = [AVURLAsset URLAssetWithURL:pNSURL options:nil];
+    if( !pMovie )
+    {
+        OSL_TRACE( "AVGrabber::create() cannot load url=\"%s\"", [pNSStr UTF8String] );
+        return false;
+    }
+    if( [[pMovie tracksWithMediaType:AVMediaTypeVideo] count] == 0)
+    {
+        OSL_TRACE( "AVGrabber::create() found no video in url=\"%s\"", [pNSStr UTF8String] );
+        return false;
+    }
+
+    mpImageGen = [AVAssetImageGenerator assetImageGeneratorWithAsset:pMovie];
+    CFRetain( mpImageGen );
+    return true;
+}
+
+// ------------------------------------------------------------------------------
+
+uno::Reference< graphic::XGraphic > SAL_CALL FrameGrabber::grabFrame( double fMediaTime )
+    throw (uno::RuntimeException)
+{
+    uno::Reference< graphic::XGraphic > xRet;
+    if( !mpImageGen )
+        return xRet;
+    OSL_TRACE( "AVPlayer::grabFrame( %.3fsec)", fMediaTime );
+
+    // get the requested image from the movie
+    CGImage* pCGImage = [mpImageGen copyCGImageAtTime:CMTimeMakeWithSeconds(fMediaTime,1000) actualTime:NULL error:NULL];
+
+    // convert the image to a TIFF-formatted byte-array
+    CFMutableDataRef pCFData = CFDataCreateMutable( kCFAllocatorDefault, 0 );
+    CGImageDestination* pCGImgDest = CGImageDestinationCreateWithData( pCFData, kUTTypeTIFF, 1, 0 );
+    CGImageDestinationAddImage( pCGImgDest, pCGImage, NULL );
+    CGImageDestinationFinalize( pCGImgDest );
+    CFRelease( pCGImgDest );
+    const long nBitmapLen = CFDataGetLength( pCFData );
+    void* pBitmapBytes = (void*)CFDataGetBytePtr( pCFData );
+
+    // convert the image into the return-value type which is a graphic::XGraphic
+    SvMemoryStream aMemStm( pBitmapBytes, nBitmapLen, STREAM_READ | STREAM_WRITE );
+    Graphic aGraphic;
+    if( GraphicConverter::Import( aMemStm, aGraphic, CVT_TIF ) == ERRCODE_NONE )
+        xRet = aGraphic.GetXGraphic();
+
+    // clean up resources
+    CFRelease( pCFData );
+    return xRet;
+}
+
+// ------------------------------------------------------------------------------
+
+::rtl::OUString SAL_CALL FrameGrabber::getImplementationName(  )
+    throw (uno::RuntimeException)
+{
+    return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_MACAVF_FRAMEGRABBER_IMPLEMENTATIONNAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL FrameGrabber::supportsService( const ::rtl::OUString& ServiceName )
+    throw (uno::RuntimeException)
+{
+    return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( AVMEDIA_MACAVF_FRAMEGRABBER_SERVICENAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+uno::Sequence< ::rtl::OUString > SAL_CALL FrameGrabber::getSupportedServiceNames(  )
+    throw (uno::RuntimeException)
+{
+    uno::Sequence< ::rtl::OUString > aRet(1);
+    aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( AVMEDIA_MACAVF_FRAMEGRABBER_SERVICENAME ) );
+
+    return aRet;
+}
+
+} // namespace macavf
+} // namespace avmedia
+
diff --git a/avmedia/source/macavf/macavf_framegrabber.hxx b/avmedia/source/macavf/macavf_framegrabber.hxx
new file mode 100644
index 0000000..21d1dad
--- /dev/null
+++ b/avmedia/source/macavf/macavf_framegrabber.hxx
@@ -0,0 +1,65 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+
+#ifndef MACAVF_FRAMEGRABBER_HXX
+#define MACAVF_FRAMEGRABBER_HXX
+
+#include "macavf_common.hxx"
+
+#include "com/sun/star/media/XFrameGrabber.hdl"
+
+namespace avmedia { namespace macavf {
+
+// ----------------
+// - FrameGrabber -
+// ----------------
+
+class FrameGrabber : public ::cppu::WeakImplHelper2 < ::com::sun::star::media::XFrameGrabber,
+                                                      ::com::sun::star::lang::XServiceInfo >
+{
+public:
+
+    explicit FrameGrabber( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& );
+    virtual  ~FrameGrabber();
+
+    bool    create( const ::rtl::OUString& rURL );
+
+    // XFrameGrabber
+    virtual ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > SAL_CALL grabFrame( double fMediaTime ) throw (::com::sun::star::uno::RuntimeException);
+
+    // XServiceInfo
+    virtual ::rtl::OUString SAL_CALL getImplementationName(  ) throw (::com::sun::star::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException);
+    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  ) throw (::com::sun::star::uno::RuntimeException);
+
+private:
+
+    ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >    mxMgr;
+
+    AVAssetImageGenerator* mpImageGen;
+};
+
+} // namespace macavf
+} // namespace avmedia
+
+#endif // MACAVF_FRAMEGRABBER_HXX
+
diff --git a/avmedia/source/macavf/macavf_macavfcommon.hxx b/avmedia/source/macavf/macavf_macavfcommon.hxx
new file mode 100644
index 0000000..9b39b9f
--- /dev/null
+++ b/avmedia/source/macavf/macavf_macavfcommon.hxx
@@ -0,0 +1,89 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+#ifndef MACAVF_COMMON_HXX
+#define MACAVF_COMMON_HXX
+
+#ifdef MACOSX
+#include <premac.h>
+#import <Cocoa/Cocoa.h>
+#import <AVFoundation/AVFoundation.h>
+#include <postmac.h>
+#endif
+#include <osl/mutex.hxx>
+#include <rtl/ustring.hxx>
+#include <tools/debug.hxx>
+#include <tools/stream.hxx>
+#include <tools/string.hxx>
+#include <tools/urlobj.hxx>
+#include <cppuhelper/implbase1.hxx>
+#include <cppuhelper/implbase2.hxx>
+#include <cppuhelper/weak.hxx>
+#include <cppuhelper/factory.hxx>
+
+#include <com/sun/star/uno/Reference.h>
+#include <com/sun/star/uno/RuntimeException.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/registry/XRegistryKey.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/awt/Rectangle.hpp>
+#include <com/sun/star/awt/KeyModifier.hpp>
+#include <com/sun/star/awt/MouseButton.hpp>
+#include <com/sun/star/media/XManager.hpp>
+
+
+#define AVMEDIA_MACAVF_MANAGER_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.Manager_MacAVF"
+#define AVMEDIA_MACAVF_MANAGER_SERVICENAME "com.sun.star.media.Manager_MacAVF"
+
+#define AVMEDIA_MACAVF_PLAYER_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.Player_MacAVF"
+#define AVMEDIA_MACAVF_PLAYER_SERVICENAME "com.sun.star.media.Player_MacAVF"
+
+#define AVMEDIA_MACAVF_WINDOW_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.Window_MacAVF"
+#define AVMEDIA_MACAVF_WINDOW_SERVICENAME "com.sun.star.media.Window_MacAVF"
+
+#define AVMEDIA_MACAVF_FRAMEGRABBER_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.FrameGrabber_MacAVF"
+#define AVMEDIA_MACAVF_FRAMEGRABBER_SERVICENAME "com.sun.star.media.FrameGrabber_MacAVF"
+
+
+// MacAVObserver handles the notifications used in the AVFoundation framework
+
+ at interface MacAVObserverObject : NSObject
+- (void)observeValueForKeyPath:(NSString*)pKeyPath ofObject:(id)pObject change:(NSDictionary*)pChangeDict context:(void*)pContext;
+- (void)onNotification:(NSNotification*)pNotification;
+ at end
+
+namespace avmedia { namespace macavf {
+
+class MacAVObserverHandler
+{
+private:
+    static MacAVObserverObject* mpMacAVObserverObject;
+public:
+    MacAVObserverObject* getObserver( void ) const;
+    virtual bool handleObservation( NSString* pKeyPath ) = 0;
+};
+
+}}
+
+#endif // MACAVF_COMMON_HXX
+
diff --git a/avmedia/source/macavf/macavf_macavfuno.cxx b/avmedia/source/macavf/macavf_macavfuno.cxx
new file mode 100644
index 0000000..470f95c
--- /dev/null
+++ b/avmedia/source/macavf/macavf_macavfuno.cxx
@@ -0,0 +1,70 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+#include "macavf_manager.hxx"
+
+using namespace ::com::sun::star;
+
+// -------------------
+// - factory methods -
+// -------------------
+
+static uno::Reference< uno::XInterface > SAL_CALL create_MediaPlayer( const uno::Reference< lang::XMultiServiceFactory >& rxFact )
+{
+    return uno::Reference< uno::XInterface >( *new ::avmedia::macavf::Manager( rxFact ) );
+}
+
+// ------------------------------------------
+// - component_getImplementationEnvironment -
+// ------------------------------------------
+
+extern "C" void SAL_CALL component_getImplementationEnvironment( const sal_Char ** ppEnvTypeName, uno_Environment ** /* ppEnv */ )
+{
+    *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
+}
+
+// ------------------------
+// - component_getFactory -
+// ------------------------
+
+extern "C" void* SAL_CALL component_getFactory( const sal_Char* pImplName, void* pServiceManager, void* /* pRegistryKey */ )
+{
+    uno::Reference< lang::XSingleServiceFactory > xFactory;
+    void*                                   pRet = 0;
+
+    if( rtl_str_compare( pImplName, AVMEDIA_MACAVF_MANAGER_IMPLEMENTATIONNAME ) == 0 )
+    {
+        const ::rtl::OUString aServiceName( ::rtl::OUString::createFromAscii( AVMEDIA_MACAVF_MANAGER_SERVICENAME ) );
+
+        xFactory = uno::Reference< lang::XSingleServiceFactory >( ::cppu::createSingleFactory(
+                        reinterpret_cast< lang::XMultiServiceFactory* >( pServiceManager ),
+                        ::rtl::OUString::createFromAscii( AVMEDIA_MACAVF_MANAGER_IMPLEMENTATIONNAME ),
+                        create_MediaPlayer, uno::Sequence< ::rtl::OUString >( &aServiceName, 1 ) ) );
+    }
+
+    if( xFactory.is() )
+    {
+        xFactory->acquire();
+        pRet = xFactory.get();
+    }
+
+    return pRet;
+}
diff --git a/avmedia/source/macavf/macavf_manager.cxx b/avmedia/source/macavf/macavf_manager.cxx
new file mode 100644
index 0000000..0ae907b
--- /dev/null
+++ b/avmedia/source/macavf/macavf_manager.cxx
@@ -0,0 +1,91 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+#include "macavf_manager.hxx"
+#include "macavf_player.hxx"
+
+#include <tools/urlobj.hxx>
+
+using namespace ::com::sun::star;
+
+namespace avmedia { namespace macavf {
+
+// ----------------
+// - Manager -
+// ----------------
+
+Manager::Manager( const uno::Reference< lang::XMultiServiceFactory >& rxMgr ) :
+    mxMgr( rxMgr )
+{
+    OSL_TRACE( "Constructing avmedia::macavf::Manager" );
+}
+
+// ------------------------------------------------------------------------------
+
+Manager::~Manager()
+{}
+
+// ------------------------------------------------------------------------------
+
+uno::Reference< media::XPlayer > SAL_CALL Manager::createPlayer( const ::rtl::OUString& rURL )
+    throw (uno::RuntimeException)
+{
+    Player*                             pPlayer( new Player( mxMgr ) );
+    uno::Reference< media::XPlayer >    xRet( pPlayer );
+    INetURLObject                       aURL( rURL );
+
+    OSL_TRACE( "avmediamacavf: Manager::createPlayer" );
+
+    if( !pPlayer->create( aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) )  )
+        xRet = uno::Reference< media::XPlayer >();
+
+    return xRet;
+}
+
+// ------------------------------------------------------------------------------
+
+::rtl::OUString SAL_CALL Manager::getImplementationName(  )
+    throw (uno::RuntimeException)
+{
+    return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_MACAVF_MANAGER_IMPLEMENTATIONNAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL Manager::supportsService( const ::rtl::OUString& ServiceName )
+    throw (uno::RuntimeException)
+{
+    return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( AVMEDIA_MACAVF_MANAGER_SERVICENAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+uno::Sequence< ::rtl::OUString > SAL_CALL Manager::getSupportedServiceNames(  )
+    throw (uno::RuntimeException)
+{
+    uno::Sequence< ::rtl::OUString > aRet(1);
+    aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( AVMEDIA_MACAVF_MANAGER_SERVICENAME ) );
+
+    return aRet;
+}
+
+} // namespace macavf
+} // namespace avmedia
diff --git a/avmedia/source/macavf/macavf_manager.hxx b/avmedia/source/macavf/macavf_manager.hxx
new file mode 100644
index 0000000..d500aec
--- /dev/null
+++ b/avmedia/source/macavf/macavf_manager.hxx
@@ -0,0 +1,59 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+#ifndef MACAVF_MANAGER_HXX
+#define MACAVF_MANAGER_HXX
+
+#include "macavf_common.hxx"
+
+#include "com/sun/star/media/XManager.hdl"
+
+// -----------
+// - Manager -
+// -----------
+
+namespace avmedia { namespace macavf {
+
+class Manager : public ::cppu::WeakImplHelper2 < ::com::sun::star::media::XManager,
+                                                 ::com::sun::star::lang::XServiceInfo >
+{
+public:
+
+    Manager( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxMgr );
+    ~Manager();
+
+    // XManager
+    virtual ::com::sun::star::uno::Reference< ::com::sun::star::media::XPlayer > SAL_CALL createPlayer( const ::rtl::OUString& aURL ) throw (::com::sun::star::uno::RuntimeException);
+
+    // XServiceInfo
+    virtual ::rtl::OUString SAL_CALL getImplementationName(  ) throw (::com::sun::star::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException);
+    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  ) throw (::com::sun::star::uno::RuntimeException);
+private:
+
+    ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxMgr;
+};
+
+} // namespace macavf
+} // namespace avmedia
+
+#endif // MACAVF_MANAGER_HXX
+
diff --git a/avmedia/source/macavf/macavf_player.cxx b/avmedia/source/macavf/macavf_player.cxx
new file mode 100644
index 0000000..2e15907
--- /dev/null
+++ b/avmedia/source/macavf/macavf_player.cxx
@@ -0,0 +1,475 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+
+#include "macavf_player.hxx"
+#include "macavf_framegrabber.hxx"
+#include "macavf_window.hxx"
+
+#include <cmath> // for log10()
+
+using namespace ::com::sun::star;
+
+#include <hash_map>
+typedef std::hash_map<NSObject*,avmedia::macavf::MacAVObserverHandler*> HandlersForObject;
+
+ at implementation MacAVObserverObject
+{
+    HandlersForObject maHandlersForObject;
+}
+- (void)observeValueForKeyPath:(NSString*)pKeyPath ofObject:(id)pObject change:(NSDictionary*)pChangeDict context:(void*)pContext
+{
+    NSString* pDictStr = [NSString stringWithFormat:@"%@", pChangeDict];
+    OSL_TRACE( "MacAVObserver::onKeyChange k=\"%s\" c=%s", [pKeyPath UTF8String], [pDictStr UTF8String]);
+    avmedia::macavf::MacAVObserverHandler* pHandler = (avmedia::macavf::MacAVObserverHandler*)pContext;
+    pHandler->handleObservation( pKeyPath );
+}
+
+- (void)onNotification:(NSNotification*)pNotification
+{
+    NSString* pNoteName = (NSString*)[pNotification name];
+    OSL_TRACE( "MacAVObserver::onNotification key=\"%s\"", [pNoteName UTF8String]);
+    HandlersForObject::iterator it = maHandlersForObject.find( [pNotification object]);
+    if( it != maHandlersForObject.end() )
+        (*it).second->handleObservation( pNoteName );
+}
+
+- (void)setHandlerForObject:(NSObject*)pObject handler:(avmedia::macavf::MacAVObserverHandler*)pHandler
+{
+    maHandlersForObject[ pObject] = pHandler;
+}
+
+- (void)removeHandlerForObject:(NSObject*)pObject
+{
+    maHandlersForObject.erase( pObject);
+}
+
+ at end
+
+
+namespace avmedia { namespace macavf {
+
+MacAVObserverObject* MacAVObserverHandler::mpMacAVObserverObject = NULL;
+
+MacAVObserverObject* MacAVObserverHandler::getObserver() const
+{
+    if( !mpMacAVObserverObject)
+    {
+        mpMacAVObserverObject = [MacAVObserverObject alloc];
+        [mpMacAVObserverObject retain];
+    }
+    return mpMacAVObserverObject;
+}
+
+
+// ----------------
+// - Player -
+// ----------------
+
+Player::Player( const uno::Reference< lang::XMultiServiceFactory >& rxMgr )
+:   mxMgr( rxMgr )
+,   mpPlayer( NULL )
+,   mfUnmutedVolume( 0 )
+,   mfStopTime( DBL_MAX )
+,   mbMuted( false )
+,   mbLooping( false )
+{}
+
+// ------------------------------------------------------------------------------
+
+Player::~Player()
+{
+    if( !mpPlayer )
+        return;
+    // remove the observers
+    [mpPlayer removeObserver:getObserver() forKeyPath:@"currentItem.status"];
+    AVPlayerItem* pOldPlayerItem = [mpPlayer currentItem];
+    [[NSNotificationCenter defaultCenter] removeObserver:getObserver()
+        name:AVPlayerItemDidPlayToEndTimeNotification
+        object:pOldPlayerItem];
+    [getObserver() removeHandlerForObject:pOldPlayerItem];
+    // release the AVPlayer
+    CFRelease( mpPlayer );
+}
+
+// ------------------------------------------------------------------------------
+
+AVAsset* Player::getMovie()
+{
+    if( !mpPlayer )
+        return nil;
+    AVAsset* pMovie = [[mpPlayer currentItem] asset];
+    OSL_ASSERT( pMovie );
+    return pMovie;
+}
+
+// ------------------------------------------------------------------------------
+
+bool Player::handleObservation( NSString* pKeyPath )
+{
+    OSL_TRACE( "AVPlayer::handleObservation key=\"%s\"", [pKeyPath UTF8String]);
+    if( [pKeyPath isEqualToString:AVPlayerItemDidPlayToEndTimeNotification])
+    {
+        OSL_TRACE( "AVPlayer replay=%d", mbLooping);
+        if( mbLooping )
+            setMediaTime( 0.0);
+    }
+    return true;
+}
+
+// ------------------------------------------------------------------------------
+
+bool Player::create( const ::rtl::OUString& rURL )
+{
+    maURL = rURL;
+
+    // get the media asset
+    NSString* aNSStr = [NSString stringWithCharacters:rURL.getStr() length:rURL.getLength()];
+    NSURL* aNSURL = [NSURL URLWithString: [aNSStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
+    // get the matching AVPlayerItem
+    AVPlayerItem* pPlayerItem = [AVPlayerItem playerItemWithURL:aNSURL];
+
+    // create or update the AVPlayer with the new AVPlayerItem
+    if( !mpPlayer )
+    {
+        mpPlayer = [AVPlayer playerWithPlayerItem:pPlayerItem];
+        CFRetain( mpPlayer );
+        [mpPlayer setActionAtItemEnd:AVPlayerActionAtItemEndNone];
+    }
+    else
+    {
+        // remove the obsoleted observers
+        AVPlayerItem* pOldPlayerItem = [mpPlayer currentItem];
+        [mpPlayer removeObserver:getObserver() forKeyPath:@"currentItem.status"];
+        [getObserver() removeHandlerForObject:pOldPlayerItem];
+        [[NSNotificationCenter defaultCenter] removeObserver:getObserver()
+            name:AVPlayerItemDidPlayToEndTimeNotification
+            object:pOldPlayerItem];
+        // replace the playeritem
+        [mpPlayer replaceCurrentItemWithPlayerItem:pPlayerItem];
+    }
+
+    // observe the status of the current player item
+    [mpPlayer addObserver:getObserver() forKeyPath:@"currentItem.status" options:0 context:this];
+
+    // observe playback-end needed for playback looping
+    [[NSNotificationCenter defaultCenter] addObserver:getObserver()
+        selector:@selector(onNotification:)
+        name:AVPlayerItemDidPlayToEndTimeNotification
+        object:pPlayerItem];
+    [getObserver() setHandlerForObject:pPlayerItem handler:this];
+
+    return true;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::start()
+    throw (uno::RuntimeException)
+{
+    if( !mpPlayer )
+        return;
+#if 0
+    const AVPlayerStatus eStatus = [mpPlayer status];
+    OSL_TRACE ("Player::start status=%d", (int)eStatus);
+    if( eStatus == AVPlayerStatusReadyToPlay)
+#endif
+        [mpPlayer play];
+    // else // TODO: delay until it becomes ready
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::stop()
+    throw (uno::RuntimeException)
+{
+    if( !mpPlayer )
+        return;
+    const bool bPlaying = isPlaying();
+    OSL_TRACE ("Player::stop() playing=%d", bPlaying);
+    if( bPlaying )
+        [mpPlayer pause];
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL Player::isPlaying()
+    throw (uno::RuntimeException)
+{
+    if( !mpPlayer )
+        return false;
+    const float fRate = [mpPlayer rate];
+    return (fRate != 0.0);
+}
+
+// ------------------------------------------------------------------------------
+
+double SAL_CALL Player::getDuration()
+    throw (uno::RuntimeException)
+{
+    // slideshow checks for non-zero duration, so cheat here
+    double duration = 0.01;
+
+    if( mpPlayer )
+    {
+        AVPlayerItem* pItem = [mpPlayer currentItem];
+        duration = CMTimeGetSeconds( [pItem duration] );
+    }
+
+    return duration;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::setMediaTime( double fTime )
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE ("Player::setMediaTime( %.3fsec)", fTime);
+    if( mpPlayer )
+        [mpPlayer seekToTime: CMTimeMakeWithSeconds(fTime,1000) ];
+}
+
+// ------------------------------------------------------------------------------
+
+double SAL_CALL Player::getMediaTime()
+    throw (uno::RuntimeException)
+{
+    if( !mpPlayer )
+        return 0.0;
+
+    const double position = CMTimeGetSeconds( [mpPlayer currentTime] );
+    OSL_TRACE( "Player::getMediaTime() = %.3fsec", position);
+    if( position >= mfStopTime )
+        if( isPlaying() )
+            stop();
+
+    return position;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::setStopTime( double fTime )
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE ("Player::setStopTime( %.3fsec)", fTime);
+    mfStopTime = fTime;
+}
+
+// ------------------------------------------------------------------------------
+
+double SAL_CALL Player::getStopTime()
+    throw (uno::RuntimeException)
+{
+    return mfStopTime;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::setRate( double fRate )
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE ("Player::setRate( %.3f)", fRate);
+    if( !mpPlayer )
+        return;
+
+    // playback rate: 0 = stop, 1 = normal speed, 2 = double speed, -1 = normal speed backwards
+    [mpPlayer setRate: fRate];
+}
+
+// ------------------------------------------------------------------------------
+
+double SAL_CALL Player::getRate()
+    throw (uno::RuntimeException)
+{
+    // macavf: 0 = stop, 1 = normal speed, 2 = double speed, -1 = normal speed backwards
+    const double fRate = mpPlayer ? (double)[mpPlayer rate] : 1.0;
+    OSL_TRACE ("Player::getRate() = %.3f", fRate);
+    return fRate;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::setPlaybackLoop( sal_Bool bSet )
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE ("Player::setPlaybackLoop( %d)", bSet );
+    mbLooping = bSet;
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL Player::isPlaybackLoop()
+    throw (uno::RuntimeException)
+{
+    const bool bRet = mbLooping;
+    OSL_TRACE ("Player::isPlaybackLoop() = %d", bRet );
+    return bRet;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::setMute( sal_Bool bSet )
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE( "Player::setMute(%d), was-muted: %d unmuted-volume: %.3f", bSet, mbMuted, mfUnmutedVolume );
+
+    if( !mpPlayer )
+        return;
+
+    mbMuted = (bSet == TRUE);
+    [mpPlayer setMuted:mbMuted];
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL Player::isMute()
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE ("Player::isMuted() = %d", mbMuted);
+    return mbMuted;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::setVolumeDB( sal_Int16 nVolumeDB )
+    throw (uno::RuntimeException)
+{
+    // -40dB <-> AVPlayer volume 0.0
+    //   0dB <-> AVPlayer volume 1.0
+    mfUnmutedVolume = (nVolumeDB <= -40) ? 0.0 : pow( 10.0, nVolumeDB / 20.0 );
+    OSL_TRACE( "Player::setVolume(%ddB), muted=%d, unmuted-volume: %.3f", nVolumeDB, mbMuted, mfUnmutedVolume );
+
+    // change volume
+    if( !mbMuted && mpPlayer )
+        [mpPlayer setVolume:mfUnmutedVolume];
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Int16 SAL_CALL Player::getVolumeDB()
+    throw (uno::RuntimeException)
+{
+    if( !mpPlayer )
+        return 0;
+
+    // get the actual volume
+    const float fVolume = [mpPlayer volume];
+
+    // convert into Dezibel value
+    // -40dB <-> AVPlayer volume 0.0
+    //   0dB <-> AVPlayer volume 1.0
+    const int nVolumeDB = (fVolume <= 0) ? -40 : lrint( 20.0*log10(fVolume));
+
+    return (sal_Int16)nVolumeDB;
+}
+
+// ------------------------------------------------------------------------------
+
+awt::Size SAL_CALL Player::getPreferredPlayerWindowSize()
+    throw (uno::RuntimeException)
+{
+    awt::Size aSize( 0, 0 ); // default size
+
+    AVAsset* pMovie = [[mpPlayer currentItem] asset];
+    NSArray* pVideoTracks = [pMovie tracksWithMediaType:AVMediaTypeVideo];
+    AVAssetTrack* pFirstVideoTrack = (AVAssetTrack*)[pVideoTracks firstObject];
+    if( pFirstVideoTrack )
+    {
+        const CGSize aPrefSize = [pFirstVideoTrack naturalSize];
+        aSize = awt::Size( aPrefSize.width, aPrefSize.height );
+    }
+
+    return aSize;
+}
+
+// ------------------------------------------------------------------------------
+
+uno::Reference< ::media::XPlayerWindow > SAL_CALL Player::createPlayerWindow( const uno::Sequence< uno::Any >& aArguments )
+    throw (uno::RuntimeException)
+{
+    // get the preferred window size
+    const awt::Size aSize( getPreferredPlayerWindowSize() );
+    OSL_TRACE( "Player::createPlayerWindow %dx%d argsLength: %d", aSize.Width, aSize.Height, aArguments.getLength() );
+
+    // get the parent view
+    sal_IntPtr nNSViewPtr = NULL;
+    aArguments[0] >>= nNSViewPtr;
+    NSView* pParentView = reinterpret_cast<NSView*>(nNSViewPtr);
+
+    // check the window parameters
+    uno::Reference< ::media::XPlayerWindow > xRet;
+    if( (aSize.Width <= 0) || (aSize.Height <= 0) || (pParentView == NULL) )
+         return xRet;
+
+    // create the window
+    ::avmedia::macavf::Window* pWindow = new ::avmedia::macavf::Window( mxMgr, *this, pParentView );
+    xRet = pWindow;
+    return xRet;
+}
+
+// ------------------------------------------------------------------------------
+
+uno::Reference< media::XFrameGrabber > SAL_CALL Player::createFrameGrabber()
+    throw (uno::RuntimeException)
+{
+    uno::Reference< media::XFrameGrabber > xRet;
+    OSL_TRACE ("Player::createFrameGrabber");
+
+    if( !maURL.isEmpty() )
+    {
+        FrameGrabber* pGrabber = new FrameGrabber( mxMgr );
+        if( pGrabber->create( maURL ) )
+            xRet = pGrabber;
+    }
+
+    return xRet;
+}
+
+// ------------------------------------------------------------------------------
+
+::rtl::OUString SAL_CALL Player::getImplementationName(  )
+    throw (uno::RuntimeException)
+{
+    return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_MACAVF_PLAYER_IMPLEMENTATIONNAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL Player::supportsService( const ::rtl::OUString& ServiceName )
+    throw (uno::RuntimeException)
+{
+    return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( AVMEDIA_MACAVF_PLAYER_SERVICENAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+uno::Sequence< ::rtl::OUString > SAL_CALL Player::getSupportedServiceNames(  )
+    throw (uno::RuntimeException)
+{
+    uno::Sequence< ::rtl::OUString > aRet(1);
+    aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( AVMEDIA_MACAVF_PLAYER_SERVICENAME ) );
+
+    return aRet;
+}
+
+} // namespace macavf
+} // namespace avmedia
+
diff --git a/avmedia/source/macavf/macavf_player.hxx b/avmedia/source/macavf/macavf_player.hxx
new file mode 100644
index 0000000..98c5454
--- /dev/null
+++ b/avmedia/source/macavf/macavf_player.hxx
@@ -0,0 +1,97 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+
+#ifndef MACAVF_PLAYER_HXX
+#define MACAVF_PLAYER_HXX
+
+#include <osl/conditn.h>
+#include "macavf_common.hxx"
+
+#include "com/sun/star/media/XPlayer.hdl"
+
+namespace avmedia { namespace macavf {
+
+/*
+// ----------
+// - Player -
+// ----------
+*/
+
+class Player
+:   public MacAVObserverHandler
+,   public ::cppu::WeakImplHelper2< ::com::sun::star::media::XPlayer,
+                                    ::com::sun::star::lang::XServiceInfo >
+{
+public:
+    explicit Player( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& );
+    virtual  ~Player();
+
+    bool create( const ::rtl::OUString& rURL );
+
+    // XPlayer
+    virtual void SAL_CALL start() throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL stop() throw (::com::sun::star::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL isPlaying() throw (::com::sun::star::uno::RuntimeException);
+    virtual double SAL_CALL getDuration() throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL setMediaTime( double fTime ) throw (::com::sun::star::uno::RuntimeException);
+    virtual double SAL_CALL getMediaTime() throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL setStopTime( double fTime ) throw (::com::sun::star::uno::RuntimeException);
+    virtual double SAL_CALL getStopTime() throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL setRate( double fRate ) throw (::com::sun::star::uno::RuntimeException);
+    virtual double SAL_CALL getRate() throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL setPlaybackLoop( sal_Bool bSet ) throw (::com::sun::star::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL isPlaybackLoop() throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL setMute( sal_Bool bSet ) throw (::com::sun::star::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL isMute() throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL setVolumeDB( sal_Int16 nVolumeDB ) throw (::com::sun::star::uno::RuntimeException);
+    virtual sal_Int16 SAL_CALL getVolumeDB() throw (::com::sun::star::uno::RuntimeException);
+    virtual ::com::sun::star::awt::Size SAL_CALL getPreferredPlayerWindowSize(  ) throw (::com::sun::star::uno::RuntimeException);
+    virtual ::com::sun::star::uno::Reference< ::com::sun::star::media::XPlayerWindow > SAL_CALL createPlayerWindow( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw (::com::sun::star::uno::RuntimeException);
+    virtual ::com::sun::star::uno::Reference< ::com::sun::star::media::XFrameGrabber > SAL_CALL createFrameGrabber(  ) throw (::com::sun::star::uno::RuntimeException);
+    // XServiceInfo
+    virtual ::rtl::OUString SAL_CALL getImplementationName() throw (::com::sun::star::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException);
+    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  ) throw (::com::sun::star::uno::RuntimeException);
+
+    AVAsset* getMovie();
+    AVPlayer* getAVPlayer() const { return mpPlayer; }
+    virtual bool handleObservation( NSString* pKeyPath );
+
+private:
+    ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxMgr;
+
+    ::rtl::OUString     maURL;
+
+    AVPlayer*           mpPlayer;
+
+    float               mfUnmutedVolume;
+    double              mfStopTime;
+
+    bool                mbMuted;
+    bool                mbLooping;
+};
+
+} // namespace macavf
+} // namespace avmedia
+
+#endif // MACAVF_PLAYER_HXX
+
diff --git a/avmedia/source/macavf/macavf_uno.cxx b/avmedia/source/macavf/macavf_uno.cxx
new file mode 100644
index 0000000..470f95c
--- /dev/null
+++ b/avmedia/source/macavf/macavf_uno.cxx
@@ -0,0 +1,70 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+#include "macavf_manager.hxx"
+
+using namespace ::com::sun::star;
+
+// -------------------
+// - factory methods -
+// -------------------
+
+static uno::Reference< uno::XInterface > SAL_CALL create_MediaPlayer( const uno::Reference< lang::XMultiServiceFactory >& rxFact )
+{
+    return uno::Reference< uno::XInterface >( *new ::avmedia::macavf::Manager( rxFact ) );
+}
+
+// ------------------------------------------
+// - component_getImplementationEnvironment -
+// ------------------------------------------
+
+extern "C" void SAL_CALL component_getImplementationEnvironment( const sal_Char ** ppEnvTypeName, uno_Environment ** /* ppEnv */ )
+{
+    *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
+}
+
+// ------------------------
+// - component_getFactory -
+// ------------------------
+
+extern "C" void* SAL_CALL component_getFactory( const sal_Char* pImplName, void* pServiceManager, void* /* pRegistryKey */ )
+{
+    uno::Reference< lang::XSingleServiceFactory > xFactory;
+    void*                                   pRet = 0;
+
+    if( rtl_str_compare( pImplName, AVMEDIA_MACAVF_MANAGER_IMPLEMENTATIONNAME ) == 0 )
+    {
+        const ::rtl::OUString aServiceName( ::rtl::OUString::createFromAscii( AVMEDIA_MACAVF_MANAGER_SERVICENAME ) );
+
+        xFactory = uno::Reference< lang::XSingleServiceFactory >( ::cppu::createSingleFactory(
+                        reinterpret_cast< lang::XMultiServiceFactory* >( pServiceManager ),
+                        ::rtl::OUString::createFromAscii( AVMEDIA_MACAVF_MANAGER_IMPLEMENTATIONNAME ),
+                        create_MediaPlayer, uno::Sequence< ::rtl::OUString >( &aServiceName, 1 ) ) );
+    }
+
+    if( xFactory.is() )
+    {
+        xFactory->acquire();
+        pRet = xFactory.get();
+    }
+
+    return pRet;
+}
diff --git a/avmedia/source/macavf/macavf_window.cxx b/avmedia/source/macavf/macavf_window.cxx
new file mode 100644
index 0000000..4e9f1a1
--- /dev/null
+++ b/avmedia/source/macavf/macavf_window.cxx
@@ -0,0 +1,341 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+
+#include <com/sun/star/awt/SystemPointer.hpp>
+#include <com/sun/star/awt/PosSize.hpp>
+
+#include "macavf_window.hxx"
+#include "macavf_player.hxx"
+
+using namespace ::com::sun::star;
+
+
+namespace avmedia { namespace macavf {
+
+// ---------------
+// - Window -
+// ---------------
+
+Window::Window( const uno::Reference< lang::XMultiServiceFactory >& i_rxMgr, Player& i_rPlayer, NSView* i_pParentView )
+:   mxMgr( i_rxMgr )
+,   maListeners( maMutex )
+,   meZoomLevel( media::ZoomLevel_NOT_AVAILABLE )
+,   mrPlayer( i_rPlayer )
+,   mnPointerType( awt::SystemPointer::ARROW )
+,   mpView( i_pParentView )
+,   mpPlayerLayer( NULL )
+{
+    OSL_TRACE ("Constructing an avmedia::macavf::Window");
+    if( !mpView ) // sanity check
+        return;
+
+    // check the media asset for video content
+    AVPlayer* pAVPlayer = mrPlayer.getAVPlayer();
+    AVAsset* pMovie = [[pAVPlayer currentItem] asset];
+    const int nVideoCount = [pMovie tracksWithMediaType:AVMediaTypeVideo].count;
+    const int nAudioCount = [pMovie tracksWithMediaType:AVMediaTypeAudio].count;
+    OSL_TRACE( "Found %d video and %d audio tracks.", nVideoCount, nAudioCount );
+    (void)nAudioCount;
+    if( nVideoCount <= 0 )
+        return;
+
+    // setup the AVPlayerLayer
+    [pAVPlayer retain];
+    [pAVPlayer pause];
+    mpPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:pAVPlayer];
+    [mpPlayerLayer retain];
+    [mpPlayerLayer setFrame:[mpView frame]];
+    [mpPlayerLayer setHidden:YES];
+    [mpPlayerLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
+    [mpPlayerLayer addObserver:getObserver() forKeyPath:@"readyForDisplay" options:0 context:this];
+
+    // setup the target view
+    [mpView setWantsLayer:YES];
+    [mpView.layer addSublayer:mpPlayerLayer];
+}
+
+// ------------------------------------------------------------------------------
+
+Window::~Window()
+{
+    [mpPlayerLayer removeObserver:getObserver() forKeyPath:@"readyForDisplay"];
+    [mpPlayerLayer release];
+}
+
+// ------------------------------------------------------------------------------
+
+bool Window::create( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments )
+{
+    return true;
+}
+
+// ------------------------------------------------------------------------------
+
+bool Window::handleObservation( NSString* pKeyPath )
+{
+    OSL_TRACE( "AVPlayer::handleObservation key=\"%s\"", [pKeyPath UTF8String]);
+    const BOOL bReadyForDisplay = [mpPlayerLayer isReadyForDisplay];
+    [mpPlayerLayer setHidden:!bReadyForDisplay];
+    return true;
+}
+
+// XPlayerWindow
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::update()
+    throw (uno::RuntimeException)
+{}
+
+// ------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL Window::setZoomLevel( media::ZoomLevel eZoomLevel )
+    throw (uno::RuntimeException)
+{
+    return false;
+}
+
+// ------------------------------------------------------------------------------
+
+media::ZoomLevel SAL_CALL Window::getZoomLevel(  )
+    throw (uno::RuntimeException)
+{
+    return meZoomLevel;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::setPointerType( sal_Int32 nPointerType )
+    throw (uno::RuntimeException)
+{
+    mnPointerType = nPointerType;
+}
+
+// XWindow
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::setPosSize( sal_Int32 X, sal_Int32 Y, sal_Int32 Width, sal_Int32 Height, sal_Int16 Flags )
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE( "AVWindow::setPosSize( %dx%d%+d%+d)", (int)Width,(int)Height,(int)X,(int)Y);//######
+    if( !mpView )
+        return;
+    NSRect aRect = [mpView frame];
+    // NOTE: if( (Flags & awt::PosSize::WIDTH) )
+    aRect.size.width = Width;
+    // NOTE: if( (Flags & awt::PosSize::HEIGHT) )
+    aRect.size.height = Height;
+
+    [mpView setFrameSize: aRect.size];
+    [mpPlayerLayer setFrame: [mpView frame]];
+}
+
+// ------------------------------------------------------------------------------
+
+awt::Rectangle SAL_CALL Window::getPosSize()
+    throw (uno::RuntimeException)
+{
+    awt::Rectangle aRet;
+
+    NSRect aRect = [mpView frame];
+    aRet.X = aRet.Y = 0;
+    aRet.Width = aRect.size.width;
+    aRet.Height = aRect.size.height;
+
+    return aRet;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::setVisible( sal_Bool bVisible )
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE ("Window::setVisible(%d)", bVisible);
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::setEnable( sal_Bool bEnable )
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE ("Window::setEnable(%d)", bEnable);
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::setFocus()
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE ("Window::setFocus");
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::addWindowListener( const uno::Reference< awt::XWindowListener >& xListener )
+    throw (uno::RuntimeException)
+{
+    maListeners.addInterface( getCppuType( &xListener ), xListener );
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::removeWindowListener( const uno::Reference< awt::XWindowListener >& xListener )
+    throw (uno::RuntimeException)
+{
+    maListeners.removeInterface( getCppuType( &xListener ), xListener );
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::addFocusListener( const uno::Reference< awt::XFocusListener >& xListener )
+    throw (uno::RuntimeException)
+{
+    maListeners.addInterface( getCppuType( &xListener ), xListener );
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::removeFocusListener( const uno::Reference< awt::XFocusListener >& xListener )
+    throw (uno::RuntimeException)
+{
+    maListeners.removeInterface( getCppuType( &xListener ), xListener );
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::addKeyListener( const uno::Reference< awt::XKeyListener >& xListener )
+    throw (uno::RuntimeException)
+{
+    maListeners.addInterface( getCppuType( &xListener ), xListener );
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::removeKeyListener( const uno::Reference< awt::XKeyListener >& xListener )
+    throw (uno::RuntimeException)
+{
+    maListeners.removeInterface( getCppuType( &xListener ), xListener );
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::addMouseListener( const uno::Reference< awt::XMouseListener >& xListener )
+    throw (uno::RuntimeException)
+{
+    maListeners.addInterface( getCppuType( &xListener ), xListener );
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::removeMouseListener( const uno::Reference< awt::XMouseListener >& xListener )
+    throw (uno::RuntimeException)
+{
+    maListeners.removeInterface( getCppuType( &xListener ), xListener );
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::addMouseMotionListener( const uno::Reference< awt::XMouseMotionListener >& xListener )
+    throw (uno::RuntimeException)
+{
+    maListeners.addInterface( getCppuType( &xListener ), xListener );
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::removeMouseMotionListener( const uno::Reference< awt::XMouseMotionListener >& xListener )
+    throw (uno::RuntimeException)
+{
+    maListeners.removeInterface( getCppuType( &xListener ), xListener );
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::addPaintListener( const uno::Reference< awt::XPaintListener >& xListener )
+    throw (uno::RuntimeException)
+{
+    maListeners.addInterface( getCppuType( &xListener ), xListener );
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::removePaintListener( const uno::Reference< awt::XPaintListener >& xListener )
+    throw (uno::RuntimeException)
+{
+    maListeners.removeInterface( getCppuType( &xListener ), xListener );
+}
+
+
+// XComponent
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::dispose(  )
+    throw (uno::RuntimeException)
+{
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::addEventListener( const uno::Reference< lang::XEventListener >& xListener )
+    throw (uno::RuntimeException)
+{
+    maListeners.addInterface( getCppuType( &xListener ), xListener );
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Window::removeEventListener( const uno::Reference< lang::XEventListener >& xListener )
+    throw (uno::RuntimeException)
+{
+    maListeners.removeInterface( getCppuType( &xListener ), xListener );
+}
+
+// XServiceInfo
+// ------------------------------------------------------------------------------
+
+::rtl::OUString SAL_CALL Window::getImplementationName(  )
+    throw (uno::RuntimeException)
+{
+    return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_MACAVF_WINDOW_IMPLEMENTATIONNAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL Window::supportsService( const ::rtl::OUString& ServiceName )
+    throw (uno::RuntimeException)
+{
+    return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( AVMEDIA_MACAVF_WINDOW_SERVICENAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+uno::Sequence< ::rtl::OUString > SAL_CALL Window::getSupportedServiceNames(  )
+    throw (uno::RuntimeException)
+{
+    uno::Sequence< ::rtl::OUString > aRet(1);
+    aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( AVMEDIA_MACAVF_WINDOW_SERVICENAME ) );
+
+    return aRet;
+}
+
+} // namespace macavf
+} // namespace avmedia
+
diff --git a/avmedia/source/macavf/macavf_window.hxx b/avmedia/source/macavf/macavf_window.hxx
new file mode 100644
index 0000000..1689efd
--- /dev/null
+++ b/avmedia/source/macavf/macavf_window.hxx
@@ -0,0 +1,124 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+#ifndef MACAVF_WINDOW_HXX
+#define MACAVF_WINDOW_HXX
+
+#include "macavf_common.hxx"
+
+#include <cppuhelper/interfacecontainer.h>
+
+#include "com/sun/star/media/XPlayerWindow.hdl"
+
+// ---------------
+// - MyMediaView -
+// ---------------
+
+ at interface MyMediaView : NSView
+ at property (nonatomic, readonly, strong) AVPlayer* player;
+ at property (nonatomic, readonly, strong) AVPlayerLayer* playerLayer;
+ at property (nonatomic, retain) NSURL* videoURL;
+- (void) play;
+ at end
+
+namespace avmedia { namespace macavf {
+
+// ---------------
+// - Window -
+// ---------------
+
+class Player;
+
+class Window
+:   public MacAVObserverHandler
+,   public ::cppu::WeakImplHelper2 < ::com::sun::star::media::XPlayerWindow,
+                                     ::com::sun::star::lang::XServiceInfo >
+{
+public:
+
+            Window( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& i_rxMgr,
+                    Player& i_rPlayer,
+                    NSView* i_pParentView
+                    );
+    virtual ~Window();
+
+    bool    create( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments );
+    void    processGraphEvent();
+    void    updatePointer();
+
+    // XPlayerWindow
+    virtual void SAL_CALL update(  ) throw (::com::sun::star::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL setZoomLevel( ::com::sun::star::media::ZoomLevel ZoomLevel ) throw (::com::sun::star::uno::RuntimeException);
+    virtual ::com::sun::star::media::ZoomLevel SAL_CALL getZoomLevel(  ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL setPointerType( sal_Int32 nPointerType ) throw (::com::sun::star::uno::RuntimeException);
+
+    // XWindow
+    virtual void SAL_CALL setPosSize( sal_Int32 X, sal_Int32 Y, sal_Int32 Width, sal_Int32 Height, sal_Int16 Flags ) throw (::com::sun::star::uno::RuntimeException);
+    virtual ::com::sun::star::awt::Rectangle SAL_CALL getPosSize(  ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL setVisible( sal_Bool Visible ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL setEnable( sal_Bool Enable ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL setFocus(  ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL addWindowListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL removeWindowListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL addFocusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFocusListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL removeFocusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFocusListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL addKeyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XKeyListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL removeKeyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XKeyListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL addMouseListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL removeMouseListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL addMouseMotionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseMotionListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL removeMouseMotionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseMotionListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL addPaintListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XPaintListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL removePaintListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XPaintListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
+
+    // XComponent
+    virtual void SAL_CALL dispose(  ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
+
+    // XServiceInfo
+    virtual ::rtl::OUString SAL_CALL getImplementationName(  ) throw (::com::sun::star::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException);
+    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  ) throw (::com::sun::star::uno::RuntimeException);
+
+    virtual bool handleObservation( NSString* pKeyPath );
+
+private:
+
+    ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxMgr;
+
+    ::osl::Mutex                                maMutex;
+    ::cppu::OMultiTypeInterfaceContainerHelper  maListeners;
+    ::com::sun::star::media::ZoomLevel          meZoomLevel;
+    Player&                                     mrPlayer;
+    int                                         mnPointerType;
+
+    NSView*                                     mpView; // parent-view == movie-view
+    AVPlayerLayer*                              mpPlayerLayer;
+
+    void                                        ImplLayoutVideoWindow();
+};
+
+} // namespace macavf
+} // namespace avmedia
+
+#endif // _WINDOW_HXX
+
diff --git a/avmedia/source/macavf/makefile.mk b/avmedia/source/macavf/makefile.mk
index 4fe23f8..ed70a35 100644
--- a/avmedia/source/macavf/makefile.mk
+++ b/avmedia/source/macavf/makefile.mk
@@ -41,15 +41,15 @@ CDEFS+= -DVERBOSE
 CFLAGSCXX+=$(OBJCXXFLAGS)
 
 SLOFILES= \
-        $(SLO)$/macavfuno.obj  \
-        $(SLO)$/framegrabber.obj        \
-        $(SLO)$/manager.obj       \
-        $(SLO)$/window.obj        \
-        $(SLO)$/player.obj
+        $(SLO)$/macavf_uno.obj           \
+        $(SLO)$/macavf_framegrabber.obj  \
+        $(SLO)$/macavf_manager.obj       \
+        $(SLO)$/macavf_window.obj        \
+        $(SLO)$/macavf_player.obj
 
 EXCEPTIONSFILES= \
-        $(SLO)$/framegrabber.obj        \
-        $(SLO)$/macavfuno.obj
+        $(SLO)$/macavf_framegrabber.obj \
+        $(SLO)$/macavf_uno.obj
 
 SHL1TARGET= $(TARGET)$(DLLPOSTFIX)
 
diff --git a/avmedia/source/quicktime/makefile.mk b/avmedia/source/quicktime/makefile.mk
index 07ae749..a45a8b3 100644
--- a/avmedia/source/quicktime/makefile.mk
+++ b/avmedia/source/quicktime/makefile.mk
@@ -44,15 +44,15 @@ CDEFS+= -DVERBOSE
 CFLAGSCXX+=$(OBJCXXFLAGS)
 
 SLOFILES= \
-        $(SLO)$/quicktimeuno.obj  \
-        $(SLO)$/framegrabber.obj        \
-        $(SLO)$/manager.obj       \
-        $(SLO)$/window.obj        \
-        $(SLO)$/player.obj
+        $(SLO)$/qt_uno.obj  \
+        $(SLO)$/qt_framegrabber.obj        \
+        $(SLO)$/qt_manager.obj       \
+        $(SLO)$/qt_window.obj        \
+        $(SLO)$/qt_player.obj
 
 EXCEPTIONSFILES= \
-        $(SLO)$/framegrabber.obj        \
-        $(SLO)$/quicktimeuno.obj
+        $(SLO)$/qt_framegrabber.obj        \
+        $(SLO)$/qt_uno.obj
 
 SHL1TARGET= $(TARGET)$(DLLPOSTFIX)
 
diff --git a/avmedia/source/quicktime/qt_common.hxx b/avmedia/source/quicktime/qt_common.hxx
new file mode 100644
index 0000000..410f19f
--- /dev/null
+++ b/avmedia/source/quicktime/qt_common.hxx
@@ -0,0 +1,65 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+
+#ifndef QT_COMMON_HXX
+#define QT_COMMON_HXX
+
+#ifdef MACOSX
+#include <premac.h>
+#import <Cocoa/Cocoa.h>
+#import <QTKit/QTKit.h>
+#include <postmac.h>
+#endif
+#include <osl/mutex.hxx>
+#include <rtl/ustring.hxx>
+#include <tools/debug.hxx>
+#include <tools/stream.hxx>
+#include <tools/string.hxx>
+#include <tools/urlobj.hxx>
+#include <cppuhelper/implbase1.hxx>
+#include <cppuhelper/implbase2.hxx>
+#include <cppuhelper/weak.hxx>
+#include <cppuhelper/factory.hxx>
+
+#include <com/sun/star/uno/Reference.h>
+#include <com/sun/star/uno/RuntimeException.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/registry/XRegistryKey.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/awt/Rectangle.hpp>
+#include <com/sun/star/awt/KeyModifier.hpp>
+#include <com/sun/star/awt/MouseButton.hpp>
+#include <com/sun/star/media/XManager.hpp>
+
+#define AVMEDIA_QUICKTIME_MANAGER_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.Manager_QuickTime"
+#define AVMEDIA_QUICKTIME_MANAGER_SERVICENAME "com.sun.star.media.Manager_QuickTime"
+
+#define AVMEDIA_QUICKTIME_PLAYER_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.Player_QuickTime"
+#define AVMEDIA_QUICKTIME_PLAYER_SERVICENAME "com.sun.star.media.Player_QuickTime"
+
+#define AVMEDIA_QUICKTIME_WINDOW_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.Window_QuickTime"
+#define AVMEDIA_QUICKTIME_WINDOW_SERVICENAME "com.sun.star.media.Window_QuickTime"
+
+#endif // QT_COMMOM_HXX
+
diff --git a/avmedia/source/quicktime/qt_framegrabber.cxx b/avmedia/source/quicktime/qt_framegrabber.cxx
new file mode 100644
index 0000000..90d19d0
--- /dev/null
+++ b/avmedia/source/quicktime/qt_framegrabber.cxx
@@ -0,0 +1,142 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+
+#include "qt_framegrabber.hxx"
+#include "qt_player.hxx"
+
+#include <tools/stream.hxx>
+#include <vcl/graph.hxx>
+#include <vcl/cvtgrf.hxx>
+#include <unotools/localfilehelper.hxx>
+
+#define AVMEDIA_QUICKTIME_FRAMEGRABBER_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.FrameGrabber_Quicktime"
+#define AVMEDIA_QUICKTIME_FRAMEGRABBER_SERVICENAME "com.sun.star.media.FrameGrabber_Quicktime"
+
+using namespace ::com::sun::star;
+
+namespace avmedia { namespace quicktime {
+
+// ----------------
+// - FrameGrabber -
+// ----------------
+
+FrameGrabber::FrameGrabber( const uno::Reference< lang::XMultiServiceFactory >& rxMgr ) :
+    mxMgr( rxMgr )
+{
+    OSErr result;
+
+    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
+      // we have version 7.01 or later, initialize
+      mpMovie = [QTMovie movie];
+      [mpMovie retain];
+      mbInitialized = true;
+    [pool release];
+}
+
+// ------------------------------------------------------------------------------
+
+FrameGrabber::~FrameGrabber()
+{
+    if( mbInitialized )
+    {
+        if( mpMovie )
+        {
+            [mpMovie release];
+            mpMovie = nil;
+        }
+    }
+}
+
+// ------------------------------------------------------------------------------
+
+bool FrameGrabber::create( const ::rtl::OUString& rURL )
+{
+    bool bRet = false;
+    maURL = rURL;
+    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
+    NSString* aNSStr = [[[NSString alloc] initWithCharacters: rURL.getStr() length: rURL.getLength()]stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] ;
+    NSURL* aURL = [NSURL URLWithString:aNSStr ];
+
+    // create the Movie
+
+        mpMovie = [mpMovie initWithURL:aURL error:nil];
+        if(mpMovie)
+        {
+            [mpMovie retain];
+            bRet = true;
+        }
+
+    [pool release];
+
+    return( bRet );
+}
+
+// ------------------------------------------------------------------------------
+
+uno::Reference< graphic::XGraphic > SAL_CALL FrameGrabber::grabFrame( double fMediaTime )
+    throw (uno::RuntimeException)
+{
+    uno::Reference< graphic::XGraphic > xRet;
+
+    NSImage* pImage = [mpMovie frameImageAtTime: QTMakeTimeWithTimeInterval(fMediaTime)];
+    NSData *pBitmap = [pImage TIFFRepresentation];
+    long nSize = [pBitmap length];
+    const void* pBitmapData = [pBitmap bytes];
+    SvMemoryStream  aMemStm( (char *)pBitmapData, nSize, STREAM_READ | STREAM_WRITE );
+    Graphic aGraphic;
+    if ( GraphicConverter::Import( aMemStm, aGraphic, CVT_TIF ) == ERRCODE_NONE )
+    {
+        xRet = aGraphic.GetXGraphic();
+    }
+
+    return xRet;
+}
+
+// ------------------------------------------------------------------------------
+
+::rtl::OUString SAL_CALL FrameGrabber::getImplementationName(  )
+    throw (uno::RuntimeException)
+{
+    return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_QUICKTIME_FRAMEGRABBER_IMPLEMENTATIONNAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL FrameGrabber::supportsService( const ::rtl::OUString& ServiceName )
+    throw (uno::RuntimeException)
+{
+    return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( AVMEDIA_QUICKTIME_FRAMEGRABBER_SERVICENAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+uno::Sequence< ::rtl::OUString > SAL_CALL FrameGrabber::getSupportedServiceNames(  )
+    throw (uno::RuntimeException)
+{
+    uno::Sequence< ::rtl::OUString > aRet(1);
+    aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( AVMEDIA_QUICKTIME_FRAMEGRABBER_SERVICENAME ) );
+
+    return aRet;
+}
+
+} // namespace quicktime
+} // namespace avmedia
diff --git a/avmedia/source/quicktime/qt_framegrabber.hxx b/avmedia/source/quicktime/qt_framegrabber.hxx
new file mode 100644
index 0000000..cc0a6b1
--- /dev/null
+++ b/avmedia/source/quicktime/qt_framegrabber.hxx
@@ -0,0 +1,67 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+
+#ifndef QT_FRAMEGRABBER_HXX
+#define QT_FRAMEGRABBER_HXX
+
+#include "qt_common.hxx"
+
+#include "com/sun/star/media/XFrameGrabber.hdl"
+
+namespace avmedia { namespace quicktime {
+
+// ----------------
+// - FrameGrabber -
+// ----------------
+
+class FrameGrabber : public ::cppu::WeakImplHelper2 < ::com::sun::star::media::XFrameGrabber,
+                                                      ::com::sun::star::lang::XServiceInfo >
+{
+public:
+
+            FrameGrabber( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxMgr );
+            ~FrameGrabber();
+
+    bool    create( const ::rtl::OUString& rURL );
+
+    // XFrameGrabber
+    virtual ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > SAL_CALL grabFrame( double fMediaTime ) throw (::com::sun::star::uno::RuntimeException);
+
+    // XServiceInfo
+    virtual ::rtl::OUString SAL_CALL getImplementationName(  ) throw (::com::sun::star::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException);
+    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  ) throw (::com::sun::star::uno::RuntimeException);
+
+private:
+
+    ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >    mxMgr;
+    ::rtl::OUString                                                                     maURL;
+    QTMovie*                                                                            mpMovie;
+    sal_Bool                                                                            mbInitialized;
+    long                                                                                mnVersion;
+};
+
+} // namespace quicktime
+} // namespace avmedia
+
+#endif // QT_FRAMEGRABBER_HXX
+
diff --git a/avmedia/source/quicktime/qt_manager.cxx b/avmedia/source/quicktime/qt_manager.cxx
new file mode 100644
index 0000000..7fa4d0a
--- /dev/null
+++ b/avmedia/source/quicktime/qt_manager.cxx
@@ -0,0 +1,92 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+
+#include "qt_manager.hxx"
+#include "qt_player.hxx"
+
+#include <tools/urlobj.hxx>
+
+using namespace ::com::sun::star;
+
+namespace avmedia { namespace quicktime {
+// ----------------
+// - Manager -
+// ----------------
+
+Manager::Manager( const uno::Reference< lang::XMultiServiceFactory >& rxMgr ) :
+    mxMgr( rxMgr )
+{
+    OSL_TRACE( "avmediaquicktime: Manager::Manager" );
+}
+
+// ------------------------------------------------------------------------------
+
+Manager::~Manager()
+{
+}
+
+// ------------------------------------------------------------------------------
+
+uno::Reference< media::XPlayer > SAL_CALL Manager::createPlayer( const ::rtl::OUString& rURL )
+    throw (uno::RuntimeException)
+{
+    Player*                             pPlayer( new Player( mxMgr ) );
+    uno::Reference< media::XPlayer >    xRet( pPlayer );
+    INetURLObject                       aURL( rURL );
+
+    OSL_TRACE( "avmediaquicktime: Manager::createPlayer" );
+
+    if( !pPlayer->create( aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) )  )
+        xRet = uno::Reference< media::XPlayer >();
+
+    return xRet;
+}
+
+// ------------------------------------------------------------------------------
+
+::rtl::OUString SAL_CALL Manager::getImplementationName(  )
+    throw (uno::RuntimeException)
+{
+    return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_QUICKTIME_MANAGER_IMPLEMENTATIONNAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL Manager::supportsService( const ::rtl::OUString& ServiceName )
+    throw (uno::RuntimeException)
+{
+    return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( AVMEDIA_QUICKTIME_MANAGER_SERVICENAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+uno::Sequence< ::rtl::OUString > SAL_CALL Manager::getSupportedServiceNames(  )
+    throw (uno::RuntimeException)
+{
+    uno::Sequence< ::rtl::OUString > aRet(1);
+    aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( AVMEDIA_QUICKTIME_MANAGER_SERVICENAME ) );
+
+    return aRet;
+}
+
+} // namespace quicktime
+} // namespace avmedia
diff --git a/avmedia/source/quicktime/qt_manager.hxx b/avmedia/source/quicktime/qt_manager.hxx
new file mode 100644
index 0000000..ecbf422
--- /dev/null
+++ b/avmedia/source/quicktime/qt_manager.hxx
@@ -0,0 +1,60 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+
+#ifndef QT_MANAGER_HXX
+#define QT_MANAGER_HXX
+
+#include "qt_common.hxx"
+
+#include "com/sun/star/media/XManager.hdl"
+
+// -----------
+// - Manager -
+// -----------
+
+namespace avmedia { namespace quicktime {
+
+class Manager : public ::cppu::WeakImplHelper2 < ::com::sun::star::media::XManager,
+                                                 ::com::sun::star::lang::XServiceInfo >
+{
+public:
+
+    Manager( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxMgr );
+    ~Manager();
+
+    // XManager
+    virtual ::com::sun::star::uno::Reference< ::com::sun::star::media::XPlayer > SAL_CALL createPlayer( const ::rtl::OUString& aURL ) throw (::com::sun::star::uno::RuntimeException);
+
+    // XServiceInfo
+    virtual ::rtl::OUString SAL_CALL getImplementationName(  ) throw (::com::sun::star::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException);
+    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  ) throw (::com::sun::star::uno::RuntimeException);
+private:
+
+    ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxMgr;
+};
+
+} // namespace quicktime
+} // namespace avmedia
+
+#endif // QT_MANAGER_HXX
+
diff --git a/avmedia/source/quicktime/qt_player.cxx b/avmedia/source/quicktime/qt_player.cxx
new file mode 100644
index 0000000..3f5b35e
--- /dev/null
+++ b/avmedia/source/quicktime/qt_player.cxx
@@ -0,0 +1,459 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+
+#include <math.h>
+
+#include "qt_player.hxx"
+#include "qt_framegrabber.hxx"
+#include "qt_window.hxx"
+
+using namespace ::com::sun::star;
+
+namespace avmedia { namespace quicktime {
+
+// ----------------
+// - Player -
+// ----------------
+
+Player::Player( const uno::Reference< lang::XMultiServiceFactory >& rxMgr ) :
+    mxMgr( rxMgr ),
+    mpMovie( nil ),
+    /* GST
+    mbFakeVideo (sal_False ),
+    */
+    mnUnmutedVolume( 0 ),
+    mnStopTime( DBL_MAX ),  //max double
+    mbMuted( false ),
+    mbLooping( false ),
+    mbInitialized( false ),
+    mnWindowID( 0 ),
+    mnDuration( 0 ),
+    mnWidth( 0 ),
+    mnHeight( 0 ),
+    mnVersion( 0 ),
+    maSizeCondition( osl_createCondition() )
+{
+    OSErr result;
+
+    NSApplicationLoad();
+    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
+      mbInitialized = true;
+    [pool release];
+}
+
+// ------------------------------------------------------------------------------
+
+Player::~Player()
+{
+    if( mpMovie )
+    {
+        [mpMovie release];
+        mpMovie = nil;
+    }
+}
+// ------------------------------------------------------------------------------
+
+QTMovie* Player::getMovie()
+{
+    OSL_ASSERT( mpMovie );
+    return mpMovie;
+}
+
+// ------------------------------------------------------------------------------
+
+bool Player::create( const ::rtl::OUString& rURL )
+{
+    bool    bRet = false;
+    // create the Movie
+    if( mbInitialized )
+    {
+        NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
+
+        if( mpMovie )
+        {
+            [mpMovie release];
+            mpMovie = nil;
+        }
+
+        NSString* aNSStr = [[[NSString alloc] initWithCharacters: rURL.getStr() length: rURL.getLength()]stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] ;
+        NSURL* aURL = [NSURL URLWithString:aNSStr ];
+
+
+        NSError* pErr = nil;
+        mpMovie = [QTMovie movieWithURL:aURL error:&pErr];
+        if(mpMovie)
+        {
+            [mpMovie retain];
+            maURL = rURL;
+            bRet = true;
+        }
+        if( pErr )
+        {
+            OSL_TRACE( "NSMovie create failed with error %ld (%s)",
+                       (long)[pErr code],
+                       [[pErr localizedDescription] UTF8String]
+                       );
+        }
+        [pool release];
+    }
+
+    return bRet;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::start(  )
+    throw (uno::RuntimeException)
+{
+  OSL_TRACE ("Player::start");
+
+  if( mpMovie )
+  {
+      [mpMovie play];
+  }
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::stop(  )
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE ("Player::stop");
+    if( mpMovie )
+    {
+        [mpMovie stop];
+    }
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL Player::isPlaying()
+    throw (uno::RuntimeException)
+{
+    bool bRet = false;
+
+    if ( mpMovie )
+    {
+        if ([mpMovie rate] != 0)
+        {
+            bRet = true;
+        }
+    }
+
+    return bRet;
+}
+
+// ------------------------------------------------------------------------------
+
+double SAL_CALL Player::getDuration(  )
+    throw (uno::RuntimeException)
+{
+    // slideshow checks for non-zero duration, so cheat here
+    double duration = 0.01;
+
+    if ( mpMovie ) // && mnDuration > 0 ) {
+    {
+        QTTime structDuration =  [mpMovie duration] ;
+        duration = (double)structDuration.timeValue / (double)structDuration.timeScale;
+    }
+
+    return duration;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::setMediaTime( double fTime )
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE ("Player::setMediaTime");
+
+    if ( mpMovie )
+    {
+        [mpMovie setCurrentTime: QTMakeTimeWithTimeInterval(fTime)];
+    }
+}
+
+// ------------------------------------------------------------------------------
+
+double SAL_CALL Player::getMediaTime(  )
+    throw (uno::RuntimeException)
+{
+  double position = 0.0;
+
+  if ( mpMovie )
+  {
+      QTTime structDuration =  [mpMovie currentTime] ;
+      position = (double)structDuration.timeValue / (double)structDuration.timeScale;
+  }
+
+  if(isPlaying() && position>mnStopTime)
+  {
+      stop();
+  }
+
+  return position;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::setStopTime( double fTime )
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE ("Player::setStopTime %f", fTime);
+
+    mnStopTime = fTime;
+}
+
+// ------------------------------------------------------------------------------
+
+double SAL_CALL Player::getStopTime(  )
+    throw (uno::RuntimeException)
+{
+    double fRet = mnStopTime;
+
+    return fRet;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::setRate( double fRate )
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE ("Player::setRate");
+
+    // Quicktime: 0 = stop, 1 = normal speed, 2 = double speed, -1 = normal speed backwards
+    if ( mpMovie )
+    {
+        [mpMovie setRate: fRate];
+    }
+}
+
+// ------------------------------------------------------------------------------
+
+double SAL_CALL Player::getRate(  )
+    throw (uno::RuntimeException)
+{
+    // Quicktime: 0 = stop, 1 = normal speed, 2 = double speed, -1 = normal speed backwards
+    double rate = 1.0;
+
+    OSL_TRACE ("Player::getRate");
+
+    if ( mpMovie )
+    {
+        rate = (double) [mpMovie rate];
+    }
+
+    return rate;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::setPlaybackLoop( sal_Bool bSet )
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE ("Player::setPlaybackLoop? %s", bSet?"True":"False" );
+
+    if(bSet)
+    {
+        [mpMovie setAttribute:[NSNumber numberWithBool:YES] forKey: QTMovieLoopsAttribute]  ;
+    }
+    else
+    {
+         [mpMovie setAttribute:[NSNumber numberWithBool:NO] forKey: QTMovieLoopsAttribute]  ;
+    }
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL Player::isPlaybackLoop(  )
+    throw (uno::RuntimeException)
+{
+    bool bRet = [[mpMovie attributeForKey:QTMovieLoopsAttribute] boolValue];
+
+    OSL_TRACE ("Player::isPlaybackLoop ? %s", bRet?"True":"False" );
+
+    return bRet;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::setMute( sal_Bool bSet )
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE( "set mute: %d muted: %d unmuted volume: %lf", bSet, mbMuted, mnUnmutedVolume );
+
+    // change the volume to 0 or the unmuted volume
+    if(  mpMovie && mbMuted != bSet )
+    {
+        [mpMovie setMuted: bSet ];
+        mbMuted = bSet;
+    }
+
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL Player::isMute(  )
+    throw (uno::RuntimeException)
+{
+    OSL_TRACE ("Player::isMuted");
+
+    return mbMuted;
+}
+
+// ------------------------------------------------------------------------------
+
+void SAL_CALL Player::setVolumeDB( sal_Int16 nVolumeDB )
+    throw (uno::RuntimeException)
+{
+    // OOo db volume -40 = QTVolume 0
+    // OOo db volume 0   = QTvolume 1
+    if(nVolumeDB==-40)
+    {
+        mnUnmutedVolume = 0;
+    }
+    else
+    {
+        mnUnmutedVolume = pow( 10.0, nVolumeDB / 20.0 );
+    }
+
+    OSL_TRACE( "set volume: %d gst volume: %f", nVolumeDB, mnUnmutedVolume );
+
+    // change volume
+    if( !mbMuted && mpMovie )
+    {
+        [mpMovie setVolume: mnUnmutedVolume ];
+    }
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Int16 SAL_CALL Player::getVolumeDB(  )
+    throw (uno::RuntimeException)
+{
+    sal_Int16 nVolumeDB = 0.0;
+
+    if( mpMovie )
+      {
+          float volume = 0.0;
+
+          volume = [mpMovie volume];
+          if(volume>0)            //protect from log10(0)
+          {
+              nVolumeDB = (sal_Int16) ( 20.0*log10 ( volume ) );
+          }
+          else
+          {
+              nVolumeDB = -40 ;  // QT zero volume is no volume, -40db
+          }
+      }
+
+    return nVolumeDB;
+}
+
+// ------------------------------------------------------------------------------
+
+awt::Size SAL_CALL Player::getPreferredPlayerWindowSize(  )
+    throw (uno::RuntimeException)
+{
+    NSSize  nsSize = [[mpMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
+    awt::Size aSize( nsSize.width, nsSize.height );
+    return aSize;
+}
+
+
+// ------------------------------------------------------------------------------
+
+uno::Reference< ::media::XPlayerWindow > SAL_CALL Player::createPlayerWindow( const uno::Sequence< uno::Any >& aArguments )
+    throw (uno::RuntimeException)
+{
+    uno::Reference< ::media::XPlayerWindow >    xRet;
+    awt::Size                                   aSize( getPreferredPlayerWindowSize() );
+    NSSize                                      nsSize( NSMakeSize(aSize.Width, aSize.Height) );
+
+    OSL_TRACE( "Player::createPlayerWindow %d %d length: %d", aSize.Width, aSize.Height, aArguments.getLength() );
+
+    if( aSize.Width > 0 && aSize.Height > 0 )
+    {
+        sal_IntPtr nPtr = NULL;
+        aArguments[0] >>= nPtr;
+        NSView* pParentView = reinterpret_cast< NSView * >(nPtr);
+
+        ::avmedia::quicktime::Window* pWindow = new ::avmedia::quicktime::Window( mxMgr, *this, pParentView );
+        xRet = pWindow;
+    }
+
+    return xRet;
+}
+
+// ------------------------------------------------------------------------------
+
+uno::Reference< media::XFrameGrabber > SAL_CALL Player::createFrameGrabber(  )
+    throw (::com::sun::star::uno::RuntimeException)
+{
+  uno::Reference< media::XFrameGrabber > xRet;
+  OSL_TRACE ("Player::createFrameGrabber");
+
+  if( !maURL.isEmpty() )
+  {
+      FrameGrabber* pGrabber = new FrameGrabber( mxMgr );
+
+      xRet = pGrabber;
+
+      if( !pGrabber->create( maURL ) )
+      {
+          xRet.clear();
+      }
+  }
+
+  return xRet;
+}
+
+// ------------------------------------------------------------------------------
+
+::rtl::OUString SAL_CALL Player::getImplementationName(  )
+    throw (uno::RuntimeException)
+{
+    return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_QUICKTIME_PLAYER_IMPLEMENTATIONNAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL Player::supportsService( const ::rtl::OUString& ServiceName )
+    throw (uno::RuntimeException)
+{
+    return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( AVMEDIA_QUICKTIME_PLAYER_SERVICENAME ) );
+}
+
+// ------------------------------------------------------------------------------
+
+uno::Sequence< ::rtl::OUString > SAL_CALL Player::getSupportedServiceNames(  )
+    throw (uno::RuntimeException)
+{
+    uno::Sequence< ::rtl::OUString > aRet(1);
+    aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( AVMEDIA_QUICKTIME_PLAYER_SERVICENAME ) );
+
+    return aRet;
+}
+
+} // namespace quicktime
+} // namespace avmedia
diff --git a/avmedia/source/quicktime/qt_player.hxx b/avmedia/source/quicktime/qt_player.hxx
new file mode 100644
index 0000000..a2cd7b5
--- /dev/null
+++ b/avmedia/source/quicktime/qt_player.hxx
@@ -0,0 +1,107 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+
+#ifndef QT_PLAYER_HXX
+#define QT_PLAYER_HXX
+
+#include <osl/conditn.h>
+#include "qt_common.hxx"
+
+#include "com/sun/star/media/XPlayer.hdl"
+
+namespace avmedia { namespace quicktime {
+
+/*
+// ----------
+// - Player -
+// ----------
+*/
+
+class Player : public ::cppu::WeakImplHelper2< ::com::sun::star::media::XPlayer,
+                                               ::com::sun::star::lang::XServiceInfo >
+{
+public:
+
+    Player( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxMgr );
+    ~Player();
+
+    bool create( const ::rtl::OUString& rURL );
+
+//    void processMessage( GstMessage *message );
+
+    // XPlayer
+    virtual void SAL_CALL start(  ) throw (::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL stop(  ) throw (::com::sun::star::uno::RuntimeException);
+    virtual sal_Bool SAL_CALL isPlaying(  ) throw (::com::sun::star::uno::RuntimeException);

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list