| Index: webrtc/modules/audio_coding/neteq/expand.cc
|
| diff --git a/webrtc/modules/audio_coding/neteq/expand.cc b/webrtc/modules/audio_coding/neteq/expand.cc
|
| index 5cb18db462a7a260bf6aa56880be0a27b81b19c7..c2c88c83a4f0d69fc08aeea14b2b0e3a055bf2a9 100644
|
| --- a/webrtc/modules/audio_coding/neteq/expand.cc
|
| +++ b/webrtc/modules/audio_coding/neteq/expand.cc
|
| @@ -112,25 +112,33 @@ int Expand::Process(AudioMultiVector* output) {
|
| // Use only expand_vector0.
|
| assert(expansion_vector_position + temp_length <=
|
| parameters.expand_vector0.Size());
|
| - memcpy(voiced_vector_storage,
|
| - ¶meters.expand_vector0[expansion_vector_position],
|
| - sizeof(int16_t) * temp_length);
|
| + parameters.expand_vector0.CopyTo(temp_length, expansion_vector_position,
|
| + voiced_vector_storage);
|
| } else if (current_lag_index_ == 1) {
|
| + std::unique_ptr<int16_t[]> temp_0(new int16_t[temp_length]);
|
| + parameters.expand_vector0.CopyTo(temp_length, expansion_vector_position,
|
| + temp_0.get());
|
| + std::unique_ptr<int16_t[]> temp_1(new int16_t[temp_length]);
|
| + parameters.expand_vector1.CopyTo(temp_length, expansion_vector_position,
|
| + temp_1.get());
|
| // Mix 3/4 of expand_vector0 with 1/4 of expand_vector1.
|
| - WebRtcSpl_ScaleAndAddVectorsWithRound(
|
| - ¶meters.expand_vector0[expansion_vector_position], 3,
|
| - ¶meters.expand_vector1[expansion_vector_position], 1, 2,
|
| - voiced_vector_storage, temp_length);
|
| + WebRtcSpl_ScaleAndAddVectorsWithRound(temp_0.get(), 3, temp_1.get(), 1, 2,
|
| + voiced_vector_storage, temp_length);
|
| } else if (current_lag_index_ == 2) {
|
| // Mix 1/2 of expand_vector0 with 1/2 of expand_vector1.
|
| assert(expansion_vector_position + temp_length <=
|
| parameters.expand_vector0.Size());
|
| assert(expansion_vector_position + temp_length <=
|
| parameters.expand_vector1.Size());
|
| - WebRtcSpl_ScaleAndAddVectorsWithRound(
|
| - ¶meters.expand_vector0[expansion_vector_position], 1,
|
| - ¶meters.expand_vector1[expansion_vector_position], 1, 1,
|
| - voiced_vector_storage, temp_length);
|
| +
|
| + std::unique_ptr<int16_t[]> temp_0(new int16_t[temp_length]);
|
| + parameters.expand_vector0.CopyTo(temp_length, expansion_vector_position,
|
| + temp_0.get());
|
| + std::unique_ptr<int16_t[]> temp_1(new int16_t[temp_length]);
|
| + parameters.expand_vector1.CopyTo(temp_length, expansion_vector_position,
|
| + temp_1.get());
|
| + WebRtcSpl_ScaleAndAddVectorsWithRound(temp_0.get(), 1, temp_1.get(), 1, 1,
|
| + voiced_vector_storage, temp_length);
|
| }
|
|
|
| // Get tapering window parameters. Values are in Q15.
|
| @@ -299,8 +307,7 @@ int Expand::Process(AudioMultiVector* output) {
|
| } else {
|
| assert(output->Size() == current_lag);
|
| }
|
| - memcpy(&(*output)[channel_ix][0], temp_data,
|
| - sizeof(temp_data[0]) * current_lag);
|
| + (*output)[channel_ix].OverwriteAt(temp_data, current_lag, 0);
|
| }
|
|
|
| // Increase call number and cap it.
|
| @@ -373,8 +380,11 @@ void Expand::AnalyzeSignal(int16_t* random_vector) {
|
| size_t fs_mult_lpc_analysis_len = fs_mult * kLpcAnalysisLength;
|
|
|
| const size_t signal_length = static_cast<size_t>(256 * fs_mult);
|
| - const int16_t* audio_history =
|
| - &(*sync_buffer_)[0][sync_buffer_->Size() - signal_length];
|
| +
|
| + const size_t audio_history_position = sync_buffer_->Size() - signal_length;
|
| + std::unique_ptr<int16_t[]> audio_history(new int16_t[signal_length]);
|
| + (*sync_buffer_)[0].CopyTo(signal_length, audio_history_position,
|
| + audio_history.get());
|
|
|
| // Initialize.
|
| InitializeForAnExpandPeriod();
|
| @@ -383,7 +393,7 @@ void Expand::AnalyzeSignal(int16_t* random_vector) {
|
| size_t correlation_length = 51; // TODO(hlundin): Legacy bit-exactness.
|
| // If it is decided to break bit-exactness |correlation_length| should be
|
| // initialized to the return value of Correlation().
|
| - Correlation(audio_history, signal_length, correlation_vector);
|
| + Correlation(audio_history.get(), signal_length, correlation_vector);
|
|
|
| // Find peaks in correlation vector.
|
| DspHelper::PeakDetection(correlation_vector, correlation_length,
|
| @@ -540,12 +550,14 @@ void Expand::AnalyzeSignal(int16_t* random_vector) {
|
| parameters.expand_vector1.Extend(
|
| expansion_length - parameters.expand_vector1.Size());
|
| }
|
| - WebRtcSpl_AffineTransformVector(¶meters.expand_vector1[0],
|
| + std::unique_ptr<int16_t[]> temp_1(new int16_t[expansion_length]);
|
| + WebRtcSpl_AffineTransformVector(temp_1.get(),
|
| const_cast<int16_t*>(vector2),
|
| amplitude_ratio,
|
| 4096,
|
| 13,
|
| expansion_length);
|
| + parameters.expand_vector1.OverwriteAt(temp_1.get(), expansion_length, 0);
|
| } else {
|
| // Energy change constraint not fulfilled. Only use last vector.
|
| parameters.expand_vector0.Clear();
|
|
|