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