2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
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.
11 #include "webrtc/modules/audio_coding/main/acm2/acm_receiver.h"
13 #include <stdlib.h> // malloc
15 #include <algorithm> // sort
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"
38 const int kNackThresholdPackets = 2;
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,
44 AudioFrame* audio_frame) {
48 audio_frame->vad_activity_ = AudioFrame::kVadActive;
49 audio_frame->speech_type_ = AudioFrame::kNormalSpeech;
52 case kOutputVADPassive: {
53 audio_frame->vad_activity_ = AudioFrame::kVadPassive;
54 audio_frame->speech_type_ = AudioFrame::kNormalSpeech;
58 audio_frame->vad_activity_ = AudioFrame::kVadPassive;
59 audio_frame->speech_type_ = AudioFrame::kCNG;
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;
68 case kOutputPLCtoCNG: {
69 audio_frame->vad_activity_ = AudioFrame::kVadPassive;
70 audio_frame->speech_type_ = AudioFrame::kPLCCNG;
77 // Always return kVadUnknown when receive VAD is inactive
78 audio_frame->vad_activity_ = AudioFrame::kVadUnknown;
81 audio_frame->speech_type_ = AudioFrame::kNormalSpeech;
85 audio_frame->speech_type_ = AudioFrame::kCNG;
89 audio_frame->speech_type_ = AudioFrame::kPLC;
92 case kOutputPLCtoCNG: {
93 audio_frame->speech_type_ = AudioFrame::kPLCCNG;
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";
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);
119 AcmReceiver::AcmReceiver(const AudioCodingModule::Config& config)
120 : crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
122 last_audio_decoder_(-1), // Invalid value.
123 previous_audio_activity_(AudioFrame::kVadPassive),
124 current_sample_rate_hz_(config.neteq_config.sample_rate_hz),
126 nack_enabled_(false),
127 neteq_(NetEq::Create(config.neteq_config)),
129 clock_(config.clock),
131 initial_delay_manager_(),
132 missing_packets_sync_stream_(),
133 late_packets_sync_stream_() {
135 for (int n = 0; n < ACMCodecDB::kMaxNumCodecs; ++n) {
136 decoders_[n].registered = false;
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.
145 neteq_->DisableVad();
148 AcmReceiver::~AcmReceiver() {
152 int AcmReceiver::SetMinimumDelay(int delay_ms) {
153 if (neteq_->SetMinimumDelay(delay_ms))
155 LOG_FERR1(LS_ERROR, "AcmReceiver::SetExtraDelay", delay_ms);
159 int AcmReceiver::SetInitialDelay(int delay_ms) {
160 if (delay_ms < 0 || delay_ms > 10000) {
163 CriticalSectionScoped lock(crit_sect_.get());
167 initial_delay_manager_.reset();
168 missing_packets_sync_stream_.reset();
169 late_packets_sync_stream_.reset();
170 neteq_->SetMinimumDelay(0);
174 if (av_sync_ && initial_delay_manager_->PacketBuffered()) {
175 // Too late for this API. Only works before a call is started.
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))
186 const int kLatePacketThreshold = 5;
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);
195 int AcmReceiver::SetMaximumDelay(int delay_ms) {
196 if (neteq_->SetMaximumDelay(delay_ms))
198 LOG_FERR1(LS_ERROR, "AcmReceiver::SetExtraDelay", delay_ms);
202 int AcmReceiver::LeastRequiredDelayMs() const {
203 return neteq_->LeastRequiredDelayMs();
206 int AcmReceiver::current_sample_rate_hz() const {
207 CriticalSectionScoped lock(crit_sect_.get());
208 return current_sample_rate_hz_;
211 // TODO(turajs): use one set of enumerators, e.g. the one defined in
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;
219 playout_mode = kPlayoutOn;
221 case fax: // No change to background noise mode.
222 playout_mode = kPlayoutFax;
225 playout_mode = kPlayoutStreaming;
228 playout_mode = kPlayoutOff;
231 neteq_->SetPlayoutMode(playout_mode);
234 AudioPlayoutMode AcmReceiver::PlayoutMode() const {
235 AudioPlayoutMode acm_mode = voice;
236 NetEqPlayoutMode mode = neteq_->PlayoutMode();
247 case kPlayoutStreaming:
248 acm_mode = streaming;
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.
266 CriticalSectionScoped lock(crit_sect_.get());
268 int codec_id = RtpHeaderToCodecIndex(*header, incoming_payload);
270 LOG_F(LS_ERROR) << "Payload-type " << header->payloadType
271 << " is not registered.";
274 assert(codec_id < ACMCodecDB::kMaxNumCodecs);
275 const int sample_rate_hz = ACMCodecDB::CodecFreq(codec_id);
276 receive_timestamp = NowInTimestamp(sample_rate_hz);
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)
284 packet_type = InitialDelayManager::kCngPacket;
285 } else if (codec_id == ACMCodecDB::kAVT) {
286 packet_type = InitialDelayManager::kAvtPacket;
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.
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).
302 nack_->UpdateSampleRate(sample_rate_hz);
304 last_audio_decoder_ = codec_id;
306 packet_type = InitialDelayManager::kAudioPacket;
311 nack_->UpdateLastReceivedPacket(header->sequenceNumber,
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());
325 } // |crit_sect_| is released.
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());
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";
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;
348 bool return_silence = false;
351 // Accessing members, take the lock.
352 CriticalSectionScoped lock(crit_sect_.get());
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());
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_;
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.
384 if (neteq_->GetAudio(AudioFrame::kMaxDataSizeSamples,
386 &samples_per_channel,
387 &num_channels, &type) != NetEq::kOK) {
388 LOG_FERR0(LS_ERROR, "AcmReceiver::GetAudio") << "NetEq Failed.";
392 // Accessing members, take the lock.
393 CriticalSectionScoped lock(crit_sect_.get());
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);
402 nack_->UpdateLastDecodedPacket(decoded_sequence_num, decoded_timestamp);
405 // NetEq always returns 10 ms of audio.
406 current_sample_rate_hz_ = samples_per_channel * 100;
408 // Update if resampling is required.
409 bool need_resampling = (desired_freq_hz != -1) &&
410 (current_sample_rate_hz_ != desired_freq_hz);
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_,
420 AudioFrame::kMaxDataSizeSamples,
422 if (samples_per_channel < 0) {
423 LOG_FERR0(LS_ERROR, "AcmReceiver::GetAudio") << "Resampler Failed.";
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));
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_,
440 AudioFrame::kMaxDataSizeSamples,
442 if (samples_per_channel < 0) {
443 LOG_FERR0(LS_ERROR, "AcmReceiver::GetAudio") << "Resampler Failed.";
446 memcpy(audio_frame->data_, audio_buffer_, samples_per_channel *
447 num_channels * sizeof(int16_t));
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;
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_);
461 // Computes the RTP timestamp of the first sample in |audio_frame| from
462 // |GetPlayoutTimestamp|, which is the timestamp of the last sample of
464 uint32_t playout_timestamp = 0;
465 if (GetPlayoutTimestamp(&playout_timestamp)) {
466 audio_frame->timestamp_ =
467 playout_timestamp - audio_frame->samples_per_channel_;
469 // Remain 0 until we have a valid |playout_timestamp|.
470 audio_frame->timestamp_ = 0;
476 int32_t AcmReceiver::AddCodec(int acm_codec_id,
477 uint8_t payload_type,
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];
483 // Make sure the right decoder is registered for Opus.
484 if (neteq_decoder == kDecoderOpus && channels == 2) {
485 neteq_decoder = kDecoderOpus_2ch;
488 CriticalSectionScoped lock(crit_sect_.get());
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
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) !=
504 LOG_F(LS_ERROR) << "Cannot remover payload "
505 << decoders_[acm_codec_id].payload_type;
511 if (!audio_decoder) {
512 ret_val = neteq_->RegisterPayloadType(neteq_decoder, payload_type);
514 ret_val = neteq_->RegisterExternalDecoder(
515 audio_decoder, neteq_decoder, payload_type);
517 if (ret_val != NetEq::kOK) {
518 LOG_FERR3(LS_ERROR, "AcmReceiver::AddCodec", acm_codec_id, payload_type,
520 // Registration failed, delete the allocated space and set the pointer to
521 // NULL, for the record.
522 decoders_[acm_codec_id].registered = false;
526 decoders_[acm_codec_id].registered = true;
527 decoders_[acm_codec_id].payload_type = payload_type;
528 decoders_[acm_codec_id].channels = channels;
532 void AcmReceiver::EnableVad() {
534 CriticalSectionScoped lock(crit_sect_.get());
538 void AcmReceiver::DisableVad() {
539 neteq_->DisableVad();
540 CriticalSectionScoped lock(crit_sect_.get());
541 vad_enabled_ = false;
544 void AcmReceiver::FlushBuffers() {
545 neteq_->FlushBuffers();
548 // If failed in removing one of the codecs, this method continues to remove as
550 int AcmReceiver::RemoveAllCodecs() {
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;
558 LOG_F(LS_ERROR) << "Cannot remove payload "
559 << decoders_[n].payload_type;
564 // No codec is registered, invalidate last audio decoder.
565 last_audio_decoder_ = -1;
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.
574 if (neteq_->RemovePayloadType(payload_type) != NetEq::kOK) {
575 LOG_FERR1(LS_ERROR, "AcmReceiver::RemoveCodec", payload_type);
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.
585 void AcmReceiver::set_id(int id) {
586 CriticalSectionScoped lock(crit_sect_.get());
590 bool AcmReceiver::GetPlayoutTimestamp(uint32_t* timestamp) {
592 assert(initial_delay_manager_.get());
593 if (initial_delay_manager_->buffering()) {
594 return initial_delay_manager_->GetPlayoutTimestamp(timestamp);
597 return neteq_->GetPlayoutTimestamp(timestamp);
600 int AcmReceiver::last_audio_codec_id() const {
601 CriticalSectionScoped lock(crit_sect_.get());
602 return last_audio_decoder_;
605 int AcmReceiver::last_audio_payload_type() const {
606 CriticalSectionScoped lock(crit_sect_.get());
607 if (last_audio_decoder_ < 0)
609 assert(decoders_[last_audio_decoder_].registered);
610 return decoders_[last_audio_decoder_].payload_type;
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.";
620 return decoders_[ACMCodecDB::kRED].payload_type;
623 int AcmReceiver::LastAudioCodec(CodecInst* codec) const {
624 CriticalSectionScoped lock(crit_sect_.get());
625 if (last_audio_decoder_ < 0) {
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;
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);
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;
651 std::vector<int> waiting_times;
652 neteq_->WaitingTimes(&waiting_times);
653 size_t size = waiting_times.size();
655 acm_stat->meanWaitingTimeMs = -1;
656 acm_stat->medianWaitingTimeMs = -1;
657 acm_stat->minWaitingTimeMs = -1;
658 acm_stat->maxWaitingTimeMs = -1;
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;
665 acm_stat->medianWaitingTimeMs = waiting_times[size / 2];
667 acm_stat->minWaitingTimeMs = waiting_times.front();
668 acm_stat->maxWaitingTimeMs = waiting_times.back();
670 for (size_t i = 0; i < size; ++i) {
671 sum += waiting_times[i];
673 acm_stat->meanWaitingTimeMs = static_cast<int>(sum / size);
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);
685 memcpy(codec, &ACMCodecDB::database_[codec_index], sizeof(CodecInst));
686 codec->pltype = decoders_[codec_index].payload_type;
687 codec->channels = decoders_[codec_index].channels;
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) {
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)
705 CriticalSectionScoped lock(crit_sect_.get());
706 if (!nack_enabled_) {
707 nack_.reset(Nack::Create(kNackThresholdPackets));
708 nack_enabled_ = true;
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);
717 return nack_->SetMaxNackListSize(max_nack_list_size);
720 void AcmReceiver::DisableNack() {
721 CriticalSectionScoped lock(crit_sect_.get());
722 nack_.reset(); // Memory is released.
723 nack_enabled_ = false;
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);
734 if (nack_enabled_ && round_trip_time_ms >= 0) {
736 return nack_->GetNackList(round_trip_time_ms);
738 std::vector<uint16_t> empty_list;
742 void AcmReceiver::ResetInitialDelay() {
744 CriticalSectionScoped lock(crit_sect_.get());
746 initial_delay_manager_.reset(NULL);
747 missing_packets_sync_stream_.reset(NULL);
748 late_packets_sync_stream_.reset(NULL);
750 neteq_->SetMinimumDelay(0);
751 // TODO(turajs): Should NetEq Buffer be flushed?
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) {
757 assert(initial_delay_manager_.get());
758 if (!initial_delay_manager_->buffering()) {
762 // We stop accumulating packets, if the number of packets or the total size
763 // exceeds a threshold.
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();
773 // Update statistics.
774 call_stats_.DecodedBySilenceGenerator();
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;
781 frame->num_channels_ = 1;
784 // Set the audio frame's sampling frequency.
785 if (desired_sample_rate_hz > 0) {
786 frame->sample_rate_hz_ = desired_sample_rate_hz;
788 frame->sample_rate_hz_ = current_sample_rate_hz_;
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));
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;
809 // Check if the payload is registered.
810 return PayloadType2CodecIndex(payload_type);
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);
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) {
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;
841 void AcmReceiver::GetDecodingCallStatistics(
842 AudioDecodingCallStats* stats) const {
843 CriticalSectionScoped lock(crit_sect_.get());
844 *stats = call_stats_.GetDecodingStatistics();
849 } // namespace webrtc