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