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