inc/AmrCodec.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 21 Jun 2010 16:15:34 +0300
branchRCL_3
changeset 15 ab526b8cacfb
parent 0 71ca22bcf22a
permissions -rw-r--r--
Revision: 201023 Kit: 2010125

/*
 * 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