Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 8 | pmbaty | 1 | /* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited | 
| 2 |    Written by Jean-Marc Valin and Koen Vos */ | ||
| 3 | /* | ||
| 4 |    Redistribution and use in source and binary forms, with or without | ||
| 5 |    modification, are permitted provided that the following conditions | ||
| 6 |    are met: | ||
| 7 | |||
| 8 |    - Redistributions of source code must retain the above copyright | ||
| 9 |    notice, this list of conditions and the following disclaimer. | ||
| 10 | |||
| 11 |    - Redistributions in binary form must reproduce the above copyright | ||
| 12 |    notice, this list of conditions and the following disclaimer in the | ||
| 13 |    documentation and/or other materials provided with the distribution. | ||
| 14 | |||
| 15 |    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 16 |    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 17 |    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| 18 |    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER | ||
| 19 |    OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | ||
| 20 |    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | ||
| 21 |    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | ||
| 22 |    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | ||
| 23 |    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | ||
| 24 |    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
| 25 |    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 26 | */ | ||
| 27 | |||
| 28 | /** | ||
| 29 |  * @file opus.h | ||
| 30 |  * @brief Opus reference implementation API | ||
| 31 |  */ | ||
| 32 | |||
| 33 | #ifndef OPUS_H | ||
| 34 | #define OPUS_H | ||
| 35 | |||
| 36 | #include "opus_types.h" | ||
| 37 | #include "opus_defines.h" | ||
| 38 | |||
| 39 | #ifdef __cplusplus | ||
| 40 | extern "C" { | ||
| 41 | #endif | ||
| 42 | |||
| 43 | /** | ||
| 44 |  * @mainpage Opus | ||
| 45 |  * | ||
| 46 |  * The Opus codec is designed for interactive speech and audio transmission over the Internet. | ||
| 47 |  * It is designed by the IETF Codec Working Group and incorporates technology from | ||
| 48 |  * Skype's SILK codec and Xiph.Org's CELT codec. | ||
| 49 |  * | ||
| 50 |  * The Opus codec is designed to handle a wide range of interactive audio applications, | ||
| 51 |  * including Voice over IP, videoconferencing, in-game chat, and even remote live music | ||
| 52 |  * performances. It can scale from low bit-rate narrowband speech to very high quality | ||
| 53 |  * stereo music. Its main features are: | ||
| 54 | |||
| 55 |  * @li Sampling rates from 8 to 48 kHz | ||
| 56 |  * @li Bit-rates from 6 kb/s to 510 kb/s | ||
| 57 |  * @li Support for both constant bit-rate (CBR) and variable bit-rate (VBR) | ||
| 58 |  * @li Audio bandwidth from narrowband to full-band | ||
| 59 |  * @li Support for speech and music | ||
| 60 |  * @li Support for mono and stereo | ||
| 61 |  * @li Support for multichannel (up to 255 channels) | ||
| 62 |  * @li Frame sizes from 2.5 ms to 60 ms | ||
| 63 |  * @li Good loss robustness and packet loss concealment (PLC) | ||
| 64 |  * @li Floating point and fixed-point implementation | ||
| 65 |  * | ||
| 66 |  * Documentation sections: | ||
| 67 |  * @li @ref opus_encoder | ||
| 68 |  * @li @ref opus_decoder | ||
| 69 |  * @li @ref opus_repacketizer | ||
| 70 |  * @li @ref opus_multistream | ||
| 71 |  * @li @ref opus_libinfo | ||
| 72 |  * @li @ref opus_custom | ||
| 73 |  */ | ||
| 74 | |||
| 75 | /** @defgroup opus_encoder Opus Encoder | ||
| 76 |   * @{ | ||
| 77 |   * | ||
| 78 |   * @brief This page describes the process and functions used to encode Opus. | ||
| 79 |   * | ||
| 80 |   * Since Opus is a stateful codec, the encoding process starts with creating an encoder | ||
| 81 |   * state. This can be done with: | ||
| 82 |   * | ||
| 83 |   * @code | ||
| 84 |   * int          error; | ||
| 85 |   * OpusEncoder *enc; | ||
| 86 |   * enc = opus_encoder_create(Fs, channels, application, &error); | ||
| 87 |   * @endcode | ||
| 88 |   * | ||
| 89 |   * From this point, @c enc can be used for encoding an audio stream. An encoder state | ||
| 90 |   * @b must @b not be used for more than one stream at the same time. Similarly, the encoder | ||
| 91 |   * state @b must @b not be re-initialized for each frame. | ||
| 92 |   * | ||
| 93 |   * While opus_encoder_create() allocates memory for the state, it's also possible | ||
| 94 |   * to initialize pre-allocated memory: | ||
| 95 |   * | ||
| 96 |   * @code | ||
| 97 |   * int          size; | ||
| 98 |   * int          error; | ||
| 99 |   * OpusEncoder *enc; | ||
| 100 |   * size = opus_encoder_get_size(channels); | ||
| 101 |   * enc = malloc(size); | ||
| 102 |   * error = opus_encoder_init(enc, Fs, channels, application); | ||
| 103 |   * @endcode | ||
| 104 |   * | ||
| 105 |   * where opus_encoder_get_size() returns the required size for the encoder state. Note that | ||
| 106 |   * future versions of this code may change the size, so no assuptions should be made about it. | ||
| 107 |   * | ||
| 108 |   * The encoder state is always continuous in memory and only a shallow copy is sufficient | ||
| 109 |   * to copy it (e.g. memcpy()) | ||
| 110 |   * | ||
| 111 |   * It is possible to change some of the encoder's settings using the opus_encoder_ctl() | ||
| 112 |   * interface. All these settings already default to the recommended value, so they should | ||
| 113 |   * only be changed when necessary. The most common settings one may want to change are: | ||
| 114 |   * | ||
| 115 |   * @code | ||
| 116 |   * opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate)); | ||
| 117 |   * opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity)); | ||
| 118 |   * opus_encoder_ctl(enc, OPUS_SET_SIGNAL(signal_type)); | ||
| 119 |   * @endcode | ||
| 120 |   * | ||
| 121 |   * where | ||
| 122 |   * | ||
| 123 |   * @arg bitrate is in bits per second (b/s) | ||
| 124 |   * @arg complexity is a value from 1 to 10, where 1 is the lowest complexity and 10 is the highest | ||
| 125 |   * @arg signal_type is either OPUS_AUTO (default), OPUS_SIGNAL_VOICE, or OPUS_SIGNAL_MUSIC | ||
| 126 |   * | ||
| 127 |   * See @ref opus_encoderctls and @ref opus_genericctls for a complete list of parameters that can be set or queried. Most parameters can be set or changed at any time during a stream. | ||
| 128 |   * | ||
| 129 |   * To encode a frame, opus_encode() or opus_encode_float() must be called with exactly one frame (2.5, 5, 10, 20, 40 or 60 ms) of audio data: | ||
| 130 |   * @code | ||
| 131 |   * len = opus_encode(enc, audio_frame, frame_size, packet, max_packet); | ||
| 132 |   * @endcode | ||
| 133 |   * | ||
| 134 |   * where | ||
| 135 |   * <ul> | ||
| 136 |   * <li>audio_frame is the audio data in opus_int16 (or float for opus_encode_float())</li> | ||
| 137 |   * <li>frame_size is the duration of the frame in samples (per channel)</li> | ||
| 138 |   * <li>packet is the byte array to which the compressed data is written</li> | ||
| 139 |   * <li>max_packet is the maximum number of bytes that can be written in the packet (4000 bytes is recommended). | ||
| 140 |   *     Do not use max_packet to control VBR target bitrate, instead use the #OPUS_SET_BITRATE CTL.</li> | ||
| 141 |   * </ul> | ||
| 142 |   * | ||
| 143 |   * opus_encode() and opus_encode_float() return the number of bytes actually written to the packet. | ||
| 144 |   * The return value <b>can be negative</b>, which indicates that an error has occurred. If the return value | ||
| 145 |   * is 1 byte, then the packet does not need to be transmitted (DTX). | ||
| 146 |   * | ||
| 147 |   * Once the encoder state if no longer needed, it can be destroyed with | ||
| 148 |   * | ||
| 149 |   * @code | ||
| 150 |   * opus_encoder_destroy(enc); | ||
| 151 |   * @endcode | ||
| 152 |   * | ||
| 153 |   * If the encoder was created with opus_encoder_init() rather than opus_encoder_create(), | ||
| 154 |   * then no action is required aside from potentially freeing the memory that was manually | ||
| 155 |   * allocated for it (calling free(enc) for the example above) | ||
| 156 |   * | ||
| 157 |   */ | ||
| 158 | |||
| 159 | /** Opus encoder state. | ||
| 160 |   * This contains the complete state of an Opus encoder. | ||
| 161 |   * It is position independent and can be freely copied. | ||
| 162 |   * @see opus_encoder_create,opus_encoder_init | ||
| 163 |   */ | ||
| 164 | typedef struct OpusEncoder OpusEncoder; | ||
| 165 | |||
| 166 | /** Gets the size of an <code>OpusEncoder</code> structure. | ||
| 167 |   * @param[in] channels <tt>int</tt>: Number of channels. | ||
| 168 |   *                                   This must be 1 or 2. | ||
| 169 |   * @returns The size in bytes. | ||
| 170 |   */ | ||
| 171 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_encoder_get_size(int channels); | ||
| 172 | |||
| 173 | /** | ||
| 174 |  */ | ||
| 175 | |||
| 176 | /** Allocates and initializes an encoder state. | ||
| 177 |  * There are three coding modes: | ||
| 178 |  * | ||
| 179 |  * @ref OPUS_APPLICATION_VOIP gives best quality at a given bitrate for voice | ||
| 180 |  *    signals. It enhances the  input signal by high-pass filtering and | ||
| 181 |  *    emphasizing formants and harmonics. Optionally  it includes in-band | ||
| 182 |  *    forward error correction to protect against packet loss. Use this | ||
| 183 |  *    mode for typical VoIP applications. Because of the enhancement, | ||
| 184 |  *    even at high bitrates the output may sound different from the input. | ||
| 185 |  * | ||
| 186 |  * @ref OPUS_APPLICATION_AUDIO gives best quality at a given bitrate for most | ||
| 187 |  *    non-voice signals like music. Use this mode for music and mixed | ||
| 188 |  *    (music/voice) content, broadcast, and applications requiring less | ||
| 189 |  *    than 15 ms of coding delay. | ||
| 190 |  * | ||
| 191 |  * @ref OPUS_APPLICATION_RESTRICTED_LOWDELAY configures low-delay mode that | ||
| 192 |  *    disables the speech-optimized mode in exchange for slightly reduced delay. | ||
| 193 |  *    This mode can only be set on an newly initialized or freshly reset encoder | ||
| 194 |  *    because it changes the codec delay. | ||
| 195 |  * | ||
| 196 |  * This is useful when the caller knows that the speech-optimized modes will not be needed (use with caution). | ||
| 197 |  * @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz) | ||
| 198 |  *                                     This must be one of 8000, 12000, 16000, | ||
| 199 |  *                                     24000, or 48000. | ||
| 200 |  * @param [in] channels <tt>int</tt>: Number of channels (1 or 2) in input signal | ||
| 201 |  * @param [in] application <tt>int</tt>: Coding mode (@ref OPUS_APPLICATION_VOIP/@ref OPUS_APPLICATION_AUDIO/@ref OPUS_APPLICATION_RESTRICTED_LOWDELAY) | ||
| 202 |  * @param [out] error <tt>int*</tt>: @ref opus_errorcodes | ||
| 203 |  * @note Regardless of the sampling rate and number channels selected, the Opus encoder | ||
| 204 |  * can switch to a lower audio bandwidth or number of channels if the bitrate | ||
| 205 |  * selected is too low. This also means that it is safe to always use 48 kHz stereo input | ||
| 206 |  * and let the encoder optimize the encoding. | ||
| 207 |  */ | ||
| 208 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusEncoder *opus_encoder_create( | ||
| 209 | opus_int32 Fs, | ||
| 210 |     int channels, | ||
| 211 |     int application, | ||
| 212 | int *error | ||
| 213 | ); | ||
| 214 | |||
| 215 | /** Initializes a previously allocated encoder state | ||
| 216 |   * The memory pointed to by st must be at least the size returned by opus_encoder_get_size(). | ||
| 217 |   * This is intended for applications which use their own allocator instead of malloc. | ||
| 218 |   * @see opus_encoder_create(),opus_encoder_get_size() | ||
| 219 |   * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. | ||
| 220 |   * @param [in] st <tt>OpusEncoder*</tt>: Encoder state | ||
| 221 |   * @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz) | ||
| 222 |  *                                      This must be one of 8000, 12000, 16000, | ||
| 223 |  *                                      24000, or 48000. | ||
| 224 |   * @param [in] channels <tt>int</tt>: Number of channels (1 or 2) in input signal | ||
| 225 |   * @param [in] application <tt>int</tt>: Coding mode (OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRICTED_LOWDELAY) | ||
| 226 |   * @retval #OPUS_OK Success or @ref opus_errorcodes | ||
| 227 |   */ | ||
| 228 | OPUS_EXPORT int opus_encoder_init( | ||
| 229 |     OpusEncoder *st, | ||
| 230 | opus_int32 Fs, | ||
| 231 |     int channels, | ||
| 232 |     int application | ||
| 233 | ) OPUS_ARG_NONNULL(1); | ||
| 234 | |||
| 235 | /** Encodes an Opus frame. | ||
| 236 |   * @param [in] st <tt>OpusEncoder*</tt>: Encoder state | ||
| 237 |   * @param [in] pcm <tt>opus_int16*</tt>: Input signal (interleaved if 2 channels). length is frame_size*channels*sizeof(opus_int16) | ||
| 238 |   * @param [in] frame_size <tt>int</tt>: Number of samples per channel in the | ||
| 239 |   *                                      input signal. | ||
| 240 |   *                                      This must be an Opus frame size for | ||
| 241 |   *                                      the encoder's sampling rate. | ||
| 242 |   *                                      For example, at 48 kHz the permitted | ||
| 243 |   *                                      values are 120, 240, 480, 960, 1920, | ||
| 244 |   *                                      and 2880. | ||
| 245 |   *                                      Passing in a duration of less than | ||
| 246 |   *                                      10 ms (480 samples at 48 kHz) will | ||
| 247 |   *                                      prevent the encoder from using the LPC | ||
| 248 |   *                                      or hybrid modes. | ||
| 249 |   * @param [out] data <tt>unsigned char*</tt>: Output payload. | ||
| 250 |   *                                            This must contain storage for at | ||
| 251 |   *                                            least \a max_data_bytes. | ||
| 252 |   * @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated | ||
| 253 |   *                                                 memory for the output | ||
| 254 |   *                                                 payload. This may be | ||
| 255 |   *                                                 used to impose an upper limit on | ||
| 256 |   *                                                 the instant bitrate, but should | ||
| 257 |   *                                                 not be used as the only bitrate | ||
| 258 |   *                                                 control. Use #OPUS_SET_BITRATE to | ||
| 259 |   *                                                 control the bitrate. | ||
| 260 |   * @returns The length of the encoded packet (in bytes) on success or a | ||
| 261 |   *          negative error code (see @ref opus_errorcodes) on failure. | ||
| 262 |   */ | ||
| 263 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode( | ||
| 264 |     OpusEncoder *st, | ||
| 265 | const opus_int16 *pcm, | ||
| 266 |     int frame_size, | ||
| 267 | unsigned char *data, | ||
| 268 | opus_int32 max_data_bytes | ||
| 269 | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); | ||
| 270 | |||
| 271 | /** Encodes an Opus frame from floating point input. | ||
| 272 |   * @param [in] st <tt>OpusEncoder*</tt>: Encoder state | ||
| 273 |   * @param [in] pcm <tt>float*</tt>: Input in float format (interleaved if 2 channels), with a normal range of +/-1.0. | ||
| 274 |   *          Samples with a range beyond +/-1.0 are supported but will | ||
| 275 |   *          be clipped by decoders using the integer API and should | ||
| 276 |   *          only be used if it is known that the far end supports | ||
| 277 |   *          extended dynamic range. | ||
| 278 |   *          length is frame_size*channels*sizeof(float) | ||
| 279 |   * @param [in] frame_size <tt>int</tt>: Number of samples per channel in the | ||
| 280 |   *                                      input signal. | ||
| 281 |   *                                      This must be an Opus frame size for | ||
| 282 |   *                                      the encoder's sampling rate. | ||
| 283 |   *                                      For example, at 48 kHz the permitted | ||
| 284 |   *                                      values are 120, 240, 480, 960, 1920, | ||
| 285 |   *                                      and 2880. | ||
| 286 |   *                                      Passing in a duration of less than | ||
| 287 |   *                                      10 ms (480 samples at 48 kHz) will | ||
| 288 |   *                                      prevent the encoder from using the LPC | ||
| 289 |   *                                      or hybrid modes. | ||
| 290 |   * @param [out] data <tt>unsigned char*</tt>: Output payload. | ||
| 291 |   *                                            This must contain storage for at | ||
| 292 |   *                                            least \a max_data_bytes. | ||
| 293 |   * @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated | ||
| 294 |   *                                                 memory for the output | ||
| 295 |   *                                                 payload. This may be | ||
| 296 |   *                                                 used to impose an upper limit on | ||
| 297 |   *                                                 the instant bitrate, but should | ||
| 298 |   *                                                 not be used as the only bitrate | ||
| 299 |   *                                                 control. Use #OPUS_SET_BITRATE to | ||
| 300 |   *                                                 control the bitrate. | ||
| 301 |   * @returns The length of the encoded packet (in bytes) on success or a | ||
| 302 |   *          negative error code (see @ref opus_errorcodes) on failure. | ||
| 303 |   */ | ||
| 304 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode_float( | ||
| 305 |     OpusEncoder *st, | ||
| 306 | const float *pcm, | ||
| 307 |     int frame_size, | ||
| 308 | unsigned char *data, | ||
| 309 | opus_int32 max_data_bytes | ||
| 310 | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); | ||
| 311 | |||
| 312 | /** Frees an <code>OpusEncoder</code> allocated by opus_encoder_create(). | ||
| 313 |   * @param[in] st <tt>OpusEncoder*</tt>: State to be freed. | ||
| 314 |   */ | ||
| 315 | OPUS_EXPORT void opus_encoder_destroy(OpusEncoder *st); | ||
| 316 | |||
| 317 | /** Perform a CTL function on an Opus encoder. | ||
| 318 |   * | ||
| 319 |   * Generally the request and subsequent arguments are generated | ||
| 320 |   * by a convenience macro. | ||
| 321 |   * @param st <tt>OpusEncoder*</tt>: Encoder state. | ||
| 322 |   * @param request This and all remaining parameters should be replaced by one | ||
| 323 |   *                of the convenience macros in @ref opus_genericctls or | ||
| 324 |   *                @ref opus_encoderctls. | ||
| 325 |   * @see opus_genericctls | ||
| 326 |   * @see opus_encoderctls | ||
| 327 |   */ | ||
| 328 | OPUS_EXPORT int opus_encoder_ctl(OpusEncoder *st, int request, ...) OPUS_ARG_NONNULL(1); | ||
| 329 | /**@}*/ | ||
| 330 | |||
| 331 | /** @defgroup opus_decoder Opus Decoder | ||
| 332 |   * @{ | ||
| 333 |   * | ||
| 334 |   * @brief This page describes the process and functions used to decode Opus. | ||
| 335 |   * | ||
| 336 |   * The decoding process also starts with creating a decoder | ||
| 337 |   * state. This can be done with: | ||
| 338 |   * @code | ||
| 339 |   * int          error; | ||
| 340 |   * OpusDecoder *dec; | ||
| 341 |   * dec = opus_decoder_create(Fs, channels, &error); | ||
| 342 |   * @endcode | ||
| 343 |   * where | ||
| 344 |   * @li Fs is the sampling rate and must be 8000, 12000, 16000, 24000, or 48000 | ||
| 345 |   * @li channels is the number of channels (1 or 2) | ||
| 346 |   * @li error will hold the error code in case of failure (or #OPUS_OK on success) | ||
| 347 |   * @li the return value is a newly created decoder state to be used for decoding | ||
| 348 |   * | ||
| 349 |   * While opus_decoder_create() allocates memory for the state, it's also possible | ||
| 350 |   * to initialize pre-allocated memory: | ||
| 351 |   * @code | ||
| 352 |   * int          size; | ||
| 353 |   * int          error; | ||
| 354 |   * OpusDecoder *dec; | ||
| 355 |   * size = opus_decoder_get_size(channels); | ||
| 356 |   * dec = malloc(size); | ||
| 357 |   * error = opus_decoder_init(dec, Fs, channels); | ||
| 358 |   * @endcode | ||
| 359 |   * where opus_decoder_get_size() returns the required size for the decoder state. Note that | ||
| 360 |   * future versions of this code may change the size, so no assuptions should be made about it. | ||
| 361 |   * | ||
| 362 |   * The decoder state is always continuous in memory and only a shallow copy is sufficient | ||
| 363 |   * to copy it (e.g. memcpy()) | ||
| 364 |   * | ||
| 365 |   * To decode a frame, opus_decode() or opus_decode_float() must be called with a packet of compressed audio data: | ||
| 366 |   * @code | ||
| 367 |   * frame_size = opus_decode(dec, packet, len, decoded, max_size, 0); | ||
| 368 |   * @endcode | ||
| 369 |   * where | ||
| 370 |   * | ||
| 371 |   * @li packet is the byte array containing the compressed data | ||
| 372 |   * @li len is the exact number of bytes contained in the packet | ||
| 373 |   * @li decoded is the decoded audio data in opus_int16 (or float for opus_decode_float()) | ||
| 374 |   * @li max_size is the max duration of the frame in samples (per channel) that can fit into the decoded_frame array | ||
| 375 |   * | ||
| 376 |   * opus_decode() and opus_decode_float() return the number of samples (per channel) decoded from the packet. | ||
| 377 |   * If that value is negative, then an error has occurred. This can occur if the packet is corrupted or if the audio | ||
| 378 |   * buffer is too small to hold the decoded audio. | ||
| 379 |   * | ||
| 380 |   * Opus is a stateful codec with overlapping blocks and as a result Opus | ||
| 381 |   * packets are not coded independently of each other. Packets must be | ||
| 382 |   * passed into the decoder serially and in the correct order for a correct | ||
| 383 |   * decode. Lost packets can be replaced with loss concealment by calling | ||
| 384 |   * the decoder with a null pointer and zero length for the missing packet. | ||
| 385 |   * | ||
| 386 |   * A single codec state may only be accessed from a single thread at | ||
| 387 |   * a time and any required locking must be performed by the caller. Separate | ||
| 388 |   * streams must be decoded with separate decoder states and can be decoded | ||
| 389 |   * in parallel unless the library was compiled with NONTHREADSAFE_PSEUDOSTACK | ||
| 390 |   * defined. | ||
| 391 |   * | ||
| 392 |   */ | ||
| 393 | |||
| 394 | /** Opus decoder state. | ||
| 395 |   * This contains the complete state of an Opus decoder. | ||
| 396 |   * It is position independent and can be freely copied. | ||
| 397 |   * @see opus_decoder_create,opus_decoder_init | ||
| 398 |   */ | ||
| 399 | typedef struct OpusDecoder OpusDecoder; | ||
| 400 | |||
| 401 | /** Gets the size of an <code>OpusDecoder</code> structure. | ||
| 402 |   * @param [in] channels <tt>int</tt>: Number of channels. | ||
| 403 |   *                                    This must be 1 or 2. | ||
| 404 |   * @returns The size in bytes. | ||
| 405 |   */ | ||
| 406 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_size(int channels); | ||
| 407 | |||
| 408 | /** Allocates and initializes a decoder state. | ||
| 409 |   * @param [in] Fs <tt>opus_int32</tt>: Sample rate to decode at (Hz). | ||
| 410 |   *                                     This must be one of 8000, 12000, 16000, | ||
| 411 |   *                                     24000, or 48000. | ||
| 412 |   * @param [in] channels <tt>int</tt>: Number of channels (1 or 2) to decode | ||
| 413 |   * @param [out] error <tt>int*</tt>: #OPUS_OK Success or @ref opus_errorcodes | ||
| 414 |   * | ||
| 415 |   * Internally Opus stores data at 48000 Hz, so that should be the default | ||
| 416 |   * value for Fs. However, the decoder can efficiently decode to buffers | ||
| 417 |   * at 8, 12, 16, and 24 kHz so if for some reason the caller cannot use | ||
| 418 |   * data at the full sample rate, or knows the compressed data doesn't | ||
| 419 |   * use the full frequency range, it can request decoding at a reduced | ||
| 420 |   * rate. Likewise, the decoder is capable of filling in either mono or | ||
| 421 |   * interleaved stereo pcm buffers, at the caller's request. | ||
| 422 |   */ | ||
| 423 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusDecoder *opus_decoder_create( | ||
| 424 | opus_int32 Fs, | ||
| 425 |     int channels, | ||
| 426 | int *error | ||
| 427 | ); | ||
| 428 | |||
| 429 | /** Initializes a previously allocated decoder state. | ||
| 430 |   * The state must be at least the size returned by opus_decoder_get_size(). | ||
| 431 |   * This is intended for applications which use their own allocator instead of malloc. @see opus_decoder_create,opus_decoder_get_size | ||
| 432 |   * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. | ||
| 433 |   * @param [in] st <tt>OpusDecoder*</tt>: Decoder state. | ||
| 434 |   * @param [in] Fs <tt>opus_int32</tt>: Sampling rate to decode to (Hz). | ||
| 435 |   *                                     This must be one of 8000, 12000, 16000, | ||
| 436 |   *                                     24000, or 48000. | ||
| 437 |   * @param [in] channels <tt>int</tt>: Number of channels (1 or 2) to decode | ||
| 438 |   * @retval #OPUS_OK Success or @ref opus_errorcodes | ||
| 439 |   */ | ||
| 440 | OPUS_EXPORT int opus_decoder_init( | ||
| 441 |     OpusDecoder *st, | ||
| 442 | opus_int32 Fs, | ||
| 443 |     int channels | ||
| 444 | ) OPUS_ARG_NONNULL(1); | ||
| 445 | |||
| 446 | /** Decode an Opus packet. | ||
| 447 |   * @param [in] st <tt>OpusDecoder*</tt>: Decoder state | ||
| 448 |   * @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss | ||
| 449 |   * @param [in] len <tt>opus_int32</tt>: Number of bytes in payload* | ||
| 450 |   * @param [out] pcm <tt>opus_int16*</tt>: Output signal (interleaved if 2 channels). length | ||
| 451 |   *  is frame_size*channels*sizeof(opus_int16) | ||
| 452 |   * @param [in] frame_size Number of samples per channel of available space in \a pcm. | ||
| 453 |   *  If this is less than the maximum packet duration (120ms; 5760 for 48kHz), this function will | ||
| 454 |   *  not be capable of decoding some packets. In the case of PLC (data==NULL) or FEC (decode_fec=1), | ||
| 455 |   *  then frame_size needs to be exactly the duration of audio that is missing, otherwise the | ||
| 456 |   *  decoder will not be in the optimal state to decode the next incoming packet. For the PLC and | ||
| 457 |   *  FEC cases, frame_size <b>must</b> be a multiple of 2.5 ms. | ||
| 458 |   * @param [in] decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band forward error correction data be | ||
| 459 |   *  decoded. If no such data is available, the frame is decoded as if it were lost. | ||
| 460 |   * @returns Number of decoded samples or @ref opus_errorcodes | ||
| 461 |   */ | ||
| 462 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode( | ||
| 463 |     OpusDecoder *st, | ||
| 464 | const unsigned char *data, | ||
| 465 | opus_int32 len, | ||
| 466 |     opus_int16 *pcm, | ||
| 467 |     int frame_size, | ||
| 468 |     int decode_fec | ||
| 469 | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); | ||
| 470 | |||
| 471 | /** Decode an Opus packet with floating point output. | ||
| 472 |   * @param [in] st <tt>OpusDecoder*</tt>: Decoder state | ||
| 473 |   * @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss | ||
| 474 |   * @param [in] len <tt>opus_int32</tt>: Number of bytes in payload | ||
| 475 |   * @param [out] pcm <tt>float*</tt>: Output signal (interleaved if 2 channels). length | ||
| 476 |   *  is frame_size*channels*sizeof(float) | ||
| 477 |   * @param [in] frame_size Number of samples per channel of available space in \a pcm. | ||
| 478 |   *  If this is less than the maximum packet duration (120ms; 5760 for 48kHz), this function will | ||
| 479 |   *  not be capable of decoding some packets. In the case of PLC (data==NULL) or FEC (decode_fec=1), | ||
| 480 |   *  then frame_size needs to be exactly the duration of audio that is missing, otherwise the | ||
| 481 |   *  decoder will not be in the optimal state to decode the next incoming packet. For the PLC and | ||
| 482 |   *  FEC cases, frame_size <b>must</b> be a multiple of 2.5 ms. | ||
| 483 |   * @param [in] decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band forward error correction data be | ||
| 484 |   *  decoded. If no such data is available the frame is decoded as if it were lost. | ||
| 485 |   * @returns Number of decoded samples or @ref opus_errorcodes | ||
| 486 |   */ | ||
| 487 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode_float( | ||
| 488 |     OpusDecoder *st, | ||
| 489 | const unsigned char *data, | ||
| 490 | opus_int32 len, | ||
| 491 | float *pcm, | ||
| 492 |     int frame_size, | ||
| 493 |     int decode_fec | ||
| 494 | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); | ||
| 495 | |||
| 496 | /** Perform a CTL function on an Opus decoder. | ||
| 497 |   * | ||
| 498 |   * Generally the request and subsequent arguments are generated | ||
| 499 |   * by a convenience macro. | ||
| 500 |   * @param st <tt>OpusDecoder*</tt>: Decoder state. | ||
| 501 |   * @param request This and all remaining parameters should be replaced by one | ||
| 502 |   *                of the convenience macros in @ref opus_genericctls or | ||
| 503 |   *                @ref opus_decoderctls. | ||
| 504 |   * @see opus_genericctls | ||
| 505 |   * @see opus_decoderctls | ||
| 506 |   */ | ||
| 507 | OPUS_EXPORT int opus_decoder_ctl(OpusDecoder *st, int request, ...) OPUS_ARG_NONNULL(1); | ||
| 508 | |||
| 509 | /** Frees an <code>OpusDecoder</code> allocated by opus_decoder_create(). | ||
| 510 |   * @param[in] st <tt>OpusDecoder*</tt>: State to be freed. | ||
| 511 |   */ | ||
| 512 | OPUS_EXPORT void opus_decoder_destroy(OpusDecoder *st); | ||
| 513 | |||
| 514 | /** Parse an opus packet into one or more frames. | ||
| 515 |   * Opus_decode will perform this operation internally so most applications do | ||
| 516 |   * not need to use this function. | ||
| 517 |   * This function does not copy the frames, the returned pointers are pointers into | ||
| 518 |   * the input packet. | ||
| 519 |   * @param [in] data <tt>char*</tt>: Opus packet to be parsed | ||
| 520 |   * @param [in] len <tt>opus_int32</tt>: size of data | ||
| 521 |   * @param [out] out_toc <tt>char*</tt>: TOC pointer | ||
| 522 |   * @param [out] frames <tt>char*[48]</tt> encapsulated frames | ||
| 523 |   * @param [out] size <tt>opus_int16[48]</tt> sizes of the encapsulated frames | ||
| 524 |   * @param [out] payload_offset <tt>int*</tt>: returns the position of the payload within the packet (in bytes) | ||
| 525 |   * @returns number of frames | ||
| 526 |   */ | ||
| 527 | OPUS_EXPORT int opus_packet_parse( | ||
| 528 | const unsigned char *data, | ||
| 529 | opus_int32 len, | ||
| 530 | unsigned char *out_toc, | ||
| 531 | const unsigned char *frames[48], | ||
| 532 | opus_int16 size[48], | ||
| 533 | int *payload_offset | ||
| 534 | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); | ||
| 535 | |||
| 536 | /** Gets the bandwidth of an Opus packet. | ||
| 537 |   * @param [in] data <tt>char*</tt>: Opus packet | ||
| 538 |   * @retval OPUS_BANDWIDTH_NARROWBAND Narrowband (4kHz bandpass) | ||
| 539 |   * @retval OPUS_BANDWIDTH_MEDIUMBAND Mediumband (6kHz bandpass) | ||
| 540 |   * @retval OPUS_BANDWIDTH_WIDEBAND Wideband (8kHz bandpass) | ||
| 541 |   * @retval OPUS_BANDWIDTH_SUPERWIDEBAND Superwideband (12kHz bandpass) | ||
| 542 |   * @retval OPUS_BANDWIDTH_FULLBAND Fullband (20kHz bandpass) | ||
| 543 |   * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type | ||
| 544 |   */ | ||
| 545 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_bandwidth(const unsigned char *data) OPUS_ARG_NONNULL(1); | ||
| 546 | |||
| 547 | /** Gets the number of samples per frame from an Opus packet. | ||
| 548 |   * @param [in] data <tt>char*</tt>: Opus packet. | ||
| 549 |   *                                  This must contain at least one byte of | ||
| 550 |   *                                  data. | ||
| 551 |   * @param [in] Fs <tt>opus_int32</tt>: Sampling rate in Hz. | ||
| 552 |   *                                     This must be a multiple of 400, or | ||
| 553 |   *                                     inaccurate results will be returned. | ||
| 554 |   * @returns Number of samples per frame. | ||
| 555 |   */ | ||
| 556 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_samples_per_frame(const unsigned char *data, opus_int32 Fs) OPUS_ARG_NONNULL(1); | ||
| 557 | |||
| 558 | /** Gets the number of channels from an Opus packet. | ||
| 559 |   * @param [in] data <tt>char*</tt>: Opus packet | ||
| 560 |   * @returns Number of channels | ||
| 561 |   * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type | ||
| 562 |   */ | ||
| 563 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_channels(const unsigned char *data) OPUS_ARG_NONNULL(1); | ||
| 564 | |||
| 565 | /** Gets the number of frames in an Opus packet. | ||
| 566 |   * @param [in] packet <tt>char*</tt>: Opus packet | ||
| 567 |   * @param [in] len <tt>opus_int32</tt>: Length of packet | ||
| 568 |   * @returns Number of frames | ||
| 569 |   * @retval OPUS_BAD_ARG Insufficient data was passed to the function | ||
| 570 |   * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type | ||
| 571 |   */ | ||
| 572 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_frames(const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1); | ||
| 573 | |||
| 574 | /** Gets the number of samples of an Opus packet. | ||
| 575 |   * @param [in] packet <tt>char*</tt>: Opus packet | ||
| 576 |   * @param [in] len <tt>opus_int32</tt>: Length of packet | ||
| 577 |   * @param [in] Fs <tt>opus_int32</tt>: Sampling rate in Hz. | ||
| 578 |   *                                     This must be a multiple of 400, or | ||
| 579 |   *                                     inaccurate results will be returned. | ||
| 580 |   * @returns Number of samples | ||
| 581 |   * @retval OPUS_BAD_ARG Insufficient data was passed to the function | ||
| 582 |   * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type | ||
| 583 |   */ | ||
| 584 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_samples(const unsigned char packet[], opus_int32 len, opus_int32 Fs) OPUS_ARG_NONNULL(1); | ||
| 585 | |||
| 586 | /** Gets the number of samples of an Opus packet. | ||
| 587 |   * @param [in] dec <tt>OpusDecoder*</tt>: Decoder state | ||
| 588 |   * @param [in] packet <tt>char*</tt>: Opus packet | ||
| 589 |   * @param [in] len <tt>opus_int32</tt>: Length of packet | ||
| 590 |   * @returns Number of samples | ||
| 591 |   * @retval OPUS_BAD_ARG Insufficient data was passed to the function | ||
| 592 |   * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type | ||
| 593 |   */ | ||
| 594 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); | ||
| 595 | /**@}*/ | ||
| 596 | |||
| 597 | /** @defgroup opus_repacketizer Repacketizer | ||
| 598 |   * @{ | ||
| 599 |   * | ||
| 600 |   * The repacketizer can be used to merge multiple Opus packets into a single | ||
| 601 |   * packet or alternatively to split Opus packets that have previously been | ||
| 602 |   * merged. Splitting valid Opus packets is always guaranteed to succeed, | ||
| 603 |   * whereas merging valid packets only succeeds if all frames have the same | ||
| 604 |   * mode, bandwidth, and frame size, and when the total duration of the merged | ||
| 605 |   * packet is no more than 120 ms. | ||
| 606 |   * The repacketizer currently only operates on elementary Opus | ||
| 607 |   * streams. It will not manipualte multistream packets successfully, except in | ||
| 608 |   * the degenerate case where they consist of data from a single stream. | ||
| 609 |   * | ||
| 610 |   * The repacketizing process starts with creating a repacketizer state, either | ||
| 611 |   * by calling opus_repacketizer_create() or by allocating the memory yourself, | ||
| 612 |   * e.g., | ||
| 613 |   * @code | ||
| 614 |   * OpusRepacketizer *rp; | ||
| 615 |   * rp = (OpusRepacketizer*)malloc(opus_repacketizer_get_size()); | ||
| 616 |   * if (rp != NULL) | ||
| 617 |   *     opus_repacketizer_init(rp); | ||
| 618 |   * @endcode | ||
| 619 |   * | ||
| 620 |   * Then the application should submit packets with opus_repacketizer_cat(), | ||
| 621 |   * extract new packets with opus_repacketizer_out() or | ||
| 622 |   * opus_repacketizer_out_range(), and then reset the state for the next set of | ||
| 623 |   * input packets via opus_repacketizer_init(). | ||
| 624 |   * | ||
| 625 |   * For example, to split a sequence of packets into individual frames: | ||
| 626 |   * @code | ||
| 627 |   * unsigned char *data; | ||
| 628 |   * int len; | ||
| 629 |   * while (get_next_packet(&data, &len)) | ||
| 630 |   * { | ||
| 631 |   *   unsigned char out[1276]; | ||
| 632 |   *   opus_int32 out_len; | ||
| 633 |   *   int nb_frames; | ||
| 634 |   *   int err; | ||
| 635 |   *   int i; | ||
| 636 |   *   err = opus_repacketizer_cat(rp, data, len); | ||
| 637 |   *   if (err != OPUS_OK) | ||
| 638 |   *   { | ||
| 639 |   *     release_packet(data); | ||
| 640 |   *     return err; | ||
| 641 |   *   } | ||
| 642 |   *   nb_frames = opus_repacketizer_get_nb_frames(rp); | ||
| 643 |   *   for (i = 0; i < nb_frames; i++) | ||
| 644 |   *   { | ||
| 645 |   *     out_len = opus_repacketizer_out_range(rp, i, i+1, out, sizeof(out)); | ||
| 646 |   *     if (out_len < 0) | ||
| 647 |   *     { | ||
| 648 |   *        release_packet(data); | ||
| 649 |   *        return (int)out_len; | ||
| 650 |   *     } | ||
| 651 |   *     output_next_packet(out, out_len); | ||
| 652 |   *   } | ||
| 653 |   *   opus_repacketizer_init(rp); | ||
| 654 |   *   release_packet(data); | ||
| 655 |   * } | ||
| 656 |   * @endcode | ||
| 657 |   * | ||
| 658 |   * Alternatively, to combine a sequence of frames into packets that each | ||
| 659 |   * contain up to <code>TARGET_DURATION_MS</code> milliseconds of data: | ||
| 660 |   * @code | ||
| 661 |   * // The maximum number of packets with duration TARGET_DURATION_MS occurs | ||
| 662 |   * // when the frame size is 2.5 ms, for a total of (TARGET_DURATION_MS*2/5) | ||
| 663 |   * // packets. | ||
| 664 |   * unsigned char *data[(TARGET_DURATION_MS*2/5)+1]; | ||
| 665 |   * opus_int32 len[(TARGET_DURATION_MS*2/5)+1]; | ||
| 666 |   * int nb_packets; | ||
| 667 |   * unsigned char out[1277*(TARGET_DURATION_MS*2/2)]; | ||
| 668 |   * opus_int32 out_len; | ||
| 669 |   * int prev_toc; | ||
| 670 |   * nb_packets = 0; | ||
| 671 |   * while (get_next_packet(data+nb_packets, len+nb_packets)) | ||
| 672 |   * { | ||
| 673 |   *   int nb_frames; | ||
| 674 |   *   int err; | ||
| 675 |   *   nb_frames = opus_packet_get_nb_frames(data[nb_packets], len[nb_packets]); | ||
| 676 |   *   if (nb_frames < 1) | ||
| 677 |   *   { | ||
| 678 |   *     release_packets(data, nb_packets+1); | ||
| 679 |   *     return nb_frames; | ||
| 680 |   *   } | ||
| 681 |   *   nb_frames += opus_repacketizer_get_nb_frames(rp); | ||
| 682 |   *   // If adding the next packet would exceed our target, or it has an | ||
| 683 |   *   // incompatible TOC sequence, output the packets we already have before | ||
| 684 |   *   // submitting it. | ||
| 685 |   *   // N.B., The nb_packets > 0 check ensures we've submitted at least one | ||
| 686 |   *   // packet since the last call to opus_repacketizer_init(). Otherwise a | ||
| 687 |   *   // single packet longer than TARGET_DURATION_MS would cause us to try to | ||
| 688 |   *   // output an (invalid) empty packet. It also ensures that prev_toc has | ||
| 689 |   *   // been set to a valid value. Additionally, len[nb_packets] > 0 is | ||
| 690 |   *   // guaranteed by the call to opus_packet_get_nb_frames() above, so the | ||
| 691 |   *   // reference to data[nb_packets][0] should be valid. | ||
| 692 |   *   if (nb_packets > 0 && ( | ||
| 693 |   *       ((prev_toc & 0xFC) != (data[nb_packets][0] & 0xFC)) || | ||
| 694 |   *       opus_packet_get_samples_per_frame(data[nb_packets], 48000)*nb_frames > | ||
| 695 |   *       TARGET_DURATION_MS*48)) | ||
| 696 |   *   { | ||
| 697 |   *     out_len = opus_repacketizer_out(rp, out, sizeof(out)); | ||
| 698 |   *     if (out_len < 0) | ||
| 699 |   *     { | ||
| 700 |   *        release_packets(data, nb_packets+1); | ||
| 701 |   *        return (int)out_len; | ||
| 702 |   *     } | ||
| 703 |   *     output_next_packet(out, out_len); | ||
| 704 |   *     opus_repacketizer_init(rp); | ||
| 705 |   *     release_packets(data, nb_packets); | ||
| 706 |   *     data[0] = data[nb_packets]; | ||
| 707 |   *     len[0] = len[nb_packets]; | ||
| 708 |   *     nb_packets = 0; | ||
| 709 |   *   } | ||
| 710 |   *   err = opus_repacketizer_cat(rp, data[nb_packets], len[nb_packets]); | ||
| 711 |   *   if (err != OPUS_OK) | ||
| 712 |   *   { | ||
| 713 |   *     release_packets(data, nb_packets+1); | ||
| 714 |   *     return err; | ||
| 715 |   *   } | ||
| 716 |   *   prev_toc = data[nb_packets][0]; | ||
| 717 |   *   nb_packets++; | ||
| 718 |   * } | ||
| 719 |   * // Output the final, partial packet. | ||
| 720 |   * if (nb_packets > 0) | ||
| 721 |   * { | ||
| 722 |   *   out_len = opus_repacketizer_out(rp, out, sizeof(out)); | ||
| 723 |   *   release_packets(data, nb_packets); | ||
| 724 |   *   if (out_len < 0) | ||
| 725 |   *     return (int)out_len; | ||
| 726 |   *   output_next_packet(out, out_len); | ||
| 727 |   * } | ||
| 728 |   * @endcode | ||
| 729 |   * | ||
| 730 |   * An alternate way of merging packets is to simply call opus_repacketizer_cat() | ||
| 731 |   * unconditionally until it fails. At that point, the merged packet can be | ||
| 732 |   * obtained with opus_repacketizer_out() and the input packet for which | ||
| 733 |   * opus_repacketizer_cat() needs to be re-added to a newly reinitialized | ||
| 734 |   * repacketizer state. | ||
| 735 |   */ | ||
| 736 | |||
| 737 | typedef struct OpusRepacketizer OpusRepacketizer; | ||
| 738 | |||
| 739 | /** Gets the size of an <code>OpusRepacketizer</code> structure. | ||
| 740 |   * @returns The size in bytes. | ||
| 741 |   */ | ||
| 742 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_size(void); | ||
| 743 | |||
| 744 | /** (Re)initializes a previously allocated repacketizer state. | ||
| 745 |   * The state must be at least the size returned by opus_repacketizer_get_size(). | ||
| 746 |   * This can be used for applications which use their own allocator instead of | ||
| 747 |   * malloc(). | ||
| 748 |   * It must also be called to reset the queue of packets waiting to be | ||
| 749 |   * repacketized, which is necessary if the maximum packet duration of 120 ms | ||
| 750 |   * is reached or if you wish to submit packets with a different Opus | ||
| 751 |   * configuration (coding mode, audio bandwidth, frame size, or channel count). | ||
| 752 |   * Failure to do so will prevent a new packet from being added with | ||
| 753 |   * opus_repacketizer_cat(). | ||
| 754 |   * @see opus_repacketizer_create | ||
| 755 |   * @see opus_repacketizer_get_size | ||
| 756 |   * @see opus_repacketizer_cat | ||
| 757 |   * @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state to | ||
| 758 |   *                                       (re)initialize. | ||
| 759 |   * @returns A pointer to the same repacketizer state that was passed in. | ||
| 760 |   */ | ||
| 761 | OPUS_EXPORT OpusRepacketizer *opus_repacketizer_init(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1); | ||
| 762 | |||
| 763 | /** Allocates memory and initializes the new repacketizer with | ||
| 764 |  * opus_repacketizer_init(). | ||
| 765 |   */ | ||
| 766 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusRepacketizer *opus_repacketizer_create(void); | ||
| 767 | |||
| 768 | /** Frees an <code>OpusRepacketizer</code> allocated by | ||
| 769 |   * opus_repacketizer_create(). | ||
| 770 |   * @param[in] rp <tt>OpusRepacketizer*</tt>: State to be freed. | ||
| 771 |   */ | ||
| 772 | OPUS_EXPORT void opus_repacketizer_destroy(OpusRepacketizer *rp); | ||
| 773 | |||
| 774 | /** Add a packet to the current repacketizer state. | ||
| 775 |   * This packet must match the configuration of any packets already submitted | ||
| 776 |   * for repacketization since the last call to opus_repacketizer_init(). | ||
| 777 |   * This means that it must have the same coding mode, audio bandwidth, frame | ||
| 778 |   * size, and channel count. | ||
| 779 |   * This can be checked in advance by examining the top 6 bits of the first | ||
| 780 |   * byte of the packet, and ensuring they match the top 6 bits of the first | ||
| 781 |   * byte of any previously submitted packet. | ||
| 782 |   * The total duration of audio in the repacketizer state also must not exceed | ||
| 783 |   * 120 ms, the maximum duration of a single packet, after adding this packet. | ||
| 784 |   * | ||
| 785 |   * The contents of the current repacketizer state can be extracted into new | ||
| 786 |   * packets using opus_repacketizer_out() or opus_repacketizer_out_range(). | ||
| 787 |   * | ||
| 788 |   * In order to add a packet with a different configuration or to add more | ||
| 789 |   * audio beyond 120 ms, you must clear the repacketizer state by calling | ||
| 790 |   * opus_repacketizer_init(). | ||
| 791 |   * If a packet is too large to add to the current repacketizer state, no part | ||
| 792 |   * of it is added, even if it contains multiple frames, some of which might | ||
| 793 |   * fit. | ||
| 794 |   * If you wish to be able to add parts of such packets, you should first use | ||
| 795 |   * another repacketizer to split the packet into pieces and add them | ||
| 796 |   * individually. | ||
| 797 |   * @see opus_repacketizer_out_range | ||
| 798 |   * @see opus_repacketizer_out | ||
| 799 |   * @see opus_repacketizer_init | ||
| 800 |   * @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state to which to | ||
| 801 |   *                                       add the packet. | ||
| 802 |   * @param[in] data <tt>const unsigned char*</tt>: The packet data. | ||
| 803 |   *                                                The application must ensure | ||
| 804 |   *                                                this pointer remains valid | ||
| 805 |   *                                                until the next call to | ||
| 806 |   *                                                opus_repacketizer_init() or | ||
| 807 |   *                                                opus_repacketizer_destroy(). | ||
| 808 |   * @param len <tt>opus_int32</tt>: The number of bytes in the packet data. | ||
| 809 |   * @returns An error code indicating whether or not the operation succeeded. | ||
| 810 |   * @retval #OPUS_OK The packet's contents have been added to the repacketizer | ||
| 811 |   *                  state. | ||
| 812 |   * @retval #OPUS_INVALID_PACKET The packet did not have a valid TOC sequence, | ||
| 813 |   *                              the packet's TOC sequence was not compatible | ||
| 814 |   *                              with previously submitted packets (because | ||
| 815 |   *                              the coding mode, audio bandwidth, frame size, | ||
| 816 |   *                              or channel count did not match), or adding | ||
| 817 |   *                              this packet would increase the total amount of | ||
| 818 |   *                              audio stored in the repacketizer state to more | ||
| 819 |   *                              than 120 ms. | ||
| 820 |   */ | ||
| 821 | OPUS_EXPORT int opus_repacketizer_cat(OpusRepacketizer *rp, const unsigned char *data, opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); | ||
| 822 | |||
| 823 | |||
| 824 | /** Construct a new packet from data previously submitted to the repacketizer | ||
| 825 |   * state via opus_repacketizer_cat(). | ||
| 826 |   * @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state from which to | ||
| 827 |   *                                       construct the new packet. | ||
| 828 |   * @param begin <tt>int</tt>: The index of the first frame in the current | ||
| 829 |   *                            repacketizer state to include in the output. | ||
| 830 |   * @param end <tt>int</tt>: One past the index of the last frame in the | ||
| 831 |   *                          current repacketizer state to include in the | ||
| 832 |   *                          output. | ||
| 833 |   * @param[out] data <tt>const unsigned char*</tt>: The buffer in which to | ||
| 834 |   *                                                 store the output packet. | ||
| 835 |   * @param maxlen <tt>opus_int32</tt>: The maximum number of bytes to store in | ||
| 836 |   *                                    the output buffer. In order to guarantee | ||
| 837 |   *                                    success, this should be at least | ||
| 838 |   *                                    <code>1276</code> for a single frame, | ||
| 839 |   *                                    or for multiple frames, | ||
| 840 |   *                                    <code>1277*(end-begin)</code>. | ||
| 841 |   *                                    However, <code>1*(end-begin)</code> plus | ||
| 842 |   *                                    the size of all packet data submitted to | ||
| 843 |   *                                    the repacketizer since the last call to | ||
| 844 |   *                                    opus_repacketizer_init() or | ||
| 845 |   *                                    opus_repacketizer_create() is also | ||
| 846 |   *                                    sufficient, and possibly much smaller. | ||
| 847 |   * @returns The total size of the output packet on success, or an error code | ||
| 848 |   *          on failure. | ||
| 849 |   * @retval #OPUS_BAD_ARG <code>[begin,end)</code> was an invalid range of | ||
| 850 |   *                       frames (begin < 0, begin >= end, or end > | ||
| 851 |   *                       opus_repacketizer_get_nb_frames()). | ||
| 852 |   * @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the | ||
| 853 |   *                                complete output packet. | ||
| 854 |   */ | ||
| 855 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out_range(OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); | ||
| 856 | |||
| 857 | /** Return the total number of frames contained in packet data submitted to | ||
| 858 |   * the repacketizer state so far via opus_repacketizer_cat() since the last | ||
| 859 |   * call to opus_repacketizer_init() or opus_repacketizer_create(). | ||
| 860 |   * This defines the valid range of packets that can be extracted with | ||
| 861 |   * opus_repacketizer_out_range() or opus_repacketizer_out(). | ||
| 862 |   * @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state containing the | ||
| 863 |   *                                       frames. | ||
| 864 |   * @returns The total number of frames contained in the packet data submitted | ||
| 865 |   *          to the repacketizer state. | ||
| 866 |   */ | ||
| 867 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_nb_frames(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1); | ||
| 868 | |||
| 869 | /** Construct a new packet from data previously submitted to the repacketizer | ||
| 870 |   * state via opus_repacketizer_cat(). | ||
| 871 |   * This is a convenience routine that returns all the data submitted so far | ||
| 872 |   * in a single packet. | ||
| 873 |   * It is equivalent to calling | ||
| 874 |   * @code | ||
| 875 |   * opus_repacketizer_out_range(rp, 0, opus_repacketizer_get_nb_frames(rp), | ||
| 876 |   *                             data, maxlen) | ||
| 877 |   * @endcode | ||
| 878 |   * @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state from which to | ||
| 879 |   *                                       construct the new packet. | ||
| 880 |   * @param[out] data <tt>const unsigned char*</tt>: The buffer in which to | ||
| 881 |   *                                                 store the output packet. | ||
| 882 |   * @param maxlen <tt>opus_int32</tt>: The maximum number of bytes to store in | ||
| 883 |   *                                    the output buffer. In order to guarantee | ||
| 884 |   *                                    success, this should be at least | ||
| 885 |   *                                    <code>1277*opus_repacketizer_get_nb_frames(rp)</code>. | ||
| 886 |   *                                    However, | ||
| 887 |   *                                    <code>1*opus_repacketizer_get_nb_frames(rp)</code> | ||
| 888 |   *                                    plus the size of all packet data | ||
| 889 |   *                                    submitted to the repacketizer since the | ||
| 890 |   *                                    last call to opus_repacketizer_init() or | ||
| 891 |   *                                    opus_repacketizer_create() is also | ||
| 892 |   *                                    sufficient, and possibly much smaller. | ||
| 893 |   * @returns The total size of the output packet on success, or an error code | ||
| 894 |   *          on failure. | ||
| 895 |   * @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the | ||
| 896 |   *                                complete output packet. | ||
| 897 |   */ | ||
| 898 | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1); | ||
| 899 | |||
| 900 | /**@}*/ | ||
| 901 | |||
| 902 | #ifdef __cplusplus | ||
| 903 | } | ||
| 904 | #endif | ||
| 905 | |||
| 906 | #endif /* OPUS_H */ |