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