• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_FIX_INTERFACE_ISACFIX_H_
12 #define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_INTERFACE_ISACFIX_H_
13 
14 /*
15  * Define the fixpoint numeric formats
16  */
17 #include "typedefs.h"
18 
19 
20 typedef struct {
21   void *dummy;
22 } ISACFIX_MainStruct;
23 
24 
25 #if defined(__cplusplus)
26 extern "C" {
27 #endif
28 
29 
30   /**************************************************************************
31    * WebRtcIsacfix_AssignSize(...)
32    *
33    *  Functions used when malloc is not allowed
34    *  Output the number of bytes needed to allocate for iSAC struct.
35    *
36    */
37 
38   WebRtc_Word16 WebRtcIsacfix_AssignSize(int *sizeinbytes);
39 
40   /**************************************************************************
41    * WebRtcIsacfix_Assign(...)
42    *
43    * Functions used when malloc is not allowed, it
44    * places a struct at the given address.
45    *
46    * Input:
47    *      - *ISAC_main_inst   : a pointer to the coder instance.
48    *      - ISACFIX_inst_Addr : address of the memory where a space is
49    *                            for iSAC structure.
50    *
51    * Return value             : 0 - Ok
52    *                           -1 - Error
53    */
54 
55   WebRtc_Word16 WebRtcIsacfix_Assign(ISACFIX_MainStruct **inst,
56                                      void *ISACFIX_inst_Addr);
57 
58   /****************************************************************************
59    * WebRtcIsacfix_Create(...)
60    *
61    * This function creates an ISAC instance, which will contain the state
62    * information for one coding/decoding channel.
63    *
64    * Input:
65    *      - *ISAC_main_inst   : a pointer to the coder instance.
66    *
67    * Return value             : 0 - Ok
68    *                           -1 - Error
69    */
70 
71   WebRtc_Word16 WebRtcIsacfix_Create(ISACFIX_MainStruct **ISAC_main_inst);
72 
73 
74   /****************************************************************************
75    * WebRtcIsacfix_Free(...)
76    *
77    * This function frees the ISAC instance created at the beginning.
78    *
79    * Input:
80    *      - ISAC_main_inst    : a ISAC instance.
81    *
82    * Return value             :  0 - Ok
83    *                            -1 - Error
84    */
85 
86   WebRtc_Word16 WebRtcIsacfix_Free(ISACFIX_MainStruct *ISAC_main_inst);
87 
88 
89   /****************************************************************************
90    * WebRtcIsacfix_EncoderInit(...)
91    *
92    * This function initializes an ISAC instance prior to the encoder calls.
93    *
94    * Input:
95    *     - ISAC_main_inst     : ISAC instance.
96    *     - CodingMode         : 0 - Bit rate and frame length are automatically
97    *                                adjusted to available bandwidth on
98    *                                transmission channel.
99    *                            1 - User sets a frame length and a target bit
100    *                                rate which is taken as the maximum short-term
101    *                                average bit rate.
102    *
103    * Return value             :  0 - Ok
104    *                            -1 - Error
105    */
106 
107   WebRtc_Word16 WebRtcIsacfix_EncoderInit(ISACFIX_MainStruct *ISAC_main_inst,
108                                           WebRtc_Word16  CodingMode);
109 
110 
111   /****************************************************************************
112    * WebRtcIsacfix_Encode(...)
113    *
114    * This function encodes 10ms frame(s) and inserts it into a package.
115    * Input speech length has to be 160 samples (10ms). The encoder buffers those
116    * 10ms frames until it reaches the chosen Framesize (480 or 960 samples
117    * corresponding to 30 or 60 ms frames), and then proceeds to the encoding.
118    *
119    * Input:
120    *      - ISAC_main_inst    : ISAC instance.
121    *      - speechIn          : input speech vector.
122    *
123    * Output:
124    *      - encoded           : the encoded data vector
125    *
126    * Return value             : >0 - Length (in bytes) of coded data
127    *                             0 - The buffer didn't reach the chosen framesize
128    *                                 so it keeps buffering speech samples.
129    *                            -1 - Error
130    */
131 
132   WebRtc_Word16 WebRtcIsacfix_Encode(ISACFIX_MainStruct *ISAC_main_inst,
133                                      const WebRtc_Word16 *speechIn,
134                                      WebRtc_Word16 *encoded);
135 
136 
137 
138   /****************************************************************************
139    * WebRtcIsacfix_EncodeNb(...)
140    *
141    * This function encodes 10ms narrow band (8 kHz sampling) frame(s) and inserts
142    * it into a package. Input speech length has to be 80 samples (10ms). The encoder
143    * interpolates into wide-band (16 kHz sampling) buffers those
144    * 10ms frames until it reaches the chosen Framesize (480 or 960 wide-band samples
145    * corresponding to 30 or 60 ms frames), and then proceeds to the encoding.
146    *
147    * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined
148    *
149    * Input:
150    *      - ISAC_main_inst    : ISAC instance.
151    *      - speechIn          : input speech vector.
152    *
153    * Output:
154    *      - encoded           : the encoded data vector
155    *
156    * Return value             : >0 - Length (in bytes) of coded data
157    *                             0 - The buffer didn't reach the chosen framesize
158    *                                 so it keeps buffering speech samples.
159    *                            -1 - Error
160    */
161 
162 
163 #ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
164   WebRtc_Word16 WebRtcIsacfix_EncodeNb(ISACFIX_MainStruct *ISAC_main_inst,
165                                        const WebRtc_Word16 *speechIn,
166                                        WebRtc_Word16 *encoded);
167 #endif //  WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
168 
169 
170 
171   /****************************************************************************
172    * WebRtcIsacfix_DecoderInit(...)
173    *
174    * This function initializes an ISAC instance prior to the decoder calls.
175    *
176    * Input:
177    *  - ISAC_main_inst : ISAC instance.
178    *
179    * Return value
180    *       :  0 - Ok
181    *         -1 - Error
182    */
183 
184   WebRtc_Word16 WebRtcIsacfix_DecoderInit(ISACFIX_MainStruct *ISAC_main_inst);
185 
186 
187   /****************************************************************************
188    * WebRtcIsacfix_UpdateBwEstimate1(...)
189    *
190    * This function updates the estimate of the bandwidth.
191    *
192    * Input:
193    *      - ISAC_main_inst    : ISAC instance.
194    *      - encoded           : encoded ISAC frame(s).
195    *      - packet_size       : size of the packet.
196    *      - rtp_seq_number    : the RTP number of the packet.
197    *      - arr_ts            : the arrival time of the packet (from NetEq)
198    *                            in samples.
199    *
200    * Return value             : 0 - Ok
201    *                           -1 - Error
202    */
203 
204   WebRtc_Word16 WebRtcIsacfix_UpdateBwEstimate1(ISACFIX_MainStruct *ISAC_main_inst,
205                                                 const WebRtc_UWord16 *encoded,
206                                                 WebRtc_Word32  packet_size,
207                                                 WebRtc_UWord16 rtp_seq_number,
208                                                 WebRtc_UWord32 arr_ts);
209 
210   /****************************************************************************
211    * WebRtcIsacfix_UpdateBwEstimate(...)
212    *
213    * This function updates the estimate of the bandwidth.
214    *
215    * Input:
216    *      - ISAC_main_inst    : ISAC instance.
217    *      - encoded           : encoded ISAC frame(s).
218    *      - packet_size       : size of the packet.
219    *      - rtp_seq_number    : the RTP number of the packet.
220    *      - send_ts           : the send time of the packet from RTP header,
221    *                            in samples.
222    *      - arr_ts            : the arrival time of the packet (from NetEq)
223    *                            in samples.
224    *
225    * Return value             :  0 - Ok
226    *                            -1 - Error
227    */
228 
229   WebRtc_Word16 WebRtcIsacfix_UpdateBwEstimate(ISACFIX_MainStruct *ISAC_main_inst,
230                                                const WebRtc_UWord16   *encoded,
231                                                WebRtc_Word32          packet_size,
232                                                WebRtc_UWord16         rtp_seq_number,
233                                                WebRtc_UWord32         send_ts,
234                                                WebRtc_UWord32         arr_ts);
235 
236   /****************************************************************************
237    * WebRtcIsacfix_Decode(...)
238    *
239    * This function decodes an ISAC frame. Output speech length
240    * will be a multiple of 480 samples: 480 or 960 samples,
241    * depending on the framesize (30 or 60 ms).
242    *
243    * Input:
244    *      - ISAC_main_inst    : ISAC instance.
245    *      - encoded           : encoded ISAC frame(s)
246    *      - len               : bytes in encoded vector
247    *
248    * Output:
249    *      - decoded           : The decoded vector
250    *
251    * Return value             : >0 - number of samples in decoded vector
252    *                            -1 - Error
253    */
254 
255   WebRtc_Word16 WebRtcIsacfix_Decode(ISACFIX_MainStruct *ISAC_main_inst,
256                                      const WebRtc_UWord16 *encoded,
257                                      WebRtc_Word16 len,
258                                      WebRtc_Word16 *decoded,
259                                      WebRtc_Word16 *speechType);
260 
261 
262   /****************************************************************************
263    * WebRtcIsacfix_DecodeNb(...)
264    *
265    * This function decodes a ISAC frame in narrow-band (8 kHz sampling).
266    * Output speech length will be a multiple of 240 samples: 240 or 480 samples,
267    * depending on the framesize (30 or 60 ms).
268    *
269    * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined
270    *
271    * Input:
272    *      - ISAC_main_inst    : ISAC instance.
273    *      - encoded           : encoded ISAC frame(s)
274    *      - len               : bytes in encoded vector
275    *
276    * Output:
277    *      - decoded           : The decoded vector
278    *
279    * Return value             : >0 - number of samples in decoded vector
280    *                            -1 - Error
281    */
282 
283 #ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
284   WebRtc_Word16 WebRtcIsacfix_DecodeNb(ISACFIX_MainStruct *ISAC_main_inst,
285                                        const WebRtc_UWord16 *encoded,
286                                        WebRtc_Word16 len,
287                                        WebRtc_Word16 *decoded,
288                                        WebRtc_Word16 *speechType);
289 #endif //  WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
290 
291 
292   /****************************************************************************
293    * WebRtcIsacfix_DecodePlcNb(...)
294    *
295    * This function conducts PLC for ISAC frame(s) in narrow-band (8kHz sampling).
296    * Output speech length  will be "240*noOfLostFrames" samples
297    * that equevalent of "30*noOfLostFrames" millisecond.
298    *
299    * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined
300    *
301    * Input:
302    *      - ISAC_main_inst    : ISAC instance.
303    *      - noOfLostFrames    : Number of PLC frames (240 sample=30ms) to produce
304    *                            NOTE! Maximum number is 2 (480 samples = 60ms)
305    *
306    * Output:
307    *      - decoded           : The decoded vector
308    *
309    * Return value             : >0 - number of samples in decoded PLC vector
310    *                            -1 - Error
311    */
312 
313 #ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
314   WebRtc_Word16 WebRtcIsacfix_DecodePlcNb(ISACFIX_MainStruct *ISAC_main_inst,
315                                           WebRtc_Word16 *decoded,
316                                           WebRtc_Word16 noOfLostFrames );
317 #endif // WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
318 
319 
320 
321 
322   /****************************************************************************
323    * WebRtcIsacfix_DecodePlc(...)
324    *
325    * This function conducts PLC for ISAC frame(s) in wide-band (16kHz sampling).
326    * Output speech length  will be "480*noOfLostFrames" samples
327    * that is equevalent of "30*noOfLostFrames" millisecond.
328    *
329    * Input:
330    *      - ISAC_main_inst    : ISAC instance.
331    *      - noOfLostFrames    : Number of PLC frames (480sample = 30ms)
332    *                            to produce
333    *                            NOTE! Maximum number is 2 (960 samples = 60ms)
334    *
335    * Output:
336    *      - decoded           : The decoded vector
337    *
338    * Return value             : >0 - number of samples in decoded PLC vector
339    *                            -1 - Error
340    */
341 
342   WebRtc_Word16 WebRtcIsacfix_DecodePlc(ISACFIX_MainStruct *ISAC_main_inst,
343                                         WebRtc_Word16 *decoded,
344                                         WebRtc_Word16 noOfLostFrames );
345 
346 
347   /****************************************************************************
348    * WebRtcIsacfix_ReadFrameLen(...)
349    *
350    * This function returns the length of the frame represented in the packet.
351    *
352    * Input:
353    *      - encoded           : Encoded bitstream
354    *
355    * Output:
356    *      - frameLength       : Length of frame in packet (in samples)
357    *
358    */
359 
360   WebRtc_Word16 WebRtcIsacfix_ReadFrameLen(const WebRtc_Word16* encoded,
361                                            WebRtc_Word16* frameLength);
362 
363   /****************************************************************************
364    * WebRtcIsacfix_Control(...)
365    *
366    * This function sets the limit on the short-term average bit rate and the
367    * frame length. Should be used only in Instantaneous mode.
368    *
369    * Input:
370    *      - ISAC_main_inst    : ISAC instance.
371    *      - rate              : limit on the short-term average bit rate,
372    *                            in bits/second (between 10000 and 32000)
373    *      - framesize         : number of milliseconds per frame (30 or 60)
374    *
375    * Return value             : 0  - ok
376    *                           -1 - Error
377    */
378 
379   WebRtc_Word16 WebRtcIsacfix_Control(ISACFIX_MainStruct *ISAC_main_inst,
380                                       WebRtc_Word16          rate,
381                                       WebRtc_Word16          framesize);
382 
383 
384 
385   /****************************************************************************
386    * WebRtcIsacfix_ControlBwe(...)
387    *
388    * This function sets the initial values of bottleneck and frame-size if
389    * iSAC is used in channel-adaptive mode. Through this API, users can
390    * enforce a frame-size for all values of bottleneck. Then iSAC will not
391    * automatically change the frame-size.
392    *
393    *
394    * Input:
395    *      - ISAC_main_inst    : ISAC instance.
396    *      - rateBPS           : initial value of bottleneck in bits/second
397    *                            10000 <= rateBPS <= 32000 is accepted
398    *      - frameSizeMs       : number of milliseconds per frame (30 or 60)
399    *      - enforceFrameSize  : 1 to enforce the given frame-size through out
400    *                            the adaptation process, 0 to let iSAC change
401    *                            the frame-size if required.
402    *
403    * Return value             : 0  - ok
404    *                           -1 - Error
405    */
406 
407   WebRtc_Word16 WebRtcIsacfix_ControlBwe(ISACFIX_MainStruct *ISAC_main_inst,
408                                          WebRtc_Word16 rateBPS,
409                                          WebRtc_Word16 frameSizeMs,
410                                          WebRtc_Word16 enforceFrameSize);
411 
412 
413 
414   /****************************************************************************
415    * WebRtcIsacfix_version(...)
416    *
417    * This function returns the version number.
418    *
419    * Output:
420    *      - version      : Pointer to character string
421    *
422    */
423 
424   void WebRtcIsacfix_version(char *version);
425 
426 
427   /****************************************************************************
428    * WebRtcIsacfix_GetErrorCode(...)
429    *
430    * This function can be used to check the error code of an iSAC instance. When
431    * a function returns -1 a error code will be set for that instance. The
432    * function below extract the code of the last error that occured in the
433    * specified instance.
434    *
435    * Input:
436    *  - ISAC_main_inst        : ISAC instance
437    *
438    * Return value             : Error code
439    */
440 
441   WebRtc_Word16 WebRtcIsacfix_GetErrorCode(ISACFIX_MainStruct *ISAC_main_inst);
442 
443 
444   /****************************************************************************
445    * WebRtcIsacfix_GetUplinkBw(...)
446    *
447    * This function return iSAC send bitrate
448    *
449    * Input:
450    *      - ISAC_main_inst    : iSAC instance
451    *
452    * Return value             : <0 Error code
453    *                            else bitrate
454    */
455 
456   WebRtc_Word32 WebRtcIsacfix_GetUplinkBw(ISACFIX_MainStruct *ISAC_main_inst);
457 
458 
459   /****************************************************************************
460    * WebRtcIsacfix_SetMaxPayloadSize(...)
461    *
462    * This function sets a limit for the maximum payload size of iSAC. The same
463    * value is used both for 30 and 60 msec packets.
464    * The absolute max will be valid until next time the function is called.
465    * NOTE! This function may override the function WebRtcIsacfix_SetMaxRate()
466    *
467    * Input:
468    *      - ISAC_main_inst    : iSAC instance
469    *      - maxPayloadBytes   : maximum size of the payload in bytes
470    *                            valid values are between 100 and 400 bytes
471    *
472    *
473    * Return value             : 0 if sucessful
474    *                           -1 if error happens
475    */
476 
477   WebRtc_Word16 WebRtcIsacfix_SetMaxPayloadSize(ISACFIX_MainStruct *ISAC_main_inst,
478                                                 WebRtc_Word16 maxPayloadBytes);
479 
480 
481   /****************************************************************************
482    * WebRtcIsacfix_SetMaxRate(...)
483    *
484    * This function sets the maximum rate which the codec may not exceed for a
485    * singel packet. The maximum rate is set in bits per second.
486    * The codec has an absolute maximum rate of 53400 bits per second (200 bytes
487    * per 30 msec).
488    * It is possible to set a maximum rate between 32000 and 53400 bits per second.
489    *
490    * The rate limit is valid until next time the function is called.
491    *
492    * NOTE! Packet size will never go above the value set if calling
493    * WebRtcIsacfix_SetMaxPayloadSize() (default max packet size is 400 bytes).
494    *
495    * Input:
496    *      - ISAC_main_inst    : iSAC instance
497    *      - maxRateInBytes    : maximum rate in bits per second,
498    *                            valid values are 32000 to 53400 bits
499    *
500    * Return value             : 0 if sucessful
501    *                           -1 if error happens
502    */
503 
504   WebRtc_Word16 WebRtcIsacfix_SetMaxRate(ISACFIX_MainStruct *ISAC_main_inst,
505                                          WebRtc_Word32 maxRate);
506 
507   /****************************************************************************
508    * WebRtcIsacfix_CreateInternal(...)
509    *
510    * This function creates the memory that is used to store data in the encoder
511    *
512    * Input:
513    *      - *ISAC_main_inst   : a pointer to the coder instance.
514    *
515    * Return value             : 0 - Ok
516    *                           -1 - Error
517    */
518 
519   WebRtc_Word16 WebRtcIsacfix_CreateInternal(ISACFIX_MainStruct *ISAC_main_inst);
520 
521 
522   /****************************************************************************
523    * WebRtcIsacfix_FreeInternal(...)
524    *
525    * This function frees the internal memory for storing encoder data.
526    *
527    * Input:
528    *      - ISAC_main_inst        : an ISAC instance.
529    *
530    * Return value                 :  0 - Ok
531    *                                -1 - Error
532    */
533 
534   WebRtc_Word16 WebRtcIsacfix_FreeInternal(ISACFIX_MainStruct *ISAC_main_inst);
535 
536 
537   /****************************************************************************
538    * WebRtcIsacfix_GetNewBitStream(...)
539    *
540    * This function returns encoded data, with the recieved bwe-index in the
541    * stream. It should always return a complete packet, i.e. only called once
542    * even for 60 msec frames
543    *
544    * Input:
545    *      - ISAC_main_inst    : ISAC instance.
546    *      - bweIndex          : index of bandwidth estimate to put in new bitstream
547    *      - scale             : factor for rate change (0.4 ~=> half the rate, 1 no change).
548    *
549    * Output:
550    *      - encoded           : the encoded data vector
551    *
552    * Return value             : >0 - Length (in bytes) of coded data
553    *                            -1 - Error
554    */
555 
556   WebRtc_Word16 WebRtcIsacfix_GetNewBitStream(ISACFIX_MainStruct *ISAC_main_inst,
557                                               WebRtc_Word16          bweIndex,
558                                               float              scale,
559                                               WebRtc_Word16        *encoded);
560 
561 
562   /****************************************************************************
563    * WebRtcIsacfix_GetDownLinkBwIndex(...)
564    *
565    * This function returns index representing the Bandwidth estimate from
566    * other side to this side.
567    *
568    * Input:
569    *      - ISAC_main_inst    : iSAC struct
570    *
571    * Output:
572    *      - rateIndex         : Bandwidth estimate to transmit to other side.
573    *
574    */
575 
576   WebRtc_Word16 WebRtcIsacfix_GetDownLinkBwIndex(ISACFIX_MainStruct* ISAC_main_inst,
577                                                  WebRtc_Word16*     rateIndex);
578 
579 
580   /****************************************************************************
581    * WebRtcIsacfix_UpdateUplinkBw(...)
582    *
583    * This function takes an index representing the Bandwidth estimate from
584    * this side to other side and updates BWE.
585    *
586    * Input:
587    *      - ISAC_main_inst    : iSAC struct
588    *      - rateIndex         : Bandwidth estimate from other side.
589    *
590    */
591 
592   WebRtc_Word16 WebRtcIsacfix_UpdateUplinkBw(ISACFIX_MainStruct* ISAC_main_inst,
593                                              WebRtc_Word16     rateIndex);
594 
595 
596   /****************************************************************************
597    * WebRtcIsacfix_ReadBwIndex(...)
598    *
599    * This function returns the index of the Bandwidth estimate from the bitstream.
600    *
601    * Input:
602    *      - encoded           : Encoded bitstream
603    *
604    * Output:
605    *      - rateIndex         : Bandwidth estimate in bitstream
606    *
607    */
608 
609   WebRtc_Word16 WebRtcIsacfix_ReadBwIndex(const WebRtc_Word16* encoded,
610                                           WebRtc_Word16* rateIndex);
611 
612 
613   /****************************************************************************
614    * WebRtcIsacfix_GetNewFrameLen(...)
615    *
616    * This function return the next frame length (in samples) of iSAC.
617    *
618    * Input:
619    *      -ISAC_main_inst     : iSAC instance
620    *
621    * Return value             : frame lenght in samples
622    */
623 
624   WebRtc_Word16 WebRtcIsacfix_GetNewFrameLen(ISACFIX_MainStruct *ISAC_main_inst);
625 
626 
627 #if defined(__cplusplus)
628 }
629 #endif
630 
631 
632 
633 #endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_INTERFACE_ISACFIX_H_ */
634