/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 ******************************************************************************
 * @file    M4ENCODER_AudioCommon.h
 * @brief    VES audio encoders shell interface.
 * @note    This file defines the types internally used by the VES to abstract audio encoders
 ******************************************************************************
*/
#ifndef __M4ENCODER_AUDIOCOMMON_H__
#define __M4ENCODER_AUDIOCOMMON_H__

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#include "M4OSA_OptionID.h"     /* for M4OSA_OPTION_ID_CREATE() */
#include "M4OSA_CoreID.h"

#define M4ENCODER_AUDIO_NB_CHANNELS_MAX 2
/* WARNING: this value must be equal to the number of samples grabbed */
//#define M4ENCODER_AUDIO_PCM_SAMPLE_NUMBER 960    /* imposed by the AAC encoder. */
#define M4ENCODER_AUDIO_PCM_SAMPLE_NUMBER 1024    /* imposed by the AAC encoder. */


/**
 ******************************************************************************
 * enumeration    M4ENCODER_Audio_OptionID
 * @brief        This enum defines the core AAC shell encoder options
 ******************************************************************************
*/
typedef enum
{
 /* Maximum generated AU size */
    M4ENCODER_Audio_maxAUsize     = M4OSA_OPTION_ID_CREATE(M4_READ,M4ENCODER_AUDIO, 0x01)

} M4ENCODER_Audio_OptionID;


 /**
 ******************************************************************************
 * enum        M4ENCODER_SamplingFrequency
 * @brief    Thie enum defines the audio sampling frequency.
 ******************************************************************************
*/
typedef enum
{
    M4ENCODER_k8000Hz = 8000,
    M4ENCODER_k11025Hz = 11025,
    M4ENCODER_k12000Hz = 12000,
    M4ENCODER_k16000Hz = 16000,
    M4ENCODER_k22050Hz = 22050,
    M4ENCODER_k24000Hz = 24000,
    M4ENCODER_k32000Hz = 32000,
    M4ENCODER_k44100Hz = 44100,
    M4ENCODER_k48000Hz = 48000
} M4ENCODER_SamplingFrequency;


/**
 ******************************************************************************
 * enum        M4ENCODER_AudioFormat
 * @brief    This enum defines the audio compression formats.
 ******************************************************************************
*/
typedef enum
{
    M4ENCODER_kAMRNB = 0,
    M4ENCODER_kAAC,
    M4ENCODER_kAudioNULL,    /**< No compression */
    M4ENCODER_kMP3,
    M4ENCODER_kAudio_NB        /* number of encoders, keep it as last enum entry */

} M4ENCODER_AudioFormat;

/**
 ******************************************************************************
 * enum        M4ENCODER_ChannelNumber
 * @brief    Thie enum defines the number of audio channels.
 ******************************************************************************
*/
typedef enum
{
    M4ENCODER_kMono  = 0,
    M4ENCODER_kStereo,
    M4ENCODER_kStereoNoInterleave
} M4ENCODER_ChannelNumber;

/**
 ******************************************************************************
 * enum        M4ENCODER_AudioBitrate
 * @brief    Thie enum defines the avalaible bitrates.
 ******************************************************************************
*/
typedef enum
{
    M4ENCODER_kAudio_4_75_KBPS    = 4750,
    M4ENCODER_kAudio_5_15_KBPS    = 5150,
    M4ENCODER_kAudio_5_9_KBPS    = 5900,
    M4ENCODER_kAudio_6_7_KBPS    = 6700,
    M4ENCODER_kAudio_7_4_KBPS    = 7400,
    M4ENCODER_kAudio_7_95_KBPS    = 7950,
    M4ENCODER_kAudio_8_KBPS        = 8000,
    M4ENCODER_kAudio_10_2_KBPS    = 10200,
    M4ENCODER_kAudio_12_2_KBPS    = 12200,
    M4ENCODER_kAudio_16_KBPS    = 16000,
    M4ENCODER_kAudio_24_KBPS    = 24000,
    M4ENCODER_kAudio_32_KBPS    = 32000,
    M4ENCODER_kAudio_40_KBPS    = 40000,
    M4ENCODER_kAudio_48_KBPS    = 48000,
    M4ENCODER_kAudio_56_KBPS    = 56000,
    M4ENCODER_kAudio_64_KBPS    = 64000,
    M4ENCODER_kAudio_80_KBPS    = 80000,
    M4ENCODER_kAudio_96_KBPS    = 96000,
    M4ENCODER_kAudio_112_KBPS    = 112000,
    M4ENCODER_kAudio_128_KBPS    = 128000,
    M4ENCODER_kAudio_144_KBPS    = 144000,
    M4ENCODER_kAudio_160_KBPS    = 160000,
    M4ENCODER_kAudio_192_KBPS    = 192000,
    M4ENCODER_kAudio_224_KBPS    = 224000,
    M4ENCODER_kAudio_256_KBPS    = 256000,
    M4ENCODER_kAudio_320_KBPS    = 320000
} M4ENCODER_AudioBitrate;


