opus.h | opus.h | |||
---|---|---|---|---|
/* Copyright (c) 2010-2012 IETF Trust, Xiph.Org Foundation, Skype Limited. All rights reserved. | /* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited | |||
Written by Jean-Marc Valin and Koen Vos */ | Written by Jean-Marc Valin and Koen Vos */ | |||
/* | /* | |||
This file is extracted from RFC6716. Please see that RFC for additional | ||||
information. | ||||
Redistribution and use in source and binary forms, with or without | Redistribution and use in source and binary forms, with or without | |||
modification, are permitted provided that the following conditions | modification, are permitted provided that the following conditions | |||
are met: | are met: | |||
- Redistributions of source code must retain the above copyright | - Redistributions of source code must retain the above copyright | |||
notice, this list of conditions and the following disclaimer. | notice, this list of conditions and the following disclaimer. | |||
- Redistributions in binary form must reproduce the above copyright | - Redistributions in binary form must reproduce the above copyright | |||
notice, this list of conditions and the following disclaimer in the | notice, this list of conditions and the following disclaimer in the | |||
documentation and/or other materials provided with the distribution. | documentation and/or other materials provided with the distribution. | |||
- Neither the name of Internet Society, IETF or IETF Trust, nor the | ||||
names of specific contributors, may be used to endorse or promote | ||||
products derived from this software without specific prior written | ||||
permission. | ||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |||
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWN ER | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWN ER | |||
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |||
skipping to change at line 65 | skipping to change at line 56 | |||
* The Opus codec is designed for interactive speech and audio transmission over the Internet. | * The Opus codec is designed for interactive speech and audio transmission over the Internet. | |||
* It is designed by the IETF Codec Working Group and incorporates technolo gy from | * It is designed by the IETF Codec Working Group and incorporates technolo gy from | |||
* Skype's SILK codec and Xiph.Org's CELT codec. | * Skype's SILK codec and Xiph.Org's CELT codec. | |||
* | * | |||
* The Opus codec is designed to handle a wide range of interactive audio a pplications, | * The Opus codec is designed to handle a wide range of interactive audio a pplications, | |||
* including Voice over IP, videoconferencing, in-game chat, and even remot e live music | * including Voice over IP, videoconferencing, in-game chat, and even remot e live music | |||
* performances. It can scale from low bit-rate narrowband speech to very h igh quality | * performances. It can scale from low bit-rate narrowband speech to very h igh quality | |||
* stereo music. Its main features are: | * stereo music. Its main features are: | |||
* @li Sampling rates from 8 to 48 kHz | * @li Sampling rates from 8 to 48 kHz | |||
* @li Bit-rates from 6 kb/s 510 kb/s | * @li Bit-rates from 6 kb/s to 510 kb/s | |||
* @li Support for both constant bit-rate (CBR) and variable bit-rate (VBR) | * @li Support for both constant bit-rate (CBR) and variable bit-rate (VBR) | |||
* @li Audio bandwidth from narrowband to full-band | * @li Audio bandwidth from narrowband to full-band | |||
* @li Support for speech and music | * @li Support for speech and music | |||
* @li Support for mono and stereo | * @li Support for mono and stereo | |||
* @li Support for multichannel (up to 255 channels) | ||||
* @li Frame sizes from 2.5 ms to 60 ms | * @li Frame sizes from 2.5 ms to 60 ms | |||
* @li Good loss robustness and packet loss concealment (PLC) | * @li Good loss robustness and packet loss concealment (PLC) | |||
* @li Floating point and fixed-point implementation | * @li Floating point and fixed-point implementation | |||
* | * | |||
* Documentation sections: | * Documentation sections: | |||
* @li @ref opusencoder | * @li @ref opus_encoder | |||
* @li @ref opusdecoder | * @li @ref opus_decoder | |||
* @li @ref repacketizer | * @li @ref opus_repacketizer | |||
* @li @ref libinfo | * @li @ref opus_libinfo | |||
* @li @ref opus_custom | ||||
*/ | */ | |||
/** @defgroup opusencoder Opus Encoder | /** @defgroup opus_encoder Opus Encoder | |||
* @{ | * @{ | |||
* | * | |||
* @brief This page describes the process and functions used to encode Opu | ||||
s. | ||||
* | ||||
* Since Opus is a stateful codec, the encoding process starts with creati ng an encoder | * Since Opus is a stateful codec, the encoding process starts with creati ng an encoder | |||
* state. This can be done with: | * state. This can be done with: | |||
* | * | |||
* @code | * @code | |||
* int error; | * int error; | |||
* OpusEncoder *enc; | * OpusEncoder *enc; | |||
* enc = opus_encoder_create(Fs, channels, application, &error); | * enc = opus_encoder_create(Fs, channels, application, &error); | |||
* @endcode | * @endcode | |||
* | * | |||
* From this point, @c enc can be used for encoding an audio stream. An en coder state | * From this point, @c enc can be used for encoding an audio stream. An en coder state | |||
skipping to change at line 131 | skipping to change at line 126 | |||
* opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity)); | * opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity)); | |||
* opus_encoder_ctl(enc, OPUS_SET_SIGNAL(signal_type)); | * opus_encoder_ctl(enc, OPUS_SET_SIGNAL(signal_type)); | |||
* @endcode | * @endcode | |||
* | * | |||
* where | * where | |||
* | * | |||
* @arg bitrate is in bits per second (b/s) | * @arg bitrate is in bits per second (b/s) | |||
* @arg complexity is a value from 1 to 10, where 1 is the lowest complexi ty and 10 is the highest | * @arg complexity is a value from 1 to 10, where 1 is the lowest complexi ty and 10 is the highest | |||
* @arg signal_type is either OPUS_AUTO (default), OPUS_SIGNAL_VOICE, or O PUS_SIGNAL_MUSIC | * @arg signal_type is either OPUS_AUTO (default), OPUS_SIGNAL_VOICE, or O PUS_SIGNAL_MUSIC | |||
* | * | |||
* See @ref encoderctls and @ref genericctls for a complete list of parame ters that can be set or queried. Most parameters can be set or changed at a ny time during a stream. | * 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 ch anged at any time during a stream. | |||
* | * | |||
* 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: | * 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: | |||
* @code | * @code | |||
* len = opus_encode(enc, audio_frame, frame_size, packet, max_packet); | * len = opus_encode(enc, audio_frame, frame_size, packet, max_packet); | |||
* @endcode | * @endcode | |||
* | * | |||
* where | * where | |||
* <ul> | * <ul> | |||
* <li>audio_frame is the audio data in opus_int16 (or float for opus_enco de_float())</li> | * <li>audio_frame is the audio data in opus_int16 (or float for opus_enco de_float())</li> | |||
* <li>frame_size is the duration of the frame in samples (per channel)</l i> | * <li>frame_size is the duration of the frame in samples (per channel)</l i> | |||
* <li>packet is the byte array to which the compressed data is written</l i> | * <li>packet is the byte array to which the compressed data is written</l i> | |||
* <li>max_packet is the maximum number of bytes that can be written in th e packet (1276 bytes is recommended)</li> | * <li>max_packet is the maximum number of bytes that can be written in th e packet (4000 bytes is recommended)</li> | |||
* </ul> | * </ul> | |||
* | * | |||
* opus_encode() and opus_encode_frame() return the number of bytes actual ly written to the packet. | * opus_encode() and opus_encode_frame() return the number of bytes actual ly written to the packet. | |||
* The return value <b>can be negative</b>, which indicates that an error has occurred. If the return value | * The return value <b>can be negative</b>, which indicates that an error has occurred. If the return value | |||
* is 1 byte, then the packet does not need to be transmitted (DTX). | * is 1 byte, then the packet does not need to be transmitted (DTX). | |||
* | * | |||
* Once the encoder state if no longer needed, it can be destroyed with | * Once the encoder state if no longer needed, it can be destroyed with | |||
* | * | |||
* @code | * @code | |||
* opus_encoder_destroy(enc); | * opus_encoder_destroy(enc); | |||
skipping to change at line 169 | skipping to change at line 164 | |||
* | * | |||
*/ | */ | |||
/** Opus encoder state. | /** Opus encoder state. | |||
* This contains the complete state of an Opus encoder. | * This contains the complete state of an Opus encoder. | |||
* It is position independent and can be freely copied. | * It is position independent and can be freely copied. | |||
* @see opus_encoder_create,opus_encoder_init | * @see opus_encoder_create,opus_encoder_init | |||
*/ | */ | |||
typedef struct OpusEncoder OpusEncoder; | typedef struct OpusEncoder OpusEncoder; | |||
OPUS_EXPORT int opus_encoder_get_size(int channels); | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_encoder_get_size(int channels) ; | |||
/** | /** | |||
*/ | */ | |||
/** Allocates and initializes an encoder state. | /** Allocates and initializes an encoder state. | |||
* There are three coding modes: | * There are three coding modes: | |||
* | * | |||
* @ref OPUS_APPLICATION_VOIP gives best quality at a given bitrate for voi ce | * @ref OPUS_APPLICATION_VOIP gives best quality at a given bitrate for voi ce | |||
* signals. It enhances the input signal by high-pass filtering and | * signals. It enhances the input signal by high-pass filtering and | |||
* emphasizing formants and harmonics. Optionally it includes in-band | * emphasizing formants and harmonics. Optionally it includes in-band | |||
skipping to change at line 191 | skipping to change at line 186 | |||
* mode for typical VoIP applications. Because of the enhancement, | * mode for typical VoIP applications. Because of the enhancement, | |||
* even at high bitrates the output may sound different from the input. | * even at high bitrates the output may sound different from the input. | |||
* | * | |||
* @ref OPUS_APPLICATION_AUDIO gives best quality at a given bitrate for mo st | * @ref OPUS_APPLICATION_AUDIO gives best quality at a given bitrate for mo st | |||
* non-voice signals like music. Use this mode for music and mixed | * non-voice signals like music. Use this mode for music and mixed | |||
* (music/voice) content, broadcast, and applications requiring less | * (music/voice) content, broadcast, and applications requiring less | |||
* than 15 ms of coding delay. | * than 15 ms of coding delay. | |||
* | * | |||
* @ref OPUS_APPLICATION_RESTRICTED_LOWDELAY configures low-delay mode that | * @ref OPUS_APPLICATION_RESTRICTED_LOWDELAY configures low-delay mode that | |||
* disables the speech-optimized mode in exchange for slightly reduced d elay. | * disables the speech-optimized mode in exchange for slightly reduced d elay. | |||
* This mode can only be set on an newly initialized or freshly reset en | ||||
coder | ||||
* because it changes the codec delay. | ||||
* | * | |||
* This is useful when the caller knows that the speech-optimized modes wil l not be needed (use with caution). | * This is useful when the caller knows that the speech-optimized modes wil l not be needed (use with caution). | |||
* @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz) | * @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz) | |||
* @param [in] channels <tt>int</tt>: Number of channels (1/2) in input sig nal | * @param [in] channels <tt>int</tt>: Number of channels (1/2) in input sig nal | |||
* @param [in] application <tt>int</tt>: Coding mode (@ref OPUS_APPLICATION _VOIP/@ref OPUS_APPLICATION_AUDIO/@ref OPUS_APPLICATION_RESTRICTED_LOWDELAY ) | * @param [in] application <tt>int</tt>: Coding mode (@ref OPUS_APPLICATION _VOIP/@ref OPUS_APPLICATION_AUDIO/@ref OPUS_APPLICATION_RESTRICTED_LOWDELAY ) | |||
* @param [out] error <tt>int*</tt>: @ref errorcodes | * @param [out] error <tt>int*</tt>: @ref opus_errorcodes | |||
* @note Regardless of the sampling rate and number channels selected, the Opus encoder | * @note Regardless of the sampling rate and number channels selected, the Opus encoder | |||
* can switch to a lower audio audio bandwidth or number of channels if the bitrate | * can switch to a lower audio audio bandwidth or number of channels if the bitrate | |||
* selected is too low. This also means that it is safe to always use 48 kH z stereo input | * selected is too low. This also means that it is safe to always use 48 kH z stereo input | |||
* and let the encoder optimize the encoding. | * and let the encoder optimize the encoding. | |||
*/ | */ | |||
OPUS_EXPORT OpusEncoder *opus_encoder_create( | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusEncoder *opus_encoder_create( | |||
opus_int32 Fs, | opus_int32 Fs, | |||
int channels, | int channels, | |||
int application, | int application, | |||
int *error | int *error | |||
); | ); | |||
/** Initializes a previously allocated encoder state | /** Initializes a previously allocated encoder state | |||
* The memory pointed to by st must be the size returned by opus_encoder_g et_size. | * The memory pointed to by st must be the size returned by opus_encoder_g et_size. | |||
* This is intended for applications which use their own allocator instead of malloc. | * This is intended for applications which use their own allocator instead of malloc. | |||
* @see opus_encoder_create(),opus_encoder_get_size() | * @see opus_encoder_create(),opus_encoder_get_size() | |||
* To reset a previously initialized state use the OPUS_RESET_STATE CTL. | * To reset a previously initialized state use the OPUS_RESET_STATE CTL. | |||
* @param [in] st <tt>OpusEncoder*</tt>: Encoder state | * @param [in] st <tt>OpusEncoder*</tt>: Encoder state | |||
* @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz) | * @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz) | |||
* @param [in] channels <tt>int</tt>: Number of channels (1/2) in input si gnal | * @param [in] channels <tt>int</tt>: Number of channels (1/2) in input si gnal | |||
* @param [in] application <tt>int</tt>: Coding mode (OPUS_APPLICATION_VOI P/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRICTED_LOWDELAY) | * @param [in] application <tt>int</tt>: Coding mode (OPUS_APPLICATION_VOI P/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRICTED_LOWDELAY) | |||
* @retval OPUS_OK Success or @ref errorcodes | * @retval OPUS_OK Success or @ref opus_errorcodes | |||
*/ | */ | |||
OPUS_EXPORT int opus_encoder_init( | OPUS_EXPORT int opus_encoder_init( | |||
OpusEncoder *st, | OpusEncoder *st, | |||
opus_int32 Fs, | opus_int32 Fs, | |||
int channels, | int channels, | |||
int application | int application | |||
); | ) OPUS_ARG_NONNULL(1); | |||
/** Encodes an Opus frame. | /** Encodes an Opus frame. | |||
* The passed frame_size must an opus frame size for the encoder's samplin g rate. | * The passed frame_size must an opus frame size for the encoder's samplin g rate. | |||
* For example, at 48kHz the permitted values are 120, 240, 480, or 960. | * For example, at 48kHz the permitted values are 120, 240, 480, 960, 1920 , and 2880. | |||
* Passing in a duration of less than 10ms (480 samples at 48kHz) will | * Passing in a duration of less than 10ms (480 samples at 48kHz) will | |||
* prevent the encoder from using the LPC or hybrid modes. | * prevent the encoder from using the LPC or hybrid modes. | |||
* @param [in] st <tt>OpusEncoder*</tt>: Encoder state | * @param [in] st <tt>OpusEncoder*</tt>: Encoder state | |||
* @param [in] pcm <tt>opus_int16*</tt>: Input signal (interleaved if 2 ch annels). length is frame_size*channels*sizeof(opus_int16) | * @param [in] pcm <tt>opus_int16*</tt>: Input signal (interleaved if 2 ch annels). length is frame_size*channels*sizeof(opus_int16) | |||
* @param [in] frame_size <tt>int</tt>: Number of samples per frame of inp ut signal | * @param [in] frame_size <tt>int</tt>: Number of samples per frame of inp ut signal | |||
* @param [out] data <tt>char*</tt>: Output payload (at least max_data_byt es long) | * @param [out] data <tt>char*</tt>: Output payload (at least max_data_byt es long) | |||
* @param [in] max_data_bytes <tt>int</tt>: Allocated memory for payload; | * @param [in] max_data_bytes <tt>opus_int32</tt>: Allocated memory for pa | |||
don't use for controlling bitrate | yload; don't use for controlling bitrate | |||
* @returns length of the data payload (in bytes) or @ref errorcodes | * @returns length of the data payload (in bytes) or @ref opus_errorcodes | |||
*/ | */ | |||
OPUS_EXPORT int opus_encode( | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode( | |||
OpusEncoder *st, | OpusEncoder *st, | |||
const opus_int16 *pcm, | const opus_int16 *pcm, | |||
int frame_size, | int frame_size, | |||
unsigned char *data, | unsigned char *data, | |||
int max_data_bytes | opus_int32 max_data_bytes | |||
); | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); | |||
/** Encodes an Opus frame from floating point input. | /** Encodes an Opus frame from floating point input. | |||
* The passed frame_size must an opus frame size for the encoder's samplin g rate. | * The passed frame_size must an opus frame size for the encoder's samplin g rate. | |||
* For example, at 48kHz the permitted values are 120, 240, 480, or 960. | * For example, at 48kHz the permitted values are 120, 240, 480, 960, 1920 , and 2880. | |||
* Passing in a duration of less than 10ms (480 samples at 48kHz) will | * Passing in a duration of less than 10ms (480 samples at 48kHz) will | |||
* prevent the encoder from using the LPC or hybrid modes. | * prevent the encoder from using the LPC or hybrid modes. | |||
* @param [in] st <tt>OpusEncoder*</tt>: Encoder state | * @param [in] st <tt>OpusEncoder*</tt>: Encoder state | |||
* @param [in] pcm <tt>float*</tt>: Input signal (interleaved if 2 channel | * @param [in] pcm <tt>float*</tt>: Input in float format (interleaved if | |||
s). length is frame_size*channels*sizeof(float) | 2 channels), with a normal range of +/-1.0. | |||
* Samples with a range beyond +/-1.0 are supported but will | ||||
* be clipped by decoders using the integer API and should | ||||
* only be used if it is known that the far end supports | ||||
* extended dynamic range. | ||||
* length is frame_size*channels*sizeof(float) | ||||
* @param [in] frame_size <tt>int</tt>: Number of samples per frame of inp ut signal | * @param [in] frame_size <tt>int</tt>: Number of samples per frame of inp ut signal | |||
* @param [out] data <tt>char*</tt>: Output payload (at least max_data_byt es long) | * @param [out] data <tt>char*</tt>: Output payload (at least max_data_byt es long) | |||
* @param [in] max_data_bytes <tt>int</tt>: Allocated memory for payload; | * @param [in] max_data_bytes <tt>opus_int32</tt>: Allocated memory for pa | |||
don't use for controlling bitrate | yload; don't use for controlling bitrate | |||
* @returns length of the data payload (in bytes) or @ref errorcodes | * @returns length of the data payload (in bytes) or @ref opus_errorcodes | |||
*/ | */ | |||
OPUS_EXPORT int opus_encode_float( | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode_float( | |||
OpusEncoder *st, | OpusEncoder *st, | |||
const float *pcm, | const float *pcm, | |||
int frame_size, | int frame_size, | |||
unsigned char *data, | unsigned char *data, | |||
int max_data_bytes | opus_int32 max_data_bytes | |||
); | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); | |||
/** Frees an OpusEncoder allocated by opus_encoder_create. | /** Frees an OpusEncoder allocated by opus_encoder_create. | |||
* @param[in] st <tt>OpusEncoder*</tt>: State to be freed. | * @param[in] st <tt>OpusEncoder*</tt>: State to be freed. | |||
*/ | */ | |||
OPUS_EXPORT void opus_encoder_destroy(OpusEncoder *st); | OPUS_EXPORT void opus_encoder_destroy(OpusEncoder *st); | |||
/** Perform a CTL function on an Opus encoder. | /** Perform a CTL function on an Opus encoder. | |||
* | * | |||
* Generally the request and subsequent arguments are generated | * Generally the request and subsequent arguments are generated | |||
* by a convenience macro. | * by a convenience macro. | |||
* @see encoderctls | * @see opus_encoderctls | |||
*/ | */ | |||
OPUS_EXPORT int opus_encoder_ctl(OpusEncoder *st, int request, ...); | OPUS_EXPORT int opus_encoder_ctl(OpusEncoder *st, int request, ...) OPUS_AR G_NONNULL(1); | |||
/**@}*/ | /**@}*/ | |||
/** @defgroup opusdecoder Opus Decoder | /** @defgroup opus_decoder Opus Decoder | |||
* @{ | * @{ | |||
* | * | |||
* @brief This page describes the process and functions used to decode Opu s. | ||||
* | * | |||
* The decoding process also starts with creating a decoder | * The decoding process also starts with creating a decoder | |||
* state. This can be done with: | * state. This can be done with: | |||
* @code | * @code | |||
* int error; | * int error; | |||
* OpusDecoder *dec; | * OpusDecoder *dec; | |||
* dec = opus_decoder_create(Fs, channels, &error); | * dec = opus_decoder_create(Fs, channels, &error); | |||
* @endcode | * @endcode | |||
* where | * where | |||
* @li Fs is the sampling rate and must be 8000, 12000, 16000, 24000, or 4 8000 | * @li Fs is the sampling rate and must be 8000, 12000, 16000, 24000, or 4 8000 | |||
skipping to change at line 316 | skipping to change at line 319 | |||
* error = opus_decoder_init(dec, Fs, channels); | * error = opus_decoder_init(dec, Fs, channels); | |||
* @endcode | * @endcode | |||
* where opus_decoder_get_size() returns the required size for the decoder state. Note that | * where opus_decoder_get_size() returns the required size for the decoder state. Note that | |||
* future versions of this code may change the size, so no assuptions shou ld be made about it. | * future versions of this code may change the size, so no assuptions shou ld be made about it. | |||
* | * | |||
* The decoder state is always continuous in memory and only a shallow cop y is sufficient | * The decoder state is always continuous in memory and only a shallow cop y is sufficient | |||
* to copy it (e.g. memcpy()) | * to copy it (e.g. memcpy()) | |||
* | * | |||
* To decode a frame, opus_decode() or opus_decode_float() must be called with a packet of compressed audio data: | * To decode a frame, opus_decode() or opus_decode_float() must be called with a packet of compressed audio data: | |||
* @code | * @code | |||
* frame_size = opus_decode(enc, packet, len, decoded, max_size); | * frame_size = opus_decode(dec, packet, len, decoded, max_size, 0); | |||
* @endcode | * @endcode | |||
* where | * where | |||
* | * | |||
* @li packet is the byte array containing the compressed data | * @li packet is the byte array containing the compressed data | |||
* @li len is the exact number of bytes contained in the packet | * @li len is the exact number of bytes contained in the packet | |||
* @li decoded is the decoded audio data in opus_int16 (or float for opus_ decode_float()) | * @li decoded is the decoded audio data in opus_int16 (or float for opus_ decode_float()) | |||
* @li max_size is the max duration of the frame in samples (per channel) that can fit into the decoded_frame array | * @li max_size is the max duration of the frame in samples (per channel) that can fit into the decoded_frame array | |||
* | * | |||
* opus_decode() and opus_decode_frame() return the number of samples ()pe r channel) decoded from the packet. | * opus_decode() and opus_decode_float() return the number of samples (per channel) decoded from the packet. | |||
* If that value is negative, then an error has occured. This can occur if the packet is corrupted or if the audio | * If that value is negative, then an error has occured. This can occur if the packet is corrupted or if the audio | |||
* buffer is too small to hold the decoded audio. | * buffer is too small to hold the decoded audio. | |||
* | ||||
*/ | * Opus is a stateful codec with overlapping blocks and as a result Opus | |||
* packets are not coded independently of each other. Packets must be | ||||
* passed into the decoder serially and in the correct order for a correct | ||||
* decode. Lost packets can be replaced with loss concealment by calling | ||||
* the decoder with a null pointer and zero length for the missing packet. | ||||
* | ||||
* A single codec state may only be accessed from a single thread at | ||||
* a time and any required locking must be performed by the caller. Separa | ||||
te | ||||
* streams must be decoded with separate decoder states and can be decoded | ||||
* in parallel unless the library was compiled with NONTHREADSAFE_PSEUDOST | ||||
ACK | ||||
* defined. | ||||
* | ||||
*/ | ||||
/** Opus decoder state. | /** Opus decoder state. | |||
* This contains the complete state of an Opus decoder. | * This contains the complete state of an Opus decoder. | |||
* It is position independent and can be freely copied. | * It is position independent and can be freely copied. | |||
* @see opus_decoder_create,opus_decoder_init | * @see opus_decoder_create,opus_decoder_init | |||
*/ | */ | |||
typedef struct OpusDecoder OpusDecoder; | typedef struct OpusDecoder OpusDecoder; | |||
/** Gets the size of an OpusDecoder structure. | /** Gets the size of an OpusDecoder structure. | |||
* @param [in] channels <tt>int</tt>: Number of channels | * @param [in] channels <tt>int</tt>: Number of channels | |||
* @returns size | * @returns size | |||
*/ | */ | |||
OPUS_EXPORT int opus_decoder_get_size(int channels); | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_size(int channels) ; | |||
/** Allocates and initializes a decoder state. | /** Allocates and initializes a decoder state. | |||
* @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz) | * @param [in] Fs <tt>opus_int32</tt>: Sample rate to decode at (Hz) | |||
* @param [in] channels <tt>int</tt>: Number of channels (1/2) in input si | * @param [in] channels <tt>int</tt>: Number of channels (1/2) to decode | |||
gnal | * @param [out] error <tt>int*</tt>: OPUS_OK Success or @ref opus_errorcod | |||
* @param [out] error <tt>int*</tt>: OPUS_OK Success or @ref errorcodes | es | |||
* | ||||
* Internally Opus stores data at 48000 Hz, so that should be the default | ||||
* value for Fs. However, the decoder can efficiently decode to buffers | ||||
* at 8, 12, 16, and 24 kHz so if for some reason the caller cannot use | ||||
* data at the full sample rate, or knows the compressed data doesn't | ||||
* use the full frequency range, it can request decoding at a reduced | ||||
* rate. Likewise, the decoder is capable of filling in either mono or | ||||
* interleaved stereo pcm buffers, at the caller's request. | ||||
*/ | */ | |||
OPUS_EXPORT OpusDecoder *opus_decoder_create( | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusDecoder *opus_decoder_create( | |||
opus_int32 Fs, | opus_int32 Fs, | |||
int channels, | int channels, | |||
int *error | int *error | |||
); | ); | |||
/** Initializes a previously allocated decoder state. | /** Initializes a previously allocated decoder state. | |||
* The state must be the size returned by opus_decoder_get_size. | * The state must be the size returned by opus_decoder_get_size. | |||
* This is intended for applications which use their own allocator instead of malloc. @see opus_decoder_create,opus_decoder_get_size | * This is intended for applications which use their own allocator instead of malloc. @see opus_decoder_create,opus_decoder_get_size | |||
* To reset a previously initialized state use the OPUS_RESET_STATE CTL. | * To reset a previously initialized state use the OPUS_RESET_STATE CTL. | |||
* @param [in] st <tt>OpusDecoder*</tt>: Decoder state. | * @param [in] st <tt>OpusDecoder*</tt>: Decoder state. | |||
* @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz) | * @param [in] Fs <tt>opus_int32</tt>: Sampling rate to decode to (Hz) | |||
* @param [in] channels <tt>int</tt>: Number of channels (1/2) in input si | * @param [in] channels <tt>int</tt>: Number of channels (1/2) to decode | |||
gnal | * @retval OPUS_OK Success or @ref opus_errorcodes | |||
* @retval OPUS_OK Success or @ref errorcodes | ||||
*/ | */ | |||
OPUS_EXPORT int opus_decoder_init( | OPUS_EXPORT int opus_decoder_init( | |||
OpusDecoder *st, | OpusDecoder *st, | |||
opus_int32 Fs, | opus_int32 Fs, | |||
int channels | int channels | |||
); | ) OPUS_ARG_NONNULL(1); | |||
/** Decode an Opus frame | /** Decode an Opus frame | |||
* @param [in] st <tt>OpusDecoder*</tt>: Decoder state | * @param [in] st <tt>OpusDecoder*</tt>: Decoder state | |||
* @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to i ndicate packet loss | * @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to i ndicate packet loss | |||
* @param [in] len <tt>int</tt>: Number of bytes in payload* | * @param [in] len <tt>opus_int32</tt>: Number of bytes in payload* | |||
* @param [out] pcm <tt>opus_int16*</tt>: Output signal (interleaved if 2 channels). length | * @param [out] pcm <tt>opus_int16*</tt>: Output signal (interleaved if 2 channels). length | |||
* is frame_size*channels*sizeof(opus_int16) | * is frame_size*channels*sizeof(opus_int16) | |||
* @param [in] frame_size Number of samples per channel of available space in *pcm, | * @param [in] frame_size Number of samples per channel of available space in *pcm, | |||
* if less than the maximum frame size (120ms) some frames can not be dec oded | * if less than the maximum frame size (120ms) some frames can not be dec oded | |||
* @param [in] decode_fec <tt>int</tt>: Flag (0/1) to request that any in- band forward error correction data be | * @param [in] decode_fec <tt>int</tt>: Flag (0/1) to request that any in- band forward error correction data be | |||
* decoded. If no such data is available the frame is decoded as if it we re lost. | * decoded. If no such data is available the frame is decoded as if it we re lost. | |||
* @returns Number of decoded samples or @ref errorcodes | * @returns Number of decoded samples or @ref opus_errorcodes | |||
*/ | */ | |||
OPUS_EXPORT int opus_decode( | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode( | |||
OpusDecoder *st, | OpusDecoder *st, | |||
const unsigned char *data, | const unsigned char *data, | |||
int len, | opus_int32 len, | |||
opus_int16 *pcm, | opus_int16 *pcm, | |||
int frame_size, | int frame_size, | |||
int decode_fec | int decode_fec | |||
); | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); | |||
/** Decode an opus frame with floating point output | /** Decode an opus frame with floating point output | |||
* @param [in] st <tt>OpusDecoder*</tt>: Decoder state | * @param [in] st <tt>OpusDecoder*</tt>: Decoder state | |||
* @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to i ndicate packet loss | * @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to i ndicate packet loss | |||
* @param [in] len <tt>int</tt>: Number of bytes in payload | * @param [in] len <tt>opus_int32</tt>: Number of bytes in payload | |||
* @param [out] pcm <tt>float*</tt>: Output signal (interleaved if 2 chann els). length | * @param [out] pcm <tt>float*</tt>: Output signal (interleaved if 2 chann els). length | |||
* is frame_size*channels*sizeof(float) | * is frame_size*channels*sizeof(float) | |||
* @param [in] frame_size Number of samples per channel of available space in *pcm, | * @param [in] frame_size Number of samples per channel of available space in *pcm, | |||
* if less than the maximum frame size (120ms) some frames can not be dec oded | * if less than the maximum frame size (120ms) some frames can not be dec oded | |||
* @param [in] decode_fec <tt>int</tt>: Flag (0/1) to request that any in- band forward error correction data be | * @param [in] decode_fec <tt>int</tt>: Flag (0/1) to request that any in- band forward error correction data be | |||
* decoded. If no such data is available the frame is decoded as if it we re lost. | * decoded. If no such data is available the frame is decoded as if it we re lost. | |||
* @returns Number of decoded samples or @ref errorcodes | * @returns Number of decoded samples or @ref opus_errorcodes | |||
*/ | */ | |||
OPUS_EXPORT int opus_decode_float( | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode_float( | |||
OpusDecoder *st, | OpusDecoder *st, | |||
const unsigned char *data, | const unsigned char *data, | |||
int len, | opus_int32 len, | |||
float *pcm, | float *pcm, | |||
int frame_size, | int frame_size, | |||
int decode_fec | int decode_fec | |||
); | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); | |||
/** Perform a CTL function on an Opus decoder. | /** Perform a CTL function on an Opus decoder. | |||
* | * | |||
* Generally the request and subsequent arguments are generated | * Generally the request and subsequent arguments are generated | |||
* by a convenience macro. | * by a convenience macro. | |||
* @see genericctls | * @see opus_genericctls | |||
*/ | */ | |||
OPUS_EXPORT int opus_decoder_ctl(OpusDecoder *st, int request, ...); | OPUS_EXPORT int opus_decoder_ctl(OpusDecoder *st, int request, ...) OPUS_AR G_NONNULL(1); | |||
/** Frees an OpusDecoder allocated by opus_decoder_create. | /** Frees an OpusDecoder allocated by opus_decoder_create. | |||
* @param[in] st <tt>OpusDecoder*</tt>: State to be freed. | * @param[in] st <tt>OpusDecoder*</tt>: State to be freed. | |||
*/ | */ | |||
OPUS_EXPORT void opus_decoder_destroy(OpusDecoder *st); | OPUS_EXPORT void opus_decoder_destroy(OpusDecoder *st); | |||
/** Parse an opus packet into one or more frames. | /** Parse an opus packet into one or more frames. | |||
* Opus_decode will perform this operation internally so most applications do | * Opus_decode will perform this operation internally so most applications do | |||
* not need to use this function. | * not need to use this function. | |||
* This function does not copy the frames, the returned pointers are point ers into | * This function does not copy the frames, the returned pointers are point ers into | |||
* the input packet. | * the input packet. | |||
* @param [in] data <tt>char*</tt>: Opus packet to be parsed | * @param [in] data <tt>char*</tt>: Opus packet to be parsed | |||
* @param [in] len <tt>int</tt>: size of data | * @param [in] len <tt>opus_int32</tt>: size of data | |||
* @param [out] out_toc <tt>char*</tt>: TOC pointer | * @param [out] out_toc <tt>char*</tt>: TOC pointer | |||
* @param [out] frames <tt>char*[48]</tt> encapsulated frames | * @param [out] frames <tt>char*[48]</tt> encapsulated frames | |||
* @param [out] size <tt>short[48]</tt> sizes of the encapsulated frames | * @param [out] size <tt>short[48]</tt> sizes of the encapsulated frames | |||
* @param [out] payload_offset <tt>int*</tt>: returns the position of the payload within the packet (in bytes) | * @param [out] payload_offset <tt>int*</tt>: returns the position of the payload within the packet (in bytes) | |||
* @returns number of frames | * @returns number of frames | |||
*/ | */ | |||
OPUS_EXPORT int opus_packet_parse( | OPUS_EXPORT int opus_packet_parse( | |||
const unsigned char *data, | const unsigned char *data, | |||
int len, | opus_int32 len, | |||
unsigned char *out_toc, | unsigned char *out_toc, | |||
const unsigned char *frames[48], | const unsigned char *frames[48], | |||
short size[48], | short size[48], | |||
int *payload_offset | int *payload_offset | |||
); | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); | |||
/** Gets the bandwidth of an Opus packet. | /** Gets the bandwidth of an Opus packet. | |||
* @param [in] data <tt>char*</tt>: Opus packet | * @param [in] data <tt>char*</tt>: Opus packet | |||
* @retval OPUS_BANDWIDTH_NARROWBAND Narrowband (4kHz bandpass) | * @retval OPUS_BANDWIDTH_NARROWBAND Narrowband (4kHz bandpass) | |||
* @retval OPUS_BANDWIDTH_MEDIUMBAND Mediumband (6kHz bandpass) | * @retval OPUS_BANDWIDTH_MEDIUMBAND Mediumband (6kHz bandpass) | |||
* @retval OPUS_BANDWIDTH_WIDEBAND Wideband (8kHz bandpass) | * @retval OPUS_BANDWIDTH_WIDEBAND Wideband (8kHz bandpass) | |||
* @retval OPUS_BANDWIDTH_SUPERWIDEBAND Superwideband (12kHz bandpass) | * @retval OPUS_BANDWIDTH_SUPERWIDEBAND Superwideband (12kHz bandpass) | |||
* @retval OPUS_BANDWIDTH_FULLBAND Fullband (20kHz bandpass) | * @retval OPUS_BANDWIDTH_FULLBAND Fullband (20kHz bandpass) | |||
* @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type | * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type | |||
*/ | */ | |||
OPUS_EXPORT int opus_packet_get_bandwidth(const unsigned char *data); | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_bandwidth(const uns igned char *data) OPUS_ARG_NONNULL(1); | |||
/** Gets the number of samples per frame from an Opus packet. | /** Gets the number of samples per frame from an Opus packet. | |||
* @param [in] data <tt>char*</tt>: Opus packet | * @param [in] data <tt>char*</tt>: Opus packet | |||
* @param [in] Fs <tt>opus_int32</tt>: Sampling rate in Hz | * @param [in] Fs <tt>opus_int32</tt>: Sampling rate in Hz | |||
* @returns Number of samples per frame | * @returns Number of samples per frame | |||
* @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type | * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type | |||
*/ | */ | |||
OPUS_EXPORT int opus_packet_get_samples_per_frame(const unsigned char *data , opus_int32 Fs); | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_samples_per_frame(c onst unsigned char *data, opus_int32 Fs) OPUS_ARG_NONNULL(1); | |||
/** Gets the number of channels from an Opus packet. | /** Gets the number of channels from an Opus packet. | |||
* @param [in] data <tt>char*</tt>: Opus packet | * @param [in] data <tt>char*</tt>: Opus packet | |||
* @returns Number of channels | * @returns Number of channels | |||
* @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type | * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type | |||
*/ | */ | |||
OPUS_EXPORT int opus_packet_get_nb_channels(const unsigned char *data); | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_channels(const u nsigned char *data) OPUS_ARG_NONNULL(1); | |||
/** Gets the number of frames in an Opus packet. | /** Gets the number of frames in an Opus packet. | |||
* @param [in] packet <tt>char*</tt>: Opus packet | * @param [in] packet <tt>char*</tt>: Opus packet | |||
* @param [in] len <tt>int</tt>: Length of packet | * @param [in] len <tt>opus_int32</tt>: Length of packet | |||
* @returns Number of frames | * @returns Number of frames | |||
* @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type | * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type | |||
*/ | */ | |||
OPUS_EXPORT int opus_packet_get_nb_frames(const unsigned char packet[], int len); | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_frames(const uns igned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1); | |||
/** Gets the number of samples of an Opus packet. | /** Gets the number of samples of an Opus packet. | |||
* @param [in] dec <tt>OpusDecoder*</tt>: Decoder state | * @param [in] dec <tt>OpusDecoder*</tt>: Decoder state | |||
* @param [in] packet <tt>char*</tt>: Opus packet | * @param [in] packet <tt>char*</tt>: Opus packet | |||
* @param [in] len <tt>int</tt>: Length of packet | * @param [in] len <tt>opus_int32</tt>: Length of packet | |||
* @returns Number of samples | * @returns Number of samples | |||
* @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type | * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type | |||
*/ | */ | |||
OPUS_EXPORT int opus_decoder_get_nb_samples(const OpusDecoder *dec, const u nsigned char packet[], int len); | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_nb_samples(const O pusDecoder *dec, const unsigned char packet[], opus_int32 len) OPUS_ARG_NON NULL(1) OPUS_ARG_NONNULL(2); | |||
/**@}*/ | /**@}*/ | |||
/** @defgroup repacketizer Repacketizer | /** @defgroup opus_repacketizer Repacketizer | |||
* @{ | * @{ | |||
* | * | |||
* The repacketizer can be used to merge multiple Opus packets into a sing le packet | * The repacketizer can be used to merge multiple Opus packets into a sing le packet | |||
* or alternatively to split Opus packets that have previously been merged . | * or alternatively to split Opus packets that have previously been merged . | |||
* | * | |||
*/ | */ | |||
typedef struct OpusRepacketizer OpusRepacketizer; | typedef struct OpusRepacketizer OpusRepacketizer; | |||
OPUS_EXPORT int opus_repacketizer_get_size(void); | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_size(void); | |||
OPUS_EXPORT OpusRepacketizer *opus_repacketizer_init(OpusRepacketizer *rp); | OPUS_EXPORT OpusRepacketizer *opus_repacketizer_init(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1); | |||
OPUS_EXPORT OpusRepacketizer *opus_repacketizer_create(void); | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusRepacketizer *opus_repacketizer_cre ate(void); | |||
OPUS_EXPORT void opus_repacketizer_destroy(OpusRepacketizer *rp); | OPUS_EXPORT void opus_repacketizer_destroy(OpusRepacketizer *rp); | |||
OPUS_EXPORT int opus_repacketizer_cat(OpusRepacketizer *rp, const unsigned char *data, int len); | OPUS_EXPORT int opus_repacketizer_cat(OpusRepacketizer *rp, const unsigned char *data, opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); | |||
OPUS_EXPORT opus_int32 opus_repacketizer_out_range(OpusRepacketizer *rp, in t begin, int end, unsigned char *data, int maxlen); | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out_range( OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 m axlen) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); | |||
OPUS_EXPORT int opus_repacketizer_get_nb_frames(OpusRepacketizer *rp); | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_nb_frames(Opu sRepacketizer *rp) OPUS_ARG_NONNULL(1); | |||
OPUS_EXPORT opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, int maxlen); | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out(OpusRe packetizer *rp, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1) ; | |||
/**@}*/ | /**@}*/ | |||
#ifdef __cplusplus | #ifdef __cplusplus | |||
} | } | |||
#endif | #endif | |||
#endif /* OPUS_H */ | #endif /* OPUS_H */ | |||
End of changes. 67 change blocks. | ||||
87 lines changed or deleted | 113 lines changed or added | |||
opus_defines.h | opus_defines.h | |||
---|---|---|---|---|
/* Copyright (c) 2010-2012 IETF Trust, Xiph.Org Foundation, Skype Limited. All rights reserved. | /* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited | |||
Written by Jean-Marc Valin and Koen Vos */ | Written by Jean-Marc Valin and Koen Vos */ | |||
/* | /* | |||
This file is extracted from RFC6716. Please see that RFC for additional | ||||
information. | ||||
Redistribution and use in source and binary forms, with or without | Redistribution and use in source and binary forms, with or without | |||
modification, are permitted provided that the following conditions | modification, are permitted provided that the following conditions | |||
are met: | are met: | |||
- Redistributions of source code must retain the above copyright | - Redistributions of source code must retain the above copyright | |||
notice, this list of conditions and the following disclaimer. | notice, this list of conditions and the following disclaimer. | |||
- Redistributions in binary form must reproduce the above copyright | - Redistributions in binary form must reproduce the above copyright | |||
notice, this list of conditions and the following disclaimer in the | notice, this list of conditions and the following disclaimer in the | |||
documentation and/or other materials provided with the distribution. | documentation and/or other materials provided with the distribution. | |||
- Neither the name of Internet Society, IETF or IETF Trust, nor the | ||||
names of specific contributors, may be used to endorse or promote | ||||
products derived from this software without specific prior written | ||||
permission. | ||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |||
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWN ER | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWN ER | |||
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |||
skipping to change at line 51 | skipping to change at line 42 | |||
#ifndef OPUS_DEFINES_H | #ifndef OPUS_DEFINES_H | |||
#define OPUS_DEFINES_H | #define OPUS_DEFINES_H | |||
#include "opus_types.h" | #include "opus_types.h" | |||
#ifdef __cplusplus | #ifdef __cplusplus | |||
extern "C" { | extern "C" { | |||
#endif | #endif | |||
/** @defgroup errorcodes Error codes | /** @defgroup opus_errorcodes Error codes | |||
* @{ | * @{ | |||
*/ | */ | |||
/** No error @hideinitializer*/ | /** No error @hideinitializer*/ | |||
#define OPUS_OK 0 | #define OPUS_OK 0 | |||
/** One or more invalid/out of range arguments @hideinitializer*/ | /** One or more invalid/out of range arguments @hideinitializer*/ | |||
#define OPUS_BAD_ARG -1 | #define OPUS_BAD_ARG -1 | |||
/** The mode struct passed is invalid @hideinitializer*/ | /** The mode struct passed is invalid @hideinitializer*/ | |||
#define OPUS_BUFFER_TOO_SMALL -2 | #define OPUS_BUFFER_TOO_SMALL -2 | |||
/** An internal error was detected @hideinitializer*/ | /** An internal error was detected @hideinitializer*/ | |||
#define OPUS_INTERNAL_ERROR -3 | #define OPUS_INTERNAL_ERROR -3 | |||
skipping to change at line 77 | skipping to change at line 68 | |||
#define OPUS_INVALID_STATE -6 | #define OPUS_INVALID_STATE -6 | |||
/** Memory allocation has failed @hideinitializer*/ | /** Memory allocation has failed @hideinitializer*/ | |||
#define OPUS_ALLOC_FAIL -7 | #define OPUS_ALLOC_FAIL -7 | |||
/**@}*/ | /**@}*/ | |||
/** @cond OPUS_INTERNAL_DOC */ | /** @cond OPUS_INTERNAL_DOC */ | |||
/**Export control for opus functions */ | /**Export control for opus functions */ | |||
#if defined(__GNUC__) && defined(OPUS_BUILD) | #if defined(__GNUC__) && defined(OPUS_BUILD) | |||
# define OPUS_EXPORT __attribute__ ((visibility ("default"))) | # define OPUS_EXPORT __attribute__ ((visibility ("default"))) | |||
#elif defined(WIN32) | #elif defined(WIN32) && !defined(__MINGW32__) | |||
# ifdef OPUS_BUILD | # ifdef OPUS_BUILD | |||
# define OPUS_EXPORT __declspec(dllexport) | # define OPUS_EXPORT __declspec(dllexport) | |||
# else | # else | |||
# define OPUS_EXPORT __declspec(dllimport) | # define OPUS_EXPORT | |||
# endif | # endif | |||
#else | #else | |||
# define OPUS_EXPORT | # define OPUS_EXPORT | |||
#endif | #endif | |||
# if !defined(OPUS_GNUC_PREREQ) | ||||
# if defined(__GNUC__)&&defined(__GNUC_MINOR__) | ||||
# define OPUS_GNUC_PREREQ(_maj,_min) \ | ||||
((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min)) | ||||
# else | ||||
# define OPUS_GNUC_PREREQ(_maj,_min) 0 | ||||
# endif | ||||
# endif | ||||
#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) | ||||
# if OPUS_GNUC_PREREQ(3,0) | ||||
# define OPUS_RESTRICT __restrict__ | ||||
# elif (defined(_MSC_VER) && _MSC_VER >= 1400) | ||||
# define OPUS_RESTRICT __restrict | ||||
# else | ||||
# define OPUS_RESTRICT | ||||
# endif | ||||
#else | ||||
# define OPUS_RESTRICT restrict | ||||
#endif | ||||
/**Warning attributes for opus functions | ||||
* NONNULL is not used in OPUS_BUILD to avoid the compiler optimizing out | ||||
* some paranoid null checks. */ | ||||
#if defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4) | ||||
# define OPUS_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__)) | ||||
#else | ||||
# define OPUS_WARN_UNUSED_RESULT | ||||
#endif | ||||
#if !defined(OPUS_BUILD) && defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4) | ||||
# define OPUS_ARG_NONNULL(_x) __attribute__ ((__nonnull__(_x))) | ||||
#else | ||||
# define OPUS_ARG_NONNULL(_x) | ||||
#endif | ||||
/** These are the actual Encoder CTL ID numbers. | /** These are the actual Encoder CTL ID numbers. | |||
* They should not be used directly by applications. */ | * They should not be used directly by applications. | |||
* In general, SETs should be even and GETs should be odd.*/ | ||||
#define OPUS_SET_APPLICATION_REQUEST 4000 | #define OPUS_SET_APPLICATION_REQUEST 4000 | |||
#define OPUS_GET_APPLICATION_REQUEST 4001 | #define OPUS_GET_APPLICATION_REQUEST 4001 | |||
#define OPUS_SET_BITRATE_REQUEST 4002 | #define OPUS_SET_BITRATE_REQUEST 4002 | |||
#define OPUS_GET_BITRATE_REQUEST 4003 | #define OPUS_GET_BITRATE_REQUEST 4003 | |||
#define OPUS_SET_MAX_BANDWIDTH_REQUEST 4004 | #define OPUS_SET_MAX_BANDWIDTH_REQUEST 4004 | |||
#define OPUS_GET_MAX_BANDWIDTH_REQUEST 4005 | #define OPUS_GET_MAX_BANDWIDTH_REQUEST 4005 | |||
#define OPUS_SET_VBR_REQUEST 4006 | #define OPUS_SET_VBR_REQUEST 4006 | |||
#define OPUS_GET_VBR_REQUEST 4007 | #define OPUS_GET_VBR_REQUEST 4007 | |||
#define OPUS_SET_BANDWIDTH_REQUEST 4008 | #define OPUS_SET_BANDWIDTH_REQUEST 4008 | |||
#define OPUS_GET_BANDWIDTH_REQUEST 4009 | #define OPUS_GET_BANDWIDTH_REQUEST 4009 | |||
skipping to change at line 115 | skipping to change at line 142 | |||
#define OPUS_SET_DTX_REQUEST 4016 | #define OPUS_SET_DTX_REQUEST 4016 | |||
#define OPUS_GET_DTX_REQUEST 4017 | #define OPUS_GET_DTX_REQUEST 4017 | |||
#define OPUS_SET_VBR_CONSTRAINT_REQUEST 4020 | #define OPUS_SET_VBR_CONSTRAINT_REQUEST 4020 | |||
#define OPUS_GET_VBR_CONSTRAINT_REQUEST 4021 | #define OPUS_GET_VBR_CONSTRAINT_REQUEST 4021 | |||
#define OPUS_SET_FORCE_CHANNELS_REQUEST 4022 | #define OPUS_SET_FORCE_CHANNELS_REQUEST 4022 | |||
#define OPUS_GET_FORCE_CHANNELS_REQUEST 4023 | #define OPUS_GET_FORCE_CHANNELS_REQUEST 4023 | |||
#define OPUS_SET_SIGNAL_REQUEST 4024 | #define OPUS_SET_SIGNAL_REQUEST 4024 | |||
#define OPUS_GET_SIGNAL_REQUEST 4025 | #define OPUS_GET_SIGNAL_REQUEST 4025 | |||
#define OPUS_GET_LOOKAHEAD_REQUEST 4027 | #define OPUS_GET_LOOKAHEAD_REQUEST 4027 | |||
/* #define OPUS_RESET_STATE 4028 */ | /* #define OPUS_RESET_STATE 4028 */ | |||
#define OPUS_GET_SAMPLE_RATE_REQUEST 4029 | ||||
#define OPUS_GET_FINAL_RANGE_REQUEST 4031 | #define OPUS_GET_FINAL_RANGE_REQUEST 4031 | |||
#define OPUS_GET_PITCH_REQUEST 4033 | #define OPUS_GET_PITCH_REQUEST 4033 | |||
#define OPUS_SET_GAIN_REQUEST 4034 | ||||
#define OPUS_GET_GAIN_REQUEST 4045 | ||||
#define OPUS_SET_LSB_DEPTH_REQUEST 4036 | ||||
#define OPUS_GET_LSB_DEPTH_REQUEST 4037 | ||||
/* Macros to trigger compilation errors when the wrong types are provided t o a CTL */ | /* Macros to trigger compilation errors when the wrong types are provided t o a CTL */ | |||
#define __opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x )) | #define __opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x )) | |||
#define __opus_check_int_ptr(ptr) ((ptr) + ((ptr) - (opus_int32*)(ptr))) | #define __opus_check_int_ptr(ptr) ((ptr) + ((ptr) - (opus_int32*)(ptr))) | |||
#define __opus_check_uint_ptr(ptr) ((ptr) + ((ptr) - (opus_uint32*)(ptr))) | #define __opus_check_uint_ptr(ptr) ((ptr) + ((ptr) - (opus_uint32*)(ptr))) | |||
/** @endcond */ | /** @endcond */ | |||
/** @defgroup ctlvalues Pre-defined values for CTL interface | /** @defgroup opus_ctlvalues Pre-defined values for CTL interface | |||
* @see genericctls, encoderctls | * @see opus_genericctls, opus_encoderctls | |||
* @{ | * @{ | |||
*/ | */ | |||
/* Values for the various encoder CTLs */ | /* Values for the various encoder CTLs */ | |||
#define OPUS_AUTO -1000 /**<Auto/default setting @hideinitializer*/ | #define OPUS_AUTO -1000 /**<Auto/default setting @hideinitializer*/ | |||
#define OPUS_BITRATE_MAX -1 /**<Maximum bitrate @hide initializer*/ | #define OPUS_BITRATE_MAX -1 /**<Maximum bitrate @hide initializer*/ | |||
/** Best for most VoIP/videoconference applications where listening quality and intelligibility matter most | /** Best for most VoIP/videoconference applications where listening quality and intelligibility matter most | |||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_APPLICATION_VOIP 2048 | #define OPUS_APPLICATION_VOIP 2048 | |||
/** Best for broadcast/high-fidelity application where the decoded audio sh ould be as close as possible to the input | /** Best for broadcast/high-fidelity application where the decoded audio sh ould be as close as possible to the input | |||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_APPLICATION_AUDIO 2049 | #define OPUS_APPLICATION_AUDIO 2049 | |||
/** Only use when lowest-achievable latency is what matters most. Voice-opt imized modes cannot be used. | /** Only use when lowest-achievable latency is what matters most. Voice-opt imized modes cannot be used. | |||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_APPLICATION_RESTRICTED_LOWDELAY 2051 | #define OPUS_APPLICATION_RESTRICTED_LOWDELAY 2051 | |||
#define OPUS_SIGNAL_VOICE 3001 /**< Signal being encoded is voice */ | #define OPUS_SIGNAL_VOICE 3001 /**< Signal being encoded is voice */ | |||
#define OPUS_SIGNAL_MUSIC 3002 /**< Signal being encoded is music */ | #define OPUS_SIGNAL_MUSIC 3002 /**< Signal being encoded is music */ | |||
#define OPUS_BANDWIDTH_NARROWBAND 1101 /**< 4kHz bandpass @hidei | #define OPUS_BANDWIDTH_NARROWBAND 1101 /**< 4 kHz bandpass @hide | |||
nitializer*/ | initializer*/ | |||
#define OPUS_BANDWIDTH_MEDIUMBAND 1102 /**< 6kHz bandpass @hidei | #define OPUS_BANDWIDTH_MEDIUMBAND 1102 /**< 6 kHz bandpass @hide | |||
nitializer*/ | initializer*/ | |||
#define OPUS_BANDWIDTH_WIDEBAND 1103 /**< 8kHz bandpass @hidei | #define OPUS_BANDWIDTH_WIDEBAND 1103 /**< 8 kHz bandpass @hide | |||
nitializer*/ | initializer*/ | |||
#define OPUS_BANDWIDTH_SUPERWIDEBAND 1104 /**<12kHz bandpass @hidei | #define OPUS_BANDWIDTH_SUPERWIDEBAND 1104 /**<12 kHz bandpass @hide | |||
nitializer*/ | initializer*/ | |||
#define OPUS_BANDWIDTH_FULLBAND 1105 /**<20kHz bandpass @hidei | #define OPUS_BANDWIDTH_FULLBAND 1105 /**<20 kHz bandpass @hide | |||
nitializer*/ | initializer*/ | |||
/**@}*/ | /**@}*/ | |||
/** @defgroup encoderctls Encoder related CTLs | /** @defgroup opus_encoderctls Encoder related CTLs | |||
* | * | |||
* These are convenience macros for use with the \c opus_encode_ctl | * These are convenience macros for use with the \c opus_encode_ctl | |||
* interface. They are used to generate the appropriate series of | * interface. They are used to generate the appropriate series of | |||
* arguments for that call, passing the correct type, size and so | * arguments for that call, passing the correct type, size and so | |||
* on as expected for each particular request. | * on as expected for each particular request. | |||
* | * | |||
* Some usage examples: | * Some usage examples: | |||
* | * | |||
* @code | * @code | |||
* int ret; | * int ret; | |||
* ret = opus_encoder_ctl(enc_ctx, OPUS_SET_BANDWIDTH(OPUS_AUTO)); | * ret = opus_encoder_ctl(enc_ctx, OPUS_SET_BANDWIDTH(OPUS_AUTO)); | |||
* if (ret != OPUS_OK) return ret; | * if (ret != OPUS_OK) return ret; | |||
* | * | |||
* int rate; | * opus_int32 rate; | |||
* opus_encoder_ctl(enc_ctx, OPUS_GET_BANDWIDTH(&rate)); | * opus_encoder_ctl(enc_ctx, OPUS_GET_BANDWIDTH(&rate)); | |||
* | * | |||
* opus_encoder_ctl(enc_ctx, OPUS_RESET_STATE); | * opus_encoder_ctl(enc_ctx, OPUS_RESET_STATE); | |||
* @endcode | * @endcode | |||
* | * | |||
* @see genericctls, opusencoder | * @see opus_genericctls, opus_encoder | |||
* @{ | * @{ | |||
*/ | */ | |||
/** Configures the encoder's computational complexity. | /** Configures the encoder's computational complexity. | |||
* The supported range is 0-10 inclusive with 10 representing the highest complexity. | * The supported range is 0-10 inclusive with 10 representing the highest complexity. | |||
* The default value is 10. | * @see OPUS_GET_COMPLEXITY | |||
* @param[in] x <tt>int</tt>: 0-10, inclusive | * @param[in] x <tt>opus_int32</tt>: Allowed values: 0-10, inclusive. | |||
* | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_SET_COMPLEXITY(x) OPUS_SET_COMPLEXITY_REQUEST, __opus_check_in t(x) | #define OPUS_SET_COMPLEXITY(x) OPUS_SET_COMPLEXITY_REQUEST, __opus_check_in t(x) | |||
/** Gets the encoder's complexity configuration, @see OPUS_SET_COMPLEXITY | /** Gets the encoder's complexity configuration. | |||
* @param[out] x <tt>int*</tt>: 0-10, inclusive | * @see OPUS_SET_COMPLEXITY | |||
* @param[out] x <tt>opus_int32 *</tt>: Returns a value in the range 0-10, | ||||
* inclusive. | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_GET_COMPLEXITY(x) OPUS_GET_COMPLEXITY_REQUEST, __opus_check_in t_ptr(x) | #define OPUS_GET_COMPLEXITY(x) OPUS_GET_COMPLEXITY_REQUEST, __opus_check_in t_ptr(x) | |||
/** Configures the bitrate in the encoder. | /** Configures the bitrate in the encoder. | |||
* Rates from 500 to 512000 bits per second are meaningful as well as the | * Rates from 500 to 512000 bits per second are meaningful, as well as the | |||
* special values OPUS_BITRATE_AUTO and OPUS_BITRATE_MAX. | * special values #OPUS_AUTO and #OPUS_BITRATE_MAX. | |||
* The value OPUS_BITRATE_MAX can be used to cause the codec to use as muc | * The value #OPUS_BITRATE_MAX can be used to cause the codec to use as mu | |||
h rate | ch | |||
* as it can, which is useful for controlling the rate by adjusting the ou | * rate as it can, which is useful for controlling the rate by adjusting t | |||
tput | he | |||
* buffer size. | * output buffer size. | |||
* @param[in] x <tt>opus_int32</tt>: bitrate in bits per second. | * @see OPUS_GET_BITRATE | |||
* @param[in] x <tt>opus_int32</tt>: Bitrate in bits per second. The defau | ||||
lt | ||||
* is determined based on the number of | ||||
* channels and the input sampling rate. | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_SET_BITRATE(x) OPUS_SET_BITRATE_REQUEST, __opus_check_int(x) | #define OPUS_SET_BITRATE(x) OPUS_SET_BITRATE_REQUEST, __opus_check_int(x) | |||
/** Gets the encoder's bitrate configuration, @see OPUS_SET_BITRATE | /** Gets the encoder's bitrate configuration. | |||
* @param[out] x <tt>opus_int32*</tt>: bitrate in bits per second. | * @see OPUS_SET_BITRATE | |||
* @param[out] x <tt>opus_int32 *</tt>: Returns the bitrate in bits per se | ||||
cond. | ||||
* The default is determined based on | ||||
the | ||||
* number of channels and the input | ||||
* sampling rate. | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_GET_BITRATE(x) OPUS_GET_BITRATE_REQUEST, __opus_check_int_ptr( x) | #define OPUS_GET_BITRATE(x) OPUS_GET_BITRATE_REQUEST, __opus_check_int_ptr( x) | |||
/** Configures VBR in the encoder. | /** Enables or disables variable bitrate (VBR) in the encoder. | |||
* The following values are currently supported: | ||||
* - 0 CBR | ||||
* - 1 VBR (default) | ||||
* The configured bitrate may not be met exactly because frames must | * The configured bitrate may not be met exactly because frames must | |||
* be an integer number of bytes in length. | * be an integer number of bytes in length. | |||
* @warning Only the MDCT mode of Opus can provide hard CBR behavior. | * @warning Only the MDCT mode of Opus can provide hard CBR behavior. | |||
* @param[in] x <tt>int</tt>: 0; 1 (default) | * @see OPUS_GET_VBR | |||
* @see OPUS_SET_VBR_CONSTRAINT | ||||
* @param[in] x <tt>opus_int32</tt>: Allowed values: | ||||
* <dl> | ||||
* <dt>0</dt><dd>Hard CBR. For LPC/hybrid modes at very low bit-rate, this | ||||
can | ||||
* cause noticeable quality degradation.</dd> | ||||
* <dt>1</dt><dd>VBR (default). The exact type of VBR is controlled by | ||||
* #OPUS_SET_VBR_CONSTRAINT.</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_SET_VBR(x) OPUS_SET_VBR_REQUEST, __opus_check_int(x) | #define OPUS_SET_VBR(x) OPUS_SET_VBR_REQUEST, __opus_check_int(x) | |||
/** Gets the encoder's VBR configuration, @see OPUS_SET_VBR | /** Determine if variable bitrate (VBR) is enabled in the encoder. | |||
* @param[out] x <tt>int*</tt>: 0; 1 | * @see OPUS_SET_VBR | |||
* @see OPUS_GET_VBR_CONSTRAINT | ||||
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following value | ||||
s: | ||||
* <dl> | ||||
* <dt>0</dt><dd>Hard CBR.</dd> | ||||
* <dt>1</dt><dd>VBR (default). The exact type of VBR may be retrieved via | ||||
* #OPUS_GET_VBR_CONSTRAINT.</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_GET_VBR(x) OPUS_GET_VBR_REQUEST, __opus_check_int_ptr(x) | #define OPUS_GET_VBR(x) OPUS_GET_VBR_REQUEST, __opus_check_int_ptr(x) | |||
/** Configures constrained VBR in the encoder. | /** Enables or disables constrained VBR in the encoder. | |||
* The following values are currently supported: | * This setting is ignored when the encoder is in CBR mode. | |||
* - 0 Unconstrained VBR (default) | ||||
* - 1 Maximum one frame buffering delay assuming transport with a serial | ||||
ization speed of the nominal bitrate | ||||
* This setting is irrelevant when the encoder is in CBR mode. | ||||
* @warning Only the MDCT mode of Opus currently heeds the constraint. | * @warning Only the MDCT mode of Opus currently heeds the constraint. | |||
* Speech mode ignores it completely, hybrid mode may fail to obey it | * Speech mode ignores it completely, hybrid mode may fail to obey it | |||
* if the LPC layer uses more bitrate than the constraint would have | * if the LPC layer uses more bitrate than the constraint would have | |||
* permitted. | * permitted. | |||
* @param[in] x <tt>int</tt>: 0 (default); 1 | * @see OPUS_GET_VBR_CONSTRAINT | |||
* @see OPUS_SET_VBR | ||||
* @param[in] x <tt>opus_int32</tt>: Allowed values: | ||||
* <dl> | ||||
* <dt>0</dt><dd>Unconstrained VBR.</dd> | ||||
* <dt>1</dt><dd>Constrained VBR (default). This creates a maximum of one | ||||
* frame of buffering delay assuming a transport with a | ||||
* serialization speed of the nominal bitrate.</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_SET_VBR_CONSTRAINT(x) OPUS_SET_VBR_CONSTRAINT_REQUEST, __opus_ check_int(x) | #define OPUS_SET_VBR_CONSTRAINT(x) OPUS_SET_VBR_CONSTRAINT_REQUEST, __opus_ check_int(x) | |||
/** Gets the encoder's constrained VBR configuration @see OPUS_SET_VBR_CONS | /** Determine if constrained VBR is enabled in the encoder. | |||
TRAINT | * @see OPUS_SET_VBR_CONSTRAINT | |||
* @param[out] x <tt>int*</tt>: 0; 1 | * @see OPUS_GET_VBR | |||
* @param[out] x <tt>opus_int32 *</tt>: Returns one of the following value | ||||
s: | ||||
* <dl> | ||||
* <dt>0</dt><dd>Unconstrained VBR.</dd> | ||||
* <dt>1</dt><dd>Constrained VBR (default).</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_GET_VBR_CONSTRAINT(x) OPUS_GET_VBR_CONSTRAINT_REQUEST, __opus_ check_int_ptr(x) | #define OPUS_GET_VBR_CONSTRAINT(x) OPUS_GET_VBR_CONSTRAINT_REQUEST, __opus_ check_int_ptr(x) | |||
/** Configures mono/stereo forcing in the encoder. | /** Configures mono/stereo forcing in the encoder. | |||
* This is useful when the caller knows that the input signal is currently | * This can force the encoder to produce packets encoded as either mono or | |||
a mono | * stereo, regardless of the format of the input audio. This is useful whe | |||
* source embedded in a stereo stream. | n | |||
* @param[in] x <tt>int</tt>: OPUS_AUTO (default); 1 (forced mono); 2 (f | * the caller knows that the input signal is currently a mono source embed | |||
orced stereo) | ded | |||
* in a stereo stream. | ||||
* @see OPUS_GET_FORCE_CHANNELS | ||||
* @param[in] x <tt>opus_int32</tt>: Allowed values: | ||||
* <dl> | ||||
* <dt>#OPUS_AUTO</dt><dd>Not forced (default)</dd> | ||||
* <dt>1</dt> <dd>Forced mono</dd> | ||||
* <dt>2</dt> <dd>Forced stereo</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_SET_FORCE_CHANNELS(x) OPUS_SET_FORCE_CHANNELS_REQUEST, __opus_ check_int(x) | #define OPUS_SET_FORCE_CHANNELS(x) OPUS_SET_FORCE_CHANNELS_REQUEST, __opus_ check_int(x) | |||
/** Gets the encoder's forced channel configuration, @see OPUS_SET_FORCE_CH | /** Gets the encoder's forced channel configuration. | |||
ANNELS | * @see OPUS_SET_FORCE_CHANNELS | |||
* @param[out] x <tt>int*</tt>: OPUS_AUTO; 0; 1 | * @param[out] x <tt>opus_int32 *</tt>: | |||
* <dl> | ||||
* <dt>#OPUS_AUTO</dt><dd>Not forced (default)</dd> | ||||
* <dt>1</dt> <dd>Forced mono</dd> | ||||
* <dt>2</dt> <dd>Forced stereo</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_GET_FORCE_CHANNELS(x) OPUS_GET_FORCE_CHANNELS_REQUEST, __opus_ check_int_ptr(x) | #define OPUS_GET_FORCE_CHANNELS(x) OPUS_GET_FORCE_CHANNELS_REQUEST, __opus_ check_int_ptr(x) | |||
/** Configures the encoder's maximum bandpass allowed, @see OPUS_GET_MAX_BA | /** Configures the maximum bandpass that the encoder will select automatica | |||
NDWIDTH | lly. | |||
* The supported values are: | * Applications should normally use this instead of #OPUS_SET_BANDWIDTH | |||
* - OPUS_BANDWIDTH_NARROWBAND 4kHz passband | * (leaving that set to the default, #OPUS_AUTO). This allows the | |||
* - OPUS_BANDWIDTH_MEDIUMBAND 6kHz passband | * application to set an upper bound based on the type of input it is | |||
* - OPUS_BANDWIDTH_WIDEBAND 8kHz passband | * providing, but still gives the encoder the freedom to reduce the bandpa | |||
* - OPUS_BANDWIDTH_SUPERWIDEBAND 12kHz passband | ss | |||
* - OPUS_BANDWIDTH_FULLBAND 20kHz passband (default) | * when the bitrate becomes too low, for better overall quality. | |||
* @param[in] x <tt>int</tt>: Bandwidth value | * @see OPUS_GET_MAX_BANDWIDTH | |||
* @param[in] x <tt>opus_int32</tt>: Allowed values: | ||||
* <dl> | ||||
* <dt>OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd> | ||||
* <dt>OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd> | ||||
* <dt>OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd> | ||||
* <dt>OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd> | ||||
* <dt>OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband (default)</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_SET_MAX_BANDWIDTH(x) OPUS_SET_MAX_BANDWIDTH_REQUEST, __opus_ch eck_int(x) | #define OPUS_SET_MAX_BANDWIDTH(x) OPUS_SET_MAX_BANDWIDTH_REQUEST, __opus_ch eck_int(x) | |||
/** Gets the encoder's configured maximum bandpass allowed, @see OPUS_SET_M | /** Gets the encoder's configured maximum allowed bandpass. | |||
AX_BANDWIDTH | * @see OPUS_SET_MAX_BANDWIDTH | |||
* @param[out] x <tt>int*</tt>: Bandwidth value | * @param[out] x <tt>opus_int32 *</tt>: Allowed values: | |||
* <dl> | ||||
* <dt>#OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd> | ||||
* <dt>#OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd> | ||||
* <dt>#OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd> | ||||
* <dt>#OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd> | ||||
* <dt>#OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband (default)</dd | ||||
> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_GET_MAX_BANDWIDTH(x) OPUS_GET_MAX_BANDWIDTH_REQUEST, __opus_ch eck_int_ptr(x) | #define OPUS_GET_MAX_BANDWIDTH(x) OPUS_GET_MAX_BANDWIDTH_REQUEST, __opus_ch eck_int_ptr(x) | |||
/** Configures the encoder's bandpass, @see OPUS_GET_BANDWIDTH | /** Sets the encoder's bandpass to a specific value. | |||
* The supported values are: | * This prevents the encoder from automatically selecting the bandpass bas | |||
* - OPUS_AUTO (default) | ed | |||
* - OPUS_BANDWIDTH_NARROWBAND 4kHz passband | * on the available bitrate. If an application knows the bandpass of the i | |||
* - OPUS_BANDWIDTH_MEDIUMBAND 6kHz passband | nput | |||
* - OPUS_BANDWIDTH_WIDEBAND 8kHz passband | * audio it is providing, it should normally use #OPUS_SET_MAX_BANDWIDTH | |||
* - OPUS_BANDWIDTH_SUPERWIDEBAND 12kHz passband | * instead, which still gives the encoder the freedom to reduce the bandpa | |||
* - OPUS_BANDWIDTH_FULLBAND 20kHz passband | ss | |||
* @param[in] x <tt>int</tt>: Bandwidth value | * when the bitrate becomes too low, for better overall quality. | |||
* @see OPUS_GET_BANDWIDTH | ||||
* @param[in] x <tt>opus_int32</tt>: Allowed values: | ||||
* <dl> | ||||
* <dt>#OPUS_AUTO</dt> <dd>(default)</dd> | ||||
* <dt>#OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd> | ||||
* <dt>#OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd> | ||||
* <dt>#OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd> | ||||
* <dt>#OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd> | ||||
* <dt>#OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_SET_BANDWIDTH(x) OPUS_SET_BANDWIDTH_REQUEST, __opus_check_int( x) | #define OPUS_SET_BANDWIDTH(x) OPUS_SET_BANDWIDTH_REQUEST, __opus_check_int( x) | |||
/** Configures the type of signal being encoded. | /** Configures the type of signal being encoded. | |||
* This is a hint which helps the encoder's mode selection. | * This is a hint which helps the encoder's mode selection. | |||
* The supported values are: | * @see OPUS_GET_SIGNAL | |||
* - OPUS_SIGNAL_AUTO (default) | * @param[in] x <tt>opus_int32</tt>: Allowed values: | |||
* - OPUS_SIGNAL_VOICE | * <dl> | |||
* - OPUS_SIGNAL_MUSIC | * <dt>#OPUS_AUTO</dt> <dd>(default)</dd> | |||
* @param[in] x <tt>int</tt>: Signal type | * <dt>#OPUS_SIGNAL_VOICE</dt><dd>Bias thresholds towards choosing LPC or | |||
Hybrid modes.</dd> | ||||
* <dt>#OPUS_SIGNAL_MUSIC</dt><dd>Bias thresholds towards choosing MDCT mo | ||||
des.</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_SET_SIGNAL(x) OPUS_SET_SIGNAL_REQUEST, __opus_check_int(x) | #define OPUS_SET_SIGNAL(x) OPUS_SET_SIGNAL_REQUEST, __opus_check_int(x) | |||
/** Gets the encoder's configured signal type, @see OPUS_SET_SIGNAL | /** Gets the encoder's configured signal type. | |||
* | * @see OPUS_SET_SIGNAL | |||
* @param[out] x <tt>int*</tt>: Signal type | * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following value | |||
s: | ||||
* <dl> | ||||
* <dt>#OPUS_AUTO</dt> <dd>(default)</dd> | ||||
* <dt>#OPUS_SIGNAL_VOICE</dt><dd>Bias thresholds towards choosing LPC or | ||||
Hybrid modes.</dd> | ||||
* <dt>#OPUS_SIGNAL_MUSIC</dt><dd>Bias thresholds towards choosing MDCT mo | ||||
des.</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_GET_SIGNAL(x) OPUS_GET_SIGNAL_REQUEST, __opus_check_int_ptr(x) | #define OPUS_GET_SIGNAL(x) OPUS_GET_SIGNAL_REQUEST, __opus_check_int_ptr(x) | |||
/** Configures the encoder's intended application. | /** Configures the encoder's intended application. | |||
* The initial value is a mandatory argument to the encoder_create functio n. | * The initial value is a mandatory argument to the encoder_create functio n. | |||
* The supported values are: | * @see OPUS_GET_APPLICATION | |||
* - OPUS_APPLICATION_VOIP Process signal for improved speech intelligibi | * @param[in] x <tt>opus_int32</tt>: Returns one of the following values: | |||
lity | * <dl> | |||
* - OPUS_APPLICATION_AUDIO Favor faithfulness to the original input | * <dt>#OPUS_APPLICATION_VOIP</dt> | |||
* - OPUS_APPLICATION_RESTRICTED_LOWDELAY Configure the minimum possible | * <dd>Process signal for improved speech intelligibility.</dd> | |||
coding delay | * <dt>#OPUS_APPLICATION_AUDIO</dt> | |||
* | * <dd>Favor faithfulness to the original input.</dd> | |||
* @param[in] x <tt>int</tt>: Application value | * <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt> | |||
* <dd>Configure the minimum possible coding delay by disabling certain mo | ||||
des | ||||
* of operation.</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_SET_APPLICATION(x) OPUS_SET_APPLICATION_REQUEST, __opus_check_ int(x) | #define OPUS_SET_APPLICATION(x) OPUS_SET_APPLICATION_REQUEST, __opus_check_ int(x) | |||
/** Gets the encoder's configured application, @see OPUS_SET_APPLICATION | /** Gets the encoder's configured application. | |||
* | * @see OPUS_SET_APPLICATION | |||
* @param[out] x <tt>int*</tt>: Application value | * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following value | |||
s: | ||||
* <dl> | ||||
* <dt>#OPUS_APPLICATION_VOIP</dt> | ||||
* <dd>Process signal for improved speech intelligibility.</dd> | ||||
* <dt>#OPUS_APPLICATION_AUDIO</dt> | ||||
* <dd>Favor faithfulness to the original input.</dd> | ||||
* <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt> | ||||
* <dd>Configure the minimum possible coding delay by disabling certain mo | ||||
des | ||||
* of operation.</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_GET_APPLICATION(x) OPUS_GET_APPLICATION_REQUEST, __opus_check_ int_ptr(x) | #define OPUS_GET_APPLICATION(x) OPUS_GET_APPLICATION_REQUEST, __opus_check_ int_ptr(x) | |||
/** Gets the sampling rate the encoder or decoder was initialized with. | ||||
* This simply returns the <code>Fs</code> value passed to opus_encoder_in | ||||
it() | ||||
* or opus_decoder_init(). | ||||
* @param[out] x <tt>opus_int32 *</tt>: Sampling rate of encoder or decode | ||||
r. | ||||
* @hideinitializer | ||||
*/ | ||||
#define OPUS_GET_SAMPLE_RATE(x) OPUS_GET_SAMPLE_RATE_REQUEST, __opus_check_ | ||||
int_ptr(x) | ||||
/** Gets the total samples of delay added by the entire codec. | /** Gets the total samples of delay added by the entire codec. | |||
* This can be queried by the encoder and then the provided number of samp les can be | * This can be queried by the encoder and then the provided number of samp les can be | |||
* skipped on from the start of the decoder's output to provide time align ed input | * skipped on from the start of the decoder's output to provide time align ed input | |||
* and output. From the perspective of a decoding application the real dat a begins this many | * and output. From the perspective of a decoding application the real dat a begins this many | |||
* samples late. | * samples late. | |||
* | * | |||
* The decoder contribution to this delay is identical for all decoders, b ut the | * The decoder contribution to this delay is identical for all decoders, b ut the | |||
* encoder portion of the delay may vary from implementation to implementa tion, | * encoder portion of the delay may vary from implementation to implementa tion, | |||
* version to version, or even depend on the encoder's initial configurati on. | * version to version, or even depend on the encoder's initial configurati on. | |||
* Applications needing delay compensation should call this CTL rather tha n | * Applications needing delay compensation should call this CTL rather tha n | |||
* hard-coding a value. | * hard-coding a value. | |||
* @param[out] x <tt>int*</tt>: Number of lookahead samples | * @param[out] x <tt>opus_int32 *</tt>: Number of lookahead samples | |||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_GET_LOOKAHEAD(x) OPUS_GET_LOOKAHEAD_REQUEST, __opus_check_int_ ptr(x) | #define OPUS_GET_LOOKAHEAD(x) OPUS_GET_LOOKAHEAD_REQUEST, __opus_check_int_ ptr(x) | |||
/** Configures the encoder's use of inband forward error correction. | /** Configures the encoder's use of inband forward error correction (FEC). | |||
* @note This is only applicable to the LPC layer | * @note This is only applicable to the LPC layer | |||
* | * @see OPUS_GET_INBAND_FEC | |||
* @param[in] x <tt>int</tt>: FEC flag, 0 (disabled) is default | * @param[in] x <tt>opus_int32</tt>: Allowed values: | |||
* <dl> | ||||
* <dt>0</dt><dd>Disable inband FEC (default).</dd> | ||||
* <dt>1</dt><dd>Enable inband FEC.</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_SET_INBAND_FEC(x) OPUS_SET_INBAND_FEC_REQUEST, __opus_check_in t(x) | #define OPUS_SET_INBAND_FEC(x) OPUS_SET_INBAND_FEC_REQUEST, __opus_check_in t(x) | |||
/** Gets encoder's configured use of inband forward error correction, @see | /** Gets encoder's configured use of inband forward error correction. | |||
OPUS_SET_INBAND_FEC | * @see OPUS_SET_INBAND_FEC | |||
* | * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following value | |||
* @param[out] x <tt>int*</tt>: FEC flag | s: | |||
* <dl> | ||||
* <dt>0</dt><dd>Inband FEC disabled (default).</dd> | ||||
* <dt>1</dt><dd>Inband FEC enabled.</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_GET_INBAND_FEC(x) OPUS_GET_INBAND_FEC_REQUEST, __opus_check_in t_ptr(x) | #define OPUS_GET_INBAND_FEC(x) OPUS_GET_INBAND_FEC_REQUEST, __opus_check_in t_ptr(x) | |||
/** Configures the encoder's expected packet loss percentage. | /** Configures the encoder's expected packet loss percentage. | |||
* Higher values with trigger progressively more loss resistant behavior i n the encoder | * Higher values with trigger progressively more loss resistant behavior i n the encoder | |||
* at the expense of quality at a given bitrate in the lossless case, but greater quality | * at the expense of quality at a given bitrate in the lossless case, but greater quality | |||
* under loss. | * under loss. | |||
* | * @see OPUS_GET_PACKET_LOSS_PERC | |||
* @param[in] x <tt>int</tt>: Loss percentage in the range 0-100, inclus | * @param[in] x <tt>opus_int32</tt>: Loss percentage in the range 0-100, | |||
ive. | inclusive (default: 0). | |||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_SET_PACKET_LOSS_PERC(x) OPUS_SET_PACKET_LOSS_PERC_REQUEST, __o pus_check_int(x) | #define OPUS_SET_PACKET_LOSS_PERC(x) OPUS_SET_PACKET_LOSS_PERC_REQUEST, __o pus_check_int(x) | |||
/** Gets the encoder's configured packet loss percentage, @see OPUS_SET_PAC | /** Gets the encoder's configured packet loss percentage. | |||
KET_LOSS_PERC | * @see OPUS_SET_PACKET_LOSS_PERC | |||
* | * @param[out] x <tt>opus_int32 *</tt>: Returns the configured loss percen | |||
* @param[out] x <tt>int*</tt>: Loss percentage in the range 0-100, inclus | tage | |||
ive. | * in the range 0-100, inclusive (def | |||
ault: 0). | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_GET_PACKET_LOSS_PERC(x) OPUS_GET_PACKET_LOSS_PERC_REQUEST, __o pus_check_int_ptr(x) | #define OPUS_GET_PACKET_LOSS_PERC(x) OPUS_GET_PACKET_LOSS_PERC_REQUEST, __o pus_check_int_ptr(x) | |||
/** Configures the encoder's use of discontinuous transmission. | /** Configures the encoder's use of discontinuous transmission (DTX). | |||
* @note This is only applicable to the LPC layer | * @note This is only applicable to the LPC layer | |||
* | * @see OPUS_GET_DTX | |||
* @param[in] x <tt>int</tt>: DTX flag, 0 (disabled) is default | * @param[in] x <tt>opus_int32</tt>: Allowed values: | |||
* <dl> | ||||
* <dt>0</dt><dd>Disable DTX (default).</dd> | ||||
* <dt>1</dt><dd>Enabled DTX.</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_SET_DTX(x) OPUS_SET_DTX_REQUEST, __opus_check_int(x) | #define OPUS_SET_DTX(x) OPUS_SET_DTX_REQUEST, __opus_check_int(x) | |||
/** Gets encoder's configured use of discontinuous transmission, @see OPUS_ | /** Gets encoder's configured use of discontinuous transmission. | |||
SET_DTX | * @see OPUS_SET_DTX | |||
* | * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following value | |||
* @param[out] x <tt>int*</tt>: DTX flag | s: | |||
* <dl> | ||||
* <dt>0</dt><dd>DTX disabled (default).</dd> | ||||
* <dt>1</dt><dd>DTX enabled.</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_GET_DTX(x) OPUS_GET_DTX_REQUEST, __opus_check_int_ptr(x) | #define OPUS_GET_DTX(x) OPUS_GET_DTX_REQUEST, __opus_check_int_ptr(x) | |||
/**@}*/ | /**@}*/ | |||
/** @defgroup genericctls Generic CTLs | /** @defgroup opus_genericctls Generic CTLs | |||
* | * | |||
* These macros are used with the \c opus_decoder_ctl and | * These macros are used with the \c opus_decoder_ctl and | |||
* \c opus_encoder_ctl calls to generate a particular | * \c opus_encoder_ctl calls to generate a particular | |||
* request. | * request. | |||
* | * | |||
* When called on an \c OpusDecoder they apply to that | * When called on an \c OpusDecoder they apply to that | |||
* particular decoder instance. When called on an | * particular decoder instance. When called on an | |||
* \c OpusEncoder they apply to the corresponding setting | * \c OpusEncoder they apply to the corresponding setting | |||
* on that encoder instance, if present. | * on that encoder instance, if present. | |||
* | * | |||
skipping to change at line 387 | skipping to change at line 534 | |||
* opus_decoder_ctl(dec_ctx, OPUS_RESET_STATE); | * opus_decoder_ctl(dec_ctx, OPUS_RESET_STATE); | |||
* | * | |||
* opus_int32 enc_bw, dec_bw; | * opus_int32 enc_bw, dec_bw; | |||
* opus_encoder_ctl(enc_ctx, OPUS_GET_BANDWIDTH(&enc_bw)); | * opus_encoder_ctl(enc_ctx, OPUS_GET_BANDWIDTH(&enc_bw)); | |||
* opus_decoder_ctl(dec_ctx, OPUS_GET_BANDWIDTH(&dec_bw)); | * opus_decoder_ctl(dec_ctx, OPUS_GET_BANDWIDTH(&dec_bw)); | |||
* if (enc_bw != dec_bw) { | * if (enc_bw != dec_bw) { | |||
* printf("packet bandwidth mismatch!\n"); | * printf("packet bandwidth mismatch!\n"); | |||
* } | * } | |||
* @endcode | * @endcode | |||
* | * | |||
* @see opusencoder, opus_decoder_ctl, opus_encoder_ctl | * @see opus_encoder, opus_decoder_ctl, opus_encoder_ctl, opus_decoderctls , opus_encoderctls | |||
* @{ | * @{ | |||
*/ | */ | |||
/** Resets the codec state to be equivalent to a freshly initialized state. | /** Resets the codec state to be equivalent to a freshly initialized state. | |||
* This should be called when switching streams in order to prevent | * This should be called when switching streams in order to prevent | |||
* the back to back decoding from giving different results from | * the back to back decoding from giving different results from | |||
* one at a time decoding. | * one at a time decoding. | |||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_RESET_STATE 4028 | #define OPUS_RESET_STATE 4028 | |||
/** Gets the final state of the codec's entropy coder. | /** Gets the final state of the codec's entropy coder. | |||
* This is used for testing purposes, | * This is used for testing purposes, | |||
* The encoder and decoder state should be identical after coding a payloa d | * The encoder and decoder state should be identical after coding a payloa d | |||
* (assuming no data corruption or software bugs) | * (assuming no data corruption or software bugs) | |||
* | * | |||
* @param[out] x <tt>opus_uint32*</tt>: Entropy coder state | * @param[out] x <tt>opus_uint32 *</tt>: Entropy coder state | |||
* | * | |||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_GET_FINAL_RANGE(x) OPUS_GET_FINAL_RANGE_REQUEST, __opus_check_ uint_ptr(x) | #define OPUS_GET_FINAL_RANGE(x) OPUS_GET_FINAL_RANGE_REQUEST, __opus_check_ uint_ptr(x) | |||
/** Gets the pitch of the last decoded frame, if available. | /** Gets the pitch of the last decoded frame, if available. | |||
* This can be used for any post-processing algorithm requiring the use of pitch, | * This can be used for any post-processing algorithm requiring the use of pitch, | |||
* e.g. time stretching/shortening. If the last frame was not voiced, or i f the | * e.g. time stretching/shortening. If the last frame was not voiced, or i f the | |||
* pitch was not coded in the frame, then zero is returned. | * pitch was not coded in the frame, then zero is returned. | |||
* | * | |||
* This CTL is only implemented for decoder instances. | * This CTL is only implemented for decoder instances. | |||
* | * | |||
* @param[out] x <tt>opus_int32*</tt>: pitch period at 48 kHz (or 0 if not available) | * @param[out] x <tt>opus_int32 *</tt>: pitch period at 48 kHz (or 0 if no t available) | |||
* | * | |||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_GET_PITCH(x) OPUS_GET_PITCH_REQUEST, __opus_check_int_ptr(x) | #define OPUS_GET_PITCH(x) OPUS_GET_PITCH_REQUEST, __opus_check_int_ptr(x) | |||
/** Gets the encoder's configured bandpass or the decoder's last bandpass, | /** Gets the encoder's configured bandpass or the decoder's last bandpass. | |||
@see OPUS_SET_BANDWIDTH | * @see OPUS_SET_BANDWIDTH | |||
* @param[out] x <tt>int*</tt>: Bandwidth value | * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following value | |||
s: | ||||
* <dl> | ||||
* <dt>#OPUS_AUTO</dt> <dd>(default)</dd> | ||||
* <dt>#OPUS_BANDWIDTH_NARROWBAND</dt> <dd>4 kHz passband</dd> | ||||
* <dt>#OPUS_BANDWIDTH_MEDIUMBAND</dt> <dd>6 kHz passband</dd> | ||||
* <dt>#OPUS_BANDWIDTH_WIDEBAND</dt> <dd>8 kHz passband</dd> | ||||
* <dt>#OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd> | ||||
* <dt>#OPUS_BANDWIDTH_FULLBAND</dt> <dd>20 kHz passband</dd> | ||||
* </dl> | ||||
* @hideinitializer */ | * @hideinitializer */ | |||
#define OPUS_GET_BANDWIDTH(x) OPUS_GET_BANDWIDTH_REQUEST, __opus_check_int_ ptr(x) | #define OPUS_GET_BANDWIDTH(x) OPUS_GET_BANDWIDTH_REQUEST, __opus_check_int_ ptr(x) | |||
/** Configures the depth of signal being encoded. | ||||
* This is a hint which helps the encoder identify silence and near-silenc | ||||
e. | ||||
* @see OPUS_GET_LSB_DEPTH | ||||
* @param[in] x <tt>opus_int32</tt>: Input precision in bits, between 8 an | ||||
d 24 | ||||
* (default: 24). | ||||
* @hideinitializer */ | ||||
#define OPUS_SET_LSB_DEPTH(x) OPUS_SET_LSB_DEPTH_REQUEST, __opus_check_int( | ||||
x) | ||||
/** Gets the encoder's configured signal depth. | ||||
* @see OPUS_SET_LSB_DEPTH | ||||
* @param[out] x <tt>opus_int32 *</tt>: Input precision in bits, between 8 | ||||
and | ||||
* 24 (default: 24). | ||||
* @hideinitializer */ | ||||
#define OPUS_GET_LSB_DEPTH(x) OPUS_GET_LSB_DEPTH_REQUEST, __opus_check_int_ | ||||
ptr(x) | ||||
/**@}*/ | ||||
/** @defgroup opus_decoderctls Decoder related CTLs | ||||
* @see opus_genericctls, opus_encoderctls, opus_decoder | ||||
* @{ | ||||
*/ | ||||
/** Configures decoder gain adjustment. | ||||
* Scales the decoded output by a factor specified in Q8 dB units. | ||||
* This has a maximum range of -32768 to 32767 inclusive, and returns | ||||
* OPUS_BAD_ARG otherwise. The default is zero indicating no adjustment. | ||||
* This setting survives decoder reset. | ||||
* | ||||
* gain = pow(10, x/(20.0*256)) | ||||
* | ||||
* @param[in] x <tt>opus_int32</tt>: Amount to scale PCM signal by in Q8 | ||||
dB units. | ||||
* @hideinitializer */ | ||||
#define OPUS_SET_GAIN(x) OPUS_SET_GAIN_REQUEST, __opus_check_int(x) | ||||
/** Gets the decoder's configured gain adjustment. @see OPUS_SET_GAIN | ||||
* | ||||
* @param[out] x <tt>opus_int32 *</tt>: Amount to scale PCM signal by in Q | ||||
8 dB units. | ||||
* @hideinitializer */ | ||||
#define OPUS_GET_GAIN(x) OPUS_GET_GAIN_REQUEST, __opus_check_int_ptr(x) | ||||
/**@}*/ | /**@}*/ | |||
/** @defgroup libinfo Opus library information functions | /** @defgroup opus_libinfo Opus library information functions | |||
* @{ | * @{ | |||
*/ | */ | |||
/** Converts an opus error code into a human readable string. | /** Converts an opus error code into a human readable string. | |||
* | * | |||
* @param[in] error <tt>int</tt>: Error number | * @param[in] error <tt>int</tt>: Error number | |||
* @returns Error string | * @returns Error string | |||
*/ | */ | |||
OPUS_EXPORT const char *opus_strerror(int error); | OPUS_EXPORT const char *opus_strerror(int error); | |||
End of changes. 51 change blocks. | ||||
139 lines changed or deleted | 355 lines changed or added | |||
opus_multistream.h | opus_multistream.h | |||
---|---|---|---|---|
/* Copyright (c) 2011-2012 IETF Trust, Xiph.Org Foundation. All rights rese rved. | /* Copyright (c) 2011 Xiph.Org Foundation | |||
Written by Jean-Marc Valin */ | Written by Jean-Marc Valin */ | |||
/* | /* | |||
This file is extracted from RFC6716. Please see that RFC for additional | ||||
information. | ||||
Redistribution and use in source and binary forms, with or without | Redistribution and use in source and binary forms, with or without | |||
modification, are permitted provided that the following conditions | modification, are permitted provided that the following conditions | |||
are met: | are met: | |||
- Redistributions of source code must retain the above copyright | - Redistributions of source code must retain the above copyright | |||
notice, this list of conditions and the following disclaimer. | notice, this list of conditions and the following disclaimer. | |||
- Redistributions in binary form must reproduce the above copyright | - Redistributions in binary form must reproduce the above copyright | |||
notice, this list of conditions and the following disclaimer in the | notice, this list of conditions and the following disclaimer in the | |||
documentation and/or other materials provided with the distribution. | documentation and/or other materials provided with the distribution. | |||
- Neither the name of Internet Society, IETF or IETF Trust, nor the | ||||
names of specific contributors, may be used to endorse or promote | ||||
products derived from this software without specific prior written | ||||
permission. | ||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |||
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWN ER | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWN ER | |||
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |||
skipping to change at line 66 | skipping to change at line 57 | |||
#define OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST 5120 | #define OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST 5120 | |||
#define OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST 5122 | #define OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST 5122 | |||
#define OPUS_MULTISTREAM_GET_ENCODER_STATE(x,y) OPUS_MULTISTREAM_GET_ENCODE R_STATE_REQUEST, __opus_check_int(x), __opus_check_encstate_ptr(y) | #define OPUS_MULTISTREAM_GET_ENCODER_STATE(x,y) OPUS_MULTISTREAM_GET_ENCODE R_STATE_REQUEST, __opus_check_int(x), __opus_check_encstate_ptr(y) | |||
#define OPUS_MULTISTREAM_GET_DECODER_STATE(x,y) OPUS_MULTISTREAM_GET_DECODE R_STATE_REQUEST, __opus_check_int(x), __opus_check_decstate_ptr(y) | #define OPUS_MULTISTREAM_GET_DECODER_STATE(x,y) OPUS_MULTISTREAM_GET_DECODE R_STATE_REQUEST, __opus_check_int(x), __opus_check_decstate_ptr(y) | |||
/** Allocate and initialize a multistream encoder state object. | /** Allocate and initialize a multistream encoder state object. | |||
* Call opus_multistream_encoder_destroy() to release | * Call opus_multistream_encoder_destroy() to release | |||
* this object when finished. */ | * this object when finished. */ | |||
OPUS_EXPORT OpusMSEncoder *opus_multistream_encoder_create( | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_encoder _create( | |||
opus_int32 Fs, /**< Sampling rate of input signal (Hz) */ | opus_int32 Fs, /**< Sampling rate of input signal (Hz) */ | |||
int channels, /**< Number of channels in the input signal */ | int channels, /**< Number of channels in the input signal */ | |||
int streams, /**< Total number of streams to encode from the input */ | int streams, /**< Total number of streams to encode from the input */ | |||
int coupled_streams, /**< Number of coupled (stereo) streams to encode */ | int coupled_streams, /**< Number of coupled (stereo) streams to encode */ | |||
unsigned char *mapping, /**< Encoded mapping between channels and s treams */ | const unsigned char *mapping, /**< Encoded mapping between channels a nd streams */ | |||
int application, /**< Coding mode (OPUS_APPLICATION_VOIP/OPU S_APPLICATION_AUDIO) */ | int application, /**< Coding mode (OPUS_APPLICATION_VOIP/OPU S_APPLICATION_AUDIO) */ | |||
int *error /**< Error code */ | int *error /**< Error code */ | |||
); | ) OPUS_ARG_NONNULL(5); | |||
/** Initialize an already allocated multistream encoder state. */ | /** Initialize an already allocated multistream encoder state. */ | |||
OPUS_EXPORT int opus_multistream_encoder_init( | OPUS_EXPORT int opus_multistream_encoder_init( | |||
OpusMSEncoder *st, /**< Encoder state */ | OpusMSEncoder *st, /**< Encoder state */ | |||
opus_int32 Fs, /**< Sampling rate of input signal (Hz) */ | opus_int32 Fs, /**< Sampling rate of input signal (Hz) */ | |||
int channels, /**< Number of channels in the input signal */ | int channels, /**< Number of channels in the input signal */ | |||
int streams, /**< Total number of streams to encode from the input */ | int streams, /**< Total number of streams to encode from the input */ | |||
int coupled_streams, /**< Number of coupled (stereo) streams to encode */ | int coupled_streams, /**< Number of coupled (stereo) streams to encode */ | |||
unsigned char *mapping, /**< Encoded mapping between channels and s treams */ | const unsigned char *mapping, /**< Encoded mapping between channels a nd streams */ | |||
int application /**< Coding mode (OPUS_APPLICATION_VOIP/OPU S_APPLICATION_AUDIO) */ | int application /**< Coding mode (OPUS_APPLICATION_VOIP/OPU S_APPLICATION_AUDIO) */ | |||
); | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); | |||
/** Returns length of the data payload (in bytes) or a negative error code */ | /** Returns length of the data payload (in bytes) or a negative error code */ | |||
OPUS_EXPORT int opus_multistream_encode( | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_encode( | |||
OpusMSEncoder *st, /**< Encoder state */ | OpusMSEncoder *st, /**< Encoder state */ | |||
const opus_int16 *pcm, /**< Input signal as interleaved samples. L ength is frame_size*channels */ | const opus_int16 *pcm, /**< Input signal as interleaved samples. L ength is frame_size*channels */ | |||
int frame_size, /**< Number of samples per frame of input s ignal */ | int frame_size, /**< Number of samples per frame of input s ignal */ | |||
unsigned char *data, /**< Output buffer for the compressed paylo ad (no more than max_data_bytes long) */ | unsigned char *data, /**< Output buffer for the compressed paylo ad (no more than max_data_bytes long) */ | |||
int max_data_bytes /**< Allocated memory for payload; don't us | opus_int32 max_data_bytes /**< Allocated memory for payload; don't us | |||
e for controlling bitrate */ | e for controlling bitrate */ | |||
); | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); | |||
/** Returns length of the data payload (in bytes) or a negative error code. */ | /** Returns length of the data payload (in bytes) or a negative error code. */ | |||
OPUS_EXPORT int opus_multistream_encode_float( | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_encode_float( | |||
OpusMSEncoder *st, /**< Encoder state */ | OpusMSEncoder *st, /**< Encoder state */ | |||
const float *pcm, /**< Input signal interleaved in channel or der. length is frame_size*channels */ | const float *pcm, /**< Input signal interleaved in channel or der. length is frame_size*channels */ | |||
int frame_size, /**< Number of samples per frame of input s ignal */ | int frame_size, /**< Number of samples per frame of input s ignal */ | |||
unsigned char *data, /**< Output buffer for the compressed paylo ad (no more than max_data_bytes long) */ | unsigned char *data, /**< Output buffer for the compressed paylo ad (no more than max_data_bytes long) */ | |||
int max_data_bytes /**< Allocated memory for payload; don't us | opus_int32 max_data_bytes /**< Allocated memory for payload; don't us | |||
e for controlling bitrate */ | e for controlling bitrate */ | |||
); | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); | |||
/** Gets the size of an OpusMSEncoder structure. | /** Gets the size of an OpusMSEncoder structure. | |||
* @returns size | * @returns size | |||
*/ | */ | |||
OPUS_EXPORT opus_int32 opus_multistream_encoder_get_size( | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_encoder_get _size( | |||
int streams, /**< Total number of coded streams */ | int streams, /**< Total number of coded streams */ | |||
int coupled_streams /**< Number of coupled (stereo) streams */ | int coupled_streams /**< Number of coupled (stereo) streams */ | |||
); | ); | |||
/** Deallocate a multstream encoder state */ | /** Deallocate a multstream encoder state */ | |||
OPUS_EXPORT void opus_multistream_encoder_destroy(OpusMSEncoder *st); | OPUS_EXPORT void opus_multistream_encoder_destroy(OpusMSEncoder *st); | |||
/** Get or set options on a multistream encoder state */ | /** Get or set options on a multistream encoder state */ | |||
OPUS_EXPORT int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request , ...); | OPUS_EXPORT int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request , ...) OPUS_ARG_NONNULL(1); | |||
/** Allocate and initialize a multistream decoder state object. | /** Allocate and initialize a multistream decoder state object. | |||
* Call opus_multistream_decoder_destroy() to release | * Call opus_multistream_decoder_destroy() to release | |||
* this object when finished. */ | * this object when finished. */ | |||
OPUS_EXPORT OpusMSDecoder *opus_multistream_decoder_create( | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSDecoder *opus_multistream_decoder _create( | |||
opus_int32 Fs, /**< Sampling rate to decode at (Hz) */ | opus_int32 Fs, /**< Sampling rate to decode at (Hz) */ | |||
int channels, /**< Number of channels to decode */ | int channels, /**< Number of channels to decode */ | |||
int streams, /**< Total number of coded streams in the m ultistream */ | int streams, /**< Total number of coded streams in the m ultistream */ | |||
int coupled_streams, /**< Number of coupled (stereo) streams in the multistream */ | int coupled_streams, /**< Number of coupled (stereo) streams in the multistream */ | |||
unsigned char *mapping, /**< Stream to channel mapping table */ | const unsigned char *mapping, /**< Stream to channel mapping table */ | |||
int *error /**< Error code */ | int *error /**< Error code */ | |||
); | ) OPUS_ARG_NONNULL(5); | |||
/** Intialize a previously allocated decoder state object. */ | /** Intialize a previously allocated decoder state object. */ | |||
OPUS_EXPORT int opus_multistream_decoder_init( | OPUS_EXPORT int opus_multistream_decoder_init( | |||
OpusMSDecoder *st, /**< Encoder state */ | OpusMSDecoder *st, /**< Encoder state */ | |||
opus_int32 Fs, /**< Sample rate of input signal (Hz) */ | opus_int32 Fs, /**< Sample rate of input signal (Hz) */ | |||
int channels, /**< Number of channels in the input signal */ | int channels, /**< Number of channels in the input signal */ | |||
int streams, /**< Total number of coded streams */ | int streams, /**< Total number of coded streams */ | |||
int coupled_streams, /**< Number of coupled (stereo) streams */ | int coupled_streams, /**< Number of coupled (stereo) streams */ | |||
unsigned char *mapping /**< Stream to channel mapping table */ | const unsigned char *mapping /**< Stream to channel mapping table */ | |||
); | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); | |||
/** Returns the number of samples decoded or a negative error code */ | /** Returns the number of samples decoded or a negative error code */ | |||
OPUS_EXPORT int opus_multistream_decode( | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_decode( | |||
OpusMSDecoder *st, /**< Decoder state */ | OpusMSDecoder *st, /**< Decoder state */ | |||
const unsigned char *data, /**< Input payload. Use a NULL pointer to i ndicate packet loss */ | const unsigned char *data, /**< Input payload. Use a NULL pointer to i ndicate packet loss */ | |||
int len, /**< Number of bytes in payload */ | opus_int32 len, /**< Number of bytes in payload */ | |||
opus_int16 *pcm, /**< Output signal, samples interleaved in channel order . length is frame_size*channels */ | opus_int16 *pcm, /**< Output signal, samples interleaved in channel order . length is frame_size*channels */ | |||
int frame_size, /**< Number of samples per frame of input s ignal */ | int frame_size, /**< Number of samples per frame of input s ignal */ | |||
int decode_fec /**< Flag (0/1) to request that any in-band forward error correction data be */ | int decode_fec /**< Flag (0/1) to request that any in-band forward error correction data be */ | |||
/**< decoded. If no such data is available the frame is decoded as if it were lost. */ | /**< decoded. If no such data is available the frame is decoded as if it were lost. */ | |||
); | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); | |||
/** Returns the number of samples decoded or a negative error code */ | /** Returns the number of samples decoded or a negative error code */ | |||
OPUS_EXPORT int opus_multistream_decode_float( | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_decode_float( | |||
OpusMSDecoder *st, /**< Decoder state */ | OpusMSDecoder *st, /**< Decoder state */ | |||
const unsigned char *data, /**< Input payload buffer. Use a NULL point er to indicate packet loss */ | const unsigned char *data, /**< Input payload buffer. Use a NULL point er to indicate packet loss */ | |||
int len, /**< Number of payload bytes in data */ | opus_int32 len, /**< Number of payload bytes in data */ | |||
float *pcm, /**< Buffer for the output signal (interlea ved iin channel order). length is frame_size*channels */ | float *pcm, /**< Buffer for the output signal (interlea ved iin channel order). length is frame_size*channels */ | |||
int frame_size, /**< Number of samples per frame of input s ignal */ | int frame_size, /**< Number of samples per frame of input s ignal */ | |||
int decode_fec /**< Flag (0/1) to request that any in-band forward error correction data be */ | int decode_fec /**< Flag (0/1) to request that any in-band forward error correction data be */ | |||
/**< decoded. If no such data is available the frame is decoded as if it were lost. */ | /**< decoded. If no such data is available the frame is decoded as if it were lost. */ | |||
); | ) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); | |||
/** Gets the size of an OpusMSDecoder structure. | /** Gets the size of an OpusMSDecoder structure. | |||
* @returns size | * @returns size | |||
*/ | */ | |||
OPUS_EXPORT opus_int32 opus_multistream_decoder_get_size( | OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_decoder_get _size( | |||
int streams, /**< Total number of coded streams */ | int streams, /**< Total number of coded streams */ | |||
int coupled_streams /**< Number of coupled (stereo) streams */ | int coupled_streams /**< Number of coupled (stereo) streams */ | |||
); | ); | |||
/** Get or set options on a multistream decoder state */ | /** Get or set options on a multistream decoder state */ | |||
OPUS_EXPORT int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request , ...); | OPUS_EXPORT int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request , ...) OPUS_ARG_NONNULL(1); | |||
/** Deallocate a multistream decoder state object */ | /** Deallocate a multistream decoder state object */ | |||
OPUS_EXPORT void opus_multistream_decoder_destroy(OpusMSDecoder *st); | OPUS_EXPORT void opus_multistream_decoder_destroy(OpusMSDecoder *st); | |||
#ifdef __cplusplus | #ifdef __cplusplus | |||
} | } | |||
#endif | #endif | |||
#endif /* OPUS_MULTISTREAM_H */ | #endif /* OPUS_MULTISTREAM_H */ | |||
End of changes. 26 change blocks. | ||||
38 lines changed or deleted | 29 lines changed or added | |||
opus_types.h | opus_types.h | |||
---|---|---|---|---|
/* (C) COPYRIGHT 1994-2012 IETF Trust, Xiph.Org Foundation. All rights rese rved */ | /* (C) COPYRIGHT 1994-2002 Xiph.Org Foundation */ | |||
/* Modified by Jean-Marc Valin */ | /* Modified by Jean-Marc Valin */ | |||
/* | /* | |||
This file is extracted from RFC6716. Please see that RFC for additional | ||||
information. | ||||
Redistribution and use in source and binary forms, with or without | Redistribution and use in source and binary forms, with or without | |||
modification, are permitted provided that the following conditions | modification, are permitted provided that the following conditions | |||
are met: | are met: | |||
- Redistributions of source code must retain the above copyright | - Redistributions of source code must retain the above copyright | |||
notice, this list of conditions and the following disclaimer. | notice, this list of conditions and the following disclaimer. | |||
- Redistributions in binary form must reproduce the above copyright | - Redistributions in binary form must reproduce the above copyright | |||
notice, this list of conditions and the following disclaimer in the | notice, this list of conditions and the following disclaimer in the | |||
documentation and/or other materials provided with the distribution. | documentation and/or other materials provided with the distribution. | |||
- Neither the name of Internet Society, IETF or IETF Trust, nor the | ||||
names of specific contributors, may be used to endorse or promote | ||||
products derived from this software without specific prior written | ||||
permission. | ||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |||
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWN ER | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWN ER | |||
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |||
End of changes. 3 change blocks. | ||||
10 lines changed or deleted | 1 lines changed or added | |||