From 0b05879cd7be89a68f5e189f6f8c610480694b3a Mon Sep 17 00:00:00 2001 From: Karl Wiberg Date: Tue, 15 Sep 2015 17:28:18 +0200 Subject: [PATCH] Move AudioDecoderOpus next to AudioEncoderOpus All AudioDecoder subclasses have historically lived in NetEq, but they fit better with the codec they wrap. BUG=webrtc:4557 R=henrik.lundin@webrtc.org Review URL: https://codereview.webrtc.org/1342933005 . Cr-Commit-Position: refs/heads/master@{#9944} --- webrtc/modules/audio_coding/BUILD.gn | 2 + .../codecs/opus/audio_decoder_opus.cc | 94 +++++++++++++++++++ .../opus/interface/audio_decoder_opus.h | 51 ++++++++++ .../audio_coding/codecs/opus/opus.gypi | 2 + .../audio_coding/main/test/opus_test.h | 1 + .../audio_coding/neteq/audio_decoder_impl.cc | 82 +--------------- .../audio_coding/neteq/audio_decoder_impl.h | 35 ------- .../neteq/audio_decoder_unittest.cc | 1 + .../neteq/neteq_network_stats_unittest.cc | 2 +- 9 files changed, 153 insertions(+), 117 deletions(-) create mode 100644 webrtc/modules/audio_coding/codecs/opus/audio_decoder_opus.cc create mode 100644 webrtc/modules/audio_coding/codecs/opus/interface/audio_decoder_opus.h diff --git a/webrtc/modules/audio_coding/BUILD.gn b/webrtc/modules/audio_coding/BUILD.gn index 235eb3c2b0..fd96219374 100644 --- a/webrtc/modules/audio_coding/BUILD.gn +++ b/webrtc/modules/audio_coding/BUILD.gn @@ -662,7 +662,9 @@ config("opus_config") { source_set("webrtc_opus") { sources = [ + "codecs/opus/audio_decoder_opus.cc", "codecs/opus/audio_encoder_opus.cc", + "codecs/opus/interface/audio_decoder_opus.h", "codecs/opus/interface/audio_encoder_opus.h", "codecs/opus/interface/opus_interface.h", "codecs/opus/opus_inst.h", diff --git a/webrtc/modules/audio_coding/codecs/opus/audio_decoder_opus.cc b/webrtc/modules/audio_coding/codecs/opus/audio_decoder_opus.cc new file mode 100644 index 0000000000..e78fc04452 --- /dev/null +++ b/webrtc/modules/audio_coding/codecs/opus/audio_decoder_opus.cc @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "webrtc/modules/audio_coding/codecs/opus/interface/audio_decoder_opus.h" + +#include "webrtc/base/checks.h" + +namespace webrtc { + +AudioDecoderOpus::AudioDecoderOpus(size_t num_channels) + : channels_(num_channels) { + DCHECK(num_channels == 1 || num_channels == 2); + WebRtcOpus_DecoderCreate(&dec_state_, static_cast(channels_)); + WebRtcOpus_DecoderInit(dec_state_); +} + +AudioDecoderOpus::~AudioDecoderOpus() { + WebRtcOpus_DecoderFree(dec_state_); +} + +int AudioDecoderOpus::DecodeInternal(const uint8_t* encoded, + size_t encoded_len, + int sample_rate_hz, + int16_t* decoded, + SpeechType* speech_type) { + DCHECK_EQ(sample_rate_hz, 48000); + int16_t temp_type = 1; // Default is speech. + int ret = + WebRtcOpus_Decode(dec_state_, encoded, encoded_len, decoded, &temp_type); + if (ret > 0) + ret *= static_cast(channels_); // Return total number of samples. + *speech_type = ConvertSpeechType(temp_type); + return ret; +} + +int AudioDecoderOpus::DecodeRedundantInternal(const uint8_t* encoded, + size_t encoded_len, + int sample_rate_hz, + int16_t* decoded, + SpeechType* speech_type) { + if (!PacketHasFec(encoded, encoded_len)) { + // This packet is a RED packet. + return DecodeInternal(encoded, encoded_len, sample_rate_hz, decoded, + speech_type); + } + + DCHECK_EQ(sample_rate_hz, 48000); + int16_t temp_type = 1; // Default is speech. + int ret = WebRtcOpus_DecodeFec(dec_state_, encoded, encoded_len, decoded, + &temp_type); + if (ret > 0) + ret *= static_cast(channels_); // Return total number of samples. + *speech_type = ConvertSpeechType(temp_type); + return ret; +} + +void AudioDecoderOpus::Reset() { + WebRtcOpus_DecoderInit(dec_state_); +} + +int AudioDecoderOpus::PacketDuration(const uint8_t* encoded, + size_t encoded_len) const { + return WebRtcOpus_DurationEst(dec_state_, encoded, encoded_len); +} + +int AudioDecoderOpus::PacketDurationRedundant(const uint8_t* encoded, + size_t encoded_len) const { + if (!PacketHasFec(encoded, encoded_len)) { + // This packet is a RED packet. + return PacketDuration(encoded, encoded_len); + } + + return WebRtcOpus_FecDurationEst(encoded, encoded_len); +} + +bool AudioDecoderOpus::PacketHasFec(const uint8_t* encoded, + size_t encoded_len) const { + int fec; + fec = WebRtcOpus_PacketHasFec(encoded, encoded_len); + return (fec == 1); +} + +size_t AudioDecoderOpus::Channels() const { + return channels_; +} + +} // namespace webrtc diff --git a/webrtc/modules/audio_coding/codecs/opus/interface/audio_decoder_opus.h b/webrtc/modules/audio_coding/codecs/opus/interface/audio_decoder_opus.h new file mode 100644 index 0000000000..9fa77b0992 --- /dev/null +++ b/webrtc/modules/audio_coding/codecs/opus/interface/audio_decoder_opus.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_INTERFACE_AUDIO_DECODER_OPUS_H +#define WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_INTERFACE_AUDIO_DECODER_OPUS_H + +#include "webrtc/modules/audio_coding/codecs/audio_decoder.h" +#include "webrtc/modules/audio_coding/codecs/opus/interface/opus_interface.h" + +namespace webrtc { + +class AudioDecoderOpus : public AudioDecoder { + public: + explicit AudioDecoderOpus(size_t num_channels); + ~AudioDecoderOpus() override; + + void Reset() override; + int PacketDuration(const uint8_t* encoded, size_t encoded_len) const override; + int PacketDurationRedundant(const uint8_t* encoded, + size_t encoded_len) const override; + bool PacketHasFec(const uint8_t* encoded, size_t encoded_len) const override; + size_t Channels() const override; + + protected: + int DecodeInternal(const uint8_t* encoded, + size_t encoded_len, + int sample_rate_hz, + int16_t* decoded, + SpeechType* speech_type) override; + int DecodeRedundantInternal(const uint8_t* encoded, + size_t encoded_len, + int sample_rate_hz, + int16_t* decoded, + SpeechType* speech_type) override; + + private: + OpusDecInst* dec_state_; + const size_t channels_; + DISALLOW_COPY_AND_ASSIGN(AudioDecoderOpus); +}; + +} // namespace webrtc + +#endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_INTERFACE_AUDIO_DECODER_OPUS_H diff --git a/webrtc/modules/audio_coding/codecs/opus/opus.gypi b/webrtc/modules/audio_coding/codecs/opus/opus.gypi index 4ae4340361..5a420b4fcf 100644 --- a/webrtc/modules/audio_coding/codecs/opus/opus.gypi +++ b/webrtc/modules/audio_coding/codecs/opus/opus.gypi @@ -43,7 +43,9 @@ '<(webrtc_root)', ], 'sources': [ + 'audio_decoder_opus.cc', 'audio_encoder_opus.cc', + 'interface/audio_decoder_opus.h', 'interface/audio_encoder_opus.h', 'interface/opus_interface.h', 'opus_inst.h', diff --git a/webrtc/modules/audio_coding/main/test/opus_test.h b/webrtc/modules/audio_coding/main/test/opus_test.h index 4c3d8c160e..63945ccd28 100644 --- a/webrtc/modules/audio_coding/main/test/opus_test.h +++ b/webrtc/modules/audio_coding/main/test/opus_test.h @@ -14,6 +14,7 @@ #include #include "webrtc/base/scoped_ptr.h" +#include "webrtc/modules/audio_coding/codecs/opus/interface/opus_interface.h" #include "webrtc/modules/audio_coding/main/acm2/acm_resampler.h" #include "webrtc/modules/audio_coding/main/test/ACMTest.h" #include "webrtc/modules/audio_coding/main/test/Channel.h" diff --git a/webrtc/modules/audio_coding/neteq/audio_decoder_impl.cc b/webrtc/modules/audio_coding/neteq/audio_decoder_impl.cc index 592f17b097..2e05fe1c51 100644 --- a/webrtc/modules/audio_coding/neteq/audio_decoder_impl.cc +++ b/webrtc/modules/audio_coding/neteq/audio_decoder_impl.cc @@ -29,7 +29,7 @@ #include "webrtc/modules/audio_coding/codecs/isac/main/interface/audio_encoder_isac.h" #endif #ifdef WEBRTC_CODEC_OPUS -#include "webrtc/modules/audio_coding/codecs/opus/interface/opus_interface.h" +#include "webrtc/modules/audio_coding/codecs/opus/interface/audio_decoder_opus.h" #endif #ifdef WEBRTC_CODEC_PCM16 #include "webrtc/modules/audio_coding/codecs/pcm16b/include/pcm16b.h" @@ -299,86 +299,6 @@ void AudioDecoderG722Stereo::SplitStereoPacket(const uint8_t* encoded, } #endif -// Opus -#ifdef WEBRTC_CODEC_OPUS -AudioDecoderOpus::AudioDecoderOpus(size_t num_channels) - : channels_(num_channels) { - DCHECK(num_channels == 1 || num_channels == 2); - WebRtcOpus_DecoderCreate(&dec_state_, static_cast(channels_)); - WebRtcOpus_DecoderInit(dec_state_); -} - -AudioDecoderOpus::~AudioDecoderOpus() { - WebRtcOpus_DecoderFree(dec_state_); -} - -int AudioDecoderOpus::DecodeInternal(const uint8_t* encoded, - size_t encoded_len, - int sample_rate_hz, - int16_t* decoded, - SpeechType* speech_type) { - DCHECK_EQ(sample_rate_hz, 48000); - int16_t temp_type = 1; // Default is speech. - int ret = WebRtcOpus_Decode(dec_state_, encoded, encoded_len, decoded, - &temp_type); - if (ret > 0) - ret *= static_cast(channels_); // Return total number of samples. - *speech_type = ConvertSpeechType(temp_type); - return ret; -} - -int AudioDecoderOpus::DecodeRedundantInternal(const uint8_t* encoded, - size_t encoded_len, - int sample_rate_hz, - int16_t* decoded, - SpeechType* speech_type) { - if (!PacketHasFec(encoded, encoded_len)) { - // This packet is a RED packet. - return DecodeInternal(encoded, encoded_len, sample_rate_hz, decoded, - speech_type); - } - - DCHECK_EQ(sample_rate_hz, 48000); - int16_t temp_type = 1; // Default is speech. - int ret = WebRtcOpus_DecodeFec(dec_state_, encoded, encoded_len, decoded, - &temp_type); - if (ret > 0) - ret *= static_cast(channels_); // Return total number of samples. - *speech_type = ConvertSpeechType(temp_type); - return ret; -} - -void AudioDecoderOpus::Reset() { - WebRtcOpus_DecoderInit(dec_state_); -} - -int AudioDecoderOpus::PacketDuration(const uint8_t* encoded, - size_t encoded_len) const { - return WebRtcOpus_DurationEst(dec_state_, encoded, encoded_len); -} - -int AudioDecoderOpus::PacketDurationRedundant(const uint8_t* encoded, - size_t encoded_len) const { - if (!PacketHasFec(encoded, encoded_len)) { - // This packet is a RED packet. - return PacketDuration(encoded, encoded_len); - } - - return WebRtcOpus_FecDurationEst(encoded, encoded_len); -} - -bool AudioDecoderOpus::PacketHasFec(const uint8_t* encoded, - size_t encoded_len) const { - int fec; - fec = WebRtcOpus_PacketHasFec(encoded, encoded_len); - return (fec == 1); -} - -size_t AudioDecoderOpus::Channels() const { - return channels_; -} -#endif - AudioDecoderCng::AudioDecoderCng() { CHECK_EQ(0, WebRtcCng_CreateDec(&dec_state_)); WebRtcCng_InitDec(dec_state_); diff --git a/webrtc/modules/audio_coding/neteq/audio_decoder_impl.h b/webrtc/modules/audio_coding/neteq/audio_decoder_impl.h index f2ca711383..6be344b084 100644 --- a/webrtc/modules/audio_coding/neteq/audio_decoder_impl.h +++ b/webrtc/modules/audio_coding/neteq/audio_decoder_impl.h @@ -27,9 +27,6 @@ #ifdef WEBRTC_CODEC_ILBC #include "webrtc/modules/audio_coding/codecs/ilbc/interface/ilbc.h" #endif -#ifdef WEBRTC_CODEC_OPUS -#include "webrtc/modules/audio_coding/codecs/opus/interface/opus_interface.h" -#endif #include "webrtc/typedefs.h" namespace webrtc { @@ -206,38 +203,6 @@ class AudioDecoderG722Stereo : public AudioDecoder { }; #endif -#ifdef WEBRTC_CODEC_OPUS -class AudioDecoderOpus : public AudioDecoder { - public: - explicit AudioDecoderOpus(size_t num_channels); - ~AudioDecoderOpus() override; - - void Reset() override; - int PacketDuration(const uint8_t* encoded, size_t encoded_len) const override; - int PacketDurationRedundant(const uint8_t* encoded, - size_t encoded_len) const override; - bool PacketHasFec(const uint8_t* encoded, size_t encoded_len) const override; - size_t Channels() const override; - - protected: - int DecodeInternal(const uint8_t* encoded, - size_t encoded_len, - int sample_rate_hz, - int16_t* decoded, - SpeechType* speech_type) override; - int DecodeRedundantInternal(const uint8_t* encoded, - size_t encoded_len, - int sample_rate_hz, - int16_t* decoded, - SpeechType* speech_type) override; - - private: - OpusDecInst* dec_state_; - const size_t channels_; - DISALLOW_COPY_AND_ASSIGN(AudioDecoderOpus); -}; -#endif - // AudioDecoderCng is a special type of AudioDecoder. It inherits from // AudioDecoder just to fit in the DecoderDatabase. None of the class methods // should be used, except constructor, destructor, and accessors. diff --git a/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc b/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc index 392e3dccd3..54dcdf5d1f 100644 --- a/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc +++ b/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc @@ -23,6 +23,7 @@ #include "webrtc/modules/audio_coding/codecs/ilbc/interface/audio_encoder_ilbc.h" #include "webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_encoder_isacfix.h" #include "webrtc/modules/audio_coding/codecs/isac/main/interface/audio_encoder_isac.h" +#include "webrtc/modules/audio_coding/codecs/opus/interface/audio_decoder_opus.h" #include "webrtc/modules/audio_coding/codecs/opus/interface/audio_encoder_opus.h" #include "webrtc/modules/audio_coding/codecs/pcm16b/include/audio_encoder_pcm16b.h" #include "webrtc/modules/audio_coding/neteq/tools/resample_input_audio_file.h" diff --git a/webrtc/modules/audio_coding/neteq/neteq_network_stats_unittest.cc b/webrtc/modules/audio_coding/neteq/neteq_network_stats_unittest.cc index e6ac37cfff..e3a0cc17af 100644 --- a/webrtc/modules/audio_coding/neteq/neteq_network_stats_unittest.cc +++ b/webrtc/modules/audio_coding/neteq/neteq_network_stats_unittest.cc @@ -10,7 +10,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "webrtc/base/scoped_ptr.h" -#include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h" +#include "webrtc/modules/audio_coding/codecs/opus/interface/audio_decoder_opus.h" #include "webrtc/modules/audio_coding/neteq/tools/neteq_external_decoder_test.h" #include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h"