1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 /******************************************************************
12
13 iLBC Speech Coder ANSI-C Source Code
14
15 iLBCInterface.c
16
17 ******************************************************************/
18
19 #include "ilbc.h"
20 #include "defines.h"
21 #include "init_encode.h"
22 #include "encode.h"
23 #include "init_decode.h"
24 #include "decode.h"
25 #include <stdlib.h>
26
27
WebRtcIlbcfix_EncoderAssign(iLBC_encinst_t ** iLBC_encinst,int16_t * ILBCENC_inst_Addr,int16_t * size)28 int16_t WebRtcIlbcfix_EncoderAssign(iLBC_encinst_t **iLBC_encinst, int16_t *ILBCENC_inst_Addr, int16_t *size) {
29 *iLBC_encinst=(iLBC_encinst_t*)ILBCENC_inst_Addr;
30 *size=sizeof(iLBC_Enc_Inst_t)/sizeof(int16_t);
31 if (*iLBC_encinst!=NULL) {
32 return(0);
33 } else {
34 return(-1);
35 }
36 }
37
WebRtcIlbcfix_DecoderAssign(iLBC_decinst_t ** iLBC_decinst,int16_t * ILBCDEC_inst_Addr,int16_t * size)38 int16_t WebRtcIlbcfix_DecoderAssign(iLBC_decinst_t **iLBC_decinst, int16_t *ILBCDEC_inst_Addr, int16_t *size) {
39 *iLBC_decinst=(iLBC_decinst_t*)ILBCDEC_inst_Addr;
40 *size=sizeof(iLBC_Dec_Inst_t)/sizeof(int16_t);
41 if (*iLBC_decinst!=NULL) {
42 return(0);
43 } else {
44 return(-1);
45 }
46 }
47
WebRtcIlbcfix_EncoderCreate(iLBC_encinst_t ** iLBC_encinst)48 int16_t WebRtcIlbcfix_EncoderCreate(iLBC_encinst_t **iLBC_encinst) {
49 *iLBC_encinst=(iLBC_encinst_t*)malloc(sizeof(iLBC_Enc_Inst_t));
50 if (*iLBC_encinst!=NULL) {
51 WebRtcSpl_Init();
52 return(0);
53 } else {
54 return(-1);
55 }
56 }
57
WebRtcIlbcfix_DecoderCreate(iLBC_decinst_t ** iLBC_decinst)58 int16_t WebRtcIlbcfix_DecoderCreate(iLBC_decinst_t **iLBC_decinst) {
59 *iLBC_decinst=(iLBC_decinst_t*)malloc(sizeof(iLBC_Dec_Inst_t));
60 if (*iLBC_decinst!=NULL) {
61 WebRtcSpl_Init();
62 return(0);
63 } else {
64 return(-1);
65 }
66 }
67
WebRtcIlbcfix_EncoderFree(iLBC_encinst_t * iLBC_encinst)68 int16_t WebRtcIlbcfix_EncoderFree(iLBC_encinst_t *iLBC_encinst) {
69 free(iLBC_encinst);
70 return(0);
71 }
72
WebRtcIlbcfix_DecoderFree(iLBC_decinst_t * iLBC_decinst)73 int16_t WebRtcIlbcfix_DecoderFree(iLBC_decinst_t *iLBC_decinst) {
74 free(iLBC_decinst);
75 return(0);
76 }
77
78
WebRtcIlbcfix_EncoderInit(iLBC_encinst_t * iLBCenc_inst,int16_t mode)79 int16_t WebRtcIlbcfix_EncoderInit(iLBC_encinst_t *iLBCenc_inst, int16_t mode)
80 {
81 if ((mode==20)||(mode==30)) {
82 WebRtcIlbcfix_InitEncode((iLBC_Enc_Inst_t*) iLBCenc_inst, mode);
83 return(0);
84 } else {
85 return(-1);
86 }
87 }
88
WebRtcIlbcfix_Encode(iLBC_encinst_t * iLBCenc_inst,const int16_t * speechIn,int16_t len,int16_t * encoded)89 int16_t WebRtcIlbcfix_Encode(iLBC_encinst_t *iLBCenc_inst, const int16_t *speechIn, int16_t len, int16_t *encoded) {
90
91 int16_t pos = 0;
92 int16_t encpos = 0;
93
94 if ((len != ((iLBC_Enc_Inst_t*)iLBCenc_inst)->blockl) &&
95 #ifdef SPLIT_10MS
96 (len != 80) &&
97 #endif
98 (len != 2*((iLBC_Enc_Inst_t*)iLBCenc_inst)->blockl) &&
99 (len != 3*((iLBC_Enc_Inst_t*)iLBCenc_inst)->blockl))
100 {
101 /* A maximum of 3 frames/packet is allowed */
102 return(-1);
103 } else {
104
105 /* call encoder */
106 while (pos<len) {
107 WebRtcIlbcfix_EncodeImpl((uint16_t*) &encoded[encpos], &speechIn[pos], (iLBC_Enc_Inst_t*) iLBCenc_inst);
108 #ifdef SPLIT_10MS
109 pos += 80;
110 if(((iLBC_Enc_Inst_t*)iLBCenc_inst)->section == 0)
111 #else
112 pos += ((iLBC_Enc_Inst_t*)iLBCenc_inst)->blockl;
113 #endif
114 encpos += ((iLBC_Enc_Inst_t*)iLBCenc_inst)->no_of_words;
115 }
116 return (encpos*2);
117 }
118 }
119
WebRtcIlbcfix_DecoderInit(iLBC_decinst_t * iLBCdec_inst,int16_t mode)120 int16_t WebRtcIlbcfix_DecoderInit(iLBC_decinst_t *iLBCdec_inst, int16_t mode) {
121 if ((mode==20)||(mode==30)) {
122 WebRtcIlbcfix_InitDecode((iLBC_Dec_Inst_t*) iLBCdec_inst, mode, 1);
123 return(0);
124 } else {
125 return(-1);
126 }
127 }
WebRtcIlbcfix_DecoderInit20Ms(iLBC_decinst_t * iLBCdec_inst)128 int16_t WebRtcIlbcfix_DecoderInit20Ms(iLBC_decinst_t *iLBCdec_inst) {
129 WebRtcIlbcfix_InitDecode((iLBC_Dec_Inst_t*) iLBCdec_inst, 20, 1);
130 return(0);
131 }
WebRtcIlbcfix_Decoderinit30Ms(iLBC_decinst_t * iLBCdec_inst)132 int16_t WebRtcIlbcfix_Decoderinit30Ms(iLBC_decinst_t *iLBCdec_inst) {
133 WebRtcIlbcfix_InitDecode((iLBC_Dec_Inst_t*) iLBCdec_inst, 30, 1);
134 return(0);
135 }
136
137
WebRtcIlbcfix_Decode(iLBC_decinst_t * iLBCdec_inst,const int16_t * encoded,int16_t len,int16_t * decoded,int16_t * speechType)138 int16_t WebRtcIlbcfix_Decode(iLBC_decinst_t *iLBCdec_inst,
139 const int16_t *encoded,
140 int16_t len,
141 int16_t *decoded,
142 int16_t *speechType)
143 {
144 int i=0;
145 /* Allow for automatic switching between the frame sizes
146 (although you do get some discontinuity) */
147 if ((len==((iLBC_Dec_Inst_t*)iLBCdec_inst)->no_of_bytes)||
148 (len==2*((iLBC_Dec_Inst_t*)iLBCdec_inst)->no_of_bytes)||
149 (len==3*((iLBC_Dec_Inst_t*)iLBCdec_inst)->no_of_bytes)) {
150 /* ok, do nothing */
151 } else {
152 /* Test if the mode has changed */
153 if (((iLBC_Dec_Inst_t*)iLBCdec_inst)->mode==20) {
154 if ((len==NO_OF_BYTES_30MS)||
155 (len==2*NO_OF_BYTES_30MS)||
156 (len==3*NO_OF_BYTES_30MS)) {
157 WebRtcIlbcfix_InitDecode(((iLBC_Dec_Inst_t*)iLBCdec_inst), 30, ((iLBC_Dec_Inst_t*)iLBCdec_inst)->use_enhancer);
158 } else {
159 /* Unsupported frame length */
160 return(-1);
161 }
162 } else {
163 if ((len==NO_OF_BYTES_20MS)||
164 (len==2*NO_OF_BYTES_20MS)||
165 (len==3*NO_OF_BYTES_20MS)) {
166 WebRtcIlbcfix_InitDecode(((iLBC_Dec_Inst_t*)iLBCdec_inst), 20, ((iLBC_Dec_Inst_t*)iLBCdec_inst)->use_enhancer);
167 } else {
168 /* Unsupported frame length */
169 return(-1);
170 }
171 }
172 }
173
174 while ((i*((iLBC_Dec_Inst_t*)iLBCdec_inst)->no_of_bytes)<len) {
175 WebRtcIlbcfix_DecodeImpl(&decoded[i*((iLBC_Dec_Inst_t*)iLBCdec_inst)->blockl], (const uint16_t*) &encoded[i*((iLBC_Dec_Inst_t*)iLBCdec_inst)->no_of_words], (iLBC_Dec_Inst_t*) iLBCdec_inst, 1);
176 i++;
177 }
178 /* iLBC does not support VAD/CNG yet */
179 *speechType=1;
180 return(i*((iLBC_Dec_Inst_t*)iLBCdec_inst)->blockl);
181 }
182
WebRtcIlbcfix_Decode20Ms(iLBC_decinst_t * iLBCdec_inst,const int16_t * encoded,int16_t len,int16_t * decoded,int16_t * speechType)183 int16_t WebRtcIlbcfix_Decode20Ms(iLBC_decinst_t *iLBCdec_inst,
184 const int16_t *encoded,
185 int16_t len,
186 int16_t *decoded,
187 int16_t *speechType)
188 {
189 int i=0;
190 if ((len==((iLBC_Dec_Inst_t*)iLBCdec_inst)->no_of_bytes)||
191 (len==2*((iLBC_Dec_Inst_t*)iLBCdec_inst)->no_of_bytes)||
192 (len==3*((iLBC_Dec_Inst_t*)iLBCdec_inst)->no_of_bytes)) {
193 /* ok, do nothing */
194 } else {
195 return(-1);
196 }
197
198 while ((i*((iLBC_Dec_Inst_t*)iLBCdec_inst)->no_of_bytes)<len) {
199 WebRtcIlbcfix_DecodeImpl(&decoded[i*((iLBC_Dec_Inst_t*)iLBCdec_inst)->blockl], (const uint16_t*) &encoded[i*((iLBC_Dec_Inst_t*)iLBCdec_inst)->no_of_words], (iLBC_Dec_Inst_t*) iLBCdec_inst, 1);
200 i++;
201 }
202 /* iLBC does not support VAD/CNG yet */
203 *speechType=1;
204 return(i*((iLBC_Dec_Inst_t*)iLBCdec_inst)->blockl);
205 }
206
WebRtcIlbcfix_Decode30Ms(iLBC_decinst_t * iLBCdec_inst,const int16_t * encoded,int16_t len,int16_t * decoded,int16_t * speechType)207 int16_t WebRtcIlbcfix_Decode30Ms(iLBC_decinst_t *iLBCdec_inst,
208 const int16_t *encoded,
209 int16_t len,
210 int16_t *decoded,
211 int16_t *speechType)
212 {
213 int i=0;
214 if ((len==((iLBC_Dec_Inst_t*)iLBCdec_inst)->no_of_bytes)||
215 (len==2*((iLBC_Dec_Inst_t*)iLBCdec_inst)->no_of_bytes)||
216 (len==3*((iLBC_Dec_Inst_t*)iLBCdec_inst)->no_of_bytes)) {
217 /* ok, do nothing */
218 } else {
219 return(-1);
220 }
221
222 while ((i*((iLBC_Dec_Inst_t*)iLBCdec_inst)->no_of_bytes)<len) {
223 WebRtcIlbcfix_DecodeImpl(&decoded[i*((iLBC_Dec_Inst_t*)iLBCdec_inst)->blockl], (const uint16_t*) &encoded[i*((iLBC_Dec_Inst_t*)iLBCdec_inst)->no_of_words], (iLBC_Dec_Inst_t*) iLBCdec_inst, 1);
224 i++;
225 }
226 /* iLBC does not support VAD/CNG yet */
227 *speechType=1;
228 return(i*((iLBC_Dec_Inst_t*)iLBCdec_inst)->blockl);
229 }
230
WebRtcIlbcfix_DecodePlc(iLBC_decinst_t * iLBCdec_inst,int16_t * decoded,int16_t noOfLostFrames)231 int16_t WebRtcIlbcfix_DecodePlc(iLBC_decinst_t *iLBCdec_inst, int16_t *decoded, int16_t noOfLostFrames) {
232 int i;
233 uint16_t dummy;
234
235 for (i=0;i<noOfLostFrames;i++) {
236 /* call decoder */
237 WebRtcIlbcfix_DecodeImpl(&decoded[i*((iLBC_Dec_Inst_t*)iLBCdec_inst)->blockl], &dummy, (iLBC_Dec_Inst_t*) iLBCdec_inst, 0);
238 }
239 return (noOfLostFrames*((iLBC_Dec_Inst_t*)iLBCdec_inst)->blockl);
240 }
241
WebRtcIlbcfix_NetEqPlc(iLBC_decinst_t * iLBCdec_inst,int16_t * decoded,int16_t noOfLostFrames)242 int16_t WebRtcIlbcfix_NetEqPlc(iLBC_decinst_t *iLBCdec_inst, int16_t *decoded, int16_t noOfLostFrames) {
243
244 /* Two input parameters not used, but needed for function pointers in NetEQ */
245 (void)(decoded = NULL);
246 (void)(noOfLostFrames = 0);
247
248 WebRtcSpl_MemSetW16(((iLBC_Dec_Inst_t*)iLBCdec_inst)->enh_buf, 0, ENH_BUFL);
249 ((iLBC_Dec_Inst_t*)iLBCdec_inst)->prev_enh_pl = 2;
250
251 return (0);
252 }
253
WebRtcIlbcfix_version(char * version)254 void WebRtcIlbcfix_version(char *version)
255 {
256 strcpy((char*)version, "1.1.1");
257 }
258