diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccamrpayloadformat/inc/amrpayloadformatread.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmccamrpayloadformat/inc/amrpayloadformatread.h Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,471 @@ +/* +* 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: Class definition for the AMR/RTP payload format plugin +* +*/ + + + + +#ifndef AMRPAYLOADFORMATREAD_H +#define AMRPAYLOADFORMATREAD_H + +// INCLUDES +#include +#include +#include +#include "rtpheader.h" +#include "formatstatemachine.h" +#include "amrpayloadformatter.h" +#include "streamformatter.h" +#include "mccinternalcodecs.h" +#include "mccinternalevents.h" + +#ifdef FTD_ENABLED +#include +#include "MccJBufferStats.h" +#endif + + +// FORWARD DECLARATIONS +class CAmrPayloadEncoder; +class CAmrPayloadDecoder; + +// CLASS DECLARATION + +/** +* The CAmrPayloadFormatRead class implements the MMF format plugin for decoding +* of RTP payloadformat for AMR codec. Refer to IETF RFC3267. +* This class receives AMR payload data from an RTP packet and converts it into +* one or more AMR frames. +* +* @lib MMccamrplformat.dll +* @since Series 60 3.0 +*/ +class CAmrPayloadFormatRead : public CPayloadFormatRead, public MPayloadFormatRead + { + public: // Constructors and destructor + /** + * Two-phased constructor. + * @param aSource Source of the data for the payload format plugin + */ + static CAmrPayloadFormatRead* NewL ( MDataSource* aSource ); + + /** + * Destructor. + */ + virtual ~CAmrPayloadFormatRead ( ); + + public: // New functions + + /** + * Cancel any requests from DataPath and Stop state machine also + * @since Series-60 2.1 + * @return None + */ + virtual void CancelDlRequest( ); + + /** + * Send full sink buffer with AMR frames to data path. + * Sink buffer is decided on one of the two frame buffers + * Called by the state machine. + * @since Series-60 2.1 + * @return None + */ + void SendDataToSinkL( ); + + /* + * Fill the sink buffer by decoding the RTP payload into AMR frames + * Sink buffer is decided on one of the two frame buffers + * Called by the state machine. + * @since Series-60 2.1 + * @return 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 2.1 + * @return None + */ + void FillSourceBufferL( ); + + public: // From CMMFFormatDecode + + /** + * From CMMFFormatDecode. Return number of audio streams for the given + * media Raw audio files can only have 1 audio stream. + * + * @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 + * + * @return Number of channels + */ + TUint NumChannels( ); + + /** + * Accessor funtion to return the sampling rate + * + * + * @return Sampling rate + */ + TUint SampleRate( ); + + /** + * Set the packetizationrate to the given value. + * + * @param aPacketizationRate - [input] Number of AMR frame blocks per RTP packet + * + * @return error code KErrNotSupported if invalid packetizationrate, else return KErrNone + */ + TInt SetSampleRate( TUint aSampleRate ); + + /** + * From CMMFFormatDecode + */ + TFourCC SinkDataTypeCode( TMediaId aMediaId ); + + public: // From MDataSource. CAmrPayloadFormatRead is data source to the data path and AMR codec. + + /** + * From MDataSource. 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 ); + + /** + * From MDataSource. Primes the source. + * @since Series 60 3.0 + * @return None + */ + void SourcePrimeL( ); + + /** + * From MDataSource. Plays the source. + * @since Series 60 3.0 + * @return None + */ + void SourcePlayL( ); + + /** + * From MDataSource. Pauses the source. + * @since Series 60 3.0 + * @return None + */ + void SourcePauseL( ); + + /** + * From MDataSource. Stops the source. + * @since Series 60 3.0 + * @return None + */ + void SourceStopL( ); + + /** + * 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 ); + + /** + * 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 ); + + /** + * 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. + * + * @return None + */ + void SourceThreadLogoff( ); + + /** + * Negotiate source settings ( buffer size ) to match + * given source object + * + * @param aDataSink address of sink object + * + * @return None + */ + void NegotiateSourceL( MDataSink& aDataSink ); + + + public: // From MDataSink. CAmrPayloadFormatRead is data sink to the RTP data source. + + /** + * 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 + * @param aHeaderInfo RTP packet header information + * @return None + */ + virtual void DataBufferFilledL( CMMFBuffer* aBuffer, + const TRtpRecvHeader& aHeaderInfo ); + + public: + + /** + * 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 ); + + /** + * Update payload format with format spesific parameters. + * Leaves with KErrArgument if parameters are invalid. + * + * @since Series 60 3.0 + * @param aCodecInfo Configuration parameters + * @return void + */ + virtual void UpdateConfigurationL( const TMccCodecInfo& aCodecInfo ); + + private: + /** + * C++ default constructor. + */ + CAmrPayloadFormatRead( ); + + /** + * By default Symbian 2nd phase constructor is private. + * + * @param aSource Source of the data for the payload format plugin + */ + void ConstructL( MDataSource* aSource ); + + /** + * Reads data starting from the given position into the source buffer + * + * @param aBuffer RTP payload buffer + * + * @return TBool indication of finish decoding RTP payload + */ + TBool DoRead( CMMFBuffer* aBuffer ); + + /** + * Send Amr event to the client . + * + * @param aEventType + */ + void SendAmrEventToClient( TMccInternalEventType aEventType ); + + /** + * 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 ); + + /** + * Gives corresponding bitrate for mode request + * @param aModeRequest + * @return bitrate + */ + TInt ConvertModeToBitrate( TAmrModeRequest aModeRequest ); + + private: // data + + // True if this AMR narrow band read, False if wideband + TBool iIsNb; + + // Data source providing RTP data + MDataSource* iRtpDataSource; + + // The fourCC for AMR-NB + TFourCC iFourCC; + + // Flag used to determine which buffer is currently used as a sink buffer + enum TCurrentBuffer + { + EBufferOne = 0, + EBufferTwo + }; + + // Sampling rate from clip header + TInt iSamplingRate; + + // Number of channels from clip header + TUint iChannels; + + // Mode from clip header + TInt iMode; + + // Payload decoder + CAmrPayloadDecoder* iPayloadDecoder; + + TMediaId iMediaId; + + // Data buffer passed from RtpSource + CMMFBuffer* iBufferToRead; + + // Indicates are there frames not decoded remaining + TBool iBufferToReadExists; + + // Number of frames decoded from RTP packet + TInt iNumOfFrames; + + // Frame index indicating are all frames decoded passed to datapath + TInt iCurrentFrame; + + // Maximum number of frames expected to receive in one RTP packet + TInt iFramesPerPacket; + + // AMR mode request, used to construct RTP AMR payload header + TAmrModeRequest iCmr; + + // Format decoding state machine + CFormatDecodeStateMachine* iStateMachine; + + // Buffer to store depacketized AMR frames + CMMFDataBuffer* iFrameBufferOne; + + // Alternate buffer to store depacketized AMR 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; + + // Flag to indicate the outstanding request from data path + TBool iFillRequested; + + // Encoder + TStreamEncoder iStreamEncoder; + + // RTP Header + TRtpRecvHeader iRecvHeader; + + // Parameters relating to RTP data decoding + TMccCodecInfo iCInfo; + + // MMF AsyncEventHandler + MAsyncEventHandler* iEventHandler; + + #ifdef FTD_ENABLED + // Message queue carrying jitter buffer statistics + RMsgQueue iJBufStatsQueue; + + // For RTP packet loss detection + TUint32 iLatestSeqNum; + + // Number of frames decoded after starting + TUint32 iTotalFrames; + + // Number of frames lost due to packet loss + TUint32 iLostFrames; + #endif + + private: // Friend classes + + #ifdef TEST_EUNIT + friend class UT_CAmrPayloadFormatRead; + #endif + + }; + +#endif //AMRPAYLOADFORMATREAD_H