multimediacommscontroller/mmccanypayloadformat/src/anypayloadformatread.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmccanypayloadformat/src/anypayloadformatread.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,676 @@
+/*
+* Copyright (c) 2002-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:    
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <mmf/common/mmffourcc.h>
+#include <mmf/server/mmfdatabuffer.h>
+#include "anypayloadformatread.h"
+#include "mccrtpdatasource.h"
+#include "mccinternaldef.h"
+#include "mccanyformatlogs.h"
+
+const TInt KNumValue4(4);
+const TInt KNumValue16(16);
+
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::CAnyPayloadFormatRead
+//
+// CAnyPayloadFormatRead default constructor, can NOT contain any code,
+// that might leave
+// Phase #1 of 2-phase constructor
+// -----------------------------------------------------------------------------
+//
+CAnyPayloadFormatRead::CAnyPayloadFormatRead ( )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CAnyPayloadFormatRead::ConstructL ( MDataSource* aSource )
+    {
+    __ANYFORMAT_CONTROLL( "CAnyPayloadFormatRead::ConstructL" )
+    __ASSERT_ALWAYS( aSource, User::Leave( KErrArgument ) );
+ 
+    iRtpDataSource = aSource;
+    iClip = aSource;
+	iFillRequested = EFalse;	
+	iBufferToReadExists = EFalse;
+    
+    // Initialize decoding state machine
+    iStateMachine = CFormatDecodeStateMachine::NewL( this );
+    iStateMachine->ChangeState( EDecodeIdle );
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::NewL
+//
+// Two-phased constructor.
+// Static function for creating and constructing an instance of 
+// the AMR-NB format.
+//
+// Returns:  CAnyPayloadFormatRead* : pointer to created instance
+// -----------------------------------------------------------------------------
+//
+CAnyPayloadFormatRead* CAnyPayloadFormatRead::NewL( 
+	MDataSource* aSource )
+    {
+    __ASSERT_ALWAYS( aSource, User::Leave( KErrArgument ) );
+
+    __ASSERT_ALWAYS( ( KMccRtpSourceUid == aSource->DataSourceType() ||
+                       KMccVideoSourceUid == aSource->DataSourceType() ||
+                       KMccMultiplexerUid == aSource->DataSourceType() ), 
+                     User::Leave( KErrArgument ) );
+	CAnyPayloadFormatRead* self =
+		new ( ELeave ) CAnyPayloadFormatRead;
+	CleanupStack::PushL ( self );
+    self->ConstructL ( aSource );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::~CAnyPayloadFormatRead
+//
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CAnyPayloadFormatRead::~CAnyPayloadFormatRead( )
+    {
+    delete iFrameBufferOne;
+    delete iFrameBufferTwo;
+    if ( iSourceBufOwnership )
+        {
+        delete iPayloadBuffer;
+        }
+    else
+        {
+        iPayloadBuffer = NULL;
+        }
+    
+    if ( iStateMachine )
+        {
+        iStateMachine->Cancel( );
+        delete iStateMachine;
+        }
+    iCurrentBuffer = NULL;
+    iRtpDataSource = NULL;
+    iClip = NULL;
+    iDataPath = NULL;
+    iEventHandler = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::Streams
+// Return number of audio streams for the given media
+// -----------------------------------------------------------------------------
+//
+TUint CAnyPayloadFormatRead::Streams( TUid /*aMediaType*/ ) const
+    {
+    return 1;
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::FrameTimeInterval
+// Return the frame time interval for the given media
+// -----------------------------------------------------------------------------
+//
+TTimeIntervalMicroSeconds CAnyPayloadFormatRead::FrameTimeInterval( 
+    TMediaId /*aMediaId*/ ) const
+    {
+    return TTimeIntervalMicroSeconds( TInt64( 0 ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::FillBufferL
+// Fill Buffer
+// -----------------------------------------------------------------------------
+//
+void CAnyPayloadFormatRead::FillBufferL( CMMFBuffer* aBuffer, 
+                                         MDataSink*  aConsumer, 
+                                         TMediaId    aMediaId )
+    {
+    __ANYFORMAT_MEDIA( "CAnyPayloadFormatRead::FillBufferL" )
+    
+    __ASSERT_ALWAYS( aBuffer, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( aBuffer->Type() == KUidMmfDataBuffer, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( aBuffer == iCurrentBuffer, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( aConsumer, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( iStateMachine, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( iFrameBufferOne, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( iFrameBufferTwo, User::Leave( KErrArgument ) );
+
+    iDataPath = aConsumer;
+    iMediaId = aMediaId;
+    iFillRequested = ETrue;
+
+	if ( iCurrentBuffer )
+		{
+		iCurrentBuffer->SetStatus( EAvailable );
+		iCurrentBuffer = NULL;		
+		}
+
+	if (iFrameBufferOne->Status() == EFull )
+		{
+		iCurrentBuffer = iFrameBufferOne;
+        iStateMachine->ChangeState( ESourceDataReady );				
+		}
+	else if (iFrameBufferTwo->Status() == EFull )
+		{
+		iCurrentBuffer = iFrameBufferTwo;
+        iStateMachine->ChangeState( ESourceDataReady );		
+		}
+    else
+        {
+        FillSourceBufferL();
+        } 
+    };
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::FillSinkBuffer
+// Read RTP payload and convert it into AMR frames.
+// -----------------------------------------------------------------------------
+//
+void CAnyPayloadFormatRead::FillSinkBufferL( )
+    {
+    __ANYFORMAT_MEDIA( "CAnyPayloadFormatRead::FillSinkBuffer" )
+   	__ASSERT_ALWAYS( iStateMachine, User::Leave( KErrArgument ) );
+   	__ASSERT_ALWAYS( iCurrentBuffer, User::Leave( KErrArgument ) );
+
+    iStateMachine->ChangeState( EEmptyDataToSink ); 
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::FillSourceBufferL
+// Send fill buffer request to RTP Data Soure
+// -----------------------------------------------------------------------------
+//
+void CAnyPayloadFormatRead::FillSourceBufferL( )
+    { 
+    __ASSERT_ALWAYS( iClip, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( iPayloadBuffer, User::Leave( KErrArgument ) );
+
+    iClip->FillBufferL(iPayloadBuffer, this, iMediaId );     
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::SendDataToSinkL
+// Send full frame buffer to Data Path
+// -----------------------------------------------------------------------------
+//
+void CAnyPayloadFormatRead::SendDataToSinkL( )
+    {
+    __ANYFORMAT_MEDIA( "CAnyPayloadFormatRead::SendDataToSinkL" )
+   	__ASSERT_ALWAYS( iDataPath, User::Leave( KErrArgument ) );
+   	__ASSERT_ALWAYS( iCurrentBuffer, User::Leave( KErrArgument ) );
+	
+    iDataPath->BufferFilledL( iCurrentBuffer );
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::CreateSourceBufferL
+// Create a source buffer for the given media and indicate in aReference if 
+// buffer is created.
+// -----------------------------------------------------------------------------
+//
+CMMFBuffer* CAnyPayloadFormatRead::CreateSourceBufferL( 
+    TMediaId /*aMediaId*/, 
+    TBool &aReference )
+    {
+    __ANYFORMAT_MEDIA( "CAnyPayloadFormatRead::CreateSourceBufferL" )
+    // the source buffers belong to AmrPayloadFormatRead not to datapath
+    // aference should be set to ETrue and destried by AmrPayloadFormatRead 
+    // itself.
+    aReference = ETrue;
+    iCurrentBuffer = iFrameBufferOne;
+    return iFrameBufferOne; 
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::CreateSourceBufferL
+// Create a source buffer for the given media, setting frame size to match
+// the given sink buffer
+// -----------------------------------------------------------------------------
+//
+CMMFBuffer* CAnyPayloadFormatRead::CreateSourceBufferL(
+    TMediaId aMediaId,
+    CMMFBuffer& /*aSinkBuffer*/, 
+    TBool &aReference )
+    {
+    __ANYFORMAT_MEDIA( "CAnyPayloadFormatRead::CreateSourceBufferL" )
+    return CreateSourceBufferL( aMediaId, aReference );
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::SourceDataTypeCode
+// Return the source data type ( four CC code ) for the given media
+// -----------------------------------------------------------------------------
+//
+TFourCC CAnyPayloadFormatRead::SourceDataTypeCode( 
+	TMediaId /*aMediaId*/ )
+    {
+    return iFourCC;
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::SetSourceDataTypeCode
+// Set the source data type to the given four CC code for the given 
+// media
+// -----------------------------------------------------------------------------
+//
+TInt CAnyPayloadFormatRead::SetSourceDataTypeCode( TFourCC aSourceFourCC, 
+    											   TMediaId aMediaId )
+    {
+    __ANYFORMAT_CONTROLL( "CAnyPayloadFormatRead::SetSourceDataTypeCode" )
+    
+    if( iClip )
+	    {
+		iFourCC = aSourceFourCC;
+		iMediaId = aMediaId;
+
+		iClip->SetSourceDataTypeCode( iFourCC, iMediaId );
+
+		return KErrNone;	
+	    }
+	else
+		{
+		return KErrArgument;	
+		}
+   
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::SourceThreadLogon
+// Log in to the source thread
+// -----------------------------------------------------------------------------
+//
+TInt CAnyPayloadFormatRead::SourceThreadLogon( 
+    MAsyncEventHandler& aEventHandler )
+    {
+    __ANYFORMAT_CONTROLL( "CAnyPayloadFormatRead::SourceThreadLogon" )
+    if ( iClip )
+	    {
+	    iEventHandler = &aEventHandler;
+	    iClip->SourceThreadLogon( aEventHandler );
+	    return KErrNone;	
+	    }
+	else
+		{
+		return KErrArgument;	
+		}   
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::NegotiateSourceL( MDataSink& aDataSink )
+// Negotiate source settings to match data sink object.
+// Re-size frame buffers if needed
+// -----------------------------------------------------------------------------
+//
+void CAnyPayloadFormatRead::NegotiateSourceL( MDataSink& /*aDataSink*/ )
+    {
+    __ANYFORMAT_CONTROLL( "CAnyPayloadFormatRead::NegotiateSourceL" )
+    __ASSERT_ALWAYS( iClip, User::Leave( KErrArgument ) );
+    iClip->NegotiateSourceL( *this );
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::SourceThreadLogoff
+// Log out of the source thread.
+// -----------------------------------------------------------------------------
+//
+void CAnyPayloadFormatRead::SourceThreadLogoff( )
+    {
+    __ANYFORMAT_CONTROLL( "CAnyPayloadFormatRead::SourceThreadLogoff" )
+    if ( iClip )
+	    {
+	    iClip->SourceThreadLogoff( );
+	    }
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::DataBufferFilledL
+// -----------------------------------------------------------------------------
+//
+void CAnyPayloadFormatRead::DataBufferFilledL( CMMFBuffer* aBuffer, 
+                                           const TRtpRecvHeader& aRtpHeader )
+    {
+    __ANYFORMAT_MEDIA( "CAnyPayloadFormatRead::DataBufferFilledL" )
+    __ANYFORMAT_MEDIA_INT1( "CAnyPayloadFormatRead::DataBufferFilledL iPadding:", aRtpHeader.iPadding )
+    __ANYFORMAT_MEDIA_INT1( "CAnyPayloadFormatRead::DataBufferFilledL iExtension:", aRtpHeader.iExtension )
+    __ANYFORMAT_MEDIA_INT1( "CAnyPayloadFormatRead::DataBufferFilledL iCsrcCount:", aRtpHeader.iCsrcCount )
+    __ANYFORMAT_MEDIA_INT1( "CAnyPayloadFormatRead::DataBufferFilledL iMarker:", aRtpHeader.iMarker )
+    __ANYFORMAT_MEDIA_INT1( "CAnyPayloadFormatRead::DataBufferFilledL iPayloadType:", aRtpHeader.iPayloadType )
+    __ANYFORMAT_MEDIA_INT1( "CAnyPayloadFormatRead::DataBufferFilledL iSeqNum:", aRtpHeader.iSeqNum )
+    __ANYFORMAT_MEDIA_INT1( "CAnyPayloadFormatRead::DataBufferFilledL iTimestamp:", aRtpHeader.iTimestamp );
+    __ANYFORMAT_MEDIA_INT1( "CAnyPayloadFormatRead::DataBufferFilledL iHeaderExtension:", (TInt)aRtpHeader.iHeaderExtension )
+    __ANYFORMAT_MEDIA_INT1( "CAnyPayloadFormatRead::DataBufferFilledL iCsrcList:", (TInt)aRtpHeader.iCsrcList )
+
+    __ASSERT_ALWAYS( aBuffer, User::Leave( KErrArgument ) );
+    
+    aBuffer->SetTimeToPlay( aRtpHeader.iTimestamp );
+    aBuffer->SetLastBuffer( aRtpHeader.iMarker );
+	aBuffer->SetFrameNumber( aRtpHeader.iSeqNum );
+		
+    BufferFilledL( aBuffer );
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::BufferFilledL
+// Called after the data buffer is filled. Update the number of bytes read
+// and the current read position for the next read operation.
+// -----------------------------------------------------------------------------
+//
+void CAnyPayloadFormatRead::BufferFilledL( CMMFBuffer* aBuffer )
+	{
+    __ANYFORMAT_MEDIA( "CAnyPayloadFormatRead::BufferFilledL2" )
+    __ASSERT_ALWAYS( aBuffer, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( aBuffer->Type() == KUidMmfDataBuffer, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( iPayloadBuffer == aBuffer , User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( iClip, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( iStateMachine, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( iFrameBufferOne , User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( iFrameBufferTwo , User::Leave( KErrArgument ) );
+
+    iPacketCount++;
+    
+    CMMFDataBuffer* dataBuffer = static_cast<CMMFDataBuffer*>( aBuffer );
+    
+    if ( dataBuffer->Data().Length() == 0 )
+        {
+        __ANYFORMAT_MEDIA( "CAnyPayloadFormatRead::BufferFilledL2, zero length payload" )
+        
+        // Drop buffer and ask for more
+        FillSourceBufferL();
+        }
+    else if ( iFrameBufferOne->Status() == EAvailable )
+        {
+	    iFrameBufferOne->Data().Copy( dataBuffer->Data() );
+	    iFrameBufferOne->SetTimeToPlay( aBuffer->TimeToPlay() );
+		iFrameBufferOne->SetLastBuffer( aBuffer->LastBuffer() );
+		iFrameBufferOne->SetFrameNumber( aBuffer->FrameNumber() );
+
+		iFrameBufferOne->SetStatus( EFull );
+
+        if (iFrameBufferTwo->Status() == EAvailable )
+        	{
+        	iCurrentBuffer = iFrameBufferOne;
+        	iStateMachine->ChangeState( ESourceDataReady );
+        	}
+        }
+    else if ( iFrameBufferTwo->Status() == EAvailable )
+        {
+	    iFrameBufferTwo->Data().Copy( dataBuffer->Data() );
+        iFrameBufferTwo->SetTimeToPlay( aBuffer->TimeToPlay() );
+		iFrameBufferTwo->SetLastBuffer( aBuffer->LastBuffer() );
+		iFrameBufferTwo->SetFrameNumber( aBuffer->FrameNumber() );
+		iFrameBufferTwo->SetStatus( EFull );
+		
+        if (iFrameBufferOne->Status() == EAvailable )
+	        {
+	        iCurrentBuffer = iFrameBufferTwo;   
+	       	iStateMachine->ChangeState( ESourceDataReady );    	
+	        }
+       	}
+    else
+        {
+        // Neither of the buffers is available
+        User::Leave( KErrNotReady );
+        }
+	}
+	
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::Duration
+// Return the clip duration for the given media.
+// -----------------------------------------------------------------------------
+//
+TTimeIntervalMicroSeconds CAnyPayloadFormatRead::Duration( 
+	TMediaId /*aMediaType*/ ) const
+    {
+    return TTimeIntervalMicroSeconds( TInt64( 0 ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::LastDlPacketCount
+// Return current packet count for current talk spurt
+// -----------------------------------------------------------------------------
+//
+TInt CAnyPayloadFormatRead::LastDlPacketCount( )
+    {
+    return iPacketCount;
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::CancelDlRequest( )
+// 
+// -----------------------------------------------------------------------------
+//
+void CAnyPayloadFormatRead::CancelDlRequest()
+    {
+    __ANYFORMAT_CONTROLL( "CAnyPayloadFormatRead::CancelDlRequest" )
+ 
+    if( iStateMachine && iFrameBufferOne && iFrameBufferTwo )
+	    {
+		iStateMachine->Cancel();
+	    iStateMachine->ChangeState( EDecodeIdle );
+	    
+	    iFrameBufferOne->SetLastBuffer( EFalse );
+	    iFrameBufferTwo->SetLastBuffer( EFalse );
+
+	    iFrameBufferOne->SetStatus( EAvailable );
+	    iFrameBufferTwo->SetStatus( EAvailable );
+
+	    iBufferToReadExists = EFalse;
+	    iFillRequested = EFalse;	
+	    }
+ 
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::SourcePrimeL()
+// 
+// -----------------------------------------------------------------------------
+//
+void CAnyPayloadFormatRead::SourcePrimeL()
+    {
+    __ANYFORMAT_CONTROLL( "CAnyPayloadFormatRead::SourcePrimeL" )
+    __ASSERT_ALWAYS( iClip, User::Leave( KErrArgument ) );
+    iClip->SourcePrimeL();
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::SourcePlayL()
+//
+// -----------------------------------------------------------------------------
+//
+void CAnyPayloadFormatRead::SourcePlayL()
+    {
+    __ANYFORMAT_CONTROLL( "CAnyPayloadFormatRead::SourcePlayL" )
+    __ASSERT_ALWAYS( iClip, User::Leave( KErrArgument ) );
+
+    iPacketCount = 0;    
+    iClip->SourcePlayL();
+    };
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::SourcePauseL()
+//
+// -----------------------------------------------------------------------------
+//
+void CAnyPayloadFormatRead::SourcePauseL()
+    {
+    __ANYFORMAT_CONTROLL( "CAnyPayloadFormatRead::SourcePauseL" )
+    __ASSERT_ALWAYS( iClip, User::Leave( KErrArgument ) );
+    this->CancelDlRequest();
+    iClip->SourcePauseL();
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::SourceStopL( )
+//
+// -----------------------------------------------------------------------------
+//
+void CAnyPayloadFormatRead::SourceStopL()
+    {
+    __ANYFORMAT_CONTROLL( "CAnyPayloadFormatRead::SourceStopL" )
+    __ASSERT_ALWAYS( iClip, User::Leave( KErrArgument ) );
+    this->CancelDlRequest();
+    iClip->SourceStopL();
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::SinkDataTypeCode()
+// Returns the datatype code for this Format Decoder
+// -----------------------------------------------------------------------------
+//
+TFourCC CAnyPayloadFormatRead::SinkDataTypeCode( TMediaId /*aMediaId*/ )
+    {
+    return iFourCC;
+    }
+   
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::ConfigurePayloadFormatL
+// Configure payload decoding parameters.
+// -----------------------------------------------------------------------------
+//
+void CAnyPayloadFormatRead::ConfigurePayloadFormatL( 
+	const TDesC8& aConfigParams )
+    {
+    __ANYFORMAT_CONTROLL( "CAnyPayloadFormatRead::ConfigurePayloadFormatL" )
+    
+    TMccCodecInfoBuffer infoBuffer;
+    infoBuffer.Copy( aConfigParams );
+    TMccCodecInfo cInfo = infoBuffer();
+    
+    if ( cInfo.iIsUpdate && cInfo.iFrameSize == iCInfo.iFrameSize )
+        {
+         __ANYFORMAT_CONTROLL( "CAnyPayloadFormatRead::ConfigurePayloadFormatL, nothing to configure" )
+        return;
+        } 
+    
+    TUint framesize;
+    if ( iMediaId.iMediaType == KUidMediaTypeVideo ) // for video
+        {
+        __ANYFORMAT_CONTROLL( "CAnyPayloadFormatRead::ConfigurePayloadFormatL, \
+iMediaId.iMediaType == KUidMediaTypeVideo" )
+
+        framesize = cInfo.iFrameSize * KNumValue4; 
+        }
+    else // for audio
+        {
+        if ( !cInfo.iMaxPtime )
+            {
+            framesize = cInfo.iFrameSize * KNumValue16;   
+            }
+        else
+            {
+            if( !cInfo.iHwFrameTime ) 
+                {
+                User::Leave( KErrArgument );
+                }
+            TUint framesPerPackets = cInfo.iMaxPtime / cInfo.iHwFrameTime;
+            framesize = cInfo.iFrameSize * framesPerPackets;    
+            }
+        }
+    
+    __ANYFORMAT_CONTROLL_INT1( "CAnyPayloadFormatRead, buffer size", framesize )
+  	if ( !iFrameBufferOne )
+	    {
+	    iFrameBufferOne = 
+	    	CMMFDataBuffer::NewL( framesize );
+	    iFrameBufferOne->SetStatus( EAvailable );
+	    }
+	    
+	if ( !iFrameBufferTwo )
+	    {
+	    iFrameBufferTwo =
+	    	CMMFDataBuffer::NewL( framesize );
+	    iFrameBufferTwo->SetStatus( EAvailable );
+	    }
+	    
+	if ( iPayloadBuffer && iSourceBufOwnership )	
+	    {
+	    delete iPayloadBuffer;
+	    iPayloadBuffer = NULL;
+	    }
+    
+    iPayloadBuffer 
+        = CreateClipBufferL( framesize, iSourceBufOwnership );
+    
+    iCurrentBuffer = NULL;
+    
+    iCInfo = cInfo;
+    }
+
+// -----------------------------------------------------------------------------
+// CAnyPayloadFormatRead::CreateClipBufferL
+// Creates buffer needed in data transfer with format readers clip.
+// -----------------------------------------------------------------------------
+//
+CMMFDataBuffer* CAnyPayloadFormatRead::CreateClipBufferL( 
+        TUint aSize, TBool& aIsOwnBuffer )
+    {
+    __ANYFORMAT_CONTROLL( "CAnyPayloadFormatRead::CreateClipBufferL" );
+    
+    CMMFDataBuffer* buffer( NULL );
+    
+    if ( iClip->CanCreateSourceBuffer() )
+        {
+        static_cast<CMMFFormatDecode*>( iClip )->SuggestSourceBufferSize( aSize );
+        
+        TBool reference( EFalse );
+        CMMFBuffer* sourceBuf 
+            = iClip->CreateSourceBufferL( KUidMediaTypeAudio, reference );
+        TBool isSupportedBuf 
+            = CMMFBuffer::IsSupportedDataBuffer( sourceBuf->Type() );
+        TBool isOwnBuffer = reference ? EFalse : ETrue;
+        
+        if ( !isSupportedBuf )
+            {
+            if ( isOwnBuffer )
+                {
+                delete sourceBuf;
+                }
+            
+            User::Leave( KErrNotSupported );
+            }
+        
+        aIsOwnBuffer = isOwnBuffer;
+        buffer = static_cast<CMMFDataBuffer*>( sourceBuf );
+        }
+    else
+        {
+        aIsOwnBuffer = ETrue;
+        buffer = CMMFDataBuffer::NewL( aSize );
+        }
+    
+    return buffer;
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+//  End of File