• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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