1663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org/*
2663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org *
4663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org *  Use of this source code is governed by a BSD-style license
5663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org *  that can be found in the LICENSE file in the root of the source
6663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org *  tree. An additional intellectual property rights grant can be found
7663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org *  in the file PATENTS.  All contributing project authors may
8663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org */
10663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org
113c652b67468d182bd36aee4c31557621be50cc92kjellander@webrtc.org#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_AUDIO_ENCODER_OPUS_H_
123c652b67468d182bd36aee4c31557621be50cc92kjellander@webrtc.org#define WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_AUDIO_ENCODER_OPUS_H_
13663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org
14663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org#include <vector>
15663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org
168967183bf79322c5cb3cbd99e9b7aa298228d0a2kwiberg#include "webrtc/base/constructormagic.h"
173c652b67468d182bd36aee4c31557621be50cc92kjellander@webrtc.org#include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h"
18663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org#include "webrtc/modules/audio_coding/codecs/audio_encoder.h"
19663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org
20663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.orgnamespace webrtc {
21663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org
2212cfc9b4dacd6942377df1f29a64bdbec591920ekwibergstruct CodecInst;
2313980253f0a76511b67a99315c0f7d050a830cb1henrik.lundin@webrtc.org
2413980253f0a76511b67a99315c0f7d050a830cb1henrik.lundin@webrtc.orgclass AudioEncoderOpus final : public AudioEncoder {
25663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org public:
267dba7860c79652593f0a643fc81fe35f8707e0dbminyue@webrtc.org  enum ApplicationMode {
277dba7860c79652593f0a643fc81fe35f8707e0dbminyue@webrtc.org    kVoip = 0,
287dba7860c79652593f0a643fc81fe35f8707e0dbminyue@webrtc.org    kAudio = 1,
297dba7860c79652593f0a643fc81fe35f8707e0dbminyue@webrtc.org  };
307dba7860c79652593f0a643fc81fe35f8707e0dbminyue@webrtc.org
31663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org  struct Config {
32663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org    bool IsOk() const;
3312cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg    int frame_size_ms = 20;
346955870806624479723addfae6dcf5d13968796cPeter Kasting    size_t num_channels = 1;
3512cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg    int payload_type = 120;
3612cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg    ApplicationMode application = kVoip;
3712cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg    int bitrate_bps = 64000;
3812cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg    bool fec_enabled = false;
3912cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg    int max_playback_rate_hz = 48000;
4012cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg    int complexity = kDefaultComplexity;
4112cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg    bool dtx_enabled = false;
4212cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg
4312cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg   private:
4412cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) || defined(WEBRTC_ARCH_ARM)
4512cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg    // If we are on Android, iOS and/or ARM, use a lower complexity setting as
4612cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg    // default, to save encoder complexity.
4712cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg    static const int kDefaultComplexity = 5;
4812cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg#else
4912cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg    static const int kDefaultComplexity = 9;
5012cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg#endif
51663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org  };
52663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org
53663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org  explicit AudioEncoderOpus(const Config& config);
5412cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  explicit AudioEncoderOpus(const CodecInst& codec_inst);
5514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  ~AudioEncoderOpus() override;
56663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org
5712cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  size_t MaxEncodedBytes() const override;
5814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  int SampleRateHz() const override;
596955870806624479723addfae6dcf5d13968796cPeter Kasting  size_t NumChannels() const override;
60dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  size_t Num10MsFramesInNextPacket() const override;
61dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  size_t Max10MsFramesInAPacket() const override;
623e89dbf45835896c8fd89f235f396d03bc2e6065Henrik Lundin  int GetTargetBitrate() const override;
633e89dbf45835896c8fd89f235f396d03bc2e6065Henrik Lundin
649afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org  EncodedInfo EncodeInternal(uint32_t rtp_timestamp,
65288886b2ec9a2dac730f115e9c3079d8439efe60kwiberg                             rtc::ArrayView<const int16_t> audio,
669afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org                             size_t max_encoded_bytes,
679afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org                             uint8_t* encoded) override;
68663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org
6912cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  void Reset() override;
70dcccab3ebb623df74fbb1425da2cb9d9a42439faKarl Wiberg  bool SetFec(bool enable) override;
71092041c1cdadeb82463ee79dfc291d60b41d35efMinyue Li
72092041c1cdadeb82463ee79dfc291d60b41d35efMinyue Li  // Set Opus DTX. Once enabled, Opus stops transmission, when it detects voice
73092041c1cdadeb82463ee79dfc291d60b41d35efMinyue Li  // being inactive. During that, it still sends 2 packets (one for content, one
74092041c1cdadeb82463ee79dfc291d60b41d35efMinyue Li  // for signaling) about every 400 ms.
75092041c1cdadeb82463ee79dfc291d60b41d35efMinyue Li  bool SetDtx(bool enable) override;
76092041c1cdadeb82463ee79dfc291d60b41d35efMinyue Li
77092041c1cdadeb82463ee79dfc291d60b41d35efMinyue Li  bool SetApplication(Application application) override;
783f5f1c2ad305a665fb2ecd3e31c57d405e19af97kwiberg  void SetMaxPlaybackRate(int frequency_hz) override;
7912cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  void SetProjectedPacketLossRate(double fraction) override;
8012cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  void SetTargetBitrate(int target_bps) override;
8112cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg
8212cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  // Getters for testing.
8312cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  double packet_loss_rate() const { return packet_loss_rate_; }
8412cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  ApplicationMode application() const { return config_.application; }
8512cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  bool dtx_enabled() const { return config_.dtx_enabled; }
8612cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg
8712cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg private:
8825702cb1628941427fa55e528f53483f239ae011pkasting  size_t Num10msFramesPerPacket() const;
8925702cb1628941427fa55e528f53483f239ae011pkasting  size_t SamplesPer10msFrame() const;
9012cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  bool RecreateEncoderInstance(const Config& config);
9112cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg
9212cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  Config config_;
9312cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  double packet_loss_rate_;
9412cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  std::vector<int16_t> input_buffer_;
9512cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  OpusEncInst* inst_;
9612cfc9b4dacd6942377df1f29a64bdbec591920ekwiberg  uint32_t first_timestamp_in_buffer_;
978967183bf79322c5cb3cbd99e9b7aa298228d0a2kwiberg  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderOpus);
98dcccab3ebb623df74fbb1425da2cb9d9a42439faKarl Wiberg};
99dcccab3ebb623df74fbb1425da2cb9d9a42439faKarl Wiberg
100663fdd02fde854b9765c500effd6b306681398f7kwiberg@webrtc.org}  // namespace webrtc
1018967183bf79322c5cb3cbd99e9b7aa298228d0a2kwiberg
1023c652b67468d182bd36aee4c31557621be50cc92kjellander@webrtc.org#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_AUDIO_ENCODER_OPUS_H_
103