--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmccamrpayloadformat/inc/amrpayloadencoder.h Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,262 @@
+/*
+* 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 decoding of RTP payload format
+* for AMR ( narrow band ) and AMR-WB ( wide band ) audio codecs.
+*
+*/
+
+
+
+
+#ifndef AMRPAYLOADENCODER_H
+#define AMRPAYLOADENCODER_H
+
+// INCLUDES
+#include <e32std.h>
+#include "amrpayloadformatter.h"
+#include "amrpayloadheader.h"
+#include "amrtocentry.h"
+#include "streamformatter.h"
+
+// CONSTANTS
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+class TStreamEncoder;
+
+// CLASS DECLARATION
+
+/**
+* The AMR payload encoder for bandwidth efficient mode.
+*
+* @lib <TBD>
+* @since Series-60 2.1
+*/
+class CAmrPayloadEncoder : public CAmrPayloadFormatter
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ static CAmrPayloadEncoder* NewL( TBool aIsNb );
+
+
+ /**
+ * Destructor.
+ */
+ virtual ~CAmrPayloadEncoder( );
+
+
+ public: // Functions
+
+ /**
+ * Set AMR codec mode request ( CMR ).
+ * @since Series-60 2.1
+ * @param aRequest - [input] AMR codec mode request ( CMR )
+ * @return void
+ */
+ void SetModeRequest( TAmrModeRequest aRequest );
+
+ /**
+ * Encode a received AMR frame into the payload buffer.
+ * @since Series-60 2.1
+ * @param aChannel - [input] Channel number that the frame belongs to
+ * @param aFrameType - [input] Frame type
+ * @param aFrameQualityInd - [input] Frame quality indicator bit; 1 if frame OK; 0 if frame damaged
+ * @param aFrameData - [input] Frame data; its length depends on frame type
+ * @return ETrue if payload formatting is completed; otherwise EFalse
+ */
+ virtual TBool EncodeFrame( TInt aChannel,
+ TAmrFrameType aFrameType,
+ TUint8 aFrameQualityInd,
+ const TDes8& aFrameData );
+
+ /**
+ * Reset the payload buffer.
+ * @since Series-60 2.1
+ * @param None
+ * @return void
+ */
+ void ResetPayloadBuffer( );
+
+ /**
+ * Do bit shifting when AmrPayloadFormatPlugin is doing buffer flushing.
+ * @since Series-60 2.1
+ * @param None
+ * @return ETrue if payload formatting is completed; otherwise EFalse
+ */
+ TBool ReEncodeFrameL( );
+
+ /**
+ * Do bit shifting when AmrPayloadFormatPlugin is doing buffer flushing
+ * @since Series-60 2.1
+ * @param aBuffer Buffer containing frame data
+ * @return ETrue if payload formatting is completed; otherwise EFalse
+ */
+ TBool ReEncodeFrameL( TUint8* aBuffer );
+
+ /**
+ * Returns ETrue if next frame will start new packetization period.
+ * @since Series 60 3.1
+ * @return ETrue if next frame starts new period
+ */
+ TBool IsStartOfPeriod();
+
+ public: // Functions from CAmrPayloadFormatter
+
+ /**
+ * Set number of audio channels.
+ * @since Series-60 2.1
+ * @param aChannelCount - [input] Number of audio channels
+ * @return 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 KErrNone if successful; system wide error code otherwise
+ */
+ virtual TInt SetFrameBlockCount( TInt aFrameblockCount );
+
+ /**
+ * Set number of redundant frame blocks included in one RTP packet.
+ * Each frame block contains frames for all audio channels.
+ * @since Series 60 3.0
+ * @param aRedBlockCount Number of redundant AMR frame blocks to be
+ * included in one RTP packet
+ * @return KErrNone if successful; system wide error code otherwise
+ */
+ virtual TInt SetRedFrameBlockCount( TInt aRedBlockCount );
+
+ /**
+ * Initialize frame encoder ( Stream Encoder ).
+ * Information to initialize are obtained from iPayload, calculation
+ * using iChannelCount and iFrameBlockCount.
+ * Initialization should be done whenever a payload is finished.
+ * @since Series-60 2.1
+ * @param None
+ * @return void
+ */
+ virtual void InitializeFrameEncoder( );
+
+ protected: // Functions
+
+ /**
+ * Constructor.
+ */
+ CAmrPayloadEncoder( TBool aIsNb );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL( );
+
+ /**
+ * Encode the AMR payload ( for one RTP packet ) into a given buffer.
+ * Values to encode are obtained from `iFrames' array.
+ * @since Series-60 2.1
+ * @param aBuffer - [output] Buffer to store encoded data
+ * @return Total number of bytes encoded in the buffer
+ */
+ TInt Encode( TUint8* aBuffer );
+
+ /**
+ * Encode 'Table of Contents' into a given buffer at the given position.
+ * Information to encode are obtained from `iFrames' array.
+ * Byte and bit positions are updated after encoding is done.
+ * @since Series-60 2.1
+ * @param aBuffer - [output] Buffer to store encoded data.
+ * @param aByteIndex - [input] Starting byte index ( starts from zero ).
+ * [output] Byte index updated after encoding.
+ * @param aBitIndex - [input] Starting bit index ( starts from zero ).
+ * [output] Bit index updated after encoding.
+ * @return void
+ */
+ void EncodeTableOfContents( TUint8* aBuffer,
+ TInt& aByteIndex,
+ TInt& aBitIndex );
+
+ /**
+ * Rips off unwanted NO_DATA frames from payload according to
+ * RFC3267: 4.3.2.
+ *
+ * @since Series 60 3.0
+ * @param None
+ * @return Number of frames discarded from a payload
+ */
+ virtual TInt DiscardExtraNoDataFrames();
+
+ /**
+ * Saves frame so it can be sent as redundancy later.
+ *
+ * @since Series 60 3.0
+ * @param aFrameData Frame data to save
+ * @return void
+ */
+ virtual void SaveRedundantFrame( const TDes8& aFrameData );
+
+ protected: // From CAmrPayloadFormatter
+
+ /**
+ * Initializes encoder. Encoder should be initialized when starting
+ * playing.
+ *
+ * @since Series 60 3.0
+ * @param None
+ * @return void
+ */
+ virtual void DoInitialize();
+
+ protected: // Data
+
+ // Encoder for payload header
+ CAmrPayloadHeader* iHeaderEncoder;
+
+ // Encoder for TOC entry
+ CAmrTocEntry* iTocEntryEncoder;
+
+ // Encoder for frame data
+ TStreamEncoder iFrameEncoder;
+
+ // Total speech bits in current payload
+ TInt iTotalSpeechBits;
+
+ // Number of redundant frames to be sent
+ TInt iRedCount;
+
+ // Indicates is redundancy count of sent frames collected
+ TBool iRedIntervalCollected;
+
+ // Indicates how many NO_DATA frames is discarded at this round
+ TInt iFramesDiscarded;
+ private:
+
+ #ifdef TEST_EUNIT
+ friend class UT_CAmrPayloadEncoder;
+ friend class UT_CAmrPayloadFormatWrite;
+ #endif
+
+ };
+
+#endif // __AMRPAYLOADENCODER_H