--- /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<MDataSource*>( self );
+ }
+
+// -----------------------------------------------------------------------------
+// CMccFileSource::ConstructSourceL
+// -----------------------------------------------------------------------------
+//
+void CMccFileSource::ConstructSourceL( const TDesC8& aInitData )
+ {
+ iSourceImpl = CMccFileSourceImpl::NewL(
+ MCC_ENDPOINT_ID( static_cast<MDataSource*>( this ) ) );
+
+ TPckgBuf<TFileName> 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<TInt>
+ User::Leave( KErrNotSupported );
+ }
+ else
+ {
+ TMccFileSourceSetting& settings =
+ reinterpret_cast<TMccFileSourceSettingBuf&>( 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<TInt>
+ User::Leave( KErrNotSupported );
+ }
+ else if ( aParam == KMccPrerollTime )
+ {
+ __ASSERT_ALWAYS(iSourceImpl, User::Leave(KErrNotReady));
+ const TPckgBuf<TInt> *packageBuffer =
+ reinterpret_cast<const TPckgBuf<TInt>* >(&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<const TMccFileSourceSettingBuf&>( 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" )
+ }
+
+