blob: 2e64583ec272d4b36ef17ca0bfb3fe1b390dc555 [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
Jonas Olssona4d87372019-07-05 19:08:33 +020014
kwiberg2d0c3322016-02-14 09:28:33 -080015#include <memory>
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000016
Yves Gerey988cc082018-10-23 12:03:01 +020017#include "modules/audio_coding/neteq/audio_vector.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000018
19namespace webrtc {
20
21// Forward declarations.
Yves Gerey988cc082018-10-23 12:03:01 +020022class AudioMultiVector;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000023class BackgroundNoise;
24class RandomVector;
Henrik Lundinbef77e22015-08-18 14:58:09 +020025class StatisticsCalculator;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000026class SyncBuffer;
27
28// This class handles extrapolation of audio data from the sync_buffer to
29// produce packet-loss concealment.
30// TODO(hlundin): Refactor this class to divide the long methods into shorter
31// ones.
32class Expand {
33 public:
34 Expand(BackgroundNoise* background_noise,
35 SyncBuffer* sync_buffer,
36 RandomVector* random_vector,
Henrik Lundinbef77e22015-08-18 14:58:09 +020037 StatisticsCalculator* statistics,
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000038 int fs,
Karl Wiberg7f6c4d42015-04-09 15:44:22 +020039 size_t num_channels);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000040
Karl Wiberg7f6c4d42015-04-09 15:44:22 +020041 virtual ~Expand();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000042
Byoungchan Lee604fd2f2022-01-21 09:49:39 +090043 Expand(const Expand&) = delete;
44 Expand& operator=(const Expand&) = delete;
45
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000046 // Resets the object.
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000047 virtual void Reset();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000048
49 // The main method to produce concealment data. The data is appended to the
Artem Titovd00ce742021-07-28 20:00:17 +020050 // end of `output`.
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000051 virtual int Process(AudioMultiVector* output);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000052
53 // Prepare the object to do extra expansion during normal operation following
54 // a period of expands.
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000055 virtual void SetParametersForNormalAfterExpand();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000056
57 // Prepare the object to do extra expansion during merge operation following
58 // a period of expands.
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000059 virtual void SetParametersForMergeAfterExpand();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000060
Artem Titovd00ce742021-07-28 20:00:17 +020061 // Returns the mute factor for `channel`.
Ivo Creusenc7f09ad2018-05-22 13:21:01 +020062 int16_t MuteFactor(size_t channel) const {
Mirko Bonadei25ab3222021-07-08 20:08:20 +020063 RTC_DCHECK_LT(channel, num_channels_);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000064 return channel_parameters_[channel].mute_factor;
65 }
66
henrik.lundinf3995f72016-05-10 05:54:35 -070067 // Returns true if expansion has been faded down to zero amplitude (for all
68 // channels); false otherwise.
69 bool Muted() const;
70
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000071 // Accessors and mutators.
Karl Wiberg7f6c4d42015-04-09 15:44:22 +020072 virtual size_t overlap_length() const;
Peter Kastingdce40cf2015-08-24 14:52:23 -070073 size_t max_lag() const { return max_lag_; }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000074
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000075 protected:
76 static const int kMaxConsecutiveExpands = 200;
Peter Kastingb7e50542015-06-11 12:55:50 -070077 void GenerateRandomVector(int16_t seed_increment,
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000078 size_t length,
79 int16_t* random_vector);
80
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000081 // Initializes member variables at the beginning of an expand period.
82 void InitializeForAnExpandPeriod();
83
84 bool TooManyExpands();
85
Artem Titovd00ce742021-07-28 20:00:17 +020086 // Analyzes the signal history in `sync_buffer_`, and set up all parameters
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000087 // necessary to produce concealment data.
88 void AnalyzeSignal(int16_t* random_vector);
89
Henrik Lundinbef77e22015-08-18 14:58:09 +020090 RandomVector* const random_vector_;
91 SyncBuffer* const sync_buffer_;
turaj@webrtc.org8d1cdaa2014-04-11 18:47:55 +000092 bool first_expand_;
93 const int fs_hz_;
94 const size_t num_channels_;
95 int consecutive_expands_;
96
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000097 private:
Peter Kastingdce40cf2015-08-24 14:52:23 -070098 static const size_t kUnvoicedLpcOrder = 6;
99 static const size_t kNumCorrelationCandidates = 3;
100 static const size_t kDistortionLength = 20;
101 static const size_t kLpcAnalysisLength = 160;
102 static const size_t kMaxSampleRate = 48000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000103 static const int kNumLags = 3;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000104
105 struct ChannelParameters {
Karl Wiberg7f6c4d42015-04-09 15:44:22 +0200106 ChannelParameters();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000107 int16_t mute_factor;
108 int16_t ar_filter[kUnvoicedLpcOrder + 1];
109 int16_t ar_filter_state[kUnvoicedLpcOrder];
110 int16_t ar_gain;
111 int16_t ar_gain_scale;
Yves Gerey665174f2018-06-19 15:03:05 +0200112 int16_t voice_mix_factor; /* Q14 */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000113 int16_t current_voice_mix_factor; /* Q14 */
henrik.lundin@webrtc.org1871dd22013-10-14 20:33:25 +0000114 AudioVector expand_vector0;
115 AudioVector expand_vector1;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000116 bool onset;
Peter Kasting36b7cc32015-06-11 19:57:18 -0700117 int mute_slope; /* Q20 */
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000118 };
119
Artem Titovd00ce742021-07-28 20:00:17 +0200120 // Calculate the auto-correlation of `input`, with length `input_length`
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000121 // samples. The correlation is calculated from a downsampled version of
Artem Titovd00ce742021-07-28 20:00:17 +0200122 // `input`, and is written to `output`.
Peter Kasting728d9032015-06-11 14:31:38 -0700123 void Correlation(const int16_t* input,
124 size_t input_length,
minyue53ff70f2016-05-02 01:50:30 -0700125 int16_t* output) const;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000126
127 void UpdateLagIndex();
128
Henrik Lundinbef77e22015-08-18 14:58:09 +0200129 BackgroundNoise* const background_noise_;
130 StatisticsCalculator* const statistics_;
henrik.lundin@webrtc.org340746a2014-02-17 11:37:16 +0000131 const size_t overlap_length_;
Peter Kastingdce40cf2015-08-24 14:52:23 -0700132 size_t max_lag_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000133 size_t expand_lags_[kNumLags];
134 int lag_index_direction_;
135 int current_lag_index_;
136 bool stop_muting_;
Henrik Lundinbef77e22015-08-18 14:58:09 +0200137 size_t expand_duration_samples_;
kwiberg2d0c3322016-02-14 09:28:33 -0800138 std::unique_ptr<ChannelParameters[]> channel_parameters_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000139};
140
henrik.lundin@webrtc.orgd9faa462014-01-14 10:18:45 +0000141struct ExpandFactory {
142 ExpandFactory() {}
143 virtual ~ExpandFactory() {}
144
145 virtual Expand* Create(BackgroundNoise* background_noise,
146 SyncBuffer* sync_buffer,
147 RandomVector* random_vector,
Henrik Lundinbef77e22015-08-18 14:58:09 +0200148 StatisticsCalculator* statistics,
henrik.lundin@webrtc.orgd9faa462014-01-14 10:18:45 +0000149 int fs,
150 size_t num_channels) const;
151};
152
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000153} // namespace webrtc
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200154#endif // MODULES_AUDIO_CODING_NETEQ_EXPAND_H_