multimediacommscontroller/mmccamrpayloadformat/inc/amrpayloadformatter.h
changeset 0 1bce908db942
--- /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 <e32base.h>
+#include "amrpayloadformatutil.h"
+#include "mccinternalevents.h"
+#include "amrframe.h"
+
+#ifdef FTD_ENABLED
+#include <e32msgqueue.h>
+#include "MccCodecStats.h"
+#include "MccJBufferStats.h"
+#endif
+
+#ifdef _DEBUG 
+    #include <e32svr.h>
+    #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 <TBD>
+*  @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<HBufC8> iFrameDatas;
+        
+        #ifdef FTD_ENABLED
+		// Message queue carrying codec statistics
+        RMsgQueue<TMccCodecStats> iCodecStatsQueue;
+
+		// Message queue carrying jitter buffer statistics
+        RMsgQueue<TMccJBufferStats> iJBufStatsQueue;
+        #endif
+        
+    };
+
+#endif      // __AMRPAYLOADFORMATTER_H
+
+// End of File