diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccamrpayloadformat/inc/amrpayloadformatter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmccamrpayloadformat/inc/amrpayloadformatter.h Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,366 @@ +/* +* 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: Formatter classes for encoding/decoding of RTP payload format +* for AMR ( narrow band ) and AMR-WB ( wide band ) audio codecs. +* +*/ + + + + +#ifndef AMRPAYLOADFORMATTER_H +#define AMRPAYLOADFORMATTER_H + +// INCLUDES +#include +#include "amrpayloadformatutil.h" +#include "mccinternalevents.h" +#include "amrframe.h" + +#ifdef FTD_ENABLED +#include +#include "MccCodecStats.h" +#include "MccJBufferStats.h" +#endif + +#ifdef _DEBUG + #include + #define _DEBUG_AMR_DECODE + #define _DEBUG_AMR_ENCODE + #define TRACE_AMR_PAYLOAD_FORMAT_READ + #define TRACE_AMR_PAYLOAD_FORMAT_WRITE + #define TRACE_PAYLOAD_FORMAT +#endif + + + +// CONSTANTS +const TUint KAmrNbSampleRate = 8000; +const TUint KAmrWbSampleRate = 16000; + +const TUint KCMRFieldBits = 4; +// Max two frames is used with AMR FEC redundancy +const TInt KMaxAmrRedCount = 5; + +// Max number of frames to save for redundancy detection +const TInt KMaxAmrFramesSaved = 5; + +// How many octets are compared while determining is a frame already received +const TInt KMaxCompareOctets = 6; + +const TInt KMaxChannelCount = 2; +const TInt KMaxFrameBlocksPerPacket = 20; +const TInt KMaxFrameCountPerPacket + = KMaxChannelCount * ( KMaxFrameBlocksPerPacket + KMaxAmrRedCount ); + +const TInt KHeaderBitsBE = 4; +const TInt KHeaderBitsOA = 8; +const TInt KTOCFieldBitsBE = 6; +const TInt KTOCFieldBitsOA = 8; + +const TInt KNumberOfNbModes = 8; +// In bytes; equals to +// [( KMaxFrameCountPerPacket * maximum-frame-size ) + header + TOC + CRC] +// in octet-aligned mode maximum-frame-size = 31 ( AMR-NB ); header = 1; +// TOC = CRC = KMaxFrameCountPerPacket + +// Refer to 3GPP TS 26.101 V5.0.0 and RFC 3267 +// the total number of bits in speech data for different AMR frame types +// total speech +// Index Mode bits +// ---------------------------- +// 0 AMR 4.75 95 +// 1 AMR 5.15 103 +// 2 AMR 5.9 118 +// 3 AMR 6.7 134 +// 4 AMR 7.4 148 +// 5 AMR 7.95 159 +// 6 AMR 10.2 204 +// 7 AMR 12.2 244 +// 8 AMR SID 39 + +const TInt KNumberOfNbFrameTypes = 9; +const TInt KAmrNbTotalSpeechBits[KNumberOfNbFrameTypes] = + {95, 103, 118, 134, 148, 159, 204, 244, 39}; +const TInt KMaxBitsLength = 32; // max length in bits that TStreamFormatter + // can handle once when encoding and decoding +const TInt KAmrNbModes[KNumberOfNbModes] = + {4750, 5150, 5900, 6700, 7400, 7950, 10200, 12200}; + +const TInt KNumberOfWbModes = 9; +// Refer to 3GPP TS 26.201 V7.0.0 and RFC 3267 +// the total number of bits in speech data for different AMR frame types +// total speech +// Index Mode bits +// ---------------------------- +// 0 AMR-WB 6.60 132 +// 1 AMR-WB 8.85 177 +// 2 AMR-WB 12.65 253 +// 3 AMR-WB 14.25 285 +// 4 AMR-WB 15.85 317 +// 5 AMR-WB 18.25 365 +// 6 AMR-WB 19.85 397 +// 7 AMR-WB 23.05 461 +// 8 AMR-WB 23.85 477 +// 9 AMR-WB SID 40 + +const TInt KNumberOfWbFrameTypes = 10; +const TInt KAmrWbTotalSpeechBits[KNumberOfWbFrameTypes] = + {132, 177,253, 285, 317, 365, 397, 461, 477, 40}; +const TInt KAmrWbModes[KNumberOfWbModes] = + {6600, 8850, 12650, 14250, 15850, 18250, 19850, 23050, 23850}; + +// MACROS +#ifdef _DEBUG_AMR_DECODE + #define DP_AMR_DECODE(a) { _LIT( KName, a); RDebug::Print(KName); } + #define DP_AMR_DECODE2(a, b) \ + { _LIT(KName, a); RDebug::Print(KName, b); } + #define DP_AMR_DECODE3(a, b, c) \ + { _LIT(KName, a); RDebug::Print(KName, b, c); } + #define DP_AMR_DECODE4(a, b, c, d) \ + { _LIT(KName, a); RDebug::Print(KName, b, c, d); } + #define DP_AMR_DECODE5(a, b, c, d, e) \ + { _LIT(KName, a); RDebug::Print(KName, b, c, d, e); } + #define DP_AMR_DECODE6(a, b, c, d, e, f) \ + { _LIT(KName, a); RDebug::Print(KName, b, c, d, e, f); } +#else + #define DP_AMR_DECODE(a); + #define DP_AMR_DECODE2(a, b); + #define DP_AMR_DECODE3(a, b, c); + #define DP_AMR_DECODE4(a, b, c, d); + #define DP_AMR_DECODE5(a, b, c, d, e); + #define DP_AMR_DECODE6(a, b, c, d, e, f); +#endif + +#ifdef _DEBUG_AMR_ENCODE + #define DP_AMR_ENCODE(a) { _LIT( KName, a); RDebug::Print(KName); } + #define DP_AMR_ENCODE2(a, b) \ + { _LIT(KName, a); RDebug::Print(KName, b); } + #define DP_AMR_ENCODE3(a, b, c) \ + { _LIT(KName, a); RDebug::Print(KName, b, c); } + #define DP_AMR_ENCODE4(a, b, c, d) \ + { _LIT(KName, a); RDebug::Print(KName, b, c, d); } + #define DP_AMR_ENCODE5(a, b, c, d, e) \ + { _LIT(KName, a); RDebug::Print(KName, b, c, d, e); } + #define DP_AMR_ENCODE6(a, b, c, d, e, f) \ + { _LIT(KName, a); RDebug::Print(KName, b, c, d, e, f); } + #define DP_AMR_ENCODE7(a, b, c, d, e, f, g) \ + { _LIT(KName, a); RDebug::Print(KName, b, c, d, e, f, g); } +#else + #define DP_AMR_ENCODE(a); + #define DP_AMR_ENCODE2(a, b); + #define DP_AMR_ENCODE3(a, b, c); + #define DP_AMR_ENCODE4(a, b, c, d); + #define DP_AMR_ENCODE5(a, b, c, d, e); + #define DP_AMR_ENCODE6(a, b, c, d, e, f); + #define DP_AMR_ENCODE7(a, b, c, d, e, f, g); +#endif + +#ifdef TRACE_AMR_PAYLOAD_FORMAT_READ + #define AMR_PAYLOAD_FORMAT_READ(a) \ + { _LIT( KName, a); RDebug::Print(KName); } + #define AMR_PAYLOAD_FORMAT_READ2(a, b) \ + { _LIT(KName, a); RDebug::Print(KName, b); } + #define AMR_PAYLOAD_FORMAT_READ3(a, b, c) \ + { _LIT(KName, a); RDebug::Print(KName, b, c); } + #define AMR_PAYLOAD_FORMAT_READ4(a, b, c, d) \ + { _LIT(KName, a); RDebug::Print(KName, b, c, d); } + #define AMR_PAYLOAD_FORMAT_READ5(a, b, c, d, e) \ + { _LIT(KName, a); RDebug::Print(KName, b, c, d, e); } +#else + #define AMR_PAYLOAD_FORMAT_READ(a); + #define AMR_PAYLOAD_FORMAT_READ2(a, b); + #define AMR_PAYLOAD_FORMAT_READ3(a, b, c); + #define AMR_PAYLOAD_FORMAT_READ4(a, b, c, d); + #define AMR_PAYLOAD_FORMAT_READ5(a, b, c, d, e) +#endif + +#ifdef TRACE_AMR_PAYLOAD_FORMAT_WRITE + #define AMR_PAYLOAD_FORMAT_WRITE(a) \ + { _LIT( KName, a); RDebug::Print(KName); } + #define AMR_PAYLOAD_FORMAT_WRITE2(a, b) \ + { _LIT(KName, a);RDebug::Print(KName, b); } + #define AMR_PAYLOAD_FORMAT_WRITE3(a, b, c) \ + { _LIT(KName, a); RDebug::Print(KName, b, c); } + #define AMR_PAYLOAD_FORMAT_WRITE4(a, b, c, d) \ + { _LIT(KName, a); RDebug::Print(KName, b, c, d); } +#else + #define AMR_PAYLOAD_FORMAT_WRITE(a) + #define AMR_PAYLOAD_FORMAT_WRITE2(a, b) + #define AMR_PAYLOAD_FORMAT_WRITE3(a, b, c) + #define AMR_PAYLOAD_FORMAT_WRITE4(a, b, c, d) +#endif + +#ifdef TRACE_PAYLOAD_FORMAT + #define TRACE_PAYLOAD_FORMAT_PRINT(a) \ + { _LIT( KName, a); RDebug::Print(KName); } +#else + #define TRACE_PAYLOAD_FORMAT_PRINT(a) +#endif + + +// DATA TYPES + + +// CLASS DECLARATION + + +/** +* The AMR payload formatter for an RTP packet. +* +* @lib +* @since Series-60 2.1 +*/ +class CAmrPayloadFormatter : public CBase + { + public: // Constructors and destructor + + /** + * Destructor. + */ + virtual ~CAmrPayloadFormatter( ); + + public: // New functions + + /** + * Initializes AMR encoder/decoder. Initialization must be done when playback + * is started. + * @since Series 60 3.0 + */ + void Initialize(); + + /** + * Set payload buffer. + * Calling function must have allocated memory for the buffer. + * @since Series-60 2.1 + * @param aBuffer - [input] Descriptor of payload buffer + * @return None + */ + virtual void SetPayloadBuffer( TDes8& aBuffer ); + + /** + * Set number of audio channels. + * @since Series-60 2.1 + * @param aChannelCount - [input] Number of audio channels + * @return TInt - KErrNone if successful; system wide error code otherwise + */ + virtual TInt SetChannelCount( TInt aChannelCount ); + + /** + * Set number of AMR frame blocks included in one RTP packet. + * Each frame block contains frames for all audio channels. + * @since Series-60 2.1 + * @param aFrameblockCount - [input] Number of AMR frame blocks included + * in one RTP packet + * @return TInt - KErrNone if successful; system wide error code otherwise + */ + virtual TInt SetFrameBlockCount( TInt aFrameblockCount ); + + /** + * Get the payload buffer. + * @since Series-60 2.1 + * @return TDes8& - Descriptor of payload buffer + */ + inline TDes8& PayloadBuffer( ) { return iPayloadPtr; }; + + /** + * Get number of speech bits in an AMR frame + * @since Series-60 2.1 + * @param aFrameType - [input] AMR frame type + * @return TInt - Number of speech bits in an AMR frame + */ + TInt SpeechBitCount( enum TAmrFrameType aFrameType ) const; + + /** + * Get number of audio channels. + * @since Series-60 2.1 + * @return TInt - Number of audio channels + */ + inline TInt ChannelCount( ) const { return iChannelCount; }; + + /** + * Get number of AMR frame blocks included in one RTP packet. + * Each frame block contains frames for all audio channels. + * @since Series-60 2.1 + * @return TInt - Number of AMR frame blocks + */ + inline TInt FrameBlockCount( ) const { return iFrameBlockCount; }; + + /** + * Get number of AMR frame included in one RTP packet. + * @since Series-60 2.1 + * @return TInt - Number of AMR frames + */ + inline TInt FrameCount( ) const { return iFrameCount; }; + + protected: // Functions + + /** + * Constructor. + */ + CAmrPayloadFormatter( TBool aIsNb ); + + virtual void DoInitialize() = 0; + + protected: // Data + + // TRUE, if this is formater for narrow band AMR. FALSE for wide band. + TBool iIsNb; + + // Payload parameters + // Number of audio channels + TInt iChannelCount; + + // Number of AMR frame blocks included in one packet + TInt iFrameBlockCount; + + // Number of AMR frames included in one packet + TInt iFrameCount; + + // Codec mode request + TAmrModeRequest iModeRequest; + + // Frame information + // AMR frames for one RTP packet + TAmrFrame iFrames[KMaxFrameCountPerPacket]; + + // Current index to `iFrames' array + TInt iFrameIndex; + + // Payload data buffer info + // Pointer descriptor for payload buffer + TPtr8 iPayloadPtr; + + // Pointer to payload buffer + TUint8* iPayload; + + // Size, in bytes, of payload buffer + TInt iPayloadSize; + + // Frames either for redundancy detection or redundancy sending + RPointerArray iFrameDatas; + + #ifdef FTD_ENABLED + // Message queue carrying codec statistics + RMsgQueue iCodecStatsQueue; + + // Message queue carrying jitter buffer statistics + RMsgQueue iJBufStatsQueue; + #endif + + }; + +#endif // __AMRPAYLOADFORMATTER_H + +// End of File