| Index: webrtc/modules/audio_coding/acm2/acm_receiver.cc
 | 
| diff --git a/webrtc/modules/audio_coding/acm2/acm_receiver.cc b/webrtc/modules/audio_coding/acm2/acm_receiver.cc
 | 
| index 39d8a0d175e44aa5432a2997759cf0ae671481f0..02d165a2d5a11a9c72cfc45af7cae96a612696d0 100644
 | 
| --- a/webrtc/modules/audio_coding/acm2/acm_receiver.cc
 | 
| +++ b/webrtc/modules/audio_coding/acm2/acm_receiver.cc
 | 
| @@ -18,6 +18,7 @@
 | 
|  #include "webrtc/base/checks.h"
 | 
|  #include "webrtc/base/format_macros.h"
 | 
|  #include "webrtc/base/logging.h"
 | 
| +#include "webrtc/base/safe_conversions.h"
 | 
|  #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
 | 
|  #include "webrtc/common_types.h"
 | 
|  #include "webrtc/modules/audio_coding/codecs/audio_decoder.h"
 | 
| @@ -120,14 +121,12 @@ bool IsCng(int codec_id) {
 | 
|  AcmReceiver::AcmReceiver(const AudioCodingModule::Config& config)
 | 
|      : last_audio_decoder_(nullptr),
 | 
|        previous_audio_activity_(AudioFrame::kVadPassive),
 | 
| -      audio_buffer_(new int16_t[AudioFrame::kMaxDataSizeSamples]),
 | 
|        last_audio_buffer_(new int16_t[AudioFrame::kMaxDataSizeSamples]),
 | 
|        neteq_(NetEq::Create(config.neteq_config)),
 | 
|        vad_enabled_(config.neteq_config.enable_post_decode_vad),
 | 
|        clock_(config.clock),
 | 
|        resampled_last_output_frame_(true) {
 | 
|    assert(clock_);
 | 
| -  memset(audio_buffer_.get(), 0, AudioFrame::kMaxDataSizeSamples);
 | 
|    memset(last_audio_buffer_.get(), 0, AudioFrame::kMaxDataSizeSamples);
 | 
|  }
 | 
|  
 | 
| @@ -208,19 +207,11 @@ int AcmReceiver::InsertPacket(const WebRtcRTPHeader& rtp_header,
 | 
|  }
 | 
|  
 | 
|  int AcmReceiver::GetAudio(int desired_freq_hz, AudioFrame* audio_frame) {
 | 
| -  enum NetEqOutputType type;
 | 
| -  size_t samples_per_channel;
 | 
| -  size_t num_channels;
 | 
| -
 | 
|    // Accessing members, take the lock.
 | 
|    rtc::CritScope lock(&crit_sect_);
 | 
|  
 | 
| -  // Always write the output to |audio_buffer_| first.
 | 
| -  if (neteq_->GetAudio(AudioFrame::kMaxDataSizeSamples,
 | 
| -                       audio_buffer_.get(),
 | 
| -                       &samples_per_channel,
 | 
| -                       &num_channels,
 | 
| -                       &type) != NetEq::kOK) {
 | 
| +  enum NetEqOutputType type;
 | 
| +  if (neteq_->GetAudio(audio_frame, &type) != NetEq::kOK) {
 | 
|      LOG(LERROR) << "AcmReceiver::GetAudio - NetEq Failed.";
 | 
|      return -1;
 | 
|    }
 | 
| @@ -236,44 +227,42 @@ int AcmReceiver::GetAudio(int desired_freq_hz, AudioFrame* audio_frame) {
 | 
|      int16_t temp_output[AudioFrame::kMaxDataSizeSamples];
 | 
|      int samples_per_channel_int = resampler_.Resample10Msec(
 | 
|          last_audio_buffer_.get(), current_sample_rate_hz, desired_freq_hz,
 | 
| -        num_channels, AudioFrame::kMaxDataSizeSamples, temp_output);
 | 
| +        audio_frame->num_channels_, AudioFrame::kMaxDataSizeSamples,
 | 
| +        temp_output);
 | 
|      if (samples_per_channel_int < 0) {
 | 
|        LOG(LERROR) << "AcmReceiver::GetAudio - "
 | 
|                       "Resampling last_audio_buffer_ failed.";
 | 
|        return -1;
 | 
|      }
 | 
| -    samples_per_channel = static_cast<size_t>(samples_per_channel_int);
 | 
|    }
 | 
|  
 | 
| -  // The audio in |audio_buffer_| is tansferred to |audio_frame_| below, either
 | 
| -  // through resampling, or through straight memcpy.
 | 
|    // TODO(henrik.lundin) Glitches in the output may appear if the output rate
 | 
|    // from NetEq changes. See WebRTC issue 3923.
 | 
|    if (need_resampling) {
 | 
|      int samples_per_channel_int = resampler_.Resample10Msec(
 | 
| -        audio_buffer_.get(), current_sample_rate_hz, desired_freq_hz,
 | 
| -        num_channels, AudioFrame::kMaxDataSizeSamples, audio_frame->data_);
 | 
| +        audio_frame->data_, current_sample_rate_hz, desired_freq_hz,
 | 
| +        audio_frame->num_channels_, AudioFrame::kMaxDataSizeSamples,
 | 
| +        audio_frame->data_);
 | 
|      if (samples_per_channel_int < 0) {
 | 
|        LOG(LERROR) << "AcmReceiver::GetAudio - Resampling audio_buffer_ failed.";
 | 
|        return -1;
 | 
|      }
 | 
| -    samples_per_channel = static_cast<size_t>(samples_per_channel_int);
 | 
| +    audio_frame->samples_per_channel_ =
 | 
| +        static_cast<size_t>(samples_per_channel_int);
 | 
| +    audio_frame->sample_rate_hz_ = desired_freq_hz;
 | 
| +    RTC_DCHECK_EQ(
 | 
| +        audio_frame->sample_rate_hz_,
 | 
| +        rtc::checked_cast<int>(audio_frame->samples_per_channel_ * 100));
 | 
|      resampled_last_output_frame_ = true;
 | 
|    } else {
 | 
|      resampled_last_output_frame_ = false;
 | 
|      // We might end up here ONLY if codec is changed.
 | 
| -    memcpy(audio_frame->data_,
 | 
| -           audio_buffer_.get(),
 | 
| -           samples_per_channel * num_channels * sizeof(int16_t));
 | 
|    }
 | 
|  
 | 
| -  // Swap buffers, so that the current audio is stored in |last_audio_buffer_|
 | 
| -  // for next time.
 | 
| -  audio_buffer_.swap(last_audio_buffer_);
 | 
| -
 | 
| -  audio_frame->num_channels_ = num_channels;
 | 
| -  audio_frame->samples_per_channel_ = samples_per_channel;
 | 
| -  audio_frame->sample_rate_hz_ = static_cast<int>(samples_per_channel * 100);
 | 
| +  // Store current audio in |last_audio_buffer_| for next time.
 | 
| +  memcpy(last_audio_buffer_.get(), audio_frame->data_,
 | 
| +         sizeof(int16_t) * audio_frame->samples_per_channel_ *
 | 
| +             audio_frame->num_channels_);
 | 
|  
 | 
|    // Should set |vad_activity| before calling SetAudioFrameActivityAndType().
 | 
|    audio_frame->vad_activity_ = previous_audio_activity_;
 | 
| @@ -284,6 +273,7 @@ int AcmReceiver::GetAudio(int desired_freq_hz, AudioFrame* audio_frame) {
 | 
|    // Computes the RTP timestamp of the first sample in |audio_frame| from
 | 
|    // |GetPlayoutTimestamp|, which is the timestamp of the last sample of
 | 
|    // |audio_frame|.
 | 
| +  // TODO(henrik.lundin) Move setting of audio_frame->timestamp_ inside NetEq.
 | 
|    uint32_t playout_timestamp = 0;
 | 
|    if (GetPlayoutTimestamp(&playout_timestamp)) {
 | 
|      audio_frame->timestamp_ = playout_timestamp -
 | 
| 
 |