diff -r 826cea16efd9 -r 13a33d82ad98 dvrengine/CommonRecordingEngine/src/CCRNullSink.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dvrengine/CommonRecordingEngine/src/CCRNullSink.cpp Wed Sep 01 12:20:37 2010 +0100 @@ -0,0 +1,191 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Class that takes packet from buffer and does not put them* +*/ + + + + +// INCLUDE FILES +#include "CCRNullSink.h" +#include "CCRPacketBuffer.h" +#include "CCRStreamingSession.h" +#include "CCRTimer.h" +#include "MCRConnectionObserver.h" +#include "videoserviceutilsLogger.h" + +// CONSTANTS +// None + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCRNullSink::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCRNullSink* CCRNullSink::NewL( + CCRStreamingSession::TCRSinkId aSinkId, + CCRStreamingSession& aOwningSession ) + { + CCRNullSink* self = new( ELeave ) CCRNullSink( aSinkId, aOwningSession ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CCRNullSink::CCRNullSink +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CCRNullSink::CCRNullSink( + CCRStreamingSession::TCRSinkId aSinkId, + CCRStreamingSession& aOwningSession ) + : CCRPacketSinkBase( aOwningSession, aSinkId ) + { + // None + } + +// ----------------------------------------------------------------------------- +// CCRNullSink::ConstructL +// 2nd phase. +// ----------------------------------------------------------------------------- +// +void CCRNullSink::ConstructL() + { + // None + } + +// ----------------------------------------------------------------------------- +// CCRNullSink::~CCRNullSink +// Destructor. +// ----------------------------------------------------------------------------- +// +CCRNullSink::~CCRNullSink() + { + delete iSdp; + delete iFlowTimer; + iBuffer = NULL; // does not delete and it is right thing. + } + +// ----------------------------------------------------------------------------- +// CCRNullSink::SetSdpL +// as a side-effect causes parsing of the sdp. +// ----------------------------------------------------------------------------- +// +void CCRNullSink::SetSdpL( const TDesC8& aSdp ) + { + LOG1( "CCRNullSink::SetSdpL(), aSdp len: %d", aSdp.Length() ); + + delete iSdp; iSdp = NULL; + iSdp = aSdp.AllocL(); + iOwningSession.PlayCommand( KRealZero, KRealMinusOne ); + } + +// ----------------------------------------------------------------------------- +// CCRNullSink::NewPacketAvailable +// +// ----------------------------------------------------------------------------- +// +void CCRNullSink::NewPacketAvailable() + { + if ( iBuffer ) + { + TPtr8 packet( NULL, 0 ); + MCRPacketSource::TCRPacketStreamId streamId; + const TInt book( iBuffer->GetStream( iSinkId, streamId ) ); + iBuffer->GetPacket( book, packet ); + const TUint8* pointer( &packet[2] ); + TInt seq( BigEndian::Get16( pointer ) ); + LOG2( "CCRNullSink::NewPacketAvailable(), streamId: %u, seq: %u", + streamId, seq ); + // Keep buffer size reasonable + iBuffer->HandleBufferSize(); + + // Handle flow control + if ( !iBuffer->ContinousStream() && !iFlowTimer ) + { + TRAPD( err, iFlowTimer = CCRTimer::NewL( CActive::EPriorityLow, *this ) ); + if ( !err ) + { + if ( iBuffer->PacketsCount( iSinkId ) > KErrNotFound ) + { + iFlowTimer->After( 0 ); + } + else + { + iFlowTimer->At( 2e6 ); + } + } + else + { + delete iFlowTimer; iFlowTimer = NULL; + } + } + } + } + +// ----------------------------------------------------------------------------- +// CCRNullSink::TimerExpired +// ----------------------------------------------------------------------------- +// +void CCRNullSink::TimerExpired( CCRTimer* /*aTimer*/ ) + { + if ( iBuffer->PacketsCount( iSinkId ) > KErrNotFound ) + { + NewPacketAvailable(); + } + else + { + iOwningSession.SourceRestore(); + } + + delete iFlowTimer; iFlowTimer = NULL; + } + +// ----------------------------------------------------------------------------- +// CCRNullSink::RegisterConnectionObs +// ----------------------------------------------------------------------------- +// +void CCRNullSink::RegisterConnectionObs( MCRConnectionObserver* aObserver ) + { + iObserver = aObserver; + } + +// ----------------------------------------------------------------------------- +// CCRNullSink::StatusChanged +// ----------------------------------------------------------------------------- +// +void CCRNullSink::StatusChanged( MCRPacketSource::TCRPacketSourceState aNewState ) + { + if( iObserver ) + { + TCRTestSinkData data = aNewState==MCRPacketSource::ERtpStateIdle ? ECRTestSinkStateIdle : + aNewState==MCRPacketSource::ERtpStateSdpAvailable ? ECRTestSinkStateSdpAvailable : + aNewState==MCRPacketSource::ERtpStateSeqAndTSAvailable ? ECRTestSinkStateSeqAndTSAvailable : + aNewState==MCRPacketSource::ERtpStatePlaying ? ECRTestSinkStatePlaying : + /*aNewState==MCRPacketSource::ERtpStateClosing?*/ ECRTestSinkStateClosing; + + LOG3( "CCRNullSink::StatusChanged: newState=%d -> ECRTestSinkData, checksum=%d, data=%d", + (TInt)aNewState, (TInt)iOwningSession.SourceChecksum(), (TInt)data ); + iObserver->ConnectionStatusChange( iOwningSession.SourceChecksum(), + MCRConnectionObserver::ECRTestSinkData, + (TInt)data ); + } + } + + +// End of File