Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(246)

Side by Side Diff: webrtc/modules/audio_coding/neteq/neteq_impl.cc

Issue 1868143002: Convert CNG into C++ and remove it from AudioDecoder (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Implicit conversion to ArrayView in TestSidErroneous Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include "webrtc/modules/audio_coding/neteq/neteq_impl.h" 11 #include "webrtc/modules/audio_coding/neteq/neteq_impl.h"
12 12
13 #include <assert.h> 13 #include <assert.h>
14 #include <memory.h> // memset 14 #include <memory.h> // memset
15 15
16 #include <algorithm> 16 #include <algorithm>
17 #include <vector>
17 18
18 #include "webrtc/base/checks.h" 19 #include "webrtc/base/checks.h"
19 #include "webrtc/base/logging.h" 20 #include "webrtc/base/logging.h"
20 #include "webrtc/base/safe_conversions.h" 21 #include "webrtc/base/safe_conversions.h"
21 #include "webrtc/base/trace_event.h" 22 #include "webrtc/base/trace_event.h"
22 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar y.h" 23 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar y.h"
23 #include "webrtc/modules/audio_coding/codecs/audio_decoder.h" 24 #include "webrtc/modules/audio_coding/codecs/audio_decoder.h"
24 #include "webrtc/modules/audio_coding/neteq/accelerate.h" 25 #include "webrtc/modules/audio_coding/neteq/accelerate.h"
25 #include "webrtc/modules/audio_coding/neteq/background_noise.h" 26 #include "webrtc/modules/audio_coding/neteq/background_noise.h"
26 #include "webrtc/modules/audio_coding/neteq/buffer_level_filter.h" 27 #include "webrtc/modules/audio_coding/neteq/buffer_level_filter.h"
(...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after
657 switch (ret) { 658 switch (ret) {
658 case PayloadSplitter::kUnknownPayloadType: 659 case PayloadSplitter::kUnknownPayloadType:
659 return kUnknownRtpPayloadType; 660 return kUnknownRtpPayloadType;
660 case PayloadSplitter::kFrameSplitError: 661 case PayloadSplitter::kFrameSplitError:
661 return kFrameSplitError; 662 return kFrameSplitError;
662 default: 663 default:
663 return kOtherError; 664 return kOtherError;
664 } 665 }
665 } 666 }
666 667
667 // Update bandwidth estimate, if the packet is not sync-packet. 668 // Update bandwidth estimate, if the packet is not sync-packet nor comfort
668 if (!packet_list.empty() && !packet_list.front()->sync_packet) { 669 // noise.
670 if (!packet_list.empty() && !packet_list.front()->sync_packet &&
671 !decoder_database_->IsComfortNoise(main_header.payloadType)) {
669 // The list can be empty here if we got nothing but DTMF payloads. 672 // The list can be empty here if we got nothing but DTMF payloads.
670 AudioDecoder* decoder = 673 AudioDecoder* decoder =
671 decoder_database_->GetDecoder(main_header.payloadType); 674 decoder_database_->GetDecoder(main_header.payloadType);
672 assert(decoder); // Should always get a valid object, since we have 675 assert(decoder); // Should always get a valid object, since we have
673 // already checked that the payload types are known. 676 // already checked that the payload types are known.
674 decoder->IncomingPacket(packet_list.front()->payload, 677 decoder->IncomingPacket(packet_list.front()->payload,
675 packet_list.front()->payload_length, 678 packet_list.front()->payload_length,
676 packet_list.front()->header.sequenceNumber, 679 packet_list.front()->header.sequenceNumber,
677 packet_list.front()->header.timestamp, 680 packet_list.front()->header.timestamp,
678 receive_timestamp); 681 receive_timestamp);
679 } 682 }
680 683
681 if (nack_enabled_) { 684 if (nack_enabled_) {
682 RTC_DCHECK(nack_); 685 RTC_DCHECK(nack_);
683 if (update_sample_rate_and_channels) { 686 if (update_sample_rate_and_channels) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 if (update_sample_rate_and_channels && !packet_buffer_->Empty()) { 724 if (update_sample_rate_and_channels && !packet_buffer_->Empty()) {
722 // We do not use |current_rtp_payload_type_| to |set payload_type|, but 725 // We do not use |current_rtp_payload_type_| to |set payload_type|, but
723 // get the next RTP header from |packet_buffer_| to obtain the payload type. 726 // get the next RTP header from |packet_buffer_| to obtain the payload type.
724 // The reason for it is the following corner case. If NetEq receives a 727 // The reason for it is the following corner case. If NetEq receives a
725 // CNG packet with a sample rate different than the current CNG then it 728 // CNG packet with a sample rate different than the current CNG then it
726 // flushes its buffer, assuming send codec must have been changed. However, 729 // flushes its buffer, assuming send codec must have been changed. However,
727 // payload type of the hypothetically new send codec is not known. 730 // payload type of the hypothetically new send codec is not known.
728 const RTPHeader* rtp_header = packet_buffer_->NextRtpHeader(); 731 const RTPHeader* rtp_header = packet_buffer_->NextRtpHeader();
729 assert(rtp_header); 732 assert(rtp_header);
730 int payload_type = rtp_header->payloadType; 733 int payload_type = rtp_header->payloadType;
731 AudioDecoder* decoder = decoder_database_->GetDecoder(payload_type); 734 size_t channels = 1;
732 assert(decoder); // Payloads are already checked to be valid. 735 if (!decoder_database_->IsComfortNoise(payload_type)) {
736 AudioDecoder* decoder = decoder_database_->GetDecoder(payload_type);
737 assert(decoder); // Payloads are already checked to be valid.
738 channels = decoder->Channels();
739 }
733 const DecoderDatabase::DecoderInfo* decoder_info = 740 const DecoderDatabase::DecoderInfo* decoder_info =
734 decoder_database_->GetDecoderInfo(payload_type); 741 decoder_database_->GetDecoderInfo(payload_type);
735 assert(decoder_info); 742 assert(decoder_info);
736 if (decoder_info->fs_hz != fs_hz_ || 743 if (decoder_info->fs_hz != fs_hz_ ||
737 decoder->Channels() != algorithm_buffer_->Channels()) { 744 channels != algorithm_buffer_->Channels()) {
738 SetSampleRateAndChannels(decoder_info->fs_hz, decoder->Channels()); 745 SetSampleRateAndChannels(decoder_info->fs_hz, channels);
739 } 746 }
740 if (nack_enabled_) { 747 if (nack_enabled_) {
741 RTC_DCHECK(nack_); 748 RTC_DCHECK(nack_);
742 // Update the sample rate even if the rate is not new, because of Reset(). 749 // Update the sample rate even if the rate is not new, because of Reset().
743 nack_->UpdateSampleRate(fs_hz_); 750 nack_->UpdateSampleRate(fs_hz_);
744 } 751 }
745 } 752 }
746 753
747 // TODO(hlundin): Move this code to DelayManager class. 754 // TODO(hlundin): Move this code to DelayManager class.
748 const DecoderDatabase::DecoderInfo* dec_info = 755 const DecoderDatabase::DecoderInfo* dec_info =
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after
1290 } 1297 }
1291 } 1298 }
1292 } 1299 }
1293 1300
1294 if (reset_decoder_) { 1301 if (reset_decoder_) {
1295 // TODO(hlundin): Write test for this. 1302 // TODO(hlundin): Write test for this.
1296 if (decoder) 1303 if (decoder)
1297 decoder->Reset(); 1304 decoder->Reset();
1298 1305
1299 // Reset comfort noise decoder. 1306 // Reset comfort noise decoder.
1300 AudioDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder(); 1307 ComfortNoiseDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder();
1301 if (cng_decoder) 1308 if (cng_decoder)
1302 cng_decoder->Reset(); 1309 cng_decoder->Reset();
1303 1310
1304 reset_decoder_ = false; 1311 reset_decoder_ = false;
1305 } 1312 }
1306 1313
1307 #ifdef LEGACY_BITEXACT 1314 #ifdef LEGACY_BITEXACT
1308 // Due to a bug in old SignalMCU, it could happen that CNG operation was 1315 // Due to a bug in old SignalMCU, it could happen that CNG operation was
1309 // decided, but a speech packet was provided. The speech packet will be used 1316 // decided, but a speech packet was provided. The speech packet will be used
1310 // to update the comfort noise decoder, as if it was a SID frame, which is 1317 // to update the comfort noise decoder, as if it was a SID frame, which is
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after
1948 } else { 1955 } else {
1949 if (packet->primary) { 1956 if (packet->primary) {
1950 packet_duration = decoder->PacketDuration(packet->payload, 1957 packet_duration = decoder->PacketDuration(packet->payload,
1951 packet->payload_length); 1958 packet->payload_length);
1952 } else { 1959 } else {
1953 packet_duration = decoder-> 1960 packet_duration = decoder->
1954 PacketDurationRedundant(packet->payload, packet->payload_length); 1961 PacketDurationRedundant(packet->payload, packet->payload_length);
1955 stats_.SecondaryDecodedSamples(packet_duration); 1962 stats_.SecondaryDecodedSamples(packet_duration);
1956 } 1963 }
1957 } 1964 }
1958 } else { 1965 } else if (!decoder_database_->IsComfortNoise(packet->header.payloadType)) {
1959 LOG(LS_WARNING) << "Unknown payload type " 1966 LOG(LS_WARNING) << "Unknown payload type "
1960 << static_cast<int>(packet->header.payloadType); 1967 << static_cast<int>(packet->header.payloadType);
1961 assert(false); 1968 assert(false);
1962 } 1969 }
1963 if (packet_duration <= 0) { 1970 if (packet_duration <= 0) {
1964 // Decoder did not return a packet duration. Assume that the packet 1971 // Decoder did not return a packet duration. Assume that the packet
1965 // contains the same number of samples as the previous one. 1972 // contains the same number of samples as the previous one.
1966 packet_duration = rtc::checked_cast<int>(decoder_frame_length_); 1973 packet_duration = rtc::checked_cast<int>(decoder_frame_length_);
1967 } 1974 }
1968 extracted_samples = packet->header.timestamp - first_timestamp + 1975 extracted_samples = packet->header.timestamp - first_timestamp +
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2016 decoder_frame_length_ = 3 * output_size_samples_; // Initialize to 30ms. 2023 decoder_frame_length_ = 3 * output_size_samples_; // Initialize to 30ms.
2017 2024
2018 last_mode_ = kModeNormal; 2025 last_mode_ = kModeNormal;
2019 2026
2020 // Create a new array of mute factors and set all to 1. 2027 // Create a new array of mute factors and set all to 1.
2021 mute_factor_array_.reset(new int16_t[channels]); 2028 mute_factor_array_.reset(new int16_t[channels]);
2022 for (size_t i = 0; i < channels; ++i) { 2029 for (size_t i = 0; i < channels; ++i) {
2023 mute_factor_array_[i] = 16384; // 1.0 in Q14. 2030 mute_factor_array_[i] = 16384; // 1.0 in Q14.
2024 } 2031 }
2025 2032
2026 AudioDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder(); 2033 ComfortNoiseDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder();
2027 if (cng_decoder) 2034 if (cng_decoder)
2028 cng_decoder->Reset(); 2035 cng_decoder->Reset();
2029 2036
2030 // Reinit post-decode VAD with new sample rate. 2037 // Reinit post-decode VAD with new sample rate.
2031 assert(vad_.get()); // Cannot be NULL here. 2038 assert(vad_.get()); // Cannot be NULL here.
2032 vad_->Init(); 2039 vad_->Init();
2033 2040
2034 // Delete algorithm buffer and create a new one. 2041 // Delete algorithm buffer and create a new one.
2035 algorithm_buffer_.reset(new AudioMultiVector(channels)); 2042 algorithm_buffer_.reset(new AudioMultiVector(channels));
2036 2043
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
2095 2102
2096 void NetEqImpl::CreateDecisionLogic() { 2103 void NetEqImpl::CreateDecisionLogic() {
2097 decision_logic_.reset(DecisionLogic::Create(fs_hz_, output_size_samples_, 2104 decision_logic_.reset(DecisionLogic::Create(fs_hz_, output_size_samples_,
2098 playout_mode_, 2105 playout_mode_,
2099 decoder_database_.get(), 2106 decoder_database_.get(),
2100 *packet_buffer_.get(), 2107 *packet_buffer_.get(),
2101 delay_manager_.get(), 2108 delay_manager_.get(),
2102 buffer_level_filter_.get())); 2109 buffer_level_filter_.get()));
2103 } 2110 }
2104 } // namespace webrtc 2111 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/audio_coding/neteq/mock/mock_decoder_database.h ('k') | webrtc/modules/audio_coding/neteq/normal.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698