Regression test for issue where Opus DTX status was being forgotten.
BUG=webrtc:6020
Review-Url: https://codereview.webrtc.org/2177263002
Cr-Commit-Position: refs/heads/master@{#13539}
diff --git a/webrtc/modules/audio_coding/acm2/audio_coding_module.cc b/webrtc/modules/audio_coding/acm2/audio_coding_module.cc
index b394c59..3f404f7 100644
--- a/webrtc/modules/audio_coding/acm2/audio_coding_module.cc
+++ b/webrtc/modules/audio_coding/acm2/audio_coding_module.cc
@@ -48,6 +48,8 @@
void ModifyEncoder(
FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) override;
+ void QueryEncoder(FunctionView<void(const AudioEncoder*)> query) override;
+
// Get current send codec.
rtc::Optional<CodecInst> SendCodec() const override;
@@ -596,6 +598,12 @@
modifier(&encoder_stack_);
}
+void AudioCodingModuleImpl::QueryEncoder(
+ FunctionView<void(const AudioEncoder*)> query) {
+ rtc::CritScope lock(&acm_crit_sect_);
+ query(encoder_stack_.get());
+}
+
// Get current send codec.
rtc::Optional<CodecInst> AudioCodingModuleImpl::SendCodec() const {
rtc::CritScope lock(&acm_crit_sect_);
diff --git a/webrtc/modules/audio_coding/codecs/audio_encoder.cc b/webrtc/modules/audio_coding/codecs/audio_encoder.cc
index 6b7f5f8..c433dcd 100644
--- a/webrtc/modules/audio_coding/codecs/audio_encoder.cc
+++ b/webrtc/modules/audio_coding/codecs/audio_encoder.cc
@@ -50,6 +50,10 @@
return !enable;
}
+bool AudioEncoder::GetDtx() const {
+ return false;
+}
+
bool AudioEncoder::SetApplication(Application application) {
return false;
}
diff --git a/webrtc/modules/audio_coding/codecs/audio_encoder.h b/webrtc/modules/audio_coding/codecs/audio_encoder.h
index ecc28d9..f09525f 100644
--- a/webrtc/modules/audio_coding/codecs/audio_encoder.h
+++ b/webrtc/modules/audio_coding/codecs/audio_encoder.h
@@ -127,6 +127,10 @@
// supported).
virtual bool SetDtx(bool enable);
+ // Returns the status of codec-internal DTX. The default implementation always
+ // returns false.
+ virtual bool GetDtx() const;
+
// Sets the application mode. Returns true if the codec was able to comply.
// The default implementation just returns false.
enum class Application { kSpeech, kAudio };
diff --git a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
index edafbbd..d03f2d3 100644
--- a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
+++ b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
@@ -152,6 +152,10 @@
return RecreateEncoderInstance(conf);
}
+bool AudioEncoderOpus::GetDtx() const {
+ return config_.dtx_enabled;
+}
+
bool AudioEncoderOpus::SetApplication(Application application) {
auto conf = config_;
switch (application) {
diff --git a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h
index 367c9b9..48fb494 100644
--- a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h
+++ b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h
@@ -75,6 +75,7 @@
// being inactive. During that, it still sends 2 packets (one for content, one
// for signaling) about every 400 ms.
bool SetDtx(bool enable) override;
+ bool GetDtx() const override;
bool SetApplication(Application application) override;
void SetMaxPlaybackRate(int frequency_hz) override;
@@ -84,7 +85,6 @@
// Getters for testing.
double packet_loss_rate() const { return packet_loss_rate_; }
ApplicationMode application() const { return config_.application; }
- bool dtx_enabled() const { return config_.dtx_enabled; }
protected:
EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
diff --git a/webrtc/modules/audio_coding/include/audio_coding_module.h b/webrtc/modules/audio_coding/include/audio_coding_module.h
index 5b35bcf..30a17f7 100644
--- a/webrtc/modules/audio_coding/include/audio_coding_module.h
+++ b/webrtc/modules/audio_coding/include/audio_coding_module.h
@@ -250,6 +250,10 @@
virtual void ModifyEncoder(
FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) = 0;
+ // |modifier| is called exactly once with one argument: a const pointer to the
+ // current encoder (which is null if there is no current encoder).
+ virtual void QueryEncoder(FunctionView<void(AudioEncoder const*)> query) = 0;
+
// Utility method for simply replacing the existing encoder with a new one.
void SetEncoder(std::unique_ptr<AudioEncoder> new_encoder) {
ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {