xref: /aosp_15_r20/external/webrtc/common_audio/resampler/include/resampler.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker /*
12*d9f75844SAndroid Build Coastguard Worker  * A wrapper for resampling a numerous amount of sampling combinations.
13*d9f75844SAndroid Build Coastguard Worker  */
14*d9f75844SAndroid Build Coastguard Worker 
15*d9f75844SAndroid Build Coastguard Worker #ifndef COMMON_AUDIO_RESAMPLER_INCLUDE_RESAMPLER_H_
16*d9f75844SAndroid Build Coastguard Worker #define COMMON_AUDIO_RESAMPLER_INCLUDE_RESAMPLER_H_
17*d9f75844SAndroid Build Coastguard Worker 
18*d9f75844SAndroid Build Coastguard Worker #include <stddef.h>
19*d9f75844SAndroid Build Coastguard Worker #include <stdint.h>
20*d9f75844SAndroid Build Coastguard Worker 
21*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
22*d9f75844SAndroid Build Coastguard Worker 
23*d9f75844SAndroid Build Coastguard Worker // All methods return 0 on success and -1 on failure.
24*d9f75844SAndroid Build Coastguard Worker class Resampler {
25*d9f75844SAndroid Build Coastguard Worker  public:
26*d9f75844SAndroid Build Coastguard Worker   Resampler();
27*d9f75844SAndroid Build Coastguard Worker   Resampler(int inFreq, int outFreq, size_t num_channels);
28*d9f75844SAndroid Build Coastguard Worker   ~Resampler();
29*d9f75844SAndroid Build Coastguard Worker 
30*d9f75844SAndroid Build Coastguard Worker   // Reset all states
31*d9f75844SAndroid Build Coastguard Worker   int Reset(int inFreq, int outFreq, size_t num_channels);
32*d9f75844SAndroid Build Coastguard Worker 
33*d9f75844SAndroid Build Coastguard Worker   // Reset all states if any parameter has changed
34*d9f75844SAndroid Build Coastguard Worker   int ResetIfNeeded(int inFreq, int outFreq, size_t num_channels);
35*d9f75844SAndroid Build Coastguard Worker 
36*d9f75844SAndroid Build Coastguard Worker   // Resample samplesIn to samplesOut.
37*d9f75844SAndroid Build Coastguard Worker   int Push(const int16_t* samplesIn,
38*d9f75844SAndroid Build Coastguard Worker            size_t lengthIn,
39*d9f75844SAndroid Build Coastguard Worker            int16_t* samplesOut,
40*d9f75844SAndroid Build Coastguard Worker            size_t maxLen,
41*d9f75844SAndroid Build Coastguard Worker            size_t& outLen);  // NOLINT: to avoid changing APIs
42*d9f75844SAndroid Build Coastguard Worker 
43*d9f75844SAndroid Build Coastguard Worker  private:
44*d9f75844SAndroid Build Coastguard Worker   enum ResamplerMode {
45*d9f75844SAndroid Build Coastguard Worker     kResamplerMode1To1,
46*d9f75844SAndroid Build Coastguard Worker     kResamplerMode1To2,
47*d9f75844SAndroid Build Coastguard Worker     kResamplerMode1To3,
48*d9f75844SAndroid Build Coastguard Worker     kResamplerMode1To4,
49*d9f75844SAndroid Build Coastguard Worker     kResamplerMode1To6,
50*d9f75844SAndroid Build Coastguard Worker     kResamplerMode1To12,
51*d9f75844SAndroid Build Coastguard Worker     kResamplerMode2To3,
52*d9f75844SAndroid Build Coastguard Worker     kResamplerMode2To11,
53*d9f75844SAndroid Build Coastguard Worker     kResamplerMode4To11,
54*d9f75844SAndroid Build Coastguard Worker     kResamplerMode8To11,
55*d9f75844SAndroid Build Coastguard Worker     kResamplerMode11To16,
56*d9f75844SAndroid Build Coastguard Worker     kResamplerMode11To32,
57*d9f75844SAndroid Build Coastguard Worker     kResamplerMode2To1,
58*d9f75844SAndroid Build Coastguard Worker     kResamplerMode3To1,
59*d9f75844SAndroid Build Coastguard Worker     kResamplerMode4To1,
60*d9f75844SAndroid Build Coastguard Worker     kResamplerMode6To1,
61*d9f75844SAndroid Build Coastguard Worker     kResamplerMode12To1,
62*d9f75844SAndroid Build Coastguard Worker     kResamplerMode3To2,
63*d9f75844SAndroid Build Coastguard Worker     kResamplerMode11To2,
64*d9f75844SAndroid Build Coastguard Worker     kResamplerMode11To4,
65*d9f75844SAndroid Build Coastguard Worker     kResamplerMode11To8
66*d9f75844SAndroid Build Coastguard Worker   };
67*d9f75844SAndroid Build Coastguard Worker 
68*d9f75844SAndroid Build Coastguard Worker   // Computes the resampler mode for a given sampling frequency pair.
69*d9f75844SAndroid Build Coastguard Worker   // Returns -1 for unsupported frequency pairs.
70*d9f75844SAndroid Build Coastguard Worker   static int ComputeResamplerMode(int in_freq_hz,
71*d9f75844SAndroid Build Coastguard Worker                                   int out_freq_hz,
72*d9f75844SAndroid Build Coastguard Worker                                   ResamplerMode* mode);
73*d9f75844SAndroid Build Coastguard Worker 
74*d9f75844SAndroid Build Coastguard Worker   // Generic pointers since we don't know what states we'll need
75*d9f75844SAndroid Build Coastguard Worker   void* state1_;
76*d9f75844SAndroid Build Coastguard Worker   void* state2_;
77*d9f75844SAndroid Build Coastguard Worker   void* state3_;
78*d9f75844SAndroid Build Coastguard Worker 
79*d9f75844SAndroid Build Coastguard Worker   // Storage if needed
80*d9f75844SAndroid Build Coastguard Worker   int16_t* in_buffer_;
81*d9f75844SAndroid Build Coastguard Worker   int16_t* out_buffer_;
82*d9f75844SAndroid Build Coastguard Worker   size_t in_buffer_size_;
83*d9f75844SAndroid Build Coastguard Worker   size_t out_buffer_size_;
84*d9f75844SAndroid Build Coastguard Worker   size_t in_buffer_size_max_;
85*d9f75844SAndroid Build Coastguard Worker   size_t out_buffer_size_max_;
86*d9f75844SAndroid Build Coastguard Worker 
87*d9f75844SAndroid Build Coastguard Worker   int my_in_frequency_khz_;
88*d9f75844SAndroid Build Coastguard Worker   int my_out_frequency_khz_;
89*d9f75844SAndroid Build Coastguard Worker   ResamplerMode my_mode_;
90*d9f75844SAndroid Build Coastguard Worker   size_t num_channels_;
91*d9f75844SAndroid Build Coastguard Worker 
92*d9f75844SAndroid Build Coastguard Worker   // Extra instance for stereo
93*d9f75844SAndroid Build Coastguard Worker   Resampler* helper_left_;
94*d9f75844SAndroid Build Coastguard Worker   Resampler* helper_right_;
95*d9f75844SAndroid Build Coastguard Worker };
96*d9f75844SAndroid Build Coastguard Worker 
97*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
98*d9f75844SAndroid Build Coastguard Worker 
99*d9f75844SAndroid Build Coastguard Worker #endif  // COMMON_AUDIO_RESAMPLER_INCLUDE_RESAMPLER_H_
100