Note: We no longer publish the latest version of our code here. We primarily use a kumc-bmi github organization. The heron ETL repository, in particular, is not public. Peers in the informatics community should see MultiSiteDev for details on requesting access.

source: webrtc/webrtc/modules/audio_coding/codecs/ilbc/ilbc.c @ 0:4bda6873e34c

pub_scrub_3792 tip
Last change on this file since 0:4bda6873e34c was 0:4bda6873e34c, checked in by Michael Prittie <mprittie@…>, 6 years ago

Scrubbed password for publication.

File size: 7.9 KB
Line 
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
28int16_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
38int16_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
48int16_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
58int16_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
68int16_t WebRtcIlbcfix_EncoderFree(iLBC_encinst_t *iLBC_encinst) {
69  free(iLBC_encinst);
70  return(0);
71}
72
73int16_t WebRtcIlbcfix_DecoderFree(iLBC_decinst_t *iLBC_decinst) {
74  free(iLBC_decinst);
75  return(0);
76}
77
78
79int16_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
89int16_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
120int16_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}
128int16_t WebRtcIlbcfix_DecoderInit20Ms(iLBC_decinst_t *iLBCdec_inst) {
129  WebRtcIlbcfix_InitDecode((iLBC_Dec_Inst_t*) iLBCdec_inst, 20, 1);
130  return(0);
131}
132int16_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
138int16_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
183int16_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
207int16_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
231int16_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
242int16_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
254void WebRtcIlbcfix_version(char *version)
255{
256  strcpy((char*)version, "1.1.1");
257}
Note: See TracBrowser for help on using the repository browser.