/**
 ******************************************************************************
 * enum            M4ENCODER_AacRegulation
 * @brief        The current mode of the bitrate regulation.
 ******************************************************************************
*/
typedef enum
{
    M4ENCODER_kAacRegulNone = 0,    /**< no bitrate regulation */
    M4ENCODER_kAacBitReservoir        /**< better quality, but more CPU consumed */
} M4ENCODER_AacRegulation;

/**
 ******************************************************************************
 * enum        M4ENCODER_AmrSID
 * @brief    This enum defines the SID of the AMR encoder.
 ******************************************************************************
*/
typedef enum
{
    M4ENCODER_kAmrNoSID = 0     /**< no SID */
} M4ENCODER_AmrSID;

/**
 ******************************************************************************
 * struct    M4ENCODER_AacParams
 * @brief    This structure defines all the settings specific to the AAC encoder.
 ******************************************************************************
*/
typedef struct
{
    M4ENCODER_AacRegulation    Regulation;
    M4OSA_Bool                bHighSpeed;
    M4OSA_Bool                bTNS;
    M4OSA_Bool                bPNS;
    M4OSA_Bool                bIS;
    M4OSA_Bool                bMS;
} M4ENCODER_AacParams;

/**
 ******************************************************************************
 * struct    M4ENCODER_AudioParams
 * @brief    This structure defines all the settings avalaible when encoding audio.
 ******************************************************************************
*/
typedef struct s_M4ENCODER_AudioParams
{
    M4ENCODER_SamplingFrequency    Frequency;    /**< the sampling frequency */
    M4ENCODER_ChannelNumber        ChannelNum;    /**< the numbe of channels (mono, stereo, ..) */
    M4ENCODER_AudioBitrate        Bitrate;    /**<  bitrate, see enum  */
    M4ENCODER_AudioFormat        Format;        /**<  audio compression format, AMR, AAC ...  */
    union {
        M4ENCODER_AacParams        AacParam;
        M4ENCODER_AmrSID        AmrSID;
    } SpecifParam;                            /**< the audio encoder specific parameters */
} M4ENCODER_AudioParams;

/**
 ******************************************************************************
 * struct    M4ENCODER_AudioDecSpecificInfo
 * @brief    This structure describes the decoder specific info buffer.
 ******************************************************************************
*/
typedef struct
{
    M4OSA_MemAddr8    pInfo;        /**< the buffer adress */
    M4OSA_UInt32    infoSize;    /**< the buffer size in bytes */
} M4ENCODER_AudioDecSpecificInfo;

/**
 ******************************************************************************
 * struct    M4ENCODER_AudioBuffer
 * @brief    This structure defines the data buffer.
 ******************************************************************************
*/
typedef struct
{
    /**< the table of buffers (unused buffers are set to NULL) */
    M4OSA_MemAddr8    pTableBuffer[M4ENCODER_AUDIO_NB_CHANNELS_MAX];
    /**< the table of the size of corresponding buffer at same index */
    M4OSA_UInt32    pTableBufferSize[M4ENCODER_AUDIO_NB_CHANNELS_MAX];
} M4ENCODER_AudioBuffer;

typedef M4OSA_ERR (M4AE_init)        (M4OSA_Context* hContext, M4OSA_Void* pUserData);
typedef M4OSA_ERR (M4AE_cleanUp)    (M4OSA_Context pContext);
typedef M4OSA_ERR (M4AE_open)        (M4OSA_Context pContext, M4ENCODER_AudioParams *params,
                                        M4ENCODER_AudioDecSpecificInfo *decSpecInfo,
                                        M4OSA_Context grabberContext);
typedef M4OSA_ERR (M4AE_close)        (M4OSA_Context pContext);
typedef M4OSA_ERR (M4AE_step)         (M4OSA_Context pContext, M4ENCODER_AudioBuffer *inBuffer,
                                        M4ENCODER_AudioBuffer *outBuffer);
typedef M4OSA_ERR (M4AE_getOption)    (M4OSA_Context pContext, M4OSA_OptionID    option,
                                        M4OSA_DataOption *valuePtr);
/**
 ******************************************************************************
 * struct    M4ENCODER_AudioGlobalInterface
 * @brief    Defines all the functions required for an audio encoder shell.
 ******************************************************************************
*/
typedef struct _M4ENCODER_AudioGlobalInterface
{
    M4AE_init*        pFctInit;
    M4AE_cleanUp*    pFctCleanUp;
    M4AE_open*        pFctOpen;
    M4AE_close*        pFctClose;
    M4AE_step*        pFctStep;
    M4AE_getOption*    pFctGetOption;
} M4ENCODER_AudioGlobalInterface;


#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /*__M4ENCODER_AUDIOCOMMON_H__*/