diff -r f5050f1da672 -r 04becd199f91 javauis/mmapi_akn/baseline/src/cmmavideourlplayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/mmapi_akn/baseline/src/cmmavideourlplayer.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,317 @@ +/* +* Copyright (c) 2002-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: This class is used for playing video. +* +*/ + + +// INCLUDE FILES +#include +#include +#include + +#include "cmmavideourlplayer.h" +#include "mmmadisplay.h" +#include "cmmasourcestream.h" + +const TUid KUrlSourceUid = { KMmfUidUrlSource }; +_LIT(KMMALiveStreamMetaDataKeyword, "LiveStream"); +_LIT(KMMALiveStreamMetaDataValue, "1"); + +CMMAVideoUrlPlayer* CMMAVideoUrlPlayer::NewLC( + CMMAMMFResolver* aResolver, + const TDesC& aUrl) +{ + CMMAVideoUrlPlayer* self = new(ELeave) CMMAVideoUrlPlayer( + aResolver); + CleanupStack::PushL(self); + self->ConstructL(aUrl); + return self; +} + +EXPORT_C CMMAVideoUrlPlayer::~CMMAVideoUrlPlayer() +{ + iConnection.Close(); + iSocketServ.Close(); + delete iUrl; + delete iPlayerDelegate; +} + +EXPORT_C void CMMAVideoUrlPlayer::ConstructL(const TDesC& aUrl) +{ + CMMAVideoPlayer::ConstructL(); + iUrl = aUrl.AllocL(); + + User::LeaveIfError(iSocketServ.Connect()); + User::LeaveIfError(iConnection.Open(iSocketServ)); +} + +EXPORT_C CMMAVideoUrlPlayer::CMMAVideoUrlPlayer( + CMMAMMFResolver* aResolver): + CMMAVideoPlayer(aResolver) +{ +} + +EXPORT_C void CMMAVideoUrlPlayer::DeallocateL() +{ + __ASSERT_DEBUG(iPlayerDelegate != NULL, User::Invariant()); + delete iPlayerDelegate; + iPlayerDelegate = NULL; + CMMAMMFPlayerBase::DeallocateL(); +} + +EXPORT_C void CMMAVideoUrlPlayer::CloseL() +{ + // Do not call the CMMAVideoPlayer CloseL because it deletes + // file source stream. + CMMAAudioPlayer::CloseL(); +} + +EXPORT_C void CMMAVideoUrlPlayer::StartL() +{ + __ASSERT_DEBUG(iPlayerDelegate != NULL, User::Invariant()); + DEBUG("CMMAVideoUrlPlayer::StartL() +"); + iPlayerDelegate->StartL(); + DEBUG("CMMAVideoUrlPlayer::StartL() -"); +} + +EXPORT_C void CMMAVideoUrlPlayer::StopL(TBool aPostEvent) +{ + DEBUG("MMA::CMMAVideoUrlPlayer::StopL "); + __ASSERT_DEBUG(iPlayerDelegate != NULL, User::Invariant()); + iPlayerDelegate->StopL(aPostEvent); +} + +EXPORT_C void CMMAVideoUrlPlayer::GetMediaTime(TInt64* aMediaTime) +{ + DEBUG("MMA::CMMAVideoUrlPlayer::GetMediaTime +"); + if (iPlayerDelegate) + { + DEBUG("MMA::CMMAVideoUrlPlayer::GetMediaTime .iPlayerDelegate->GetMediaTime "); + iPlayerDelegate->GetMediaTime(aMediaTime); + } + else + { + DEBUG("MMA::CMMAVideoUrlPlayer::GetMediaTime Not found "); + *aMediaTime = KErrNotFound; + } + DEBUG("MMA::CMMAVideoUrlPlayer::GetMediaTime -"); +} + +EXPORT_C void CMMAVideoUrlPlayer::RealizeL() +{ + CMMAPlayer::RealizeL(); // Changes state to ERealized +} + + +EXPORT_C void CMMAVideoUrlPlayer::PrefetchL() +{ + const TUint KConnectionTreshold(1); + TUint connectIap((TUint)KUseDefaultIap); + TUint connectionCount(0); + User::LeaveIfError(iConnection.EnumerateConnections(connectionCount)); + DEBUG_INT("MMA::CMMAVideoUrlPlayer::PrefetchL: connectionCount = %d", connectionCount); + if (connectionCount == KConnectionTreshold) + { + // One active connection - find it and try using it + FindActiveIap(connectionCount, connectIap); + } + // else No active connections try using the default one + DEBUG_INT("MMA::CMMAVideoUrlPlayer::PrefetchL: connectIap = %d", connectIap); + + CMMFUrlParams* urlCfg = CMMFUrlParams::NewLC(*iUrl, (TInt)connectIap); + CBufFlat* urlCfgBuffer = urlCfg->ExternalizeToCBufFlatLC(); + + // Store current thread priority to give + // more CPU time to Java threads i.e. this + // is work around for not locking the Java + // thread while RTSP connection is being + // opened + iOrigPriority = RThread().Priority(); + + // player priority settings + TMMFPrioritySettings prioritySettings; + prioritySettings.iPriority = EMdaPriorityMax; + prioritySettings.iPref = EMdaPriorityPreferenceTimeAndQuality; + prioritySettings.iState = EMMFStatePlaying; + + User::LeaveIfError(DoOpen(KUrlSourceUid, + urlCfgBuffer->Ptr(0), + KUidMmfAudioOutput, + KNullDesC8, + prioritySettings)); + + User::LeaveIfError(iController.Prime()); + + CleanupStack::PopAndDestroy(urlCfgBuffer); + CleanupStack::PopAndDestroy(urlCfg); + + // Prefetch will be completed in HandleEvent method. + // Next event KMMFEventCategoryVideoOpenComplete will be handled in + // CMMAVideoPlayer. +} + +void CMMAVideoUrlPlayer::FindActiveIap(const TUint aConnectionCount, TUint& aActiveIap) +{ + DEBUG_INT("MMA:CMMAVideoUrlPlayer::FindActiveIap: aConnectionCount = %d +", aConnectionCount); + + TPckgBuf connectionInfo; + for (TUint i = 1; i <= aConnectionCount; ++i) + { + if (iConnection.GetConnectionInfo(i, connectionInfo) == KErrNone) + { + aActiveIap = connectionInfo().iIapId; + break; + } + } + + DEBUG_INT("MMA:CMMAVideoUrlPlayer::FindActiveIap: aActiveIap = %d -", aActiveIap); +} + +TBool CMMAVideoUrlPlayer::IsLiveStreamL() +{ + DEBUG("CMMAVideoUrlPlayer::IsLiveStream: Checking if this is a live stream.."); + + CMMFMetaDataEntry* currEntry = NULL; + + TInt nEntries = 0; + User::LeaveIfError(iController.GetNumberOfMetaDataEntries(nEntries)); + + for (TInt i = 0; i < nEntries; ++i) + { + currEntry = iController.GetMetaDataEntryL(i); + + if ((0 == currEntry->Name().Compare(KMMALiveStreamMetaDataKeyword)) && + (0 == currEntry->Value().Compare(KMMALiveStreamMetaDataValue))) + { + DEBUG("CMMAVideoUrlPlayer::IsLiveStream: Stream is a live stream"); + delete currEntry; + return ETrue; + } + + delete currEntry; + } + + DEBUG("CMMAVideoUrlPlayer::IsLiveStream: Not a live stream"); + return EFalse; +} + +EXPORT_C void CMMAVideoUrlPlayer::HandleEvent(const TMMFEvent& aEvent) +{ + DEBUG_INT("MMA:CMMAVideoUrlPlayer::HandleEvent 0x%X", aEvent.iEventType.iUid); + DEBUG_INT("MMA:CMMAVideoUrlPlayer::HandleEvent error code: %d", aEvent.iErrorCode); + RThread currentThread; + + if (iPlayerDelegate != NULL) + { + DEBUG("MMA::CMMAVideoUrlPlayer::HandleEvent: iPlayerDelegate != NULL"); + iPlayerDelegate->HandleEvent(aEvent); + } + else + { + DEBUG("MMA::CMMAVideoUrlPlayer::HandleEvent: else"); + + __ASSERT_DEBUG(iPlayerDelegate == NULL, User::Invariant()); + TInt err = aEvent.iErrorCode; + + DEBUG_INT("MMA:CMMAVideoUrlPlayer::HandleEvent: currentThread.Priority() I = %d", currentThread.Priority()); + + // Lower thread priority to give more CPU time to Java-threads + // i.e. current thread has one increment higher priority than + // EPriorityNormal + if (aEvent.iEventType == KMMFEventCategoryVideoOpenComplete && + err == KErrNone) + { + currentThread.SetPriority(EPriorityNormal); + } + + DEBUG_INT("MMA:CMMAVideoUrlPlayer::HandleEvent: currentThread.Priority() II = %d", currentThread.Priority()); + + if (aEvent.iEventType == KMMFEventCategoryVideoPrepareComplete) + { + // Restore original thread priority + currentThread.SetPriority(iOrigPriority); + DEBUG_INT("MMA:CMMAVideoUrlPlayer::HandleEvent: currentThread.Priority() III = %d", currentThread.Priority()); + + // NotCompleteVideoError is not considered as an error condition, instead it indicates + // that some elements of the media cannot be played (e.g. video OR audio) + if (err != KErrNone && err != KNotCompleteVideoError) + { + CompletePrefetch(err); + return; + } + + // Find out of this is a live stream + TBool liveStream = EFalse; + TRAP(err, liveStream = IsLiveStreamL()); + + if (err != KErrNone) + { + CompletePrefetch(err); + return; + } + + if (liveStream) + { + TRAP(err, iPlayerDelegate = + CMMAVideoUrlPlayerLiveStreamDelegate::NewL(*this)); + } + else + { + iPlayerDelegate = new CMMAVideoUrlPlayerClipStreamDelegate(*this); + err = iPlayerDelegate ? KErrNone : KErrNoMemory; + } + + if (err != KErrNone) + { + // could not create delegate + CompletePrefetch(err); + return; + } + + iPlayerDelegate->HandleEvent(aEvent); + } + else + { + // All other events. + DEBUG("MMA::CMMAVideoUrlPlayer::HandleEvent: Calling CMMAVideoPlayer::HandleEvent()"); + CMMAVideoPlayer::HandleEvent(aEvent); + } + } +} + +void CMMAVideoUrlPlayer::HandleEventToParent(const TMMFEvent& aEvent) +{ + CMMAVideoPlayer::HandleEvent(aEvent); +} + +// ---------------------------------------------------------------------------- +// +// CMMAVideoUrlPlayerClipStreamDelegate +// +// ---------------------------------------------------------------------------- + +CMMAVideoUrlPlayer::CMMAVideoUrlPlayerDelegate:: +CMMAVideoUrlPlayerDelegate(CMMAVideoUrlPlayer& aPlayer) : + iPlayer(aPlayer) +{ + // Nothing to be done. +} + +CMMAVideoUrlPlayer::CMMAVideoUrlPlayerDelegate::~CMMAVideoUrlPlayerDelegate() +{ + // Nothing to be done. +} + +// END OF FILE