| Index: webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h | 
| diff --git a/webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h b/webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h | 
| index 64bea1e26f6f225dedf6d72deeb7c8ab89a5f5f7..fb0a53df270b0c71d9ba047586aeb69b5ceabdb9 100644 | 
| --- a/webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h | 
| +++ b/webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h | 
| @@ -12,152 +12,88 @@ | 
| #ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_CNG_WEBRTC_CNG_H_ | 
| #define WEBRTC_MODULES_AUDIO_CODING_CODECS_CNG_WEBRTC_CNG_H_ | 
|  | 
| -#include <stddef.h> | 
| -#include "webrtc/typedefs.h" | 
| +#include <cstddef> | 
|  | 
| -#ifdef __cplusplus | 
| -extern "C" { | 
| -#endif | 
| +#include "webrtc/base/array_view.h" | 
| +#include "webrtc/base/buffer.h" | 
| +#include "webrtc/typedefs.h" | 
|  | 
| #define WEBRTC_CNG_MAX_LPC_ORDER 12 | 
| -#define WEBRTC_CNG_MAX_OUTSIZE_ORDER 640 | 
| - | 
| -/* Define Error codes. */ | 
| - | 
| -/* 6100 Encoder */ | 
| -#define CNG_ENCODER_NOT_INITIATED               6120 | 
| -#define CNG_DISALLOWED_LPC_ORDER                6130 | 
| -#define CNG_DISALLOWED_FRAME_SIZE               6140 | 
| -#define CNG_DISALLOWED_SAMPLING_FREQUENCY       6150 | 
| -/* 6200 Decoder */ | 
| -#define CNG_DECODER_NOT_INITIATED               6220 | 
| - | 
| -typedef struct WebRtcCngEncInst CNG_enc_inst; | 
| -typedef struct WebRtcCngDecInst CNG_dec_inst; | 
| - | 
| -/**************************************************************************** | 
| - * WebRtcCng_CreateEnc/Dec(...) | 
| - * | 
| - * These functions create an instance to the specified structure | 
| - * | 
| - * Input: | 
| - *    - XXX_inst      : Pointer to created instance that should be created | 
| - * | 
| - * Return value       :  0 - Ok | 
| - *                      -1 - Error | 
| - */ | 
| -int16_t WebRtcCng_CreateEnc(CNG_enc_inst** cng_inst); | 
| -int16_t WebRtcCng_CreateDec(CNG_dec_inst** cng_inst); | 
| - | 
| -/**************************************************************************** | 
| - * WebRtcCng_InitEnc/Dec(...) | 
| - * | 
| - * This function initializes a instance | 
| - * | 
| - * Input: | 
| - *    - cng_inst      : Instance that should be initialized | 
| - * | 
| - *    - fs            : 8000 for narrowband and 16000 for wideband | 
| - *    - interval      : generate SID data every interval ms | 
| - *    - quality       : Number of refl. coefs, maximum allowed is 12 | 
| - * | 
| - * Output: | 
| - *    - cng_inst      : Initialized instance | 
| - * | 
| - * Return value       :  0 - Ok | 
| - *                      -1 - Error | 
| - */ | 
| - | 
| -int WebRtcCng_InitEnc(CNG_enc_inst* cng_inst, int fs, int16_t interval, | 
| -                      int16_t quality); | 
| -void WebRtcCng_InitDec(CNG_dec_inst* cng_inst); | 
| - | 
| -/**************************************************************************** | 
| - * WebRtcCng_FreeEnc/Dec(...) | 
| - * | 
| - * These functions frees the dynamic memory of a specified instance | 
| - * | 
| - * Input: | 
| - *    - cng_inst      : Pointer to created instance that should be freed | 
| - * | 
| - * Return value       :  0 - Ok | 
| - *                      -1 - Error | 
| - */ | 
| -int16_t WebRtcCng_FreeEnc(CNG_enc_inst* cng_inst); | 
| -int16_t WebRtcCng_FreeDec(CNG_dec_inst* cng_inst); | 
| - | 
| -/**************************************************************************** | 
| - * WebRtcCng_Encode(...) | 
| - * | 
| - * These functions analyzes background noise | 
| - * | 
| - * Input: | 
| - *    - cng_inst      : Pointer to created instance | 
| - *    - speech        : Signal to be analyzed | 
| - *    - nrOfSamples   : Size of speech vector | 
| - *    - forceSID      : not zero to force SID frame and reset | 
| - * | 
| - * Output: | 
| - *    - bytesOut      : Nr of bytes to transmit, might be 0 | 
| - * | 
| - * Return value       :  0 - Ok | 
| - *                      -1 - Error | 
| - */ | 
| -int WebRtcCng_Encode(CNG_enc_inst* cng_inst, int16_t* speech, | 
| -                     size_t nrOfSamples, uint8_t* SIDdata, | 
| -                     size_t* bytesOut, int16_t forceSID); | 
| - | 
| -/**************************************************************************** | 
| - * WebRtcCng_UpdateSid(...) | 
| - * | 
| - * These functions updates the CN state, when a new SID packet arrives | 
| - * | 
| - * Input: | 
| - *    - cng_inst      : Pointer to created instance that should be freed | 
| - *    - SID           : SID packet, all headers removed | 
| - *    - length        : Length in bytes of SID packet | 
| - * | 
| - * Return value       :  0 - Ok | 
| - *                      -1 - Error | 
| - */ | 
| -int16_t WebRtcCng_UpdateSid(CNG_dec_inst* cng_inst, uint8_t* SID, | 
| -                            size_t length); | 
| - | 
| -/**************************************************************************** | 
| - * WebRtcCng_Generate(...) | 
| - * | 
| - * These functions generates CN data when needed | 
| - * | 
| - * Input: | 
| - *    - cng_inst      : Pointer to created instance that should be freed | 
| - *    - outData       : pointer to area to write CN data | 
| - *    - nrOfSamples   : How much data to generate | 
| - *    - new_period    : >0 if a new period of CNG, will reset history | 
| - * | 
| - * Return value       :  0 - Ok | 
| - *                      -1 - Error | 
| - */ | 
| -int16_t WebRtcCng_Generate(CNG_dec_inst* cng_inst, int16_t* outData, | 
| -                           size_t nrOfSamples, int16_t new_period); | 
| - | 
| -/***************************************************************************** | 
| - * WebRtcCng_GetErrorCodeEnc/Dec(...) | 
| - * | 
| - * This functions can be used to check the error code of a CNG instance. When | 
| - * a function returns -1 a error code will be set for that instance. The | 
| - * function below extract the code of the last error that occurred in the | 
| - * specified instance. | 
| - * | 
| - * Input: | 
| - *    - CNG_inst    : CNG enc/dec instance | 
| - * | 
| - * Return value     : Error code | 
| - */ | 
| -int16_t WebRtcCng_GetErrorCodeEnc(CNG_enc_inst* cng_inst); | 
| -int16_t WebRtcCng_GetErrorCodeDec(CNG_dec_inst* cng_inst); | 
|  | 
| -#ifdef __cplusplus | 
| -} | 
| -#endif | 
| +namespace webrtc { | 
| + | 
| +class ComfortNoiseDecoder { | 
| + public: | 
| +  ComfortNoiseDecoder(); | 
| +  ~ComfortNoiseDecoder() = default; | 
| + | 
| +  ComfortNoiseDecoder(const ComfortNoiseDecoder&) = delete; | 
| +  ComfortNoiseDecoder& operator=(const ComfortNoiseDecoder&) = delete; | 
| + | 
| +  void Reset(); | 
| + | 
| +  // Updates the CN state when a new SID packet arrives. | 
| +  // |sid| is a view of the SID packet without the headers. | 
| +  void UpdateSid(rtc::ArrayView<const uint8_t> sid); | 
| + | 
| +  // Generates comfort noise. | 
| +  // |out_data| will be filled with samples - its size determines the number of | 
| +  // samples generated. When |new_period| is true, CNG history will be reset | 
| +  // before any audio is generated.  Returns |false| if outData is too large - | 
| +  // currently 640 bytes (equalling 10ms at 64kHz). | 
| +  // TODO(ossu): Specify better limits for the size of out_data. Either let it | 
| +  //             be unbounded or limit to 10ms in the current sample rate. | 
| +  bool Generate(rtc::ArrayView<int16_t> out_data, bool new_period); | 
| + | 
| + private: | 
| +  uint32_t dec_seed_; | 
| +  int32_t dec_target_energy_; | 
| +  int32_t dec_used_energy_; | 
| +  int16_t dec_target_reflCoefs_[WEBRTC_CNG_MAX_LPC_ORDER + 1]; | 
| +  int16_t dec_used_reflCoefs_[WEBRTC_CNG_MAX_LPC_ORDER + 1]; | 
| +  int16_t dec_filtstate_[WEBRTC_CNG_MAX_LPC_ORDER + 1]; | 
| +  int16_t dec_filtstateLow_[WEBRTC_CNG_MAX_LPC_ORDER + 1]; | 
| +  uint16_t dec_order_; | 
| +  int16_t dec_target_scale_factor_;  /* Q29 */ | 
| +  int16_t dec_used_scale_factor_;  /* Q29 */ | 
| +}; | 
| + | 
| +class ComfortNoiseEncoder { | 
| + public: | 
| +  // Creates a comfort noise encoder. | 
| +  // |fs| selects sample rate: 8000 for narrowband or 16000 for wideband. | 
| +  // |interval| sets the interval at which to generate SID data (in ms). | 
| +  // |quality| selects the number of refl. coeffs. Maximum allowed is 12. | 
| +  ComfortNoiseEncoder(int fs, int interval, int quality); | 
| +  ~ComfortNoiseEncoder() = default; | 
| + | 
| +  ComfortNoiseEncoder(const ComfortNoiseEncoder&) = delete; | 
| +  ComfortNoiseEncoder& operator=(const ComfortNoiseEncoder&) = delete; | 
| + | 
| +  // Resets the comfort noise encoder to its initial state. | 
| +  // Parameters are set as during construction. | 
| +  void Reset(int fs, int interval, int quality); | 
| + | 
| +  // Analyzes background noise from |speech| and appends coefficients to | 
| +  // |output|.  Returns the number of coefficients generated.  If |force_sid| is | 
| +  // true, a SID frame is forced and the internal sid interval counter is reset. | 
| +  // Will fail if the input size is too large (> 640 samples, see | 
| +  // ComfortNoiseDecoder::Generate). | 
| +  size_t Encode(rtc::ArrayView<const int16_t> speech, | 
| +                bool force_sid, | 
| +                rtc::Buffer* output); | 
| + | 
| + private: | 
| +  size_t enc_nrOfCoefs_; | 
| +  int enc_sampfreq_; | 
| +  int16_t enc_interval_; | 
| +  int16_t enc_msSinceSid_; | 
| +  int32_t enc_Energy_; | 
| +  int16_t enc_reflCoefs_[WEBRTC_CNG_MAX_LPC_ORDER + 1]; | 
| +  int32_t enc_corrVector_[WEBRTC_CNG_MAX_LPC_ORDER + 1]; | 
| +  uint32_t enc_seed_; | 
| +}; | 
| + | 
| +}  // namespace webrtc | 
|  | 
| #endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_CNG_WEBRTC_CNG_H_ | 
|  |