Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(223)

Unified Diff: webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h

Issue 1868143002: Convert CNG into C++ and remove it from AudioDecoder (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Converted WebRtcCng to C++ Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..a1331a4004129e3682ba7e58bdf774ef43ea3592 100644
--- a/webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h
+++ b/webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h
@@ -12,152 +12,90 @@
#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/typedefs.h"
#define WEBRTC_CNG_MAX_LPC_ORDER 12
#define WEBRTC_CNG_MAX_OUTSIZE_ORDER 640
hlundin-webrtc 2016/04/13 07:05:24 This is only used inside the class, right? Make it
ossu 2016/04/13 11:57:07 It is used inside both, to check that the data inp
-/* 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;
kwiberg-webrtc 2016/04/12 13:35:31 We have a macro for this in constructormagic.h: RT
ossu 2016/04/12 13:54:49 There's been conversations on c-style, where using
hlundin-webrtc 2016/04/13 07:05:24 Don't leave them as copyable. Use either way to ba
ossu 2016/04/13 11:57:07 Alright, no copying!
+
+ void Reset();
+
+ /* Update the CN state when a new SID packet arrives.
hlundin-webrtc 2016/04/13 07:05:24 Updates... Also, I think you should make these blo
ossu 2016/04/13 11:57:07 Acknowledged.
+ * |SID| is a view of the SID packet without the headers.
+ */
+ void UpdateSid(rtc::ArrayView<const uint8_t> SID);
+
+ /* Generate comfort noise.
hlundin-webrtc 2016/04/13 07:05:23 Generates...
ossu 2016/04/13 11:57:06 Acknowledged.
+ * |outData| will be filled with samples - its size determines the number of
hlundin-webrtc 2016/04/13 07:05:24 out_data
ossu 2016/04/13 11:57:06 Acknowledged.
+ * samples generated. When |new_period| is true, CNG history will be reset
+ * before any audio is generated. Returns |false| if outData is too large
+ * (larger than WEBRTC_CNG_MAX_OUTSIZE_ORDER).
+ */
+ bool Generate(rtc::ArrayView<int16_t> outData, bool new_period);
hlundin-webrtc 2016/04/13 07:05:24 Change order of parameters. Input params go before
hlundin-webrtc 2016/04/13 07:05:24 out_data
ossu 2016/04/13 11:57:07 Acknowledged.
+
+ 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:
+ // Create a comfort noise encoder.
hlundin-webrtc 2016/04/13 07:05:24 Creates...
ossu 2016/04/13 11:57:07 Acknowledged.
+ // |fs| selects sample rate: 8000 for narrowband and 16000 for wideband
hlundin-webrtc 2016/04/13 07:05:24 End all sentences with .
ossu 2016/04/13 11:57:06 Acknowledged.
+ // |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;
+
+ // Reset the comfort noise encoder to its initial state.
hlundin-webrtc 2016/04/13 07:05:23 Resets...
ossu 2016/04/13 11:57:06 Acknowledged.
+ // Parameters are set as during construction.
+ void Reset(int fs, int interval, int quality);
kwiberg-webrtc 2016/04/12 13:35:31 Is this necessary? Can't the callers just make a n
ossu 2016/04/12 13:54:49 There was some code that used InitEnc before, so I
kwiberg-webrtc 2016/04/14 09:42:48 Yes please.
+
+ // Analyze background noise from |speech| and put coefficients in |output|.
hlundin-webrtc 2016/04/13 07:05:23 puts...
hlundin-webrtc 2016/04/13 07:05:23 Analyzes...
+ // Returns the number of coefficients generated, or -1 if too much input is
+ // provided. If |forceSID| is true, a SID frame is forced and the encoder
hlundin-webrtc 2016/04/13 07:05:24 force_sid
+ // reset.
+ // TODO(ossu): Clarify this behavior. Does it reset before or after encoding?
hlundin-webrtc 2016/04/13 07:05:24 I don't think it should reset all of the encoder s
+ // TODO(ossu): Should it fail if given too much input? Can't it just ignore
+ // the rest?
hlundin-webrtc 2016/04/13 07:05:24 Or maybe just DCHECK?
ossu 2016/04/13 11:57:06 DCHECK works. Is the right size always 640 or does
+ int Encode(rtc::ArrayView<const int16_t> speech,
+ rtc::ArrayView<uint8_t> output,
+ bool forceSID);
kwiberg-webrtc 2016/04/12 13:35:31 Consider outputting to an rtc::Buffer* instead, so
ossu 2016/04/12 13:54:49 Acknowledged.
hlundin-webrtc 2016/04/13 07:05:24 force_sid
ossu 2016/04/13 11:57:07 Acknowledged. Also, I guess force_sid should go be
+
+ 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_

Powered by Google App Engine
This is Rietveld 408576698