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