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_ |