blob: 102e2de83b3a5476bb12668cedc3e3b72a8caca8 [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
kjellander3e6db232015-11-26 04:44:54 -080036// Callback class used for sending data ready to be packetized
37class AudioPacketizationCallback {
38 public:
39 virtual ~AudioPacketizationCallback() {}
40
Niels Möller87e2d782019-03-07 10:18:23 +010041 virtual int32_t SendData(AudioFrameType frame_type,
kjellander3e6db232015-11-26 04:44:54 -080042 uint8_t payload_type,
43 uint32_t timestamp,
44 const uint8_t* payload_data,
Minyue Liff0e4db2020-01-23 13:45:50 +010045 size_t payload_len_bytes,
46 int64_t absolute_capture_timestamp_ms) {
47 // TODO(bugs.webrtc.org/10739): Deprecate the old SendData and make this one
48 // pure virtual.
49 return SendData(frame_type, payload_type, timestamp, payload_data,
50 payload_len_bytes);
51 }
52 virtual int32_t SendData(AudioFrameType frame_type,
53 uint8_t payload_type,
54 uint32_t timestamp,
55 const uint8_t* payload_data,
56 size_t payload_len_bytes) {
57 RTC_NOTREACHED() << "This method must be overridden, or not used.";
58 return -1;
59 }
kjellander3e6db232015-11-26 04:44:54 -080060};
61
kjellander3e6db232015-11-26 04:44:54 -080062class AudioCodingModule {
63 protected:
64 AudioCodingModule() {}
65
66 public:
67 struct Config {
Karl Wiberg5817d3d2018-04-06 10:06:42 +020068 explicit Config(
69 rtc::scoped_refptr<AudioDecoderFactory> decoder_factory = nullptr);
kwiberg36a43882016-08-29 05:33:32 -070070 Config(const Config&);
71 ~Config();
kjellander3e6db232015-11-26 04:44:54 -080072
kjellander3e6db232015-11-26 04:44:54 -080073 NetEq::Config neteq_config;
74 Clock* clock;
ossue3525782016-05-25 07:37:43 -070075 rtc::scoped_refptr<AudioDecoderFactory> decoder_factory;
Ivo Creusenc3d1f9b2019-11-01 11:47:51 +010076 NetEqFactory* neteq_factory = nullptr;
kjellander3e6db232015-11-26 04:44:54 -080077 };
78
kjellander3e6db232015-11-26 04:44:54 -080079 static AudioCodingModule* Create(const Config& config);
80 virtual ~AudioCodingModule() = default;
81
82 ///////////////////////////////////////////////////////////////////////////
kjellander3e6db232015-11-26 04:44:54 -080083 // Sender
84 //
85
kwiberg4cdbd572016-03-30 03:10:05 -070086 // |modifier| is called exactly once with one argument: a pointer to the
87 // unique_ptr that holds the current encoder (which is null if there is no
88 // current encoder). For the duration of the call, |modifier| has exclusive
89 // access to the unique_ptr; it may call the encoder, steal the encoder and
90 // replace it with another encoder or with nullptr, etc.
91 virtual void ModifyEncoder(
kwiberg24c7c122016-09-28 11:57:10 -070092 rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) = 0;
kwiberg4cdbd572016-03-30 03:10:05 -070093
94 // Utility method for simply replacing the existing encoder with a new one.
95 void SetEncoder(std::unique_ptr<AudioEncoder> new_encoder) {
96 ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
97 *encoder = std::move(new_encoder);
98 });
99 }
100
kjellander3e6db232015-11-26 04:44:54 -0800101 // int32_t RegisterTransportCallback()
102 // Register a transport callback which will be called to deliver
103 // the encoded buffers whenever Process() is called and a
104 // bit-stream is ready.
105 //
106 // Input:
107 // -transport : pointer to the callback class
108 // transport->SendData() is called whenever
109 // Process() is called and bit-stream is ready
110 // to deliver.
111 //
112 // Return value:
113 // -1 if the transport callback could not be registered
114 // 0 if registration is successful.
115 //
116 virtual int32_t RegisterTransportCallback(
117 AudioPacketizationCallback* transport) = 0;
118
119 ///////////////////////////////////////////////////////////////////////////
120 // int32_t Add10MsData()
121 // Add 10MS of raw (PCM) audio data and encode it. If the sampling
122 // frequency of the audio does not match the sampling frequency of the
123 // current encoder ACM will resample the audio. If an encoded packet was
124 // produced, it will be delivered via the callback object registered using
125 // RegisterTransportCallback, and the return value from this function will
126 // be the number of bytes encoded.
127 //
128 // Input:
129 // -audio_frame : the input audio frame, containing raw audio
Fredrik Solenbergbbf21a32018-04-12 22:44:09 +0200130 // sampling frequency etc.
kjellander3e6db232015-11-26 04:44:54 -0800131 //
132 // Return value:
133 // >= 0 number of bytes encoded.
134 // -1 some error occurred.
135 //
136 virtual int32_t Add10MsData(const AudioFrame& audio_frame) = 0;
137
138 ///////////////////////////////////////////////////////////////////////////
kjellander3e6db232015-11-26 04:44:54 -0800139 // int SetPacketLossRate()
140 // Sets expected packet loss rate for encoding. Some encoders provide packet
141 // loss gnostic encoding to make stream less sensitive to packet losses,
142 // through e.g., FEC. No effects on codecs that do not provide such encoding.
143 //
144 // Input:
145 // -packet_loss_rate : expected packet loss rate (0 -- 100 inclusive).
146 //
147 // Return value
148 // -1 if failed to set packet loss rate,
149 // 0 if succeeded.
150 //
minyue7e304322016-10-12 05:00:55 -0700151 // This is only used in test code that rely on old ACM APIs.
152 // TODO(minyue): Remove it when possible.
kjellander3e6db232015-11-26 04:44:54 -0800153 virtual int SetPacketLossRate(int packet_loss_rate) = 0;
154
155 ///////////////////////////////////////////////////////////////////////////
kjellander3e6db232015-11-26 04:44:54 -0800156 // Receiver
157 //
158
159 ///////////////////////////////////////////////////////////////////////////
160 // int32_t InitializeReceiver()
161 // Any decoder-related state of ACM will be initialized to the
162 // same state when ACM is created. This will not interrupt or
163 // effect encoding functionality of ACM. ACM would lose all the
164 // decoding-related settings by calling this function.
165 // For instance, all registered codecs are deleted and have to be
166 // registered again.
167 //
168 // Return value:
169 // -1 if failed to initialize,
170 // 0 if succeeded.
171 //
172 virtual int32_t InitializeReceiver() = 0;
173
kwiberg1c07c702017-03-27 07:15:49 -0700174 // Replace any existing decoders with the given payload type -> decoder map.
175 virtual void SetReceiveCodecs(
176 const std::map<int, SdpAudioFormat>& codecs) = 0;
177
kjellander3e6db232015-11-26 04:44:54 -0800178 ///////////////////////////////////////////////////////////////////////////
kjellander3e6db232015-11-26 04:44:54 -0800179 // int32_t IncomingPacket()
180 // Call this function to insert a parsed RTP packet into ACM.
181 //
182 // Inputs:
183 // -incoming_payload : received payload.
184 // -payload_len_bytes : the length of payload in bytes.
185 // -rtp_info : the relevant information retrieved from RTP
186 // header.
187 //
188 // Return value:
189 // -1 if failed to push in the payload
190 // 0 if payload is successfully pushed in.
191 //
192 virtual int32_t IncomingPacket(const uint8_t* incoming_payload,
193 const size_t payload_len_bytes,
Niels Möllerafb5dbb2019-02-15 15:21:47 +0100194 const RTPHeader& rtp_header) = 0;
kjellander3e6db232015-11-26 04:44:54 -0800195
196 ///////////////////////////////////////////////////////////////////////////
kjellander3e6db232015-11-26 04:44:54 -0800197 // int32_t PlayoutData10Ms(
198 // Get 10 milliseconds of raw audio data for playout, at the given sampling
199 // frequency. ACM will perform a resampling if required.
200 //
201 // Input:
202 // -desired_freq_hz : the desired sampling frequency, in Hertz, of the
203 // output audio. If set to -1, the function returns
204 // the audio at the current sampling frequency.
205 //
206 // Output:
207 // -audio_frame : output audio frame which contains raw audio data
Fredrik Solenbergbbf21a32018-04-12 22:44:09 +0200208 // and other relevant parameters.
henrik.lundin834a6ea2016-05-13 03:45:24 -0700209 // -muted : if true, the sample data in audio_frame is not
210 // populated, and must be interpreted as all zero.
kjellander3e6db232015-11-26 04:44:54 -0800211 //
212 // Return value:
213 // -1 if the function fails,
214 // 0 if the function succeeds.
215 //
216 virtual int32_t PlayoutData10Ms(int32_t desired_freq_hz,
henrik.lundin834a6ea2016-05-13 03:45:24 -0700217 AudioFrame* audio_frame,
218 bool* muted) = 0;
219
kjellander3e6db232015-11-26 04:44:54 -0800220 ///////////////////////////////////////////////////////////////////////////
kjellander3e6db232015-11-26 04:44:54 -0800221 // statistics
222 //
223
224 ///////////////////////////////////////////////////////////////////////////
225 // int32_t GetNetworkStatistics()
226 // Get network statistics. Note that the internal statistics of NetEq are
227 // reset by this call.
228 //
229 // Input:
230 // -network_statistics : a structure that contains network statistics.
231 //
232 // Return value:
233 // -1 if failed to set the network statistics,
234 // 0 if statistics are set successfully.
235 //
236 virtual int32_t GetNetworkStatistics(
237 NetworkStatistics* network_statistics) = 0;
238
ivoce1198e02017-09-08 08:13:19 -0700239 virtual ANAStats GetANAStats() const = 0;
kjellander3e6db232015-11-26 04:44:54 -0800240};
241
242} // namespace webrtc
243
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200244#endif // MODULES_AUDIO_CODING_INCLUDE_AUDIO_CODING_MODULE_H_