Home | History | Annotate | Download | only in acm2
      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