| 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 -
|
|
|