| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 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 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 << "labeled VAD-passive"; | 104 << "labeled VAD-passive"; |
| 105 break; | 105 break; |
| 106 } | 106 } |
| 107 default: | 107 default: |
| 108 assert(false); | 108 assert(false); |
| 109 } | 109 } |
| 110 } | 110 } |
| 111 } | 111 } |
| 112 | 112 |
| 113 // Is the given codec a CNG codec? | 113 // Is the given codec a CNG codec? |
| 114 // TODO(kwiberg): Move to RentACodec. |
| 114 bool IsCng(int codec_id) { | 115 bool IsCng(int codec_id) { |
| 115 return (codec_id == ACMCodecDB::kCNNB || codec_id == ACMCodecDB::kCNWB || | 116 auto i = RentACodec::CodecIdFromIndex(codec_id); |
| 116 codec_id == ACMCodecDB::kCNSWB || codec_id == ACMCodecDB::kCNFB); | 117 return (i && (*i == RentACodec::CodecId::kCNNB || |
| 118 *i == RentACodec::CodecId::kCNWB || |
| 119 *i == RentACodec::CodecId::kCNSWB || |
| 120 *i == RentACodec::CodecId::kCNFB)); |
| 117 } | 121 } |
| 118 | 122 |
| 119 } // namespace | 123 } // namespace |
| 120 | 124 |
| 121 AcmReceiver::AcmReceiver(const AudioCodingModule::Config& config) | 125 AcmReceiver::AcmReceiver(const AudioCodingModule::Config& config) |
| 122 : crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), | 126 : crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), |
| 123 id_(config.id), | 127 id_(config.id), |
| 124 last_audio_decoder_(nullptr), | 128 last_audio_decoder_(nullptr), |
| 125 previous_audio_activity_(AudioFrame::kVadPassive), | 129 previous_audio_activity_(AudioFrame::kVadPassive), |
| 126 current_sample_rate_hz_(config.neteq_config.sample_rate_hz), | 130 current_sample_rate_hz_(config.neteq_config.sample_rate_hz), |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 } | 238 } |
| 235 const int sample_rate_hz = ACMCodecDB::CodecFreq(decoder->acm_codec_id); | 239 const int sample_rate_hz = ACMCodecDB::CodecFreq(decoder->acm_codec_id); |
| 236 receive_timestamp = NowInTimestamp(sample_rate_hz); | 240 receive_timestamp = NowInTimestamp(sample_rate_hz); |
| 237 | 241 |
| 238 if (IsCng(decoder->acm_codec_id)) { | 242 if (IsCng(decoder->acm_codec_id)) { |
| 239 // If this is a CNG while the audio codec is not mono skip pushing in | 243 // If this is a CNG while the audio codec is not mono skip pushing in |
| 240 // packets into NetEq. | 244 // packets into NetEq. |
| 241 if (last_audio_decoder_ && last_audio_decoder_->channels > 1) | 245 if (last_audio_decoder_ && last_audio_decoder_->channels > 1) |
| 242 return 0; | 246 return 0; |
| 243 packet_type = InitialDelayManager::kCngPacket; | 247 packet_type = InitialDelayManager::kCngPacket; |
| 244 } else if (decoder->acm_codec_id == ACMCodecDB::kAVT) { | 248 } else if (decoder->acm_codec_id == |
| 249 *RentACodec::CodecIndexFromId(RentACodec::CodecId::kAVT)) { |
| 245 packet_type = InitialDelayManager::kAvtPacket; | 250 packet_type = InitialDelayManager::kAvtPacket; |
| 246 } else { | 251 } else { |
| 247 if (decoder != last_audio_decoder_) { | 252 if (decoder != last_audio_decoder_) { |
| 248 // This is either the first audio packet or send codec is changed. | 253 // This is either the first audio packet or send codec is changed. |
| 249 // Therefore, either NetEq buffer is empty or will be flushed when this | 254 // Therefore, either NetEq buffer is empty or will be flushed when this |
| 250 // packet is inserted. | 255 // packet is inserted. |
| 251 new_codec = true; | 256 new_codec = true; |
| 252 | 257 |
| 253 // Updating NACK'sampling rate is required, either first packet is | 258 // Updating NACK'sampling rate is required, either first packet is |
| 254 // received or codec is changed. Furthermore, reset is required if codec | 259 // received or codec is changed. Furthermore, reset is required if codec |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 559 } | 564 } |
| 560 return neteq_->GetPlayoutTimestamp(timestamp); | 565 return neteq_->GetPlayoutTimestamp(timestamp); |
| 561 } | 566 } |
| 562 | 567 |
| 563 int AcmReceiver::last_audio_codec_id() const { | 568 int AcmReceiver::last_audio_codec_id() const { |
| 564 CriticalSectionScoped lock(crit_sect_.get()); | 569 CriticalSectionScoped lock(crit_sect_.get()); |
| 565 return last_audio_decoder_ ? last_audio_decoder_->acm_codec_id : -1; | 570 return last_audio_decoder_ ? last_audio_decoder_->acm_codec_id : -1; |
| 566 } | 571 } |
| 567 | 572 |
| 568 int AcmReceiver::RedPayloadType() const { | 573 int AcmReceiver::RedPayloadType() const { |
| 569 if (ACMCodecDB::kRED >= 0) { // This ensures that RED is defined in WebRTC. | 574 const auto red_index = |
| 575 RentACodec::CodecIndexFromId(RentACodec::CodecId::kRED); |
| 576 if (red_index) { |
| 570 CriticalSectionScoped lock(crit_sect_.get()); | 577 CriticalSectionScoped lock(crit_sect_.get()); |
| 571 for (const auto& decoder_pair : decoders_) { | 578 for (const auto& decoder_pair : decoders_) { |
| 572 const Decoder& decoder = decoder_pair.second; | 579 const Decoder& decoder = decoder_pair.second; |
| 573 if (decoder.acm_codec_id == ACMCodecDB::kRED) | 580 if (decoder.acm_codec_id == *red_index) |
| 574 return decoder.payload_type; | 581 return decoder.payload_type; |
| 575 } | 582 } |
| 576 } | 583 } |
| 577 LOG(WARNING) << "RED is not registered."; | 584 LOG(WARNING) << "RED is not registered."; |
| 578 return -1; | 585 return -1; |
| 579 } | 586 } |
| 580 | 587 |
| 581 int AcmReceiver::LastAudioCodec(CodecInst* codec) const { | 588 int AcmReceiver::LastAudioCodec(CodecInst* codec) const { |
| 582 CriticalSectionScoped lock(crit_sect_.get()); | 589 CriticalSectionScoped lock(crit_sect_.get()); |
| 583 if (!last_audio_decoder_) { | 590 if (!last_audio_decoder_) { |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 730 frame->vad_activity_ = AudioFrame::kVadPassive; | 737 frame->vad_activity_ = AudioFrame::kVadPassive; |
| 731 size_t samples = frame->samples_per_channel_ * frame->num_channels_; | 738 size_t samples = frame->samples_per_channel_ * frame->num_channels_; |
| 732 memset(frame->data_, 0, samples * sizeof(int16_t)); | 739 memset(frame->data_, 0, samples * sizeof(int16_t)); |
| 733 return true; | 740 return true; |
| 734 } | 741 } |
| 735 | 742 |
| 736 const AcmReceiver::Decoder* AcmReceiver::RtpHeaderToDecoder( | 743 const AcmReceiver::Decoder* AcmReceiver::RtpHeaderToDecoder( |
| 737 const RTPHeader& rtp_header, | 744 const RTPHeader& rtp_header, |
| 738 const uint8_t* payload) const { | 745 const uint8_t* payload) const { |
| 739 auto it = decoders_.find(rtp_header.payloadType); | 746 auto it = decoders_.find(rtp_header.payloadType); |
| 740 if (ACMCodecDB::kRED >= 0 && // This ensures that RED is defined in WebRTC. | 747 const auto red_index = |
| 741 it != decoders_.end() && ACMCodecDB::kRED == it->second.acm_codec_id) { | 748 RentACodec::CodecIndexFromId(RentACodec::CodecId::kRED); |
| 749 if (red_index && // This ensures that RED is defined in WebRTC. |
| 750 it != decoders_.end() && |
| 751 it->second.acm_codec_id == *red_index) { |
| 742 // This is a RED packet, get the payload of the audio codec. | 752 // This is a RED packet, get the payload of the audio codec. |
| 743 it = decoders_.find(payload[0] & 0x7F); | 753 it = decoders_.find(payload[0] & 0x7F); |
| 744 } | 754 } |
| 745 | 755 |
| 746 // Check if the payload is registered. | 756 // Check if the payload is registered. |
| 747 return it != decoders_.end() ? &it->second : nullptr; | 757 return it != decoders_.end() ? &it->second : nullptr; |
| 748 } | 758 } |
| 749 | 759 |
| 750 uint32_t AcmReceiver::NowInTimestamp(int decoder_sampling_rate) const { | 760 uint32_t AcmReceiver::NowInTimestamp(int decoder_sampling_rate) const { |
| 751 // Down-cast the time to (32-6)-bit since we only care about | 761 // Down-cast the time to (32-6)-bit since we only care about |
| (...skipping 25 matching lines...) Expand all Loading... |
| 777 | 787 |
| 778 void AcmReceiver::GetDecodingCallStatistics( | 788 void AcmReceiver::GetDecodingCallStatistics( |
| 779 AudioDecodingCallStats* stats) const { | 789 AudioDecodingCallStats* stats) const { |
| 780 CriticalSectionScoped lock(crit_sect_.get()); | 790 CriticalSectionScoped lock(crit_sect_.get()); |
| 781 *stats = call_stats_.GetDecodingStatistics(); | 791 *stats = call_stats_.GetDecodingStatistics(); |
| 782 } | 792 } |
| 783 | 793 |
| 784 } // namespace acm2 | 794 } // namespace acm2 |
| 785 | 795 |
| 786 } // namespace webrtc | 796 } // namespace webrtc |
| OLD | NEW |