1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited
2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Written by Jean-Marc Valin and Koen Vos */
3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*
4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Redistribution and use in source and binary forms, with or without
5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   modification, are permitted provided that the following conditions
6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   are met:
7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   - Redistributions of source code must retain the above copyright
9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   notice, this list of conditions and the following disclaimer.
10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
11885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   - Redistributions in binary form must reproduce the above copyright
12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   notice, this list of conditions and the following disclaimer in the
13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   documentation and/or other materials provided with the distribution.
14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
15885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org*/
27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/**
29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @file opus.h
30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @brief Opus reference implementation API
31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org */
32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef OPUS_H
34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define OPUS_H
35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "opus_types.h"
37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "opus_defines.h"
38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef __cplusplus
40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgextern "C" {
41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/**
44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @mainpage Opus
45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *
46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * The Opus codec is designed for interactive speech and audio transmission over the Internet.
47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * It is designed by the IETF Codec Working Group and incorporates technology from
48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * Skype's SILK codec and Xiph.Org's CELT codec.
49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *
50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * The Opus codec is designed to handle a wide range of interactive audio applications,
51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * including Voice over IP, videoconferencing, in-game chat, and even remote live music
52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * performances. It can scale from low bit-rate narrowband speech to very high quality
53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * stereo music. Its main features are:
54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @li Sampling rates from 8 to 48 kHz
56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @li Bit-rates from 6 kb/s to 510 kb/s
57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @li Support for both constant bit-rate (CBR) and variable bit-rate (VBR)
58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @li Audio bandwidth from narrowband to full-band
59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @li Support for speech and music
60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @li Support for mono and stereo
61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @li Support for multichannel (up to 255 channels)
62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @li Frame sizes from 2.5 ms to 60 ms
63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @li Good loss robustness and packet loss concealment (PLC)
64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @li Floating point and fixed-point implementation
65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *
66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * Documentation sections:
67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @li @ref opus_encoder
68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @li @ref opus_decoder
69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @li @ref opus_repacketizer
706b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org * @li @ref opus_multistream
71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @li @ref opus_libinfo
72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @li @ref opus_custom
73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org */
74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** @defgroup opus_encoder Opus Encoder
76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @{
77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @brief This page describes the process and functions used to encode Opus.
79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * Since Opus is a stateful codec, the encoding process starts with creating an encoder
81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * state. This can be done with:
82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @code
84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * int          error;
85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * OpusEncoder *enc;
86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * enc = opus_encoder_create(Fs, channels, application, &error);
87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @endcode
88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * From this point, @c enc can be used for encoding an audio stream. An encoder state
90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @b must @b not be used for more than one stream at the same time. Similarly, the encoder
91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * state @b must @b not be re-initialized for each frame.
92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * While opus_encoder_create() allocates memory for the state, it's also possible
94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * to initialize pre-allocated memory:
95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @code
97885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * int          size;
98885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * int          error;
99885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * OpusEncoder *enc;
100885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * size = opus_encoder_get_size(channels);
101885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * enc = malloc(size);
102885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * error = opus_encoder_init(enc, Fs, channels, application);
103885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @endcode
104885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
105885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * where opus_encoder_get_size() returns the required size for the encoder state. Note that
106885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * future versions of this code may change the size, so no assuptions should be made about it.
107885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
108885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * The encoder state is always continuous in memory and only a shallow copy is sufficient
109885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * to copy it (e.g. memcpy())
110885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
111885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * It is possible to change some of the encoder's settings using the opus_encoder_ctl()
112885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * interface. All these settings already default to the recommended value, so they should
113885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * only be changed when necessary. The most common settings one may want to change are:
114885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
115885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @code
116885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate));
117885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity));
118885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * opus_encoder_ctl(enc, OPUS_SET_SIGNAL(signal_type));
119885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @endcode
120885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
121885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * where
122885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
123885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @arg bitrate is in bits per second (b/s)
124885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @arg complexity is a value from 1 to 10, where 1 is the lowest complexity and 10 is the highest
125885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @arg signal_type is either OPUS_AUTO (default), OPUS_SIGNAL_VOICE, or OPUS_SIGNAL_MUSIC
126885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
127885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * See @ref opus_encoderctls and @ref opus_genericctls for a complete list of parameters that can be set or queried. Most parameters can be set or changed at any time during a stream.
128885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
129885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * 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:
130885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @code
131885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * len = opus_encode(enc, audio_frame, frame_size, packet, max_packet);
132885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @endcode
133885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
134885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * where
135885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * <ul>
136885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * <li>audio_frame is the audio data in opus_int16 (or float for opus_encode_float())</li>
137885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * <li>frame_size is the duration of the frame in samples (per channel)</li>
138885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * <li>packet is the byte array to which the compressed data is written</li>
1396b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * <li>max_packet is the maximum number of bytes that can be written in the packet (4000 bytes is recommended).
1406b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     Do not use max_packet to control VBR target bitrate, instead use the #OPUS_SET_BITRATE CTL.</li>
141885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * </ul>
142885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
1436b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * opus_encode() and opus_encode_float() return the number of bytes actually written to the packet.
144885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * The return value <b>can be negative</b>, which indicates that an error has occurred. If the return value
145885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * is 1 byte, then the packet does not need to be transmitted (DTX).
146885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
147885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * Once the encoder state if no longer needed, it can be destroyed with
148885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
149885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @code
150885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * opus_encoder_destroy(enc);
151885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @endcode
152885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
153885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * If the encoder was created with opus_encoder_init() rather than opus_encoder_create(),
154885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * then no action is required aside from potentially freeing the memory that was manually
155885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * allocated for it (calling free(enc) for the example above)
156885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
157885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
158885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
159885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Opus encoder state.
160885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * This contains the complete state of an Opus encoder.
161885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * It is position independent and can be freely copied.
162885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @see opus_encoder_create,opus_encoder_init
163885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
164885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgtypedef struct OpusEncoder OpusEncoder;
165885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
1666b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/** Gets the size of an <code>OpusEncoder</code> structure.
1676b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param[in] channels <tt>int</tt>: Number of channels.
1686b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                   This must be 1 or 2.
1696b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @returns The size in bytes.
1706b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  */
171885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_encoder_get_size(int channels);
172885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
173885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/**
174885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org */
175885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
176885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Allocates and initializes an encoder state.
177885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * There are three coding modes:
178885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *
179885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @ref OPUS_APPLICATION_VOIP gives best quality at a given bitrate for voice
180885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *    signals. It enhances the  input signal by high-pass filtering and
181885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *    emphasizing formants and harmonics. Optionally  it includes in-band
182885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *    forward error correction to protect against packet loss. Use this
183885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *    mode for typical VoIP applications. Because of the enhancement,
184885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *    even at high bitrates the output may sound different from the input.
185885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *
186885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @ref OPUS_APPLICATION_AUDIO gives best quality at a given bitrate for most
187885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *    non-voice signals like music. Use this mode for music and mixed
188885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *    (music/voice) content, broadcast, and applications requiring less
189885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *    than 15 ms of coding delay.
190885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *
191885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @ref OPUS_APPLICATION_RESTRICTED_LOWDELAY configures low-delay mode that
192885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *    disables the speech-optimized mode in exchange for slightly reduced delay.
193885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *    This mode can only be set on an newly initialized or freshly reset encoder
194885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *    because it changes the codec delay.
195885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org *
196885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * This is useful when the caller knows that the speech-optimized modes will not be needed (use with caution).
197885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz)
1986b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org *                                     This must be one of 8000, 12000, 16000,
1996b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org *                                     24000, or 48000.
2006b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org * @param [in] channels <tt>int</tt>: Number of channels (1 or 2) in input signal
201885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @param [in] application <tt>int</tt>: Coding mode (@ref OPUS_APPLICATION_VOIP/@ref OPUS_APPLICATION_AUDIO/@ref OPUS_APPLICATION_RESTRICTED_LOWDELAY)
202885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @param [out] error <tt>int*</tt>: @ref opus_errorcodes
203885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @note Regardless of the sampling rate and number channels selected, the Opus encoder
2046b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org * can switch to a lower audio bandwidth or number of channels if the bitrate
205885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * selected is too low. This also means that it is safe to always use 48 kHz stereo input
206885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * and let the encoder optimize the encoding.
207885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org */
208885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusEncoder *opus_encoder_create(
209885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 Fs,
210885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int channels,
211885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int application,
212885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int *error
213885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
214885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
215885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Initializes a previously allocated encoder state
2166b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * The memory pointed to by st must be at least the size returned by opus_encoder_get_size().
217885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * This is intended for applications which use their own allocator instead of malloc.
218885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @see opus_encoder_create(),opus_encoder_get_size()
2196b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
220885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] st <tt>OpusEncoder*</tt>: Encoder state
221885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz)
2226b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org *                                      This must be one of 8000, 12000, 16000,
2236b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org *                                      24000, or 48000.
2246b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] channels <tt>int</tt>: Number of channels (1 or 2) in input signal
225885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] application <tt>int</tt>: Coding mode (OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRICTED_LOWDELAY)
2266b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @retval #OPUS_OK Success or @ref opus_errorcodes
227885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
228885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT int opus_encoder_init(
229885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    OpusEncoder *st,
230885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 Fs,
231885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int channels,
232885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int application
233885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) OPUS_ARG_NONNULL(1);
234885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
235885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Encodes an Opus frame.
236885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] st <tt>OpusEncoder*</tt>: Encoder state
237885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] pcm <tt>opus_int16*</tt>: Input signal (interleaved if 2 channels). length is frame_size*channels*sizeof(opus_int16)
2386b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] frame_size <tt>int</tt>: Number of samples per channel in the
2396b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      input signal.
2406b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      This must be an Opus frame size for
2416b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      the encoder's sampling rate.
2426b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      For example, at 48 kHz the permitted
2436b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      values are 120, 240, 480, 960, 1920,
2446b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      and 2880.
2456b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      Passing in a duration of less than
2466b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      10 ms (480 samples at 48 kHz) will
2476b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      prevent the encoder from using the LPC
2486b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      or hybrid modes.
2496b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [out] data <tt>unsigned char*</tt>: Output payload.
2506b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                            This must contain storage for at
2516b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                            least \a max_data_bytes.
2526b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated
2536b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 memory for the output
2546b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 payload. This may be
2556b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 used to impose an upper limit on
2566b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 the instant bitrate, but should
2576b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 not be used as the only bitrate
2586b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 control. Use #OPUS_SET_BITRATE to
2596b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 control the bitrate.
2606b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @returns The length of the encoded packet (in bytes) on success or a
2616b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *          negative error code (see @ref opus_errorcodes) on failure.
262885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
263885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode(
264885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    OpusEncoder *st,
265885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int16 *pcm,
266885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int frame_size,
267885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    unsigned char *data,
268885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 max_data_bytes
269885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
270885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
271885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Encodes an Opus frame from floating point input.
272885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] st <tt>OpusEncoder*</tt>: Encoder state
273885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] pcm <tt>float*</tt>: Input in float format (interleaved if 2 channels), with a normal range of +/-1.0.
274885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *          Samples with a range beyond +/-1.0 are supported but will
275885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *          be clipped by decoders using the integer API and should
276885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *          only be used if it is known that the far end supports
277885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *          extended dynamic range.
278885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *          length is frame_size*channels*sizeof(float)
2796b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] frame_size <tt>int</tt>: Number of samples per channel in the
2806b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      input signal.
2816b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      This must be an Opus frame size for
2826b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      the encoder's sampling rate.
2836b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      For example, at 48 kHz the permitted
2846b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      values are 120, 240, 480, 960, 1920,
2856b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      and 2880.
2866b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      Passing in a duration of less than
2876b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      10 ms (480 samples at 48 kHz) will
2886b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      prevent the encoder from using the LPC
2896b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                      or hybrid modes.
2906b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [out] data <tt>unsigned char*</tt>: Output payload.
2916b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                            This must contain storage for at
2926b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                            least \a max_data_bytes.
2936b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated
2946b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 memory for the output
2956b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 payload. This may be
2966b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 used to impose an upper limit on
2976b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 the instant bitrate, but should
2986b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 not be used as the only bitrate
2996b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 control. Use #OPUS_SET_BITRATE to
3006b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 control the bitrate.
3016b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @returns The length of the encoded packet (in bytes) on success or a
3026b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *          negative error code (see @ref opus_errorcodes) on failure.
303885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
304885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode_float(
305885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    OpusEncoder *st,
306885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const float *pcm,
307885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int frame_size,
308885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    unsigned char *data,
309885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 max_data_bytes
310885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);
311885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
3126b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/** Frees an <code>OpusEncoder</code> allocated by opus_encoder_create().
313885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param[in] st <tt>OpusEncoder*</tt>: State to be freed.
314885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
315885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT void opus_encoder_destroy(OpusEncoder *st);
316885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
317885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Perform a CTL function on an Opus encoder.
318885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
319885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * Generally the request and subsequent arguments are generated
320885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * by a convenience macro.
3216b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param st <tt>OpusEncoder*</tt>: Encoder state.
3226b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param request This and all remaining parameters should be replaced by one
3236b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                of the convenience macros in @ref opus_genericctls or
3246b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                @ref opus_encoderctls.
3256b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @see opus_genericctls
326885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @see opus_encoderctls
327885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
328885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT int opus_encoder_ctl(OpusEncoder *st, int request, ...) OPUS_ARG_NONNULL(1);
329885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/**@}*/
330885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
331885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** @defgroup opus_decoder Opus Decoder
332885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @{
333885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
334885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @brief This page describes the process and functions used to decode Opus.
335885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
336885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * The decoding process also starts with creating a decoder
337885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * state. This can be done with:
338885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @code
339885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * int          error;
340885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * OpusDecoder *dec;
341885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * dec = opus_decoder_create(Fs, channels, &error);
342885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @endcode
343885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * where
344885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @li Fs is the sampling rate and must be 8000, 12000, 16000, 24000, or 48000
345885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @li channels is the number of channels (1 or 2)
3466b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @li error will hold the error code in case of failure (or #OPUS_OK on success)
347885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @li the return value is a newly created decoder state to be used for decoding
348885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
349885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * While opus_decoder_create() allocates memory for the state, it's also possible
350885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * to initialize pre-allocated memory:
351885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @code
352885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * int          size;
353885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * int          error;
354885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * OpusDecoder *dec;
355885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * size = opus_decoder_get_size(channels);
356885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * dec = malloc(size);
357885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * error = opus_decoder_init(dec, Fs, channels);
358885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @endcode
359885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * where opus_decoder_get_size() returns the required size for the decoder state. Note that
360885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * future versions of this code may change the size, so no assuptions should be made about it.
361885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
362885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * The decoder state is always continuous in memory and only a shallow copy is sufficient
363885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * to copy it (e.g. memcpy())
364885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
365885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * To decode a frame, opus_decode() or opus_decode_float() must be called with a packet of compressed audio data:
366885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @code
367885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * frame_size = opus_decode(dec, packet, len, decoded, max_size, 0);
368885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @endcode
369885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * where
370885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
371885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @li packet is the byte array containing the compressed data
372885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @li len is the exact number of bytes contained in the packet
373885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @li decoded is the decoded audio data in opus_int16 (or float for opus_decode_float())
374885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @li max_size is the max duration of the frame in samples (per channel) that can fit into the decoded_frame array
375885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
376885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * opus_decode() and opus_decode_float() return the number of samples (per channel) decoded from the packet.
3776b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * If that value is negative, then an error has occurred. This can occur if the packet is corrupted or if the audio
378885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * buffer is too small to hold the decoded audio.
379885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
380885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * Opus is a stateful codec with overlapping blocks and as a result Opus
381885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * packets are not coded independently of each other. Packets must be
382885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * passed into the decoder serially and in the correct order for a correct
383885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * decode. Lost packets can be replaced with loss concealment by calling
384885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * the decoder with a null pointer and zero length for the missing packet.
385885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
386885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * A single codec state may only be accessed from a single thread at
387885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * a time and any required locking must be performed by the caller. Separate
388885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * streams must be decoded with separate decoder states and can be decoded
389885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * in parallel unless the library was compiled with NONTHREADSAFE_PSEUDOSTACK
390885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * defined.
391885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
392885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
393885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
394885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Opus decoder state.
395885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * This contains the complete state of an Opus decoder.
396885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * It is position independent and can be freely copied.
397885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @see opus_decoder_create,opus_decoder_init
398885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
399885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgtypedef struct OpusDecoder OpusDecoder;
400885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
4016b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/** Gets the size of an <code>OpusDecoder</code> structure.
4026b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] channels <tt>int</tt>: Number of channels.
4036b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    This must be 1 or 2.
4046b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @returns The size in bytes.
405885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
406885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_size(int channels);
407885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
408885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Allocates and initializes a decoder state.
4096b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] Fs <tt>opus_int32</tt>: Sample rate to decode at (Hz).
4106b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                     This must be one of 8000, 12000, 16000,
4116b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                     24000, or 48000.
4126b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] channels <tt>int</tt>: Number of channels (1 or 2) to decode
4136b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [out] error <tt>int*</tt>: #OPUS_OK Success or @ref opus_errorcodes
414885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
415885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * Internally Opus stores data at 48000 Hz, so that should be the default
416885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * value for Fs. However, the decoder can efficiently decode to buffers
417885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * at 8, 12, 16, and 24 kHz so if for some reason the caller cannot use
418885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * data at the full sample rate, or knows the compressed data doesn't
419885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * use the full frequency range, it can request decoding at a reduced
420885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * rate. Likewise, the decoder is capable of filling in either mono or
421885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * interleaved stereo pcm buffers, at the caller's request.
422885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
423885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusDecoder *opus_decoder_create(
424885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 Fs,
425885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int channels,
426885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int *error
427885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org);
428885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
429885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Initializes a previously allocated decoder state.
4306b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * The state must be at least the size returned by opus_decoder_get_size().
431885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * This is intended for applications which use their own allocator instead of malloc. @see opus_decoder_create,opus_decoder_get_size
4326b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.
433885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] st <tt>OpusDecoder*</tt>: Decoder state.
4346b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] Fs <tt>opus_int32</tt>: Sampling rate to decode to (Hz).
4356b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                     This must be one of 8000, 12000, 16000,
4366b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                     24000, or 48000.
4376b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] channels <tt>int</tt>: Number of channels (1 or 2) to decode
4386b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @retval #OPUS_OK Success or @ref opus_errorcodes
439885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
440885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT int opus_decoder_init(
441885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    OpusDecoder *st,
442885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 Fs,
443885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int channels
444885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) OPUS_ARG_NONNULL(1);
445885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
4466b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/** Decode an Opus packet.
447885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] st <tt>OpusDecoder*</tt>: Decoder state
448885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss
449885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] len <tt>opus_int32</tt>: Number of bytes in payload*
450885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [out] pcm <tt>opus_int16*</tt>: Output signal (interleaved if 2 channels). length
451885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *  is frame_size*channels*sizeof(opus_int16)
4526b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] frame_size Number of samples per channel of available space in \a pcm.
4536b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *  If this is less than the maximum packet duration (120ms; 5760 for 48kHz), this function will
4546b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *  not be capable of decoding some packets. In the case of PLC (data==NULL) or FEC (decode_fec=1),
4556b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *  then frame_size needs to be exactly the duration of audio that is missing, otherwise the
4566b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *  decoder will not be in the optimal state to decode the next incoming packet. For the PLC and
4576b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *  FEC cases, frame_size <b>must</b> be a multiple of 2.5 ms.
4586b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band forward error correction data be
4596b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *  decoded. If no such data is available, the frame is decoded as if it were lost.
460885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @returns Number of decoded samples or @ref opus_errorcodes
461885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
462885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode(
463885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    OpusDecoder *st,
464885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const unsigned char *data,
465885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 len,
466885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int16 *pcm,
467885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int frame_size,
468885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int decode_fec
469885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
470885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
4716b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/** Decode an Opus packet with floating point output.
472885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] st <tt>OpusDecoder*</tt>: Decoder state
473885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss
474885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] len <tt>opus_int32</tt>: Number of bytes in payload
475885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [out] pcm <tt>float*</tt>: Output signal (interleaved if 2 channels). length
476885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *  is frame_size*channels*sizeof(float)
4776b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] frame_size Number of samples per channel of available space in \a pcm.
4786b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *  If this is less than the maximum packet duration (120ms; 5760 for 48kHz), this function will
4796b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *  not be capable of decoding some packets. In the case of PLC (data==NULL) or FEC (decode_fec=1),
4806b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *  then frame_size needs to be exactly the duration of audio that is missing, otherwise the
4816b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *  decoder will not be in the optimal state to decode the next incoming packet. For the PLC and
4826b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *  FEC cases, frame_size <b>must</b> be a multiple of 2.5 ms.
4836b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band forward error correction data be
484885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *  decoded. If no such data is available the frame is decoded as if it were lost.
485885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @returns Number of decoded samples or @ref opus_errorcodes
486885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
487885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode_float(
488885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    OpusDecoder *st,
489885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const unsigned char *data,
490885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 len,
491885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    float *pcm,
492885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int frame_size,
493885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int decode_fec
494885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
495885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
496885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Perform a CTL function on an Opus decoder.
497885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
498885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * Generally the request and subsequent arguments are generated
499885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * by a convenience macro.
5006b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param st <tt>OpusDecoder*</tt>: Decoder state.
5016b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param request This and all remaining parameters should be replaced by one
5026b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                of the convenience macros in @ref opus_genericctls or
5036b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                @ref opus_decoderctls.
504885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @see opus_genericctls
5056b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @see opus_decoderctls
506885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
507885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT int opus_decoder_ctl(OpusDecoder *st, int request, ...) OPUS_ARG_NONNULL(1);
508885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
5096b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/** Frees an <code>OpusDecoder</code> allocated by opus_decoder_create().
510885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param[in] st <tt>OpusDecoder*</tt>: State to be freed.
511885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
512885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT void opus_decoder_destroy(OpusDecoder *st);
513885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
514885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Parse an opus packet into one or more frames.
515885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * Opus_decode will perform this operation internally so most applications do
516885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * not need to use this function.
517885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * This function does not copy the frames, the returned pointers are pointers into
518885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * the input packet.
519885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] data <tt>char*</tt>: Opus packet to be parsed
520885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] len <tt>opus_int32</tt>: size of data
521885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [out] out_toc <tt>char*</tt>: TOC pointer
522885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [out] frames <tt>char*[48]</tt> encapsulated frames
523885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [out] size <tt>short[48]</tt> sizes of the encapsulated frames
524885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [out] payload_offset <tt>int*</tt>: returns the position of the payload within the packet (in bytes)
525885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @returns number of frames
526885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
527885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT int opus_packet_parse(
528885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   const unsigned char *data,
529885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_int32 len,
530885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   unsigned char *out_toc,
531885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   const unsigned char *frames[48],
532885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   short size[48],
533885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int *payload_offset
534885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
535885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
536885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Gets the bandwidth of an Opus packet.
537885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] data <tt>char*</tt>: Opus packet
538885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @retval OPUS_BANDWIDTH_NARROWBAND Narrowband (4kHz bandpass)
539885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @retval OPUS_BANDWIDTH_MEDIUMBAND Mediumband (6kHz bandpass)
540885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @retval OPUS_BANDWIDTH_WIDEBAND Wideband (8kHz bandpass)
541885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @retval OPUS_BANDWIDTH_SUPERWIDEBAND Superwideband (12kHz bandpass)
542885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @retval OPUS_BANDWIDTH_FULLBAND Fullband (20kHz bandpass)
543885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
544885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
545885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_bandwidth(const unsigned char *data) OPUS_ARG_NONNULL(1);
546885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
547885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Gets the number of samples per frame from an Opus packet.
5486b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] data <tt>char*</tt>: Opus packet.
5496b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                  This must contain at least one byte of
5506b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                  data.
5516b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] Fs <tt>opus_int32</tt>: Sampling rate in Hz.
5526b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                     This must be a multiple of 400, or
5536b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                     inaccurate results will be returned.
5546b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @returns Number of samples per frame.
555885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
556885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_samples_per_frame(const unsigned char *data, opus_int32 Fs) OPUS_ARG_NONNULL(1);
557885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
558885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Gets the number of channels from an Opus packet.
559885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] data <tt>char*</tt>: Opus packet
560885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @returns Number of channels
561885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
562885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
563885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_channels(const unsigned char *data) OPUS_ARG_NONNULL(1);
564885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
565885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Gets the number of frames in an Opus packet.
566885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] packet <tt>char*</tt>: Opus packet
567885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] len <tt>opus_int32</tt>: Length of packet
568885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @returns Number of frames
569885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
570885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
571885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_frames(const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1);
572885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
573885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Gets the number of samples of an Opus packet.
5746b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] packet <tt>char*</tt>: Opus packet
5756b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] len <tt>opus_int32</tt>: Length of packet
5766b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param [in] Fs <tt>opus_int32</tt>: Sampling rate in Hz.
5776b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                     This must be a multiple of 400, or
5786b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                     inaccurate results will be returned.
5796b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @returns Number of samples
5806b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
5816b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  */
5826b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_samples(const unsigned char packet[], opus_int32 len, opus_int32 Fs) OPUS_ARG_NONNULL(1);
5836b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org
5846b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/** Gets the number of samples of an Opus packet.
585885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] dec <tt>OpusDecoder*</tt>: Decoder state
586885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] packet <tt>char*</tt>: Opus packet
587885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @param [in] len <tt>opus_int32</tt>: Length of packet
588885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @returns Number of samples
589885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type
590885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
591885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
592885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/**@}*/
593885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
594885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** @defgroup opus_repacketizer Repacketizer
595885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  * @{
596885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
5976b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * The repacketizer can be used to merge multiple Opus packets into a single
5986b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * packet or alternatively to split Opus packets that have previously been
5996b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * merged. Splitting valid Opus packets is always guaranteed to succeed,
6006b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * whereas merging valid packets only succeeds if all frames have the same
6016b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * mode, bandwidth, and frame size, and when the total duration of the merged
6026b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * packet is no more than 120 ms.
6036b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * The repacketizer currently only operates on elementary Opus
6046b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * streams. It will not manipualte multistream packets successfully, except in
6056b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * the degenerate case where they consist of data from a single stream.
6066b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *
6076b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * The repacketizing process starts with creating a repacketizer state, either
6086b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * by calling opus_repacketizer_create() or by allocating the memory yourself,
6096b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * e.g.,
6106b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @code
6116b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * OpusRepacketizer *rp;
6126b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * rp = (OpusRepacketizer*)malloc(opus_repacketizer_get_size());
6136b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * if (rp != NULL)
6146b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     opus_repacketizer_init(rp);
6156b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @endcode
6166b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *
6176b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * Then the application should submit packets with opus_repacketizer_cat(),
6186b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * extract new packets with opus_repacketizer_out() or
6196b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * opus_repacketizer_out_range(), and then reset the state for the next set of
6206b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * input packets via opus_repacketizer_init().
6216b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *
6226b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * For example, to split a sequence of packets into individual frames:
6236b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @code
6246b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * unsigned char *data;
6256b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * int len;
6266b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * while (get_next_packet(&data, &len))
6276b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * {
6286b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   unsigned char out[1276];
6296b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   opus_int32 out_len;
6306b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   int nb_frames;
6316b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   int err;
6326b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   int i;
6336b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   err = opus_repacketizer_cat(rp, data, len);
6346b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   if (err != OPUS_OK)
6356b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   {
6366b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     release_packet(data);
6376b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     return err;
6386b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   }
6396b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   nb_frames = opus_repacketizer_get_nb_frames(rp);
6406b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   for (i = 0; i < nb_frames; i++)
6416b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   {
6426b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     out_len = opus_repacketizer_out_range(rp, i, i+1, out, sizeof(out));
6436b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     if (out_len < 0)
6446b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     {
6456b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *        release_packet(data);
6466b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *        return (int)out_len;
6476b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     }
6486b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     output_next_packet(out, out_len);
6496b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   }
6506b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   opus_repacketizer_init(rp);
6516b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   release_packet(data);
6526b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * }
6536b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @endcode
6546b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *
6556b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * Alternatively, to combine a sequence of frames into packets that each
6566b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * contain up to <code>TARGET_DURATION_MS</code> milliseconds of data:
6576b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @code
6586b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * // The maximum number of packets with duration TARGET_DURATION_MS occurs
6596b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * // when the frame size is 2.5 ms, for a total of (TARGET_DURATION_MS*2/5)
6606b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * // packets.
6616b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * unsigned char *data[(TARGET_DURATION_MS*2/5)+1];
6626b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * opus_int32 len[(TARGET_DURATION_MS*2/5)+1];
6636b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * int nb_packets;
6646b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * unsigned char out[1277*(TARGET_DURATION_MS*2/2)];
6656b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * opus_int32 out_len;
6666b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * int prev_toc;
6676b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * nb_packets = 0;
6686b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * while (get_next_packet(data+nb_packets, len+nb_packets))
6696b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * {
6706b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   int nb_frames;
6716b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   int err;
6726b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   nb_frames = opus_packet_get_nb_frames(data[nb_packets], len[nb_packets]);
6736b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   if (nb_frames < 1)
6746b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   {
6756b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     release_packets(data, nb_packets+1);
6766b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     return nb_frames;
6776b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   }
6786b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   nb_frames += opus_repacketizer_get_nb_frames(rp);
6796b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   // If adding the next packet would exceed our target, or it has an
6806b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   // incompatible TOC sequence, output the packets we already have before
6816b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   // submitting it.
6826b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   // N.B., The nb_packets > 0 check ensures we've submitted at least one
6836b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   // packet since the last call to opus_repacketizer_init(). Otherwise a
6846b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   // single packet longer than TARGET_DURATION_MS would cause us to try to
6856b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   // output an (invalid) empty packet. It also ensures that prev_toc has
6866b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   // been set to a valid value. Additionally, len[nb_packets] > 0 is
6876b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   // guaranteed by the call to opus_packet_get_nb_frames() above, so the
6886b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   // reference to data[nb_packets][0] should be valid.
6896b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   if (nb_packets > 0 && (
6906b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *       ((prev_toc & 0xFC) != (data[nb_packets][0] & 0xFC)) ||
6916b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *       opus_packet_get_samples_per_frame(data[nb_packets], 48000)*nb_frames >
6926b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *       TARGET_DURATION_MS*48))
6936b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   {
6946b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     out_len = opus_repacketizer_out(rp, out, sizeof(out));
6956b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     if (out_len < 0)
6966b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     {
6976b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *        release_packets(data, nb_packets+1);
6986b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *        return (int)out_len;
6996b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     }
7006b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     output_next_packet(out, out_len);
7016b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     opus_repacketizer_init(rp);
7026b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     release_packets(data, nb_packets);
7036b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     data[0] = data[nb_packets];
7046b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     len[0] = len[nb_packets];
7056b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     nb_packets = 0;
7066b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   }
7076b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   err = opus_repacketizer_cat(rp, data[nb_packets], len[nb_packets]);
7086b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   if (err != OPUS_OK)
7096b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   {
7106b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     release_packets(data, nb_packets+1);
7116b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     return err;
7126b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   }
7136b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   prev_toc = data[nb_packets][0];
7146b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   nb_packets++;
7156b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * }
7166b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * // Output the final, partial packet.
7176b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * if (nb_packets > 0)
7186b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * {
7196b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   out_len = opus_repacketizer_out(rp, out, sizeof(out));
7206b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   release_packets(data, nb_packets);
7216b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   if (out_len < 0)
7226b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *     return (int)out_len;
7236b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *   output_next_packet(out, out_len);
7246b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * }
7256b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @endcode
726885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  *
7276b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * An alternate way of merging packets is to simply call opus_repacketizer_cat()
7286b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * unconditionally until it fails. At that point, the merged packet can be
7296b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * obtained with opus_repacketizer_out() and the input packet for which
7306b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * opus_repacketizer_cat() needs to be re-added to a newly reinitialized
7316b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * repacketizer state.
732885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  */
733885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
734885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgtypedef struct OpusRepacketizer OpusRepacketizer;
735885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
7366b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/** Gets the size of an <code>OpusRepacketizer</code> structure.
7376b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @returns The size in bytes.
7386b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  */
739885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_size(void);
740885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
7416b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/** (Re)initializes a previously allocated repacketizer state.
7426b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * The state must be at least the size returned by opus_repacketizer_get_size().
7436b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * This can be used for applications which use their own allocator instead of
7446b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * malloc().
7456b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * It must also be called to reset the queue of packets waiting to be
7466b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * repacketized, which is necessary if the maximum packet duration of 120 ms
7476b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * is reached or if you wish to submit packets with a different Opus
7486b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * configuration (coding mode, audio bandwidth, frame size, or channel count).
7496b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * Failure to do so will prevent a new packet from being added with
7506b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * opus_repacketizer_cat().
7516b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @see opus_repacketizer_create
7526b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @see opus_repacketizer_get_size
7536b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @see opus_repacketizer_cat
7546b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state to
7556b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                       (re)initialize.
7566b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @returns A pointer to the same repacketizer state that was passed in.
7576b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  */
758885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OpusRepacketizer *opus_repacketizer_init(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1);
759885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
7606b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/** Allocates memory and initializes the new repacketizer with
7616b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org * opus_repacketizer_init().
7626b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  */
763885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusRepacketizer *opus_repacketizer_create(void);
764885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
7656b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/** Frees an <code>OpusRepacketizer</code> allocated by
7666b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * opus_repacketizer_create().
7676b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param[in] rp <tt>OpusRepacketizer*</tt>: State to be freed.
7686b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  */
769885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT void opus_repacketizer_destroy(OpusRepacketizer *rp);
770885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
7716b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/** Add a packet to the current repacketizer state.
7726b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * This packet must match the configuration of any packets already submitted
7736b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * for repacketization since the last call to opus_repacketizer_init().
7746b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * This means that it must have the same coding mode, audio bandwidth, frame
7756b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * size, and channel count.
7766b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * This can be checked in advance by examining the top 6 bits of the first
7776b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * byte of the packet, and ensuring they match the top 6 bits of the first
7786b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * byte of any previously submitted packet.
7796b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * The total duration of audio in the repacketizer state also must not exceed
7806b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * 120 ms, the maximum duration of a single packet, after adding this packet.
7816b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *
7826b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * The contents of the current repacketizer state can be extracted into new
7836b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * packets using opus_repacketizer_out() or opus_repacketizer_out_range().
7846b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *
7856b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * In order to add a packet with a different configuration or to add more
7866b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * audio beyond 120 ms, you must clear the repacketizer state by calling
7876b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * opus_repacketizer_init().
7886b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * If a packet is too large to add to the current repacketizer state, no part
7896b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * of it is added, even if it contains multiple frames, some of which might
7906b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * fit.
7916b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * If you wish to be able to add parts of such packets, you should first use
7926b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * another repacketizer to split the packet into pieces and add them
7936b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * individually.
7946b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @see opus_repacketizer_out_range
7956b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @see opus_repacketizer_out
7966b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @see opus_repacketizer_init
7976b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state to which to
7986b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                       add the packet.
7996b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param[in] data <tt>const unsigned char*</tt>: The packet data.
8006b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                The application must ensure
8016b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                this pointer remains valid
8026b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                until the next call to
8036b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                opus_repacketizer_init() or
8046b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                opus_repacketizer_destroy().
8056b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param len <tt>opus_int32</tt>: The number of bytes in the packet data.
8066b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @returns An error code indicating whether or not the operation succeeded.
8076b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @retval #OPUS_OK The packet's contents have been added to the repacketizer
8086b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                  state.
8096b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @retval #OPUS_INVALID_PACKET The packet did not have a valid TOC sequence,
8106b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                              the packet's TOC sequence was not compatible
8116b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                              with previously submitted packets (because
8126b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                              the coding mode, audio bandwidth, frame size,
8136b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                              or channel count did not match), or adding
8146b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                              this packet would increase the total amount of
8156b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                              audio stored in the repacketizer state to more
8166b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                              than 120 ms.
8176b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  */
818885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT int opus_repacketizer_cat(OpusRepacketizer *rp, const unsigned char *data, opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);
819885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
8206b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org
8216b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/** Construct a new packet from data previously submitted to the repacketizer
8226b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * state via opus_repacketizer_cat().
8236b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state from which to
8246b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                       construct the new packet.
8256b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param begin <tt>int</tt>: The index of the first frame in the current
8266b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                            repacketizer state to include in the output.
8276b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param end <tt>int</tt>: One past the index of the last frame in the
8286b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                          current repacketizer state to include in the
8296b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                          output.
8306b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param[out] data <tt>const unsigned char*</tt>: The buffer in which to
8316b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 store the output packet.
8326b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param maxlen <tt>opus_int32</tt>: The maximum number of bytes to store in
8336b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    the output buffer. In order to guarantee
8346b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    success, this should be at least
8356b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    <code>1276</code> for a single frame,
8366b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    or for multiple frames,
8376b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    <code>1277*(end-begin)</code>.
8386b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    However, <code>1*(end-begin)</code> plus
8396b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    the size of all packet data submitted to
8406b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    the repacketizer since the last call to
8416b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    opus_repacketizer_init() or
8426b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    opus_repacketizer_create() is also
8436b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    sufficient, and possibly much smaller.
8446b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @returns The total size of the output packet on success, or an error code
8456b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *          on failure.
8466b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @retval #OPUS_BAD_ARG <code>[begin,end)</code> was an invalid range of
8476b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                       frames (begin < 0, begin >= end, or end >
8486b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                       opus_repacketizer_get_nb_frames()).
8496b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the
8506b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                complete output packet.
8516b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  */
852885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out_range(OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);
853885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
8546b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/** Return the total number of frames contained in packet data submitted to
8556b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * the repacketizer state so far via opus_repacketizer_cat() since the last
8566b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * call to opus_repacketizer_init() or opus_repacketizer_create().
8576b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * This defines the valid range of packets that can be extracted with
8586b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * opus_repacketizer_out_range() or opus_repacketizer_out().
8596b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state containing the
8606b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                       frames.
8616b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @returns The total number of frames contained in the packet data submitted
8626b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *          to the repacketizer state.
8636b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  */
864885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_nb_frames(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1);
865885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
8666b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/** Construct a new packet from data previously submitted to the repacketizer
8676b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * state via opus_repacketizer_cat().
8686b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * This is a convenience routine that returns all the data submitted so far
8696b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * in a single packet.
8706b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * It is equivalent to calling
8716b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @code
8726b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * opus_repacketizer_out_range(rp, 0, opus_repacketizer_get_nb_frames(rp),
8736b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                             data, maxlen)
8746b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @endcode
8756b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state from which to
8766b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                       construct the new packet.
8776b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param[out] data <tt>const unsigned char*</tt>: The buffer in which to
8786b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                                 store the output packet.
8796b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @param maxlen <tt>opus_int32</tt>: The maximum number of bytes to store in
8806b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    the output buffer. In order to guarantee
8816b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    success, this should be at least
8826b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    <code>1277*opus_repacketizer_get_nb_frames(rp)</code>.
8836b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    However,
8846b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    <code>1*opus_repacketizer_get_nb_frames(rp)</code>
8856b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    plus the size of all packet data
8866b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    submitted to the repacketizer since the
8876b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    last call to opus_repacketizer_init() or
8886b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    opus_repacketizer_create() is also
8896b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                    sufficient, and possibly much smaller.
8906b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @returns The total size of the output packet on success, or an error code
8916b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *          on failure.
8926b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  * @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the
8936b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  *                                complete output packet.
8946b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org  */
895885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1);
896885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
897885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/**@}*/
898885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
899885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef __cplusplus
900885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
901885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
902885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
903885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif /* OPUS_H */
904