diff --git a/webrtc/modules/audio_coding/BUILD.gn b/webrtc/modules/audio_coding/BUILD.gn index 5d85db3e1a..5725ec03df 100644 --- a/webrtc/modules/audio_coding/BUILD.gn +++ b/webrtc/modules/audio_coding/BUILD.gn @@ -412,12 +412,14 @@ config("isac_config") { source_set("isac") { sources = [ + "codecs/isac/main/interface/audio_decoder_isac.h", "codecs/isac/main/interface/audio_encoder_isac.h", "codecs/isac/main/interface/isac.h", "codecs/isac/main/source/arith_routines.c", "codecs/isac/main/source/arith_routines.h", "codecs/isac/main/source/arith_routines_hist.c", "codecs/isac/main/source/arith_routines_logist.c", + "codecs/isac/main/source/audio_decoder_isac.cc", "codecs/isac/main/source/audio_encoder_isac.cc", "codecs/isac/main/source/bandwidth_estimator.c", "codecs/isac/main/source/bandwidth_estimator.h", @@ -439,6 +441,7 @@ source_set("isac") { "codecs/isac/main/source/filterbanks.c", "codecs/isac/main/source/intialize.c", "codecs/isac/main/source/isac.c", + "codecs/isac/main/source/isac_float_type.h", "codecs/isac/main/source/lattice.c", "codecs/isac/main/source/lpc_analysis.c", "codecs/isac/main/source/lpc_analysis.h", @@ -493,12 +496,14 @@ config("isac_fix_config") { source_set("isac_fix") { sources = [ + "codecs/isac/fix/interface/audio_decoder_isacfix.h", "codecs/isac/fix/interface/audio_encoder_isacfix.h", "codecs/isac/fix/interface/isacfix.h", "codecs/isac/fix/source/arith_routines.c", "codecs/isac/fix/source/arith_routines_hist.c", "codecs/isac/fix/source/arith_routines_logist.c", "codecs/isac/fix/source/arith_routins.h", + "codecs/isac/fix/source/audio_decoder_isacfix.cc", "codecs/isac/fix/source/audio_encoder_isacfix.cc", "codecs/isac/fix/source/bandwidth_estimator.c", "codecs/isac/fix/source/bandwidth_estimator.h", @@ -516,6 +521,7 @@ source_set("isac_fix") { "codecs/isac/fix/source/filterbanks.c", "codecs/isac/fix/source/filters.c", "codecs/isac/fix/source/initialize.c", + "codecs/isac/fix/source/isac_fix_type.h", "codecs/isac/fix/source/isacfix.c", "codecs/isac/fix/source/lattice.c", "codecs/isac/fix/source/lattice_c.c", diff --git a/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h b/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h new file mode 100644 index 0000000000..714fe2d22a --- /dev/null +++ b/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h @@ -0,0 +1,53 @@ +/* + * 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_ISAC_AUDIO_DECODER_ISAC_T_H_ +#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_AUDIO_DECODER_ISAC_T_H_ + +#include + +#include "webrtc/modules/audio_coding/codecs/audio_decoder.h" +#include "webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.h" + +namespace webrtc { + +template +class AudioDecoderIsacT final : public AudioDecoder { + public: + AudioDecoderIsacT(); + explicit AudioDecoderIsacT(LockedIsacBandwidthInfo* bwinfo); + ~AudioDecoderIsacT() override; + + bool HasDecodePlc() const override; + size_t DecodePlc(size_t num_frames, int16_t* decoded) override; + void Reset() override; + int IncomingPacket(const uint8_t* payload, + size_t payload_len, + uint16_t rtp_sequence_number, + uint32_t rtp_timestamp, + uint32_t arrival_timestamp) override; + int ErrorCode() override; + size_t Channels() const override; + int DecodeInternal(const uint8_t* encoded, + size_t encoded_len, + int sample_rate_hz, + int16_t* decoded, + SpeechType* speech_type) override; + + private: + typename T::instance_type* isac_state_; + LockedIsacBandwidthInfo* bwinfo_; + int decoder_sample_rate_hz_; + + RTC_DISALLOW_COPY_AND_ASSIGN(AudioDecoderIsacT); +}; + +} // namespace webrtc +#endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_AUDIO_DECODER_ISAC_T_H_ diff --git a/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h b/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h new file mode 100644 index 0000000000..126c129814 --- /dev/null +++ b/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h @@ -0,0 +1,108 @@ +/* + * 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_ISAC_AUDIO_DECODER_ISAC_T_IMPL_H_ +#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_AUDIO_DECODER_ISAC_T_IMPL_H_ + +#include "webrtc/modules/audio_coding/codecs/isac/main/interface/audio_decoder_isac.h" + +#include "webrtc/base/checks.h" + +namespace webrtc { + +template +AudioDecoderIsacT::AudioDecoderIsacT() + : AudioDecoderIsacT(nullptr) {} + +template +AudioDecoderIsacT::AudioDecoderIsacT(LockedIsacBandwidthInfo* bwinfo) + : bwinfo_(bwinfo), decoder_sample_rate_hz_(-1) { + RTC_CHECK_EQ(0, T::Create(&isac_state_)); + T::DecoderInit(isac_state_); + if (bwinfo_) { + IsacBandwidthInfo bi; + T::GetBandwidthInfo(isac_state_, &bi); + bwinfo_->Set(bi); + } +} + +template +AudioDecoderIsacT::~AudioDecoderIsacT() { + RTC_CHECK_EQ(0, T::Free(isac_state_)); +} + +template +int AudioDecoderIsacT::DecodeInternal(const uint8_t* encoded, + size_t encoded_len, + int sample_rate_hz, + int16_t* decoded, + SpeechType* speech_type) { + // We want to crate the illusion that iSAC supports 48000 Hz decoding, while + // in fact it outputs 32000 Hz. This is the iSAC fullband mode. + if (sample_rate_hz == 48000) + sample_rate_hz = 32000; + RTC_CHECK(sample_rate_hz == 16000 || sample_rate_hz == 32000) + << "Unsupported sample rate " << sample_rate_hz; + if (sample_rate_hz != decoder_sample_rate_hz_) { + RTC_CHECK_EQ(0, T::SetDecSampRate(isac_state_, sample_rate_hz)); + decoder_sample_rate_hz_ = sample_rate_hz; + } + int16_t temp_type = 1; // Default is speech. + int ret = + T::DecodeInternal(isac_state_, encoded, encoded_len, decoded, &temp_type); + *speech_type = ConvertSpeechType(temp_type); + return ret; +} + +template +bool AudioDecoderIsacT::HasDecodePlc() const { + return false; +} + +template +size_t AudioDecoderIsacT::DecodePlc(size_t num_frames, int16_t* decoded) { + return T::DecodePlc(isac_state_, decoded, num_frames); +} + +template +void AudioDecoderIsacT::Reset() { + T::DecoderInit(isac_state_); +} + +template +int AudioDecoderIsacT::IncomingPacket(const uint8_t* payload, + size_t payload_len, + uint16_t rtp_sequence_number, + uint32_t rtp_timestamp, + uint32_t arrival_timestamp) { + int ret = T::UpdateBwEstimate(isac_state_, payload, payload_len, + rtp_sequence_number, rtp_timestamp, + arrival_timestamp); + if (bwinfo_) { + IsacBandwidthInfo bwinfo; + T::GetBandwidthInfo(isac_state_, &bwinfo); + bwinfo_->Set(bwinfo); + } + return ret; +} + +template +int AudioDecoderIsacT::ErrorCode() { + return T::GetErrorCode(isac_state_); +} + +template +size_t AudioDecoderIsacT::Channels() const { + return 1; +} + +} // namespace webrtc + +#endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_AUDIO_DECODER_ISAC_T_IMPL_H_ diff --git a/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t.h b/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t.h index 50d369ba35..6b361b4146 100644 --- a/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t.h +++ b/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t.h @@ -13,7 +13,6 @@ #include -#include "webrtc/modules/audio_coding/codecs/audio_decoder.h" #include "webrtc/modules/audio_coding/codecs/audio_encoder.h" #include "webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.h" @@ -94,36 +93,5 @@ class AudioEncoderIsacT final : public AudioEncoder { RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderIsacT); }; -template -class AudioDecoderIsacT final : public AudioDecoder { - public: - AudioDecoderIsacT(); - explicit AudioDecoderIsacT(LockedIsacBandwidthInfo* bwinfo); - ~AudioDecoderIsacT() override; - - bool HasDecodePlc() const override; - size_t DecodePlc(size_t num_frames, int16_t* decoded) override; - void Reset() override; - int IncomingPacket(const uint8_t* payload, - size_t payload_len, - uint16_t rtp_sequence_number, - uint32_t rtp_timestamp, - uint32_t arrival_timestamp) override; - int ErrorCode() override; - size_t Channels() const override; - int DecodeInternal(const uint8_t* encoded, - size_t encoded_len, - int sample_rate_hz, - int16_t* decoded, - SpeechType* speech_type) override; - - private: - typename T::instance_type* isac_state_; - LockedIsacBandwidthInfo* bwinfo_; - int decoder_sample_rate_hz_; - - RTC_DISALLOW_COPY_AND_ASSIGN(AudioDecoderIsacT); -}; - } // namespace webrtc #endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_AUDIO_ENCODER_ISAC_T_H_ diff --git a/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h b/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h index 4122ee0bc5..fbc1ba9139 100644 --- a/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h +++ b/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h @@ -13,10 +13,7 @@ #include "webrtc/modules/audio_coding/codecs/isac/main/interface/audio_encoder_isac.h" -#include - #include "webrtc/base/checks.h" -#include "webrtc/modules/audio_coding/codecs/isac/main/interface/isac.h" namespace webrtc { @@ -193,92 +190,6 @@ void AudioEncoderIsacT::RecreateEncoderInstance(const Config& config) { config_ = config; } -template -AudioDecoderIsacT::AudioDecoderIsacT() - : AudioDecoderIsacT(nullptr) {} - -template -AudioDecoderIsacT::AudioDecoderIsacT(LockedIsacBandwidthInfo* bwinfo) - : bwinfo_(bwinfo), decoder_sample_rate_hz_(-1) { - RTC_CHECK_EQ(0, T::Create(&isac_state_)); - T::DecoderInit(isac_state_); - if (bwinfo_) { - IsacBandwidthInfo bi; - T::GetBandwidthInfo(isac_state_, &bi); - bwinfo_->Set(bi); - } -} - -template -AudioDecoderIsacT::~AudioDecoderIsacT() { - RTC_CHECK_EQ(0, T::Free(isac_state_)); -} - -template -int AudioDecoderIsacT::DecodeInternal(const uint8_t* encoded, - size_t encoded_len, - int sample_rate_hz, - int16_t* decoded, - SpeechType* speech_type) { - // We want to crate the illusion that iSAC supports 48000 Hz decoding, while - // in fact it outputs 32000 Hz. This is the iSAC fullband mode. - if (sample_rate_hz == 48000) - sample_rate_hz = 32000; - RTC_CHECK(sample_rate_hz == 16000 || sample_rate_hz == 32000) - << "Unsupported sample rate " << sample_rate_hz; - if (sample_rate_hz != decoder_sample_rate_hz_) { - RTC_CHECK_EQ(0, T::SetDecSampRate(isac_state_, sample_rate_hz)); - decoder_sample_rate_hz_ = sample_rate_hz; - } - int16_t temp_type = 1; // Default is speech. - int ret = - T::DecodeInternal(isac_state_, encoded, encoded_len, decoded, &temp_type); - *speech_type = ConvertSpeechType(temp_type); - return ret; -} - -template -bool AudioDecoderIsacT::HasDecodePlc() const { - return false; -} - -template -size_t AudioDecoderIsacT::DecodePlc(size_t num_frames, int16_t* decoded) { - return T::DecodePlc(isac_state_, decoded, num_frames); -} - -template -void AudioDecoderIsacT::Reset() { - T::DecoderInit(isac_state_); -} - -template -int AudioDecoderIsacT::IncomingPacket(const uint8_t* payload, - size_t payload_len, - uint16_t rtp_sequence_number, - uint32_t rtp_timestamp, - uint32_t arrival_timestamp) { - int ret = T::UpdateBwEstimate( - isac_state_, payload, payload_len, - rtp_sequence_number, rtp_timestamp, arrival_timestamp); - if (bwinfo_) { - IsacBandwidthInfo bwinfo; - T::GetBandwidthInfo(isac_state_, &bwinfo); - bwinfo_->Set(bwinfo); - } - return ret; -} - -template -int AudioDecoderIsacT::ErrorCode() { - return T::GetErrorCode(isac_state_); -} - -template -size_t AudioDecoderIsacT::Channels() const { - return 1; -} - } // namespace webrtc #endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_AUDIO_ENCODER_ISAC_T_IMPL_H_ diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_decoder_isacfix.h b/webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_decoder_isacfix.h new file mode 100644 index 0000000000..ed162a10ae --- /dev/null +++ b/webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_decoder_isacfix.h @@ -0,0 +1,22 @@ +/* + * 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_ISAC_FIX_INTERFACE_AUDIO_DECODER_ISACFIX_H_ +#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_INTERFACE_AUDIO_DECODER_ISACFIX_H_ + +#include "webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h" +#include "webrtc/modules/audio_coding/codecs/isac/fix/source/isac_fix_type.h" + +namespace webrtc { + +using AudioDecoderIsacFix = AudioDecoderIsacT; + +} // namespace webrtc +#endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_INTERFACE_AUDIO_DECODER_ISACFIX_H_ diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_encoder_isacfix.h b/webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_encoder_isacfix.h index 5bca23ec4e..00c0987749 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_encoder_isacfix.h +++ b/webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_encoder_isacfix.h @@ -11,116 +11,12 @@ #ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_INTERFACE_AUDIO_ENCODER_ISACFIX_H_ #define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_INTERFACE_AUDIO_ENCODER_ISACFIX_H_ -#include "webrtc/base/checks.h" -#include "webrtc/base/scoped_ptr.h" #include "webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t.h" -#include "webrtc/modules/audio_coding/codecs/isac/fix/interface/isacfix.h" +#include "webrtc/modules/audio_coding/codecs/isac/fix/source/isac_fix_type.h" namespace webrtc { -struct IsacFix { - typedef ISACFIX_MainStruct instance_type; - static const bool has_swb = false; - static const uint16_t kFixSampleRate = 16000; - static inline int16_t Control(instance_type* inst, - int32_t rate, - int framesize) { - return WebRtcIsacfix_Control(inst, rate, framesize); - } - static inline int16_t ControlBwe(instance_type* inst, - int32_t rate_bps, - int frame_size_ms, - int16_t enforce_frame_size) { - return WebRtcIsacfix_ControlBwe(inst, rate_bps, frame_size_ms, - enforce_frame_size); - } - static inline int16_t Create(instance_type** inst) { - return WebRtcIsacfix_Create(inst); - } - static inline int DecodeInternal(instance_type* inst, - const uint8_t* encoded, - size_t len, - int16_t* decoded, - int16_t* speech_type) { - return WebRtcIsacfix_Decode(inst, encoded, len, decoded, speech_type); - } - static inline size_t DecodePlc(instance_type* inst, - int16_t* decoded, - size_t num_lost_frames) { - return WebRtcIsacfix_DecodePlc(inst, decoded, num_lost_frames); - } - static inline void DecoderInit(instance_type* inst) { - WebRtcIsacfix_DecoderInit(inst); - } - static inline int Encode(instance_type* inst, - const int16_t* speech_in, - uint8_t* encoded) { - return WebRtcIsacfix_Encode(inst, speech_in, encoded); - } - static inline int16_t EncoderInit(instance_type* inst, int16_t coding_mode) { - return WebRtcIsacfix_EncoderInit(inst, coding_mode); - } - static inline uint16_t EncSampRate(instance_type* inst) { - return kFixSampleRate; - } - - static inline int16_t Free(instance_type* inst) { - return WebRtcIsacfix_Free(inst); - } - static inline void GetBandwidthInfo(instance_type* inst, - IsacBandwidthInfo* bwinfo) { - WebRtcIsacfix_GetBandwidthInfo(inst, bwinfo); - } - static inline int16_t GetErrorCode(instance_type* inst) { - return WebRtcIsacfix_GetErrorCode(inst); - } - - static inline int16_t GetNewFrameLen(instance_type* inst) { - return WebRtcIsacfix_GetNewFrameLen(inst); - } - static inline void SetBandwidthInfo(instance_type* inst, - const IsacBandwidthInfo* bwinfo) { - WebRtcIsacfix_SetBandwidthInfo(inst, bwinfo); - } - static inline int16_t SetDecSampRate(instance_type* inst, - uint16_t sample_rate_hz) { - RTC_DCHECK_EQ(sample_rate_hz, kFixSampleRate); - return 0; - } - static inline int16_t SetEncSampRate(instance_type* inst, - uint16_t sample_rate_hz) { - RTC_DCHECK_EQ(sample_rate_hz, kFixSampleRate); - return 0; - } - static inline void SetEncSampRateInDecoder(instance_type* inst, - uint16_t sample_rate_hz) { - RTC_DCHECK_EQ(sample_rate_hz, kFixSampleRate); - } - static inline void SetInitialBweBottleneck( - instance_type* inst, - int bottleneck_bits_per_second) { - WebRtcIsacfix_SetInitialBweBottleneck(inst, bottleneck_bits_per_second); - } - static inline int16_t UpdateBwEstimate(instance_type* inst, - const uint8_t* encoded, - size_t packet_size, - uint16_t rtp_seq_number, - uint32_t send_ts, - uint32_t arr_ts) { - return WebRtcIsacfix_UpdateBwEstimate(inst, encoded, packet_size, - rtp_seq_number, send_ts, arr_ts); - } - static inline int16_t SetMaxPayloadSize(instance_type* inst, - int16_t max_payload_size_bytes) { - return WebRtcIsacfix_SetMaxPayloadSize(inst, max_payload_size_bytes); - } - static inline int16_t SetMaxRate(instance_type* inst, int32_t max_bit_rate) { - return WebRtcIsacfix_SetMaxRate(inst, max_bit_rate); - } -}; - using AudioEncoderIsacFix = AudioEncoderIsacT; -using AudioDecoderIsacFix = AudioDecoderIsacT; } // namespace webrtc #endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_INTERFACE_AUDIO_ENCODER_ISACFIX_H_ diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/source/audio_decoder_isacfix.cc b/webrtc/modules/audio_coding/codecs/isac/fix/source/audio_decoder_isacfix.cc new file mode 100644 index 0000000000..8b4741b2cb --- /dev/null +++ b/webrtc/modules/audio_coding/codecs/isac/fix/source/audio_decoder_isacfix.cc @@ -0,0 +1,20 @@ +/* + * 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/isac/fix/interface/audio_decoder_isacfix.h" + +#include "webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h" + +namespace webrtc { + +// Explicit instantiation: +template class AudioDecoderIsacT; + +} // namespace webrtc diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/source/audio_encoder_isacfix.cc b/webrtc/modules/audio_coding/codecs/isac/fix/source/audio_encoder_isacfix.cc index 9b2f3174b8..ad75ea867e 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/source/audio_encoder_isacfix.cc +++ b/webrtc/modules/audio_coding/codecs/isac/fix/source/audio_encoder_isacfix.cc @@ -14,10 +14,7 @@ namespace webrtc { -const uint16_t IsacFix::kFixSampleRate; - // Explicit instantiation: template class AudioEncoderIsacT; -template class AudioDecoderIsacT; } // namespace webrtc diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/source/isac_fix_type.h b/webrtc/modules/audio_coding/codecs/isac/fix/source/isac_fix_type.h new file mode 100644 index 0000000000..69c73d6904 --- /dev/null +++ b/webrtc/modules/audio_coding/codecs/isac/fix/source/isac_fix_type.h @@ -0,0 +1,123 @@ +/* + * 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_ISAC_FIX_SOURCE_ISAC_FIX_TYPE_H_ +#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_ISAC_FIX_TYPE_H_ + +#include "webrtc/base/checks.h" +#include "webrtc/modules/audio_coding/codecs/isac/fix/interface/isacfix.h" + +namespace webrtc { + +class IsacFix { + public: + using instance_type = ISACFIX_MainStruct; + static const bool has_swb = false; + static inline int16_t Control(instance_type* inst, + int32_t rate, + int framesize) { + return WebRtcIsacfix_Control(inst, rate, framesize); + } + static inline int16_t ControlBwe(instance_type* inst, + int32_t rate_bps, + int frame_size_ms, + int16_t enforce_frame_size) { + return WebRtcIsacfix_ControlBwe(inst, rate_bps, frame_size_ms, + enforce_frame_size); + } + static inline int16_t Create(instance_type** inst) { + return WebRtcIsacfix_Create(inst); + } + static inline int DecodeInternal(instance_type* inst, + const uint8_t* encoded, + size_t len, + int16_t* decoded, + int16_t* speech_type) { + return WebRtcIsacfix_Decode(inst, encoded, len, decoded, speech_type); + } + static inline size_t DecodePlc(instance_type* inst, + int16_t* decoded, + size_t num_lost_frames) { + return WebRtcIsacfix_DecodePlc(inst, decoded, num_lost_frames); + } + static inline void DecoderInit(instance_type* inst) { + WebRtcIsacfix_DecoderInit(inst); + } + static inline int Encode(instance_type* inst, + const int16_t* speech_in, + uint8_t* encoded) { + return WebRtcIsacfix_Encode(inst, speech_in, encoded); + } + static inline int16_t EncoderInit(instance_type* inst, int16_t coding_mode) { + return WebRtcIsacfix_EncoderInit(inst, coding_mode); + } + static inline uint16_t EncSampRate(instance_type* inst) { + return kFixSampleRate; + } + + static inline int16_t Free(instance_type* inst) { + return WebRtcIsacfix_Free(inst); + } + static inline void GetBandwidthInfo(instance_type* inst, + IsacBandwidthInfo* bwinfo) { + WebRtcIsacfix_GetBandwidthInfo(inst, bwinfo); + } + static inline int16_t GetErrorCode(instance_type* inst) { + return WebRtcIsacfix_GetErrorCode(inst); + } + + static inline int16_t GetNewFrameLen(instance_type* inst) { + return WebRtcIsacfix_GetNewFrameLen(inst); + } + static inline void SetBandwidthInfo(instance_type* inst, + const IsacBandwidthInfo* bwinfo) { + WebRtcIsacfix_SetBandwidthInfo(inst, bwinfo); + } + static inline int16_t SetDecSampRate(instance_type* inst, + uint16_t sample_rate_hz) { + RTC_DCHECK_EQ(sample_rate_hz, kFixSampleRate); + return 0; + } + static inline int16_t SetEncSampRate(instance_type* inst, + uint16_t sample_rate_hz) { + RTC_DCHECK_EQ(sample_rate_hz, kFixSampleRate); + return 0; + } + static inline void SetEncSampRateInDecoder(instance_type* inst, + uint16_t sample_rate_hz) { + RTC_DCHECK_EQ(sample_rate_hz, kFixSampleRate); + } + static inline void SetInitialBweBottleneck(instance_type* inst, + int bottleneck_bits_per_second) { + WebRtcIsacfix_SetInitialBweBottleneck(inst, bottleneck_bits_per_second); + } + static inline int16_t UpdateBwEstimate(instance_type* inst, + const uint8_t* encoded, + size_t packet_size, + uint16_t rtp_seq_number, + uint32_t send_ts, + uint32_t arr_ts) { + return WebRtcIsacfix_UpdateBwEstimate(inst, encoded, packet_size, + rtp_seq_number, send_ts, arr_ts); + } + static inline int16_t SetMaxPayloadSize(instance_type* inst, + int16_t max_payload_size_bytes) { + return WebRtcIsacfix_SetMaxPayloadSize(inst, max_payload_size_bytes); + } + static inline int16_t SetMaxRate(instance_type* inst, int32_t max_bit_rate) { + return WebRtcIsacfix_SetMaxRate(inst, max_bit_rate); + } + + private: + enum { kFixSampleRate = 16000 }; +}; + +} // namespace webrtc +#endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_ISAC_FIX_TYPE_H_ diff --git a/webrtc/modules/audio_coding/codecs/isac/isac.gypi b/webrtc/modules/audio_coding/codecs/isac/isac.gypi index 8ecc2dc414..354719f330 100644 --- a/webrtc/modules/audio_coding/codecs/isac/isac.gypi +++ b/webrtc/modules/audio_coding/codecs/isac/isac.gypi @@ -28,11 +28,13 @@ ], }, 'sources': [ + 'main/interface/audio_decoder_isac.h', 'main/interface/audio_encoder_isac.h', 'main/interface/isac.h', 'main/source/arith_routines.c', 'main/source/arith_routines_hist.c', 'main/source/arith_routines_logist.c', + 'main/source/audio_decoder_isac.cc', 'main/source/audio_encoder_isac.cc', 'main/source/bandwidth_estimator.c', 'main/source/crc.c', @@ -46,6 +48,7 @@ 'main/source/filterbank_tables.c', 'main/source/intialize.c', 'main/source/isac.c', + 'main/source/isac_float_type.h', 'main/source/filterbanks.c', 'main/source/pitch_lag_tables.c', 'main/source/lattice.c', diff --git a/webrtc/modules/audio_coding/codecs/isac/isacfix.gypi b/webrtc/modules/audio_coding/codecs/isac/isacfix.gypi index 81b4375c21..4355fa92cc 100644 --- a/webrtc/modules/audio_coding/codecs/isac/isacfix.gypi +++ b/webrtc/modules/audio_coding/codecs/isac/isacfix.gypi @@ -27,11 +27,13 @@ ], }, 'sources': [ + 'fix/interface/audio_decoder_isacfix.h', 'fix/interface/audio_encoder_isacfix.h', 'fix/interface/isacfix.h', 'fix/source/arith_routines.c', 'fix/source/arith_routines_hist.c', 'fix/source/arith_routines_logist.c', + 'fix/source/audio_decoder_isacfix.cc', 'fix/source/audio_encoder_isacfix.cc', 'fix/source/bandwidth_estimator.c', 'fix/source/decode.c', @@ -44,6 +46,7 @@ 'fix/source/filterbanks.c', 'fix/source/filters.c', 'fix/source/initialize.c', + 'fix/source/isac_fix_type.h', 'fix/source/isacfix.c', 'fix/source/lattice.c', 'fix/source/lattice_c.c', diff --git a/webrtc/modules/audio_coding/codecs/isac/main/interface/audio_decoder_isac.h b/webrtc/modules/audio_coding/codecs/isac/main/interface/audio_decoder_isac.h new file mode 100644 index 0000000000..b224296ad4 --- /dev/null +++ b/webrtc/modules/audio_coding/codecs/isac/main/interface/audio_decoder_isac.h @@ -0,0 +1,22 @@ +/* + * 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_ISAC_MAIN_INTERFACE_AUDIO_DECODER_ISAC_H_ +#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INTERFACE_AUDIO_DECODER_ISAC_H_ + +#include "webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h" +#include "webrtc/modules/audio_coding/codecs/isac/main/source/isac_float_type.h" + +namespace webrtc { + +using AudioDecoderIsac = AudioDecoderIsacT; + +} // namespace webrtc +#endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INTERFACE_AUDIO_ENCODER_ISAC_H_ diff --git a/webrtc/modules/audio_coding/codecs/isac/main/interface/audio_encoder_isac.h b/webrtc/modules/audio_coding/codecs/isac/main/interface/audio_encoder_isac.h index da363d8c91..f6ef7c42fd 100644 --- a/webrtc/modules/audio_coding/codecs/isac/main/interface/audio_encoder_isac.h +++ b/webrtc/modules/audio_coding/codecs/isac/main/interface/audio_encoder_isac.h @@ -11,114 +11,12 @@ #ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INTERFACE_AUDIO_ENCODER_ISAC_H_ #define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INTERFACE_AUDIO_ENCODER_ISAC_H_ -#include "webrtc/base/checks.h" -#include "webrtc/base/scoped_ptr.h" #include "webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t.h" -#include "webrtc/modules/audio_coding/codecs/isac/main/interface/isac.h" +#include "webrtc/modules/audio_coding/codecs/isac/main/source/isac_float_type.h" namespace webrtc { -struct IsacFloat { - typedef ISACStruct instance_type; - static const bool has_swb = true; - static inline int16_t Control(instance_type* inst, - int32_t rate, - int framesize) { - return WebRtcIsac_Control(inst, rate, framesize); - } - static inline int16_t ControlBwe(instance_type* inst, - int32_t rate_bps, - int frame_size_ms, - int16_t enforce_frame_size) { - return WebRtcIsac_ControlBwe(inst, rate_bps, frame_size_ms, - enforce_frame_size); - } - static inline int16_t Create(instance_type** inst) { - return WebRtcIsac_Create(inst); - } - static inline int DecodeInternal(instance_type* inst, - const uint8_t* encoded, - size_t len, - int16_t* decoded, - int16_t* speech_type) { - return WebRtcIsac_Decode(inst, encoded, len, decoded, speech_type); - } - static inline size_t DecodePlc(instance_type* inst, - int16_t* decoded, - size_t num_lost_frames) { - return WebRtcIsac_DecodePlc(inst, decoded, num_lost_frames); - } - - static inline void DecoderInit(instance_type* inst) { - WebRtcIsac_DecoderInit(inst); - } - static inline int Encode(instance_type* inst, - const int16_t* speech_in, - uint8_t* encoded) { - return WebRtcIsac_Encode(inst, speech_in, encoded); - } - static inline int16_t EncoderInit(instance_type* inst, int16_t coding_mode) { - return WebRtcIsac_EncoderInit(inst, coding_mode); - } - static inline uint16_t EncSampRate(instance_type* inst) { - return WebRtcIsac_EncSampRate(inst); - } - - static inline int16_t Free(instance_type* inst) { - return WebRtcIsac_Free(inst); - } - static inline void GetBandwidthInfo(instance_type* inst, - IsacBandwidthInfo* bwinfo) { - WebRtcIsac_GetBandwidthInfo(inst, bwinfo); - } - static inline int16_t GetErrorCode(instance_type* inst) { - return WebRtcIsac_GetErrorCode(inst); - } - - static inline int16_t GetNewFrameLen(instance_type* inst) { - return WebRtcIsac_GetNewFrameLen(inst); - } - static inline void SetBandwidthInfo(instance_type* inst, - const IsacBandwidthInfo* bwinfo) { - WebRtcIsac_SetBandwidthInfo(inst, bwinfo); - } - static inline int16_t SetDecSampRate(instance_type* inst, - uint16_t sample_rate_hz) { - return WebRtcIsac_SetDecSampRate(inst, sample_rate_hz); - } - static inline int16_t SetEncSampRate(instance_type* inst, - uint16_t sample_rate_hz) { - return WebRtcIsac_SetEncSampRate(inst, sample_rate_hz); - } - static inline void SetEncSampRateInDecoder(instance_type* inst, - uint16_t sample_rate_hz) { - WebRtcIsac_SetEncSampRateInDecoder(inst, sample_rate_hz); - } - static inline void SetInitialBweBottleneck( - instance_type* inst, - int bottleneck_bits_per_second) { - WebRtcIsac_SetInitialBweBottleneck(inst, bottleneck_bits_per_second); - } - static inline int16_t UpdateBwEstimate(instance_type* inst, - const uint8_t* encoded, - size_t packet_size, - uint16_t rtp_seq_number, - uint32_t send_ts, - uint32_t arr_ts) { - return WebRtcIsac_UpdateBwEstimate(inst, encoded, packet_size, - rtp_seq_number, send_ts, arr_ts); - } - static inline int16_t SetMaxPayloadSize(instance_type* inst, - int16_t max_payload_size_bytes) { - return WebRtcIsac_SetMaxPayloadSize(inst, max_payload_size_bytes); - } - static inline int16_t SetMaxRate(instance_type* inst, int32_t max_bit_rate) { - return WebRtcIsac_SetMaxRate(inst, max_bit_rate); - } -}; - using AudioEncoderIsac = AudioEncoderIsacT; -using AudioDecoderIsac = AudioDecoderIsacT; } // namespace webrtc #endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INTERFACE_AUDIO_ENCODER_ISAC_H_ diff --git a/webrtc/modules/audio_coding/codecs/isac/main/source/audio_decoder_isac.cc b/webrtc/modules/audio_coding/codecs/isac/main/source/audio_decoder_isac.cc new file mode 100644 index 0000000000..89879adafb --- /dev/null +++ b/webrtc/modules/audio_coding/codecs/isac/main/source/audio_decoder_isac.cc @@ -0,0 +1,20 @@ +/* + * 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/isac/main/interface/audio_decoder_isac.h" + +#include "webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h" + +namespace webrtc { + +// Explicit instantiation: +template class AudioDecoderIsacT; + +} // namespace webrtc diff --git a/webrtc/modules/audio_coding/codecs/isac/main/source/audio_encoder_isac.cc b/webrtc/modules/audio_coding/codecs/isac/main/source/audio_encoder_isac.cc index eac7cc79e7..c72af307b7 100644 --- a/webrtc/modules/audio_coding/codecs/isac/main/source/audio_encoder_isac.cc +++ b/webrtc/modules/audio_coding/codecs/isac/main/source/audio_encoder_isac.cc @@ -16,6 +16,5 @@ namespace webrtc { // Explicit instantiation: template class AudioEncoderIsacT; -template class AudioDecoderIsacT; } // namespace webrtc diff --git a/webrtc/modules/audio_coding/codecs/isac/main/source/isac_float_type.h b/webrtc/modules/audio_coding/codecs/isac/main/source/isac_float_type.h new file mode 100644 index 0000000000..0335548be7 --- /dev/null +++ b/webrtc/modules/audio_coding/codecs/isac/main/source/isac_float_type.h @@ -0,0 +1,117 @@ +/* + * 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_ISAC_MAIN_SOURCE_ISAC_FLOAT_TYPE_H_ +#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ISAC_FLOAT_TYPE_H_ + +#include "webrtc/modules/audio_coding/codecs/isac/main/interface/isac.h" + +namespace webrtc { + +struct IsacFloat { + using instance_type = ISACStruct; + static const bool has_swb = true; + static inline int16_t Control(instance_type* inst, + int32_t rate, + int framesize) { + return WebRtcIsac_Control(inst, rate, framesize); + } + static inline int16_t ControlBwe(instance_type* inst, + int32_t rate_bps, + int frame_size_ms, + int16_t enforce_frame_size) { + return WebRtcIsac_ControlBwe(inst, rate_bps, frame_size_ms, + enforce_frame_size); + } + static inline int16_t Create(instance_type** inst) { + return WebRtcIsac_Create(inst); + } + static inline int DecodeInternal(instance_type* inst, + const uint8_t* encoded, + size_t len, + int16_t* decoded, + int16_t* speech_type) { + return WebRtcIsac_Decode(inst, encoded, len, decoded, speech_type); + } + static inline size_t DecodePlc(instance_type* inst, + int16_t* decoded, + size_t num_lost_frames) { + return WebRtcIsac_DecodePlc(inst, decoded, num_lost_frames); + } + + static inline void DecoderInit(instance_type* inst) { + WebRtcIsac_DecoderInit(inst); + } + static inline int Encode(instance_type* inst, + const int16_t* speech_in, + uint8_t* encoded) { + return WebRtcIsac_Encode(inst, speech_in, encoded); + } + static inline int16_t EncoderInit(instance_type* inst, int16_t coding_mode) { + return WebRtcIsac_EncoderInit(inst, coding_mode); + } + static inline uint16_t EncSampRate(instance_type* inst) { + return WebRtcIsac_EncSampRate(inst); + } + + static inline int16_t Free(instance_type* inst) { + return WebRtcIsac_Free(inst); + } + static inline void GetBandwidthInfo(instance_type* inst, + IsacBandwidthInfo* bwinfo) { + WebRtcIsac_GetBandwidthInfo(inst, bwinfo); + } + static inline int16_t GetErrorCode(instance_type* inst) { + return WebRtcIsac_GetErrorCode(inst); + } + + static inline int16_t GetNewFrameLen(instance_type* inst) { + return WebRtcIsac_GetNewFrameLen(inst); + } + static inline void SetBandwidthInfo(instance_type* inst, + const IsacBandwidthInfo* bwinfo) { + WebRtcIsac_SetBandwidthInfo(inst, bwinfo); + } + static inline int16_t SetDecSampRate(instance_type* inst, + uint16_t sample_rate_hz) { + return WebRtcIsac_SetDecSampRate(inst, sample_rate_hz); + } + static inline int16_t SetEncSampRate(instance_type* inst, + uint16_t sample_rate_hz) { + return WebRtcIsac_SetEncSampRate(inst, sample_rate_hz); + } + static inline void SetEncSampRateInDecoder(instance_type* inst, + uint16_t sample_rate_hz) { + WebRtcIsac_SetEncSampRateInDecoder(inst, sample_rate_hz); + } + static inline void SetInitialBweBottleneck(instance_type* inst, + int bottleneck_bits_per_second) { + WebRtcIsac_SetInitialBweBottleneck(inst, bottleneck_bits_per_second); + } + static inline int16_t UpdateBwEstimate(instance_type* inst, + const uint8_t* encoded, + size_t packet_size, + uint16_t rtp_seq_number, + uint32_t send_ts, + uint32_t arr_ts) { + return WebRtcIsac_UpdateBwEstimate(inst, encoded, packet_size, + rtp_seq_number, send_ts, arr_ts); + } + static inline int16_t SetMaxPayloadSize(instance_type* inst, + int16_t max_payload_size_bytes) { + return WebRtcIsac_SetMaxPayloadSize(inst, max_payload_size_bytes); + } + static inline int16_t SetMaxRate(instance_type* inst, int32_t max_bit_rate) { + return WebRtcIsac_SetMaxRate(inst, max_bit_rate); + } +}; + +} // namespace webrtc +#endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ISAC_FLOAT_TYPE_H_ diff --git a/webrtc/modules/audio_coding/main/acm2/codec_owner.cc b/webrtc/modules/audio_coding/main/acm2/codec_owner.cc index c07ecec850..669eadb68e 100644 --- a/webrtc/modules/audio_coding/main/acm2/codec_owner.cc +++ b/webrtc/modules/audio_coding/main/acm2/codec_owner.cc @@ -16,7 +16,9 @@ #include "webrtc/modules/audio_coding/codecs/g711/include/audio_encoder_pcm.h" #include "webrtc/modules/audio_coding/codecs/g722/include/audio_encoder_g722.h" #include "webrtc/modules/audio_coding/codecs/ilbc/interface/audio_encoder_ilbc.h" +#include "webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_decoder_isacfix.h" #include "webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_encoder_isacfix.h" +#include "webrtc/modules/audio_coding/codecs/isac/main/interface/audio_decoder_isac.h" #include "webrtc/modules/audio_coding/codecs/isac/main/interface/audio_encoder_isac.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" diff --git a/webrtc/modules/audio_coding/neteq/audio_decoder_impl.cc b/webrtc/modules/audio_coding/neteq/audio_decoder_impl.cc index 1428eaceda..52f327bc61 100644 --- a/webrtc/modules/audio_coding/neteq/audio_decoder_impl.cc +++ b/webrtc/modules/audio_coding/neteq/audio_decoder_impl.cc @@ -22,9 +22,11 @@ #include "webrtc/modules/audio_coding/codecs/ilbc/interface/audio_decoder_ilbc.h" #endif #ifdef WEBRTC_CODEC_ISACFX +#include "webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_decoder_isacfix.h" #include "webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_encoder_isacfix.h" #endif #ifdef WEBRTC_CODEC_ISAC +#include "webrtc/modules/audio_coding/codecs/isac/main/interface/audio_decoder_isac.h" #include "webrtc/modules/audio_coding/codecs/isac/main/interface/audio_encoder_isac.h" #endif #ifdef WEBRTC_CODEC_OPUS diff --git a/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc b/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc index d7446a826e..537f16cca4 100644 --- a/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc +++ b/webrtc/modules/audio_coding/neteq/audio_decoder_unittest.cc @@ -24,7 +24,9 @@ #include "webrtc/modules/audio_coding/codecs/g722/include/audio_encoder_g722.h" #include "webrtc/modules/audio_coding/codecs/ilbc/interface/audio_decoder_ilbc.h" #include "webrtc/modules/audio_coding/codecs/ilbc/interface/audio_encoder_ilbc.h" +#include "webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_decoder_isacfix.h" #include "webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_encoder_isacfix.h" +#include "webrtc/modules/audio_coding/codecs/isac/main/interface/audio_decoder_isac.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"