1 /*
2  *  Copyright (c) 2011 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 #ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INTERFACE_ISAC_H_
12 #define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INTERFACE_ISAC_H_
13 
14 /*
15  * Define the fixed-point numeric formats
16  */
17 #include "typedefs.h"
18 
19 typedef struct WebRtcISACStruct    ISACStruct;
20 
21 enum IsacSamplingRate {kIsacWideband = 16,  kIsacSuperWideband = 32};
22 
23 
24 #if defined(__cplusplus)
25 extern "C" {
26 #endif
27 
28   /******************************************************************************
29    * WebRtcIsac_AssignSize(...)
30    *
31    * This function returns the size of the ISAC instance, so that the instance
32    * can be created outside iSAC.
33    *
34    * Input:
35    *        - samplingRate      : sampling rate of the input/output audio.
36    *
37    * Output:
38    *        - sizeinbytes       : number of bytes needed to allocate for the
39    *                              instance.
40    *
41    * Return value               : 0 - Ok
42    *                             -1 - Error
43    */
44 
45   WebRtc_Word16 WebRtcIsac_AssignSize(
46       int* sizeinbytes);
47 
48 
49   /******************************************************************************
50    * WebRtcIsac_Assign(...)
51    *
52    * This function assignes the memory already created to the ISAC instance.
53    *
54    * Input:
55    *        - *ISAC_main_inst   : a pointer to the coder instance.
56    *        - samplingRate      : sampling rate of the input/output audio.
57    *        - ISAC_inst_Addr    : the already allocated memory, where we put the
58    *                              iSAC structure.
59    *
60    * Return value               : 0 - Ok
61    *                             -1 - Error
62    */
63 
64   WebRtc_Word16 WebRtcIsac_Assign(
65       ISACStruct** ISAC_main_inst,
66       void*        ISAC_inst_Addr);
67 
68 
69   /******************************************************************************
70    * WebRtcIsac_Create(...)
71    *
72    * This function creates an ISAC instance, which will contain the state
73    * information for one coding/decoding channel.
74    *
75    * Input:
76    *        - *ISAC_main_inst   : a pointer to the coder instance.
77    *
78    * Return value               : 0 - Ok
79    *                             -1 - Error
80    */
81 
82   WebRtc_Word16 WebRtcIsac_Create(
83       ISACStruct** ISAC_main_inst);
84 
85 
86   /******************************************************************************
87    * WebRtcIsac_Free(...)
88    *
89    * This function frees the ISAC instance created at the beginning.
90    *
91    * Input:
92    *        - ISAC_main_inst    : an ISAC instance.
93    *
94    * Return value               : 0 - Ok
95    *                             -1 - Error
96    */
97 
98   WebRtc_Word16 WebRtcIsac_Free(
99       ISACStruct* ISAC_main_inst);
100 
101 
102   /******************************************************************************
103    * WebRtcIsac_EncoderInit(...)
104    *
105    * This function initializes an ISAC instance prior to the encoder calls.
106    *
107    * Input:
108    *        - ISAC_main_inst    : ISAC instance.
109    *        - CodingMode        : 0 -> Bit rate and frame length are
110    *                                automatically adjusted to available bandwidth
111    *                                on transmission channel, just valid if codec
112    *                                is created to work in wideband mode.
113    *                              1 -> User sets a frame length and a target bit
114    *                                rate which is taken as the maximum
115    *                                short-term average bit rate.
116    *
117    * Return value               : 0 - Ok
118    *                             -1 - Error
119    */
120 
121   WebRtc_Word16 WebRtcIsac_EncoderInit(
122       ISACStruct* ISAC_main_inst,
123       WebRtc_Word16 CodingMode);
124 
125 
126   /******************************************************************************
127    * WebRtcIsac_Encode(...)
128    *
129    * This function encodes 10ms audio blocks and inserts it into a package.
130    * Input speech length has 160 samples if operating at 16 kHz sampling
131    * rate, or 320 if operating at 32 kHz sampling rate. The encoder buffers the
132    * input audio until the whole frame is buffered then proceeds with encoding.
133    *
134    *
135    * Input:
136    *        - ISAC_main_inst    : ISAC instance.
137    *        - speechIn          : input speech vector.
138    *
139    * Output:
140    *        - encoded           : the encoded data vector
141    *
142    * Return value:
143    *                            : >0 - Length (in bytes) of coded data
144    *                            :  0 - The buffer didn't reach the chosen
145    *                               frame-size so it keeps buffering speech
146    *                               samples.
147    *                            : -1 - Error
148    */
149 
150   WebRtc_Word16 WebRtcIsac_Encode(
151       ISACStruct*        ISAC_main_inst,
152       const WebRtc_Word16* speechIn,
153       WebRtc_Word16*       encoded);
154 
155 
156   /******************************************************************************
157    * WebRtcIsac_DecoderInit(...)
158    *
159    * This function initializes an ISAC instance prior to the decoder calls.
160    *
161    * Input:
162    *        - ISAC_main_inst    : ISAC instance.
163    *
164    * Return value
165    *                            : 0 - Ok
166    *                             -1 - Error
167    */
168 
169   WebRtc_Word16 WebRtcIsac_DecoderInit(
170       ISACStruct* ISAC_main_inst);
171 
172 
173   /******************************************************************************
174    * WebRtcIsac_UpdateBwEstimate(...)
175    *
176    * This function updates the estimate of the bandwidth.
177    *
178    * Input:
179    *        - ISAC_main_inst    : ISAC instance.
180    *        - encoded           : encoded ISAC frame(s).
181    *        - packet_size       : size of the packet.
182    *        - rtp_seq_number    : the RTP number of the packet.
183    *        - send_ts           : the RTP send timestamp, given in samples
184    *        - arr_ts            : the arrival time of the packet (from NetEq)
185    *                              in samples.
186    *
187    * Return value               : 0 - Ok
188    *                             -1 - Error
189    */
190 
191   WebRtc_Word16 WebRtcIsac_UpdateBwEstimate(
192       ISACStruct*         ISAC_main_inst,
193       const WebRtc_UWord16* encoded,
194       WebRtc_Word32         packet_size,
195       WebRtc_UWord16        rtp_seq_number,
196       WebRtc_UWord32        send_ts,
197       WebRtc_UWord32        arr_ts);
198 
199 
200   /******************************************************************************
201    * WebRtcIsac_Decode(...)
202    *
203    * This function decodes an ISAC frame. At 16 kHz sampling rate, the length
204    * of the output audio could be either 480 or 960 samples, equivalent to
205    * 30 or 60 ms respectively. At 32 kHz sampling rate, the length of the
206    * output audio is 960 samples, which is 30 ms.
207    *
208    * Input:
209    *        - ISAC_main_inst    : ISAC instance.
210    *        - encoded           : encoded ISAC frame(s).
211    *        - len               : bytes in encoded vector.
212    *
213    * Output:
214    *        - decoded           : The decoded vector.
215    *
216    * Return value               : >0 - number of samples in decoded vector.
217    *                              -1 - Error.
218    */
219 
220   WebRtc_Word16 WebRtcIsac_Decode(
221       ISACStruct*           ISAC_main_inst,
222       const WebRtc_UWord16* encoded,
223       WebRtc_Word16         len,
224       WebRtc_Word16*        decoded,
225       WebRtc_Word16*        speechType);
226 
227 
228   /******************************************************************************
229    * WebRtcIsac_DecodePlc(...)
230    *
231    * This function conducts PLC for ISAC frame(s). Output speech length
232    * will be a multiple of frames, i.e. multiples of 30 ms audio. Therefore,
233    * the output is multiple of 480 samples if operating at 16 kHz and multiple
234    * of 960 if operating at 32 kHz.
235    *
236    * Input:
237    *        - ISAC_main_inst    : ISAC instance.
238    *        - noOfLostFrames    : Number of PLC frames to produce.
239    *
240    * Output:
241    *        - decoded           : The decoded vector.
242    *
243    * Return value               : >0 - number of samples in decoded PLC vector
244    *                              -1 - Error
245    */
246 
247   WebRtc_Word16 WebRtcIsac_DecodePlc(
248       ISACStruct*  ISAC_main_inst,
249       WebRtc_Word16* decoded,
250       WebRtc_Word16  noOfLostFrames);
251 
252 
253   /******************************************************************************
254    * WebRtcIsac_Control(...)
255    *
256    * This function sets the limit on the short-term average bit-rate and the
257    * frame length. Should be used only in Instantaneous mode. At 16 kHz sampling
258    * rate, an average bit-rate between 10000 to 32000 bps is valid and a
259    * frame-size of 30 or 60 ms is acceptable. At 32 kHz, an average bit-rate
260    * between 10000 to 56000 is acceptable, and the valid frame-size is 30 ms.
261    *
262    * Input:
263    *        - ISAC_main_inst    : ISAC instance.
264    *        - rate              : limit on the short-term average bit rate,
265    *                              in bits/second.
266    *        - framesize         : frame-size in millisecond.
267    *
268    * Return value               : 0  - ok
269    *                             -1 - Error
270    */
271 
272   WebRtc_Word16 WebRtcIsac_Control(
273       ISACStruct*   ISAC_main_inst,
274       WebRtc_Word32 rate,
275       WebRtc_Word16 framesize);
276 
277 
278   /******************************************************************************
279    * WebRtcIsac_ControlBwe(...)
280    *
281    * This function sets the initial values of bottleneck and frame-size if
282    * iSAC is used in channel-adaptive mode. Therefore, this API is not
283    * applicable if the codec is created to operate in super-wideband mode.
284    *
285    * Through this API, users can enforce a frame-size for all values of
286    * bottleneck. Then iSAC will not automatically change the frame-size.
287    *
288    *
289    * Input:
290    *        - ISAC_main_inst    : ISAC instance.
291    *        - rateBPS           : initial value of bottleneck in bits/second
292    *                              10000 <= rateBPS <= 56000 is accepted
293    *                              For default bottleneck set rateBPS = 0
294    *        - frameSizeMs       : number of milliseconds per frame (30 or 60)
295    *        - enforceFrameSize  : 1 to enforce the given frame-size through
296    *                              out the adaptation process, 0 to let iSAC
297    *                              change the frame-size if required.
298    *
299    * Return value               : 0  - ok
300    *                             -1 - Error
301    */
302 
303   WebRtc_Word16 WebRtcIsac_ControlBwe(
304       ISACStruct* ISAC_main_inst,
305       WebRtc_Word32 rateBPS,
306       WebRtc_Word16 frameSizeMs,
307       WebRtc_Word16 enforceFrameSize);
308 
309 
310   /******************************************************************************
311    * WebRtcIsac_ReadFrameLen(...)
312    *
313    * This function returns the length of the frame represented in the packet.
314    *
315    * Input:
316    *        - encoded           : Encoded bit-stream
317    *
318    * Output:
319    *        - frameLength       : Length of frame in packet (in samples)
320    *
321    */
322 
323   WebRtc_Word16 WebRtcIsac_ReadFrameLen(
324       ISACStruct*          ISAC_main_inst,
325       const WebRtc_Word16* encoded,
326       WebRtc_Word16*       frameLength);
327 
328 
329   /******************************************************************************
330    * WebRtcIsac_version(...)
331    *
332    * This function returns the version number.
333    *
334    * Output:
335    *        - version      : Pointer to character string
336    *
337    */
338 
339   void WebRtcIsac_version(
340       char *version);
341 
342 
343   /******************************************************************************
344    * WebRtcIsac_GetErrorCode(...)
345    *
346    * This function can be used to check the error code of an iSAC instance. When
347    * a function returns -1 a error code will be set for that instance. The
348    * function below extract the code of the last error that occurred in the
349    * specified instance.
350    *
351    * Input:
352    *        - ISAC_main_inst    : ISAC instance
353    *
354    * Return value               : Error code
355    */
356 
357   WebRtc_Word16 WebRtcIsac_GetErrorCode(
358       ISACStruct* ISAC_main_inst);
359 
360 
361   /****************************************************************************
362    * WebRtcIsac_GetUplinkBw(...)
363    *
364    * This function outputs the target bottleneck of the codec. In
365    * channel-adaptive mode, the target bottleneck is specified through in-band
366    * signalling retreived by bandwidth estimator.
367    * In channel-independent, also called instantaneous mode, the target
368    * bottleneck is provided to the encoder by calling xxx_control(...). If
369    * xxx_control is never called the default values is returned. The default
370    * value for bottleneck at 16 kHz encoder sampling rate is 32000 bits/sec,
371    * and it is 56000 bits/sec for 32 kHz sampling rate.
372    * Note that the output is the iSAC internal operating bottleneck which might
373    * differ slightly from the one provided through xxx_control().
374    *
375    * Input:
376    *        - ISAC_main_inst    : iSAC instance
377    *
378    * Output:
379    *        - *bottleneck       : bottleneck in bits/sec
380    *
381    * Return value               : -1 if error happens
382    *                               0 bit-rates computed correctly.
383    */
384 
385   WebRtc_Word16 WebRtcIsac_GetUplinkBw(
386       ISACStruct*    ISAC_main_inst,
387       WebRtc_Word32* bottleneck);
388 
389 
390   /******************************************************************************
391    * WebRtcIsac_SetMaxPayloadSize(...)
392    *
393    * This function sets a limit for the maximum payload size of iSAC. The same
394    * value is used both for 30 and 60 ms packets. If the encoder sampling rate
395    * is 16 kHz the maximum payload size is between 120 and 400 bytes. If the
396    * encoder sampling rate is 32 kHz the maximum payload size is between 120
397    * and 600 bytes.
398    *
399    * If an out of range limit is used, the function returns -1, but the closest
400    * valid value will be applied.
401    *
402    * ---------------
403    * IMPORTANT NOTES
404    * ---------------
405    * The size of a packet is limited to the minimum of 'max-payload-size' and
406    * 'max-rate.' For instance, let's assume the max-payload-size is set to
407    * 170 bytes, and max-rate is set to 40 kbps. Note that a limit of 40 kbps
408    * translates to 150 bytes for 30ms frame-size & 300 bytes for 60ms
409    * frame-size. Then a packet with a frame-size of 30 ms is limited to 150,
410    * i.e. min(170, 150), and a packet with 60 ms frame-size is limited to
411    * 170 bytes, i.e. min(170, 300).
412    *
413    * Input:
414    *        - ISAC_main_inst    : iSAC instance
415    *        - maxPayloadBytes   : maximum size of the payload in bytes
416    *                              valid values are between 120 and 400 bytes
417    *                              if encoder sampling rate is 16 kHz. For
418    *                              32 kHz encoder sampling rate valid values
419    *                              are between 120 and 600 bytes.
420    *
421    * Return value               : 0 if successful
422    *                             -1 if error happens
423    */
424 
425   WebRtc_Word16 WebRtcIsac_SetMaxPayloadSize(
426       ISACStruct* ISAC_main_inst,
427       WebRtc_Word16 maxPayloadBytes);
428 
429 
430   /******************************************************************************
431    * WebRtcIsac_SetMaxRate(...)
432    *
433    * This function sets the maximum rate which the codec may not exceed for
434    * any signal packet. The maximum rate is defined and payload-size per
435    * frame-size in bits per second.
436    *
437    * The codec has a maximum rate of 53400 bits per second (200 bytes per 30
438    * ms) if the encoder sampling rate is 16kHz, and 160 kbps (600 bytes/30 ms)
439    * if the encoder sampling rate is 32 kHz.
440    *
441    * It is possible to set a maximum rate between 32000 and 53400 bits/sec
442    * in wideband mode, and 32000 to 160000 bits/sec in super-wideband mode.
443    *
444    * If an out of range limit is used, the function returns -1, but the closest
445    * valid value will be applied.
446    *
447    * ---------------
448    * IMPORTANT NOTES
449    * ---------------
450    * The size of a packet is limited to the minimum of 'max-payload-size' and
451    * 'max-rate.' For instance, let's assume the max-payload-size is set to
452    * 170 bytes, and max-rate is set to 40 kbps. Note that a limit of 40 kbps
453    * translates to 150 bytes for 30ms frame-size & 300 bytes for 60ms
454    * frame-size. Then a packet with a frame-size of 30 ms is limited to 150,
455    * i.e. min(170, 150), and a packet with 60 ms frame-size is limited to
456    * 170 bytes, min(170, 300).
457    *
458    * Input:
459    *        - ISAC_main_inst    : iSAC instance
460    *        - maxRate           : maximum rate in bits per second,
461    *                              valid values are 32000 to 53400 bits/sec in
462    *                              wideband mode, and 32000 to 160000 bits/sec in
463    *                              super-wideband mode.
464    *
465    * Return value               : 0 if successful
466    *                             -1 if error happens
467    */
468 
469   WebRtc_Word16 WebRtcIsac_SetMaxRate(
470       ISACStruct* ISAC_main_inst,
471       WebRtc_Word32 maxRate);
472 
473 
474   /******************************************************************************
475    * WebRtcIsac_DecSampRate()
476    * Return the sampling rate of the decoded audio.
477    *
478    * Input:
479    *        - ISAC_main_inst    : iSAC instance
480    *
481    * Return value               : enumerator representing sampling frequency
482    *                              associated with the decoder, i.e. the
483    *                              sampling rate of the decoded audio.
484    *
485    */
486 
487   enum IsacSamplingRate WebRtcIsac_DecSampRate(
488       ISACStruct*                ISAC_main_inst);
489 
490 
491   /******************************************************************************
492    * WebRtcIsac_EncSampRate()
493    *
494    * Input:
495    *        - ISAC_main_inst    : iSAC instance
496    *
497    * Return value               : enumerator representing sampling frequency
498    *                              associated with the encoder, the input audio
499    *                              is expected to be sampled at this rate.
500    *
501    */
502 
503   enum IsacSamplingRate WebRtcIsac_EncSampRate(
504       ISACStruct*                ISAC_main_inst);
505 
506 
507   /******************************************************************************
508    * WebRtcIsac_SetDecSampRate()
509    * Set the sampling rate of the decoder.  Initialization of the decoder WILL
510    * NOT overwrite the sampling rate of the encoder. The default value is 16 kHz
511    * which is set when the instance is created.
512    *
513    * Input:
514    *        - ISAC_main_inst    : iSAC instance
515    *        - sampRate          : enumerator specifying the sampling rate.
516    *
517    * Return value               : 0 if successful
518    *                             -1 if failed.
519    */
520 
521   WebRtc_Word16 WebRtcIsac_SetDecSampRate(
522       ISACStruct*           ISAC_main_inst,
523       enum IsacSamplingRate sampRate);
524 
525 
526   /******************************************************************************
527    * WebRtcIsac_SetEncSampRate()
528    * Set the sampling rate of the encoder. Initialization of the encoder WILL
529    * NOT overwrite the sampling rate of the encoder. The default value is 16 kHz
530    * which is set when the instance is created. The encoding-mode and the
531    * bottleneck remain unchanged by this call, however, the maximum rate and
532    * maximum payload-size will reset to their default value.
533    *
534    * Input:
535    *        - ISAC_main_inst    : iSAC instance
536    *        - sampRate          : enumerator specifying the sampling rate.
537    *
538    * Return value               : 0 if successful
539    *                             -1 if failed.
540    */
541 
542   WebRtc_Word16 WebRtcIsac_SetEncSampRate(
543       ISACStruct*           ISAC_main_inst,
544       enum IsacSamplingRate sampRate);
545 
546 
547 
548   /******************************************************************************
549    * WebRtcIsac_GetNewBitStream(...)
550    *
551    * This function returns encoded data, with the recieved bwe-index in the
552    * stream. If the rate is set to a value less than bottleneck of codec
553    * the new bistream will be re-encoded with the given target rate.
554    * It should always return a complete packet, i.e. only called once
555    * even for 60 msec frames.
556    *
557    * NOTE 1! This function does not write in the ISACStruct, it is not allowed.
558    * NOTE 2! Currently not implemented for SWB mode.
559    * NOTE 3! Rates larger than the bottleneck of the codec will be limited
560    *         to the current bottleneck.
561    *
562    * Input:
563    *        - ISAC_main_inst    : ISAC instance.
564    *        - bweIndex          : Index of bandwidth estimate to put in new
565    *                              bitstream
566    *        - rate              : target rate of the transcoder is bits/sec.
567    *                              Valid values are the accepted rate in iSAC,
568    *                              i.e. 10000 to 56000.
569    *        - isRCU                       : if the new bit-stream is an RCU stream.
570    *                              Note that the rate parameter always indicates
571    *                              the target rate of the main paylaod, regardless
572    *                              of 'isRCU' value.
573    *
574    * Output:
575    *        - encoded           : The encoded data vector
576    *
577    * Return value               : >0 - Length (in bytes) of coded data
578    *                              -1 - Error  or called in SWB mode
579    *                                 NOTE! No error code is written to
580    *                                 the struct since it is only allowed to read
581    *                                 the struct.
582    */
583   WebRtc_Word16 WebRtcIsac_GetNewBitStream(
584       ISACStruct*    ISAC_main_inst,
585       WebRtc_Word16  bweIndex,
586       WebRtc_Word16  jitterInfo,
587       WebRtc_Word32  rate,
588       WebRtc_Word16* encoded,
589       WebRtc_Word16  isRCU);
590 
591 
592 
593   /****************************************************************************
594    * WebRtcIsac_GetDownLinkBwIndex(...)
595    *
596    * This function returns index representing the Bandwidth estimate from
597    * other side to this side.
598    *
599    * Input:
600    *        - ISAC_main_inst    : iSAC struct
601    *
602    * Output:
603    *        - bweIndex          : Bandwidth estimate to transmit to other side.
604    *
605    */
606 
607   WebRtc_Word16 WebRtcIsac_GetDownLinkBwIndex(
608       ISACStruct*  ISAC_main_inst,
609       WebRtc_Word16* bweIndex,
610       WebRtc_Word16* jitterInfo);
611 
612 
613   /****************************************************************************
614    * WebRtcIsac_UpdateUplinkBw(...)
615    *
616    * This function takes an index representing the Bandwidth estimate from
617    * this side to other side and updates BWE.
618    *
619    * Input:
620    *        - ISAC_main_inst    : iSAC struct
621    *        - bweIndex          : Bandwidth estimate from other side.
622    *
623    */
624 
625   WebRtc_Word16 WebRtcIsac_UpdateUplinkBw(
626       ISACStruct* ISAC_main_inst,
627       WebRtc_Word16 bweIndex);
628 
629 
630   /****************************************************************************
631    * WebRtcIsac_ReadBwIndex(...)
632    *
633    * This function returns the index of the Bandwidth estimate from the bitstream.
634    *
635    * Input:
636    *        - encoded           : Encoded bitstream
637    *
638    * Output:
639    *        - frameLength       : Length of frame in packet (in samples)
640    *        - bweIndex         : Bandwidth estimate in bitstream
641    *
642    */
643 
644   WebRtc_Word16 WebRtcIsac_ReadBwIndex(
645       const WebRtc_Word16* encoded,
646       WebRtc_Word16*       bweIndex);
647 
648 
649 
650   /*******************************************************************************
651    * WebRtcIsac_GetNewFrameLen(...)
652    *
653    * returns the frame lenght (in samples) of the next packet. In the case of channel-adaptive
654    * mode, iSAC decides on its frame lenght based on the estimated bottleneck
655    * this allows a user to prepare for the next packet (at the encoder)
656    *
657    * The primary usage is in CE to make the iSAC works in channel-adaptive mode
658    *
659    * Input:
660    *        - ISAC_main_inst     : iSAC struct
661    *
662    * Return Value                : frame lenght in samples
663    *
664    */
665 
666   WebRtc_Word16 WebRtcIsac_GetNewFrameLen(
667       ISACStruct* ISAC_main_inst);
668 
669 
670   /****************************************************************************
671    *  WebRtcIsac_GetRedPayload(...)
672    *
673    *  Populates "encoded" with the redundant payload of the recently encoded
674    *  frame. This function has to be called once that WebRtcIsac_Encode(...)
675    *  returns a positive value. Regardless of the frame-size this function will
676    *  be called only once after encoding is completed.
677    *
678    * Input:
679    *      - ISAC_main_inst    : iSAC struct
680    *
681    * Output:
682    *        - encoded            : the encoded data vector
683    *
684    *
685    * Return value:
686    *                              : >0 - Length (in bytes) of coded data
687    *                              : -1 - Error
688    *
689    *
690    */
691   WebRtc_Word16 WebRtcIsac_GetRedPayload(
692       ISACStruct*    ISAC_main_inst,
693       WebRtc_Word16* encoded);
694 
695 
696   /****************************************************************************
697    * WebRtcIsac_DecodeRcu(...)
698    *
699    * This function decodes a redundant (RCU) iSAC frame. Function is called in
700    * NetEq with a stored RCU payload i case of packet loss. Output speech length
701    * will be a multiple of 480 samples: 480 or 960 samples,
702    * depending on the framesize (30 or 60 ms).
703    *
704    * Input:
705    *      - ISAC_main_inst     : ISAC instance.
706    *      - encoded            : encoded ISAC RCU frame(s)
707    *      - len                : bytes in encoded vector
708    *
709    * Output:
710    *      - decoded            : The decoded vector
711    *
712    * Return value              : >0 - number of samples in decoded vector
713    *                             -1 - Error
714    */
715   WebRtc_Word16 WebRtcIsac_DecodeRcu(
716       ISACStruct*           ISAC_main_inst,
717       const WebRtc_UWord16* encoded,
718       WebRtc_Word16         len,
719       WebRtc_Word16*        decoded,
720       WebRtc_Word16*        speechType);
721 
722 
723 #if defined(__cplusplus)
724 }
725 #endif
726 
727 
728 
729 #endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INTERFACE_ISAC_H_ */
730