blob: b0ad382d8a9b243d2cceb7aa013c50f025010b51 [file] [log] [blame]
kwibergfce4a942015-10-27 11:40:24 -07001/*
2 * Copyright (c) 2015 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_ACM2_RENT_A_CODEC_H_
12#define MODULES_AUDIO_CODING_ACM2_RENT_A_CODEC_H_
kwibergfce4a942015-10-27 11:40:24 -070013
14#include <stddef.h>
kwiberge1a27d42015-11-18 07:32:49 -080015#include <map>
kwiberg16c5a962016-02-15 02:27:22 -080016#include <memory>
kwibergfce4a942015-10-27 11:40:24 -070017
Danil Chapovalovb6021232018-06-19 13:26:36 +020018#include "absl/types/optional.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "api/array_view.h"
20#include "api/audio_codecs/audio_decoder.h"
21#include "api/audio_codecs/audio_encoder.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "modules/audio_coding/include/audio_coding_module_typedefs.h"
23#include "modules/audio_coding/neteq/neteq_decoder_enum.h"
24#include "rtc_base/constructormagic.h"
25#include "rtc_base/scoped_ref_ptr.h"
kwiberg805fc712015-11-10 04:05:16 -080026
kwibergfce4a942015-10-27 11:40:24 -070027namespace webrtc {
28
29struct CodecInst;
kwiberg0d05da72016-03-30 04:10:11 -070030class LockedIsacBandwidthInfo;
kwibergfce4a942015-10-27 11:40:24 -070031
32namespace acm2 {
33
34class RentACodec {
35 public:
36 enum class CodecId {
37#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
38 kISAC,
39#endif
40#ifdef WEBRTC_CODEC_ISAC
41 kISACSWB,
42#endif
43 // Mono
44 kPCM16B,
45 kPCM16Bwb,
46 kPCM16Bswb32kHz,
47 // Stereo
48 kPCM16B_2ch,
49 kPCM16Bwb_2ch,
50 kPCM16Bswb32kHz_2ch,
51 // Mono
52 kPCMU,
53 kPCMA,
54 // Stereo
55 kPCMU_2ch,
56 kPCMA_2ch,
57#ifdef WEBRTC_CODEC_ILBC
58 kILBC,
59#endif
kwibergfce4a942015-10-27 11:40:24 -070060 kG722, // Mono
61 kG722_2ch, // Stereo
kwibergfce4a942015-10-27 11:40:24 -070062#ifdef WEBRTC_CODEC_OPUS
63 kOpus, // Mono and stereo
64#endif
65 kCNNB,
66 kCNWB,
67 kCNSWB,
68#ifdef ENABLE_48000_HZ
69 kCNFB,
70#endif
71 kAVT,
solenberg2779bab2016-11-17 04:45:19 -080072 kAVT16kHz,
73 kAVT32kHz,
74 kAVT48kHz,
kwibergfce4a942015-10-27 11:40:24 -070075#ifdef WEBRTC_CODEC_RED
76 kRED,
77#endif
78 kNumCodecs, // Implementation detail. Don't use.
79
80// Set unsupported codecs to -1.
81#if !defined(WEBRTC_CODEC_ISAC) && !defined(WEBRTC_CODEC_ISACFX)
82 kISAC = -1,
83#endif
84#ifndef WEBRTC_CODEC_ISAC
85 kISACSWB = -1,
86#endif
87 // 48 kHz not supported, always set to -1.
88 kPCM16Bswb48kHz = -1,
89#ifndef WEBRTC_CODEC_ILBC
90 kILBC = -1,
91#endif
kwibergfce4a942015-10-27 11:40:24 -070092#ifndef WEBRTC_CODEC_OPUS
93 kOpus = -1, // Mono and stereo
94#endif
95#ifndef WEBRTC_CODEC_RED
96 kRED = -1,
97#endif
98#ifndef ENABLE_48000_HZ
99 kCNFB = -1,
100#endif
101
102 kNone = -1
103 };
104
105 static inline size_t NumberOfCodecs() {
106 return static_cast<size_t>(CodecId::kNumCodecs);
107 }
108
Danil Chapovalovb6021232018-06-19 13:26:36 +0200109 static inline absl::optional<int> CodecIndexFromId(CodecId codec_id) {
kwibergfce4a942015-10-27 11:40:24 -0700110 const int i = static_cast<int>(codec_id);
Karl Wibergbe579832015-11-10 22:34:18 +0100111 return i >= 0 && i < static_cast<int>(NumberOfCodecs())
Danil Chapovalovb6021232018-06-19 13:26:36 +0200112 ? absl::optional<int>(i)
113 : absl::nullopt;
kwibergfce4a942015-10-27 11:40:24 -0700114 }
115
Danil Chapovalovb6021232018-06-19 13:26:36 +0200116 static inline absl::optional<CodecId> CodecIdFromIndex(int codec_index) {
kwibergfce4a942015-10-27 11:40:24 -0700117 return static_cast<size_t>(codec_index) < NumberOfCodecs()
Danil Chapovalovb6021232018-06-19 13:26:36 +0200118 ? absl::optional<RentACodec::CodecId>(
kwiberg102c6a62015-10-30 02:47:38 -0700119 static_cast<RentACodec::CodecId>(codec_index))
Danil Chapovalovb6021232018-06-19 13:26:36 +0200120 : absl::nullopt;
kwibergfce4a942015-10-27 11:40:24 -0700121 }
122
Danil Chapovalovb6021232018-06-19 13:26:36 +0200123 static absl::optional<CodecId> CodecIdByParams(const char* payload_name,
124 int sampling_freq_hz,
125 size_t channels);
126 static absl::optional<CodecInst> CodecInstById(CodecId codec_id);
127 static absl::optional<CodecId> CodecIdByInst(const CodecInst& codec_inst);
128 static absl::optional<CodecInst> CodecInstByParams(const char* payload_name,
129 int sampling_freq_hz,
130 size_t channels);
kwiberg93a2feb2015-11-05 07:39:37 -0800131
132 static inline bool IsPayloadTypeValid(int payload_type) {
133 return payload_type >= 0 && payload_type <= 127;
134 }
135
kwibergfce4a942015-10-27 11:40:24 -0700136 static rtc::ArrayView<const CodecInst> Database();
kwibergee1879c2015-10-29 06:20:28 -0700137
Danil Chapovalovb6021232018-06-19 13:26:36 +0200138 static absl::optional<bool> IsSupportedNumChannels(CodecId codec_id,
139 size_t num_channels);
kwibergde94d082015-11-03 05:46:09 -0800140
Danil Chapovalovb6021232018-06-19 13:26:36 +0200141 static absl::optional<NetEqDecoder> NetEqDecoderFromCodecId(
Peter Kasting69558702016-01-12 16:26:35 -0800142 CodecId codec_id,
143 size_t num_channels);
kwiberg805fc712015-11-10 04:05:16 -0800144
kwiberge1a27d42015-11-18 07:32:49 -0800145 // Parse codec_inst and extract payload types. If the given CodecInst was for
146 // the wrong sort of codec, return kSkip; otherwise, if the rate was illegal,
147 // return kBadFreq; otherwise, update the given RTP timestamp rate (Hz) ->
148 // payload type map and return kOk.
149 enum class RegistrationResult { kOk, kSkip, kBadFreq };
150 static RegistrationResult RegisterCngPayloadType(std::map<int, int>* pt_map,
151 const CodecInst& codec_inst);
152 static RegistrationResult RegisterRedPayloadType(std::map<int, int>* pt_map,
153 const CodecInst& codec_inst);
154
kwiberg805fc712015-11-10 04:05:16 -0800155 RentACodec();
156 ~RentACodec();
157
158 // Creates and returns an audio encoder built to the given specification.
kwiberg6030a122016-03-08 06:01:31 -0800159 // Returns null in case of error.
160 std::unique_ptr<AudioEncoder> RentEncoder(const CodecInst& codec_inst);
kwiberg805fc712015-11-10 04:05:16 -0800161
kwiberg1379f1f2015-11-23 04:30:52 -0800162 struct StackParameters {
163 StackParameters();
164 ~StackParameters();
165
kwiberg6030a122016-03-08 06:01:31 -0800166 std::unique_ptr<AudioEncoder> speech_encoder;
167
kwiberg1379f1f2015-11-23 04:30:52 -0800168 bool use_codec_fec = false;
169 bool use_red = false;
170 bool use_cng = false;
171 ACMVADMode vad_mode = VADNormal;
172
173 // Maps from RTP timestamp rate (in Hz) to payload type.
174 std::map<int, int> cng_payload_types;
175 std::map<int, int> red_payload_types;
kwiberge155ae62015-11-16 04:49:54 -0800176 };
kwiberg1379f1f2015-11-23 04:30:52 -0800177
178 // Creates and returns an audio encoder stack constructed to the given
179 // specification. If the specification isn't compatible with the encoder, it
kwiberg6030a122016-03-08 06:01:31 -0800180 // will be changed to match (things will be switched off). The speech encoder
kwibergc8d071e2016-04-06 12:22:38 -0700181 // will be stolen. If the specification isn't complete, returns nullptr.
kwiberg6030a122016-03-08 06:01:31 -0800182 std::unique_ptr<AudioEncoder> RentEncoderStack(StackParameters* param);
kwiberge155ae62015-11-16 04:49:54 -0800183
kwiberg4cdbd572016-03-30 03:10:05 -0700184 // Creates and returns an iSAC decoder.
kwibergabe95ba2016-06-02 02:58:59 -0700185 std::unique_ptr<AudioDecoder> RentIsacDecoder(int sample_rate_hz);
kwiberg805fc712015-11-10 04:05:16 -0800186
187 private:
kwiberg16c5a962016-02-15 02:27:22 -0800188 std::unique_ptr<AudioEncoder> speech_encoder_;
189 std::unique_ptr<AudioEncoder> cng_encoder_;
190 std::unique_ptr<AudioEncoder> red_encoder_;
kwiberg0d05da72016-03-30 04:10:11 -0700191 rtc::scoped_refptr<LockedIsacBandwidthInfo> isac_bandwidth_info_;
kwiberg805fc712015-11-10 04:05:16 -0800192
193 RTC_DISALLOW_COPY_AND_ASSIGN(RentACodec);
kwibergfce4a942015-10-27 11:40:24 -0700194};
195
196} // namespace acm2
197} // namespace webrtc
198
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200199#endif // MODULES_AUDIO_CODING_ACM2_RENT_A_CODEC_H_