diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccfilesourcesink/src/mccfilesource.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmccfilesourcesink/src/mccfilesource.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,599 @@ +/* +* 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 "mccfilesource.h" +#include "mccfilesourceimpl.h" +#include "mmcccodecinformation.h" +#include "mmccinterfacedef.h" +#include "mccfilesourcelogs.h" +#include "mccinternaldef.h" + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMccFileSource::NewSourceL +// ----------------------------------------------------------------------------- +// +MDataSource* CMccFileSource::NewSourceL( TUid /*aImplementationUid*/, + const TDesC8& /*aInitData*/ ) + { + CMccFileSource* self = new ( ELeave ) CMccFileSource(); + return static_cast( self ); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::ConstructSourceL +// ----------------------------------------------------------------------------- +// +void CMccFileSource::ConstructSourceL( const TDesC8& aInitData ) + { + iSourceImpl = CMccFileSourceImpl::NewL( + MCC_ENDPOINT_ID( static_cast( this ) ) ); + + TPckgBuf initData; + initData.Copy( aInitData ); + + OpenFileL( initData() ); + } + +// ----------------------------------------------------------------------------- +// Constructor. +// ----------------------------------------------------------------------------- +// +CMccFileSource::CMccFileSource (): + CMccDataSource( KMccFileSourceUid ) + { + } + +// ----------------------------------------------------------------------------- +// Destructor. +// ----------------------------------------------------------------------------- +// +CMccFileSource::~CMccFileSource () + { + delete iSourceImpl; + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::GetParameterL +// ----------------------------------------------------------------------------- +// +void CMccFileSource::GetParameterL( TUint32 aParam, TDes8& aVal ) + { + if ( aParam == KMccFileFastForward ) + { + // aVal is TPckgBuf + User::Leave( KErrNotSupported ); + } + else + { + TMccFileSourceSetting& settings = + reinterpret_cast( aVal )(); + + switch ( aParam ) + { + case KMccFileInfo: + { + // Read all available values + GetFileInfoL( settings ); + break; + } + case KMccFileName: + { + settings.iFileName = FileNameL(); + break; + } + case KMccFileDuration: + { + settings.iDuration = DurationL(); + break; + } + case KMccFilePosition: + { + settings.iPosition = PositionL(); + break; + } + case KMccFileVideoFrameRate: + { + settings.iVideoFrameRate = VideoFrameRateL(); + break; + } + case KMccFileVideoBitRate: + { + settings.iVideoBitRate = VideoBitRateL(); + break; + } + case KMccFileVideoFrameSize: + { + settings.iVideoFrameSize = VideoFrameSizeL(); + break; + } + case KMccFileAudioBitRate: + { + settings.iAudioBitRate = AudioBitRateL(); + break; + } + case KMccFileAudioFourCC: + { + settings.iAudioFourCC = AudioFourCCL(); + break; + } + case KMccFileVideoFourCC: + { + settings.iVideoFourCC = VideoFourCCL(); + break; + } + case KMccConfigKey: + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + iSourceImpl->GetConfigKeyL( aVal ); + break; + } + default: + { + User::Leave( KErrArgument ); + break; + } + } + } + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::SetParameterL +// ----------------------------------------------------------------------------- +// +void CMccFileSource::SetParameterL( TUint32 aParam, const TDesC8& aVal ) + { + if ( aParam == KMccFileFastForward ) + { + // aVal is TPckgBuf + User::Leave( KErrNotSupported ); + } + else if ( aParam == KMccPrerollTime ) + { + __ASSERT_ALWAYS(iSourceImpl, User::Leave(KErrNotReady)); + const TPckgBuf *packageBuffer = + reinterpret_cast* >(&aVal); + __ASSERT_DEBUG( packageBuffer != NULL, + User::Panic(_L("CMccFileSource::SetParameterL: casting packageBuffer failed"), + KErrArgument) ); + __ASSERT_ALWAYS( packageBuffer != NULL, User::Leave(KErrArgument) ); + TInt preroll = (*packageBuffer)(); + iSourceImpl->SetDelayAfterStop(preroll); + } + else + { + const TMccFileSourceSetting& settings = + reinterpret_cast( aVal )(); + + switch ( aParam ) + { + case KMccFileName: + { + OpenFileL( settings.iFileName, ETrue ); + break; + } + case KMccFilePosition: + { + SetPositionL( settings.iPosition ); + break; + } + case KMccFileVideoFrameRate: + case KMccFileVideoBitRate: + case KMccFileVideoFrameSize: + case KMccFileAudioBitRate: + case KMccFileDuration: + case KMccFileInfo: + case KMccFileAudioFourCC: + case KMccFileVideoFourCC: + default: + { + User::Leave( KErrArgument ); + break; + } + } + } + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::OpenFileL(TFileName aFileName) +// +// Opens a 3gp file for streaming and reads media descriptions into +// member variables +// ----------------------------------------------------------------------------- +// +void CMccFileSource::OpenFileL( TFileName aFileName, TBool aFileChangeMode ) + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + iSourceImpl->OpenFileL( aFileName, aFileChangeMode ); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::CloseFileL() +// +// Closes the 3gp file +// ----------------------------------------------------------------------------- +// +void CMccFileSource::CloseFileL() + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + iSourceImpl->CloseFileL(); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::FileNameL() +// +// Gets filename +// ----------------------------------------------------------------------------- +// +TFileName& CMccFileSource::FileNameL() + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + return iSourceImpl->FileNameL(); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::SetPositionL(TTimeIntervalMicroSeconds aPosition) +// +// Sets a new streaming position +// ----------------------------------------------------------------------------- +// +void CMccFileSource::SetPositionL( TTimeIntervalMicroSeconds aPosition ) + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + iSourceImpl->SetPositionL( aPosition ); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::VideoFrameRateL() +// +// Returns current video frame rate +// ----------------------------------------------------------------------------- +// +TReal CMccFileSource::VideoFrameRateL() + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + return iSourceImpl->VideoFrameRateL(); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::AudioBitRateL() +// +// Returns current audio bit rate +// ----------------------------------------------------------------------------- +// +TUint32 CMccFileSource::AudioBitRateL() + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + return iSourceImpl->AudioBitRateL(); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::DurationL() +// +// Returns duration of current media clip +// ----------------------------------------------------------------------------- +// +TTimeIntervalMicroSeconds CMccFileSource::DurationL() + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + return iSourceImpl->DurationL(); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::VideoFrameSizeL() +// +// Returns current video frame size +// ----------------------------------------------------------------------------- +// +TSize CMccFileSource::VideoFrameSizeL() + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + return iSourceImpl->VideoFrameSizeL(); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::VideoBitRateL() +// +// Returns current video bitrate +// ----------------------------------------------------------------------------- +// +TUint32 CMccFileSource::VideoBitRateL() + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + return iSourceImpl->VideoBitRateL(); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::PositionL() +// +// Returns current streaming position +// ----------------------------------------------------------------------------- +// +TTimeIntervalMicroSeconds CMccFileSource::PositionL() + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + return iSourceImpl->PositionL(); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::AudioFourCCL() +// +// Returns audio fourcc (zero if audio not present) +// ----------------------------------------------------------------------------- +// +TFourCC CMccFileSource::AudioFourCCL() + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + return iSourceImpl->AudioFourCCL(); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::VideoFourCCL() +// +// Returns video fourcc (zero if video not present) +// ----------------------------------------------------------------------------- +// +TFourCC CMccFileSource::VideoFourCCL() + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + return iSourceImpl->VideoFourCCL(); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::PlayL() +// +// Starts streaming from 3gp file +// ----------------------------------------------------------------------------- +// +void CMccFileSource::SourcePlayL() + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + iSourceImpl->SourcePlayL(); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::PauseL() +// +// Pauses streaming by cancelling timers +// ----------------------------------------------------------------------------- +// +void CMccFileSource::SourcePauseL() + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + iSourceImpl->SourcePauseL(); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::StopL() +// +// Stops streaming +// ----------------------------------------------------------------------------- +// +void CMccFileSource::SourceStopL() + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + iSourceImpl->SourceStopL(); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::SourceDataTypeCode() +// ----------------------------------------------------------------------------- +// +TFourCC CMccFileSource::SourceDataTypeCode( TMediaId aMediaId ) + { + if ( iSourceImpl ) + { + return iSourceImpl->SourceDataTypeCode( aMediaId ); + } + else + { + __FILESOURCE_CONTROLL( "CMccFileSource::SourceDataTypeCode,\ +iSourceImpl= NULL" ) + return TFourCC(); + } + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::SetSourceDataTypeCode() +// ----------------------------------------------------------------------------- +// +TInt CMccFileSource::SetSourceDataTypeCode( TFourCC aCodec, + TMediaId aMediaId ) + { + if ( iSourceImpl ) + { + return iSourceImpl->SetSourceDataTypeCode( aCodec, aMediaId ); + } + else + { + __FILESOURCE_CONTROLL( "CMccFileSource::SetSourceDataTypeCode,\ +iSourceImpl= NULL" ) + + return KErrNotFound; + } + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::BufferEmptiedL() +// ----------------------------------------------------------------------------- +// +void CMccFileSource::BufferEmptiedL( CMMFBuffer* /*aBuffer*/ ) + { + __FILESOURCE_CONTROLL( "CMccFileSource::BufferEmptiedL" ) + + __ASSERT_ALWAYS( EFalse, User::Leave( KErrNotSupported ) ); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::CanCreateSourceBuffer() +// ----------------------------------------------------------------------------- +// +TBool CMccFileSource::CanCreateSourceBuffer() + { + __FILESOURCE_CONTROLL( "CMccFileSource::CanCreateSourceBuffer" ) + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::CreateSourceBufferL() +// ----------------------------------------------------------------------------- +// +CMMFBuffer* CMccFileSource::CreateSourceBufferL( + TMediaId /*aMediaId*/, + TBool& /*aReference*/ ) + { + __FILESOURCE_CONTROLL( "CMccFileSource::CreateSourceBufferL" ) + + CMMFBuffer* buffer = NULL; + + __ASSERT_ALWAYS( EFalse, User::Leave( KErrNotSupported ) ); + + return buffer; + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::SourceThreadLogon() +// ----------------------------------------------------------------------------- +// +TInt CMccFileSource::SourceThreadLogon( MAsyncEventHandler& aEventHandler ) + { + __FILESOURCE_CONTROLL( "CMccFileSource::SourceThreadLogon" ) + + if ( iSourceImpl ) + { + return iSourceImpl->SourceThreadLogon( aEventHandler ); + } + else + { + __FILESOURCE_CONTROLL( "CMccFileSource::SourceThreadLogon, \ +iSourceImpl=NULL" ) + + return KErrNotFound; + } + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::SourceThreadLogoff() +// ----------------------------------------------------------------------------- +// +void CMccFileSource::SourceThreadLogoff() + { + __FILESOURCE_CONTROLL( "CMccFileSource::SourceThreadLogoff" ) + if ( iSourceImpl ) + { + iSourceImpl->SourceThreadLogoff(); + TRAP_IGNORE( iSourceImpl->SourceStopL() ); + } + else + { + __FILESOURCE_CONTROLL( "CMccFileSource::SourceThreadLogoff, \ +iSourceImpl=NULL" ) + } + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::SourcePrimeL() +// ----------------------------------------------------------------------------- +// +void CMccFileSource::SourcePrimeL() + { + __FILESOURCE_CONTROLL( "CMccFileSource::SourcePrimeL" ) + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + iSourceImpl->SourcePrimeL(); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::FillBufferL() +// ----------------------------------------------------------------------------- +// +void CMccFileSource::FillBufferL( + CMMFBuffer* aBuffer, + MDataSink* aConsumer, + TMediaId aMediaId ) + { + __ASSERT_ALWAYS( iSourceImpl, User::Leave( KErrArgument ) ); + + iSourceImpl->FillBufferL( aBuffer, aConsumer, aMediaId ); + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::NegotiateSourceL() +// ----------------------------------------------------------------------------- +// +void CMccFileSource::NegotiateSourceL( MDataSink& /*aDataSink*/ ) + { + __FILESOURCE_CONTROLL( "CMccFileSource::NegotiateSourceL" ) + } + +// ----------------------------------------------------------------------------- +// CMccFileSource::GetFileInfoL() +// ----------------------------------------------------------------------------- +// +void CMccFileSource::GetFileInfoL( TMccFileSourceSetting& aSettings ) + { + aSettings.iFileName = FileNameL(); + aSettings.iDuration = DurationL(); + aSettings.iPosition = PositionL(); + aSettings.iVideoFrameRate = VideoFrameRateL(); + aSettings.iVideoBitRate = VideoBitRateL(); + aSettings.iVideoFrameSize = VideoFrameSizeL(); + aSettings.iAudioBitRate = AudioBitRateL(); + aSettings.iAudioFourCC = AudioFourCCL(); + aSettings.iVideoFourCC = VideoFourCCL(); + + __FILESOURCE_CONTROLL( "CMccFileSource::GetFileInfoL, file:" ) + #ifdef __MCC_FILESOURCE_CONTROLL + TMccLog::Print( KFileSource, aSettings.iFileName ); + #endif + __FILESOURCE_CONTROLL_INT1( "duration:", aSettings.iDuration.Int64() ) + __FILESOURCE_CONTROLL_INT1( "position:", aSettings.iPosition.Int64() ) + __FILESOURCE_CONTROLL_INT1( "videoframerate:", (TInt) aSettings.iVideoFrameRate ) + __FILESOURCE_CONTROLL_INT1( "videobitrate:", aSettings.iVideoBitRate ) + __FILESOURCE_CONTROLL_INT2( "videoframesize width:", + aSettings.iVideoFrameSize.iWidth, + " height:", + aSettings.iVideoFrameSize.iHeight ) + __FILESOURCE_CONTROLL_INT1( "audiobitrate:", aSettings.iAudioBitRate ) + __FILESOURCE_CONTROLL_INT1( "audio fourcc:", aSettings.iAudioFourCC.FourCC() ) + __FILESOURCE_CONTROLL_INT1( "video fourcc:", aSettings.iVideoFourCC.FourCC() ) + __FILESOURCE_CONTROLL( "CMccFileSource::GetFileInfoL, exit" ) + } + +