| Index: webrtc/modules/audio_coding/neteq/neteq_impl.cc
|
| diff --git a/webrtc/modules/audio_coding/neteq/neteq_impl.cc b/webrtc/modules/audio_coding/neteq/neteq_impl.cc
|
| index 93699821cfbc430cc6b9fa8daa7cbb2326e8ee64..f899d072176dd16e4b10d93447ffae2df44e6d72 100644
|
| --- a/webrtc/modules/audio_coding/neteq/neteq_impl.cc
|
| +++ b/webrtc/modules/audio_coding/neteq/neteq_impl.cc
|
| @@ -148,13 +148,13 @@ int NetEqImpl::InsertSyncPacket(const WebRtcRTPHeader& rtp_header,
|
| return kOK;
|
| }
|
|
|
| -int NetEqImpl::GetAudio(size_t max_length, int16_t* output_audio,
|
| - size_t* samples_per_channel, size_t* num_channels,
|
| - NetEqOutputType* type) {
|
| +int NetEqImpl::GetAudio(AudioFrame* audio_frame, NetEqOutputType* type) {
|
| TRACE_EVENT0("webrtc", "NetEqImpl::GetAudio");
|
| rtc::CritScope lock(&crit_sect_);
|
| - int error = GetAudioInternal(max_length, output_audio, samples_per_channel,
|
| - num_channels);
|
| + int error = GetAudioInternal(audio_frame);
|
| + RTC_DCHECK_EQ(
|
| + audio_frame->sample_rate_hz_,
|
| + rtc::checked_cast<int>(audio_frame->samples_per_channel_ * 100));
|
| if (error != 0) {
|
| error_code_ = error;
|
| return kFail;
|
| @@ -162,8 +162,7 @@ int NetEqImpl::GetAudio(size_t max_length, int16_t* output_audio,
|
| if (type) {
|
| *type = LastOutputType();
|
| }
|
| - last_output_sample_rate_hz_ =
|
| - rtc::checked_cast<int>(*samples_per_channel * 100);
|
| + last_output_sample_rate_hz_ = audio_frame->sample_rate_hz_;
|
| RTC_DCHECK(last_output_sample_rate_hz_ == 8000 ||
|
| last_output_sample_rate_hz_ == 16000 ||
|
| last_output_sample_rate_hz_ == 32000 ||
|
| @@ -739,10 +738,7 @@ int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header,
|
| return 0;
|
| }
|
|
|
| -int NetEqImpl::GetAudioInternal(size_t max_length,
|
| - int16_t* output,
|
| - size_t* samples_per_channel,
|
| - size_t* num_channels) {
|
| +int NetEqImpl::GetAudioInternal(AudioFrame* audio_frame) {
|
| PacketList packet_list;
|
| DtmfEvent dtmf_event;
|
| Operations operation;
|
| @@ -857,16 +853,18 @@ int NetEqImpl::GetAudioInternal(size_t max_length,
|
| // Extract data from |sync_buffer_| to |output|.
|
| size_t num_output_samples_per_channel = output_size_samples_;
|
| size_t num_output_samples = output_size_samples_ * sync_buffer_->Channels();
|
| - if (num_output_samples > max_length) {
|
| - LOG(LS_WARNING) << "Output array is too short. " << max_length << " < " <<
|
| - output_size_samples_ << " * " << sync_buffer_->Channels();
|
| - num_output_samples = max_length;
|
| - num_output_samples_per_channel = max_length / sync_buffer_->Channels();
|
| - }
|
| - const size_t samples_from_sync =
|
| - sync_buffer_->GetNextAudioInterleaved(num_output_samples_per_channel,
|
| - output);
|
| - *num_channels = sync_buffer_->Channels();
|
| + if (num_output_samples > AudioFrame::kMaxDataSizeSamples) {
|
| + LOG(LS_WARNING) << "Output array is too short. "
|
| + << AudioFrame::kMaxDataSizeSamples << " < "
|
| + << output_size_samples_ << " * "
|
| + << sync_buffer_->Channels();
|
| + num_output_samples = AudioFrame::kMaxDataSizeSamples;
|
| + num_output_samples_per_channel =
|
| + AudioFrame::kMaxDataSizeSamples / sync_buffer_->Channels();
|
| + }
|
| + sync_buffer_->GetNextAudioInterleaved(num_output_samples_per_channel,
|
| + audio_frame);
|
| + audio_frame->sample_rate_hz_ = fs_hz_;
|
| if (sync_buffer_->FutureLength() < expand_->overlap_length()) {
|
| // The sync buffer should always contain |overlap_length| samples, but now
|
| // too many samples have been extracted. Reinstall the |overlap_length|
|
| @@ -877,22 +875,22 @@ int NetEqImpl::GetAudioInternal(size_t max_length,
|
| sync_buffer_->set_next_index(sync_buffer_->next_index() -
|
| missing_lookahead_samples);
|
| }
|
| - if (samples_from_sync != output_size_samples_) {
|
| - LOG(LS_ERROR) << "samples_from_sync (" << samples_from_sync
|
| + if (audio_frame->samples_per_channel_ != output_size_samples_) {
|
| + LOG(LS_ERROR) << "audio_frame->samples_per_channel_ ("
|
| + << audio_frame->samples_per_channel_
|
| << ") != output_size_samples_ (" << output_size_samples_
|
| << ")";
|
| // TODO(minyue): treatment of under-run, filling zeros
|
| - memset(output, 0, num_output_samples * sizeof(int16_t));
|
| - *samples_per_channel = output_size_samples_;
|
| + memset(audio_frame->data_, 0, num_output_samples * sizeof(int16_t));
|
| return kSampleUnderrun;
|
| }
|
| - *samples_per_channel = output_size_samples_;
|
|
|
| // Should always have overlap samples left in the |sync_buffer_|.
|
| RTC_DCHECK_GE(sync_buffer_->FutureLength(), expand_->overlap_length());
|
|
|
| if (play_dtmf) {
|
| - return_value = DtmfOverdub(dtmf_event, sync_buffer_->Channels(), output);
|
| + return_value =
|
| + DtmfOverdub(dtmf_event, sync_buffer_->Channels(), audio_frame->data_);
|
| }
|
|
|
| // Update the background noise parameters if last operation wrote data
|
|
|