blob: 02f9d0314a498a03998cfb1c1f87d7fd6c54e227 [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"
Mirko Bonadei71207422017-09-15 13:58:09 +020026#include "typedefs.h" // NOLINT(build/include)
kwiberg805fc712015-11-10 04:05:16 -080027
kwibergfce4a942015-10-27 11:40:24 -070028namespace webrtc {
29
30struct CodecInst;
kwiberg0d05da72016-03-30 04:10:11 -070031class LockedIsacBandwidthInfo;
kwibergfce4a942015-10-27 11:40:24 -070032
33namespace acm2 {
34
35class RentACodec {
36 public:
37 enum class CodecId {
38#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
39 kISAC,
40#endif
41#ifdef WEBRTC_CODEC_ISAC
42 kISACSWB,
43#endif
44 // Mono
45 kPCM16B,
46 kPCM16Bwb,
47 kPCM16Bswb32kHz,
48 // Stereo
49 kPCM16B_2ch,
50 kPCM16Bwb_2ch,
51 kPCM16Bswb32kHz_2ch,
52 // Mono
53 kPCMU,
54 kPCMA,
55 // Stereo
56 kPCMU_2ch,
57 kPCMA_2ch,
58#ifdef WEBRTC_CODEC_ILBC
59 kILBC,
60#endif
kwibergfce4a942015-10-27 11:40:24 -070061 kG722, // Mono
62 kG722_2ch, // Stereo
kwibergfce4a942015-10-27 11:40:24 -070063#ifdef WEBRTC_CODEC_OPUS
64 kOpus, // Mono and stereo
65#endif
66 kCNNB,
67 kCNWB,
68 kCNSWB,
69#ifdef ENABLE_48000_HZ
70 kCNFB,
71#endif
72 kAVT,
solenberg2779bab2016-11-17 04:45:19 -080073 kAVT16kHz,
74 kAVT32kHz,
75 kAVT48kHz,
kwibergfce4a942015-10-27 11:40:24 -070076#ifdef WEBRTC_CODEC_RED
77 kRED,
78#endif
79 kNumCodecs, // Implementation detail. Don't use.
80
81// Set unsupported codecs to -1.
82#if !defined(WEBRTC_CODEC_ISAC) && !defined(WEBRTC_CODEC_ISACFX)
83 kISAC = -1,
84#endif
85#ifndef WEBRTC_CODEC_ISAC
86 kISACSWB = -1,
87#endif
88 // 48 kHz not supported, always set to -1.
89 kPCM16Bswb48kHz = -1,
90#ifndef WEBRTC_CODEC_ILBC
91 kILBC = -1,
92#endif
kwibergfce4a942015-10-27 11:40:24 -070093#ifndef WEBRTC_CODEC_OPUS
94 kOpus = -1, // Mono and stereo
95#endif
96#ifndef WEBRTC_CODEC_RED
97 kRED = -1,
98#endif
99#ifndef ENABLE_48000_HZ
100 kCNFB = -1,
101#endif
102
103 kNone = -1
104 };
105
106 static inline size_t NumberOfCodecs() {
107 return static_cast<size_t>(CodecId::kNumCodecs);
108 }
109
Danil Chapovalovb6021232018-06-19 13:26:36 +0200110 static inline absl::optional<int> CodecIndexFromId(CodecId codec_id) {
kwibergfce4a942015-10-27 11:40:24 -0700111 const int i = static_cast<int>(codec_id);
Karl Wibergbe579832015-11-10 22:34:18 +0100112 return i >= 0 && i < static_cast<int>(NumberOfCodecs())
Danil Chapovalovb6021232018-06-19 13:26:36 +0200113 ? absl::optional<int>(i)
114 : absl::nullopt;
kwibergfce4a942015-10-27 11:40:24 -0700115 }
116
Danil Chapovalovb6021232018-06-19 13:26:36 +0200117 static inline absl::optional<CodecId> CodecIdFromIndex(int codec_index) {
kwibergfce4a942015-10-27 11:40:24 -0700118 return static_cast<size_t>(codec_index) < NumberOfCodecs()
Danil Chapovalovb6021232018-06-19 13:26:36 +0200119 ? absl::optional<RentACodec::CodecId>(
kwiberg102c6a62015-10-30 02:47:38 -0700120 static_cast<RentACodec::CodecId>(codec_index))
Danil Chapovalovb6021232018-06-19 13:26:36 +0200121 : absl::nullopt;
kwibergfce4a942015-10-27 11:40:24 -0700122 }
123
Danil Chapovalovb6021232018-06-19 13:26:36 +0200124 static absl::optional<CodecId> CodecIdByParams(const char* payload_name,
125 int sampling_freq_hz,
126 size_t channels);
127 static absl::optional<CodecInst> CodecInstById(CodecId codec_id);
128 static absl::optional<CodecId> CodecIdByInst(const CodecInst& codec_inst);
129 static absl::optional<CodecInst> CodecInstByParams(const char* payload_name,
130 int sampling_freq_hz,
131 size_t channels);
kwibergfce4a942015-10-27 11:40:24 -0700132 static bool IsCodecValid(const CodecInst& codec_inst);
kwiberg93a2feb2015-11-05 07:39:37 -0800133
134 static inline bool IsPayloadTypeValid(int payload_type) {
135 return payload_type >= 0 && payload_type <= 127;
136 }
137
kwibergfce4a942015-10-27 11:40:24 -0700138 static rtc::ArrayView<const CodecInst> Database();
kwibergee1879c2015-10-29 06:20:28 -0700139
Danil Chapovalovb6021232018-06-19 13:26:36 +0200140 static absl::optional<bool> IsSupportedNumChannels(CodecId codec_id,
141 size_t num_channels);
kwibergde94d082015-11-03 05:46:09 -0800142
Danil Chapovalovb6021232018-06-19 13:26:36 +0200143 static absl::optional<NetEqDecoder> NetEqDecoderFromCodecId(
Peter Kasting69558702016-01-12 16:26:35 -0800144 CodecId codec_id,
145 size_t num_channels);
kwiberg805fc712015-11-10 04:05:16 -0800146
kwiberge1a27d42015-11-18 07:32:49 -0800147 // Parse codec_inst and extract payload types. If the given CodecInst was for
148 // the wrong sort of codec, return kSkip; otherwise, if the rate was illegal,
149 // return kBadFreq; otherwise, update the given RTP timestamp rate (Hz) ->
150 // payload type map and return kOk.
151 enum class RegistrationResult { kOk, kSkip, kBadFreq };
152 static RegistrationResult RegisterCngPayloadType(std::map<int, int>* pt_map,
153 const CodecInst& codec_inst);
154 static RegistrationResult RegisterRedPayloadType(std::map<int, int>* pt_map,
155 const CodecInst& codec_inst);
156
kwiberg805fc712015-11-10 04:05:16 -0800157 RentACodec();
158 ~RentACodec();
159
160 // Creates and returns an audio encoder built to the given specification.
kwiberg6030a122016-03-08 06:01:31 -0800161 // Returns null in case of error.
162 std::unique_ptr<AudioEncoder> RentEncoder(const CodecInst& codec_inst);
kwiberg805fc712015-11-10 04:05:16 -0800163
kwiberg1379f1f2015-11-23 04:30:52 -0800164 struct StackParameters {
165 StackParameters();
166 ~StackParameters();
167
kwiberg6030a122016-03-08 06:01:31 -0800168 std::unique_ptr<AudioEncoder> speech_encoder;
169
kwiberg1379f1f2015-11-23 04:30:52 -0800170 bool use_codec_fec = false;
171 bool use_red = false;
172 bool use_cng = false;
173 ACMVADMode vad_mode = VADNormal;
174
175 // Maps from RTP timestamp rate (in Hz) to payload type.
176 std::map<int, int> cng_payload_types;
177 std::map<int, int> red_payload_types;
kwiberge155ae62015-11-16 04:49:54 -0800178 };
kwiberg1379f1f2015-11-23 04:30:52 -0800179
180 // Creates and returns an audio encoder stack constructed to the given
181 // specification. If the specification isn't compatible with the encoder, it
kwiberg6030a122016-03-08 06:01:31 -0800182 // will be changed to match (things will be switched off). The speech encoder
kwibergc8d071e2016-04-06 12:22:38 -0700183 // will be stolen. If the specification isn't complete, returns nullptr.
kwiberg6030a122016-03-08 06:01:31 -0800184 std::unique_ptr<AudioEncoder> RentEncoderStack(StackParameters* param);
kwiberge155ae62015-11-16 04:49:54 -0800185
kwiberg4cdbd572016-03-30 03:10:05 -0700186 // Creates and returns an iSAC decoder.
kwibergabe95ba2016-06-02 02:58:59 -0700187 std::unique_ptr<AudioDecoder> RentIsacDecoder(int sample_rate_hz);
kwiberg805fc712015-11-10 04:05:16 -0800188
189 private:
kwiberg16c5a962016-02-15 02:27:22 -0800190 std::unique_ptr<AudioEncoder> speech_encoder_;
191 std::unique_ptr<AudioEncoder> cng_encoder_;
192 std::unique_ptr<AudioEncoder> red_encoder_;
kwiberg0d05da72016-03-30 04:10:11 -0700193 rtc::scoped_refptr<LockedIsacBandwidthInfo> isac_bandwidth_info_;
kwiberg805fc712015-11-10 04:05:16 -0800194
195 RTC_DISALLOW_COPY_AND_ASSIGN(RentACodec);
kwibergfce4a942015-10-27 11:40:24 -0700196};
197
198} // namespace acm2
199} // namespace webrtc
200
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200201#endif // MODULES_AUDIO_CODING_ACM2_RENT_A_CODEC_H_