1 /* 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_CNG_AUDIO_ENCODER_CNG_H_ 12 #define WEBRTC_MODULES_AUDIO_CODING_CODECS_CNG_AUDIO_ENCODER_CNG_H_ 13 14 #include <vector> 15 16 #include "webrtc/base/scoped_ptr.h" 17 #include "webrtc/common_audio/vad/include/vad.h" 18 #include "webrtc/modules/audio_coding/codecs/audio_encoder.h" 19 #include "webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h" 20 21 namespace webrtc { 22 23 // Deleter for use with scoped_ptr. 24 struct CngInstDeleter { operatorCngInstDeleter25 void operator()(CNG_enc_inst* ptr) const { WebRtcCng_FreeEnc(ptr); } 26 }; 27 28 class Vad; 29 30 class AudioEncoderCng final : public AudioEncoder { 31 public: 32 struct Config { 33 bool IsOk() const; 34 35 size_t num_channels = 1; 36 int payload_type = 13; 37 // Caller keeps ownership of the AudioEncoder object. 38 AudioEncoder* speech_encoder = nullptr; 39 Vad::Aggressiveness vad_mode = Vad::kVadNormal; 40 int sid_frame_interval_ms = 100; 41 int num_cng_coefficients = 8; 42 // The Vad pointer is mainly for testing. If a NULL pointer is passed, the 43 // AudioEncoderCng creates (and destroys) a Vad object internally. If an 44 // object is passed, the AudioEncoderCng assumes ownership of the Vad 45 // object. 46 Vad* vad = nullptr; 47 }; 48 49 explicit AudioEncoderCng(const Config& config); 50 ~AudioEncoderCng() override; 51 52 size_t MaxEncodedBytes() const override; 53 int SampleRateHz() const override; 54 size_t NumChannels() const override; 55 int RtpTimestampRateHz() const override; 56 size_t Num10MsFramesInNextPacket() const override; 57 size_t Max10MsFramesInAPacket() const override; 58 int GetTargetBitrate() const override; 59 EncodedInfo EncodeInternal(uint32_t rtp_timestamp, 60 rtc::ArrayView<const int16_t> audio, 61 size_t max_encoded_bytes, 62 uint8_t* encoded) override; 63 void Reset() override; 64 bool SetFec(bool enable) override; 65 bool SetDtx(bool enable) override; 66 bool SetApplication(Application application) override; 67 void SetMaxPlaybackRate(int frequency_hz) override; 68 void SetProjectedPacketLossRate(double fraction) override; 69 void SetTargetBitrate(int target_bps) override; 70 71 private: 72 EncodedInfo EncodePassive(size_t frames_to_encode, 73 size_t max_encoded_bytes, 74 uint8_t* encoded); 75 EncodedInfo EncodeActive(size_t frames_to_encode, 76 size_t max_encoded_bytes, 77 uint8_t* encoded); 78 size_t SamplesPer10msFrame() const; 79 80 AudioEncoder* speech_encoder_; 81 const int cng_payload_type_; 82 const int num_cng_coefficients_; 83 const int sid_frame_interval_ms_; 84 std::vector<int16_t> speech_buffer_; 85 std::vector<uint32_t> rtp_timestamps_; 86 bool last_frame_active_; 87 rtc::scoped_ptr<Vad> vad_; 88 rtc::scoped_ptr<CNG_enc_inst, CngInstDeleter> cng_inst_; 89 90 RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderCng); 91 }; 92 93 } // namespace webrtc 94 95 #endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_CNG_AUDIO_ENCODER_CNG_H_ 96