blob: ff33419894bd1129c9f2d5c52dffaa272b235989 [file] [log] [blame]
Jean-Marc Valind4e93402011-08-27 00:52:26 -04001/* Copyright (c) 2011 Xiph.Org Foundation
2 Written by Jean-Marc Valin */
3/*
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions
6 are met:
7
8 - Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
10
11 - Redistributions in binary form must reproduce the above copyright
12 notice, this list of conditions and the following disclaimer in the
13 documentation and/or other materials provided with the distribution.
14
15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Jean-Marc Valincb05e7c2012-04-20 16:40:24 -040018 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
19 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
Jean-Marc Valind4e93402011-08-27 00:52:26 -040020 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*/
27
Ralph Giles1b951962011-09-07 10:40:25 -070028/**
29 * @file opus_multistream.h
30 * @brief Opus reference implementation multistream API
31 */
Jean-Marc Valind4e93402011-08-27 00:52:26 -040032
33#ifndef OPUS_MULTISTREAM_H
34#define OPUS_MULTISTREAM_H
35
36#include "opus.h"
37
38typedef struct OpusMSEncoder OpusMSEncoder;
39typedef struct OpusMSDecoder OpusMSDecoder;
40
Jean-Marc Valinaf50ce92011-09-11 20:13:47 -040041#define __opus_check_encstate_ptr(ptr) ((ptr) + ((ptr) - (OpusEncoder**)(ptr)))
42#define __opus_check_decstate_ptr(ptr) ((ptr) + ((ptr) - (OpusDecoder**)(ptr)))
43
44#define OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST 5120
45#define OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST 5122
46
47#define OPUS_MULTISTREAM_GET_ENCODER_STATE(x,y) OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST, __opus_check_int(x), __opus_check_encstate_ptr(y)
48#define OPUS_MULTISTREAM_GET_DECODER_STATE(x,y) OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST, __opus_check_int(x), __opus_check_decstate_ptr(y)
49
Ralph Giles1c1cf7d2011-09-13 23:56:42 -070050/** Allocate and initialize a multistream encoder state object.
51 * Call opus_multistream_encoder_destroy() to release
52 * this object when finished. */
Jean-Marc Valind4e93402011-08-27 00:52:26 -040053OPUS_EXPORT OpusMSEncoder *opus_multistream_encoder_create(
Ralph Giles1c1cf7d2011-09-13 23:56:42 -070054 opus_int32 Fs, /**< Sampling rate of input signal (Hz) */
55 int channels, /**< Number of channels in the input signal */
56 int streams, /**< Total number of streams to encode from the input */
57 int coupled_streams, /**< Number of coupled (stereo) streams to encode */
58 unsigned char *mapping, /**< Encoded mapping between channels and streams */
59 int application, /**< Coding mode (OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO) */
60 int *error /**< Error code */
Jean-Marc Valind4e93402011-08-27 00:52:26 -040061);
62
Ralph Giles1c1cf7d2011-09-13 23:56:42 -070063/** Initialize an already allocated multistream encoder state. */
Jean-Marc Valind4e93402011-08-27 00:52:26 -040064OPUS_EXPORT int opus_multistream_encoder_init(
Ralph Giles1c1cf7d2011-09-13 23:56:42 -070065 OpusMSEncoder *st, /**< Encoder state */
66 opus_int32 Fs, /**< Sampling rate of input signal (Hz) */
67 int channels, /**< Number of channels in the input signal */
68 int streams, /**< Total number of streams to encode from the input */
69 int coupled_streams, /**< Number of coupled (stereo) streams to encode */
70 unsigned char *mapping, /**< Encoded mapping between channels and streams */
71 int application /**< Coding mode (OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO) */
Jean-Marc Valind4e93402011-08-27 00:52:26 -040072);
73
Ralph Giles1c1cf7d2011-09-13 23:56:42 -070074/** Returns length of the data payload (in bytes) or a negative error code */
Jean-Marc Valind4e93402011-08-27 00:52:26 -040075OPUS_EXPORT int opus_multistream_encode(
Ralph Giles1b951962011-09-07 10:40:25 -070076 OpusMSEncoder *st, /**< Encoder state */
Ralph Giles1c1cf7d2011-09-13 23:56:42 -070077 const opus_int16 *pcm, /**< Input signal as interleaved samples. Length is frame_size*channels */
Ralph Giles1b951962011-09-07 10:40:25 -070078 int frame_size, /**< Number of samples per frame of input signal */
Ralph Giles1c1cf7d2011-09-13 23:56:42 -070079 unsigned char *data, /**< Output buffer for the compressed payload (no more than max_data_bytes long) */
Ralph Giles1b951962011-09-07 10:40:25 -070080 int max_data_bytes /**< Allocated memory for payload; don't use for controlling bitrate */
Jean-Marc Valind4e93402011-08-27 00:52:26 -040081);
82
Ralph Giles1c1cf7d2011-09-13 23:56:42 -070083/** Returns length of the data payload (in bytes) or a negative error code. */
Jean-Marc Valind4e93402011-08-27 00:52:26 -040084OPUS_EXPORT int opus_multistream_encode_float(
Ralph Giles1c1cf7d2011-09-13 23:56:42 -070085 OpusMSEncoder *st, /**< Encoder state */
86 const float *pcm, /**< Input signal interleaved in channel order. length is frame_size*channels */
87 int frame_size, /**< Number of samples per frame of input signal */
88 unsigned char *data, /**< Output buffer for the compressed payload (no more than max_data_bytes long) */
89 int max_data_bytes /**< Allocated memory for payload; don't use for controlling bitrate */
Jean-Marc Valind4e93402011-08-27 00:52:26 -040090 );
91
Gregory Maxwellc81b5102011-10-30 02:16:25 -040092/** Gets the size of an OpusMSEncoder structure.
93 * @returns size
94 */
95OPUS_EXPORT opus_int32 opus_multistream_encoder_get_size(
96 int streams, /**< Total number of coded streams */
97 int coupled_streams /**< Number of coupled (stereo) streams */
98);
99
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700100/** Deallocate a multstream encoder state */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400101OPUS_EXPORT void opus_multistream_encoder_destroy(OpusMSEncoder *st);
102
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700103/** Get or set options on a multistream encoder state */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400104OPUS_EXPORT int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...);
105
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700106/** Allocate and initialize a multistream decoder state object.
107 * Call opus_multistream_decoder_destroy() to release
108 * this object when finished. */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400109OPUS_EXPORT OpusMSDecoder *opus_multistream_decoder_create(
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700110 opus_int32 Fs, /**< Sampling rate to decode at (Hz) */
111 int channels, /**< Number of channels to decode */
112 int streams, /**< Total number of coded streams in the multistream */
113 int coupled_streams, /**< Number of coupled (stereo) streams in the multistream */
114 unsigned char *mapping, /**< Stream to channel mapping table */
115 int *error /**< Error code */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400116);
117
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700118/** Intialize a previously allocated decoder state object. */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400119OPUS_EXPORT int opus_multistream_decoder_init(
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700120 OpusMSDecoder *st, /**< Encoder state */
121 opus_int32 Fs, /**< Sample rate of input signal (Hz) */
122 int channels, /**< Number of channels in the input signal */
123 int streams, /**< Total number of coded streams */
124 int coupled_streams, /**< Number of coupled (stereo) streams */
125 unsigned char *mapping /**< Stream to channel mapping table */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400126);
127
Ralph Giles1b951962011-09-07 10:40:25 -0700128/** Returns the number of samples decoded or a negative error code */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400129OPUS_EXPORT int opus_multistream_decode(
Ralph Giles1b951962011-09-07 10:40:25 -0700130 OpusMSDecoder *st, /**< Decoder state */
131 const unsigned char *data, /**< Input payload. Use a NULL pointer to indicate packet loss */
132 int len, /**< Number of bytes in payload */
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700133 opus_int16 *pcm, /**< Output signal, samples interleaved in channel order . length is frame_size*channels */
Ralph Giles1b951962011-09-07 10:40:25 -0700134 int frame_size, /**< Number of samples per frame of input signal */
135 int decode_fec /**< Flag (0/1) to request that any in-band forward error correction data be */
136 /**< decoded. If no such data is available the frame is decoded as if it were lost. */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400137);
138
Ralph Giles1b951962011-09-07 10:40:25 -0700139/** Returns the number of samples decoded or a negative error code */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400140OPUS_EXPORT int opus_multistream_decode_float(
Ralph Giles1b951962011-09-07 10:40:25 -0700141 OpusMSDecoder *st, /**< Decoder state */
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700142 const unsigned char *data, /**< Input payload buffer. Use a NULL pointer to indicate packet loss */
143 int len, /**< Number of payload bytes in data */
144 float *pcm, /**< Buffer for the output signal (interleaved iin channel order). length is frame_size*channels */
Ralph Giles1b951962011-09-07 10:40:25 -0700145 int frame_size, /**< Number of samples per frame of input signal */
146 int decode_fec /**< Flag (0/1) to request that any in-band forward error correction data be */
147 /**< decoded. If no such data is available the frame is decoded as if it were lost. */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400148);
149
Gregory Maxwellc81b5102011-10-30 02:16:25 -0400150/** Gets the size of an OpusMSDecoder structure.
151 * @returns size
152 */
153OPUS_EXPORT opus_int32 opus_multistream_decoder_get_size(
154 int streams, /**< Total number of coded streams */
155 int coupled_streams /**< Number of coupled (stereo) streams */
156);
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700157
158/** Get or set options on a multistream decoder state */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400159OPUS_EXPORT int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...);
160
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700161/** Deallocate a multistream decoder state object */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400162OPUS_EXPORT void opus_multistream_decoder_destroy(OpusMSDecoder *st);
163
164#endif /* OPUS_MULTISTREAM_H */