diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccvideosourcesink/src/mccvideosourcekeyretriever.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmccvideosourcesink/src/mccvideosourcekeyretriever.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,334 @@ +/* +* Copyright (c) 2006 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: +* +*/ + + + +// INCLUDE FILES +#include "mccvideosourcekeyretriever.h" +#include "mccinternalcodecs.h" +#include "mccinternaldef.h" +#include "mccinternalevents.h" +#include "mccvideosourceimpl.h" +#include "mccvideosourcesinklogs.h" +#include "mccperiodicrunner.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::NewLC +// ----------------------------------------------------------------------------- +// +CMccVideoSourceConfigKeyRetriever* CMccVideoSourceConfigKeyRetriever::NewLC( + MMccCameraHandler& aCameraHandler ) + { + CMccVideoSourceConfigKeyRetriever* self = + new ( ELeave ) CMccVideoSourceConfigKeyRetriever( aCameraHandler ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::~CMccVideoSourceConfigKeyRetriever +// ----------------------------------------------------------------------------- +// +CMccVideoSourceConfigKeyRetriever::~CMccVideoSourceConfigKeyRetriever() + { + __V_SOURCESINK_CONTROLL( + "CMccVideoSourceConfigKeyRetriever::~CMccVideoSourceConfigKeyRetriever" ) + + delete iGuardTimer; + + StopWaiting(); + + delete iWait; + + delete iSource; + + delete iBuffer; + + __V_SOURCESINK_CONTROLL( + "CMccVideoSourceConfigKeyRetriever::~CMccVideoSourceConfigKeyRetriever, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::RetrieveL +// ----------------------------------------------------------------------------- +// +void CMccVideoSourceConfigKeyRetriever::RetrieveL( + const TMccCodecInfo& aVideoCodec, + TDes8& aConfigKey ) + { + __V_SOURCESINK_CONTROLL( "CMccVideoSourceConfigKeyRetriever::RetrieveL" ) + + __ASSERT_ALWAYS( aVideoCodec.iSdpName.CompareF( KAVCSdpName ) == 0, + User::Leave( KErrNotSupported ) ); + + delete iBuffer; + iBuffer = NULL; + iBuffer = CMMFDataBuffer::NewL( aVideoCodec.iFrameSize ); + + delete iSource; + iSource = NULL; + iSource = CMccVideoSourceImpl::NewL( 0, NULL, ETrue ); + + iFailed = EFalse; + + iSource->SourceThreadLogon( *this ); + iSource->SetCameraHandler( iCameraHandler ); + iSource->SetVideoCodecL( aVideoCodec ); + iSource->SourcePrimeL( EFalse ); + + if ( !iSource->HasConfigKey() && !iFailed ) + { + __V_SOURCESINK_CONTROLL( "Start waiting for key" ) + + // Start also guard timer to prevent possible eternal jam + StartGuardTimer(); + + iWait->Start(); + + __V_SOURCESINK_CONTROLL( "Waiting completed" ) + StopGuardTimer(); + } + + __ASSERT_ALWAYS( !iFailed, User::Leave( KErrNotFound ) ); + + iSource->GetConfigKeyL( aVideoCodec, aConfigKey, EFalse ); + + __V_SOURCESINK_CONTROLL( "CMccVideoSourceConfigKeyRetriever::RetrieveL, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::SendEventToClient +// ----------------------------------------------------------------------------- +// +TInt CMccVideoSourceConfigKeyRetriever::SendEventToClient( const TMMFEvent& aEvent ) + { + __V_SOURCESINK_CONTROLL( "CMccVideoSourceConfigKeyRetriever::SendEventToClient" ) + + TInt error( KErrNone ); + TMccEvent* mccEventPtr = NULL; + if ( IS_MCC_EVENT( aEvent ) ) + { + mccEventPtr = + reinterpret_cast( aEvent ).iMccEvent; + } + + if ( mccEventPtr ) + { + TRAP( error, HandleEventL( *mccEventPtr ) ); + if ( error != KErrNone ) + { + HandleError(); + } + } + + __V_SOURCESINK_CONTROLL( "CMccVideoSourceConfigKeyRetriever::SendEventToClient, exit" ) + + return error; + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::SinkDataTypeCode +// ----------------------------------------------------------------------------- +// +TFourCC CMccVideoSourceConfigKeyRetriever::SinkDataTypeCode( TMediaId /*aMediaId*/ ) + { + return TFourCC( 0 ); + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::EmptyBufferL +// ----------------------------------------------------------------------------- +// +void CMccVideoSourceConfigKeyRetriever::EmptyBufferL( + CMMFBuffer* /*aBuffer*/, MDataSource* /*aSupplier*/, TMediaId /*aMediaId*/ ) + { + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::BufferFilledL +// ----------------------------------------------------------------------------- +// +void CMccVideoSourceConfigKeyRetriever::BufferFilledL( CMMFBuffer* /*aBuffer*/ ) + { + __V_SOURCESINK_CONTROLL( "CMccVideoSourceConfigKeyRetriever::BufferFilledL" ) + + // First buffer was received from mediarecorder, config info should be now + // available. + StopWaiting(); + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::CanCreateSinkBuffer +// ----------------------------------------------------------------------------- +// +TBool CMccVideoSourceConfigKeyRetriever::CanCreateSinkBuffer() + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::CreateSinkBufferL +// ----------------------------------------------------------------------------- +// +CMMFBuffer* CMccVideoSourceConfigKeyRetriever::CreateSinkBufferL( + TMediaId /*aMediaId*/, TBool& /*aReference*/ ) + { + return NULL; + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::ConstructSinkL +// ----------------------------------------------------------------------------- +// +void CMccVideoSourceConfigKeyRetriever::ConstructSinkL( const TDesC8& /*aInitData*/ ) + { + } + + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::ConstructL +// ----------------------------------------------------------------------------- +// +void CMccVideoSourceConfigKeyRetriever::ConstructL() + { + __V_SOURCESINK_CONTROLL( "CMccVideoSourceConfigKeyRetriever::ConstructL" ) + + iWait = new ( ELeave ) CActiveSchedulerWait; + + iGuardTimer = CMccPeriodicRunner::NewL(); + + __V_SOURCESINK_CONTROLL( "CMccVideoSourceConfigKeyRetriever::ConstructL, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::ConstructL +// ----------------------------------------------------------------------------- +// +CMccVideoSourceConfigKeyRetriever::CMccVideoSourceConfigKeyRetriever( + MMccCameraHandler& aCameraHandler ) : + MDataSink( KNullUid ), + iCameraHandler( aCameraHandler ), + iGuardTimerTimeout( KMccKeyRetrieveGuardTimeoutMicrosecs ) + { + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::HandleEventL +// ----------------------------------------------------------------------------- +// +void CMccVideoSourceConfigKeyRetriever::HandleEventL( TMccEvent& aEvent ) + { + __V_SOURCESINK_CONTROLL( "CMccVideoSourceConfigKeyRetriever::HandleEventL" ) + + if ( aEvent.iEventType == KMccStreamError || aEvent.iErrorCode != KErrNone ) + { + User::Leave( KErrNotReady ); + } + else if ( aEvent.iEventType == KMccStreamPrepared ) + { + __V_SOURCESINK_CONTROLL( "Prepared" ) + + // Start recording, first buffer received from mediarecorder + // should contain config info + iSource->FillBufferL( iBuffer, this, KUidMediaTypeVideo ); + iSource->SourcePlayL(); + } + else if ( aEvent.iEventType == KMccStreamStarted ) + { + __V_SOURCESINK_CONTROLL( "Started" ) + } + else + { + // NOP + } + + __V_SOURCESINK_CONTROLL( "CMccVideoSourceConfigKeyRetriever::HandleEventL, exit" ) + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::HandleError +// ----------------------------------------------------------------------------- +// +void CMccVideoSourceConfigKeyRetriever::HandleError() + { + __V_SOURCESINK_CONTROLL( "CMccVideoSourceConfigKeyRetriever::HandleError" ) + + iFailed = ETrue; + StopWaiting(); + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::StopWaiting +// ----------------------------------------------------------------------------- +// +void CMccVideoSourceConfigKeyRetriever::StopWaiting() + { + if ( iWait && iWait->IsStarted() ) + { + __V_SOURCESINK_CONTROLL( "CMccVideoSourceConfigKeyRetriever::StopWaiting" ) + iWait->AsyncStop(); + } + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::StartGuardTimer +// ----------------------------------------------------------------------------- +// +void CMccVideoSourceConfigKeyRetriever::StartGuardTimer() + { + __V_SOURCESINK_CONTROLL( "CMccVideoSourceConfigKeyRetriever::StartGuardTimer" ) + + iGuardTimer->Start( + iGuardTimerTimeout, TCallBack( GuardTimerExpired, this ) ); + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::StopGuardTimer +// ----------------------------------------------------------------------------- +// +void CMccVideoSourceConfigKeyRetriever::StopGuardTimer() + { + __V_SOURCESINK_CONTROLL( "CMccVideoSourceConfigKeyRetriever::StopGuardTimer" ) + + iGuardTimer->Stop(); + } + +// ----------------------------------------------------------------------------- +// CMccVideoSourceConfigKeyRetriever::GuardTimerExpired +// ----------------------------------------------------------------------------- +// +TInt CMccVideoSourceConfigKeyRetriever::GuardTimerExpired( TAny* aObject ) + { + __V_SOURCESINK_CONTROLL( "CMccVideoSourceConfigKeyRetriever::GuardTimerExpired" ) + + CMccVideoSourceConfigKeyRetriever* self = + static_cast( aObject ); + if ( self ) + { + self->StopWaiting(); + } + + __V_SOURCESINK_CONTROLL( "CMccVideoSourceConfigKeyRetriever::GuardTimerExpired, exit" ) + + return KErrNone; + } + +// End of file +