diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccilbcpayloadformat/inc/ilbcpayloadformatread.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmccilbcpayloadformat/inc/ilbcpayloadformatread.h Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,437 @@ +/* +* Copyright (c) 2004-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: Reads RTP payload format containing ILBC data. +* +*/ + + + +#ifndef ILBCPAYLOADFORMATREAD_H +#define ILBCPAYLOADFORMATREAD_H + +// INCLUDES +#include +#include +#include "rtpheader.h" +#include "formatstatemachine.h" +#include "mccinternalcodecs.h" + +// CLASS DECLARATION +/** +* Depacketizes RTP payload containing ILBC data. +* +* @lib MMCCIlbcPlFormat.dll +* @since Series 60 3.0 +*/ +class CIlbcPayloadFormatRead : public CPayloadFormatRead, + public MAsyncEventHandler, + public MPayloadFormatRead + { + public: + /** + * Two-phased constructor. + * @param aSource Data source configuration parameters + */ + static CIlbcPayloadFormatRead* NewL ( MDataSource* aSource ); + + /** + * Destructor. + */ + virtual ~CIlbcPayloadFormatRead(); + + public: // New functions + + /** + * Configures payload format with format spesific parameters. + * Leaves with KErrArgument if parameters are invalid. + * + * @since Series 60 3.0 + * @param aConfigParams Configuration parameters + * @return void + */ + virtual void ConfigurePayloadFormatL( const TDesC8& aConfigParams ); + + public: // From CMMFFormatDecode + + /** + * Return number of audio streams for the given media + * Raw audio files can only have 1 audio stream + * @since Series 60 3.0 + * @param aMediaType KUidMediaTypeAudio or KUidMediaTypeVideo + * @return Number of audio streams + */ + TUint Streams( TUid aMediaType ) const; + + /** + * Return the frame time interval for the given media + * + * @param aMediaType KUidMediaTypeAudio or KUidMediaTypeVideo + * + * @return Time interval in micro seconds + */ + TTimeIntervalMicroSeconds FrameTimeInterval( TMediaId aMediaType ) const; + + /** *** NOT SUPPORTED *** + * Return the clip duration for the given media + * + * @param aMediaType KUidMediaTypeAudio or KUidMediaTypeVideo + * + * @return Clip duration in micro seconds + */ + TTimeIntervalMicroSeconds Duration( TMediaId aMediaType ) const; + + /** + * Accessor funtion to return the number of channels + * + * @param + * + * @return Number of channels + */ + TUint NumChannels(); + + /** + * Accessor funtion to return the sampling rate + * + * @param + * + * @return Sampling rate + */ + TUint SampleRate(); + + /** + * Set the samplerate to the given value. + * + * @param aSampleRate + * + * @return error code KErrNotSupported if invalid samplerate, else + * return KErrNone + */ + TInt SetSampleRate( TUint aSampleRate ); + + public: // From MDataSource + + /** + * Return the four CC code for the given media + * + * @param aMediaId contains the media type KUidMediaTypeAudio or + * KUidMediaTypeVideo + * + * @return FourCC code + */ + TFourCC SourceDataTypeCode( TMediaId aMediaId ); + + /** + * Set the source data type to the given four CC code for the given + * media + * + * @param aSourceFourCC fourCC code + * @param aMediaId contains the media type KUidMediaTypeAudio + * or KUidMediaTypeVideo + * + * @return error code KErrNotSupported if invalid + * media ID, else return KErrNone + */ + TInt SetSourceDataTypeCode( TFourCC aSourceFourCC, + TMediaId aMediaId ); + + /** + * Create a source buffer for the given media + * + * @param aMediaId contains the media type KUidMediaTypeAudio or + * KUidMediaTypeVideo + * @param aReference value of False is returned to caller if source + * buffer is created + * + * @return Pointer to source buffer created + */ + CMMFBuffer* CreateSourceBufferL( TMediaId aMediaId, + TBool &aReference ); + + /** + * Create a source buffer for the given media, setting frame size + * to match the given sink buffer + * + * @param aMediaId contains the media type KUidMediaTypeAudio or + * KUidMediaTypeVideo + * @param aSinkBuffer address of sink buffer + * @param aReference value of False is returned to caller if source + * buffer is created + * + * @return Pointer to source buffer created + */ + CMMFBuffer* CreateSourceBufferL( TMediaId aMediaId, + CMMFBuffer& aSinkBuffer, + TBool &aReference ); + + /** + * Read the next block of data from file into the given buffer + * + * @param aBuffer source data buffer for the AMR-NB data read + * @param aConsumer data sink pointer + * @param aMediaId contains the media type KUidMediaTypeAudio or + * KUidMediaTypeVideo + * + * @return + */ + void FillBufferL( CMMFBuffer* aBuffer, + MDataSink* aConsumer, + TMediaId aMediaId ); + + /** + * Log in to the source thread - this funtion merely passes the + * command to its source clip data source object. The source clip + * object will handle the thread log on procedures. + * + * @param aEventHandler address of event handler + * + * @return error code returned by source clip + */ + TInt SourceThreadLogon( MAsyncEventHandler& aEventHandler ); + + /** + * Log out of the source thread - this funtion merely passes the + * command to its source clip data source object. The source clip + * object will handle the thread log off procedures. + * + * @param + * @return + */ + void SourceThreadLogoff(); + + /** + * Negotiate source settings (buffer size) to match + * given source object + * + * @param aDataSink address of sink object + * + * @return + */ + void NegotiateSourceL( MDataSink& aDataSink ); + + /** + * From MDataSource Primes the source. + * @since + * @param None + */ + void SourcePrimeL(); + + /** + * From MDataSource Plays the source. + * @since + * @param None + */ + void SourcePlayL(); + + /** + * From MDataSource Pauses the source. + * @since + * @param None + */ + void SourcePauseL(); + + /** + * From MDataSource Stops the source. + * @since + * @param None + */ + void SourceStopL(); + + public: // From MDataSink + + /** + * Called after the data buffer is filled. Update the number of bytes + * read and the current read position for the next read operation. + * + * @param aBuffer data buffer filled + * + * @return + */ + virtual void DataBufferFilledL( CMMFBuffer* aBuffer, + const TRtpRecvHeader& aRecvHeader ); + + /** + * Gets the data type code for the sink specified by the media ID. + * Format decode may act in role of MDataSink. + * + * @param aMediaId Media ID + * @return The data sink type code + */ + TFourCC SinkDataTypeCode( TMediaId aMediaId ); + + public: // From MAsyncEventHandler + virtual TInt SendEventToClient(const TMMFEvent& /*aEvent*/) + {return KErrNone;} + + public: // From MPayloadFormatRead + + /** + * Send full sink buffer with iLBC frames to data path. + * Sink buffer is decided on one of the two frame buffers + * Called by the state machine. + * @since Series 60 3.0 + * @param None + */ + void SendDataToSinkL(); + + /** + * Fill the sink buffer by decoding the RTP payload into iLBC frames + * Sink buffer is decided on one of the two frame buffers + * Called by the state machine. + * @since Series 60 3.0 + * @param None + */ + void FillSinkBufferL(); + + /** + * Request the RTPSource to fill the source buffer with RTP payload + * Source buffer is decided by the RTPSource. + * Called by the state machine. + * @since Series 60 3.0 + * @param None + */ + void FillSourceBufferL(); + + protected: // New functions + + protected: // Functions from base classes + + private: // New functions + + /** + * Decode audio frames from RTP payload to the audio frame array. + * Next decoded frame may be requested by GetNextFrameL(). + * + * @since Series 60 3.0 + * @param aSourceBuffer RTP payload to be decoded + * @return Number of decoded frames + */ + TInt DecodePayload( const TDesC8& aSourceBuffer ); + + /** + * Return next decoded audio frame. + * @since Series 60 3.0 + * @param aToBuffer - [output] Buffer to place decoded frame + * @return Boolean indicating whether decoded frames are remaining. + */ + TBool GetNextFrame( TDes8& aToBuffer ); + + /** + * Update payload format with format spesific parameters. + * + * @since Series 60 3.0 + * @param aCodecInfo Codec info + * @return void + */ + void UpdateConfigurationL( const TMccCodecInfo& aCodecInfo ); + + /** + * Configures the formatter based on input parameters. + * + * @since Series 60 3.0 + * @param aCodecInfo Codec info + * @return void + */ + void DoConfigurePayloadFormatL( const TMccCodecInfo& aCodecInfo ); + + private: + + /** + * C++ default constructor. + */ + CIlbcPayloadFormatRead (); + + /** + * By default Symbian 2nd phase constructor is private. + * + * @param aConf Decoder Configuration params + */ + void ConstructL ( MDataSource* aSource ); + + /** + * Creates a buffer used in data transfer between format read and + * its datasource. + * + * @since Series 60 3.2 + * @param aSize Suggested buffer size + * @param aIsOwnBuffer Indicates ownership of the buffer + * @return Created buffer + */ + CMMFDataBuffer* CreateClipBufferL( TUint aSize, TBool& aIsOwnBuffer ); + + private: // Data + + enum TCurrentBuffer + { + EBufferOne = 0, + EBufferTwo + }; + + // the fourCC + TFourCC iFourCC; + + // Format decoding state machine + CFormatDecodeStateMachine* iStateMachine; + + // ETrue if decoded frames are remaining + TBool iBufferToReadExists; + + // Number of frames decoded from received RTP payload + TInt iNumOfFrames; + // Data sink that requested "FillBuffer". + MDataSink* iSink; + + // Frame time interval in micro seconds + TTimeIntervalMicroSeconds iFrameTimeInterval; + + // Buffer to store depacketized Ilbc frames + CMMFDataBuffer* iFrameBufferOne; + + // Alternative buffer to store depacketized Ilbc frames + CMMFDataBuffer* iFrameBufferTwo; + + // Flag to indicate which buffer is in use + TCurrentBuffer iCurrentBuffer; + + // Buffer to hold payload got from data source; + CMMFDataBuffer* iSourceBuffer; + + // Indicates whether payload read has ownership of source buffer + TBool iSourceBufOwnership; + + TMediaId iMediaId; + + // Flag to indicate that received frame was comfort noise + TBool iCnFrame; + + // Current index in set of audio frames decoded from last payload + TInt iFrameIndex; + + // Contains pointers to audio frames in received payload + RArray iFrameArray; + + // RTP Header + TRtpRecvHeader iRecvHeader; + + // Parameters relating to RTP data encoding + TMccCodecInfo iCInfo; + + // Friend class for testing + #ifdef TEST_EUNIT + friend class UT_CIlbcPayloadFormatRead; + #endif + }; + +#endif /* ILBCPAYLOADFORMATREAD_H */ + +// End of File