--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/inc/AmrCodec.h Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,364 @@
+/*
+ * Copyright (c) 2009 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: Telephony Multimedia Service
+ *
+ */
+
+
+#ifndef __AMRCODEC_H__
+#define __AMRCODEC_H__
+
+// INCLUDES
+
+#include <E32Base.h>
+
+
+// FORWARD DECLARATIONS
+
+class CAmrToPcmDecoderImpl;
+class CPcmToAmrEncoderImpl;
+
+
+// CLASS DECLARATION
+
+/**
+* TAmrDecParams
+* AMR decoding parameters.
+*/
+class TAmrDecParams
+ {
+public:
+ /**
+ * Default constructor.
+ */
+ inline TAmrDecParams();
+public:
+ // error concealment level (0 none, 1 default)
+ TInt iConcealment;
+ };
+
+TAmrDecParams::TAmrDecParams() :
+iConcealment(1) {}
+
+/**
+* TAmrEncParams
+* AMR encoding parameters.
+*/
+class TAmrEncParams
+ {
+public:
+ /**
+ * Default constructor.
+ */
+ inline TAmrEncParams();
+public:
+ // encoding mode 0-7 (0=MR475,1=MR515,...,7=MR122, default 7)
+ TInt iMode;
+ // DTX flag (TRUE or default FALSE)
+ TInt iDTX;
+ };
+
+TAmrEncParams::TAmrEncParams() :
+iMode(7), iDTX(0) {}
+
+
+// CLASS DEFINITIONS
+
+/**
+* TAmrFrameInfo
+* AMR frame info struct.
+*/
+class TAmrFrameInfo
+ {
+public:
+ /**
+ * Default constructor.
+ */
+ TAmrFrameInfo() {};
+public:
+ /**
+ * Returns the size of smallest AMR audio frame, i.e., the size of one DTX
+ * frame. NO DATA frames (size 1 byte) are not taken into account here.
+ *
+ * @since ?Series60_version
+ * @param none
+ * @return TInt
+ */
+ IMPORT_C static TInt MinFrameSize();
+
+ /**
+ * Returns the size of biggest AMR audio frame, i.e., the size of one EFR
+ * frame.
+ *
+ * @since ?Series60_version
+ * @param none
+ * @return TInt
+ */
+ IMPORT_C static TInt MaxFrameSize();
+
+ /**
+ * Returns the maximum number of samples per one audio channel in one
+ * AMR audio frame.
+ *
+ * @since ?Series60_version
+ * @param none
+ * @return TInt
+ */
+ IMPORT_C static TInt MaxFrameSamples();
+
+ /**
+ * Returns the maximum number audio channels in one frame.
+ *
+ * @since ?Series60_version
+ * @param none
+ * @return TInt
+ */
+ IMPORT_C static TInt MaxChannels();
+
+ /**
+ * Returns the size of one AMR frame header. The header must include
+ * all bits needed for determining the actual frame length.
+ *
+ * @since ?Series60_version
+ * @param none
+ * @return TInt Size of AMR frame header
+ */
+ IMPORT_C static TInt FrameHeaderSize();
+
+ /**
+ * Returns the size of frame described by given coding parameters. The only
+ * parameter used in calculation is the coding mode (iMode).
+ *
+ * @since ?Series60_version
+ * @param none
+ * @return TInt AMR frame size
+ */
+ IMPORT_C static TInt FrameSize(const TAmrFrameInfo& aInfo);
+public:
+ TInt iMode; // encoding mode
+ TInt iBitrate; // bitrate (kbit/s)
+ TInt iSamplingRate; // sampling frequency (Hz)
+ TInt iChannels; // number of channels
+ TInt iFrameSize; // encoded size (bytes)
+ TInt iFrameSamples; // decoded size (samples per channel)
+public:
+ TInt iSamplingRateOut; // sampling frequency after conversion (Hz)
+ TInt iChannelsOut; // number of audio channels after conversion (1 or 2)
+ TInt iFrameSamplesOut; // decoded size after conversion (samples per channel)
+ };
+
+/**
+* CAmrToPcmDecoder
+* Low level AMR decoding API.
+*/
+class CAmrToPcmDecoder : public CBase
+ {
+protected:
+ /**
+ * Default constructor.
+ */
+ IMPORT_C CAmrToPcmDecoder();
+
+ /**
+ * 2nd phase constructor. Constructs the decoder.
+ */
+ IMPORT_C void ConstructL();
+public:
+ /**
+ * Two-phased constructor. First allocates and constructs decoder
+ * and then resets it according to the given configuration.
+ *
+ * @since ?Series60_version
+ * @param aConf Decoder configuration params
+ * @return CAmrToPcmDecoder* Pointer to constructed decoder
+ */
+ IMPORT_C static CAmrToPcmDecoder* NewL(const TAmrDecParams& aConf);
+
+ /**
+ * Destructor
+ */
+ IMPORT_C virtual ~CAmrToPcmDecoder();
+
+ /**
+ * Initializes decoder and resets it into the default decoding state.
+ *
+ * @since ?Series60_version
+ * @param none
+ * @return void
+ */
+ IMPORT_C void Reset();
+
+ /**
+ * Initializes decoder and resets it according to the given configuration.
+ *
+ * @since ?Series60_version
+ * @param aConf Decoder configuration params
+ * @return void
+ */
+ IMPORT_C void Reset(const TAmrDecParams& aConf);
+
+ /**
+ * Calculates the frame size and returns information about the frame which
+ * starts from the beginning of aBuf. Returns 0, if the frame bit syntax is
+ * incorrect or not enough bits are available for calculating the frame size
+ * and the frame parameters (aBufLen < TAmrCodecParams::FrameHeaderSize).
+ *
+ * The frame parameters returned via aInfo are: mode, sampling frequency,
+ * number of channels, frame size (same as return value) and number of
+ * samples in this frame. See also TMdaRawAmrAudioCodec class.
+ *
+ * @since ?Series60_version
+ * @param aBuf Pointer to frame buffer
+ * @param aBufLen Length of frame buffer
+ * @param aInfo Reference to frame parameters
+ * @return TInt Length of frame in bytes
+ */
+ IMPORT_C static TInt FrameInfo(const TUint8* aBuf, TInt aBufLen, TAmrFrameInfo& aInfo);
+
+ /**
+ * A variation of the FrameInfo above, which takes into account the
+ * decoding switches in calculating iSampligRateOut, iChannelsOut
+ * and iFrameSamplesOut.Initializes decoder and resets it according
+ * to the given configuration.
+ *
+ * @since ?Series60_version
+ * @param aBuf Pointer to frame buffer
+ * @param aBufLen Length of frame buffer
+ * @param aInfo Reference to fram parameters
+ * @param aConf Reference to decoding switches
+ * @return TInt Length of frame in bytes
+ */
+ IMPORT_C static TInt FrameInfo(const TUint8* aBuf, TInt aBufLen, TAmrFrameInfo& aInfo, const TAmrDecParams& aConf);
+
+ /**
+ * This routine seeks the start position of the next frame and returns
+ * the byte position of its header. Returns aBufLen, if no valid frame
+ * can not be found (see FrameInfo). The seek progresses from the start
+ * of aBuf (0) toward the end of aBuf(aBufLen - 1).
+ *
+ * The level of syntax check depends on the number of bits available. At
+ * minimum the first frame header bits are checked only, but if more
+ * bits are available, they can be used to make the sync seek more robust.
+ * For succesful seek the whole frame does not need to exist in aBuf.
+ *
+ * @since ?Series60_version
+ * @param aBuf Pointer to frame buffer
+ * @param aBufLen Length of frame buffer
+ * @return TInt Frame position or aBufLen
+ */
+ IMPORT_C static TInt SeekSync(const TUint8* aBuf, TInt aBufLen);
+
+ /**
+ * Decodes one frame.
+ *
+ * @since ?Series60_version
+ * @param aSrc Pointer to bit stream buffer
+ * @param aSrcUsed Number of consumed bytes
+ * @param aDst Pointer to PCM buffer
+ * @param aDstLen Number of produced bytes
+ * @param aMuteFlag If ETrue this frame is muted
+ * @return TInt Non-zero if decoding failed
+ */
+ IMPORT_C TInt Decode(TUint8* aSrc, TInt& aSrcUsed, TUint8* aDst, TInt& aDstLen, TBool aMuteFlag);
+
+ /**
+ * Decodes one frame from aSrc to aDst1 and aDst2. NOTE: aDst1 or
+ * aDst2 can be NULL and in that case decoding to that buffer is not
+ * requested.
+ *
+ * @since ?Series60_version
+ * @param aSrc Pointer to bit stream buffer
+ * @param aSrcUsed Number of consumed bytes
+ * @param aDst1 Pointer to PCM sample buffer (time domain sample)
+ * @param aDst2 Pointer to frequency sample buffer (frequency domain sample)
+ * @param aDstLen1 Number of produced bytes in aDst1
+ * @param aDstLen2 Number of produced bytes in aDst2
+ * @param aMuteFlag If ETrue this frame is muted
+ * @return TInt Non-zero if decoding failed
+ */
+ IMPORT_C TInt Decode(TUint8* aSrc, TInt& aSrcUsed, TUint8* aDst1, TUint8* aDst2, TInt& aDstLen1, TInt& aDstLen2, TInt aMuteFlag);
+private:
+ CAmrToPcmDecoderImpl* iState;
+ };
+
+/**
+* CPcmToAmrEncoder
+* Low level AMR encoding API.
+*/
+class CPcmToAmrEncoder : public CBase
+ {
+protected:
+
+ /**
+ * Default constructor.
+ */
+ IMPORT_C CPcmToAmrEncoder();
+
+ /**
+ * 2nd phase constructor. Constructs the encoder.
+ */
+ IMPORT_C void ConstructL();
+public:
+
+ /**
+ * Two-phased constructor. First allocates and constructs encoder
+ * and then resets it according to the given configuration.
+ *
+ * @since ?Series60_version
+ * @param aConf Encoder configuration params
+ * @return CPcmToAmrEncoder* Pointer to constructed encoder
+ */
+ IMPORT_C static CPcmToAmrEncoder* NewL(const TAmrEncParams& aConf);
+
+ /**
+ * Destructor
+ */
+ IMPORT_C virtual ~CPcmToAmrEncoder();
+
+ /**
+ * Initializes encoder and resets encoder state.
+ *
+ * @since ?Series60_version
+ * @param none
+ * @return void
+ */
+ IMPORT_C void Reset();
+
+ /**
+ * Initializes encoder and resets it according to the given configuration.
+ *
+ * @since ?Series60_version
+ * @param aConf Encoder configuration params
+ * @return void
+ */
+ IMPORT_C void Reset(const TAmrEncParams& aConf);
+
+ /**
+ * Encodes one frame.
+ *
+ * @since ?Series60_version
+ * @param aSrc Pointer to PCM buffer
+ * @param aSrcUsed Number of consumed bytes
+ * @param aDst Pointer to bit stream buffer
+ * @param aDstLen Length of resulting frame
+ * @return TInt Non-zero if encoding failed
+ */
+ IMPORT_C TInt Encode(TUint8* aSrc, TInt& aSrcUsed, TUint8* aDst, TInt& aDstLen);
+private:
+ CPcmToAmrEncoderImpl* iState;
+ };
+
+#endif //__AMRCODEC_H__
+
+// End of File