blob: 45d78d0823d680b3a05a86630ad4dcea6a725632 [file] [log] [blame]
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001/*
2 * Copyright (c) 2012 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_AUDIO_CODING_NETEQ_EXPAND_H_
12#define MODULES_AUDIO_CODING_NETEQ_EXPAND_H_
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000013
14#include <assert.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020015
kwiberg2d0c3322016-02-14 09:28:33 -080016#include <memory>
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000017
Yves Gerey988cc082018-10-23 12:03:01 +020018#include "modules/audio_coding/neteq/audio_vector.h"
Steve Anton10542f22019-01-11 09:11:00 -080019#include "rtc_base/constructor_magic.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000020
21namespace webrtc {
22
23// Forward declarations.
Yves Gerey988cc082018-10-23 12:03:01 +020024class AudioMultiVector;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000025class BackgroundNoise;
26class RandomVector;
Henrik Lundinbef77e22015-08-18 14:58:09 +020027class StatisticsCalculator;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000028class SyncBuffer;
29
30// This class handles extrapolation of audio data from the sync_buffer to
31// produce packet-loss concealment.
32// TODO(hlundin): Refactor this class to divide the long methods into shorter
33// ones.
34class Expand {
35 public:
36 Expand(BackgroundNoise* background_noise,
37 SyncBuffer* sync_buffer,
38 RandomVector* random_vector,
Henrik Lundinbef77e22015-08-18 14:58:09 +020039 StatisticsCalculator* statistics,
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000040 int fs,
Karl Wiberg7f6c4d42015-04-09 15:44:22 +020041 size_t num_channels);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000042
Karl Wiberg7f6c4d42015-04-09 15:44:22 +020043 virtual ~Expand();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000044
45 // Resets the object.
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000046 virtual void Reset();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000047
48 // The main method to produce concealment data. The data is appended to the
49 // end of |output|.
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000050 virtual int Process(AudioMultiVector* output);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000051
52 // Prepare the object to do extra expansion during normal operation following
53 // a period of expands.
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000054 virtual void SetParametersForNormalAfterExpand();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000055
56 // Prepare the object to do extra expansion during merge operation following
57 // a period of expands.
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000058 virtual void SetParametersForMergeAfterExpand();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000059
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000060 // Returns the mute factor for |channel|.
Ivo Creusenc7f09ad2018-05-22 13:21:01 +020061 int16_t MuteFactor(size_t channel) const {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000062 assert(channel < num_channels_);
63 return channel_parameters_[channel].mute_factor;
64 }
65
henrik.lundinf3995f72016-05-10 05:54:35 -070066 // Returns true if expansion has been faded down to zero amplitude (for all
67 // channels); false otherwise.
68 bool Muted() const;
69
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000070 // Accessors and mutators.
Karl Wiberg7f6c4d42015-04-09 15:44:22 +020071 virtual size_t overlap_length() const;
Peter Kastingdce40cf2015-08-24 14:52:23 -070072 size_t max_lag() const { return max_lag_; }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000073
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000074 protected:
75 static const int kMaxConsecutiveExpands = 200;
Peter Kastingb7e50542015-06-11 12:55:50 -070076 void GenerateRandomVector(int16_t seed_increment,
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000077 size_t length,
78 int16_t* random_vector);
79
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000080 // Initializes member variables at the beginning of an expand period.
81 void InitializeForAnExpandPeriod();
82
83 bool TooManyExpands();
84
85 // Analyzes the signal history in |sync_buffer_|, and set up all parameters
86 // necessary to produce concealment data.
87 void AnalyzeSignal(int16_t* random_vector);
88
Henrik Lundinbef77e22015-08-18 14:58:09 +020089 RandomVector* const random_vector_;
90 SyncBuffer* const sync_buffer_;
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000091 bool first_expand_;
92 const int fs_hz_;
93 const size_t num_channels_;
94 int consecutive_expands_;
95
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000096 private:
Peter Kastingdce40cf2015-08-24 14:52:23 -070097 static const size_t kUnvoicedLpcOrder = 6;
98 static const size_t kNumCorrelationCandidates = 3;
99 static const size_t kDistortionLength = 20;
100 static const size_t kLpcAnalysisLength = 160;
101 static const size_t kMaxSampleRate = 48000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000102 static const int kNumLags = 3;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000103
104 struct ChannelParameters {
Karl Wiberg7f6c4d42015-04-09 15:44:22 +0200105 ChannelParameters();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000106 int16_t mute_factor;
107 int16_t ar_filter[kUnvoicedLpcOrder + 1];
108 int16_t ar_filter_state[kUnvoicedLpcOrder];
109 int16_t ar_gain;
110 int16_t ar_gain_scale;
Yves Gerey665174f2018-06-19 15:03:05 +0200111 int16_t voice_mix_factor; /* Q14 */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000112 int16_t current_voice_mix_factor; /* Q14 */
henrik.lundin@webrtc.org1871dd22013-10-14 20:33:25 +0000113 AudioVector expand_vector0;
114 AudioVector expand_vector1;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000115 bool onset;
Peter Kasting36b7cc32015-06-11 19:57:18 -0700116 int mute_slope; /* Q20 */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000117 };
118
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000119 // Calculate the auto-correlation of |input|, with length |input_length|
120 // samples. The correlation is calculated from a downsampled version of
minyue53ff70f2016-05-02 01:50:30 -0700121 // |input|, and is written to |output|.
Peter Kasting728d9032015-06-11 14:31:38 -0700122 void Correlation(const int16_t* input,
123 size_t input_length,
minyue53ff70f2016-05-02 01:50:30 -0700124 int16_t* output) const;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000125
126 void UpdateLagIndex();
127
Henrik Lundinbef77e22015-08-18 14:58:09 +0200128 BackgroundNoise* const background_noise_;
129 StatisticsCalculator* const statistics_;
henrik.lundin@webrtc.org340746a2014-02-17 11:37:16 +0000130 const size_t overlap_length_;
Peter Kastingdce40cf2015-08-24 14:52:23 -0700131 size_t max_lag_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000132 size_t expand_lags_[kNumLags];
133 int lag_index_direction_;
134 int current_lag_index_;
135 bool stop_muting_;
Henrik Lundinbef77e22015-08-18 14:58:09 +0200136 size_t expand_duration_samples_;
kwiberg2d0c3322016-02-14 09:28:33 -0800137 std::unique_ptr<ChannelParameters[]> channel_parameters_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000138
henrikg3c089d72015-09-16 05:37:44 -0700139 RTC_DISALLOW_COPY_AND_ASSIGN(Expand);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000140};
141
henrik.lundin@webrtc.orgd9faa462014-01-14 10:18:45 +0000142struct ExpandFactory {
143 ExpandFactory() {}
144 virtual ~ExpandFactory() {}
145
146 virtual Expand* Create(BackgroundNoise* background_noise,
147 SyncBuffer* sync_buffer,
148 RandomVector* random_vector,
Henrik Lundinbef77e22015-08-18 14:58:09 +0200149 StatisticsCalculator* statistics,
henrik.lundin@webrtc.orgd9faa462014-01-14 10:18:45 +0000150 int fs,
151 size_t num_channels) const;
152};
153
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000154} // namespace webrtc
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200155#endif // MODULES_AUDIO_CODING_NETEQ_EXPAND_H_