blob: 78c1b0ffdc7c130f826b38768656e317a01ec4f4 [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
18 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
19 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*/
27
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
Ralph Giles1c1cf7d2011-09-13 23:56:42 -070092/** Deallocate a multstream encoder state */
Jean-Marc Valind4e93402011-08-27 00:52:26 -040093OPUS_EXPORT void opus_multistream_encoder_destroy(OpusMSEncoder *st);
94
Ralph Giles1c1cf7d2011-09-13 23:56:42 -070095/** Get or set options on a multistream encoder state */
Jean-Marc Valind4e93402011-08-27 00:52:26 -040096OPUS_EXPORT int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...);
97
Ralph Giles1c1cf7d2011-09-13 23:56:42 -070098/** Allocate and initialize a multistream decoder state object.
99 * Call opus_multistream_decoder_destroy() to release
100 * this object when finished. */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400101OPUS_EXPORT OpusMSDecoder *opus_multistream_decoder_create(
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700102 opus_int32 Fs, /**< Sampling rate to decode at (Hz) */
103 int channels, /**< Number of channels to decode */
104 int streams, /**< Total number of coded streams in the multistream */
105 int coupled_streams, /**< Number of coupled (stereo) streams in the multistream */
106 unsigned char *mapping, /**< Stream to channel mapping table */
107 int *error /**< Error code */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400108);
109
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700110/** Intialize a previously allocated decoder state object. */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400111OPUS_EXPORT int opus_multistream_decoder_init(
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700112 OpusMSDecoder *st, /**< Encoder state */
113 opus_int32 Fs, /**< Sample rate of input signal (Hz) */
114 int channels, /**< Number of channels in the input signal */
115 int streams, /**< Total number of coded streams */
116 int coupled_streams, /**< Number of coupled (stereo) streams */
117 unsigned char *mapping /**< Stream to channel mapping table */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400118);
119
Ralph Giles1b951962011-09-07 10:40:25 -0700120/** Returns the number of samples decoded or a negative error code */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400121OPUS_EXPORT int opus_multistream_decode(
Ralph Giles1b951962011-09-07 10:40:25 -0700122 OpusMSDecoder *st, /**< Decoder state */
123 const unsigned char *data, /**< Input payload. Use a NULL pointer to indicate packet loss */
124 int len, /**< Number of bytes in payload */
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700125 opus_int16 *pcm, /**< Output signal, samples interleaved in channel order . length is frame_size*channels */
Ralph Giles1b951962011-09-07 10:40:25 -0700126 int frame_size, /**< Number of samples per frame of input signal */
127 int decode_fec /**< Flag (0/1) to request that any in-band forward error correction data be */
128 /**< decoded. If no such data is available the frame is decoded as if it were lost. */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400129);
130
Ralph Giles1b951962011-09-07 10:40:25 -0700131/** Returns the number of samples decoded or a negative error code */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400132OPUS_EXPORT int opus_multistream_decode_float(
Ralph Giles1b951962011-09-07 10:40:25 -0700133 OpusMSDecoder *st, /**< Decoder state */
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700134 const unsigned char *data, /**< Input payload buffer. Use a NULL pointer to indicate packet loss */
135 int len, /**< Number of payload bytes in data */
136 float *pcm, /**< Buffer for the output signal (interleaved iin channel order). length is frame_size*channels */
Ralph Giles1b951962011-09-07 10:40:25 -0700137 int frame_size, /**< Number of samples per frame of input signal */
138 int decode_fec /**< Flag (0/1) to request that any in-band forward error correction data be */
139 /**< decoded. If no such data is available the frame is decoded as if it were lost. */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400140);
141
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700142
143/** Get or set options on a multistream decoder state */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400144OPUS_EXPORT int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...);
145
Ralph Giles1c1cf7d2011-09-13 23:56:42 -0700146/** Deallocate a multistream decoder state object */
Jean-Marc Valind4e93402011-08-27 00:52:26 -0400147OPUS_EXPORT void opus_multistream_decoder_destroy(OpusMSDecoder *st);
148
149#endif /* OPUS_MULTISTREAM_H */