diff -r 000000000000 -r f0cf47e981f9 mmsharing/mmshengine/inc/musengclipsession.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmsharing/mmshengine/inc/musengclipsession.h Thu Dec 17 08:44:37 2009 +0200 @@ -0,0 +1,255 @@ +/* +* Copyright (c) 2005 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: +* +*/ + + +#ifndef MUSHENGCLIPSESSION_H +#define MUSHENGCLIPSESSION_H + +// USER +#include "musengmceoutsession.h" +#include "musunittesting.h" + + +class MMusEngClipSessionObserver; +class CMusEngLiveSession; +class CMceFileSource; +class CMceAudioStream; +class CMceVideoStream; +class CMceAudioCodec; + + +class CMusEngClipSession : public CMusEngMceOutSession + { + MUS_UNITTEST( UT_CMusEngClipSession ) + + public: + + /** + * + */ + IMPORT_C static CMusEngClipSession* NewL( + const TRect& aRect, + MMusEngSessionObserver& aSessionObserver, + MMusEngOutSessionObserver& aOutSessionObserver, + MMusEngClipSessionObserver& aClipSessionObserver, + TUint aSipProfileId = 0 ); + + /** + * + */ + ~CMusEngClipSession(); + + + public: // new API + + /** + * Sets file to be shared during session. + * @pre File cannot be DRM protected + * @post InviteL can be called + * @leave One of the system wide error codes + * @param aFileName Name of the file to be shared + */ + IMPORT_C void SetClipL( const TDesC& aFileName ); + + /** + * Starts or stops fast forwarding the clip. Clip is left paused after + * stopping the fast forwarding. + * @pre Session is ongoing + * @param aUseFFWD ETrue to start FFWD, EFalse to stop it. + */ + IMPORT_C void FastForwardL( TBool aUseFFWD ); + + /** + * Starts or stops fast rewinding the clip. Clip is left paused after + * stopping the fast rewinding. + * @pre Session is ongoing + * @param aUseFRWD ETrue to start FRWD, EFalse to stop it. + */ + IMPORT_C void FastRewindL( TBool aUseFRWD ); + + /** + * Returns current position as time interval. + */ + IMPORT_C TTimeIntervalSeconds PositionL(); + + /** + * Returns duration of current clip as time interval + */ + IMPORT_C TTimeIntervalSeconds DurationL(); + + /** + * + */ + IMPORT_C void SetPositionL (const TTimeIntervalSeconds &aPosition); + + /** + * Starts transcoding of file. After the transcoding is complete, + * file to be shared is changed into the transcoded file. + * @pre MMusEngClipSessionObserver::TranscodingNeeded is called + * @param aFileName Name of the transcoding output file. + */ + IMPORT_C void TranscodeL( const TFileName& aFileName ); + + /** + * Cancels transcoding of file. + * @pre TranscodeL has been called succesfully and transcoding + * is not completed + */ + IMPORT_C void CancelTranscodeL(); + + + public: // implementation of virtual API from CMusEngMceOutSession + + /** + * Resumes previously paused session. + * Continues showing file on display, resumes clip's audio, continues + * playing file and enables streaming to network. + * @leave KErrNotReady if called during FFWD or FRWD + */ + IMPORT_C void PlayL(); + + /** + * Pauses session. + * Holds display, mutes clip's audio, pauses file and + * disables all streaming to network. + * @leave KErrNotReady if called during FFWD or FRWD + */ + IMPORT_C void PauseL(); + + /** + * Tells whether session is paused or not + */ + IMPORT_C TBool IsPlayingL(); + + + protected: // implementation of virtual helper from CMusEngMceOutSession + + /** + * @param aLocalBundle All local streams are supposed to be added to + * this bundle + */ + void CompleteSessionStructureL( CMceStreamBundle& aLocalBundle ); + + + protected: // overrides function from CMusEngMceOutSession + + /** + * Checks that there is no need for transcoding before calling + * overridden base class variant of this function. + */ + void EstablishSessionL(); + + + private: // from MMceStreamObserver, + // overrides the function in CMusEngMceSession + + /** + * The state of the stream has changed. + * + * @param aStream, the stream that has changed. + */ + void StreamStateChanged( CMceMediaStream& aStream ); + + /** + * The state of the source has changed. + * @param aStream, the stream that uses the source. + * @param aSource, the source that has changed. + */ + void StreamStateChanged( CMceMediaStream& aStream, + CMceMediaSource& aSource ); + + private: + + /** + * + */ + CMusEngClipSession( MMusEngSessionObserver& aSessionObserver, + MMusEngOutSessionObserver& aOutSessionObserver, + MMusEngClipSessionObserver& aClipSessionObserver, + const TRect& aRect ); + + /** + * @leave KErrPermissionDenied if file is DRM protected + */ + void ConstructL( TUint aSipProfileId ); + + + private: // HELPERS + + /** + * + */ + TBool IsProtectedFileL( const TDesC& aClipFile ); + + void AddAmrCodecL( CMceAudioStream& aAudioStream ); + + void AddVideoCodecL( CMceVideoStream& aVideoStream ); + + TBool HasClipEnded(); + + /** + * Returns current position as microseconds. + * @param aActualPosition ETrue if actual position is wanted, EFalse + * if buffering time is taken in count. + */ + TTimeIntervalMicroSeconds PositionMicroSecondsL( TBool aActualPosition = EFalse ); + + /** + * Constructs audio stream structure during session completion and adds + * it to session. + * @param aLocalBundle All local streams are supposed to be added to + * this bundle + * @pre iSession != NULL + */ + void ConstructAudioStructureL( CMceStreamBundle& aLocalBundle ); + + void DetermineBufferingPeriod( CMceMediaStream& aStream ); + + TTimeIntervalMicroSeconds GetVideoSinkRelativeFilePos( + const TTimeIntervalMicroSeconds& aActualPosition, + const TTimeIntervalMicroSeconds& aDuration ); + + TBool IsH264Supported() const; + + private: // Data + + /** + * Reference to live session observer interface. + */ + MMusEngClipSessionObserver& iClipSessionObserver; + + TFileName iFileName; + + TBool iTranscodingOngoing; + + TTime iFFWDStartTime; + TTime iFRWDStartTime; + + TTime iBufferingStartedTime; + TTimeIntervalMicroSeconds iBufferingPeriod; + + TTimeIntervalMicroSeconds iDelayFileEndingPos; + TTimeIntervalMicroSeconds iPreviousPos; + TBool iClipEnded; + + TFileName iTranscodingDestFileName; + TBool iRewindedToBeginning; + + }; + +#endif +