isacfix.c revision fa65c851feeaebdfd514cacd453fd585b069b06d
1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
2715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Use of this source code is governed by a BSD-style license
5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  that can be found in the LICENSE file in the root of the source
6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  tree. An additional intellectual property rights grant can be found
7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  in the file PATENTS.  All contributing project authors may
8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  be found in the AUTHORS file in the root of the source tree.
9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
11470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
12470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * isacfix.c
13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
14470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This C file contains the functions for the ISAC API
15470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
16470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
17470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
18a15ea4965ef07f6aa074339f206383028e3b8898kma@webrtc.org#include "modules/audio_coding/codecs/isac/fix/interface/isacfix.h"
19715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org
20470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include <stdlib.h>
21470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
22a15ea4965ef07f6aa074339f206383028e3b8898kma@webrtc.org#include "modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.h"
23a15ea4965ef07f6aa074339f206383028e3b8898kma@webrtc.org#include "modules/audio_coding/codecs/isac/fix/source/codec.h"
24a15ea4965ef07f6aa074339f206383028e3b8898kma@webrtc.org#include "modules/audio_coding/codecs/isac/fix/source/entropy_coding.h"
25fa65c851feeaebdfd514cacd453fd585b069b06dkma@webrtc.org#include "modules/audio_coding/codecs/isac/fix/source/filterbank_internal.h"
26a15ea4965ef07f6aa074339f206383028e3b8898kma@webrtc.org#include "modules/audio_coding/codecs/isac/fix/source/lpc_masking_model.h"
27a15ea4965ef07f6aa074339f206383028e3b8898kma@webrtc.org#include "modules/audio_coding/codecs/isac/fix/source/structs.h"
28715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org#include "system_wrappers/interface/cpu_features_wrapper.h"
29470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
30470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
31470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/**************************************************************************
32470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_AssignSize(...)
33470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
34470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Functions used when malloc is not allowed
35470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Returns number of bytes needed to allocate for iSAC struct.
36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
37470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
38470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
39470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_AssignSize(int *sizeinbytes) {
40470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  *sizeinbytes=sizeof(ISACFIX_SubStruct)*2/sizeof(WebRtc_Word16);
41470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return(0);
42470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
43470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
44470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/***************************************************************************
45470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_Assign(...)
46470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
47470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Functions used when malloc is not allowed
48470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Place struct at given address
49470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
50470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * If successful, Return 0, else Return -1
51470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
52470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
53470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_Assign(ISACFIX_MainStruct **inst, void *ISACFIX_inst_Addr) {
54470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (ISACFIX_inst_Addr!=NULL) {
55470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    *inst = (ISACFIX_MainStruct*)ISACFIX_inst_Addr;
56470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    (*(ISACFIX_SubStruct**)inst)->errorcode = 0;
57470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    (*(ISACFIX_SubStruct**)inst)->initflag = 0;
58470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    (*(ISACFIX_SubStruct**)inst)->ISACenc_obj.SaveEnc_ptr = NULL;
59470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return(0);
60470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  } else {
61470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return(-1);
62470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
63470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
64470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
65470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
66470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef ISACFIX_NO_DYNAMIC_MEM
67470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
68470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
69470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_Create(...)
70470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
71470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function creates a ISAC instance, which will contain the state
72470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * information for one coding/decoding channel.
73470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
74470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
75470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - *ISAC_main_inst   : a pointer to the coder instance.
76470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
77470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             :  0 - Ok
78470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            -1 - Error
79470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
80470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
81470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_Create(ISACFIX_MainStruct **ISAC_main_inst)
82470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
83470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *tempo;
84470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  tempo = malloc(1 * sizeof(ISACFIX_SubStruct));
85470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  *ISAC_main_inst = (ISACFIX_MainStruct *)tempo;
86470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (*ISAC_main_inst!=NULL) {
87470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    (*(ISACFIX_SubStruct**)ISAC_main_inst)->errorcode = 0;
88470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    (*(ISACFIX_SubStruct**)ISAC_main_inst)->initflag = 0;
89470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    (*(ISACFIX_SubStruct**)ISAC_main_inst)->ISACenc_obj.SaveEnc_ptr = NULL;
90ac4d70de04acabec539753eef6e1252cb2dd1fbckma@webrtc.org    WebRtcSpl_Init();
91470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return(0);
92470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  } else {
93470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return(-1);
94470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
95470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
96470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
97470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
98470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
99470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_CreateInternal(...)
100470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
101470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function creates the memory that is used to store data in the encoder
102470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
103470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
104470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - *ISAC_main_inst   : a pointer to the coder instance.
105470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
106470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             :  0 - Ok
107470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            -1 - Error
108470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
109470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
110470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_CreateInternal(ISACFIX_MainStruct *ISAC_main_inst)
111470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
112470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
113470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
114470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to real structure */
115470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
116470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
117470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Allocate memory for storing encoder data */
118470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->ISACenc_obj.SaveEnc_ptr = malloc(1 * sizeof(ISAC_SaveEncData_t));
119470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
120470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (ISAC_inst->ISACenc_obj.SaveEnc_ptr!=NULL) {
121470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return(0);
122470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  } else {
123470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return(-1);
124470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
125470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
126470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
127470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
128470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
129470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
130470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
131470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
132470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
133470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_Free(...)
134470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
135470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function frees the ISAC instance created at the beginning.
136470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
137470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
138470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : a ISAC instance.
139470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
140470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             :  0 - Ok
141470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            -1 - Error
142470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
143470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
144470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_Free(ISACFIX_MainStruct *ISAC_main_inst)
145470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
146470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  free(ISAC_main_inst);
147470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return(0);
148470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
149470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
150470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
151470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_FreeInternal(...)
152470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
153470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function frees the internal memory for storing encoder data.
154470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
155470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
156470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *       - ISAC_main_inst    : a ISAC instance.
157470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
158470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value              :  0 - Ok
159470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                             -1 - Error
160470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
161470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
162470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_FreeInternal(ISACFIX_MainStruct *ISAC_main_inst)
163470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
164470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
165470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
166470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to real structure */
167470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
168470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
169470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Release memory */
170470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  free(ISAC_inst->ISACenc_obj.SaveEnc_ptr);
171470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
172470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return(0);
173470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
174470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
175470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
176715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org * WebRtcAecm_InitNeon(...)
177715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org *
178715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org * This function initializes function pointers for ARM Neon platform.
179715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org */
180715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org
181715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org#if (defined WEBRTC_DETECT_ARM_NEON || defined WEBRTC_ARCH_ARM_NEON)
182715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.orgstatic void WebRtcIsacfix_InitNeon(void) {
183715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org  WebRtcIsacfix_AutocorrFix = WebRtcIsacfix_AutocorrNeon;
184715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org  WebRtcIsacfix_FilterMaLoopFix = WebRtcIsacfix_FilterMaLoopNeon;
185a15ea4965ef07f6aa074339f206383028e3b8898kma@webrtc.org  WebRtcIsacfix_CalculateResidualEnergy =
186a15ea4965ef07f6aa074339f206383028e3b8898kma@webrtc.org      WebRtcIsacfix_CalculateResidualEnergyNeon;
187fa65c851feeaebdfd514cacd453fd585b069b06dkma@webrtc.org  WebRtcIsacfix_AllpassFilter2FixDec16 =
188fa65c851feeaebdfd514cacd453fd585b069b06dkma@webrtc.org      WebRtcIsacfix_AllpassFilter2FixDec16Neon;
189715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org}
190715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org#endif
191715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org
192715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org/****************************************************************************
193470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_EncoderInit(...)
194470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
195470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function initializes a ISAC instance prior to the encoder calls.
196470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
197470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
198470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : ISAC instance.
199470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - CodingMode        : 0 -> Bit rate and frame length are automatically
200470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                                 adjusted to available bandwidth on
201470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                                 transmission channel.
202470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            1 -> User sets a frame length and a target bit
203470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                                 rate which is taken as the maximum short-term
204470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                                 average bit rate.
205470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
206470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             :  0 - Ok
207470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            -1 - Error
208470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
209470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
210470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_EncoderInit(ISACFIX_MainStruct *ISAC_main_inst,
211470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        WebRtc_Word16  CodingMode)
212470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
213470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  int k;
214470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 statusInit;
215470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
216470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
217470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  statusInit = 0;
218470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to rela structure */
219470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
220470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
221470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* flag encoder init */
222470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->initflag |= 2;
223470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
224470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (CodingMode == 0)
225470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* Adaptive mode */
226470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->ISACenc_obj.new_framelength  = INITIAL_FRAMESAMPLES;
227470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  else if (CodingMode == 1)
228470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* Instantaneous mode */
229470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->ISACenc_obj.new_framelength = 480;    /* default for I-mode */
230470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  else {
231470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_DISALLOWED_CODING_MODE;
232470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    statusInit = -1;
233470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
234470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
235470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->CodingMode = CodingMode;
236470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
237470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIsacfix_InitMaskingEnc(&ISAC_inst->ISACenc_obj.maskfiltstr_obj);
238470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIsacfix_InitPreFilterbank(&ISAC_inst->ISACenc_obj.prefiltbankstr_obj);
239470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIsacfix_InitPitchFilter(&ISAC_inst->ISACenc_obj.pitchfiltstr_obj);
240470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIsacfix_InitPitchAnalysis(&ISAC_inst->ISACenc_obj.pitchanalysisstr_obj);
241470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
242470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
243470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIsacfix_InitBandwidthEstimator(&ISAC_inst->bwestimator_obj);
244470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIsacfix_InitRateModel(&ISAC_inst->ISACenc_obj.rate_data_obj);
245470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
246470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
247470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->ISACenc_obj.buffer_index   = 0;
248470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->ISACenc_obj.frame_nb    = 0;
249470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->ISACenc_obj.BottleNeck      = 32000; /* default for I-mode */
250470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->ISACenc_obj.MaxDelay    = 10;    /* default for I-mode */
251470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->ISACenc_obj.current_framesamples = 0;
252470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->ISACenc_obj.s2nr     = 0;
253470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->ISACenc_obj.MaxBits    = 0;
254470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->ISACenc_obj.bitstr_seed   = 4447;
255470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->ISACenc_obj.payloadLimitBytes30  = STREAM_MAXW16_30MS << 1;
256470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->ISACenc_obj.payloadLimitBytes60  = STREAM_MAXW16_60MS << 1;
257470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->ISACenc_obj.maxPayloadBytes      = STREAM_MAXW16_60MS << 1;
258470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->ISACenc_obj.maxRateInBytes       = STREAM_MAXW16_30MS << 1;
259470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->ISACenc_obj.enforceFrameSize     = 0;
260470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
261470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Init the bistream data area to zero */
262470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  for (k=0; k<STREAM_MAXW16_60MS; k++){
263470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->ISACenc_obj.bitstr_obj.stream[k] = 0;
264470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
265470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2667796c02b4280139ea6e082b5012dd07f627267c1turajs@google.com#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
267470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIsacfix_InitPostFilterbank(&ISAC_inst->ISACenc_obj.interpolatorstr_obj);
268470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
269470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
270f0a964dc0a287469c68ca4fd195f95aaf24be45fkma@webrtc.org  // Initiaze function pointers.
271f0a964dc0a287469c68ca4fd195f95aaf24be45fkma@webrtc.org  WebRtcIsacfix_AutocorrFix = WebRtcIsacfix_AutocorrC;
272f0a964dc0a287469c68ca4fd195f95aaf24be45fkma@webrtc.org  WebRtcIsacfix_FilterMaLoopFix = WebRtcIsacfix_FilterMaLoopC;
273a15ea4965ef07f6aa074339f206383028e3b8898kma@webrtc.org  WebRtcIsacfix_CalculateResidualEnergy =
274a15ea4965ef07f6aa074339f206383028e3b8898kma@webrtc.org      WebRtcIsacfix_CalculateResidualEnergyC;
275fa65c851feeaebdfd514cacd453fd585b069b06dkma@webrtc.org  WebRtcIsacfix_AllpassFilter2FixDec16 =
276fa65c851feeaebdfd514cacd453fd585b069b06dkma@webrtc.org      WebRtcIsacfix_AllpassFilter2FixDec16C;
277f0a964dc0a287469c68ca4fd195f95aaf24be45fkma@webrtc.org
278715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org#ifdef WEBRTC_DETECT_ARM_NEON
279715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org  if ((WebRtc_GetCPUFeaturesARM() & kCPUFeatureNEON) != 0) {
280715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org    WebRtcIsacfix_InitNeon();
281715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org  }
282715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org#elif defined(WEBRTC_ARCH_ARM_NEON)
283715509890ca462c70c6d20d04b084b3d068249f7kma@webrtc.org  WebRtcIsacfix_InitNeon();
284f0a964dc0a287469c68ca4fd195f95aaf24be45fkma@webrtc.org#endif
285470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
286470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return statusInit;
287470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
288470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
289470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
290470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_Encode(...)
291470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
292470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function encodes 10ms frame(s) and inserts it into a package.
293470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input speech length has to be 160 samples (10ms). The encoder buffers those
294470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * 10ms frames until it reaches the chosen Framesize (480 or 960 samples
295470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * corresponding to 30 or 60 ms frames), and then proceeds to the encoding.
296470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
297470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
298470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : ISAC instance.
299470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - speechIn          : input speech vector.
300470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
301470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output:
302470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - encoded           : the encoded data vector
303470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
304470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value:
305470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                          : >0 - Length (in bytes) of coded data
306470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                          :  0 - The buffer didn't reach the chosen framesize
307470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            so it keeps buffering speech samples.
308470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                          : -1 - Error
309470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
310470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
311470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_Encode(ISACFIX_MainStruct *ISAC_main_inst,
312470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                   const WebRtc_Word16    *speechIn,
313470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                   WebRtc_Word16          *encoded)
314470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
315470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
316470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 stream_len;
317470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
318470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  int k;
319470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
320470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
321470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to rela structure */
322470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
323470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
324470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
325470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* check if encoder initiated */
326470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if ((ISAC_inst->initflag & 2) != 2) {
327470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED;
328470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return (-1);
329470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
330470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
331470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  stream_len = WebRtcIsacfix_EncodeImpl((WebRtc_Word16*)speechIn,
332470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                    &ISAC_inst->ISACenc_obj,
333470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                    &ISAC_inst->bwestimator_obj,
334470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                    ISAC_inst->CodingMode);
335470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (stream_len<0) {
336470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = - stream_len;
337470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
338470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
339470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
340470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
341470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* convert from bytes to WebRtc_Word16 */
342470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
343470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  for (k=0;k<(stream_len+1)>>1;k++) {
344470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    encoded[k] = (WebRtc_Word16)( ( (WebRtc_UWord16)(ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] >> 8 )
345470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                  | (((ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] & 0x00FF) << 8));
346470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
347470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
348470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#else
349470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WEBRTC_SPL_MEMCPY_W16(encoded, (ISAC_inst->ISACenc_obj.bitstr_obj).stream, (stream_len + 1)>>1);
350470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
351470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
352470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
353470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
354470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return stream_len;
355470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
356470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
357470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
358470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
359470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
360470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
361470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
362470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_EncodeNb(...)
363470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
364470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function encodes 10ms narrow band (8 kHz sampling) frame(s) and inserts
365470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * it into a package. Input speech length has to be 80 samples (10ms). The encoder
366470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * interpolates into wide-band (16 kHz sampling) buffers those
367470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * 10ms frames until it reaches the chosen Framesize (480 or 960 wide-band samples
368470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * corresponding to 30 or 60 ms frames), and then proceeds to the encoding.
369470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
3707796c02b4280139ea6e082b5012dd07f627267c1turajs@google.com * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined
3717796c02b4280139ea6e082b5012dd07f627267c1turajs@google.com *
372470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
373470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : ISAC instance.
374470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - speechIn          : input speech vector.
375470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
376470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output:
377470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - encoded           : the encoded data vector
378470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
379470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value:
380470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                          : >0 - Length (in bytes) of coded data
381470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                          :  0 - The buffer didn't reach the chosen framesize
382470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            so it keeps buffering speech samples.
383470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                          : -1 - Error
384470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
3857796c02b4280139ea6e082b5012dd07f627267c1turajs@google.com#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
386470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_EncodeNb(ISACFIX_MainStruct *ISAC_main_inst,
387470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                      const WebRtc_Word16    *speechIn,
388470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                      WebRtc_Word16          *encoded)
389470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
390470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
391470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 stream_len;
392470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 speechInWB[FRAMESAMPLES_10ms];
393470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 Vector_Word16_1[FRAMESAMPLES_10ms/2];
394470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 Vector_Word16_2[FRAMESAMPLES_10ms/2];
395470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
396470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  int k;
397470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
398470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
399470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to rela structure */
400470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
401470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
402470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
403470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* check if encoder initiated */
404470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if ((ISAC_inst->initflag & 2) != 2) {
405470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED;
406470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return (-1);
407470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
408470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
409470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
410470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Oversample to WB */
411470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
412470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Form polyphase signals, and compensate for DC offset */
413470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  for (k=0;k<FRAMESAMPLES_10ms/2;k++) {
414470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    Vector_Word16_1[k] = speechIn[k] + 1;
415470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    Vector_Word16_2[k] = speechIn[k];
416470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
417470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIsacfix_FilterAndCombine2(Vector_Word16_1, Vector_Word16_2, speechInWB, &ISAC_inst->ISACenc_obj.interpolatorstr_obj, FRAMESAMPLES_10ms);
418470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
419470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
420470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Encode WB signal */
421470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  stream_len = WebRtcIsacfix_EncodeImpl((WebRtc_Word16*)speechInWB,
422470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                    &ISAC_inst->ISACenc_obj,
423470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                    &ISAC_inst->bwestimator_obj,
424470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                    ISAC_inst->CodingMode);
425470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (stream_len<0) {
426470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = - stream_len;
427470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
428470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
429470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
430470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
431470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* convert from bytes to WebRtc_Word16 */
432470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
433470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  for (k=0;k<(stream_len+1)>>1;k++) {
434470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    encoded[k] = (WebRtc_Word16)(((WebRtc_UWord16)(ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] >> 8)
435470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                 | (((ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] & 0x00FF) << 8));
436470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
437470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
438470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#else
439470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WEBRTC_SPL_MEMCPY_W16(encoded, (ISAC_inst->ISACenc_obj.bitstr_obj).stream, (stream_len + 1)>>1);
440470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
441470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
442470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
443470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
444470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return stream_len;
445470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
4467796c02b4280139ea6e082b5012dd07f627267c1turajs@google.com#endif  /* WEBRTC_ISAC_FIX_NB_CALLS_ENABLED */
447470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
448470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
449470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
450470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_GetNewBitStream(...)
451470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
452470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function returns encoded data, with the recieved bwe-index in the
453470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * stream. It should always return a complete packet, i.e. only called once
454470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * even for 60 msec frames
455470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
456470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
457470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : ISAC instance.
458470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - bweIndex          : index of bandwidth estimate to put in new bitstream
459470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
460470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output:
461470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - encoded           : the encoded data vector
462470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
463470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value:
464470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                          : >0 - Length (in bytes) of coded data
465470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                          : -1 - Error
466470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
467470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
468470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_GetNewBitStream(ISACFIX_MainStruct *ISAC_main_inst,
469470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                            WebRtc_Word16      bweIndex,
470470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                            float              scale,
471470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                            WebRtc_Word16        *encoded)
472470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
473470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
474470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 stream_len;
475470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
476470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  int k;
477470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
478470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
479470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to rela structure */
480470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
481470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
482470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
483470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* check if encoder initiated */
484470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if ((ISAC_inst->initflag & 2) != 2) {
485470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED;
486470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return (-1);
487470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
488470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
489470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  stream_len = WebRtcIsacfix_EncodeStoredData(&ISAC_inst->ISACenc_obj,
490470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                              bweIndex,
491ebb2744337bf26c8e02197da467b14a95df6c718turajs@google.com                                              scale);
492470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (stream_len<0) {
493470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = - stream_len;
494470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
495470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
496470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
497470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
498470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  for (k=0;k<(stream_len+1)>>1;k++) {
499470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    encoded[k] = (WebRtc_Word16)( ( (WebRtc_UWord16)(ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] >> 8 )
500470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                  | (((ISAC_inst->ISACenc_obj.bitstr_obj).stream[k] & 0x00FF) << 8));
501470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
502470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
503470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#else
504470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WEBRTC_SPL_MEMCPY_W16(encoded, (ISAC_inst->ISACenc_obj.bitstr_obj).stream, (stream_len + 1)>>1);
505470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
506470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
507470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return stream_len;
508470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
509470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
510470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
511470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
512470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
513470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
514470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_DecoderInit(...)
515470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
516470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function initializes a ISAC instance prior to the decoder calls.
517470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
518470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
519470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : ISAC instance.
520470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
521470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value
522470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                          :  0 - Ok
523470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            -1 - Error
524470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
525470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
526470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_DecoderInit(ISACFIX_MainStruct *ISAC_main_inst)
527470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
528470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
529470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
530470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to real structure */
531470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
532470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
533470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* flag decoder init */
534470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->initflag |= 1;
535470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
536470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIsacfix_InitMaskingDec(&ISAC_inst->ISACdec_obj.maskfiltstr_obj);
537470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIsacfix_InitPostFilterbank(&ISAC_inst->ISACdec_obj.postfiltbankstr_obj);
538470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIsacfix_InitPitchFilter(&ISAC_inst->ISACdec_obj.pitchfiltstr_obj);
539470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
540470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* TS */
541470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIsacfix_InitPlc( &ISAC_inst->ISACdec_obj.plcstr_obj );
542470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
543470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
5447796c02b4280139ea6e082b5012dd07f627267c1turajs@google.com#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
545470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIsacfix_InitPreFilterbank(&ISAC_inst->ISACdec_obj.decimatorstr_obj);
546470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
547470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
548470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return 0;
549470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
550470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
551470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
552470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
553470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_UpdateBwEstimate1(...)
554470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
555470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function updates the estimate of the bandwidth.
556470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
557470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
558470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : ISAC instance.
559470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - encoded           : encoded ISAC frame(s).
560470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - packet_size       : size of the packet.
561470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - rtp_seq_number    : the RTP number of the packet.
562470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - arr_ts            : the arrival time of the packet (from NetEq)
563470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            in samples.
564470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
565470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             :  0 - Ok
566470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            -1 - Error
567470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
568470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
569470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_UpdateBwEstimate1(ISACFIX_MainStruct *ISAC_main_inst,
570470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                     const WebRtc_UWord16   *encoded,
571470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                     WebRtc_Word32          packet_size,
572470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                     WebRtc_UWord16         rtp_seq_number,
573470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                     WebRtc_UWord32         arr_ts)
574470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
575470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
576470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  Bitstr_dec streamdata;
577470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_UWord16 partOfStream[5];
578470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
579470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  int k;
580470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
581470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 err;
582470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
583470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Set stream pointer to point at partOfStream */
584470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.stream = (WebRtc_UWord16 *)partOfStream;
585470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
586470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to real structure */
587470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
588470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
589470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Sanity check of packet length */
590470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (packet_size <= 0) {
591470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* return error code if the packet length is null or less */
592470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_EMPTY_PACKET;
593470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
594470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  } else if (packet_size > (STREAM_MAXW16<<1)) {
595470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* return error code if length of stream is too long */
596470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
597470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
598470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
599470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
600470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* check if decoder initiated */
601470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if ((ISAC_inst->initflag & 1) != 1) {
602470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED;
603470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return (-1);
604470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
605470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
606470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.W_upper = 0xFFFFFFFF;
607470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.streamval = 0;
608470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.stream_index = 0;
609470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.full = 1;
610470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
611470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
612470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  for (k=0; k<5; k++) {
613470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    streamdata.stream[k] = (WebRtc_UWord16) (((WebRtc_UWord16)encoded[k] >> 8)|((encoded[k] & 0xFF)<<8));
614470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
615470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#else
616470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  memcpy(streamdata.stream, encoded, 5);
617470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
618470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
619470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  err = WebRtcIsacfix_EstimateBandwidth(&ISAC_inst->bwestimator_obj,
620470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        &streamdata,
621470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        packet_size,
622470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        rtp_seq_number,
623470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        0,
624470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        arr_ts);
625470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
626470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
627470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (err < 0)
628470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  {
629470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* return error code if something went wrong */
630470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = -err;
631470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
632470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
633470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
634470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
635470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return 0;
636470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
637470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
638470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
639470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_UpdateBwEstimate(...)
640470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
641470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function updates the estimate of the bandwidth.
642470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
643470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
644470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : ISAC instance.
645470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - encoded           : encoded ISAC frame(s).
646470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - packet_size       : size of the packet.
647470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - rtp_seq_number    : the RTP number of the packet.
648470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - send_ts           : Send Time Stamp from RTP header
649470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - arr_ts            : the arrival time of the packet (from NetEq)
650470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            in samples.
651470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
652470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             :  0 - Ok
653470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            -1 - Error
654470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
655470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
656470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_UpdateBwEstimate(ISACFIX_MainStruct *ISAC_main_inst,
657470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                       const WebRtc_UWord16   *encoded,
658470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                       WebRtc_Word32          packet_size,
659470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                       WebRtc_UWord16         rtp_seq_number,
660470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                       WebRtc_UWord32         send_ts,
661470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                       WebRtc_UWord32         arr_ts)
662470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
663470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
664470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  Bitstr_dec streamdata;
665470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_UWord16 partOfStream[5];
666470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
667470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  int k;
668470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
669470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 err;
670470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
671470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Set stream pointer to point at partOfStream */
672470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.stream = (WebRtc_UWord16 *)partOfStream;
673470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
674470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to real structure */
675470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
676470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
677470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Sanity check of packet length */
678470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (packet_size <= 0) {
679470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* return error code if the packet length is null  or less */
680470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_EMPTY_PACKET;
681470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
682470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  } else if (packet_size > (STREAM_MAXW16<<1)) {
683470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* return error code if length of stream is too long */
684470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
685470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
686470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
687470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
688470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* check if decoder initiated */
689470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if ((ISAC_inst->initflag & 1) != 1) {
690470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED;
691470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return (-1);
692470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
693470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
694470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.W_upper = 0xFFFFFFFF;
695470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.streamval = 0;
696470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.stream_index = 0;
697470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.full = 1;
698470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
699470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
700470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  for (k=0; k<5; k++) {
701470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    streamdata.stream[k] = (WebRtc_UWord16) ((encoded[k] >> 8)|((encoded[k] & 0xFF)<<8));
702470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
703470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#else
704470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  memcpy(streamdata.stream, encoded, 5);
705470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
706470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
707470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  err = WebRtcIsacfix_EstimateBandwidth(&ISAC_inst->bwestimator_obj,
708470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        &streamdata,
709470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        packet_size,
710470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        rtp_seq_number,
711470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        send_ts,
712470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        arr_ts);
713470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
714470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (err < 0)
715470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  {
716470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* return error code if something went wrong */
717470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = -err;
718470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
719470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
720470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
721470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
722470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return 0;
723470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
724470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
725470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
726470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_Decode(...)
727470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
728470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function decodes a ISAC frame. Output speech length
729470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * will be a multiple of 480 samples: 480 or 960 samples,
730470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * depending on the framesize (30 or 60 ms).
731470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
732470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
733470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : ISAC instance.
734470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - encoded           : encoded ISAC frame(s)
735470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - len               : bytes in encoded vector
736470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
737470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output:
738470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - decoded           : The decoded vector
739470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
740470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             : >0 - number of samples in decoded vector
741470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            -1 - Error
742470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
743470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
744470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
745470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_Decode(ISACFIX_MainStruct *ISAC_main_inst,
746470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                     const WebRtc_UWord16   *encoded,
747470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                     WebRtc_Word16          len,
748470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                     WebRtc_Word16          *decoded,
749470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                     WebRtc_Word16     *speechType)
750470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
751470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
752470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* number of samples (480 or 960), output from decoder */
753470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* that were actually used in the encoder/decoder (determined on the fly) */
754470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16     number_of_samples;
755470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
756470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  int k;
757470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
758470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 declen = 0;
759470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
760470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to real structure */
761470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
762470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
763470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* check if decoder initiated */
764470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if ((ISAC_inst->initflag & 1) != 1) {
765470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED;
766470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return (-1);
767470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
768470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
769470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Sanity check of packet length */
770470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (len <= 0) {
771470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* return error code if the packet length is null  or less */
772470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_EMPTY_PACKET;
773470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
774470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  } else if (len > (STREAM_MAXW16<<1)) {
775470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* return error code if length of stream is too long */
776470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
777470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
778470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
779470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
780470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  (ISAC_inst->ISACdec_obj.bitstr_obj).stream = (WebRtc_UWord16 *)encoded;
781470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
782470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* convert bitstream from WebRtc_Word16 to bytes */
783470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
784470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  for (k=0; k<(len>>1); k++) {
785470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    (ISAC_inst->ISACdec_obj.bitstr_obj).stream[k] = (WebRtc_UWord16) ((encoded[k] >> 8)|((encoded[k] & 0xFF)<<8));
786470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
787470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (len & 0x0001)
788470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    (ISAC_inst->ISACdec_obj.bitstr_obj).stream[k] = (WebRtc_UWord16) ((encoded[k] & 0xFF)<<8);
789470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
790470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
791470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* added for NetEq purposes (VAD/DTX related) */
792470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  *speechType=1;
793470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
794470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  declen = WebRtcIsacfix_DecodeImpl(decoded,&ISAC_inst->ISACdec_obj, &number_of_samples);
795470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
796470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (declen < 0) {
797470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* Some error inside the decoder */
798470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = -declen;
799470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    memset(decoded, 0, sizeof(WebRtc_Word16) * MAX_FRAMESAMPLES);
800470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
801470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
802470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
803470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* error check */
804470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
805470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (declen & 0x0001) {
806470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if (len != declen && len != declen + (((ISAC_inst->ISACdec_obj.bitstr_obj).stream[declen>>1]) & 0x00FF) ) {
807470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
808470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      memset(decoded, 0, sizeof(WebRtc_Word16) * number_of_samples);
809470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      return -1;
810470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
811470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  } else {
812470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if (len != declen && len != declen + (((ISAC_inst->ISACdec_obj.bitstr_obj).stream[declen>>1]) >> 8) ) {
813470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
814470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      memset(decoded, 0, sizeof(WebRtc_Word16) * number_of_samples);
815470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      return -1;
816470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
817470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
818470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
819470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return number_of_samples;
820470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
821470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
822470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
823470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
824470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
825470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
826470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
827470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_DecodeNb(...)
828470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
829470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function decodes a ISAC frame in narrow-band (8 kHz sampling).
830470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output speech length will be a multiple of 240 samples: 240 or 480 samples,
831470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * depending on the framesize (30 or 60 ms).
832470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
8337796c02b4280139ea6e082b5012dd07f627267c1turajs@google.com * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined
8347796c02b4280139ea6e082b5012dd07f627267c1turajs@google.com *
835470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
836470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : ISAC instance.
837470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - encoded           : encoded ISAC frame(s)
838470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - len               : bytes in encoded vector
839470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
840470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output:
841470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - decoded           : The decoded vector
842470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
843470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             : >0 - number of samples in decoded vector
844470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            -1 - Error
845470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
846470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
8477796c02b4280139ea6e082b5012dd07f627267c1turajs@google.com#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
848470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_DecodeNb(ISACFIX_MainStruct *ISAC_main_inst,
849470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        const WebRtc_UWord16   *encoded,
850470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        WebRtc_Word16          len,
851470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        WebRtc_Word16          *decoded,
852470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        WebRtc_Word16    *speechType)
853470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
854470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
855470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* twice the number of samples (480 or 960), output from decoder */
856470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* that were actually used in the encoder/decoder (determined on the fly) */
857470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16     number_of_samples;
858470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
859470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  int k;
860470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
861470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 declen = 0;
862470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 dummy[FRAMESAMPLES/2];
863470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
864470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
865470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to real structure */
866470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
867470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
868470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* check if decoder initiated */
869470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if ((ISAC_inst->initflag & 1) != 1) {
870470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED;
871470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return (-1);
872470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
873470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
874470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (len == 0)
875470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  {  /* return error code if the packet length is null */
876470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
877470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_EMPTY_PACKET;
878470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
879470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
880470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
881470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  (ISAC_inst->ISACdec_obj.bitstr_obj).stream = (WebRtc_UWord16 *)encoded;
882470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
883470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* convert bitstream from WebRtc_Word16 to bytes */
884470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
885470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  for (k=0; k<(len>>1); k++) {
886470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    (ISAC_inst->ISACdec_obj.bitstr_obj).stream[k] = (WebRtc_UWord16) ((encoded[k] >> 8)|((encoded[k] & 0xFF)<<8));
887470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
888470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (len & 0x0001)
889470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    (ISAC_inst->ISACdec_obj.bitstr_obj).stream[k] = (WebRtc_UWord16) ((encoded[k] & 0xFF)<<8);
890470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
891470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
892470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* added for NetEq purposes (VAD/DTX related) */
893470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  *speechType=1;
894470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
895470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  declen = WebRtcIsacfix_DecodeImpl(decoded,&ISAC_inst->ISACdec_obj, &number_of_samples);
896470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
897470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (declen < 0) {
898470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* Some error inside the decoder */
899470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = -declen;
900470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    memset(decoded, 0, sizeof(WebRtc_Word16) * FRAMESAMPLES);
901470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
902470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
903470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
904470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* error check */
905470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
906470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (declen & 0x0001) {
907470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if (len != declen && len != declen + (((ISAC_inst->ISACdec_obj.bitstr_obj).stream[declen>>1]) & 0x00FF) ) {
908470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
909470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      memset(decoded, 0, sizeof(WebRtc_Word16) * number_of_samples);
910470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      return -1;
911470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
912470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  } else {
913470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if (len != declen && len != declen + (((ISAC_inst->ISACdec_obj.bitstr_obj).stream[declen>>1]) >> 8) ) {
914470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
915470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      memset(decoded, 0, sizeof(WebRtc_Word16) * number_of_samples);
916470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      return -1;
917470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
918470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
919470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
920470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtcIsacfix_SplitAndFilter2(decoded, decoded, dummy, &ISAC_inst->ISACdec_obj.decimatorstr_obj);
921470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
922470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (number_of_samples>FRAMESAMPLES) {
923470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    WebRtcIsacfix_SplitAndFilter2(decoded + FRAMESAMPLES, decoded + FRAMESAMPLES/2,
924470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                  dummy, &ISAC_inst->ISACdec_obj.decimatorstr_obj);
925470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
926470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
927470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return number_of_samples/2;
928470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
9297796c02b4280139ea6e082b5012dd07f627267c1turajs@google.com#endif /* WEBRTC_ISAC_FIX_NB_CALLS_ENABLED */
930470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
931470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
932470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
933470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_DecodePlcNb(...)
934470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
935470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function conducts PLC for ISAC frame(s) in narrow-band (8kHz sampling).
936470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output speech length  will be "240*noOfLostFrames" samples
937470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * that is equevalent of "30*noOfLostFrames" millisecond.
938470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
9397796c02b4280139ea6e082b5012dd07f627267c1turajs@google.com * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined
9407796c02b4280139ea6e082b5012dd07f627267c1turajs@google.com *
941470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
942470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : ISAC instance.
943470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - noOfLostFrames    : Number of PLC frames (240 sample=30ms) to produce
944470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
945470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output:
946470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - decoded           : The decoded vector
947470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
948470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             : >0 - number of samples in decoded PLC vector
949470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            -1 - Error
950470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
951470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
9527796c02b4280139ea6e082b5012dd07f627267c1turajs@google.com#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
953470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_DecodePlcNb(ISACFIX_MainStruct *ISAC_main_inst,
954470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                         WebRtc_Word16          *decoded,
955470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                         WebRtc_Word16 noOfLostFrames )
956470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
957470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 no_of_samples, declen, k, ok;
958470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 outframeNB[FRAMESAMPLES];
959470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 outframeWB[FRAMESAMPLES];
960470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 dummy[FRAMESAMPLES/2];
961470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
962470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
963470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
964470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to real structure */
965470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
966470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
967470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Limit number of frames to two = 60 msec. Otherwise we exceed data vectors */
968470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (noOfLostFrames > 2){
969470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    noOfLostFrames = 2;
970470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
971470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
972470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  k = 0;
973470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  declen = 0;
974470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  while( noOfLostFrames > 0 )
975470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  {
976470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ok = WebRtcIsacfix_DecodePlcImpl( outframeWB, &ISAC_inst->ISACdec_obj, &no_of_samples );
977470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if(ok)
978470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      return -1;
979470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
980470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    WebRtcIsacfix_SplitAndFilter2(outframeWB, &(outframeNB[k*240]), dummy, &ISAC_inst->ISACdec_obj.decimatorstr_obj);
981470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
982470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    declen += no_of_samples;
983470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    noOfLostFrames--;
984470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    k++;
985470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
986470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
987470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  declen>>=1;
988470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
989470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  for (k=0;k<declen;k++) {
990470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    decoded[k] = outframeNB[k];
991470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
992470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
993470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return declen;
994470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
9957796c02b4280139ea6e082b5012dd07f627267c1turajs@google.com#endif /* WEBRTC_ISAC_FIX_NB_CALLS_ENABLED */
996470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
997470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
998470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
999470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1000470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
1001470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_DecodePlc(...)
1002470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1003470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function conducts PLC for ISAC frame(s) in wide-band (16kHz sampling).
1004470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output speech length  will be "480*noOfLostFrames" samples
1005470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * that is equevalent of "30*noOfLostFrames" millisecond.
1006470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1007470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
1008470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : ISAC instance.
1009470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - noOfLostFrames    : Number of PLC frames (480sample = 30ms)
1010470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                                to produce
1011470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1012470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output:
1013470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - decoded           : The decoded vector
1014470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1015470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             : >0 - number of samples in decoded PLC vector
1016470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            -1 - Error
1017470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
1018470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1019470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_DecodePlc(ISACFIX_MainStruct *ISAC_main_inst,
1020470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                      WebRtc_Word16          *decoded,
1021470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                      WebRtc_Word16 noOfLostFrames)
1022470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
1023470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1024470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 no_of_samples, declen, k, ok;
1025470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 outframe16[MAX_FRAMESAMPLES];
1026470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1027470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
1028470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to real structure */
1029470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
1030470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1031470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Limit number of frames to two = 60 msec. Otherwise we exceed data vectors */
1032470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (noOfLostFrames > 2) {
1033470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    noOfLostFrames = 2;
1034470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1035470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  k = 0;
1036470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  declen = 0;
1037470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  while( noOfLostFrames > 0 )
1038470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  {
1039470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ok = WebRtcIsacfix_DecodePlcImpl( &(outframe16[k*480]), &ISAC_inst->ISACdec_obj, &no_of_samples );
1040470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if(ok)
1041470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      return -1;
1042470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    declen += no_of_samples;
1043470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    noOfLostFrames--;
1044470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    k++;
1045470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1046470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1047470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  for (k=0;k<declen;k++) {
1048470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    decoded[k] = outframe16[k];
1049470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1050470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1051470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return declen;
1052470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1053470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1054470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1055470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
1056470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_Control(...)
1057470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1058470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function sets the limit on the short-term average bit rate and the
1059470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * frame length. Should be used only in Instantaneous mode.
1060470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1061470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
1062470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : ISAC instance.
1063470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - rate              : limit on the short-term average bit rate,
1064470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            in bits/second (between 10000 and 32000)
1065470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - framesize         : number of milliseconds per frame (30 or 60)
1066470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1067470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             : 0  - ok
1068470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            -1 - Error
1069470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
1070470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1071470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_Control(ISACFIX_MainStruct *ISAC_main_inst,
1072470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                    WebRtc_Word16          rate,
1073470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                    WebRtc_Word16          framesize)
1074470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
1075470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
1076470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to real structure */
1077470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
1078470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1079470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (ISAC_inst->CodingMode == 0)
1080470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  {
1081470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* in adaptive mode */
1082470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_MODE_MISMATCH;
1083470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
1084470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1085470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1086470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1087470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (rate >= 10000 && rate <= 32000)
1088470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->ISACenc_obj.BottleNeck = rate;
1089470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  else {
1090470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_DISALLOWED_BOTTLENECK;
1091470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
1092470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1093470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1094470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1095470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1096470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (framesize  == 30 || framesize == 60)
1097470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->ISACenc_obj.new_framelength = (FS/1000) * framesize;
1098470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  else {
1099470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_DISALLOWED_FRAME_LENGTH;
1100470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
1101470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1102470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1103470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return 0;
1104470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1105470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1106470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1107470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
1108470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_ControlBwe(...)
1109470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1110470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function sets the initial values of bottleneck and frame-size if
1111470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * iSAC is used in channel-adaptive mode. Through this API, users can
1112470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * enforce a frame-size for all values of bottleneck. Then iSAC will not
1113470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * automatically change the frame-size.
1114470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1115470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1116470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
1117470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  - ISAC_main_inst : ISAC instance.
1118470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - rateBPS           : initial value of bottleneck in bits/second
1119470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            10000 <= rateBPS <= 32000 is accepted
1120470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            For default bottleneck set rateBPS = 0
1121470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - frameSizeMs       : number of milliseconds per frame (30 or 60)
1122470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - enforceFrameSize  : 1 to enforce the given frame-size through out
1123470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            the adaptation process, 0 to let iSAC change
1124470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            the frame-size if required.
1125470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1126470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value    : 0  - ok
1127470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *         -1 - Error
1128470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
1129470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1130470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_ControlBwe(ISACFIX_MainStruct *ISAC_main_inst,
1131470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        WebRtc_Word16 rateBPS,
1132470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        WebRtc_Word16 frameSizeMs,
1133470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        WebRtc_Word16 enforceFrameSize)
1134470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
1135470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
1136470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Typecast pointer to real structure */
1137470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
1138470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1139470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* check if encoder initiated */
1140470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if ((ISAC_inst->initflag & 2) != 2) {
1141470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED;
1142470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return (-1);
1143470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1144470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1145470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Check that we are in channel-adaptive mode, otherwise, return -1 */
1146470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (ISAC_inst->CodingMode != 0) {
1147470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_MODE_MISMATCH;
1148470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return (-1);
1149470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1150470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1151470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Set struct variable if enforceFrameSize is set. ISAC will then keep the */
1152470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* chosen frame size.                                                      */
1153470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst->ISACenc_obj.enforceFrameSize = (enforceFrameSize != 0)? 1:0;
1154470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1155470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Set initial rate, if value between 10000 and 32000,                */
1156470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* if rateBPS is 0, keep the default initial bottleneck value (15000) */
1157470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if ((rateBPS >= 10000) && (rateBPS <= 32000)) {
1158470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->bwestimator_obj.sendBwAvg = (((WebRtc_UWord32)rateBPS) << 7);
1159470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  } else if (rateBPS != 0) {
1160470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_DISALLOWED_BOTTLENECK;
1161470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
1162470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1163470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1164470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Set initial framesize. If enforceFrameSize is set the frame size will not change */
1165470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if ((frameSizeMs  == 30) || (frameSizeMs == 60)) {
1166470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->ISACenc_obj.new_framelength = (FS/1000) * frameSizeMs;
1167470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  } else {
1168470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = ISAC_DISALLOWED_FRAME_LENGTH;
1169470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
1170470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1171470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1172470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return 0;
1173470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1174470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1175470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1176470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1177470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1178470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1179470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
1180470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_GetDownLinkBwIndex(...)
1181470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1182470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function returns index representing the Bandwidth estimate from
1183470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * other side to this side.
1184470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1185470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
1186470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst: iSAC struct
1187470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1188470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output:
1189470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - rateIndex     : Bandwidth estimate to transmit to other side.
1190470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1191470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
1192470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1193470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_GetDownLinkBwIndex(ISACFIX_MainStruct* ISAC_main_inst,
1194470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                       WebRtc_Word16*     rateIndex)
1195470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
1196470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
1197470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1198470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to real structure */
1199470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
1200470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1201470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Call function to get Bandwidth Estimate */
1202470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  *rateIndex = WebRtcIsacfix_GetDownlinkBwIndexImpl(&ISAC_inst->bwestimator_obj);
1203470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1204470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return 0;
1205470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1206470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1207470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1208470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
1209470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_UpdateUplinkBw(...)
1210470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1211470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function takes an index representing the Bandwidth estimate from
1212470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * this side to other side and updates BWE.
1213470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1214470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
1215470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst: iSAC struct
1216470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - rateIndex     : Bandwidth estimate from other side.
1217470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1218470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
1219470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1220470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_UpdateUplinkBw(ISACFIX_MainStruct* ISAC_main_inst,
1221470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                   WebRtc_Word16     rateIndex)
1222470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
1223470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 err = 0;
1224470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
1225470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1226470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to real structure */
1227470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
1228470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1229470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Call function to update BWE with received Bandwidth Estimate */
1230470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  err = WebRtcIsacfix_UpdateUplinkBwRec(&ISAC_inst->bwestimator_obj, rateIndex);
1231470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (err < 0) {
1232470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->errorcode = -err;
1233470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return (-1);
1234470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1235470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1236470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return 0;
1237470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1238470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1239470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
1240470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_ReadFrameLen(...)
1241470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1242470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function returns the length of the frame represented in the packet.
1243470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1244470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
1245470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - encoded       : Encoded bitstream
1246470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1247470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output:
1248470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - frameLength   : Length of frame in packet (in samples)
1249470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1250470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
1251470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1252470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_ReadFrameLen(const WebRtc_Word16* encoded,
1253470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                        WebRtc_Word16* frameLength)
1254470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
1255470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  Bitstr_dec streamdata;
1256470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_UWord16 partOfStream[5];
1257470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
1258470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  int k;
1259470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1260470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 err;
1261470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1262470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Set stream pointer to point at partOfStream */
1263470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.stream = (WebRtc_UWord16 *)partOfStream;
1264470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1265470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.W_upper = 0xFFFFFFFF;
1266470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.streamval = 0;
1267470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.stream_index = 0;
1268470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.full = 1;
1269470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1270470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
1271470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  for (k=0; k<5; k++) {
1272470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    streamdata.stream[k] = (WebRtc_UWord16) (((WebRtc_UWord16)encoded[k] >> 8)|((encoded[k] & 0xFF)<<8));
1273470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1274470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#else
1275470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  memcpy(streamdata.stream, encoded, 5);
1276470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1277470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1278470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* decode frame length */
1279470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  err = WebRtcIsacfix_DecodeFrameLen(&streamdata, frameLength);
1280470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (err<0)  // error check
1281470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return err;
1282470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1283470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return 0;
1284470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1285470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1286470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1287470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
1288470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_ReadBwIndex(...)
1289470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1290470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function returns the index of the Bandwidth estimate from the bitstream.
1291470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1292470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
1293470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - encoded       : Encoded bitstream
1294470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1295470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output:
1296470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - frameLength   : Length of frame in packet (in samples)
1297470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - rateIndex     : Bandwidth estimate in bitstream
1298470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1299470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
1300470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1301470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_ReadBwIndex(const WebRtc_Word16* encoded,
1302470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                   WebRtc_Word16* rateIndex)
1303470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
1304470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  Bitstr_dec streamdata;
1305470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_UWord16 partOfStream[5];
1306470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
1307470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  int k;
1308470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1309470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 err;
1310470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1311470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* Set stream pointer to point at partOfStream */
1312470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.stream = (WebRtc_UWord16 *)partOfStream;
1313470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1314470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.W_upper = 0xFFFFFFFF;
1315470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.streamval = 0;
1316470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.stream_index = 0;
1317470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  streamdata.full = 1;
1318470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1319470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_BIG_ENDIAN
1320470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  for (k=0; k<5; k++) {
1321470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    streamdata.stream[k] = (WebRtc_UWord16) (((WebRtc_UWord16)encoded[k] >> 8)|((encoded[k] & 0xFF)<<8));
1322470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1323470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#else
1324470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  memcpy(streamdata.stream, encoded, 5);
1325470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
1326470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1327470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* decode frame length, needed to get to the rateIndex in the bitstream */
1328470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  err = WebRtcIsacfix_DecodeFrameLen(&streamdata, rateIndex);
1329470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (err<0)  // error check
1330470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return err;
1331470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1332470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* decode BW estimation */
1333470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  err = WebRtcIsacfix_DecodeSendBandwidth(&streamdata, rateIndex);
1334470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (err<0)  // error check
1335470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return err;
1336470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1337470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return 0;
1338470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1339470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1340470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1341470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1342470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1343470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
1344470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_GetErrorCode(...)
1345470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1346470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function can be used to check the error code of an iSAC instance. When
1347470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * a function returns -1 a error code will be set for that instance. The
1348470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * function below extract the code of the last error that occured in the
1349470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * specified instance.
1350470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1351470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
1352470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : ISAC instance
1353470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1354470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             : Error code
1355470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
1356470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1357470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_GetErrorCode(ISACFIX_MainStruct *ISAC_main_inst)
1358470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
1359470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
1360470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to real structure */
1361470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
1362470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1363470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return ISAC_inst->errorcode;
1364470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1365470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1366470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1367470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1368470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
1369470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_GetUplinkBw(...)
1370470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1371470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function returns the inst quantized iSAC send bitrate
1372470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1373470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
1374470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : iSAC instance
1375470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1376470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             : bitrate
1377470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
1378470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1379470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word32 WebRtcIsacfix_GetUplinkBw(ISACFIX_MainStruct *ISAC_main_inst)
1380470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
1381470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
1382470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  BwEstimatorstr * bw = (BwEstimatorstr*)&(ISAC_inst->bwestimator_obj);
1383470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1384470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return (WebRtc_Word32) WebRtcIsacfix_GetUplinkBandwidth(bw);
1385470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1386470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1387470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
1388470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_GetNewFrameLen(...)
1389470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1390470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function return the next frame length (in samples) of iSAC.
1391470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1392470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
1393470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : iSAC instance
1394470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1395470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             :  frame lenght in samples
1396470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
1397470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1398470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_GetNewFrameLen(ISACFIX_MainStruct *ISAC_main_inst)
1399470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
1400470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
1401470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return ISAC_inst->ISACenc_obj.new_framelength;
1402470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1403470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1404470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1405470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
1406470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_SetMaxPayloadSize(...)
1407470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1408470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function sets a limit for the maximum payload size of iSAC. The same
1409470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * value is used both for 30 and 60 msec packets.
1410470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * The absolute max will be valid until next time the function is called.
1411470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * NOTE! This function may override the function WebRtcIsacfix_SetMaxRate()
1412470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1413470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
1414470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : iSAC instance
1415470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - maxPayloadBytes   : maximum size of the payload in bytes
1416470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            valid values are between 100 and 400 bytes
1417470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1418470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1419470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             : 0 if sucessful
1420470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                           -1 if error happens
1421470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
1422470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1423470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_SetMaxPayloadSize(ISACFIX_MainStruct *ISAC_main_inst,
1424470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                              WebRtc_Word16 maxPayloadBytes)
1425470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
1426470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
1427470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1428470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to real structure */
1429470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
1430470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1431470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if((maxPayloadBytes < 100) || (maxPayloadBytes > 400))
1432470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  {
1433470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* maxPayloadBytes is out of valid range */
1434470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
1435470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1436470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  else
1437470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  {
1438470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* Set new absolute max, which will not change unless this function
1439470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com       is called again with a new value */
1440470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->ISACenc_obj.maxPayloadBytes = maxPayloadBytes;
1441470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1442470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* Set new maximum values for 30 and 60 msec packets */
1443470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if (maxPayloadBytes < ISAC_inst->ISACenc_obj.maxRateInBytes) {
1444470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      ISAC_inst->ISACenc_obj.payloadLimitBytes30 = maxPayloadBytes;
1445470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    } else {
1446470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      ISAC_inst->ISACenc_obj.payloadLimitBytes30 = ISAC_inst->ISACenc_obj.maxRateInBytes;
1447470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
1448470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1449470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if ( maxPayloadBytes < (ISAC_inst->ISACenc_obj.maxRateInBytes << 1)) {
1450470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      ISAC_inst->ISACenc_obj.payloadLimitBytes60 = maxPayloadBytes;
1451470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    } else {
1452470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      ISAC_inst->ISACenc_obj.payloadLimitBytes60 = (ISAC_inst->ISACenc_obj.maxRateInBytes << 1);
1453470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
1454470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1455470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return 0;
1456470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1457470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1458470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1459470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
1460470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_SetMaxRate(...)
1461470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1462470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function sets the maximum rate which the codec may not exceed for a
1463470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * singel packet. The maximum rate is set in bits per second.
1464470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * The codec has an absolute maximum rate of 53400 bits per second (200 bytes
1465470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * per 30 msec).
1466470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * It is possible to set a maximum rate between 32000 and 53400 bits per second.
1467470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1468470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * The rate limit is valid until next time the function is called.
1469470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1470470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * NOTE! Packet size will never go above the value set if calling
1471470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_SetMaxPayloadSize() (default max packet size is 400 bytes).
1472470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1473470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
1474470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - ISAC_main_inst    : iSAC instance
1475470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - maxRateInBytes    : maximum rate in bits per second,
1476470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                            valid values are 32000 to 53400 bits
1477470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1478470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value             : 0 if sucessful
1479470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                           -1 if error happens
1480470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
1481470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1482470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comWebRtc_Word16 WebRtcIsacfix_SetMaxRate(ISACFIX_MainStruct *ISAC_main_inst,
1483470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                       WebRtc_Word32 maxRate)
1484470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
1485470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISACFIX_SubStruct *ISAC_inst;
1486470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  WebRtc_Word16 maxRateInBytes;
1487470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1488470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* typecast pointer to real structure */
1489470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
1490470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1491470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if((maxRate < 32000) || (maxRate > 53400))
1492470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  {
1493470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* maxRate is out of valid range */
1494470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return -1;
1495470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1496470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  else
1497470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  {
1498470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* Calculate maximum number of bytes per 30 msec packets for the given
1499470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com       maximum rate. Multiply with 30/1000 to get number of bits per 30 msec,
1500470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com       divide by 8 to get number of bytes per 30 msec:
1501470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com       maxRateInBytes = floor((maxRate * 30/1000) / 8); */
1502470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    maxRateInBytes = (WebRtc_Word16)( WebRtcSpl_DivW32W16ResW16(WEBRTC_SPL_MUL(maxRate, 3), 800) );
1503470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1504470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* Store the value for usage in the WebRtcIsacfix_SetMaxPayloadSize-function */
1505470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    ISAC_inst->ISACenc_obj.maxRateInBytes = maxRateInBytes;
1506470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1507470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* For 30 msec packets: if the new limit is below the maximum
1508470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com       payload size, set a new limit */
1509470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if (maxRateInBytes < ISAC_inst->ISACenc_obj.maxPayloadBytes) {
1510470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      ISAC_inst->ISACenc_obj.payloadLimitBytes30 = maxRateInBytes;
1511470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    } else {
1512470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      ISAC_inst->ISACenc_obj.payloadLimitBytes30 = ISAC_inst->ISACenc_obj.maxPayloadBytes;
1513470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
1514470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1515470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /* For 60 msec packets: if the new limit (times 2) is below the
1516470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com       maximum payload size, set a new limit */
1517470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if ( (maxRateInBytes << 1) < ISAC_inst->ISACenc_obj.maxPayloadBytes) {
1518470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      ISAC_inst->ISACenc_obj.payloadLimitBytes60 = (maxRateInBytes << 1);
1519470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    } else {
1520470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      ISAC_inst->ISACenc_obj.payloadLimitBytes60 = ISAC_inst->ISACenc_obj.maxPayloadBytes;
1521470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
1522470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
1523470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1524470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return 0;
1525470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1526470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1527470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1528470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1529470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
1530470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcIsacfix_version(...)
1531470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1532470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function returns the version number.
1533470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1534470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output:
1535470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - version  : Pointer to character string
1536470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
1537470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
1538470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1539470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comvoid WebRtcIsacfix_version(char *version)
1540470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
1541470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  strcpy(version, "3.6.0");
1542470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1543