blob: a0aa5d05eca31a502c03d54172fb909079d5ca49 [file] [log] [blame]
kjellander3e6db232015-11-26 04:44:54 -08001/*
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_INCLUDE_AUDIO_CODING_MODULE_H_
12#define MODULES_AUDIO_CODING_INCLUDE_AUDIO_CODING_MODULE_H_
kjellander3e6db232015-11-26 04:44:54 -080013
kwiberg84be5112016-04-27 01:19:58 -070014#include <memory>
henrik.lundin4cf61dd2015-12-09 06:20:58 -080015#include <string>
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +010016#include <utility>
kjellander3e6db232015-11-26 04:44:54 -080017#include <vector>
18
Danil Chapovalovb6021232018-06-19 13:26:36 +020019#include "absl/types/optional.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "api/audio_codecs/audio_decoder_factory.h"
21#include "api/audio_codecs/audio_encoder.h"
Artem Titov741daaf2019-03-21 14:37:36 +010022#include "api/function_view.h"
Ivo Creusen3ce44a32019-10-31 14:38:11 +010023#include "api/neteq/neteq.h"
Ivo Creusenc3d1f9b2019-11-01 11:47:51 +010024#include "api/neteq/neteq_factory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "modules/audio_coding/include/audio_coding_module_typedefs.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "system_wrappers/include/clock.h"
kjellander3e6db232015-11-26 04:44:54 -080027
28namespace webrtc {
29
30// forward declarations
kjellander3e6db232015-11-26 04:44:54 -080031class AudioDecoder;
32class AudioEncoder;
33class AudioFrame;
Niels Möllerafb5dbb2019-02-15 15:21:47 +010034struct RTPHeader;
kjellander3e6db232015-11-26 04:44:54 -080035
36#define WEBRTC_10MS_PCM_AUDIO 960 // 16 bits super wideband 48 kHz
37
38// Callback class used for sending data ready to be packetized
39class AudioPacketizationCallback {
40 public:
41 virtual ~AudioPacketizationCallback() {}
42
Niels Möller87e2d782019-03-07 10:18:23 +010043 virtual int32_t SendData(AudioFrameType frame_type,
kjellander3e6db232015-11-26 04:44:54 -080044 uint8_t payload_type,
45 uint32_t timestamp,
46 const uint8_t* payload_data,
Minyue Liff0e4db2020-01-23 13:45:50 +010047 size_t payload_len_bytes,
48 int64_t absolute_capture_timestamp_ms) {
49 // TODO(bugs.webrtc.org/10739): Deprecate the old SendData and make this one
50 // pure virtual.
51 return SendData(frame_type, payload_type, timestamp, payload_data,
52 payload_len_bytes);
53 }
54 virtual int32_t SendData(AudioFrameType frame_type,
55 uint8_t payload_type,
56 uint32_t timestamp,
57 const uint8_t* payload_data,
58 size_t payload_len_bytes) {
59 RTC_NOTREACHED() << "This method must be overridden, or not used.";
60 return -1;
61 }
kjellander3e6db232015-11-26 04:44:54 -080062};
63
kjellander3e6db232015-11-26 04:44:54 -080064class AudioCodingModule {
65 protected:
66 AudioCodingModule() {}
67
68 public:
69 struct Config {
Karl Wiberg5817d3d2018-04-06 10:06:42 +020070 explicit Config(
71 rtc::scoped_refptr<AudioDecoderFactory> decoder_factory = nullptr);
kwiberg36a43882016-08-29 05:33:32 -070072 Config(const Config&);
73 ~Config();
kjellander3e6db232015-11-26 04:44:54 -080074
kjellander3e6db232015-11-26 04:44:54 -080075 NetEq::Config neteq_config;
76 Clock* clock;
ossue3525782016-05-25 07:37:43 -070077 rtc::scoped_refptr<AudioDecoderFactory> decoder_factory;
Ivo Creusenc3d1f9b2019-11-01 11:47:51 +010078 NetEqFactory* neteq_factory = nullptr;
kjellander3e6db232015-11-26 04:44:54 -080079 };
80
kjellander3e6db232015-11-26 04:44:54 -080081 static AudioCodingModule* Create(const Config& config);
82 virtual ~AudioCodingModule() = default;
83
84 ///////////////////////////////////////////////////////////////////////////
kjellander3e6db232015-11-26 04:44:54 -080085 // Sender
86 //
87
kwiberg4cdbd572016-03-30 03:10:05 -070088 // |modifier| is called exactly once with one argument: a pointer to the
89 // unique_ptr that holds the current encoder (which is null if there is no
90 // current encoder). For the duration of the call, |modifier| has exclusive
91 // access to the unique_ptr; it may call the encoder, steal the encoder and
92 // replace it with another encoder or with nullptr, etc.
93 virtual void ModifyEncoder(
kwiberg24c7c122016-09-28 11:57:10 -070094 rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) = 0;
kwiberg4cdbd572016-03-30 03:10:05 -070095
96 // Utility method for simply replacing the existing encoder with a new one.
97 void SetEncoder(std::unique_ptr<AudioEncoder> new_encoder) {
98 ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
99 *encoder = std::move(new_encoder);
100 });
101 }
102
kjellander3e6db232015-11-26 04:44:54 -0800103 // int32_t RegisterTransportCallback()
104 // Register a transport callback which will be called to deliver
105 // the encoded buffers whenever Process() is called and a
106 // bit-stream is ready.
107 //
108 // Input:
109 // -transport : pointer to the callback class
110 // transport->SendData() is called whenever
111 // Process() is called and bit-stream is ready
112 // to deliver.
113 //
114 // Return value:
115 // -1 if the transport callback could not be registered
116 // 0 if registration is successful.
117 //
118 virtual int32_t RegisterTransportCallback(
119 AudioPacketizationCallback* transport) = 0;
120
121 ///////////////////////////////////////////////////////////////////////////
122 // int32_t Add10MsData()
123 // Add 10MS of raw (PCM) audio data and encode it. If the sampling
124 // frequency of the audio does not match the sampling frequency of the
125 // current encoder ACM will resample the audio. If an encoded packet was
126 // produced, it will be delivered via the callback object registered using
127 // RegisterTransportCallback, and the return value from this function will
128 // be the number of bytes encoded.
129 //
130 // Input:
131 // -audio_frame : the input audio frame, containing raw audio
Fredrik Solenbergbbf21a32018-04-12 22:44:09 +0200132 // sampling frequency etc.
kjellander3e6db232015-11-26 04:44:54 -0800133 //
134 // Return value:
135 // >= 0 number of bytes encoded.
136 // -1 some error occurred.
137 //
138 virtual int32_t Add10MsData(const AudioFrame& audio_frame) = 0;
139
140 ///////////////////////////////////////////////////////////////////////////
kjellander3e6db232015-11-26 04:44:54 -0800141 // int SetPacketLossRate()
142 // Sets expected packet loss rate for encoding. Some encoders provide packet
143 // loss gnostic encoding to make stream less sensitive to packet losses,
144 // through e.g., FEC. No effects on codecs that do not provide such encoding.
145 //
146 // Input:
147 // -packet_loss_rate : expected packet loss rate (0 -- 100 inclusive).
148 //
149 // Return value
150 // -1 if failed to set packet loss rate,
151 // 0 if succeeded.
152 //
minyue7e304322016-10-12 05:00:55 -0700153 // This is only used in test code that rely on old ACM APIs.
154 // TODO(minyue): Remove it when possible.
kjellander3e6db232015-11-26 04:44:54 -0800155 virtual int SetPacketLossRate(int packet_loss_rate) = 0;
156
157 ///////////////////////////////////////////////////////////////////////////
kjellander3e6db232015-11-26 04:44:54 -0800158 // Receiver
159 //
160
161 ///////////////////////////////////////////////////////////////////////////
162 // int32_t InitializeReceiver()
163 // Any decoder-related state of ACM will be initialized to the
164 // same state when ACM is created. This will not interrupt or
165 // effect encoding functionality of ACM. ACM would lose all the
166 // decoding-related settings by calling this function.
167 // For instance, all registered codecs are deleted and have to be
168 // registered again.
169 //
170 // Return value:
171 // -1 if failed to initialize,
172 // 0 if succeeded.
173 //
174 virtual int32_t InitializeReceiver() = 0;
175
kwiberg1c07c702017-03-27 07:15:49 -0700176 // Replace any existing decoders with the given payload type -> decoder map.
177 virtual void SetReceiveCodecs(
178 const std::map<int, SdpAudioFormat>& codecs) = 0;
179
kjellander3e6db232015-11-26 04:44:54 -0800180 ///////////////////////////////////////////////////////////////////////////
kjellander3e6db232015-11-26 04:44:54 -0800181 // int32_t IncomingPacket()
182 // Call this function to insert a parsed RTP packet into ACM.
183 //
184 // Inputs:
185 // -incoming_payload : received payload.
186 // -payload_len_bytes : the length of payload in bytes.
187 // -rtp_info : the relevant information retrieved from RTP
188 // header.
189 //
190 // Return value:
191 // -1 if failed to push in the payload
192 // 0 if payload is successfully pushed in.
193 //
194 virtual int32_t IncomingPacket(const uint8_t* incoming_payload,
195 const size_t payload_len_bytes,
Niels Möllerafb5dbb2019-02-15 15:21:47 +0100196 const RTPHeader& rtp_header) = 0;
kjellander3e6db232015-11-26 04:44:54 -0800197
198 ///////////////////////////////////////////////////////////////////////////
kjellander3e6db232015-11-26 04:44:54 -0800199 // int32_t PlayoutData10Ms(
200 // Get 10 milliseconds of raw audio data for playout, at the given sampling
201 // frequency. ACM will perform a resampling if required.
202 //
203 // Input:
204 // -desired_freq_hz : the desired sampling frequency, in Hertz, of the
205 // output audio. If set to -1, the function returns
206 // the audio at the current sampling frequency.
207 //
208 // Output:
209 // -audio_frame : output audio frame which contains raw audio data
Fredrik Solenbergbbf21a32018-04-12 22:44:09 +0200210 // and other relevant parameters.
henrik.lundin834a6ea2016-05-13 03:45:24 -0700211 // -muted : if true, the sample data in audio_frame is not
212 // populated, and must be interpreted as all zero.
kjellander3e6db232015-11-26 04:44:54 -0800213 //
214 // Return value:
215 // -1 if the function fails,
216 // 0 if the function succeeds.
217 //
218 virtual int32_t PlayoutData10Ms(int32_t desired_freq_hz,
henrik.lundin834a6ea2016-05-13 03:45:24 -0700219 AudioFrame* audio_frame,
220 bool* muted) = 0;
221
kjellander3e6db232015-11-26 04:44:54 -0800222 ///////////////////////////////////////////////////////////////////////////
kjellander3e6db232015-11-26 04:44:54 -0800223 // statistics
224 //
225
226 ///////////////////////////////////////////////////////////////////////////
227 // int32_t GetNetworkStatistics()
228 // Get network statistics. Note that the internal statistics of NetEq are
229 // reset by this call.
230 //
231 // Input:
232 // -network_statistics : a structure that contains network statistics.
233 //
234 // Return value:
235 // -1 if failed to set the network statistics,
236 // 0 if statistics are set successfully.
237 //
238 virtual int32_t GetNetworkStatistics(
239 NetworkStatistics* network_statistics) = 0;
240
ivoce1198e02017-09-08 08:13:19 -0700241 virtual ANAStats GetANAStats() const = 0;
kjellander3e6db232015-11-26 04:44:54 -0800242};
243
244} // namespace webrtc
245
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200246#endif // MODULES_AUDIO_CODING_INCLUDE_AUDIO_CODING_MODULE_H_