14ba16609SHerbert Dürr /**************************************************************
24ba16609SHerbert Dürr *
34ba16609SHerbert Dürr * Licensed to the Apache Software Foundation (ASF) under one
44ba16609SHerbert Dürr * or more contributor license agreements. See the NOTICE file
54ba16609SHerbert Dürr * distributed with this work for additional information
64ba16609SHerbert Dürr * regarding copyright ownership. The ASF licenses this file
74ba16609SHerbert Dürr * to you under the Apache License, Version 2.0 (the
84ba16609SHerbert Dürr * "License"); you may not use this file except in compliance
94ba16609SHerbert Dürr * with the License. You may obtain a copy of the License at
104ba16609SHerbert Dürr *
114ba16609SHerbert Dürr * http://www.apache.org/licenses/LICENSE-2.0
124ba16609SHerbert Dürr *
134ba16609SHerbert Dürr * Unless required by applicable law or agreed to in writing,
144ba16609SHerbert Dürr * software distributed under the License is distributed on an
154ba16609SHerbert Dürr * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
164ba16609SHerbert Dürr * KIND, either express or implied. See the License for the
174ba16609SHerbert Dürr * specific language governing permissions and limitations
184ba16609SHerbert Dürr * under the License.
194ba16609SHerbert Dürr *
204ba16609SHerbert Dürr *************************************************************/
214ba16609SHerbert Dürr
224ba16609SHerbert Dürr
234ba16609SHerbert Dürr #include "macavf_player.hxx"
244ba16609SHerbert Dürr #include "macavf_framegrabber.hxx"
254ba16609SHerbert Dürr #include "macavf_window.hxx"
264ba16609SHerbert Dürr
274ba16609SHerbert Dürr #include <cmath> // for log10()
284ba16609SHerbert Dürr
294ba16609SHerbert Dürr using namespace ::com::sun::star;
304ba16609SHerbert Dürr
314ba16609SHerbert Dürr #include <hash_map>
324ba16609SHerbert Dürr typedef std::hash_map<NSObject*,avmedia::macavf::MacAVObserverHandler*> HandlersForObject;
334ba16609SHerbert Dürr
344ba16609SHerbert Dürr @implementation MacAVObserverObject
354ba16609SHerbert Dürr {
364ba16609SHerbert Dürr HandlersForObject maHandlersForObject;
374ba16609SHerbert Dürr }
384ba16609SHerbert Dürr - (void)observeValueForKeyPath:(NSString*)pKeyPath ofObject:(id)pObject change:(NSDictionary*)pChangeDict context:(void*)pContext
394ba16609SHerbert Dürr {
404ba16609SHerbert Dürr NSString* pDictStr = [NSString stringWithFormat:@"%@", pChangeDict];
414ba16609SHerbert Dürr OSL_TRACE( "MacAVObserver::onKeyChange k=\"%s\" c=%s", [pKeyPath UTF8String], [pDictStr UTF8String]);
424ba16609SHerbert Dürr avmedia::macavf::MacAVObserverHandler* pHandler = (avmedia::macavf::MacAVObserverHandler*)pContext;
434ba16609SHerbert Dürr pHandler->handleObservation( pKeyPath );
444ba16609SHerbert Dürr }
454ba16609SHerbert Dürr
464ba16609SHerbert Dürr - (void)onNotification:(NSNotification*)pNotification
474ba16609SHerbert Dürr {
484ba16609SHerbert Dürr NSString* pNoteName = (NSString*)[pNotification name];
494ba16609SHerbert Dürr OSL_TRACE( "MacAVObserver::onNotification key=\"%s\"", [pNoteName UTF8String]);
504ba16609SHerbert Dürr HandlersForObject::iterator it = maHandlersForObject.find( [pNotification object]);
514ba16609SHerbert Dürr if( it != maHandlersForObject.end() )
524ba16609SHerbert Dürr (*it).second->handleObservation( pNoteName );
534ba16609SHerbert Dürr }
544ba16609SHerbert Dürr
554ba16609SHerbert Dürr - (void)setHandlerForObject:(NSObject*)pObject handler:(avmedia::macavf::MacAVObserverHandler*)pHandler
564ba16609SHerbert Dürr {
574ba16609SHerbert Dürr maHandlersForObject[ pObject] = pHandler;
584ba16609SHerbert Dürr }
594ba16609SHerbert Dürr
604ba16609SHerbert Dürr - (void)removeHandlerForObject:(NSObject*)pObject
614ba16609SHerbert Dürr {
624ba16609SHerbert Dürr maHandlersForObject.erase( pObject);
634ba16609SHerbert Dürr }
644ba16609SHerbert Dürr
654ba16609SHerbert Dürr @end
664ba16609SHerbert Dürr
674ba16609SHerbert Dürr
684ba16609SHerbert Dürr namespace avmedia { namespace macavf {
694ba16609SHerbert Dürr
704ba16609SHerbert Dürr MacAVObserverObject* MacAVObserverHandler::mpMacAVObserverObject = NULL;
714ba16609SHerbert Dürr
getObserver() const724ba16609SHerbert Dürr MacAVObserverObject* MacAVObserverHandler::getObserver() const
734ba16609SHerbert Dürr {
744ba16609SHerbert Dürr if( !mpMacAVObserverObject)
754ba16609SHerbert Dürr {
764ba16609SHerbert Dürr mpMacAVObserverObject = [MacAVObserverObject alloc];
774ba16609SHerbert Dürr [mpMacAVObserverObject retain];
784ba16609SHerbert Dürr }
794ba16609SHerbert Dürr return mpMacAVObserverObject;
804ba16609SHerbert Dürr }
814ba16609SHerbert Dürr
824ba16609SHerbert Dürr
834ba16609SHerbert Dürr // ----------------
844ba16609SHerbert Dürr // - Player -
854ba16609SHerbert Dürr // ----------------
864ba16609SHerbert Dürr
Player(const uno::Reference<lang::XMultiServiceFactory> & rxMgr)874ba16609SHerbert Dürr Player::Player( const uno::Reference< lang::XMultiServiceFactory >& rxMgr )
884ba16609SHerbert Dürr : mxMgr( rxMgr )
894ba16609SHerbert Dürr , mpPlayer( NULL )
904ba16609SHerbert Dürr , mfUnmutedVolume( 0 )
914ba16609SHerbert Dürr , mfStopTime( DBL_MAX )
924ba16609SHerbert Dürr , mbMuted( false )
934ba16609SHerbert Dürr , mbLooping( false )
944ba16609SHerbert Dürr {}
954ba16609SHerbert Dürr
964ba16609SHerbert Dürr // ------------------------------------------------------------------------------
974ba16609SHerbert Dürr
~Player()984ba16609SHerbert Dürr Player::~Player()
994ba16609SHerbert Dürr {
1004ba16609SHerbert Dürr if( !mpPlayer )
1014ba16609SHerbert Dürr return;
1024ba16609SHerbert Dürr // remove the observers
1034ba16609SHerbert Dürr [mpPlayer removeObserver:getObserver() forKeyPath:@"currentItem.status"];
1044ba16609SHerbert Dürr AVPlayerItem* pOldPlayerItem = [mpPlayer currentItem];
1054ba16609SHerbert Dürr [[NSNotificationCenter defaultCenter] removeObserver:getObserver()
1064ba16609SHerbert Dürr name:AVPlayerItemDidPlayToEndTimeNotification
1074ba16609SHerbert Dürr object:pOldPlayerItem];
1084ba16609SHerbert Dürr [getObserver() removeHandlerForObject:pOldPlayerItem];
1094ba16609SHerbert Dürr // release the AVPlayer
1104ba16609SHerbert Dürr CFRelease( mpPlayer );
1114ba16609SHerbert Dürr }
1124ba16609SHerbert Dürr
1134ba16609SHerbert Dürr // ------------------------------------------------------------------------------
1144ba16609SHerbert Dürr
handleObservation(NSString * pKeyPath)1154ba16609SHerbert Dürr bool Player::handleObservation( NSString* pKeyPath )
1164ba16609SHerbert Dürr {
1174ba16609SHerbert Dürr OSL_TRACE( "AVPlayer::handleObservation key=\"%s\"", [pKeyPath UTF8String]);
1184ba16609SHerbert Dürr if( [pKeyPath isEqualToString:AVPlayerItemDidPlayToEndTimeNotification])
1194ba16609SHerbert Dürr {
1204ba16609SHerbert Dürr OSL_TRACE( "AVPlayer replay=%d", mbLooping);
1214ba16609SHerbert Dürr if( mbLooping )
1224ba16609SHerbert Dürr setMediaTime( 0.0);
1234ba16609SHerbert Dürr }
1244ba16609SHerbert Dürr return true;
1254ba16609SHerbert Dürr }
1264ba16609SHerbert Dürr
1274ba16609SHerbert Dürr // ------------------------------------------------------------------------------
1284ba16609SHerbert Dürr
create(const::rtl::OUString & rURL)1294ba16609SHerbert Dürr bool Player::create( const ::rtl::OUString& rURL )
1304ba16609SHerbert Dürr {
1314ba16609SHerbert Dürr // get the media asset
1324ba16609SHerbert Dürr NSString* aNSStr = [NSString stringWithCharacters:rURL.getStr() length:rURL.getLength()];
1334ba16609SHerbert Dürr NSURL* aNSURL = [NSURL URLWithString: [aNSStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
1344ba16609SHerbert Dürr // get the matching AVPlayerItem
1354ba16609SHerbert Dürr AVPlayerItem* pPlayerItem = [AVPlayerItem playerItemWithURL:aNSURL];
1364ba16609SHerbert Dürr
1374ba16609SHerbert Dürr // create or update the AVPlayer with the new AVPlayerItem
1384ba16609SHerbert Dürr if( !mpPlayer )
1394ba16609SHerbert Dürr {
1404ba16609SHerbert Dürr mpPlayer = [AVPlayer playerWithPlayerItem:pPlayerItem];
1414ba16609SHerbert Dürr CFRetain( mpPlayer );
1424ba16609SHerbert Dürr [mpPlayer setActionAtItemEnd:AVPlayerActionAtItemEndNone];
1434ba16609SHerbert Dürr }
1444ba16609SHerbert Dürr else
1454ba16609SHerbert Dürr {
1464ba16609SHerbert Dürr // remove the obsoleted observers
1474ba16609SHerbert Dürr AVPlayerItem* pOldPlayerItem = [mpPlayer currentItem];
1484ba16609SHerbert Dürr [mpPlayer removeObserver:getObserver() forKeyPath:@"currentItem.status"];
1494ba16609SHerbert Dürr [getObserver() removeHandlerForObject:pOldPlayerItem];
1504ba16609SHerbert Dürr [[NSNotificationCenter defaultCenter] removeObserver:getObserver()
1514ba16609SHerbert Dürr name:AVPlayerItemDidPlayToEndTimeNotification
1524ba16609SHerbert Dürr object:pOldPlayerItem];
1534ba16609SHerbert Dürr // replace the playeritem
1544ba16609SHerbert Dürr [mpPlayer replaceCurrentItemWithPlayerItem:pPlayerItem];
1554ba16609SHerbert Dürr }
1564ba16609SHerbert Dürr
1574ba16609SHerbert Dürr // observe the status of the current player item
1584ba16609SHerbert Dürr [mpPlayer addObserver:getObserver() forKeyPath:@"currentItem.status" options:0 context:this];
1594ba16609SHerbert Dürr
1604ba16609SHerbert Dürr // observe playback-end needed for playback looping
1614ba16609SHerbert Dürr [[NSNotificationCenter defaultCenter] addObserver:getObserver()
1624ba16609SHerbert Dürr selector:@selector(onNotification:)
1634ba16609SHerbert Dürr name:AVPlayerItemDidPlayToEndTimeNotification
1644ba16609SHerbert Dürr object:pPlayerItem];
1654ba16609SHerbert Dürr [getObserver() setHandlerForObject:pPlayerItem handler:this];
1664ba16609SHerbert Dürr
1674ba16609SHerbert Dürr return true;
1684ba16609SHerbert Dürr }
1694ba16609SHerbert Dürr
1704ba16609SHerbert Dürr // ------------------------------------------------------------------------------
1714ba16609SHerbert Dürr
start()1724ba16609SHerbert Dürr void SAL_CALL Player::start()
1734ba16609SHerbert Dürr throw (uno::RuntimeException)
1744ba16609SHerbert Dürr {
1754ba16609SHerbert Dürr if( !mpPlayer )
1764ba16609SHerbert Dürr return;
1774ba16609SHerbert Dürr #if 0
1784ba16609SHerbert Dürr const AVPlayerStatus eStatus = [mpPlayer status];
1794ba16609SHerbert Dürr OSL_TRACE ("Player::start status=%d", (int)eStatus);
1804ba16609SHerbert Dürr if( eStatus == AVPlayerStatusReadyToPlay)
1814ba16609SHerbert Dürr #endif
1824ba16609SHerbert Dürr [mpPlayer play];
1834ba16609SHerbert Dürr // else // TODO: delay until it becomes ready
1844ba16609SHerbert Dürr }
1854ba16609SHerbert Dürr
1864ba16609SHerbert Dürr // ------------------------------------------------------------------------------
1874ba16609SHerbert Dürr
stop()1884ba16609SHerbert Dürr void SAL_CALL Player::stop()
1894ba16609SHerbert Dürr throw (uno::RuntimeException)
1904ba16609SHerbert Dürr {
1914ba16609SHerbert Dürr if( !mpPlayer )
1924ba16609SHerbert Dürr return;
1934ba16609SHerbert Dürr const bool bPlaying = isPlaying();
1944ba16609SHerbert Dürr OSL_TRACE ("Player::stop() playing=%d", bPlaying);
1954ba16609SHerbert Dürr if( bPlaying )
1964ba16609SHerbert Dürr [mpPlayer pause];
1974ba16609SHerbert Dürr }
1984ba16609SHerbert Dürr
1994ba16609SHerbert Dürr // ------------------------------------------------------------------------------
2004ba16609SHerbert Dürr
isPlaying()2014ba16609SHerbert Dürr sal_Bool SAL_CALL Player::isPlaying()
2024ba16609SHerbert Dürr throw (uno::RuntimeException)
2034ba16609SHerbert Dürr {
2044ba16609SHerbert Dürr if( !mpPlayer )
2054ba16609SHerbert Dürr return false;
2064ba16609SHerbert Dürr const float fRate = [mpPlayer rate];
2074ba16609SHerbert Dürr return (fRate != 0.0);
2084ba16609SHerbert Dürr }
2094ba16609SHerbert Dürr
2104ba16609SHerbert Dürr // ------------------------------------------------------------------------------
2114ba16609SHerbert Dürr
getDuration()2124ba16609SHerbert Dürr double SAL_CALL Player::getDuration()
2134ba16609SHerbert Dürr throw (uno::RuntimeException)
2144ba16609SHerbert Dürr {
2154ba16609SHerbert Dürr // slideshow checks for non-zero duration, so cheat here
2164ba16609SHerbert Dürr double duration = 0.01;
2174ba16609SHerbert Dürr
2184ba16609SHerbert Dürr if( mpPlayer )
2194ba16609SHerbert Dürr {
2204ba16609SHerbert Dürr AVPlayerItem* pItem = [mpPlayer currentItem];
221*deea6bb5SHerbert Dürr if( [pItem status] == AVPlayerItemStatusReadyToPlay )
2224ba16609SHerbert Dürr duration = CMTimeGetSeconds( [pItem duration] );
223*deea6bb5SHerbert Dürr else // fall back to AVAsset's best guess
224*deea6bb5SHerbert Dürr duration = CMTimeGetSeconds( [[pItem asset] duration] );
2254ba16609SHerbert Dürr }
2264ba16609SHerbert Dürr
2274ba16609SHerbert Dürr return duration;
2284ba16609SHerbert Dürr }
2294ba16609SHerbert Dürr
2304ba16609SHerbert Dürr // ------------------------------------------------------------------------------
2314ba16609SHerbert Dürr
setMediaTime(double fTime)2324ba16609SHerbert Dürr void SAL_CALL Player::setMediaTime( double fTime )
2334ba16609SHerbert Dürr throw (uno::RuntimeException)
2344ba16609SHerbert Dürr {
2354ba16609SHerbert Dürr OSL_TRACE ("Player::setMediaTime( %.3fsec)", fTime);
2364ba16609SHerbert Dürr if( mpPlayer )
2374ba16609SHerbert Dürr [mpPlayer seekToTime: CMTimeMakeWithSeconds(fTime,1000) ];
2384ba16609SHerbert Dürr }
2394ba16609SHerbert Dürr
2404ba16609SHerbert Dürr // ------------------------------------------------------------------------------
2414ba16609SHerbert Dürr
getMediaTime()2424ba16609SHerbert Dürr double SAL_CALL Player::getMediaTime()
2434ba16609SHerbert Dürr throw (uno::RuntimeException)
2444ba16609SHerbert Dürr {
2454ba16609SHerbert Dürr if( !mpPlayer )
2464ba16609SHerbert Dürr return 0.0;
2474ba16609SHerbert Dürr
2484ba16609SHerbert Dürr const double position = CMTimeGetSeconds( [mpPlayer currentTime] );
2494ba16609SHerbert Dürr OSL_TRACE( "Player::getMediaTime() = %.3fsec", position);
2504ba16609SHerbert Dürr if( position >= mfStopTime )
2514ba16609SHerbert Dürr if( isPlaying() )
2524ba16609SHerbert Dürr stop();
2534ba16609SHerbert Dürr
2544ba16609SHerbert Dürr return position;
2554ba16609SHerbert Dürr }
2564ba16609SHerbert Dürr
2574ba16609SHerbert Dürr // ------------------------------------------------------------------------------
2584ba16609SHerbert Dürr
setStopTime(double fTime)2594ba16609SHerbert Dürr void SAL_CALL Player::setStopTime( double fTime )
2604ba16609SHerbert Dürr throw (uno::RuntimeException)
2614ba16609SHerbert Dürr {
2624ba16609SHerbert Dürr OSL_TRACE ("Player::setStopTime( %.3fsec)", fTime);
2634ba16609SHerbert Dürr mfStopTime = fTime;
2644ba16609SHerbert Dürr }
2654ba16609SHerbert Dürr
2664ba16609SHerbert Dürr // ------------------------------------------------------------------------------
2674ba16609SHerbert Dürr
getStopTime()2684ba16609SHerbert Dürr double SAL_CALL Player::getStopTime()
2694ba16609SHerbert Dürr throw (uno::RuntimeException)
2704ba16609SHerbert Dürr {
2714ba16609SHerbert Dürr return mfStopTime;
2724ba16609SHerbert Dürr }
2734ba16609SHerbert Dürr
2744ba16609SHerbert Dürr // ------------------------------------------------------------------------------
2754ba16609SHerbert Dürr
setRate(double fRate)2764ba16609SHerbert Dürr void SAL_CALL Player::setRate( double fRate )
2774ba16609SHerbert Dürr throw (uno::RuntimeException)
2784ba16609SHerbert Dürr {
2794ba16609SHerbert Dürr OSL_TRACE ("Player::setRate( %.3f)", fRate);
2804ba16609SHerbert Dürr if( !mpPlayer )
2814ba16609SHerbert Dürr return;
2824ba16609SHerbert Dürr
2834ba16609SHerbert Dürr // playback rate: 0 = stop, 1 = normal speed, 2 = double speed, -1 = normal speed backwards
2844ba16609SHerbert Dürr [mpPlayer setRate: fRate];
2854ba16609SHerbert Dürr }
2864ba16609SHerbert Dürr
2874ba16609SHerbert Dürr // ------------------------------------------------------------------------------
2884ba16609SHerbert Dürr
getRate()2894ba16609SHerbert Dürr double SAL_CALL Player::getRate()
2904ba16609SHerbert Dürr throw (uno::RuntimeException)
2914ba16609SHerbert Dürr {
2924ba16609SHerbert Dürr // macavf: 0 = stop, 1 = normal speed, 2 = double speed, -1 = normal speed backwards
2934ba16609SHerbert Dürr const double fRate = mpPlayer ? (double)[mpPlayer rate] : 1.0;
2944ba16609SHerbert Dürr OSL_TRACE ("Player::getRate() = %.3f", fRate);
2954ba16609SHerbert Dürr return fRate;
2964ba16609SHerbert Dürr }
2974ba16609SHerbert Dürr
2984ba16609SHerbert Dürr // ------------------------------------------------------------------------------
2994ba16609SHerbert Dürr
setPlaybackLoop(sal_Bool bSet)3004ba16609SHerbert Dürr void SAL_CALL Player::setPlaybackLoop( sal_Bool bSet )
3014ba16609SHerbert Dürr throw (uno::RuntimeException)
3024ba16609SHerbert Dürr {
3034ba16609SHerbert Dürr OSL_TRACE ("Player::setPlaybackLoop( %d)", bSet );
3044ba16609SHerbert Dürr mbLooping = bSet;
3054ba16609SHerbert Dürr }
3064ba16609SHerbert Dürr
3074ba16609SHerbert Dürr // ------------------------------------------------------------------------------
3084ba16609SHerbert Dürr
isPlaybackLoop()3094ba16609SHerbert Dürr sal_Bool SAL_CALL Player::isPlaybackLoop()
3104ba16609SHerbert Dürr throw (uno::RuntimeException)
3114ba16609SHerbert Dürr {
3124ba16609SHerbert Dürr const bool bRet = mbLooping;
3134ba16609SHerbert Dürr OSL_TRACE ("Player::isPlaybackLoop() = %d", bRet );
3144ba16609SHerbert Dürr return bRet;
3154ba16609SHerbert Dürr }
3164ba16609SHerbert Dürr
3174ba16609SHerbert Dürr // ------------------------------------------------------------------------------
3184ba16609SHerbert Dürr
setMute(sal_Bool bSet)3194ba16609SHerbert Dürr void SAL_CALL Player::setMute( sal_Bool bSet )
3204ba16609SHerbert Dürr throw (uno::RuntimeException)
3214ba16609SHerbert Dürr {
3224ba16609SHerbert Dürr OSL_TRACE( "Player::setMute(%d), was-muted: %d unmuted-volume: %.3f", bSet, mbMuted, mfUnmutedVolume );
3234ba16609SHerbert Dürr
3244ba16609SHerbert Dürr if( !mpPlayer )
3254ba16609SHerbert Dürr return;
3264ba16609SHerbert Dürr
3274ba16609SHerbert Dürr mbMuted = (bSet == TRUE);
3284ba16609SHerbert Dürr [mpPlayer setMuted:mbMuted];
3294ba16609SHerbert Dürr }
3304ba16609SHerbert Dürr
3314ba16609SHerbert Dürr // ------------------------------------------------------------------------------
3324ba16609SHerbert Dürr
isMute()3334ba16609SHerbert Dürr sal_Bool SAL_CALL Player::isMute()
3344ba16609SHerbert Dürr throw (uno::RuntimeException)
3354ba16609SHerbert Dürr {
3364ba16609SHerbert Dürr OSL_TRACE ("Player::isMuted() = %d", mbMuted);
3374ba16609SHerbert Dürr return mbMuted;
3384ba16609SHerbert Dürr }
3394ba16609SHerbert Dürr
3404ba16609SHerbert Dürr // ------------------------------------------------------------------------------
3414ba16609SHerbert Dürr
setVolumeDB(sal_Int16 nVolumeDB)3424ba16609SHerbert Dürr void SAL_CALL Player::setVolumeDB( sal_Int16 nVolumeDB )
3434ba16609SHerbert Dürr throw (uno::RuntimeException)
3444ba16609SHerbert Dürr {
3454ba16609SHerbert Dürr // -40dB <-> AVPlayer volume 0.0
3464ba16609SHerbert Dürr // 0dB <-> AVPlayer volume 1.0
3474ba16609SHerbert Dürr mfUnmutedVolume = (nVolumeDB <= -40) ? 0.0 : pow( 10.0, nVolumeDB / 20.0 );
3484ba16609SHerbert Dürr OSL_TRACE( "Player::setVolume(%ddB), muted=%d, unmuted-volume: %.3f", nVolumeDB, mbMuted, mfUnmutedVolume );
3494ba16609SHerbert Dürr
3504ba16609SHerbert Dürr // change volume
3514ba16609SHerbert Dürr if( !mbMuted && mpPlayer )
3524ba16609SHerbert Dürr [mpPlayer setVolume:mfUnmutedVolume];
3534ba16609SHerbert Dürr }
3544ba16609SHerbert Dürr
3554ba16609SHerbert Dürr // ------------------------------------------------------------------------------
3564ba16609SHerbert Dürr
getVolumeDB()3574ba16609SHerbert Dürr sal_Int16 SAL_CALL Player::getVolumeDB()
3584ba16609SHerbert Dürr throw (uno::RuntimeException)
3594ba16609SHerbert Dürr {
3604ba16609SHerbert Dürr if( !mpPlayer )
3614ba16609SHerbert Dürr return 0;
3624ba16609SHerbert Dürr
3634ba16609SHerbert Dürr // get the actual volume
3644ba16609SHerbert Dürr const float fVolume = [mpPlayer volume];
3654ba16609SHerbert Dürr
3664ba16609SHerbert Dürr // convert into Dezibel value
3674ba16609SHerbert Dürr // -40dB <-> AVPlayer volume 0.0
3684ba16609SHerbert Dürr // 0dB <-> AVPlayer volume 1.0
3694ba16609SHerbert Dürr const int nVolumeDB = (fVolume <= 0) ? -40 : lrint( 20.0*log10(fVolume));
3704ba16609SHerbert Dürr
3714ba16609SHerbert Dürr return (sal_Int16)nVolumeDB;
3724ba16609SHerbert Dürr }
3734ba16609SHerbert Dürr
3744ba16609SHerbert Dürr // ------------------------------------------------------------------------------
3754ba16609SHerbert Dürr
getPreferredPlayerWindowSize()3764ba16609SHerbert Dürr awt::Size SAL_CALL Player::getPreferredPlayerWindowSize()
3774ba16609SHerbert Dürr throw (uno::RuntimeException)
3784ba16609SHerbert Dürr {
3794ba16609SHerbert Dürr awt::Size aSize( 0, 0 ); // default size
3804ba16609SHerbert Dürr
3814ba16609SHerbert Dürr AVAsset* pMovie = [[mpPlayer currentItem] asset];
3824ba16609SHerbert Dürr NSArray* pVideoTracks = [pMovie tracksWithMediaType:AVMediaTypeVideo];
3834ba16609SHerbert Dürr AVAssetTrack* pFirstVideoTrack = (AVAssetTrack*)[pVideoTracks firstObject];
3844ba16609SHerbert Dürr if( pFirstVideoTrack )
3854ba16609SHerbert Dürr {
3864ba16609SHerbert Dürr const CGSize aPrefSize = [pFirstVideoTrack naturalSize];
3874ba16609SHerbert Dürr aSize = awt::Size( aPrefSize.width, aPrefSize.height );
3884ba16609SHerbert Dürr }
3894ba16609SHerbert Dürr
3904ba16609SHerbert Dürr return aSize;
3914ba16609SHerbert Dürr }
3924ba16609SHerbert Dürr
3934ba16609SHerbert Dürr // ------------------------------------------------------------------------------
3944ba16609SHerbert Dürr
createPlayerWindow(const uno::Sequence<uno::Any> & aArguments)3954ba16609SHerbert Dürr uno::Reference< ::media::XPlayerWindow > SAL_CALL Player::createPlayerWindow( const uno::Sequence< uno::Any >& aArguments )
3964ba16609SHerbert Dürr throw (uno::RuntimeException)
3974ba16609SHerbert Dürr {
3984ba16609SHerbert Dürr // get the preferred window size
3994ba16609SHerbert Dürr const awt::Size aSize( getPreferredPlayerWindowSize() );
4004ba16609SHerbert Dürr OSL_TRACE( "Player::createPlayerWindow %dx%d argsLength: %d", aSize.Width, aSize.Height, aArguments.getLength() );
4014ba16609SHerbert Dürr
4024ba16609SHerbert Dürr // get the parent view
4034ba16609SHerbert Dürr sal_IntPtr nNSViewPtr = NULL;
4044ba16609SHerbert Dürr aArguments[0] >>= nNSViewPtr;
4054ba16609SHerbert Dürr NSView* pParentView = reinterpret_cast<NSView*>(nNSViewPtr);
4064ba16609SHerbert Dürr
4074ba16609SHerbert Dürr // check the window parameters
4084ba16609SHerbert Dürr uno::Reference< ::media::XPlayerWindow > xRet;
4094ba16609SHerbert Dürr if( (aSize.Width <= 0) || (aSize.Height <= 0) || (pParentView == NULL) )
4104ba16609SHerbert Dürr return xRet;
4114ba16609SHerbert Dürr
4124ba16609SHerbert Dürr // create the window
4134ba16609SHerbert Dürr ::avmedia::macavf::Window* pWindow = new ::avmedia::macavf::Window( mxMgr, *this, pParentView );
4144ba16609SHerbert Dürr xRet = pWindow;
4154ba16609SHerbert Dürr return xRet;
4164ba16609SHerbert Dürr }
4174ba16609SHerbert Dürr
4184ba16609SHerbert Dürr // ------------------------------------------------------------------------------
4194ba16609SHerbert Dürr
createFrameGrabber()4204ba16609SHerbert Dürr uno::Reference< media::XFrameGrabber > SAL_CALL Player::createFrameGrabber()
4214ba16609SHerbert Dürr throw (uno::RuntimeException)
4224ba16609SHerbert Dürr {
4234ba16609SHerbert Dürr uno::Reference< media::XFrameGrabber > xRet;
4244ba16609SHerbert Dürr OSL_TRACE ("Player::createFrameGrabber");
4254ba16609SHerbert Dürr
4264ba16609SHerbert Dürr FrameGrabber* pGrabber = new FrameGrabber( mxMgr );
4276a7d45efSHerbert Dürr AVAsset* pMovie = [[mpPlayer currentItem] asset];
4286a7d45efSHerbert Dürr if( pGrabber->create( pMovie ) )
4294ba16609SHerbert Dürr xRet = pGrabber;
4304ba16609SHerbert Dürr
4314ba16609SHerbert Dürr return xRet;
4324ba16609SHerbert Dürr }
4334ba16609SHerbert Dürr
4344ba16609SHerbert Dürr // ------------------------------------------------------------------------------
4354ba16609SHerbert Dürr
getImplementationName()4364ba16609SHerbert Dürr ::rtl::OUString SAL_CALL Player::getImplementationName( )
4374ba16609SHerbert Dürr throw (uno::RuntimeException)
4384ba16609SHerbert Dürr {
4394ba16609SHerbert Dürr return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_MACAVF_PLAYER_IMPLEMENTATIONNAME ) );
4404ba16609SHerbert Dürr }
4414ba16609SHerbert Dürr
4424ba16609SHerbert Dürr // ------------------------------------------------------------------------------
4434ba16609SHerbert Dürr
supportsService(const::rtl::OUString & ServiceName)4444ba16609SHerbert Dürr sal_Bool SAL_CALL Player::supportsService( const ::rtl::OUString& ServiceName )
4454ba16609SHerbert Dürr throw (uno::RuntimeException)
4464ba16609SHerbert Dürr {
4474ba16609SHerbert Dürr return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( AVMEDIA_MACAVF_PLAYER_SERVICENAME ) );
4484ba16609SHerbert Dürr }
4494ba16609SHerbert Dürr
4504ba16609SHerbert Dürr // ------------------------------------------------------------------------------
4514ba16609SHerbert Dürr
getSupportedServiceNames()4524ba16609SHerbert Dürr uno::Sequence< ::rtl::OUString > SAL_CALL Player::getSupportedServiceNames( )
4534ba16609SHerbert Dürr throw (uno::RuntimeException)
4544ba16609SHerbert Dürr {
4554ba16609SHerbert Dürr uno::Sequence< ::rtl::OUString > aRet(1);
4564ba16609SHerbert Dürr aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( AVMEDIA_MACAVF_PLAYER_SERVICENAME ) );
4574ba16609SHerbert Dürr
4584ba16609SHerbert Dürr return aRet;
4594ba16609SHerbert Dürr }
4604ba16609SHerbert Dürr
4614ba16609SHerbert Dürr } // namespace macavf
4624ba16609SHerbert Dürr } // namespace avmedia
4634ba16609SHerbert Dürr
464