Home | History | Annotate | Download | only in opus
      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_OPUS_AUDIO_ENCODER_OPUS_H_
     12 #define WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_AUDIO_ENCODER_OPUS_H_
     13 
     14 #include <vector>
     15 
     16 #include "webrtc/base/constructormagic.h"
     17 #include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h"
     18 #include "webrtc/modules/audio_coding/codecs/audio_encoder.h"
     19 
     20 namespace webrtc {
     21 
     22 struct CodecInst;
     23 
     24 class AudioEncoderOpus final : public AudioEncoder {
     25  public:
     26   enum ApplicationMode {
     27     kVoip = 0,
     28     kAudio = 1,
     29   };
     30 
     31   struct Config {
     32     bool IsOk() const;
     33     int frame_size_ms = 20;
     34     size_t num_channels = 1;
     35     int payload_type = 120;
     36     ApplicationMode application = kVoip;
     37     int bitrate_bps = 64000;
     38     bool fec_enabled = false;
     39     int max_playback_rate_hz = 48000;
     40     int complexity = kDefaultComplexity;
     41     bool dtx_enabled = false;
     42 
     43    private:
     44 #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) || defined(WEBRTC_ARCH_ARM)
     45     // If we are on Android, iOS and/or ARM, use a lower complexity setting as
     46     // default, to save encoder complexity.
     47     static const int kDefaultComplexity = 5;
     48 #else
     49     static const int kDefaultComplexity = 9;
     50 #endif
     51   };
     52 
     53   explicit AudioEncoderOpus(const Config& config);
     54   explicit AudioEncoderOpus(const CodecInst& codec_inst);
     55   ~AudioEncoderOpus() override;
     56 
     57   size_t MaxEncodedBytes() const override;
     58   int SampleRateHz() const override;
     59   size_t NumChannels() const override;
     60   size_t Num10MsFramesInNextPacket() const override;
     61   size_t Max10MsFramesInAPacket() const override;
     62   int GetTargetBitrate() const override;
     63 
     64   EncodedInfo EncodeInternal(uint32_t rtp_timestamp,
     65                              rtc::ArrayView<const int16_t> audio,
     66                              size_t max_encoded_bytes,
     67                              uint8_t* encoded) override;
     68 
     69   void Reset() override;
     70   bool SetFec(bool enable) override;
     71 
     72   // Set Opus DTX. Once enabled, Opus stops transmission, when it detects voice
     73   // being inactive. During that, it still sends 2 packets (one for content, one
     74   // for signaling) about every 400 ms.
     75   bool SetDtx(bool enable) override;
     76 
     77   bool SetApplication(Application application) override;
     78   void SetMaxPlaybackRate(int frequency_hz) override;
     79   void SetProjectedPacketLossRate(double fraction) override;
     80   void SetTargetBitrate(int target_bps) override;
     81 
     82   // Getters for testing.
     83   double packet_loss_rate() const { return packet_loss_rate_; }
     84   ApplicationMode application() const { return config_.application; }
     85   bool dtx_enabled() const { return config_.dtx_enabled; }
     86 
     87  private:
     88   size_t Num10msFramesPerPacket() const;
     89   size_t SamplesPer10msFrame() const;
     90   bool RecreateEncoderInstance(const Config& config);
     91 
     92   Config config_;
     93   double packet_loss_rate_;
     94   std::vector<int16_t> input_buffer_;
     95   OpusEncInst* inst_;
     96   uint32_t first_timestamp_in_buffer_;
     97   RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderOpus);
     98 };
     99 
    100 }  // namespace webrtc
    101 
    102 #endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_AUDIO_ENCODER_OPUS_H_
    103