1 /* 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3 * 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 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "webrtc/modules/audio_coding/main/acm2/acm_receiver.h" 12 13 #include <stdlib.h> // malloc 14 15 #include <algorithm> // sort 16 #include <vector> 17 18 #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h" 19 #include "webrtc/common_types.h" 20 #include "webrtc/modules/audio_coding/main/acm2/acm_common_defs.h" 21 #include "webrtc/modules/audio_coding/main/acm2/acm_resampler.h" 22 #include "webrtc/modules/audio_coding/main/acm2/call_statistics.h" 23 #include "webrtc/modules/audio_coding/main/acm2/nack.h" 24 #include "webrtc/modules/audio_coding/neteq/interface/audio_decoder.h" 25 #include "webrtc/modules/audio_coding/neteq/interface/neteq.h" 26 #include "webrtc/system_wrappers/interface/clock.h" 27 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 28 #include "webrtc/system_wrappers/interface/logging.h" 29 #include "webrtc/system_wrappers/interface/tick_util.h" 30 #include "webrtc/system_wrappers/interface/trace.h" 31 32 namespace webrtc { 33 34 namespace acm2 { 35 36 namespace { 37 38 const int kNackThresholdPackets = 2; 39 40 // |vad_activity_| field of |audio_frame| is set to |previous_audio_activity_| 41 // before the call to this function. 42 void SetAudioFrameActivityAndType(bool vad_enabled, 43 NetEqOutputType type, 44 AudioFrame* audio_frame) { 45 if (vad_enabled) { 46 switch (type) { 47 case kOutputNormal: { 48 audio_frame->vad_activity_ = AudioFrame::kVadActive; 49 audio_frame->speech_type_ = AudioFrame::kNormalSpeech; 50 break; 51 } 52 case kOutputVADPassive: { 53 audio_frame->vad_activity_ = AudioFrame::kVadPassive; 54 audio_frame->speech_type_ = AudioFrame::kNormalSpeech; 55 break; 56 } 57 case kOutputCNG: { 58 audio_frame->vad_activity_ = AudioFrame::kVadPassive; 59 audio_frame->speech_type_ = AudioFrame::kCNG; 60 break; 61 } 62 case kOutputPLC: { 63 // Don't change |audio_frame->vad_activity_|, it should be the same as 64 // |previous_audio_activity_|. 65 audio_frame->speech_type_ = AudioFrame::kPLC; 66 break; 67 } 68 case kOutputPLCtoCNG: { 69 audio_frame->vad_activity_ = AudioFrame::kVadPassive; 70 audio_frame->speech_type_ = AudioFrame::kPLCCNG; 71 break; 72 } 73 default: 74 assert(false); 75 } 76 } else { 77 // Always return kVadUnknown when receive VAD is inactive 78 audio_frame->vad_activity_ = AudioFrame::kVadUnknown; 79 switch (type) { 80 case kOutputNormal: { 81 audio_frame->speech_type_ = AudioFrame::kNormalSpeech; 82 break; 83 } 84 case kOutputCNG: { 85 audio_frame->speech_type_ = AudioFrame::kCNG; 86 break; 87 } 88 case kOutputPLC: { 89 audio_frame->speech_type_ = AudioFrame::kPLC; 90 break; 91 } 92 case kOutputPLCtoCNG: { 93 audio_frame->speech_type_ = AudioFrame::kPLCCNG; 94 break; 95 } 96 case kOutputVADPassive: { 97 // Normally, we should no get any VAD decision if post-decoding VAD is 98 // not active. However, if post-decoding VAD has been active then 99 // disabled, we might be here for couple of frames. 100 audio_frame->speech_type_ = AudioFrame::kNormalSpeech; 101 LOG_F(LS_WARNING) << "Post-decoding VAD is disabled but output is " 102 << "labeled VAD-passive"; 103 break; 104 } 105 default: 106 assert(false); 107 } 108 } 109 } 110 111 // Is the given codec a CNG codec? 112 bool IsCng(int codec_id) { 113 return (codec_id == ACMCodecDB::kCNNB || codec_id == ACMCodecDB::kCNWB || 114 codec_id == ACMCodecDB::kCNSWB || codec_id == ACMCodecDB::kCNFB); 115 } 116 117 } // namespace 118 119 AcmReceiver::AcmReceiver(const AudioCodingModule::Config& config) 120 : crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), 121 id_(config.id), 122 last_audio_decoder_(-1), // Invalid value. 123 previous_audio_activity_(AudioFrame::kVadPassive), 124 current_sample_rate_hz_(config.neteq_config.sample_rate_hz), 125 nack_(), 126 nack_enabled_(false), 127 neteq_(NetEq::Create(config.neteq_config)), 128 vad_enabled_(true), 129 clock_(config.clock), 130 av_sync_(false), 131 initial_delay_manager_(), 132 missing_packets_sync_stream_(), 133 late_packets_sync_stream_() { 134 assert(clock_); 135 for (int n = 0; n < ACMCodecDB::kMaxNumCodecs; ++n) { 136 decoders_[n].registered = false; 137 } 138 139 // Make sure we are on the same page as NetEq. Post-decode VAD is disabled by 140 // default in NetEq4, however, Audio Conference Mixer relies on VAD decision 141 // and fails if VAD decision is not provided. 142 if (vad_enabled_) 143 neteq_->EnableVad(); 144 else 145 neteq_->DisableVad(); 146 } 147 148 AcmReceiver::~AcmReceiver() { 149 delete neteq_; 150 } 151 152 int AcmReceiver::SetMinimumDelay(int delay_ms) { 153 if (neteq_->SetMinimumDelay(delay_ms)) 154 return 0; 155 LOG_FERR1(LS_ERROR, "AcmReceiver::SetExtraDelay", delay_ms); 156 return -1; 157 } 158 159 int AcmReceiver::SetInitialDelay(int delay_ms) { 160 if (delay_ms < 0 || delay_ms > 10000) { 161 return -1; 162 } 163 CriticalSectionScoped lock(crit_sect_.get()); 164 165 if (delay_ms == 0) { 166 av_sync_ = false; 167 initial_delay_manager_.reset(); 168 missing_packets_sync_stream_.reset(); 169 late_packets_sync_stream_.reset(); 170 neteq_->SetMinimumDelay(0); 171 return 0; 172 } 173 174 if (av_sync_ && initial_delay_manager_->PacketBuffered()) { 175 // Too late for this API. Only works before a call is started. 176 return -1; 177 } 178 179 // Most of places NetEq calls are not within AcmReceiver's critical section to 180 // improve performance. Here, this call has to be placed before the following 181 // block, therefore, we keep it inside critical section. Otherwise, we have to 182 // release |neteq_crit_sect_| and acquire it again, which seems an overkill. 183 if (!neteq_->SetMinimumDelay(delay_ms)) 184 return -1; 185 186 const int kLatePacketThreshold = 5; 187 av_sync_ = true; 188 initial_delay_manager_.reset(new InitialDelayManager(delay_ms, 189 kLatePacketThreshold)); 190 missing_packets_sync_stream_.reset(new InitialDelayManager::SyncStream); 191 late_packets_sync_stream_.reset(new InitialDelayManager::SyncStream); 192 return 0; 193 } 194 195 int AcmReceiver::SetMaximumDelay(int delay_ms) { 196 if (neteq_->SetMaximumDelay(delay_ms)) 197 return 0; 198 LOG_FERR1(LS_ERROR, "AcmReceiver::SetExtraDelay", delay_ms); 199 return -1; 200 } 201 202 int AcmReceiver::LeastRequiredDelayMs() const { 203 return neteq_->LeastRequiredDelayMs(); 204 } 205 206 int AcmReceiver::current_sample_rate_hz() const { 207 CriticalSectionScoped lock(crit_sect_.get()); 208 return current_sample_rate_hz_; 209 } 210 211 // TODO(turajs): use one set of enumerators, e.g. the one defined in 212 // common_types.h 213 // TODO(henrik.lundin): This method is not used any longer. The call hierarchy 214 // stops in voe::Channel::SetNetEQPlayoutMode(). Remove it. 215 void AcmReceiver::SetPlayoutMode(AudioPlayoutMode mode) { 216 enum NetEqPlayoutMode playout_mode = kPlayoutOn; 217 switch (mode) { 218 case voice: 219 playout_mode = kPlayoutOn; 220 break; 221 case fax: // No change to background noise mode. 222 playout_mode = kPlayoutFax; 223 break; 224 case streaming: 225 playout_mode = kPlayoutStreaming; 226 break; 227 case off: 228 playout_mode = kPlayoutOff; 229 break; 230 } 231 neteq_->SetPlayoutMode(playout_mode); 232 } 233 234 AudioPlayoutMode AcmReceiver::PlayoutMode() const { 235 AudioPlayoutMode acm_mode = voice; 236 NetEqPlayoutMode mode = neteq_->PlayoutMode(); 237 switch (mode) { 238 case kPlayoutOn: 239 acm_mode = voice; 240 break; 241 case kPlayoutOff: 242 acm_mode = off; 243 break; 244 case kPlayoutFax: 245 acm_mode = fax; 246 break; 247 case kPlayoutStreaming: 248 acm_mode = streaming; 249 break; 250 default: 251 assert(false); 252 } 253 return acm_mode; 254 } 255 256 int AcmReceiver::InsertPacket(const WebRtcRTPHeader& rtp_header, 257 const uint8_t* incoming_payload, 258 int length_payload) { 259 uint32_t receive_timestamp = 0; 260 InitialDelayManager::PacketType packet_type = 261 InitialDelayManager::kUndefinedPacket; 262 bool new_codec = false; 263 const RTPHeader* header = &rtp_header.header; // Just a shorthand. 264 265 { 266 CriticalSectionScoped lock(crit_sect_.get()); 267 268 int codec_id = RtpHeaderToCodecIndex(*header, incoming_payload); 269 if (codec_id < 0) { 270 LOG_F(LS_ERROR) << "Payload-type " << header->payloadType 271 << " is not registered."; 272 return -1; 273 } 274 assert(codec_id < ACMCodecDB::kMaxNumCodecs); 275 const int sample_rate_hz = ACMCodecDB::CodecFreq(codec_id); 276 receive_timestamp = NowInTimestamp(sample_rate_hz); 277 278 if (IsCng(codec_id)) { 279 // If this is a CNG while the audio codec is not mono skip pushing in 280 // packets into NetEq. 281 if (last_audio_decoder_ >= 0 && 282 decoders_[last_audio_decoder_].channels > 1) 283 return 0; 284 packet_type = InitialDelayManager::kCngPacket; 285 } else if (codec_id == ACMCodecDB::kAVT) { 286 packet_type = InitialDelayManager::kAvtPacket; 287 } else { 288 if (codec_id != last_audio_decoder_) { 289 // This is either the first audio packet or send codec is changed. 290 // Therefore, either NetEq buffer is empty or will be flushed when this 291 // packet inserted. Note that |last_audio_decoder_| is initialized to 292 // an invalid value (-1), hence, the above condition is true for the 293 // very first audio packet. 294 new_codec = true; 295 296 // Updating NACK'sampling rate is required, either first packet is 297 // received or codec is changed. Furthermore, reset is required if codec 298 // is changed (NetEq flushes its buffer so NACK should reset its list). 299 if (nack_enabled_) { 300 assert(nack_.get()); 301 nack_->Reset(); 302 nack_->UpdateSampleRate(sample_rate_hz); 303 } 304 last_audio_decoder_ = codec_id; 305 } 306 packet_type = InitialDelayManager::kAudioPacket; 307 } 308 309 if (nack_enabled_) { 310 assert(nack_.get()); 311 nack_->UpdateLastReceivedPacket(header->sequenceNumber, 312 header->timestamp); 313 } 314 315 if (av_sync_) { 316 assert(initial_delay_manager_.get()); 317 assert(missing_packets_sync_stream_.get()); 318 // This updates |initial_delay_manager_| and specifies an stream of 319 // sync-packets, if required to be inserted. We insert the sync-packets 320 // when AcmReceiver lock is released and |decoder_lock_| is acquired. 321 initial_delay_manager_->UpdateLastReceivedPacket( 322 rtp_header, receive_timestamp, packet_type, new_codec, sample_rate_hz, 323 missing_packets_sync_stream_.get()); 324 } 325 } // |crit_sect_| is released. 326 327 // If |missing_packets_sync_stream_| is allocated then we are in AV-sync and 328 // we may need to insert sync-packets. We don't check |av_sync_| as we are 329 // outside AcmReceiver's critical section. 330 if (missing_packets_sync_stream_.get()) { 331 InsertStreamOfSyncPackets(missing_packets_sync_stream_.get()); 332 } 333 334 if (neteq_->InsertPacket(rtp_header, incoming_payload, length_payload, 335 receive_timestamp) < 0) { 336 LOG_FERR1(LS_ERROR, "AcmReceiver::InsertPacket", header->payloadType) << 337 " Failed to insert packet"; 338 return -1; 339 } 340 return 0; 341 } 342 343 int AcmReceiver::GetAudio(int desired_freq_hz, AudioFrame* audio_frame) { 344 enum NetEqOutputType type; 345 int16_t* ptr_audio_buffer = audio_frame->data_; 346 int samples_per_channel; 347 int num_channels; 348 bool return_silence = false; 349 350 { 351 // Accessing members, take the lock. 352 CriticalSectionScoped lock(crit_sect_.get()); 353 354 if (av_sync_) { 355 assert(initial_delay_manager_.get()); 356 assert(late_packets_sync_stream_.get()); 357 return_silence = GetSilence(desired_freq_hz, audio_frame); 358 uint32_t timestamp_now = NowInTimestamp(current_sample_rate_hz_); 359 initial_delay_manager_->LatePackets(timestamp_now, 360 late_packets_sync_stream_.get()); 361 } 362 363 if (!return_silence) { 364 // This is our initial guess regarding whether a resampling will be 365 // required. It is based on previous sample rate of netEq. Most often, 366 // this is a correct guess, however, in case that incoming payload changes 367 // the resampling might might be needed. By doing so, we avoid an 368 // unnecessary memcpy(). 369 if (desired_freq_hz != -1 && 370 current_sample_rate_hz_ != desired_freq_hz) { 371 ptr_audio_buffer = audio_buffer_; 372 } 373 } 374 } 375 376 // If |late_packets_sync_stream_| is allocated then we have been in AV-sync 377 // mode and we might have to insert sync-packets. 378 if (late_packets_sync_stream_.get()) { 379 InsertStreamOfSyncPackets(late_packets_sync_stream_.get()); 380 if (return_silence) // Silence generated, don't pull from NetEq. 381 return 0; 382 } 383 384 if (neteq_->GetAudio(AudioFrame::kMaxDataSizeSamples, 385 ptr_audio_buffer, 386 &samples_per_channel, 387 &num_channels, &type) != NetEq::kOK) { 388 LOG_FERR0(LS_ERROR, "AcmReceiver::GetAudio") << "NetEq Failed."; 389 return -1; 390 } 391 392 // Accessing members, take the lock. 393 CriticalSectionScoped lock(crit_sect_.get()); 394 395 // Update NACK. 396 int decoded_sequence_num = 0; 397 uint32_t decoded_timestamp = 0; 398 bool update_nack = nack_enabled_ && // Update NACK only if it is enabled. 399 neteq_->DecodedRtpInfo(&decoded_sequence_num, &decoded_timestamp); 400 if (update_nack) { 401 assert(nack_.get()); 402 nack_->UpdateLastDecodedPacket(decoded_sequence_num, decoded_timestamp); 403 } 404 405 // NetEq always returns 10 ms of audio. 406 current_sample_rate_hz_ = samples_per_channel * 100; 407 408 // Update if resampling is required. 409 bool need_resampling = (desired_freq_hz != -1) && 410 (current_sample_rate_hz_ != desired_freq_hz); 411 412 if (ptr_audio_buffer == audio_buffer_) { 413 // Data is written to local buffer. 414 if (need_resampling) { 415 samples_per_channel = 416 resampler_.Resample10Msec(audio_buffer_, 417 current_sample_rate_hz_, 418 desired_freq_hz, 419 num_channels, 420 AudioFrame::kMaxDataSizeSamples, 421 audio_frame->data_); 422 if (samples_per_channel < 0) { 423 LOG_FERR0(LS_ERROR, "AcmReceiver::GetAudio") << "Resampler Failed."; 424 return -1; 425 } 426 } else { 427 // We might end up here ONLY if codec is changed. 428 memcpy(audio_frame->data_, audio_buffer_, samples_per_channel * 429 num_channels * sizeof(int16_t)); 430 } 431 } else { 432 // Data is written into |audio_frame|. 433 if (need_resampling) { 434 // We might end up here ONLY if codec is changed. 435 samples_per_channel = 436 resampler_.Resample10Msec(audio_frame->data_, 437 current_sample_rate_hz_, 438 desired_freq_hz, 439 num_channels, 440 AudioFrame::kMaxDataSizeSamples, 441 audio_buffer_); 442 if (samples_per_channel < 0) { 443 LOG_FERR0(LS_ERROR, "AcmReceiver::GetAudio") << "Resampler Failed."; 444 return -1; 445 } 446 memcpy(audio_frame->data_, audio_buffer_, samples_per_channel * 447 num_channels * sizeof(int16_t)); 448 } 449 } 450 451 audio_frame->num_channels_ = num_channels; 452 audio_frame->samples_per_channel_ = samples_per_channel; 453 audio_frame->sample_rate_hz_ = samples_per_channel * 100; 454 455 // Should set |vad_activity| before calling SetAudioFrameActivityAndType(). 456 audio_frame->vad_activity_ = previous_audio_activity_; 457 SetAudioFrameActivityAndType(vad_enabled_, type, audio_frame); 458 previous_audio_activity_ = audio_frame->vad_activity_; 459 call_stats_.DecodedByNetEq(audio_frame->speech_type_); 460 461 // Computes the RTP timestamp of the first sample in |audio_frame| from 462 // |GetPlayoutTimestamp|, which is the timestamp of the last sample of 463 // |audio_frame|. 464 uint32_t playout_timestamp = 0; 465 if (GetPlayoutTimestamp(&playout_timestamp)) { 466 audio_frame->timestamp_ = 467 playout_timestamp - audio_frame->samples_per_channel_; 468 } else { 469 // Remain 0 until we have a valid |playout_timestamp|. 470 audio_frame->timestamp_ = 0; 471 } 472 473 return 0; 474 } 475 476 int32_t AcmReceiver::AddCodec(int acm_codec_id, 477 uint8_t payload_type, 478 int channels, 479 AudioDecoder* audio_decoder) { 480 assert(acm_codec_id >= 0 && acm_codec_id < ACMCodecDB::kMaxNumCodecs); 481 NetEqDecoder neteq_decoder = ACMCodecDB::neteq_decoders_[acm_codec_id]; 482 483 // Make sure the right decoder is registered for Opus. 484 if (neteq_decoder == kDecoderOpus && channels == 2) { 485 neteq_decoder = kDecoderOpus_2ch; 486 } 487 488 CriticalSectionScoped lock(crit_sect_.get()); 489 490 // The corresponding NetEq decoder ID. 491 // If this coder has been registered before. 492 if (decoders_[acm_codec_id].registered) { 493 if (decoders_[acm_codec_id].payload_type == payload_type && 494 decoders_[acm_codec_id].channels == channels) { 495 // Re-registering the same codec with the same payload-type. Do nothing 496 // and return. 497 return 0; 498 } 499 500 // Changing the payload-type or number of channels for this codec. 501 // First unregister. Then register with new payload-type/channels. 502 if (neteq_->RemovePayloadType(decoders_[acm_codec_id].payload_type) != 503 NetEq::kOK) { 504 LOG_F(LS_ERROR) << "Cannot remover payload " 505 << decoders_[acm_codec_id].payload_type; 506 return -1; 507 } 508 } 509 510 int ret_val; 511 if (!audio_decoder) { 512 ret_val = neteq_->RegisterPayloadType(neteq_decoder, payload_type); 513 } else { 514 ret_val = neteq_->RegisterExternalDecoder( 515 audio_decoder, neteq_decoder, payload_type); 516 } 517 if (ret_val != NetEq::kOK) { 518 LOG_FERR3(LS_ERROR, "AcmReceiver::AddCodec", acm_codec_id, payload_type, 519 channels); 520 // Registration failed, delete the allocated space and set the pointer to 521 // NULL, for the record. 522 decoders_[acm_codec_id].registered = false; 523 return -1; 524 } 525 526 decoders_[acm_codec_id].registered = true; 527 decoders_[acm_codec_id].payload_type = payload_type; 528 decoders_[acm_codec_id].channels = channels; 529 return 0; 530 } 531 532 void AcmReceiver::EnableVad() { 533 neteq_->EnableVad(); 534 CriticalSectionScoped lock(crit_sect_.get()); 535 vad_enabled_ = true; 536 } 537 538 void AcmReceiver::DisableVad() { 539 neteq_->DisableVad(); 540 CriticalSectionScoped lock(crit_sect_.get()); 541 vad_enabled_ = false; 542 } 543 544 void AcmReceiver::FlushBuffers() { 545 neteq_->FlushBuffers(); 546 } 547 548 // If failed in removing one of the codecs, this method continues to remove as 549 // many as it can. 550 int AcmReceiver::RemoveAllCodecs() { 551 int ret_val = 0; 552 CriticalSectionScoped lock(crit_sect_.get()); 553 for (int n = 0; n < ACMCodecDB::kMaxNumCodecs; ++n) { 554 if (decoders_[n].registered) { 555 if (neteq_->RemovePayloadType(decoders_[n].payload_type) == 0) { 556 decoders_[n].registered = false; 557 } else { 558 LOG_F(LS_ERROR) << "Cannot remove payload " 559 << decoders_[n].payload_type; 560 ret_val = -1; 561 } 562 } 563 } 564 // No codec is registered, invalidate last audio decoder. 565 last_audio_decoder_ = -1; 566 return ret_val; 567 } 568 569 int AcmReceiver::RemoveCodec(uint8_t payload_type) { 570 int codec_index = PayloadType2CodecIndex(payload_type); 571 if (codec_index < 0) { // Such a payload-type is not registered. 572 return 0; 573 } 574 if (neteq_->RemovePayloadType(payload_type) != NetEq::kOK) { 575 LOG_FERR1(LS_ERROR, "AcmReceiver::RemoveCodec", payload_type); 576 return -1; 577 } 578 CriticalSectionScoped lock(crit_sect_.get()); 579 decoders_[codec_index].registered = false; 580 if (last_audio_decoder_ == codec_index) 581 last_audio_decoder_ = -1; // Codec is removed, invalidate last decoder. 582 return 0; 583 } 584 585 void AcmReceiver::set_id(int id) { 586 CriticalSectionScoped lock(crit_sect_.get()); 587 id_ = id; 588 } 589 590 bool AcmReceiver::GetPlayoutTimestamp(uint32_t* timestamp) { 591 if (av_sync_) { 592 assert(initial_delay_manager_.get()); 593 if (initial_delay_manager_->buffering()) { 594 return initial_delay_manager_->GetPlayoutTimestamp(timestamp); 595 } 596 } 597 return neteq_->GetPlayoutTimestamp(timestamp); 598 } 599 600 int AcmReceiver::last_audio_codec_id() const { 601 CriticalSectionScoped lock(crit_sect_.get()); 602 return last_audio_decoder_; 603 } 604 605 int AcmReceiver::last_audio_payload_type() const { 606 CriticalSectionScoped lock(crit_sect_.get()); 607 if (last_audio_decoder_ < 0) 608 return -1; 609 assert(decoders_[last_audio_decoder_].registered); 610 return decoders_[last_audio_decoder_].payload_type; 611 } 612 613 int AcmReceiver::RedPayloadType() const { 614 CriticalSectionScoped lock(crit_sect_.get()); 615 if (ACMCodecDB::kRED < 0 || 616 !decoders_[ACMCodecDB::kRED].registered) { 617 LOG_F(LS_WARNING) << "RED is not registered."; 618 return -1; 619 } 620 return decoders_[ACMCodecDB::kRED].payload_type; 621 } 622 623 int AcmReceiver::LastAudioCodec(CodecInst* codec) const { 624 CriticalSectionScoped lock(crit_sect_.get()); 625 if (last_audio_decoder_ < 0) { 626 return -1; 627 } 628 assert(decoders_[last_audio_decoder_].registered); 629 memcpy(codec, &ACMCodecDB::database_[last_audio_decoder_], sizeof(CodecInst)); 630 codec->pltype = decoders_[last_audio_decoder_].payload_type; 631 codec->channels = decoders_[last_audio_decoder_].channels; 632 return 0; 633 } 634 635 void AcmReceiver::NetworkStatistics(ACMNetworkStatistics* acm_stat) { 636 NetEqNetworkStatistics neteq_stat; 637 // NetEq function always returns zero, so we don't check the return value. 638 neteq_->NetworkStatistics(&neteq_stat); 639 640 acm_stat->currentBufferSize = neteq_stat.current_buffer_size_ms; 641 acm_stat->preferredBufferSize = neteq_stat.preferred_buffer_size_ms; 642 acm_stat->jitterPeaksFound = neteq_stat.jitter_peaks_found ? true : false; 643 acm_stat->currentPacketLossRate = neteq_stat.packet_loss_rate; 644 acm_stat->currentDiscardRate = neteq_stat.packet_discard_rate; 645 acm_stat->currentExpandRate = neteq_stat.expand_rate; 646 acm_stat->currentPreemptiveRate = neteq_stat.preemptive_rate; 647 acm_stat->currentAccelerateRate = neteq_stat.accelerate_rate; 648 acm_stat->clockDriftPPM = neteq_stat.clockdrift_ppm; 649 acm_stat->addedSamples = neteq_stat.added_zero_samples; 650 651 std::vector<int> waiting_times; 652 neteq_->WaitingTimes(&waiting_times); 653 size_t size = waiting_times.size(); 654 if (size == 0) { 655 acm_stat->meanWaitingTimeMs = -1; 656 acm_stat->medianWaitingTimeMs = -1; 657 acm_stat->minWaitingTimeMs = -1; 658 acm_stat->maxWaitingTimeMs = -1; 659 } else { 660 std::sort(waiting_times.begin(), waiting_times.end()); 661 if ((size & 0x1) == 0) { 662 acm_stat->medianWaitingTimeMs = (waiting_times[size / 2 - 1] + 663 waiting_times[size / 2]) / 2; 664 } else { 665 acm_stat->medianWaitingTimeMs = waiting_times[size / 2]; 666 } 667 acm_stat->minWaitingTimeMs = waiting_times.front(); 668 acm_stat->maxWaitingTimeMs = waiting_times.back(); 669 double sum = 0; 670 for (size_t i = 0; i < size; ++i) { 671 sum += waiting_times[i]; 672 } 673 acm_stat->meanWaitingTimeMs = static_cast<int>(sum / size); 674 } 675 } 676 677 int AcmReceiver::DecoderByPayloadType(uint8_t payload_type, 678 CodecInst* codec) const { 679 CriticalSectionScoped lock(crit_sect_.get()); 680 int codec_index = PayloadType2CodecIndex(payload_type); 681 if (codec_index < 0) { 682 LOG_FERR1(LS_ERROR, "AcmReceiver::DecoderByPayloadType", payload_type); 683 return -1; 684 } 685 memcpy(codec, &ACMCodecDB::database_[codec_index], sizeof(CodecInst)); 686 codec->pltype = decoders_[codec_index].payload_type; 687 codec->channels = decoders_[codec_index].channels; 688 return 0; 689 } 690 691 int AcmReceiver::PayloadType2CodecIndex(uint8_t payload_type) const { 692 for (int n = 0; n < ACMCodecDB::kMaxNumCodecs; ++n) { 693 if (decoders_[n].registered && decoders_[n].payload_type == payload_type) { 694 return n; 695 } 696 } 697 return -1; 698 } 699 700 int AcmReceiver::EnableNack(size_t max_nack_list_size) { 701 // Don't do anything if |max_nack_list_size| is out of range. 702 if (max_nack_list_size == 0 || max_nack_list_size > Nack::kNackListSizeLimit) 703 return -1; 704 705 CriticalSectionScoped lock(crit_sect_.get()); 706 if (!nack_enabled_) { 707 nack_.reset(Nack::Create(kNackThresholdPackets)); 708 nack_enabled_ = true; 709 710 // Sampling rate might need to be updated if we change from disable to 711 // enable. Do it if the receive codec is valid. 712 if (last_audio_decoder_ >= 0) { 713 nack_->UpdateSampleRate( 714 ACMCodecDB::database_[last_audio_decoder_].plfreq); 715 } 716 } 717 return nack_->SetMaxNackListSize(max_nack_list_size); 718 } 719 720 void AcmReceiver::DisableNack() { 721 CriticalSectionScoped lock(crit_sect_.get()); 722 nack_.reset(); // Memory is released. 723 nack_enabled_ = false; 724 } 725 726 std::vector<uint16_t> AcmReceiver::GetNackList( 727 int round_trip_time_ms) const { 728 CriticalSectionScoped lock(crit_sect_.get()); 729 if (round_trip_time_ms < 0) { 730 WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceAudioCoding, id_, 731 "GetNackList: round trip time cannot be negative." 732 " round_trip_time_ms=%d", round_trip_time_ms); 733 } 734 if (nack_enabled_ && round_trip_time_ms >= 0) { 735 assert(nack_.get()); 736 return nack_->GetNackList(round_trip_time_ms); 737 } 738 std::vector<uint16_t> empty_list; 739 return empty_list; 740 } 741 742 void AcmReceiver::ResetInitialDelay() { 743 { 744 CriticalSectionScoped lock(crit_sect_.get()); 745 av_sync_ = false; 746 initial_delay_manager_.reset(NULL); 747 missing_packets_sync_stream_.reset(NULL); 748 late_packets_sync_stream_.reset(NULL); 749 } 750 neteq_->SetMinimumDelay(0); 751 // TODO(turajs): Should NetEq Buffer be flushed? 752 } 753 754 // This function is called within critical section, no need to acquire a lock. 755 bool AcmReceiver::GetSilence(int desired_sample_rate_hz, AudioFrame* frame) { 756 assert(av_sync_); 757 assert(initial_delay_manager_.get()); 758 if (!initial_delay_manager_->buffering()) { 759 return false; 760 } 761 762 // We stop accumulating packets, if the number of packets or the total size 763 // exceeds a threshold. 764 int num_packets; 765 int max_num_packets; 766 const float kBufferingThresholdScale = 0.9f; 767 neteq_->PacketBufferStatistics(&num_packets, &max_num_packets); 768 if (num_packets > max_num_packets * kBufferingThresholdScale) { 769 initial_delay_manager_->DisableBuffering(); 770 return false; 771 } 772 773 // Update statistics. 774 call_stats_.DecodedBySilenceGenerator(); 775 776 // Set the values if already got a packet, otherwise set to default values. 777 if (last_audio_decoder_ >= 0) { 778 current_sample_rate_hz_ = ACMCodecDB::database_[last_audio_decoder_].plfreq; 779 frame->num_channels_ = decoders_[last_audio_decoder_].channels; 780 } else { 781 frame->num_channels_ = 1; 782 } 783 784 // Set the audio frame's sampling frequency. 785 if (desired_sample_rate_hz > 0) { 786 frame->sample_rate_hz_ = desired_sample_rate_hz; 787 } else { 788 frame->sample_rate_hz_ = current_sample_rate_hz_; 789 } 790 791 frame->samples_per_channel_ = frame->sample_rate_hz_ / 100; // Always 10 ms. 792 frame->speech_type_ = AudioFrame::kCNG; 793 frame->vad_activity_ = AudioFrame::kVadPassive; 794 int samples = frame->samples_per_channel_ * frame->num_channels_; 795 memset(frame->data_, 0, samples * sizeof(int16_t)); 796 return true; 797 } 798 799 int AcmReceiver::RtpHeaderToCodecIndex( 800 const RTPHeader &rtp_header, const uint8_t* payload) const { 801 uint8_t payload_type = rtp_header.payloadType; 802 if (ACMCodecDB::kRED >= 0 && // This ensures that RED is defined in WebRTC. 803 decoders_[ACMCodecDB::kRED].registered && 804 payload_type == decoders_[ACMCodecDB::kRED].payload_type) { 805 // This is a RED packet, get the payload of the audio codec. 806 payload_type = payload[0] & 0x7F; 807 } 808 809 // Check if the payload is registered. 810 return PayloadType2CodecIndex(payload_type); 811 } 812 813 uint32_t AcmReceiver::NowInTimestamp(int decoder_sampling_rate) const { 814 // Down-cast the time to (32-6)-bit since we only care about 815 // the least significant bits. (32-6) bits cover 2^(32-6) = 67108864 ms. 816 // We masked 6 most significant bits of 32-bit so there is no overflow in 817 // the conversion from milliseconds to timestamp. 818 const uint32_t now_in_ms = static_cast<uint32_t>( 819 clock_->TimeInMilliseconds() & 0x03ffffff); 820 return static_cast<uint32_t>( 821 (decoder_sampling_rate / 1000) * now_in_ms); 822 } 823 824 // This function only interacts with |neteq_|, therefore, it does not have to 825 // be within critical section of AcmReceiver. It is inserting packets 826 // into NetEq, so we call it when |decode_lock_| is acquired. However, this is 827 // not essential as sync-packets do not interact with codecs (especially BWE). 828 void AcmReceiver::InsertStreamOfSyncPackets( 829 InitialDelayManager::SyncStream* sync_stream) { 830 assert(sync_stream); 831 assert(av_sync_); 832 for (int n = 0; n < sync_stream->num_sync_packets; ++n) { 833 neteq_->InsertSyncPacket(sync_stream->rtp_info, 834 sync_stream->receive_timestamp); 835 ++sync_stream->rtp_info.header.sequenceNumber; 836 sync_stream->rtp_info.header.timestamp += sync_stream->timestamp_step; 837 sync_stream->receive_timestamp += sync_stream->timestamp_step; 838 } 839 } 840 841 void AcmReceiver::GetDecodingCallStatistics( 842 AudioDecodingCallStats* stats) const { 843 CriticalSectionScoped lock(crit_sect_.get()); 844 *stats = call_stats_.GetDecodingStatistics(); 845 } 846 847 } // namespace acm2 848 849 } // namespace webrtc 850