| OLD | NEW |
| (Empty) |
| 1 /* | |
| 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 | |
| 11 #ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_INTERFACE_OPUS_INTERFACE_H_ | |
| 12 #define WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_INTERFACE_OPUS_INTERFACE_H_ | |
| 13 | |
| 14 #include <stddef.h> | |
| 15 | |
| 16 #include "webrtc/typedefs.h" | |
| 17 | |
| 18 #ifdef __cplusplus | |
| 19 extern "C" { | |
| 20 #endif | |
| 21 | |
| 22 // Opaque wrapper types for the codec state. | |
| 23 typedef struct WebRtcOpusEncInst OpusEncInst; | |
| 24 typedef struct WebRtcOpusDecInst OpusDecInst; | |
| 25 | |
| 26 /**************************************************************************** | |
| 27 * WebRtcOpus_EncoderCreate(...) | |
| 28 * | |
| 29 * This function create an Opus encoder. | |
| 30 * | |
| 31 * Input: | |
| 32 * - channels : number of channels. | |
| 33 * - application : 0 - VOIP applications. | |
| 34 * Favor speech intelligibility. | |
| 35 * 1 - Audio applications. | |
| 36 * Favor faithfulness to the original input. | |
| 37 * | |
| 38 * Output: | |
| 39 * - inst : a pointer to Encoder context that is created | |
| 40 * if success. | |
| 41 * | |
| 42 * Return value : 0 - Success | |
| 43 * -1 - Error | |
| 44 */ | |
| 45 int16_t WebRtcOpus_EncoderCreate(OpusEncInst** inst, | |
| 46 int32_t channels, | |
| 47 int32_t application); | |
| 48 | |
| 49 int16_t WebRtcOpus_EncoderFree(OpusEncInst* inst); | |
| 50 | |
| 51 /**************************************************************************** | |
| 52 * WebRtcOpus_Encode(...) | |
| 53 * | |
| 54 * This function encodes audio as a series of Opus frames and inserts | |
| 55 * it into a packet. Input buffer can be any length. | |
| 56 * | |
| 57 * Input: | |
| 58 * - inst : Encoder context | |
| 59 * - audio_in : Input speech data buffer | |
| 60 * - samples : Samples per channel in audio_in | |
| 61 * - length_encoded_buffer : Output buffer size | |
| 62 * | |
| 63 * Output: | |
| 64 * - encoded : Output compressed data buffer | |
| 65 * | |
| 66 * Return value : >=0 - Length (in bytes) of coded data | |
| 67 * -1 - Error | |
| 68 */ | |
| 69 int WebRtcOpus_Encode(OpusEncInst* inst, | |
| 70 const int16_t* audio_in, | |
| 71 size_t samples, | |
| 72 size_t length_encoded_buffer, | |
| 73 uint8_t* encoded); | |
| 74 | |
| 75 /**************************************************************************** | |
| 76 * WebRtcOpus_SetBitRate(...) | |
| 77 * | |
| 78 * This function adjusts the target bitrate of the encoder. | |
| 79 * | |
| 80 * Input: | |
| 81 * - inst : Encoder context | |
| 82 * - rate : New target bitrate | |
| 83 * | |
| 84 * Return value : 0 - Success | |
| 85 * -1 - Error | |
| 86 */ | |
| 87 int16_t WebRtcOpus_SetBitRate(OpusEncInst* inst, int32_t rate); | |
| 88 | |
| 89 /**************************************************************************** | |
| 90 * WebRtcOpus_SetPacketLossRate(...) | |
| 91 * | |
| 92 * This function configures the encoder's expected packet loss percentage. | |
| 93 * | |
| 94 * Input: | |
| 95 * - inst : Encoder context | |
| 96 * - loss_rate : loss percentage in the range 0-100, inclusive. | |
| 97 * Return value : 0 - Success | |
| 98 * -1 - Error | |
| 99 */ | |
| 100 int16_t WebRtcOpus_SetPacketLossRate(OpusEncInst* inst, int32_t loss_rate); | |
| 101 | |
| 102 /**************************************************************************** | |
| 103 * WebRtcOpus_SetMaxPlaybackRate(...) | |
| 104 * | |
| 105 * Configures the maximum playback rate for encoding. Due to hardware | |
| 106 * limitations, the receiver may render audio up to a playback rate. Opus | |
| 107 * encoder can use this information to optimize for network usage and encoding | |
| 108 * complexity. This will affect the audio bandwidth in the coded audio. However, | |
| 109 * the input/output sample rate is not affected. | |
| 110 * | |
| 111 * Input: | |
| 112 * - inst : Encoder context | |
| 113 * - frequency_hz : Maximum playback rate in Hz. | |
| 114 * This parameter can take any value. The relation | |
| 115 * between the value and the Opus internal mode is | |
| 116 * as following: | |
| 117 * frequency_hz <= 8000 narrow band | |
| 118 * 8000 < frequency_hz <= 12000 medium band | |
| 119 * 12000 < frequency_hz <= 16000 wide band | |
| 120 * 16000 < frequency_hz <= 24000 super wide band | |
| 121 * frequency_hz > 24000 full band | |
| 122 * Return value : 0 - Success | |
| 123 * -1 - Error | |
| 124 */ | |
| 125 int16_t WebRtcOpus_SetMaxPlaybackRate(OpusEncInst* inst, int32_t frequency_hz); | |
| 126 | |
| 127 /* TODO(minyue): Check whether an API to check the FEC and the packet loss rate | |
| 128 * is needed. It might not be very useful since there are not many use cases and | |
| 129 * the caller can always maintain the states. */ | |
| 130 | |
| 131 /**************************************************************************** | |
| 132 * WebRtcOpus_EnableFec() | |
| 133 * | |
| 134 * This function enables FEC for encoding. | |
| 135 * | |
| 136 * Input: | |
| 137 * - inst : Encoder context | |
| 138 * | |
| 139 * Return value : 0 - Success | |
| 140 * -1 - Error | |
| 141 */ | |
| 142 int16_t WebRtcOpus_EnableFec(OpusEncInst* inst); | |
| 143 | |
| 144 /**************************************************************************** | |
| 145 * WebRtcOpus_DisableFec() | |
| 146 * | |
| 147 * This function disables FEC for encoding. | |
| 148 * | |
| 149 * Input: | |
| 150 * - inst : Encoder context | |
| 151 * | |
| 152 * Return value : 0 - Success | |
| 153 * -1 - Error | |
| 154 */ | |
| 155 int16_t WebRtcOpus_DisableFec(OpusEncInst* inst); | |
| 156 | |
| 157 /**************************************************************************** | |
| 158 * WebRtcOpus_EnableDtx() | |
| 159 * | |
| 160 * This function enables Opus internal DTX for encoding. | |
| 161 * | |
| 162 * Input: | |
| 163 * - inst : Encoder context | |
| 164 * | |
| 165 * Return value : 0 - Success | |
| 166 * -1 - Error | |
| 167 */ | |
| 168 int16_t WebRtcOpus_EnableDtx(OpusEncInst* inst); | |
| 169 | |
| 170 /**************************************************************************** | |
| 171 * WebRtcOpus_DisableDtx() | |
| 172 * | |
| 173 * This function disables Opus internal DTX for encoding. | |
| 174 * | |
| 175 * Input: | |
| 176 * - inst : Encoder context | |
| 177 * | |
| 178 * Return value : 0 - Success | |
| 179 * -1 - Error | |
| 180 */ | |
| 181 int16_t WebRtcOpus_DisableDtx(OpusEncInst* inst); | |
| 182 | |
| 183 /* | |
| 184 * WebRtcOpus_SetComplexity(...) | |
| 185 * | |
| 186 * This function adjusts the computational complexity. The effect is the same as | |
| 187 * calling the complexity setting of Opus as an Opus encoder related CTL. | |
| 188 * | |
| 189 * Input: | |
| 190 * - inst : Encoder context | |
| 191 * - complexity : New target complexity (0-10, inclusive) | |
| 192 * | |
| 193 * Return value : 0 - Success | |
| 194 * -1 - Error | |
| 195 */ | |
| 196 int16_t WebRtcOpus_SetComplexity(OpusEncInst* inst, int32_t complexity); | |
| 197 | |
| 198 int16_t WebRtcOpus_DecoderCreate(OpusDecInst** inst, int channels); | |
| 199 int16_t WebRtcOpus_DecoderFree(OpusDecInst* inst); | |
| 200 | |
| 201 /**************************************************************************** | |
| 202 * WebRtcOpus_DecoderChannels(...) | |
| 203 * | |
| 204 * This function returns the number of channels created for Opus decoder. | |
| 205 */ | |
| 206 int WebRtcOpus_DecoderChannels(OpusDecInst* inst); | |
| 207 | |
| 208 /**************************************************************************** | |
| 209 * WebRtcOpus_DecoderInit(...) | |
| 210 * | |
| 211 * This function resets state of the decoder. | |
| 212 * | |
| 213 * Input: | |
| 214 * - inst : Decoder context | |
| 215 */ | |
| 216 void WebRtcOpus_DecoderInit(OpusDecInst* inst); | |
| 217 | |
| 218 /**************************************************************************** | |
| 219 * WebRtcOpus_Decode(...) | |
| 220 * | |
| 221 * This function decodes an Opus packet into one or more audio frames at the | |
| 222 * ACM interface's sampling rate (32 kHz). | |
| 223 * | |
| 224 * Input: | |
| 225 * - inst : Decoder context | |
| 226 * - encoded : Encoded data | |
| 227 * - encoded_bytes : Bytes in encoded vector | |
| 228 * | |
| 229 * Output: | |
| 230 * - decoded : The decoded vector | |
| 231 * - audio_type : 1 normal, 2 CNG (for Opus it should | |
| 232 * always return 1 since we're not using Opus's | |
| 233 * built-in DTX/CNG scheme) | |
| 234 * | |
| 235 * Return value : >0 - Samples per channel in decoded vector | |
| 236 * -1 - Error | |
| 237 */ | |
| 238 int WebRtcOpus_Decode(OpusDecInst* inst, const uint8_t* encoded, | |
| 239 size_t encoded_bytes, int16_t* decoded, | |
| 240 int16_t* audio_type); | |
| 241 | |
| 242 /**************************************************************************** | |
| 243 * WebRtcOpus_DecodePlc(...) | |
| 244 * | |
| 245 * This function processes PLC for opus frame(s). | |
| 246 * Input: | |
| 247 * - inst : Decoder context | |
| 248 * - number_of_lost_frames : Number of PLC frames to produce | |
| 249 * | |
| 250 * Output: | |
| 251 * - decoded : The decoded vector | |
| 252 * | |
| 253 * Return value : >0 - number of samples in decoded PLC vector | |
| 254 * -1 - Error | |
| 255 */ | |
| 256 int WebRtcOpus_DecodePlc(OpusDecInst* inst, int16_t* decoded, | |
| 257 int number_of_lost_frames); | |
| 258 | |
| 259 /**************************************************************************** | |
| 260 * WebRtcOpus_DecodeFec(...) | |
| 261 * | |
| 262 * This function decodes the FEC data from an Opus packet into one or more audio | |
| 263 * frames at the ACM interface's sampling rate (32 kHz). | |
| 264 * | |
| 265 * Input: | |
| 266 * - inst : Decoder context | |
| 267 * - encoded : Encoded data | |
| 268 * - encoded_bytes : Bytes in encoded vector | |
| 269 * | |
| 270 * Output: | |
| 271 * - decoded : The decoded vector (previous frame) | |
| 272 * | |
| 273 * Return value : >0 - Samples per channel in decoded vector | |
| 274 * 0 - No FEC data in the packet | |
| 275 * -1 - Error | |
| 276 */ | |
| 277 int WebRtcOpus_DecodeFec(OpusDecInst* inst, const uint8_t* encoded, | |
| 278 size_t encoded_bytes, int16_t* decoded, | |
| 279 int16_t* audio_type); | |
| 280 | |
| 281 /**************************************************************************** | |
| 282 * WebRtcOpus_DurationEst(...) | |
| 283 * | |
| 284 * This function calculates the duration of an opus packet. | |
| 285 * Input: | |
| 286 * - inst : Decoder context | |
| 287 * - payload : Encoded data pointer | |
| 288 * - payload_length_bytes : Bytes of encoded data | |
| 289 * | |
| 290 * Return value : The duration of the packet, in samples per | |
| 291 * channel. | |
| 292 */ | |
| 293 int WebRtcOpus_DurationEst(OpusDecInst* inst, | |
| 294 const uint8_t* payload, | |
| 295 size_t payload_length_bytes); | |
| 296 | |
| 297 /**************************************************************************** | |
| 298 * WebRtcOpus_PlcDuration(...) | |
| 299 * | |
| 300 * This function calculates the duration of a frame returned by packet loss | |
| 301 * concealment (PLC). | |
| 302 * | |
| 303 * Input: | |
| 304 * - inst : Decoder context | |
| 305 * | |
| 306 * Return value : The duration of a frame returned by PLC, in | |
| 307 * samples per channel. | |
| 308 */ | |
| 309 int WebRtcOpus_PlcDuration(OpusDecInst* inst); | |
| 310 | |
| 311 /* TODO(minyue): Check whether it is needed to add a decoder context to the | |
| 312 * arguments, like WebRtcOpus_DurationEst(...). In fact, the packet itself tells | |
| 313 * the duration. The decoder context in WebRtcOpus_DurationEst(...) is not used. | |
| 314 * So it may be advisable to remove it from WebRtcOpus_DurationEst(...). */ | |
| 315 | |
| 316 /**************************************************************************** | |
| 317 * WebRtcOpus_FecDurationEst(...) | |
| 318 * | |
| 319 * This function calculates the duration of the FEC data within an opus packet. | |
| 320 * Input: | |
| 321 * - payload : Encoded data pointer | |
| 322 * - payload_length_bytes : Bytes of encoded data | |
| 323 * | |
| 324 * Return value : >0 - The duration of the FEC data in the | |
| 325 * packet in samples per channel. | |
| 326 * 0 - No FEC data in the packet. | |
| 327 */ | |
| 328 int WebRtcOpus_FecDurationEst(const uint8_t* payload, | |
| 329 size_t payload_length_bytes); | |
| 330 | |
| 331 /**************************************************************************** | |
| 332 * WebRtcOpus_PacketHasFec(...) | |
| 333 * | |
| 334 * This function detects if an opus packet has FEC. | |
| 335 * Input: | |
| 336 * - payload : Encoded data pointer | |
| 337 * - payload_length_bytes : Bytes of encoded data | |
| 338 * | |
| 339 * Return value : 0 - the packet does NOT contain FEC. | |
| 340 * 1 - the packet contains FEC. | |
| 341 */ | |
| 342 int WebRtcOpus_PacketHasFec(const uint8_t* payload, | |
| 343 size_t payload_length_bytes); | |
| 344 | |
| 345 #ifdef __cplusplus | |
| 346 } // extern "C" | |
| 347 #endif | |
| 348 | |
| 349 #endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_INTERFACE_OPUS_INTERFACE_H_ | |
| OLD | NEW |