jitter buffer: histogram shifting function (not used yet)
[speexdsp.git] / libspeex / speex.c
1 /* Copyright (C) 2002 Jean-Marc Valin 
2    File: speex.c
3
4    Basic Speex functions
5
6    Redistribution and use in source and binary forms, with or without
7    modification, are permitted provided that the following conditions
8    are met:
9    
10    - Redistributions of source code must retain the above copyright
11    notice, this list of conditions and the following disclaimer.
12    
13    - Redistributions in binary form must reproduce the above copyright
14    notice, this list of conditions and the following disclaimer in the
15    documentation and/or other materials provided with the distribution.
16    
17    - Neither the name of the Xiph.org Foundation nor the names of its
18    contributors may be used to endorse or promote products derived from
19    this software without specific prior written permission.
20    
21    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
25    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
33 */
34
35 #ifdef HAVE_CONFIG_H
36 #include "config.h"
37 #endif
38
39 #include "modes.h"
40 #include <math.h>
41 #include "os_support.h"
42
43 #ifndef NULL
44 #define NULL 0
45 #endif
46
47 #define MAX_IN_SAMPLES 640
48
49
50
51 void *speex_encoder_init(const SpeexMode *mode)
52 {
53    return mode->enc_init(mode);
54 }
55
56 void *speex_decoder_init(const SpeexMode *mode)
57 {
58    return mode->dec_init(mode);
59 }
60
61 void speex_encoder_destroy(void *state)
62 {
63    (*((SpeexMode**)state))->enc_destroy(state);
64 }
65
66 void speex_decoder_destroy(void *state)
67 {
68    (*((SpeexMode**)state))->dec_destroy(state);
69 }
70
71
72
73 int speex_encode_native(void *state, spx_word16_t *in, SpeexBits *bits)
74 {
75    return (*((SpeexMode**)state))->enc(state, in, bits);
76 }
77
78 int speex_decode_native(void *state, SpeexBits *bits, spx_word16_t *out)
79 {
80    return (*((SpeexMode**)state))->dec(state, bits, out);
81 }
82
83
84
85 #ifdef FIXED_POINT
86
87 int speex_encode(void *state, float *in, SpeexBits *bits)
88 {
89    int i;
90    spx_int32_t N;
91    spx_int16_t short_in[MAX_IN_SAMPLES];
92    speex_encoder_ctl(state, SPEEX_GET_FRAME_SIZE, &N);
93    for (i=0;i<N;i++)
94    {
95       if (in[i]>32767.f)
96          short_in[i] = 32767;
97       else if (in[i]<-32768.f)
98          short_in[i] = -32768;
99       else
100          short_in[i] = (spx_int16_t)floor(.5+in[i]);
101    }
102    return (*((SpeexMode**)state))->enc(state, short_in, bits);
103 }
104
105 int speex_encode_int(void *state, spx_int16_t *in, SpeexBits *bits)
106 {
107    SpeexMode *mode;
108    mode = *(SpeexMode**)state;
109    return (mode)->enc(state, in, bits);
110 }
111
112 int speex_decode(void *state, SpeexBits *bits, float *out)
113 {
114    int i, ret;
115    spx_int32_t N;
116    spx_int16_t short_out[MAX_IN_SAMPLES];
117    speex_decoder_ctl(state, SPEEX_GET_FRAME_SIZE, &N);
118    ret = (*((SpeexMode**)state))->dec(state, bits, short_out);
119    for (i=0;i<N;i++)
120       out[i] = short_out[i];
121    return ret;
122 }
123
124 int speex_decode_int(void *state, SpeexBits *bits, spx_int16_t *out)
125 {
126    SpeexMode *mode = *(SpeexMode**)state;
127    return (mode)->dec(state, bits, out);
128 }
129
130 #else
131
132 int speex_encode(void *state, float *in, SpeexBits *bits)
133 {
134    return (*((SpeexMode**)state))->enc(state, in, bits);
135 }
136
137 int speex_encode_int(void *state, spx_int16_t *in, SpeexBits *bits)
138 {
139    int i;
140    spx_int32_t N;
141    float float_in[MAX_IN_SAMPLES];
142    speex_encoder_ctl(state, SPEEX_GET_FRAME_SIZE, &N);
143    for (i=0;i<N;i++)
144       float_in[i] = in[i];
145    return (*((SpeexMode**)state))->enc(state, float_in, bits);
146 }
147
148 int speex_decode(void *state, SpeexBits *bits, float *out)
149 {
150    return (*((SpeexMode**)state))->dec(state, bits, out);
151 }
152
153 int speex_decode_int(void *state, SpeexBits *bits, spx_int16_t *out)
154 {
155    int i;
156    spx_int32_t N;
157    float float_out[MAX_IN_SAMPLES];
158    int ret;
159    speex_decoder_ctl(state, SPEEX_GET_FRAME_SIZE, &N);
160    ret = (*((SpeexMode**)state))->dec(state, bits, float_out);
161    for (i=0;i<N;i++)
162    {
163       if (float_out[i]>32767.f)
164          out[i] = 32767;
165       else if (float_out[i]<-32768.f)
166          out[i] = -32768;
167       else
168          out[i] = (spx_int16_t)floor(.5+float_out[i]);
169    }
170    return ret;
171 }
172 #endif
173
174
175
176 int speex_encoder_ctl(void *state, int request, void *ptr)
177 {
178    return (*((SpeexMode**)state))->enc_ctl(state, request, ptr);
179 }
180
181 int speex_decoder_ctl(void *state, int request, void *ptr)
182 {
183    return (*((SpeexMode**)state))->dec_ctl(state, request, ptr);
184 }
185
186
187
188 int nb_mode_query(const void *mode, int request, void *ptr)
189 {
190    const SpeexNBMode *m = (const SpeexNBMode*)mode;
191    
192    switch (request)
193    {
194    case SPEEX_MODE_FRAME_SIZE:
195       *((int*)ptr)=m->frameSize;
196       break;
197    case SPEEX_SUBMODE_BITS_PER_FRAME:
198       if (*((int*)ptr)==0)
199          *((int*)ptr) = NB_SUBMODE_BITS+1;
200       else if (m->submodes[*((int*)ptr)]==NULL)
201          *((int*)ptr) = -1;
202       else
203          *((int*)ptr) = m->submodes[*((int*)ptr)]->bits_per_frame;
204       break;
205    default:
206       speex_warning_int("Unknown nb_mode_query request: ", request);
207       return -1;
208    }
209    return 0;
210 }
211
212
213
214 int speex_lib_ctl(int request, void *ptr)
215 {
216    switch (request)
217    {
218       case SPEEX_LIB_GET_MAJOR_VERSION:
219          *((int*)ptr) = SPEEX_MAJOR_VERSION;
220          break;
221       case SPEEX_LIB_GET_MINOR_VERSION:
222          *((int*)ptr) = SPEEX_MINOR_VERSION;
223          break;
224       case SPEEX_LIB_GET_MICRO_VERSION:
225          *((int*)ptr) = SPEEX_MICRO_VERSION;
226          break;
227       case SPEEX_LIB_GET_EXTRA_VERSION:
228          *((const char**)ptr) = SPEEX_EXTRA_VERSION;
229          break;
230       case SPEEX_LIB_GET_VERSION_STRING:
231          *((const char**)ptr) = SPEEX_VERSION;
232          break;
233       /*case SPEEX_LIB_SET_ALLOC_FUNC:
234          break;
235       case SPEEX_LIB_GET_ALLOC_FUNC:
236          break;
237       case SPEEX_LIB_SET_FREE_FUNC:
238          break;
239       case SPEEX_LIB_GET_FREE_FUNC:
240          break;*/
241       default:
242          speex_warning_int("Unknown wb_mode_query request: ", request);
243          return -1;
244    }
245    return 0;
246 }