diff -r 33a5d2bbf6fc -r 73a1feb507fb mmsharing/livecommsui/lcui/tsrc/ipvtengine/src/musengmceutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmsharing/livecommsui/lcui/tsrc/ipvtengine/src/musengmceutils.cpp Tue Aug 31 15:12:07 2010 +0300 @@ -0,0 +1,594 @@ +/* +* Copyright (c) 2005-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: Utilities to get and set profile used with SWIS. +* +*/ + + + +// USER + +#include "musengmceutils.h" +#include "muslogger.h" + +// SYSTEM + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + + + +// ----------------------------------------------------------------------------- +// Tells if parameter stream is a video stream with RTP source +// ----------------------------------------------------------------------------- +// +TBool MusEngMceUtils::IsVideoInStream( CMceMediaStream& aStream ) + { + return ( aStream.Type() == KMceVideo && + aStream.Source() && + aStream.Source()->Type() == KMceRTPSource ); + } + +// ----------------------------------------------------------------------------- +// Tells if parameter stream is a video stream with RTP sink +// ----------------------------------------------------------------------------- +// +TBool MusEngMceUtils::IsVideoOutStream( CMceMediaStream& aStream ) + { + TBool isOutStream( EFalse ); + if ( aStream.Type() == KMceVideo ) + { + CMceMediaSink* rtpSink = MusEngMceUtils::GetMediaSink( + aStream, + KMceRTPSink ); + + isOutStream = ( rtpSink != NULL ); + } + return isOutStream; + } + +// ----------------------------------------------------------------------------- +// Tells if parameter stream is an audio stream with RTP source +// ----------------------------------------------------------------------------- +// +TBool MusEngMceUtils::IsAudioInStream( CMceMediaStream& aStream ) + { + return ( aStream.Type() == KMceAudio && + aStream.Source() && + aStream.Source()->Type() == KMceRTPSource ); + } + + +// ----------------------------------------------------------------------------- +// Gets handle to video stream with RTP sink. +// ----------------------------------------------------------------------------- +// +CMceVideoStream* MusEngMceUtils::GetVideoOutStreamL( CMceSession& aSession ) + { + MUS_LOG( "mus: [ENGINE] -> MusEngMceUtils::GetVideoOutStreamL()" ) + + const RPointerArray& streams = aSession.Streams(); + + CMceVideoStream* videoOut = NULL; + + for ( TInt i = 0; i < streams.Count(); ++i ) + { + if ( MusEngMceUtils::IsVideoOutStream( *streams[i] ) ) + { + __ASSERT_ALWAYS( !videoOut, User::Leave( KErrOverflow ) ); + + videoOut = static_cast( streams[i] ); + } + + // Check if bound stream is a video stream with RTP sink. + if ( streams[i]->BoundStream() && + MusEngMceUtils::IsVideoOutStream( streams[i]->BoundStreamL() ) ) + { + __ASSERT_ALWAYS( !videoOut, User::Leave( KErrOverflow ) ); + + videoOut = static_cast( + &streams[i]->BoundStreamL() ); + } + } + + __ASSERT_ALWAYS( videoOut, User::Leave( KErrNotFound ) ); + + MUS_LOG( "mus: [ENGINE] <- MusEngMceUtils::GetVideoOutStreamL()" ) + + return videoOut; + } + + +// ----------------------------------------------------------------------------- +// Gets handle to video stream with RTP source. +// ----------------------------------------------------------------------------- +// +CMceVideoStream* MusEngMceUtils::GetVideoInStreamL( CMceSession& aSession ) + { + MUS_LOG( "mus: [ENGINE] -> MusEngMceUtils::GetVideoInStreamL()" ) + + const RPointerArray& streams = aSession.Streams(); + + CMceVideoStream* videoIn = NULL; + + for ( TInt i = 0; i < streams.Count(); ++i ) + { + if ( MusEngMceUtils::IsVideoInStream( *streams[i] ) ) + + { + __ASSERT_ALWAYS( !videoIn, User::Leave( KErrOverflow ) ); + + videoIn = static_cast( streams[i] ); + } + + // Check if bound stream is a video stream with RTP souce. + if ( streams[i]->BoundStream() && + MusEngMceUtils::IsVideoInStream( streams[i]->BoundStreamL() ) ) + { + __ASSERT_ALWAYS( !videoIn, User::Leave( KErrOverflow ) ); + + videoIn = static_cast( + &streams[i]->BoundStreamL() ); + } + } + + __ASSERT_ALWAYS( videoIn, User::Leave( KErrNotFound ) ); + + MUS_LOG( "mus: [ENGINE] <- MusEngMceUtils::GetVideoInStreamL()" ) + + return videoIn; + } + + +// ----------------------------------------------------------------------------- +// Gets handle to video stream with file sink +// ----------------------------------------------------------------------------- +// +CMceVideoStream* MusEngMceUtils::GetRecordingStream( CMceSession& aSession ) + { + MUS_LOG( "mus: [ENGINE] -> MusEngMceUtils::GetRecordingStreamL()" ) + + const RPointerArray& streams = aSession.Streams(); + + CMceVideoStream* recordingStream = NULL; + + for ( TInt i = 0; i < streams.Count(); ++i ) + { + if ( streams[i]->Type() == KMceVideo ) + { + if ( MusEngMceUtils::GetMediaSink( *streams[i], KMceFileSink ) ) + { + recordingStream = static_cast( streams[i] ); + } + } + } + + MUS_LOG( "mus: [ENGINE] <- MusEngMceUtils::GetRecordingStreamL()" ) + + return recordingStream; + } + + +// ----------------------------------------------------------------------------- +// Gets handle to a media sink of spesified type contained by a mediastream. +// ----------------------------------------------------------------------------- +// +CMceMediaSink* MusEngMceUtils::GetMediaSink( CMceMediaStream& aStream, + TMceSinkType aType, + TMceSourceType aAssociatedSourceType ) + { + const RPointerArray& sinks = aStream.Sinks(); + for ( TInt i = 0; i < sinks.Count(); ++i ) + { + if ( sinks[i]->Type() == aType && + ( aAssociatedSourceType == KMusEngNoAssociatedSourceType || + aStream.Source()->Type() == aAssociatedSourceType ) ) + { + return sinks[i]; + } + } + + return NULL; + } + + +// ----------------------------------------------------------------------------- +// Gets handle to a media sink of spesified type contained by a mediastream. +// ----------------------------------------------------------------------------- +// +CMceMediaSink* MusEngMceUtils::GetMediaSinkL( CMceMediaStream& aStream, + TMceSinkType aType, + TMceSourceType aAssociatedSourceType ) + { + + CMceMediaSink* sink = MusEngMceUtils::GetMediaSink( aStream, aType, aAssociatedSourceType ); + + __ASSERT_ALWAYS( sink, User::Leave( KErrNotFound ) ); + + return sink; + } + + +// ----------------------------------------------------------------------------- +// Gets handle to a media sink of spesified type contained by a session. +// ----------------------------------------------------------------------------- +// +CMceMediaSink* MusEngMceUtils::GetMediaSink( CMceSession& aSession, + TMceSinkType aType, + TMceSourceType aAssociatedSourceType, + TBool aStrictMatch ) + { + CMceMediaSink* sink = NULL; + + TRAP_IGNORE( sink = MusEngMceUtils::GetMediaSinkL( + aSession, aType, aAssociatedSourceType, aStrictMatch ) ) + + return sink; + } + + +// ----------------------------------------------------------------------------- +// Gets handle to a media sink of spesified type contained by a session. +// ----------------------------------------------------------------------------- +// +CMceMediaSink* MusEngMceUtils::GetMediaSinkL( CMceSession& aSession, + TMceSinkType aType, + TMceSourceType aAssociatedSourceType, + TBool aStrictMatch ) + { + CMceMediaSink* sink = NULL; + + const RPointerArray& streams = aSession.Streams(); + + for ( TInt i = 0; i < streams.Count(); ++i ) + { + sink = MusEngMceUtils::GetMediaSink( *streams[i], aType, aAssociatedSourceType ); + if ( sink ) + { + return sink; + } + + if ( streams[i]->BoundStream() ) + { + sink = MusEngMceUtils::GetMediaSink( streams[i]->BoundStreamL(), + aType, + aAssociatedSourceType ); + if ( sink ) + { + return sink; + } + } + } + + if ( !sink && aAssociatedSourceType != KMusEngNoAssociatedSourceType && !aStrictMatch ) + { + // No preferred match, try without source preference + sink = GetMediaSinkL( aSession, aType ); + } + + __ASSERT_ALWAYS( sink, User::Leave( KErrNotFound ) ); + + return sink; + } + + +// ----------------------------------------------------------------------------- +// Gets handle to a speaker sink contained by specified stream or bound stream. +// ----------------------------------------------------------------------------- +// +CMceSpeakerSink* MusEngMceUtils::GetSpeaker( CMceMediaStream& aStream ) + { + MUS_LOG( "mus: [ENGINE] -> MusEngMceUtils::GetSpeaker()" ) + + CMceSpeakerSink* speaker = NULL; + + if ( aStream.Type() == KMceAudio ) + { + speaker = static_cast( + MusEngMceUtils::GetMediaSink( aStream, KMceSpeakerSink ) ); + + if ( !speaker && aStream.BoundStream() ) + { + CMceMediaStream* boundStream = NULL; + TRAPD( error, boundStream = &aStream.BoundStreamL() ) + + if ( error == KErrNone ) + { + speaker = static_cast( + MusEngMceUtils::GetMediaSink( *boundStream, + KMceSpeakerSink ) ); + } + } + } + + MUS_LOG( "mus: [ENGINE] <- MusEngMceUtils::GetSpeaker()" ) + + return speaker; + } + + +// ----------------------------------------------------------------------------- +// Gets handle to a camera source. +// ----------------------------------------------------------------------------- +// +CMceCameraSource* MusEngMceUtils::GetCameraL( CMceSession& aSession ) + { + // Camera can be only in out stream + MUS_LOG( "mus: [ENGINE] -> MusEngMceUtils::GetCameraL()" ) + + CMceVideoStream* videoOut = MusEngMceUtils::GetVideoOutStreamL( aSession ); + + if ( !( videoOut->Source() && + videoOut->Source()->Type() == KMceCameraSource ) ) + { + User::Leave( KErrNotFound ); + } + + MUS_LOG( "mus: [ENGINE] <- MusEngMceUtils::GetCameraL()" ) + return static_cast( videoOut->Source() ); + } + + +// ----------------------------------------------------------------------------- +// Gets handle to a file source. +// ----------------------------------------------------------------------------- +// +CMceFileSource* MusEngMceUtils::GetFileSourceL( CMceSession& aSession ) + { + MUS_LOG( "mus: [ENGINE] -> MusEngMceUtils::GetFileSourceL()" ) + + CMceVideoStream* videoOut = MusEngMceUtils::GetVideoOutStreamL( aSession ); + + if ( !( videoOut->Source() && + videoOut->Source()->Type() == KMceFileSource ) ) + { + User::Leave( KErrNotFound ); + } + + MUS_LOG( "mus: [ENGINE] <- MusEngMceUtils::GetFileSourceL()" ) + return static_cast( videoOut->Source() ); + } + + +// ----------------------------------------------------------------------------- +// Gets handle to a display sink. +// ----------------------------------------------------------------------------- +// +CMceDisplaySink* MusEngMceUtils::GetDisplay( + CMceSession& aSession, TBool aPreferViewFinder ) + { + MUS_LOG( "mus: [ENGINE] -> MusEngMceUtils::GetDisplay()" ) + MUS_LOG( "mus: [ENGINE] <- MusEngMceUtils::GetDisplay()" ) + TMceSourceType preferredSource = + aPreferViewFinder ? KMceCameraSource : KMusEngNoAssociatedSourceType; + return static_cast( + MusEngMceUtils::GetMediaSink( aSession, KMceDisplaySink, preferredSource ) ); + + } + + +// ----------------------------------------------------------------------------- +// Gets handle to a display sink. +// ----------------------------------------------------------------------------- +// +CMceDisplaySink* MusEngMceUtils::GetDisplayL( + CMceSession& aSession, TBool aPreferViewFinder ) + { + MUS_LOG( "mus: [ENGINE] -> MusEngMceUtils::GetDisplayL()" ) + + CMceDisplaySink* display = MusEngMceUtils::GetDisplay( aSession, aPreferViewFinder ); + + __ASSERT_ALWAYS( display, User::Leave( KErrNotFound ) ); + + MUS_LOG( "mus: [ENGINE] <- MusEngMceUtils::GetDisplayL()" ) + return display; + } + +// ----------------------------------------------------------------------------- +// Gets handle to a display sink displaying received video. +// ----------------------------------------------------------------------------- +// +CMceDisplaySink* MusEngMceUtils::GetReceivingDisplay( CMceSession& aSession ) + { + MUS_LOG( "mus: [ENGINE] -> MusEngMceUtils::GetReceivingDisplay()" ) + MUS_LOG( "mus: [ENGINE] <- MusEngMceUtils::GetReceivingDisplay()" ) + + // Search display which is connected with rtp source + TMceSourceType preferredSource = KMceRTPSource; + return static_cast( MusEngMceUtils::GetMediaSink( + aSession, KMceDisplaySink, preferredSource, ETrue ) ); + } + +// ----------------------------------------------------------------------------- +// Gets handle to a display sink displaying received video. +// ----------------------------------------------------------------------------- +// +CMceDisplaySink* MusEngMceUtils::GetReceivingDisplayL( CMceSession& aSession ) + { + MUS_LOG( "mus: [ENGINE] -> MusEngMceUtils::GetReceivingDisplayL()" ) + + CMceDisplaySink* display = GetReceivingDisplay( aSession ); + __ASSERT_ALWAYS( display != NULL, User::Leave( KErrNotFound ) ); + + MUS_LOG( "mus: [ENGINE] <- MusEngMceUtils::GetReceivingDisplay()" ) + + return display; + } + +// ----------------------------------------------------------------------------- +// Gets handle to a display sink displaying viewfinder content. +// ----------------------------------------------------------------------------- +// +CMceDisplaySink* MusEngMceUtils::GetVfDisplay( CMceSession& aSession ) + { + MUS_LOG( "mus: [ENGINE] -> MusEngMceUtils::GetVfDisplay()" ) + MUS_LOG( "mus: [ENGINE] <- MusEngMceUtils::GetVfDisplay()" ) + + // Search display which is connected with camera + TMceSourceType preferredSource = KMceCameraSource; + return static_cast( MusEngMceUtils::GetMediaSink( + aSession, KMceDisplaySink, preferredSource, ETrue ) ); + } + +// ----------------------------------------------------------------------------- +// Adds display sink to specified stream if one does not exist already. +// Display rect is set in both cases. +// ----------------------------------------------------------------------------- +// +void MusEngMceUtils::AddDisplayL( CMceMediaStream& aStream, + CMceManager& aManager, + const TRect& aDisplayRect ) + { + MUS_LOG( "mus: [ENGINE] -> MusEngMceUtils::AddDisplayL()" ) + + __ASSERT_ALWAYS( aStream.Type() == KMceVideo, User::Leave( KErrArgument ) ); + + CMceDisplaySink* display = static_cast( + MusEngMceUtils::GetMediaSink( + aStream, + KMceDisplaySink ) ); + + if ( !display ) + { + display = CMceDisplaySink::NewLC( aManager ); + aStream.AddSinkL( display ); + CleanupStack::Pop( display ); + } + + display->SetDisplayRectL( aDisplayRect ); + + MUS_LOG( "mus: [ENGINE] <- MusEngMceUtils::AddDisplayL()" ) + } + + +// ----------------------------------------------------------------------------- +// Adds display sink to specified stream if one does not exist already. +// ----------------------------------------------------------------------------- +// +void MusEngMceUtils::AddSpeakerL( CMceMediaStream& aStream ) + { + MUS_LOG( "mus: [ENGINE] -> MusEngMceUtils::AddSpeakerL()" ) + + __ASSERT_ALWAYS( aStream.Type() == KMceAudio, User::Leave( KErrArgument ) ); + + CMceSpeakerSink* speaker = static_cast( + MusEngMceUtils::GetMediaSink( + aStream, + KMceSpeakerSink ) ); + + if ( !speaker ) + { + speaker = CMceSpeakerSink::NewLC(); + aStream.AddSinkL( speaker ); + CleanupStack::Pop( speaker ); + } + + MUS_LOG( "mus: [ENGINE] <- MusEngMceUtils::AddSpeakerL()" ) + } + + +// ----------------------------------------------------------------------------- +// Disables parameter stream, its' source and all the sinks. +// ----------------------------------------------------------------------------- +// +void MusEngMceUtils::DisableStreamL( CMceMediaStream& aStream ) + { + MUS_LOG( "mus: [ENGINE] -> MusEngMceUtils::DisableStreamL()" ) + + aStream.DisableL(); + + if ( aStream.Source() ) + { + aStream.Source()->DisableL(); + } + + for ( TInt sinkIndex = 0; sinkIndex < aStream.Sinks().Count(); ++sinkIndex ) + { + aStream.Sinks()[ sinkIndex ]->DisableL(); + } + + MUS_LOG( "mus: [ENGINE] -> MusEngMceUtils::DisableStreamL()" ) + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void MusEngMceUtils::DoEnableDisplayL( CMceDisplaySink& aDisplay, TBool aEnable ) + { + MUS_LOG1( "mus: [ENGINE] -> MusEngMceUtils::DoEnableDisplayL() %d", + aEnable ) + + if ( aEnable ) + { + if ( !aDisplay.IsEnabled() ) + { + aDisplay.EnableL(); + MUS_LOG( " Display enabled" ) + } + else + { + MUS_LOG( " Display already enabled, ignore" ) + } + } + else + { + if ( aDisplay.IsEnabled() ) + { + aDisplay.DisableL(); + MUS_LOG( " Display disabled" ) + } + else + { + MUS_LOG( " Display already disabled, ignore" ) + } + } + + MUS_LOG( "mus: [ENGINE] <- MusEngMceUtils::DoEnableDisplayL()") + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TInt MusEngMceUtils::EnableInactivityTimer( + CMceSession& aSession, + TUint32 aInactivityTimeout ) + { + TInt err( KErrNotFound ); + CMceVideoStream* stream = NULL; + TRAP_IGNORE( stream = MusEngMceUtils::GetVideoInStreamL( aSession ) ) + if ( stream ) + { + // Instream has always RTP source + err = KErrNone; + CMceRtpSource* rtpSource = static_cast( stream->Source() ); + TRAP( err, rtpSource->EnableInactivityTimerL( aInactivityTimeout ) ) + } + + return err; + } + +// End of file