// // libtgvoip is free and unencumbered public domain software. // For more information, see http://unlicense.org or the UNLICENSE file // you should have received with this source code distribution. // #ifndef LIBTGVOIP_OPUSENCODER_H #define LIBTGVOIP_OPUSENCODER_H #include "controller/MediaStreamItf.h" #include "tools/threading.h" #include "tools/BlockingQueue.h" #include "tools/Buffers.h" #include "controller/audio/EchoCanceller.h" #include "tools/utils.h" #include #include struct OpusEncoder; namespace tgvoip { class OpusEncoder { public: TGVOIP_DISALLOW_COPY_AND_ASSIGN(OpusEncoder); OpusEncoder(MediaStreamItf *source, bool needSecondary); virtual ~OpusEncoder(); virtual void Start(); virtual void Stop(); void SetBitrate(uint32_t bitrate); void SetEchoCanceller(EchoCanceller *aec); void SetOutputFrameDuration(uint32_t duration); void SetPacketLoss(int percent); int GetPacketLoss(); uint32_t GetBitrate(); void SetDTX(bool enable); void SetLevelMeter(AudioLevelMeter *levelMeter); void SetCallback(std::function callback); void SetSecondaryEncoderEnabled(bool enabled); void SetVadMode(bool vad); void AddAudioEffect(effects::AudioEffect *effect); void RemoveAudioEffect(effects::AudioEffect *effect); int GetComplexity() { return complexity; } private: static size_t Callback(unsigned char *data, size_t len, void *param); void RunThread(); void Encode(int16_t *data, size_t len); void InvokeCallback(unsigned char *data, size_t length, unsigned char *secondaryData, size_t secondaryLength); MediaStreamItf *source; ::OpusEncoder *enc; ::OpusEncoder *secondaryEncoder; unsigned char buffer[4096]; std::atomic requestedBitrate; uint32_t currentBitrate; Thread *thread; BlockingQueue queue; BufferPool<960 * 2, 10> bufferPool; EchoCanceller *echoCanceller; std::atomic complexity; std::atomic running; uint32_t frameDuration; int packetLossPercent; AudioLevelMeter *levelMeter; bool secondaryEncoderEnabled; bool vadMode = false; uint32_t vadNoVoiceBitrate; std::vector postProcEffects; int secondaryEnabledBandwidth; int vadModeVoiceBandwidth; int vadModeNoVoiceBandwidth; bool wasSecondaryEncoderEnabled = false; std::function callback; }; } // namespace tgvoip #endif //LIBTGVOIP_OPUSENCODER_H